Merge "Add Nexus 5 to Device Art Generator." into klp-dev
diff --git a/core/java/android/bluetooth/BluetoothDevice.java b/core/java/android/bluetooth/BluetoothDevice.java
index 5822e46..d789a94 100644
--- a/core/java/android/bluetooth/BluetoothDevice.java
+++ b/core/java/android/bluetooth/BluetoothDevice.java
@@ -322,7 +322,7 @@
/**
* Broadcast Action: This intent is used to broadcast PAIRING REQUEST
- * <p>Requires {@link android.Manifest.permission#BLUETOOTH_PRIVILEGED} to
+ * <p>Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN} to
* receive.
*/
@SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
@@ -465,7 +465,7 @@
/**
* The user will be prompted to enter a pin or
- * a privileged app will enter a pin for user.
+ * an app will enter a pin for user.
*/
public static final int PAIRING_VARIANT_PIN = 0;
@@ -477,7 +477,7 @@
/**
* The user will be prompted to confirm the passkey displayed on the screen or
- * a privileged app will confirm the passkey for the user.
+ * an app will confirm the passkey for the user.
*/
public static final int PAIRING_VARIANT_PASSKEY_CONFIRMATION = 2;
@@ -725,7 +725,7 @@
* the bonding process completes, and its result.
* <p>Android system services will handle the necessary user interactions
* to confirm and complete the bonding process.
- * <p>Requires {@link android.Manifest.permission#BLUETOOTH_PRIVILEGED}.
+ * <p>Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN}.
*
* @return false on immediate error, true if bonding will begin
*/
@@ -965,7 +965,7 @@
/**
* Set the pin during pairing when the pairing method is {@link #PAIRING_VARIANT_PIN}
- * <p>Requires {@link android.Manifest.permission#BLUETOOTH_PRIVILEGED}.
+ * <p>Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN}.
*
* @return true pin has been set
* false for error
@@ -993,7 +993,7 @@
/**
* Confirm passkey for {@link #PAIRING_VARIANT_PASSKEY_CONFIRMATION} pairing.
- * <p>Requires {@link android.Manifest.permission#BLUETOOTH_PRIVILEGED}.
+ * <p>Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN}.
*
* @return true confirmation has been sent out
* false for error
diff --git a/core/java/android/view/inputmethod/InputMethodInfo.java b/core/java/android/view/inputmethod/InputMethodInfo.java
index c440c7b..5df5811 100644
--- a/core/java/android/view/inputmethod/InputMethodInfo.java
+++ b/core/java/android/view/inputmethod/InputMethodInfo.java
@@ -45,6 +45,17 @@
/**
* This class is used to specify meta information of an input method.
+ *
+ * <p>It should be defined in an XML resource file with an {@code <input-method>} element.
+ * For more information, see the guide to
+ * <a href="{@docRoot}guide/topics/text/creating-input-method.html">
+ * Creating an Input Method</a>.</p>
+ *
+ * @see InputMethodSubtype
+ *
+ * @attr ref android.R.styleable#InputMethod_settingsActivity
+ * @attr ref android.R.styleable#InputMethod_isDefault
+ * @attr ref android.R.styleable#InputMethod_supportsSwitchingToNextInputMethod
*/
public final class InputMethodInfo implements Parcelable {
static final String TAG = "InputMethodInfo";
diff --git a/core/java/android/view/inputmethod/InputMethodSubtype.java b/core/java/android/view/inputmethod/InputMethodSubtype.java
index 88b2977..40f95ce 100644
--- a/core/java/android/view/inputmethod/InputMethodSubtype.java
+++ b/core/java/android/view/inputmethod/InputMethodSubtype.java
@@ -38,9 +38,22 @@
* the specified subtype of the designated IME directly.
*
* <p>It should be defined in an XML resource file of the input method with the
- * <code><subtype></code> element. For more information, see the guide to
- * <a href="{@docRoot}resources/articles/creating-input-method.html">
+ * <code><subtype></code> element, which resides within an {@code <input-method>} element.
+ * For more information, see the guide to
+ * <a href="{@docRoot}guide/topics/text/creating-input-method.html">
* Creating an Input Method</a>.</p>
+ *
+ * @see InputMethodInfo
+ *
+ * @attr ref android.R.styleable#InputMethod_Subtype_label
+ * @attr ref android.R.styleable#InputMethod_Subtype_icon
+ * @attr ref android.R.styleable#InputMethod_Subtype_imeSubtypeLocale
+ * @attr ref android.R.styleable#InputMethod_Subtype_imeSubtypeMode
+ * @attr ref android.R.styleable#InputMethod_Subtype_imeSubtypeExtraValue
+ * @attr ref android.R.styleable#InputMethod_Subtype_isAuxiliary
+ * @attr ref android.R.styleable#InputMethod_Subtype_overridesImplicitlyEnabledSubtype
+ * @attr ref android.R.styleable#InputMethod_Subtype_subtypeId
+ * @attr ref android.R.styleable#InputMethod_Subtype_isAsciiCapable
*/
public final class InputMethodSubtype implements Parcelable {
private static final String TAG = InputMethodSubtype.class.getSimpleName();
diff --git a/core/java/android/widget/QuickContactBadge.java b/core/java/android/widget/QuickContactBadge.java
index 368f6ad..fd2f754 100644
--- a/core/java/android/widget/QuickContactBadge.java
+++ b/core/java/android/widget/QuickContactBadge.java
@@ -92,7 +92,9 @@
com.android.internal.R.styleable.Theme_quickContactBadgeOverlay);
styledAttributes.recycle();
- mQueryHandler = new QueryHandler(mContext.getContentResolver());
+ if (!isInEditMode()) {
+ mQueryHandler = new QueryHandler(mContext.getContentResolver());
+ }
setOnClickListener(this);
}
@@ -199,7 +201,7 @@
public void assignContactFromEmail(String emailAddress, boolean lazyLookup, Bundle extras) {
mContactEmail = emailAddress;
mExtras = extras;
- if (!lazyLookup) {
+ if (!lazyLookup && mQueryHandler != null) {
mQueryHandler.startQuery(TOKEN_EMAIL_LOOKUP, null,
Uri.withAppendedPath(Email.CONTENT_LOOKUP_URI, Uri.encode(mContactEmail)),
EMAIL_LOOKUP_PROJECTION, null, null, null);
@@ -239,7 +241,7 @@
public void assignContactFromPhone(String phoneNumber, boolean lazyLookup, Bundle extras) {
mContactPhone = phoneNumber;
mExtras = extras;
- if (!lazyLookup) {
+ if (!lazyLookup && mQueryHandler != null) {
mQueryHandler.startQuery(TOKEN_PHONE_LOOKUP, null,
Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, mContactPhone),
PHONE_LOOKUP_PROJECTION, null, null, null);
@@ -262,12 +264,12 @@
if (mContactUri != null) {
QuickContact.showQuickContact(getContext(), QuickContactBadge.this, mContactUri,
QuickContact.MODE_LARGE, mExcludeMimes);
- } else if (mContactEmail != null) {
+ } else if (mContactEmail != null && mQueryHandler != null) {
extras.putString(EXTRA_URI_CONTENT, mContactEmail);
mQueryHandler.startQuery(TOKEN_EMAIL_LOOKUP_AND_TRIGGER, extras,
Uri.withAppendedPath(Email.CONTENT_LOOKUP_URI, Uri.encode(mContactEmail)),
EMAIL_LOOKUP_PROJECTION, null, null, null);
- } else if (mContactPhone != null) {
+ } else if (mContactPhone != null && mQueryHandler != null) {
extras.putString(EXTRA_URI_CONTENT, mContactPhone);
mQueryHandler.startQuery(TOKEN_PHONE_LOOKUP_AND_TRIGGER, extras,
Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, mContactPhone),
diff --git a/core/jni/android/graphics/TextLayoutCache.cpp b/core/jni/android/graphics/TextLayoutCache.cpp
index a0c50fa..92d253f 100644
--- a/core/jni/android/graphics/TextLayoutCache.cpp
+++ b/core/jni/android/graphics/TextLayoutCache.cpp
@@ -721,7 +721,8 @@
hb_buffer_set_direction(mBuffer, isRTL ? HB_DIRECTION_RTL : HB_DIRECTION_LTR);
hb_buffer_set_script(mBuffer, run.script);
- // Should set language here (for bug 7004056)
+ SkString langString = paint->getPaintOptionsAndroid().getLanguage().getTag();
+ hb_buffer_set_language(mBuffer, hb_language_from_string(langString.c_str(), -1));
hb_buffer_add_utf16(mBuffer, contextChars, contextCount, start + run.pos, run.length);
// Initialize Harfbuzz Shaper and get the base glyph count for offsetting the glyphIDs
diff --git a/packages/Keyguard/res/layout-land/keyguard_host_view.xml b/packages/Keyguard/res/layout-land/keyguard_host_view.xml
index eeb9ee7..9f1c1f0 100644
--- a/packages/Keyguard/res/layout-land/keyguard_host_view.xml
+++ b/packages/Keyguard/res/layout-land/keyguard_host_view.xml
@@ -60,6 +60,8 @@
android:id="@+id/keyguard_security_container"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
+ android:clipChildren="false"
+ android:clipToPadding="false"
androidprv:layout_childType="challenge"
androidprv:layout_centerWithinArea="0.55">
<com.android.keyguard.KeyguardSecurityViewFlipper
diff --git a/packages/Keyguard/res/layout-port/keyguard_host_view.xml b/packages/Keyguard/res/layout-port/keyguard_host_view.xml
index 8498dcf..136b296 100644
--- a/packages/Keyguard/res/layout-port/keyguard_host_view.xml
+++ b/packages/Keyguard/res/layout-port/keyguard_host_view.xml
@@ -31,7 +31,8 @@
<com.android.keyguard.SlidingChallengeLayout
android:id="@+id/sliding_layout"
android:layout_width="match_parent"
- android:layout_height="match_parent">
+ android:layout_height="match_parent"
+ android:clipChildren="false">
<FrameLayout
android:layout_width="match_parent"
@@ -64,6 +65,8 @@
android:id="@+id/keyguard_security_container"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
+ android:clipChildren="false"
+ android:clipToPadding="false"
androidprv:layout_maxHeight="@dimen/keyguard_security_height"
androidprv:layout_childType="challenge"
android:padding="0dp"
diff --git a/packages/Keyguard/res/layout-sw600dp-port/keyguard_host_view.xml b/packages/Keyguard/res/layout-sw600dp-port/keyguard_host_view.xml
index 77bc9b5..85f6b6d 100644
--- a/packages/Keyguard/res/layout-sw600dp-port/keyguard_host_view.xml
+++ b/packages/Keyguard/res/layout-sw600dp-port/keyguard_host_view.xml
@@ -61,6 +61,8 @@
android:id="@+id/keyguard_security_container"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
+ android:clipChildren="false"
+ android:clipToPadding="false"
androidprv:layout_centerWithinArea="0.5"
androidprv:layout_childType="challenge"
android:layout_gravity="center_horizontal|bottom">
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardTransportControlView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardTransportControlView.java
index a7af6a4..2e35439 100644
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardTransportControlView.java
+++ b/packages/Keyguard/src/com/android/keyguard/KeyguardTransportControlView.java
@@ -65,7 +65,7 @@
protected static final boolean DEBUG = false;
protected static final String TAG = "TransportControlView";
- private static final boolean ANIMATE_TRANSITIONS = true;
+ private static final boolean ANIMATE_TRANSITIONS = false;
private ViewGroup mMetadataContainer;
private ViewGroup mInfoContainer;
@@ -134,6 +134,7 @@
private final Runnable mUpdateSeekBars = new Runnable() {
public void run() {
if (updateSeekBars()) {
+ removeCallbacks(this);
postDelayed(this, 1000);
}
}
@@ -249,7 +250,6 @@
}
if (enabled) {
mUpdateSeekBars.run();
- postDelayed(mUpdateSeekBars, 1000);
} else {
removeCallbacks(mUpdateSeekBars);
}
@@ -437,8 +437,7 @@
setSeekBarsEnabled(false);
}
- KeyguardUpdateMonitor.getInstance(getContext()).dispatchSetBackground(
- mMetadata.bitmap);
+ KeyguardUpdateMonitor.getInstance(getContext()).dispatchSetBackground(mMetadata.bitmap);
final int flags = mTransportControlFlags;
setVisibilityBasedOnFlag(mBtnPrev, flags, RemoteControlClient.FLAG_KEY_MEDIA_PREVIOUS);
setVisibilityBasedOnFlag(mBtnNext, flags, RemoteControlClient.FLAG_KEY_MEDIA_NEXT);
@@ -539,7 +538,7 @@
imageResId = R.drawable.ic_media_pause;
imageDescId = R.string.keyguard_transport_pause_description;
if (mSeekEnabled) {
- postDelayed(mUpdateSeekBars, 1000);
+ mUpdateSeekBars.run();
}
break;
@@ -567,6 +566,7 @@
boolean updateSeekBars() {
final int position = (int) mRemoteController.getEstimatedMediaPosition();
if (position >= 0) {
+ if (DEBUG) Log.v(TAG, "Seek to " + position);
if (!mUserSeeking) {
mTransientSeekBar.setProgress(position);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsModel.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsModel.java
index 2026102..15d655c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsModel.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsModel.java
@@ -280,7 +280,7 @@
mUserTracker = new CurrentUserTracker(mContext) {
public void onUserSwitched(int newUserId) {
mBrightnessObserver.startObserving();
- onRotationLockChanged();
+ refreshRotationLockTile();
onBrightnessLevelChanged();
onNextAlarmChanged();
onBugreportChanged();
diff --git a/services/input/InputDispatcher.cpp b/services/input/InputDispatcher.cpp
index 274009f..10a639e 100644
--- a/services/input/InputDispatcher.cpp
+++ b/services/input/InputDispatcher.cpp
@@ -1699,7 +1699,7 @@
// up with lots of events because the application is not responding.
// This condition ensures that ANRs are detected reliably.
if (!connection->waitQueue.isEmpty()
- && currentTime >= connection->waitQueue.head->eventEntry->eventTime
+ && currentTime >= connection->waitQueue.head->deliveryTime
+ STREAM_AHEAD_EVENT_TIMEOUT) {
return false;
}
diff --git a/services/java/com/android/server/AlarmManagerService.java b/services/java/com/android/server/AlarmManagerService.java
index 3d804ef..b70a34e 100644
--- a/services/java/com/android/server/AlarmManagerService.java
+++ b/services/java/com/android/server/AlarmManagerService.java
@@ -385,10 +385,19 @@
for (int i = 0; i < N; i++) {
Alarm a = batch.get(i);
long whenElapsed = convertToElapsed(a.when, a.type);
- long maxElapsed = (a.whenElapsed == a.maxWhen)
- ? whenElapsed
- : maxTriggerTime(nowElapsed, whenElapsed, a.repeatInterval);
- setImplLocked(a.type, a.when, whenElapsed, maxElapsed,
+ final long maxElapsed;
+ if (a.whenElapsed == a.maxWhen) {
+ // Exact
+ maxElapsed = whenElapsed;
+ } else {
+ // Not exact. Preserve any explicit window, otherwise recalculate
+ // the window based on the alarm's new futurity. Note that this
+ // reflects a policy of preferring timely to deferred delivery.
+ maxElapsed = (a.windowLength > 0)
+ ? (whenElapsed + a.windowLength)
+ : maxTriggerTime(nowElapsed, whenElapsed, a.repeatInterval);
+ }
+ setImplLocked(a.type, a.when, whenElapsed, a.windowLength, maxElapsed,
a.repeatInterval, a.operation, batch.standalone, doValidate, a.workSource);
}
}
@@ -556,15 +565,16 @@
+ " tElapsed=" + triggerElapsed + " maxElapsed=" + maxElapsed
+ " interval=" + interval + " standalone=" + isStandalone);
}
- setImplLocked(type, triggerAtTime, triggerElapsed, maxElapsed,
+ setImplLocked(type, triggerAtTime, triggerElapsed, windowLength, maxElapsed,
interval, operation, isStandalone, true, workSource);
}
}
- private void setImplLocked(int type, long when, long whenElapsed, long maxWhen, long interval,
- PendingIntent operation, boolean isStandalone, boolean doValidate,
- WorkSource workSource) {
- Alarm a = new Alarm(type, when, whenElapsed, maxWhen, interval, operation, workSource);
+ private void setImplLocked(int type, long when, long whenElapsed, long windowLength,
+ long maxWhen, long interval, PendingIntent operation, boolean isStandalone,
+ boolean doValidate, WorkSource workSource) {
+ Alarm a = new Alarm(type, when, whenElapsed, windowLength, maxWhen, interval,
+ operation, workSource);
removeLocked(operation);
boolean reschedule;
@@ -1046,7 +1056,7 @@
// Also schedule its next recurrence
final long delta = alarm.count * alarm.repeatInterval;
final long nextElapsed = alarm.whenElapsed + delta;
- setImplLocked(alarm.type, alarm.when + delta, nextElapsed,
+ setImplLocked(alarm.type, alarm.when + delta, nextElapsed, alarm.windowLength,
maxTriggerTime(nowELAPSED, nextElapsed, alarm.repeatInterval),
alarm.repeatInterval, alarm.operation, batch.standalone, true,
alarm.workSource);
@@ -1077,17 +1087,19 @@
public int type;
public int count;
public long when;
+ public long windowLength;
public long whenElapsed; // 'when' in the elapsed time base
public long maxWhen; // also in the elapsed time base
public long repeatInterval;
public PendingIntent operation;
public WorkSource workSource;
- public Alarm(int _type, long _when, long _whenElapsed, long _maxWhen,
+ public Alarm(int _type, long _when, long _whenElapsed, long _windowLength, long _maxWhen,
long _interval, PendingIntent _op, WorkSource _ws) {
type = _type;
when = _when;
whenElapsed = _whenElapsed;
+ windowLength = _windowLength;
maxWhen = _maxWhen;
repeatInterval = _interval;
operation = _op;
@@ -1112,6 +1124,7 @@
pw.print(prefix); pw.print("type="); pw.print(type);
pw.print(" whenElapsed="); pw.print(whenElapsed);
pw.print(" when="); TimeUtils.formatDuration(when, now, pw);
+ pw.print(" window="); pw.print(windowLength);
pw.print(" repeatInterval="); pw.print(repeatInterval);
pw.print(" count="); pw.println(count);
pw.print(prefix); pw.print("operation="); pw.println(operation);
diff --git a/services/java/com/android/server/am/ActivityRecord.java b/services/java/com/android/server/am/ActivityRecord.java
index cf68667..49f29fe 100644
--- a/services/java/com/android/server/am/ActivityRecord.java
+++ b/services/java/com/android/server/am/ActivityRecord.java
@@ -480,7 +480,12 @@
void setTask(TaskRecord newTask, ThumbnailHolder newThumbHolder, boolean isRoot) {
if (task != null && task.removeActivity(this)) {
- mStackSupervisor.removeTask(task);
+ if (task != newTask) {
+ mStackSupervisor.removeTask(task);
+ } else {
+ Slog.d(TAG, "!!! REMOVE THIS LOG !!! setTask: nearly removed stack=" +
+ (newTask == null ? null : newTask.stack));
+ }
}
if (inHistory && !finishing) {
if (task != null) {
diff --git a/services/java/com/android/server/pm/PackageManagerService.java b/services/java/com/android/server/pm/PackageManagerService.java
index fb6e9ed..95dc373 100755
--- a/services/java/com/android/server/pm/PackageManagerService.java
+++ b/services/java/com/android/server/pm/PackageManagerService.java
@@ -5566,9 +5566,9 @@
// version of the one on the data partition, but which
// granted a new system permission that it didn't have
// before. In this case we do want to allow the app to
- // now get the new permission if the new system-partition
- // apk is privileged to get it.
- if (sysPs.pkg != null && isPrivilegedApp(pkg)) {
+ // now get the new permission if the ancestral apk is
+ // privileged to get it.
+ if (sysPs.pkg != null && sysPs.isPrivileged()) {
for (int j=0;
j<sysPs.pkg.requestedPermissions.size(); j++) {
if (perm.equals(
@@ -9370,7 +9370,7 @@
}
}
- boolean locationIsPrivileged(File path) {
+ static boolean locationIsPrivileged(File path) {
try {
final String privilegedAppDir = new File(Environment.getRootDirectory(), "priv-app")
.getCanonicalPath();
diff --git a/services/java/com/android/server/pm/PackageSetting.java b/services/java/com/android/server/pm/PackageSetting.java
index b6f9f5b..b447861 100644
--- a/services/java/com/android/server/pm/PackageSetting.java
+++ b/services/java/com/android/server/pm/PackageSetting.java
@@ -16,6 +16,7 @@
package com.android.server.pm;
+import android.content.pm.ApplicationInfo;
import android.content.pm.PackageParser;
import java.io.File;
@@ -56,4 +57,8 @@
public int[] getGids() {
return sharedUser != null ? sharedUser.gids : gids;
}
+
+ public boolean isPrivileged() {
+ return (pkgFlags & ApplicationInfo.FLAG_PRIVILEGED) != 0;
+ }
}
diff --git a/services/java/com/android/server/pm/Settings.java b/services/java/com/android/server/pm/Settings.java
index 92fc6a4..3b4393a 100644
--- a/services/java/com/android/server/pm/Settings.java
+++ b/services/java/com/android/server/pm/Settings.java
@@ -2210,7 +2210,11 @@
int pkgFlags = 0;
pkgFlags |= ApplicationInfo.FLAG_SYSTEM;
- PackageSetting ps = new PackageSetting(name, realName, new File(codePathStr),
+ final File codePathFile = new File(codePathStr);
+ if (PackageManagerService.locationIsPrivileged(codePathFile)) {
+ pkgFlags |= ApplicationInfo.FLAG_PRIVILEGED;
+ }
+ PackageSetting ps = new PackageSetting(name, realName, codePathFile,
new File(resourcePathStr), nativeLibraryPathStr, versionCode, pkgFlags);
String timeStampStr = parser.getAttributeValue(null, "ft");
if (timeStampStr != null) {
@@ -2266,6 +2270,7 @@
XmlUtils.skipCurrentTag(parser);
}
}
+
mDisabledSysPackages.put(name, ps);
}
diff --git a/services/java/com/android/server/wifi/WifiService.java b/services/java/com/android/server/wifi/WifiService.java
index 86c68f3..d471b57 100644
--- a/services/java/com/android/server/wifi/WifiService.java
+++ b/services/java/com/android/server/wifi/WifiService.java
@@ -35,6 +35,7 @@
import android.net.wifi.BatchedScanResult;
import android.net.wifi.BatchedScanSettings;
import android.net.wifi.WifiConfiguration;
+import android.net.wifi.WifiConfiguration.ProxySettings;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.net.wifi.WifiStateMachine;
@@ -175,8 +176,19 @@
WifiConfiguration config = (WifiConfiguration) msg.obj;
int networkId = msg.arg1;
if (config != null && config.isValid()) {
- if (DBG) Slog.d(TAG, "Connect with config" + config);
- mWifiStateMachine.sendMessage(Message.obtain(msg));
+ // This is restricted because there is no UI for the user to
+ // monitor/control PAC.
+ if (config.proxySettings != ProxySettings.PAC) {
+ if (DBG) Slog.d(TAG, "Connect with config" + config);
+ mWifiStateMachine.sendMessage(Message.obtain(msg));
+ } else {
+ Slog.e(TAG, "ClientHandler.handleMessage cannot process msg with PAC");
+ if (msg.what == WifiManager.CONNECT_NETWORK) {
+ replyFailed(msg, WifiManager.CONNECT_NETWORK_FAILED);
+ } else {
+ replyFailed(msg, WifiManager.SAVE_NETWORK_FAILED);
+ }
+ }
} else if (config == null
&& networkId != WifiConfiguration.INVALID_NETWORK_ID) {
if (DBG) Slog.d(TAG, "Connect with networkId" + networkId);
@@ -685,6 +697,9 @@
*/
public int addOrUpdateNetwork(WifiConfiguration config) {
enforceChangePermission();
+ if (config.proxySettings == ProxySettings.PAC) {
+ enforceConnectivityInternalPermission();
+ }
if (config.isValid()) {
if (mWifiStateMachineChannel != null) {
return mWifiStateMachine.syncAddOrUpdateNetwork(mWifiStateMachineChannel, config);
diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java
index cfb10a0..55d2e5d 100644
--- a/services/java/com/android/server/wm/WindowManagerService.java
+++ b/services/java/com/android/server/wm/WindowManagerService.java
@@ -8407,6 +8407,20 @@
&& !mWallpaperTarget.mWinAnimator.isDummyAnimation()
? null : mWallpaperTarget;
+ // If there is a wallpaper target and the target is neither opening nor closing, then
+ // there exists an app on top of the wallpaper target that has a translucent
+ // background.
+ // If the pending transition is an exit, we should add the wallpaper target to the list
+ // of opening apps so that the translucent app on top of it will animate correctly.
+ final AppWindowToken wallpaperTargetAppToken =
+ mWallpaperTarget != null ? mWallpaperTarget.mAppToken : null;
+ if (wallpaperTargetAppToken != null
+ && !mClosingApps.contains(wallpaperTargetAppToken)
+ && !mOpeningApps.contains(wallpaperTargetAppToken)
+ && (transit & AppTransition.TRANSIT_EXIT_MASK) != 0) {
+ mOpeningApps.add(wallpaperTargetAppToken);
+ NN++;
+ }
mInnerFields.mWallpaperMayChange = false;
// The top-most window will supply the layout params,
diff --git a/telephony/java/android/telephony/ServiceState.java b/telephony/java/android/telephony/ServiceState.java
index 6c4bd66..606fcb4 100644
--- a/telephony/java/android/telephony/ServiceState.java
+++ b/telephony/java/android/telephony/ServiceState.java
@@ -693,7 +693,7 @@
mOperatorNumeric = m.getString("operator-numeric");
mIsManualNetworkSelection = m.getBoolean("manual");
mRilVoiceRadioTechnology = m.getInt("radioTechnology");
- mRilVoiceRadioTechnology = m.getInt("dataRadioTechnology");
+ mRilDataRadioTechnology = m.getInt("dataRadioTechnology");
mCssIndicator = m.getBoolean("cssIndicator");
mNetworkId = m.getInt("networkId");
mSystemId = m.getInt("systemId");
diff --git a/telephony/java/com/android/internal/telephony/CallerInfo.java b/telephony/java/com/android/internal/telephony/CallerInfo.java
index e3c664b..f6143ed 100644
--- a/telephony/java/com/android/internal/telephony/CallerInfo.java
+++ b/telephony/java/com/android/internal/telephony/CallerInfo.java
@@ -581,6 +581,10 @@
return countryIso;
}
+ protected static String getCurrentCountryIso(Context context) {
+ return getCurrentCountryIso(context, Locale.getDefault());
+ }
+
/**
* @return a string debug representation of this instance.
*/
diff --git a/telephony/java/com/android/internal/telephony/CallerInfoAsyncQuery.java b/telephony/java/com/android/internal/telephony/CallerInfoAsyncQuery.java
index dd5f644..c63be91 100644
--- a/telephony/java/com/android/internal/telephony/CallerInfoAsyncQuery.java
+++ b/telephony/java/com/android/internal/telephony/CallerInfoAsyncQuery.java
@@ -20,7 +20,6 @@
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
-import android.location.CountryDetector;
import android.net.Uri;
import android.os.Handler;
import android.os.Looper;
@@ -271,11 +270,9 @@
// Use the number entered by the user for display.
if (!TextUtils.isEmpty(cw.number)) {
- CountryDetector detector = (CountryDetector) mQueryContext.getSystemService(
- Context.COUNTRY_DETECTOR);
mCallerInfo.phoneNumber = PhoneNumberUtils.formatNumber(cw.number,
mCallerInfo.normalizedNumber,
- detector.detectCountry().getCountryIso());
+ CallerInfo.getCurrentCountryIso(mQueryContext));
}
}
diff --git a/wifi/java/android/net/wifi/WifiStateMachine.java b/wifi/java/android/net/wifi/WifiStateMachine.java
index 4bc3dda..78da7e7 100644
--- a/wifi/java/android/net/wifi/WifiStateMachine.java
+++ b/wifi/java/android/net/wifi/WifiStateMachine.java
@@ -89,6 +89,7 @@
import java.net.Inet6Address;
import java.util.ArrayList;
import java.util.List;
+import java.util.Locale;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.Iterator;
@@ -500,6 +501,10 @@
// until after, so the write is deferred
private volatile String mPersistedCountryCode;
+ // Supplicant doesn't like setting the same country code multiple times (it may drop
+ // currently connected network), so we save the country code here to avoid redundency
+ private String mLastSetCountryCode;
+
private static final int MIN_RSSI = -200;
private static final int MAX_RSSI = 256;
@@ -3022,8 +3027,16 @@
case CMD_SET_COUNTRY_CODE:
String country = (String) message.obj;
if (DBG) log("set country code " + country);
- if (!mWifiNative.setCountryCode(country)) {
- loge("Failed to set country code " + country);
+ if (country != null) {
+ country = country.toUpperCase(Locale.ROOT);
+ if (mLastSetCountryCode == null
+ || country.equals(mLastSetCountryCode) == false) {
+ if (mWifiNative.setCountryCode(country)) {
+ mLastSetCountryCode = country;
+ } else {
+ loge("Failed to set country code " + country);
+ }
+ }
}
break;
case CMD_SET_FREQUENCY_BAND:
@@ -3156,6 +3169,8 @@
intent.putExtra(WifiManager.EXTRA_SCAN_AVAILABLE, WIFI_STATE_DISABLED);
mContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL);
noteScanEnd(); // wrap up any pending request.
+
+ mLastSetCountryCode = null;
}
}
diff --git a/wifi/java/android/net/wifi/p2p/WifiP2pService.java b/wifi/java/android/net/wifi/p2p/WifiP2pService.java
index 625ffb8..8b07208 100644
--- a/wifi/java/android/net/wifi/p2p/WifiP2pService.java
+++ b/wifi/java/android/net/wifi/p2p/WifiP2pService.java
@@ -85,6 +85,8 @@
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
+import java.util.Locale;
+
/**
* WifiP2pService includes a state machine to perform Wi-Fi p2p operations. Applications
@@ -201,6 +203,10 @@
*/
private boolean mDiscoveryBlocked;
+ // Supplicant doesn't like setting the same country code multiple times (it may drop
+ // current connected network), so we save the country code here to avoid redundency
+ private String mLastSetCountryCode;
+
/*
* remember if we were in a scan when it had to be stopped
*/
@@ -1070,7 +1076,13 @@
break;
case SET_COUNTRY_CODE:
String countryCode = (String) message.obj;
- mWifiNative.setCountryCode(countryCode);
+ countryCode = countryCode.toUpperCase(Locale.ROOT);
+ if (mLastSetCountryCode == null ||
+ countryCode.equals(mLastSetCountryCode) == false) {
+ if (mWifiNative.setCountryCode(countryCode)) {
+ mLastSetCountryCode = countryCode;
+ }
+ }
break;
default:
return NOT_HANDLED;
@@ -1082,6 +1094,8 @@
public void exit() {
sendP2pStateChangedBroadcast(false);
mNetworkInfo.setIsAvailable(false);
+
+ mLastSetCountryCode = null;
}
}