Merge "Remove "forgot pattern" in pattern view" into lmp-dev
diff --git a/api/current.txt b/api/current.txt
index dca7481..a320e01 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -3544,8 +3544,8 @@
method public void setContentView(android.view.View);
method public void setContentView(android.view.View, android.view.ViewGroup.LayoutParams);
method public final void setDefaultKeyMode(int);
- method public void setEnterSharedElementListener(android.app.SharedElementListener);
- method public void setExitSharedElementListener(android.app.SharedElementListener);
+ method public void setEnterSharedElementCallback(android.app.SharedElementCallback);
+ method public void setExitSharedElementCallback(android.app.SharedElementCallback);
method public final void setFeatureDrawable(int, android.graphics.drawable.Drawable);
method public final void setFeatureDrawableAlpha(int, int);
method public final void setFeatureDrawableResource(int, int);
@@ -4319,9 +4319,9 @@
method public void setAllowEnterTransitionOverlap(boolean);
method public void setAllowReturnTransitionOverlap(boolean);
method public void setArguments(android.os.Bundle);
- method public void setEnterSharedElementTransitionListener(android.app.SharedElementListener);
+ method public void setEnterSharedElementTransitionCallback(android.app.SharedElementCallback);
method public void setEnterTransition(android.transition.Transition);
- method public void setExitSharedElementTransitionListener(android.app.SharedElementListener);
+ method public void setExitSharedElementTransitionCallback(android.app.SharedElementCallback);
method public void setExitTransition(android.transition.Transition);
method public void setHasOptionsMenu(boolean);
method public void setInitialSavedState(android.app.Fragment.SavedState);
@@ -5192,14 +5192,14 @@
field public static final int START_STICKY_COMPATIBILITY = 0; // 0x0
}
- public abstract class SharedElementListener {
- ctor public SharedElementListener();
- method public android.os.Parcelable captureSharedElementSnapshot(android.view.View, android.graphics.Matrix, android.graphics.RectF);
- method public android.view.View createSnapshotView(android.content.Context, android.os.Parcelable);
- method public void handleRejectedSharedElements(java.util.List<android.view.View>);
- method public void remapSharedElements(java.util.List<java.lang.String>, java.util.Map<java.lang.String, android.view.View>);
- method public void setSharedElementEnd(java.util.List<java.lang.String>, java.util.List<android.view.View>, java.util.List<android.view.View>);
- method public void setSharedElementStart(java.util.List<java.lang.String>, java.util.List<android.view.View>, java.util.List<android.view.View>);
+ public abstract class SharedElementCallback {
+ ctor public SharedElementCallback();
+ method public android.os.Parcelable onCaptureSharedElementSnapshot(android.view.View, android.graphics.Matrix, android.graphics.RectF);
+ method public android.view.View onCreateSnapshotView(android.content.Context, android.os.Parcelable);
+ method public void onMapSharedElements(java.util.List<java.lang.String>, java.util.Map<java.lang.String, android.view.View>);
+ method public void onRejectSharedElements(java.util.List<android.view.View>);
+ method public void onSharedElementEnd(java.util.List<java.lang.String>, java.util.List<android.view.View>, java.util.List<android.view.View>);
+ method public void onSharedElementStart(java.util.List<java.lang.String>, java.util.List<android.view.View>, java.util.List<android.view.View>);
}
public deprecated class TabActivity extends android.app.ActivityGroup {
@@ -5507,23 +5507,23 @@
field public static final int ENCRYPTION_STATUS_UNSUPPORTED = 0; // 0x0
field public static final java.lang.String EXTRA_ADD_EXPLANATION = "android.app.extra.ADD_EXPLANATION";
field public static final java.lang.String EXTRA_DEVICE_ADMIN = "android.app.extra.DEVICE_ADMIN";
- field public static final java.lang.String EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE = "android.app.extra.ADMIN_EXTRA_BUNDLE";
- field public static final java.lang.String EXTRA_PROVISIONING_DEFAULT_MANAGED_PROFILE_NAME = "android.app.extra.DEFAULT_MANAGED_PROFILE_NAME";
- field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM = "android.app.extra.DEVICE_ADMIN_PACKAGE_CHECKSUM";
- field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_COOKIE_HEADER = "android.app.extra.DEVICE_ADMIN_PACKAGE_DOWNLOAD_COOKIE_HEADER";
- field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION = "android.app.extra.DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION";
+ field public static final java.lang.String EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE = "android.app.extra.PROVISIONING_ADMIN_EXTRAS_BUNDLE";
+ field public static final java.lang.String EXTRA_PROVISIONING_DEFAULT_MANAGED_PROFILE_NAME = "android.app.extra.PROVISIONING_DEFAULT_MANAGED_PROFILE_NAME";
+ field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM = "android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM";
+ field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_COOKIE_HEADER = "android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_COOKIE_HEADER";
+ field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION = "android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION";
field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME = "android.app.extra.deviceAdminPackageName";
- field public static final java.lang.String EXTRA_PROVISIONING_LOCALE = "android.app.extra.LOCALE";
- field public static final java.lang.String EXTRA_PROVISIONING_LOCAL_TIME = "android.app.extra.LOCAL_TIME";
- field public static final java.lang.String EXTRA_PROVISIONING_TIME_ZONE = "android.app.extra.TIME_ZONE";
- field public static final java.lang.String EXTRA_PROVISIONING_WIFI_HIDDEN = "android.app.extra.WIFI_HIDDEN";
- field public static final java.lang.String EXTRA_PROVISIONING_WIFI_PAC_URL = "android.app.extra.WIFI_PAC_URL";
- field public static final java.lang.String EXTRA_PROVISIONING_WIFI_PASSWORD = "android.app.extra.WIFI_PASSWORD";
- field public static final java.lang.String EXTRA_PROVISIONING_WIFI_PROXY_BYPASS = "android.app.extra.WIFI_PROXY_BYPASS_HOSTS";
- field public static final java.lang.String EXTRA_PROVISIONING_WIFI_PROXY_HOST = "android.app.extra.WIFI_PROXY_HOST";
- field public static final java.lang.String EXTRA_PROVISIONING_WIFI_PROXY_PORT = "android.app.extra.WIFI_PROXY_PORT";
- field public static final java.lang.String EXTRA_PROVISIONING_WIFI_SECURITY_TYPE = "android.app.extra.WIFI_SECURITY_TYPE";
- field public static final java.lang.String EXTRA_PROVISIONING_WIFI_SSID = "android.app.extra.WIFI_SSID";
+ field public static final java.lang.String EXTRA_PROVISIONING_LOCALE = "android.app.extra.PROVISIONING_LOCALE";
+ field public static final java.lang.String EXTRA_PROVISIONING_LOCAL_TIME = "android.app.extra.PROVISIONING_LOCAL_TIME";
+ field public static final java.lang.String EXTRA_PROVISIONING_TIME_ZONE = "android.app.extra.PROVISIONING_TIME_ZONE";
+ field public static final java.lang.String EXTRA_PROVISIONING_WIFI_HIDDEN = "android.app.extra.PROVISIONING_WIFI_HIDDEN";
+ field public static final java.lang.String EXTRA_PROVISIONING_WIFI_PAC_URL = "android.app.extra.PROVISIONING_WIFI_PAC_URL";
+ field public static final java.lang.String EXTRA_PROVISIONING_WIFI_PASSWORD = "android.app.extra.PROVISIONING_WIFI_PASSWORD";
+ field public static final java.lang.String EXTRA_PROVISIONING_WIFI_PROXY_BYPASS = "android.app.extra.PROVISIONING_WIFI_PROXY_BYPASS";
+ field public static final java.lang.String EXTRA_PROVISIONING_WIFI_PROXY_HOST = "android.app.extra.PROVISIONING_WIFI_PROXY_HOST";
+ field public static final java.lang.String EXTRA_PROVISIONING_WIFI_PROXY_PORT = "android.app.extra.PROVISIONING_WIFI_PROXY_PORT";
+ field public static final java.lang.String EXTRA_PROVISIONING_WIFI_SECURITY_TYPE = "android.app.extra.PROVISIONING_WIFI_SECURITY_TYPE";
+ field public static final java.lang.String EXTRA_PROVISIONING_WIFI_SSID = "android.app.extra.PROVISIONING_WIFI_SSID";
field public static int FLAG_MANAGED_CAN_ACCESS_PARENT;
field public static int FLAG_PARENT_CAN_ACCESS_MANAGED;
field public static final int KEYGUARD_DISABLE_FEATURES_ALL = 2147483647; // 0x7fffffff
@@ -5534,7 +5534,7 @@
field public static final int KEYGUARD_DISABLE_TRUST_AGENTS = 16; // 0x10
field public static final int KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS = 8; // 0x8
field public static final int KEYGUARD_DISABLE_WIDGETS_ALL = 1; // 0x1
- field public static final java.lang.String KEY_PROVISIONING_EMAIL_ADDRESS = "android.app.key.ManagedProfileEmailAddress";
+ field public static final java.lang.String KEY_PROVISIONING_EMAIL_ADDRESS = "android.app.key.PROVISIONING_EMAIL_ADDRESS";
field public static final java.lang.String MIME_TYPE_PROVISIONING_NFC = "application/com.android.managedprovisioning";
field public static final int PASSWORD_QUALITY_ALPHABETIC = 262144; // 0x40000
field public static final int PASSWORD_QUALITY_ALPHANUMERIC = 327680; // 0x50000
@@ -5875,7 +5875,7 @@
field public static final int RESIZE_VERTICAL = 2; // 0x2
field public static final int WIDGET_CATEGORY_HOME_SCREEN = 1; // 0x1
field public static final int WIDGET_CATEGORY_KEYGUARD = 2; // 0x2
- field public static final int WIDGET_CATEGORY_RECENTS = 4; // 0x4
+ field public static final int WIDGET_CATEGORY_SEARCHBOX = 4; // 0x4
field public int autoAdvanceViewId;
field public android.content.ComponentName configure;
field public int icon;
@@ -27177,9 +27177,9 @@
package android.service.voice {
public class AlwaysOnHotwordDetector {
- method public android.content.Intent createIntentToEnroll();
- method public android.content.Intent createIntentToReEnroll();
- method public android.content.Intent createIntentToUnEnroll();
+ method public android.content.Intent createEnrollIntent();
+ method public android.content.Intent createReEnrollIntent();
+ method public android.content.Intent createUnEnrollIntent();
method public int getSupportedRecognitionModes();
method public boolean startRecognition(int);
method public boolean stopRecognition();
@@ -28491,6 +28491,7 @@
method public void addNewIncomingCall(android.telecomm.PhoneAccountHandle, android.os.Bundle);
method public void cancelMissedCallsNotification();
method public void clearAccounts(java.lang.String);
+ method public android.telecomm.PhoneAccountHandle getConnectionManager();
method public android.telecomm.PhoneAccountHandle getDefaultOutgoingPhoneAccount(java.lang.String);
method public java.util.List<android.telecomm.PhoneAccountHandle> getEnabledPhoneAccounts();
method public android.telecomm.PhoneAccount getPhoneAccount(android.telecomm.PhoneAccountHandle);
@@ -28721,11 +28722,11 @@
method public int getStatus();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator CREATOR;
- field public static int INVALID_CHANNEL;
- field public static int STATUS_MISSING_RESOURCE;
- field public static int STATUS_NO_ERROR;
- field public static int STATUS_NO_SUCH_ELEMENT;
- field public static int STATUS_UNKNOWN_ERROR;
+ field public static final int INVALID_CHANNEL = -1; // 0xffffffff
+ field public static final int STATUS_MISSING_RESOURCE = 2; // 0x2
+ field public static final int STATUS_NO_ERROR = 1; // 0x1
+ field public static final int STATUS_NO_SUCH_ELEMENT = 3; // 0x3
+ field public static final int STATUS_UNKNOWN_ERROR = 4; // 0x4
}
public class NeighboringCellInfo implements android.os.Parcelable {
@@ -36539,6 +36540,7 @@
method public abstract java.lang.String getMethod();
method public abstract java.util.Map<java.lang.String, java.lang.String> getRequestHeaders();
method public abstract android.net.Uri getUrl();
+ method public abstract boolean hasGesture();
method public abstract boolean hasUserGestureInsecure();
method public abstract boolean isForMainFrame();
}
@@ -36827,7 +36829,7 @@
method public void setWebViewClient(android.webkit.WebViewClient);
method public deprecated boolean showFindDialog(java.lang.String, boolean);
method public void stopLoading();
- method public boolean zoomBy(float);
+ method public void zoomBy(float);
method public boolean zoomIn();
method public boolean zoomOut();
field public static final java.lang.String SCHEME_GEO = "geo:0,0?q=";
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java
index 8f0266c..89a9692 100644
--- a/core/java/android/app/Activity.java
+++ b/core/java/android/app/Activity.java
@@ -788,8 +788,8 @@
final Handler mHandler = new Handler();
ActivityTransitionState mActivityTransitionState = new ActivityTransitionState();
- SharedElementListener mEnterTransitionListener = SharedElementListener.NULL_LISTENER;
- SharedElementListener mExitTransitionListener = SharedElementListener.NULL_LISTENER;
+ SharedElementCallback mEnterTransitionListener = SharedElementCallback.NULL_CALLBACK;
+ SharedElementCallback mExitTransitionListener = SharedElementCallback.NULL_CALLBACK;
/** Return the intent that started this activity. */
public Intent getIntent() {
@@ -5779,33 +5779,33 @@
/**
* When {@link android.app.ActivityOptions#makeSceneTransitionAnimation(Activity,
- * android.view.View, String)} was used to start an Activity, <var>listener</var>
+ * android.view.View, String)} was used to start an Activity, <var>callback</var>
* will be called to handle shared elements on the <i>launched</i> Activity. This requires
* {@link Window#FEATURE_CONTENT_TRANSITIONS}.
*
- * @param listener Used to manipulate shared element transitions on the launched Activity.
+ * @param callback Used to manipulate shared element transitions on the launched Activity.
*/
- public void setEnterSharedElementListener(SharedElementListener listener) {
- if (listener == null) {
- listener = SharedElementListener.NULL_LISTENER;
+ public void setEnterSharedElementCallback(SharedElementCallback callback) {
+ if (callback == null) {
+ callback = SharedElementCallback.NULL_CALLBACK;
}
- mEnterTransitionListener = listener;
+ mEnterTransitionListener = callback;
}
/**
* When {@link android.app.ActivityOptions#makeSceneTransitionAnimation(Activity,
- * android.view.View, String)} was used to start an Activity, <var>listener</var>
+ * android.view.View, String)} was used to start an Activity, <var>callback</var>
* will be called to handle shared elements on the <i>launching</i> Activity. Most
* calls will only come when returning from the started Activity.
* This requires {@link Window#FEATURE_CONTENT_TRANSITIONS}.
*
- * @param listener Used to manipulate shared element transitions on the launching Activity.
+ * @param callback Used to manipulate shared element transitions on the launching Activity.
*/
- public void setExitSharedElementListener(SharedElementListener listener) {
- if (listener == null) {
- listener = SharedElementListener.NULL_LISTENER;
+ public void setExitSharedElementCallback(SharedElementCallback callback) {
+ if (callback == null) {
+ callback = SharedElementCallback.NULL_CALLBACK;
}
- mExitTransitionListener = listener;
+ mExitTransitionListener = callback;
}
/**
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 38999a8..4f2a3bc 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -1938,7 +1938,7 @@
if (dumpFullInfo) {
printRow(pw, HEAP_FULL_COLUMN, "", "Pss", "Pss", "Shared", "Private",
"Shared", "Private", "Swapped", "Heap", "Heap", "Heap");
- printRow(pw, HEAP_FULL_COLUMN, "", "Total", "Clean", "Dirty", "Dirty",
+ printRow(pw, HEAP_FULL_COLUMN, "", "Total", "Clean", "Dirty", "",
"Clean", "Clean", "Dirty", "Size", "Alloc", "Free");
printRow(pw, HEAP_FULL_COLUMN, "", "------", "------", "------", "------",
"------", "------", "------", "------", "------", "------");
diff --git a/core/java/android/app/ActivityTransitionCoordinator.java b/core/java/android/app/ActivityTransitionCoordinator.java
index a09a2e7..9e80a4b 100644
--- a/core/java/android/app/ActivityTransitionCoordinator.java
+++ b/core/java/android/app/ActivityTransitionCoordinator.java
@@ -197,7 +197,7 @@
final protected ArrayList<View> mSharedElements = new ArrayList<View>();
final protected ArrayList<String> mSharedElementNames = new ArrayList<String>();
final protected ArrayList<View> mTransitioningViews = new ArrayList<View>();
- protected SharedElementListener mListener;
+ protected SharedElementCallback mListener;
protected ResultReceiver mResultReceiver;
final private FixedEpicenterCallback mEpicenterCallback = new FixedEpicenterCallback();
final protected boolean mIsReturning;
@@ -208,7 +208,7 @@
public ActivityTransitionCoordinator(Window window,
ArrayList<String> allSharedElementNames,
- SharedElementListener listener, boolean isReturning) {
+ SharedElementCallback listener, boolean isReturning) {
super(new Handler());
mWindow = window;
mListener = listener;
@@ -218,7 +218,7 @@
protected void viewsReady(ArrayMap<String, View> sharedElements) {
sharedElements.retainAll(mAllSharedElementNames);
- mListener.remapSharedElements(mAllSharedElementNames, sharedElements);
+ mListener.onMapSharedElements(mAllSharedElementNames, sharedElements);
mSharedElementNames.addAll(sharedElements.keySet());
mSharedElements.addAll(sharedElements.values());
if (getViewsTransition() != null) {
@@ -251,9 +251,11 @@
*/
protected void setEpicenter() {
View epicenter = null;
- if (!mAllSharedElementNames.isEmpty() && !mSharedElementNames.isEmpty() &&
- mAllSharedElementNames.get(0).equals(mSharedElementNames.get(0))) {
- epicenter = mSharedElements.get(0);
+ if (!mAllSharedElementNames.isEmpty() && !mSharedElementNames.isEmpty()) {
+ int index = mSharedElementNames.indexOf(mAllSharedElementNames.get(0));
+ if (index >= 0) {
+ epicenter = mSharedElements.get(index);
+ }
}
setEpicenter(epicenter);
}
@@ -458,20 +460,21 @@
tempMatrix, tempRect, null);
}
}
- mListener.setSharedElementStart(mSharedElementNames, mSharedElements, snapshots);
+ mListener.onSharedElementStart(mSharedElementNames, mSharedElements, snapshots);
return originalImageState;
}
protected void notifySharedElementEnd(ArrayList<View> snapshots) {
- mListener.setSharedElementEnd(mSharedElementNames, mSharedElements, snapshots);
+ mListener.onSharedElementEnd(mSharedElementNames, mSharedElements, snapshots);
}
protected void scheduleSetSharedElementEnd(final ArrayList<View> snapshots) {
- getDecor().getViewTreeObserver().addOnPreDrawListener(
+ final View decorView = getDecor();
+ decorView.getViewTreeObserver().addOnPreDrawListener(
new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
- getDecor().getViewTreeObserver().removeOnPreDrawListener(this);
+ decorView.getViewTreeObserver().removeOnPreDrawListener(this);
notifySharedElementEnd(snapshots);
return true;
}
@@ -526,7 +529,7 @@
Parcelable parcelable = sharedElementBundle.getParcelable(KEY_SNAPSHOT);
View snapshot = null;
if (parcelable != null) {
- snapshot = mListener.createSnapshotView(context, parcelable);
+ snapshot = mListener.onCreateSnapshotView(context, parcelable);
}
if (snapshot != null) {
setSharedElementState(snapshot, name, state, null, null, decorLoc);
@@ -618,7 +621,7 @@
sharedElementBundle.putFloat(KEY_TRANSLATION_Z, view.getTranslationZ());
sharedElementBundle.putFloat(KEY_ELEVATION, view.getElevation());
- Parcelable bitmap = mListener.captureSharedElementSnapshot(view, tempMatrix, tempBounds);
+ Parcelable bitmap = mListener.onCaptureSharedElementSnapshot(view, tempMatrix, tempBounds);
if (bitmap != null) {
sharedElementBundle.putParcelable(KEY_SNAPSHOT, bitmap);
}
@@ -664,8 +667,7 @@
GhostView.addGhost(view, decor);
ViewGroup parent = (ViewGroup) view.getParent();
if (moveWithParent && !isInTransitionGroup(parent, decor)) {
- GhostViewListeners listener =
- new GhostViewListeners(view, decor);
+ GhostViewListeners listener = new GhostViewListeners(view, parent, decor);
parent.getViewTreeObserver().addOnPreDrawListener(listener);
mGhostViewListeners.add(listener);
}
@@ -723,11 +725,12 @@
}
protected void scheduleGhostVisibilityChange(final int visibility) {
- getDecor().getViewTreeObserver()
+ final View decorView = getDecor();
+ decorView.getViewTreeObserver()
.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
- getDecor().getViewTreeObserver().removeOnPreDrawListener(this);
+ decorView.getViewTreeObserver().removeOnPreDrawListener(this);
setGhostVisibility(visibility);
return true;
}
@@ -769,10 +772,12 @@
private static class GhostViewListeners implements ViewTreeObserver.OnPreDrawListener {
private View mView;
private ViewGroup mDecor;
+ private View mParent;
private Matrix mMatrix = new Matrix();
- public GhostViewListeners(View view, ViewGroup decor) {
+ public GhostViewListeners(View view, View parent, ViewGroup decor) {
mView = view;
+ mParent = parent;
mDecor = decor;
}
@@ -782,10 +787,9 @@
@Override
public boolean onPreDraw() {
- ViewGroup parent = ((ViewGroup) mView.getParent());
GhostView ghostView = GhostView.getGhost(mView);
if (ghostView == null) {
- parent.getViewTreeObserver().removeOnPreDrawListener(this);
+ mParent.getViewTreeObserver().removeOnPreDrawListener(this);
} else {
GhostView.calculateMatrix(mView, mDecor, mMatrix);
ghostView.setMatrix(mMatrix);
diff --git a/core/java/android/app/BackStackRecord.java b/core/java/android/app/BackStackRecord.java
index 59f010c..8227915 100644
--- a/core/java/android/app/BackStackRecord.java
+++ b/core/java/android/app/BackStackRecord.java
@@ -1128,11 +1128,11 @@
}
if (isBack) {
- outFragment.mEnterTransitionListener.remapSharedElements(
+ outFragment.mEnterTransitionCallback.onMapSharedElements(
mSharedElementTargetNames, namedViews);
setBackNameOverrides(state, namedViews, false);
} else {
- outFragment.mExitTransitionListener.remapSharedElements(
+ outFragment.mExitTransitionCallback.onMapSharedElements(
mSharedElementTargetNames, namedViews);
setNameOverrides(state, namedViews, false);
}
@@ -1248,14 +1248,14 @@
}
// Notify the start of the transition.
- SharedElementListener listener = isBack ?
- outFragment.mEnterTransitionListener :
- inFragment.mEnterTransitionListener;
+ SharedElementCallback callback = isBack ?
+ outFragment.mEnterTransitionCallback :
+ inFragment.mEnterTransitionCallback;
tempNames.clear();
tempNames.addAll(namedViews.keySet());
tempViewList.clear();
tempViewList.addAll(namedViews.values());
- listener.setSharedElementStart(tempNames, tempViewList, null);
+ callback.onSharedElementStart(tempNames, tempViewList, null);
// Set the epicenter of the exit transition
if (mSharedElementTargetNames != null && exitTransition != null) {
@@ -1337,11 +1337,11 @@
tempViews2, isBack);
// remap shared elements and set the name mapping used in the shared element transition.
if (isBack) {
- inFragment.mExitTransitionListener.remapSharedElements(
+ inFragment.mExitTransitionCallback.onMapSharedElements(
mSharedElementTargetNames, namedViews);
setBackNameOverrides(state, namedViews, true);
} else {
- inFragment.mEnterTransitionListener.remapSharedElements(
+ inFragment.mEnterTransitionCallback.onMapSharedElements(
mSharedElementTargetNames, namedViews);
setNameOverrides(state, namedViews, true);
}
@@ -1355,14 +1355,14 @@
}
int containerId = inFragments.keyAt(i);
- SharedElementListener sharedElementListener = isBack ?
- outFragments.get(containerId).mEnterTransitionListener :
- inFragment.mEnterTransitionListener;
+ SharedElementCallback sharedElementCallback = isBack ?
+ outFragments.get(containerId).mEnterTransitionCallback :
+ inFragment.mEnterTransitionCallback;
tempNames.clear();
tempNames.addAll(namedViews.keySet());
tempViews.clear();
tempViews.addAll(namedViews.values());
- sharedElementListener.setSharedElementEnd(tempNames, tempViews, null);
+ sharedElementCallback.onSharedElementEnd(tempNames, tempViews, null);
}
// Don't include any newly-hidden fragments in the transition.
diff --git a/core/java/android/app/EnterTransitionCoordinator.java b/core/java/android/app/EnterTransitionCoordinator.java
index 4126647..f432c49 100644
--- a/core/java/android/app/EnterTransitionCoordinator.java
+++ b/core/java/android/app/EnterTransitionCoordinator.java
@@ -21,8 +21,6 @@
import android.graphics.Matrix;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
-import android.os.Handler;
-import android.os.Message;
import android.os.ResultReceiver;
import android.text.TextUtils;
import android.transition.Transition;
@@ -71,12 +69,13 @@
Bundle resultReceiverBundle = new Bundle();
resultReceiverBundle.putParcelable(KEY_REMOTE_RECEIVER, this);
mResultReceiver.send(MSG_SET_REMOTE_RECEIVER, resultReceiverBundle);
- getDecor().getViewTreeObserver().addOnPreDrawListener(
+ final View decorView = getDecor();
+ decorView.getViewTreeObserver().addOnPreDrawListener(
new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
if (mIsReadyForTransition) {
- getDecor().getViewTreeObserver().removeOnPreDrawListener(this);
+ decorView.getViewTreeObserver().removeOnPreDrawListener(this);
}
return mIsReadyForTransition;
}
@@ -189,11 +188,12 @@
moveSharedElementsToOverlay();
mResultReceiver.send(MSG_SHARED_ELEMENT_DESTINATION, state);
} else {
- getDecor().getViewTreeObserver()
+ final View decorView = getDecor();
+ decorView.getViewTreeObserver()
.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
- getDecor().getViewTreeObserver().removeOnPreDrawListener(this);
+ decorView.getViewTreeObserver().removeOnPreDrawListener(this);
if (mResultReceiver != null) {
Bundle state = captureSharedElementState();
setSharedElementMatrices();
@@ -209,7 +209,7 @@
}
}
- private static SharedElementListener getListener(Activity activity, boolean isReturning) {
+ private static SharedElementCallback getListener(Activity activity, boolean isReturning) {
return isReturning ? activity.mExitTransitionListener : activity.mEnterTransitionListener;
}
@@ -294,7 +294,7 @@
ArrayList<String> rejectedNames = new ArrayList<String>(mAllSharedElementNames);
rejectedNames.removeAll(mSharedElementNames);
ArrayList<View> rejectedSnapshots = createSnapshots(sharedElementState, rejectedNames);
- mListener.handleRejectedSharedElements(rejectedSnapshots);
+ mListener.onRejectSharedElements(rejectedSnapshots);
startRejectedAnimations(rejectedSnapshots);
// Now start shared element transition
@@ -344,11 +344,12 @@
}
final Bundle sharedElementState = mSharedElementsBundle;
mSharedElementsBundle = null;
- getDecor().getViewTreeObserver()
+ final View decorView = getDecor();
+ decorView.getViewTreeObserver()
.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
- getDecor().getViewTreeObserver().removeOnPreDrawListener(this);
+ decorView.getViewTreeObserver().removeOnPreDrawListener(this);
startTransition(new Runnable() {
@Override
public void run() {
@@ -358,7 +359,7 @@
return false;
}
});
- getDecor().invalidate();
+ decorView.invalidate();
}
private void requestLayoutForSharedElements() {
diff --git a/core/java/android/app/ExitTransitionCoordinator.java b/core/java/android/app/ExitTransitionCoordinator.java
index 231c93f..a59a927 100644
--- a/core/java/android/app/ExitTransitionCoordinator.java
+++ b/core/java/android/app/ExitTransitionCoordinator.java
@@ -79,7 +79,7 @@
mActivity = activity;
}
- private static SharedElementListener getListener(Activity activity, boolean isReturning) {
+ private static SharedElementCallback getListener(Activity activity, boolean isReturning) {
return isReturning ? activity.mEnterTransitionListener : activity.mExitTransitionListener;
}
@@ -165,18 +165,19 @@
});
final ArrayList<View> sharedElementSnapshots = createSnapshots(mExitSharedElementBundle,
mSharedElementNames);
- getDecor().getViewTreeObserver()
+ final View decorView = getDecor();
+ decorView.getViewTreeObserver()
.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
- getDecor().getViewTreeObserver().removeOnPreDrawListener(this);
+ decorView.getViewTreeObserver().removeOnPreDrawListener(this);
setSharedElementState(mExitSharedElementBundle, sharedElementSnapshots);
return true;
}
});
setGhostVisibility(View.INVISIBLE);
scheduleGhostVisibilityChange(View.INVISIBLE);
- mListener.setSharedElementEnd(mSharedElementNames, mSharedElements, sharedElementSnapshots);
+ mListener.onSharedElementEnd(mSharedElementNames, mSharedElements, sharedElementSnapshots);
TransitionManager.beginDelayedTransition(getDecor(), transition);
scheduleGhostVisibilityChange(View.VISIBLE);
setGhostVisibility(View.VISIBLE);
diff --git a/core/java/android/app/Fragment.java b/core/java/android/app/Fragment.java
index dbee81e..672ef7b 100644
--- a/core/java/android/app/Fragment.java
+++ b/core/java/android/app/Fragment.java
@@ -495,8 +495,8 @@
private Boolean mAllowReturnTransitionOverlap;
private Boolean mAllowEnterTransitionOverlap;
- SharedElementListener mEnterTransitionListener = SharedElementListener.NULL_LISTENER;
- SharedElementListener mExitTransitionListener = SharedElementListener.NULL_LISTENER;
+ SharedElementCallback mEnterTransitionCallback = SharedElementCallback.NULL_CALLBACK;
+ SharedElementCallback mExitTransitionCallback = SharedElementCallback.NULL_CALLBACK;
/**
* State information that has been retrieved from a fragment instance
@@ -1621,31 +1621,31 @@
}
/**
- * When custom transitions are used with Fragments, the enter transition listener
+ * When custom transitions are used with Fragments, the enter transition callback
* is called when this Fragment is attached or detached when not popping the back stack.
*
- * @param listener Used to manipulate the shared element transitions on this Fragment
+ * @param callback Used to manipulate the shared element transitions on this Fragment
* when added not as a pop from the back stack.
*/
- public void setEnterSharedElementTransitionListener(SharedElementListener listener) {
- if (listener == null) {
- listener = SharedElementListener.NULL_LISTENER;
+ public void setEnterSharedElementTransitionCallback(SharedElementCallback callback) {
+ if (callback == null) {
+ callback = SharedElementCallback.NULL_CALLBACK;
}
- mEnterTransitionListener = listener;
+ mEnterTransitionCallback = callback;
}
/**
- * When custom transitions are used with Fragments, the exit transition listener
+ * When custom transitions are used with Fragments, the exit transition callback
* is called when this Fragment is attached or detached when popping the back stack.
*
- * @param listener Used to manipulate the shared element transitions on this Fragment
+ * @param callback Used to manipulate the shared element transitions on this Fragment
* when added as a pop from the back stack.
*/
- public void setExitSharedElementTransitionListener(SharedElementListener listener) {
- if (listener == null) {
- listener = SharedElementListener.NULL_LISTENER;
+ public void setExitSharedElementTransitionCallback(SharedElementCallback callback) {
+ if (callback == null) {
+ callback = SharedElementCallback.NULL_CALLBACK;
}
- mExitTransitionListener = listener;
+ mExitTransitionCallback = callback;
}
/**
diff --git a/core/java/android/app/INotificationManager.aidl b/core/java/android/app/INotificationManager.aidl
index bdcff38..7d4512b 100644
--- a/core/java/android/app/INotificationManager.aidl
+++ b/core/java/android/app/INotificationManager.aidl
@@ -71,6 +71,7 @@
ComponentName getEffectsSuppressor();
boolean matchesCallFilter(in Bundle extras);
+ boolean matchesCallFilterAsUser(in Bundle extras, int userId);
ZenModeConfig getZenModeConfig();
boolean setZenModeConfig(in ZenModeConfig config);
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java
index 5921477..f8dfdd9 100644
--- a/core/java/android/app/Notification.java
+++ b/core/java/android/app/Notification.java
@@ -21,6 +21,7 @@
import android.annotation.SdkConstant.SdkConstantType;
import android.content.Context;
import android.content.Intent;
+import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager.NameNotFoundException;
import android.graphics.Bitmap;
import android.graphics.Canvas;
@@ -824,13 +825,6 @@
public static final String EXTRA_COMPACT_ACTIONS = "android.compactActions";
/**
- * {@link #extras} key: the user that built the notification.
- *
- * @hide
- */
- public static final String EXTRA_ORIGINATING_USERID = "android.originatingUserId";
-
- /**
* Value for {@link #EXTRA_AS_HEADS_UP} that indicates this notification should not be
* displayed in the heads up space.
*
@@ -1813,10 +1807,12 @@
= "android.rebuild.hudViewActionCount";
/**
- * The package name of the context used to create the notification via a Builder.
+ * The ApplicationInfo of the package that created the notification, used to create
+ * a context to rebuild the notification via a Builder.
+ * @hide
*/
- private static final String EXTRA_REBUILD_CONTEXT_PACKAGE =
- "android.rebuild.contextPackage";
+ private static final String EXTRA_REBUILD_CONTEXT_APPLICATION_INFO =
+ "android.rebuild.applicationInfo";
// Whether to enable stripping (at post time) & rebuilding (at listener receive time) of
// memory intensive resources.
@@ -1867,11 +1863,6 @@
private int mColor = COLOR_DEFAULT;
/**
- * The user that built the notification originally.
- */
- private int mOriginatingUserId;
-
- /**
* Contains extras related to rebuilding during the build phase.
*/
private Bundle mRebuildBundle = new Bundle();
@@ -2591,7 +2582,7 @@
// Note: This assumes that the current user can read the profile badge of the
// originating user.
UserManager userManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
- return userManager.getBadgeForUser(new UserHandle(mOriginatingUserId), 0);
+ return userManager.getBadgeForUser(new UserHandle(mContext.getUserId()), 0);
}
private Bitmap getProfileBadge() {
@@ -2670,8 +2661,7 @@
* @param hasProgress whether the progress bar should be shown and set
*/
private RemoteViews applyStandardTemplate(int resId, boolean hasProgress) {
- RemoteViews contentView = new BuilderRemoteViews(mContext.getPackageName(),
- mOriginatingUserId, resId);
+ RemoteViews contentView = new BuilderRemoteViews(mContext.getApplicationInfo(), resId);
resetStandardTemplate(contentView);
@@ -3063,8 +3053,8 @@
*/
public void populateExtras(Bundle extras) {
// Store original information used in the construction of this object
- extras.putInt(EXTRA_ORIGINATING_USERID, mOriginatingUserId);
- extras.putString(EXTRA_REBUILD_CONTEXT_PACKAGE, mContext.getPackageName());
+ extras.putParcelable(EXTRA_REBUILD_CONTEXT_APPLICATION_INFO,
+ mContext.getApplicationInfo());
extras.putCharSequence(EXTRA_TITLE, mContentTitle);
extras.putCharSequence(EXTRA_TEXT, mContentText);
extras.putCharSequence(EXTRA_SUB_TEXT, mSubText);
@@ -3152,13 +3142,14 @@
extras.remove(EXTRA_NEEDS_REBUILD);
// Re-create notification context so we can access app resources.
- String packageName = extras.getString(EXTRA_REBUILD_CONTEXT_PACKAGE);
+ ApplicationInfo applicationInfo = extras.getParcelable(
+ EXTRA_REBUILD_CONTEXT_APPLICATION_INFO);
Context builderContext;
try {
- builderContext = context.createPackageContext(packageName,
+ builderContext = context.createApplicationContext(applicationInfo,
Context.CONTEXT_RESTRICTED);
} catch (NameNotFoundException e) {
- Log.e(TAG, "Package name " + packageName + " not found");
+ Log.e(TAG, "ApplicationInfo " + applicationInfo + " not found");
builderContext = context; // try with our context
}
@@ -3293,7 +3284,6 @@
// Extras.
Bundle extras = n.extras;
- mOriginatingUserId = extras.getInt(EXTRA_ORIGINATING_USERID);
mContentTitle = extras.getCharSequence(EXTRA_TITLE);
mContentText = extras.getCharSequence(EXTRA_TEXT);
mSubText = extras.getCharSequence(EXTRA_SUB_TEXT);
@@ -3326,7 +3316,6 @@
* object.
*/
public Notification build() {
- mOriginatingUserId = mContext.getUserId();
mHasThreeLines = hasThreeLines();
Notification n = buildUnstyled();
@@ -4826,8 +4815,8 @@
super(parcel);
}
- public BuilderRemoteViews(String packageName, int userId, int layoutId) {
- super(packageName, userId, layoutId);
+ public BuilderRemoteViews(ApplicationInfo appInfo, int layoutId) {
+ super(appInfo, layoutId);
}
@Override
diff --git a/core/java/android/app/SharedElementListener.java b/core/java/android/app/SharedElementCallback.java
similarity index 64%
rename from core/java/android/app/SharedElementListener.java
rename to core/java/android/app/SharedElementCallback.java
index f36d05f..82d8e5b 100644
--- a/core/java/android/app/SharedElementListener.java
+++ b/core/java/android/app/SharedElementCallback.java
@@ -22,7 +22,6 @@
import android.graphics.Matrix;
import android.graphics.RectF;
import android.graphics.drawable.BitmapDrawable;
-import android.graphics.drawable.ColorDrawable;
import android.os.Parcelable;
import android.view.View;
@@ -31,28 +30,23 @@
/**
* Listener provided in
- * {@link Activity#setEnterSharedElementListener(SharedElementListener)} and
- * {@link Activity#setExitSharedElementListener(SharedElementListener)}
- * to monitor the Activity transitions. The events can be used to customize Activity
- * Transition behavior.
+ * {@link Activity#setEnterSharedElementCallback(SharedElementCallback)} and
+ * {@link Activity#setExitSharedElementCallback(SharedElementCallback)} as well as
+ * {@link Fragment#setEnterSharedElementTransitionCallback(SharedElementCallback)} and
+ * {@link Fragment#setExitSharedElementTransitionCallback(SharedElementCallback)}
+ * to monitor the Shared element transitions. The events can be used to customize Activity
+ * and Fragment Transition behavior.
*/
-public abstract class SharedElementListener {
+public abstract class SharedElementCallback {
private Matrix mTempMatrix;
- static final SharedElementListener NULL_LISTENER = new SharedElementListener() {
+ static final SharedElementCallback NULL_CALLBACK = new SharedElementCallback() {
};
/**
- * Called to allow the listener to customize the start state of the shared element when
- * transferring in shared element state.
- * <p>
- * The shared element will start at the size and position of the shared element
- * in the launching Activity or Fragment. It will also transfer ImageView scaleType
- * and imageMatrix if the shared elements in the calling and called Activities are
- * ImageViews. Some applications may want to make additional changes, such as
- * changing the clip bounds, scaling, or rotation if the shared element end state
- * does not map well to the start state.
- * </p>
+ * Called immediately after the start state is set for the shared element.
+ * The shared element will start at the size and position of the shared element
+ * in the launching Activity or Fragment.
*
* @param sharedElementNames The names of the shared elements that were accepted into
* the View hierarchy.
@@ -60,20 +54,21 @@
* @param sharedElementSnapshots The Views containing snap shots of the shared element
* from the launching Window. These elements will not
* be part of the scene, but will be positioned relative
- * to the Window decor View.
+ * to the Window decor View. This list is null for Fragment
+ * Transitions.
*/
- public void setSharedElementStart(List<String> sharedElementNames,
+ public void onSharedElementStart(List<String> sharedElementNames,
List<View> sharedElements, List<View> sharedElementSnapshots) {}
/**
- * Called to allow the listener to customize the end state of the shared element when
- * transferring in shared element state.
+ * Called after the end state is set for the shared element, but before the end state
+ * is captured by the shared element transition.
* <p>
* Any customization done in
- * {@link #setSharedElementStart(java.util.List, java.util.List, java.util.List)}
+ * {@link #onSharedElementStart(java.util.List, java.util.List, java.util.List)}
* may need to be modified to the final state of the shared element if it is not
* automatically corrected by layout. For example, rotation or scale will not
- * be affected by layout and if changed in {@link #setSharedElementStart(java.util.List,
+ * be affected by layout and if changed in {@link #onSharedElementStart(java.util.List,
* java.util.List, java.util.List)}, it will also have to be set here again to correct
* the end state.
* </p>
@@ -84,24 +79,27 @@
* @param sharedElementSnapshots The Views containing snap shots of the shared element
* from the launching Window. These elements will not
* be part of the scene, but will be positioned relative
- * to the Window decor View.
+ * to the Window decor View. This list will be null for
+ * Fragment Transitions.
*/
- public void setSharedElementEnd(List<String> sharedElementNames,
+ public void onSharedElementEnd(List<String> sharedElementNames,
List<View> sharedElements, List<View> sharedElementSnapshots) {}
/**
- * Called after {@link #remapSharedElements(java.util.List, java.util.Map)} when
+ * Called after {@link #onMapSharedElements(java.util.List, java.util.Map)} when
* transferring shared elements in. Any shared elements that have no mapping will be in
* <var>rejectedSharedElements</var>. The elements remaining in
* <var>rejectedSharedElements</var> will be transitioned out of the Scene. If a
* View is removed from <var>rejectedSharedElements</var>, it must be handled by the
- * <code>SharedElementListener</code>.
+ * <code>SharedElementCallback</code>.
* <p>
* Views in rejectedSharedElements will have their position and size set to the
* position of the calling shared element, relative to the Window decor View and contain
* snapshots of the View from the calling Activity or Fragment. This
* view may be safely added to the decor View's overlay to remain in position.
* </p>
+ * <p>This method is not called for Fragment Transitions. All rejected shared elements
+ * will be handled by the exit transition.</p>
*
* @param rejectedSharedElements Views containing visual information of shared elements
* that are not part of the entering scene. These Views
@@ -109,25 +107,27 @@
* View removed from this list will not be transitioned
* automatically.
*/
- public void handleRejectedSharedElements(List<View> rejectedSharedElements) {}
+ public void onRejectSharedElements(List<View> rejectedSharedElements) {}
/**
- * Lets the ActivityTransitionListener adjust the mapping of shared element names to
+ * Lets the SharedElementCallback adjust the mapping of shared element names to
* Views.
*
* @param names The names of all shared elements transferred from the calling Activity
- * to the started Activity.
+ * or Fragment in the order they were provided.
* @param sharedElements The mapping of shared element names to Views. The best guess
* will be filled into sharedElements based on the transitionNames.
*/
- public void remapSharedElements(List<String> names, Map<String, View> sharedElements) {}
+ public void onMapSharedElements(List<String> names, Map<String, View> sharedElements) {}
/**
* Creates a snapshot of a shared element to be used by the remote Activity and reconstituted
- * with {@link #createSnapshotView(android.content.Context, android.os.Parcelable)}. A
+ * with {@link #onCreateSnapshotView(android.content.Context, android.os.Parcelable)}. A
* null return value will mean that the remote Activity will have a null snapshot View in
- * {@link #setSharedElementStart(java.util.List, java.util.List, java.util.List)} and
- * {@link #setSharedElementEnd(java.util.List, java.util.List, java.util.List)}.
+ * {@link #onSharedElementStart(java.util.List, java.util.List, java.util.List)} and
+ * {@link #onSharedElementEnd(java.util.List, java.util.List, java.util.List)}.
+ *
+ * <p>This is not called for Fragment Transitions.</p>
*
* @param sharedElement The shared element View to create a snapshot for.
* @param viewToGlobalMatrix A matrix containing a transform from the view to the screen
@@ -135,11 +135,11 @@
* @param screenBounds The bounds of shared element in screen coordinate space. This is
* the bounds of the view with the viewToGlobalMatrix applied.
* @return A snapshot to send to the remote Activity to be reconstituted with
- * {@link #createSnapshotView(android.content.Context, android.os.Parcelable)} and passed
- * into {@link #setSharedElementStart(java.util.List, java.util.List, java.util.List)} and
- * {@link #setSharedElementEnd(java.util.List, java.util.List, java.util.List)}.
+ * {@link #onCreateSnapshotView(android.content.Context, android.os.Parcelable)} and passed
+ * into {@link #onSharedElementStart(java.util.List, java.util.List, java.util.List)} and
+ * {@link #onSharedElementEnd(java.util.List, java.util.List, java.util.List)}.
*/
- public Parcelable captureSharedElementSnapshot(View sharedElement, Matrix viewToGlobalMatrix,
+ public Parcelable onCaptureSharedElementSnapshot(View sharedElement, Matrix viewToGlobalMatrix,
RectF screenBounds) {
int bitmapWidth = Math.round(screenBounds.width());
int bitmapHeight = Math.round(screenBounds.height());
@@ -160,20 +160,22 @@
/**
* Reconstitutes a snapshot View from a Parcelable returned in
- * {@link #captureSharedElementSnapshot(android.view.View, android.graphics.Matrix,
- * android.graphics.RectF)} to be used in {@link #setSharedElementStart(java.util.List,
- * java.util.List, java.util.List)} and {@link #setSharedElementEnd(java.util.List,
+ * {@link #onCaptureSharedElementSnapshot(android.view.View, android.graphics.Matrix,
+ * android.graphics.RectF)} to be used in {@link #onSharedElementStart(java.util.List,
+ * java.util.List, java.util.List)} and {@link #onSharedElementEnd(java.util.List,
* java.util.List, java.util.List)}. The returned View will be sized and positioned after
* this call so that it is ready to be added to the decor View's overlay.
*
+ * <p>This is not called for Fragment Transitions.</p>
+ *
* @param context The Context used to create the snapshot View.
- * @param snapshot The Parcelable returned by {@link #captureSharedElementSnapshot(
+ * @param snapshot The Parcelable returned by {@link #onCaptureSharedElementSnapshot(
* android.view.View, android.graphics.Matrix, android.graphics.RectF)}.
- * @return A View to be sent in {@link #setSharedElementStart(java.util.List, java.util.List,
- * java.util.List)} and {@link #setSharedElementEnd(java.util.List, java.util.List,
+ * @return A View to be sent in {@link #onSharedElementStart(java.util.List, java.util.List,
+ * java.util.List)} and {@link #onSharedElementEnd(java.util.List, java.util.List,
* java.util.List)}. A null value will produce a null snapshot value for those two methods.
*/
- public View createSnapshotView(Context context, Parcelable snapshot) {
+ public View onCreateSnapshotView(Context context, Parcelable snapshot) {
View view = null;
if (snapshot instanceof Bitmap) {
Bitmap bitmap = (Bitmap) snapshot;
diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java
index 668de62..112fc82 100644
--- a/core/java/android/app/admin/DevicePolicyManager.java
+++ b/core/java/android/app/admin/DevicePolicyManager.java
@@ -125,7 +125,7 @@
* during the managed profile provisioning.
*/
public static final String EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE =
- "android.app.extra.ADMIN_EXTRA_BUNDLE";
+ "android.app.extra.PROVISIONING_ADMIN_EXTRAS_BUNDLE";
/**
* A String extra holding the package name of the mobile device management application that
@@ -148,7 +148,7 @@
* <p>Use with {@link #ACTION_PROVISION_MANAGED_PROFILE}
*/
public static final String EXTRA_PROVISIONING_DEFAULT_MANAGED_PROFILE_NAME
- = "android.app.extra.DEFAULT_MANAGED_PROFILE_NAME";
+ = "android.app.extra.PROVISIONING_DEFAULT_MANAGED_PROFILE_NAME";
/**
* A bundle key, used in the bundle extra {@link #EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE}. The
@@ -156,7 +156,7 @@
* created for.
*/
public static final String KEY_PROVISIONING_EMAIL_ADDRESS
- = "android.app.key.ManagedProfileEmailAddress";
+ = "android.app.key.PROVISIONING_EMAIL_ADDRESS";
/**
* A String extra holding the time zone {@link android.app.AlarmManager} that the device
@@ -166,7 +166,7 @@
* provisioning via an Nfc bump.
*/
public static final String EXTRA_PROVISIONING_TIME_ZONE
- = "android.app.extra.TIME_ZONE";
+ = "android.app.extra.PROVISIONING_TIME_ZONE";
/**
* A Long extra holding the wall clock time (in milliseconds) to be set on the device's
@@ -176,7 +176,7 @@
* provisioning via an Nfc bump.
*/
public static final String EXTRA_PROVISIONING_LOCAL_TIME
- = "android.app.extra.LOCAL_TIME";
+ = "android.app.extra.PROVISIONING_LOCAL_TIME";
/**
* A String extra holding the {@link java.util.Locale} that the device will be set to.
@@ -186,7 +186,7 @@
* provisioning via an Nfc bump.
*/
public static final String EXTRA_PROVISIONING_LOCALE
- = "android.app.extra.LOCALE";
+ = "android.app.extra.PROVISIONING_LOCALE";
/**
* A String extra holding the ssid of the wifi network that should be used during nfc device
@@ -196,7 +196,7 @@
* provisioning via an Nfc bump.
*/
public static final String EXTRA_PROVISIONING_WIFI_SSID
- = "android.app.extra.WIFI_SSID";
+ = "android.app.extra.PROVISIONING_WIFI_SSID";
/**
* A boolean extra indicating whether the wifi network in {@link #EXTRA_PROVISIONING_WIFI_SSID}
@@ -206,7 +206,7 @@
* provisioning via an Nfc bump.
*/
public static final String EXTRA_PROVISIONING_WIFI_HIDDEN
- = "android.app.extra.WIFI_HIDDEN";
+ = "android.app.extra.PROVISIONING_WIFI_HIDDEN";
/**
* A String extra indicating the security type of the wifi network in
@@ -216,7 +216,7 @@
* provisioning via an Nfc bump.
*/
public static final String EXTRA_PROVISIONING_WIFI_SECURITY_TYPE
- = "android.app.extra.WIFI_SECURITY_TYPE";
+ = "android.app.extra.PROVISIONING_WIFI_SECURITY_TYPE";
/**
* A String extra holding the password of the wifi network in
@@ -226,7 +226,7 @@
* provisioning via an Nfc bump.
*/
public static final String EXTRA_PROVISIONING_WIFI_PASSWORD
- = "android.app.extra.WIFI_PASSWORD";
+ = "android.app.extra.PROVISIONING_WIFI_PASSWORD";
/**
* A String extra holding the proxy host for the wifi network in
@@ -236,7 +236,7 @@
* provisioning via an Nfc bump.
*/
public static final String EXTRA_PROVISIONING_WIFI_PROXY_HOST
- = "android.app.extra.WIFI_PROXY_HOST";
+ = "android.app.extra.PROVISIONING_WIFI_PROXY_HOST";
/**
* An int extra holding the proxy port for the wifi network in
@@ -246,7 +246,7 @@
* provisioning via an Nfc bump.
*/
public static final String EXTRA_PROVISIONING_WIFI_PROXY_PORT
- = "android.app.extra.WIFI_PROXY_PORT";
+ = "android.app.extra.PROVISIONING_WIFI_PROXY_PORT";
/**
* A String extra holding the proxy bypass for the wifi network in
@@ -256,7 +256,7 @@
* provisioning via an Nfc bump.
*/
public static final String EXTRA_PROVISIONING_WIFI_PROXY_BYPASS
- = "android.app.extra.WIFI_PROXY_BYPASS_HOSTS";
+ = "android.app.extra.PROVISIONING_WIFI_PROXY_BYPASS";
/**
* A String extra holding the proxy auto-config (PAC) URL for the wifi network in
@@ -266,7 +266,7 @@
* provisioning via an Nfc bump.
*/
public static final String EXTRA_PROVISIONING_WIFI_PAC_URL
- = "android.app.extra.WIFI_PAC_URL";
+ = "android.app.extra.PROVISIONING_WIFI_PAC_URL";
/**
* A String extra holding a url that specifies the download location of the device admin
@@ -276,7 +276,7 @@
* provisioning via an Nfc bump.
*/
public static final String EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION
- = "android.app.extra.DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION";
+ = "android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION";
/**
* A String extra holding a http cookie header which should be used in the http request to the
@@ -286,7 +286,7 @@
* provisioning via an Nfc bump.
*/
public static final String EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_COOKIE_HEADER
- = "android.app.extra.DEVICE_ADMIN_PACKAGE_DOWNLOAD_COOKIE_HEADER";
+ = "android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_COOKIE_HEADER";
/**
* A String extra holding the SHA-1 checksum of the file at download location specified in
@@ -298,7 +298,7 @@
* provisioning via an Nfc bump.
*/
public static final String EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM
- = "android.app.extra.DEVICE_ADMIN_PACKAGE_CHECKSUM";
+ = "android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM";
/**
* This MIME type is used for starting the Device Owner provisioning.
diff --git a/core/java/android/appwidget/AppWidgetManager.java b/core/java/android/appwidget/AppWidgetManager.java
index bd45c7e..00248cc 100644
--- a/core/java/android/appwidget/AppWidgetManager.java
+++ b/core/java/android/appwidget/AppWidgetManager.java
@@ -188,7 +188,7 @@
* this widget. Can have the value {@link
* AppWidgetProviderInfo#WIDGET_CATEGORY_HOME_SCREEN} or {@link
* AppWidgetProviderInfo#WIDGET_CATEGORY_KEYGUARD} or {@link
- * AppWidgetProviderInfo#WIDGET_CATEGORY_RECENTS}.
+ * AppWidgetProviderInfo#WIDGET_CATEGORY_SEARCHBOX}.
*/
public static final String OPTION_APPWIDGET_HOST_CATEGORY = "appWidgetCategory";
diff --git a/core/java/android/appwidget/AppWidgetProviderInfo.java b/core/java/android/appwidget/AppWidgetProviderInfo.java
index 02f70c8..b4d79b4 100644
--- a/core/java/android/appwidget/AppWidgetProviderInfo.java
+++ b/core/java/android/appwidget/AppWidgetProviderInfo.java
@@ -61,9 +61,9 @@
public static final int WIDGET_CATEGORY_KEYGUARD = 2;
/**
- * Indicates that the widget can be displayed within recents.
+ * Indicates that the widget can be displayed within a space reserved for the search box.
*/
- public static final int WIDGET_CATEGORY_RECENTS = 4;
+ public static final int WIDGET_CATEGORY_SEARCHBOX = 4;
/**
* Identity of this AppWidget component. This component should be a {@link
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index b825c94..51a58d1 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -3363,7 +3363,7 @@
* profiles - {@link #ACTION_MANAGED_PROFILE_ADDED} and {@link #ACTION_MANAGED_PROFILE_REMOVED}.
*/
public static final String EXTRA_USER =
- "android.intent.extra.user";
+ "android.intent.extra.USER";
/**
* Extra used in the response from a BroadcastReceiver that handles
diff --git a/core/java/android/service/voice/AlwaysOnHotwordDetector.java b/core/java/android/service/voice/AlwaysOnHotwordDetector.java
index 519bc28..4de5f41 100644
--- a/core/java/android/service/voice/AlwaysOnHotwordDetector.java
+++ b/core/java/android/service/voice/AlwaysOnHotwordDetector.java
@@ -450,7 +450,7 @@
* This intent must be invoked using {@link Activity#startActivityForResult(Intent, int)}.
* Starting re-enrollment is only valid if the keyphrase is un-enrolled,
* i.e. {@link #STATE_KEYPHRASE_UNENROLLED},
- * otherwise {@link #createIntentToReEnroll()} should be preferred.
+ * otherwise {@link #createReEnrollIntent()} should be preferred.
*
* @return An {@link Intent} to start enrollment for the given keyphrase.
* @throws UnsupportedOperationException if managing they keyphrase isn't supported.
@@ -460,6 +460,19 @@
* This may happen if another detector has been instantiated or the
* {@link VoiceInteractionService} hosting this detector has been shut down.
*/
+ public Intent createEnrollIntent() {
+ if (DBG) Slog.d(TAG, "createEnrollIntent");
+ synchronized (mLock) {
+ return getManageIntentLocked(MANAGE_ACTION_ENROLL);
+ }
+ }
+
+ /**
+ * FIXME: Remove once the prebuilts are updated.
+ *
+ * @hide
+ */
+ @Deprecated
public Intent createIntentToEnroll() {
if (DBG) Slog.d(TAG, "createIntentToEnroll");
synchronized (mLock) {
@@ -481,6 +494,19 @@
* This may happen if another detector has been instantiated or the
* {@link VoiceInteractionService} hosting this detector has been shut down.
*/
+ public Intent createUnEnrollIntent() {
+ if (DBG) Slog.d(TAG, "createUnEnrollIntent");
+ synchronized (mLock) {
+ return getManageIntentLocked(MANAGE_ACTION_UN_ENROLL);
+ }
+ }
+
+ /**
+ * FIXME: Remove once the prebuilts are updated.
+ *
+ * @hide
+ */
+ @Deprecated
public Intent createIntentToUnEnroll() {
if (DBG) Slog.d(TAG, "createIntentToUnEnroll");
synchronized (mLock) {
@@ -502,6 +528,19 @@
* This may happen if another detector has been instantiated or the
* {@link VoiceInteractionService} hosting this detector has been shut down.
*/
+ public Intent createReEnrollIntent() {
+ if (DBG) Slog.d(TAG, "createReEnrollIntent");
+ synchronized (mLock) {
+ return getManageIntentLocked(MANAGE_ACTION_RE_ENROLL);
+ }
+ }
+
+ /**
+ * FIXME: Remove once the prebuilts are updated.
+ *
+ * @hide
+ */
+ @Deprecated
public Intent createIntentToReEnroll() {
if (DBG) Slog.d(TAG, "createIntentToReEnroll");
synchronized (mLock) {
diff --git a/core/java/android/webkit/WebResourceRequest.java b/core/java/android/webkit/WebResourceRequest.java
index dc7c808..b46ac9a 100644
--- a/core/java/android/webkit/WebResourceRequest.java
+++ b/core/java/android/webkit/WebResourceRequest.java
@@ -41,7 +41,7 @@
boolean isForMainFrame();
/**
- * Gets whether a gesture was associated with the request.
+ * Gets whether a gesture (such as a link click) was associated with the request.
* <p>
* <strong>IMPORTANT:</strong>
* This should not be used to implement any form of security. It is possible for the content
@@ -49,6 +49,11 @@
*
* @return whether a gesture was associated with the request.
*/
+ boolean hasGesture();
+
+ /*
+ * @removed
+ */
boolean hasUserGestureInsecure();
/**
diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java
index edfa7af..081bfdf 100644
--- a/core/java/android/webkit/WebView.java
+++ b/core/java/android/webkit/WebView.java
@@ -1939,16 +1939,14 @@
*
* @param zoomFactor the zoom factor to apply. The zoom factor will be clamped to the Webview's
* zoom limits. This value must be in the range 0.01 to 100.0 inclusive.
- *
- * @return false if no zoom changes, true otherwise.
*/
- public boolean zoomBy(float zoomFactor) {
+ public void zoomBy(float zoomFactor) {
checkThread();
if (zoomFactor < 0.01)
throw new IllegalArgumentException("zoomFactor must be greater than 0.01.");
if (zoomFactor > 100.0)
throw new IllegalArgumentException("zoomFactor must be less than 100.");
- return mProvider.zoomBy(zoomFactor);
+ mProvider.zoomBy(zoomFactor);
}
/**
diff --git a/core/java/android/widget/RemoteViews.java b/core/java/android/widget/RemoteViews.java
index 69d5f40..90e9c69 100644
--- a/core/java/android/widget/RemoteViews.java
+++ b/core/java/android/widget/RemoteViews.java
@@ -22,11 +22,13 @@
import android.app.PendingIntent;
import android.appwidget.AppWidgetHostView;
import android.content.Context;
+import android.content.ContextWrapper;
import android.content.Intent;
import android.content.IntentSender;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.res.Configuration;
+import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.PorterDuff;
import android.graphics.Rect;
@@ -1653,8 +1655,10 @@
*
* @param application The application whose content is shown by the views.
* @param layoutId The id of the layout resource.
+ *
+ * @hide
*/
- private RemoteViews(ApplicationInfo application, int layoutId) {
+ protected RemoteViews(ApplicationInfo application, int layoutId) {
mApplication = application;
mLayoutId = layoutId;
mBitmapCache = new BitmapCache();
@@ -2515,15 +2519,29 @@
RemoteViews rvToApply = getRemoteViewsToApply(context);
View result;
-
- Context c = prepareContext(context);
+ // RemoteViews may be built by an application installed in another
+ // user. So build a context that loads resources from that user but
+ // still returns the current users userId so settings like data / time formats
+ // are loaded without requiring cross user persmissions.
+ final Context contextForResources = getContextForResources(context);
+ Context inflationContext = new ContextWrapper(context) {
+ @Override
+ public Resources getResources() {
+ return contextForResources.getResources();
+ }
+ @Override
+ public Resources.Theme getTheme() {
+ return contextForResources.getTheme();
+ }
+ };
LayoutInflater inflater = (LayoutInflater)
- c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+ context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- inflater = inflater.cloneInContext(c);
+ // Clone inflater so we load resources from correct context and
+ // we don't add a filter to the static version returned by getSystemService.
+ inflater = inflater.cloneInContext(inflationContext);
inflater.setFilter(this);
-
result = inflater.inflate(rvToApply.getLayoutId(), parent, false);
rvToApply.performApply(result, parent, handler);
@@ -2557,7 +2575,6 @@
}
}
- prepareContext(context);
rvToApply.performApply(v, (ViewGroup) v.getParent(), handler);
}
@@ -2572,7 +2589,7 @@
}
}
- private Context prepareContext(Context context) {
+ private Context getContextForResources(Context context) {
if (mApplication != null) {
if (context.getUserId() == UserHandle.getUserId(mApplication.uid)
&& context.getPackageName().equals(mApplication.packageName)) {
diff --git a/core/java/com/android/internal/os/Zygote.java b/core/java/com/android/internal/os/Zygote.java
index 54c532a..c5211bb 100644
--- a/core/java/com/android/internal/os/Zygote.java
+++ b/core/java/com/android/internal/os/Zygote.java
@@ -20,9 +20,12 @@
import dalvik.system.ZygoteHooks;
import android.system.ErrnoException;
import android.system.Os;
+import android.os.SystemClock;
+import android.util.Slog;
/** @hide */
public final class Zygote {
+ private static final String TAG = "Zygote";
/*
* Bit values for "debugFlags" argument. The definitions are duplicated
* in the native code.
@@ -81,10 +84,14 @@
*/
public static int forkAndSpecialize(int uid, int gid, int[] gids, int debugFlags,
int[][] rlimits, int mountExternal, String seInfo, String niceName, int[] fdsToClose) {
+ long startTime = SystemClock.elapsedRealtime();
VM_HOOKS.preFork();
+ checkTime(startTime, "Zygote.preFork");
int pid = nativeForkAndSpecialize(
uid, gid, gids, debugFlags, rlimits, mountExternal, seInfo, niceName, fdsToClose);
+ checkTime(startTime, "Zygote.nativeForkAndSpecialize");
VM_HOOKS.postForkCommon();
+ checkTime(startTime, "Zygote.postForkCommon");
return pid;
}
@@ -92,6 +99,18 @@
int[][] rlimits, int mountExternal, String seInfo, String niceName, int[] fdsToClose);
/**
+ * Temporary hack: check time since start time and log if over a fixed threshold.
+ *
+ */
+ private static void checkTime(long startTime, String where) {
+ long now = SystemClock.elapsedRealtime();
+ if ((now-startTime) > 1000) {
+ // If we are taking more than a second, log about it.
+ Slog.w(TAG, "Slow operation: " + (now-startTime) + "ms so far, now at " + where);
+ }
+ }
+
+ /**
* Special method to start the system server process. In addition to the
* common actions performed in forkAndSpecialize, the pid of the child
* process is recorded such that the death of the child process will cause
@@ -127,7 +146,9 @@
int[][] rlimits, long permittedCapabilities, long effectiveCapabilities);
private static void callPostForkChildHooks(int debugFlags) {
+ long startTime = SystemClock.elapsedRealtime();
VM_HOOKS.postForkChild(debugFlags);
+ checkTime(startTime, "Zygote.callPostForkChildHooks");
}
diff --git a/core/java/com/android/internal/os/ZygoteConnection.java b/core/java/com/android/internal/os/ZygoteConnection.java
index 43ebb3d..b4c4da6 100644
--- a/core/java/com/android/internal/os/ZygoteConnection.java
+++ b/core/java/com/android/internal/os/ZygoteConnection.java
@@ -37,6 +37,8 @@
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import libcore.io.IoUtils;
+import android.os.SystemClock;
+import android.util.Slog;
/**
* A connection that can make spawn requests.
@@ -103,11 +105,23 @@
}
/**
+ * Temporary hack: check time since start time and log if over a fixed threshold.
+ *
+ */
+ private void checkTime(long startTime, String where) {
+ long now = SystemClock.elapsedRealtime();
+ if ((now-startTime) > 1000) {
+ // If we are taking more than a second, log about it.
+ Slog.w(TAG, "Slow operation: " + (now-startTime) + "ms so far, now at " + where);
+ }
+ }
+
+ /**
* Returns the file descriptor of the associated socket.
*
* @return null-ok; file descriptor
*/
- FileDescriptor getFileDesciptor() {
+ FileDescriptor getFileDescriptor() {
return mSocket.getFileDescriptor();
}
@@ -131,6 +145,8 @@
Arguments parsedArgs = null;
FileDescriptor[] descriptors;
+ long startTime = SystemClock.elapsedRealtime();
+
try {
args = readArgumentList();
descriptors = mSocket.getAncillaryFileDescriptors();
@@ -140,6 +156,7 @@
return true;
}
+ checkTime(startTime, "zygoteConnection.runOnce: readArgumentList");
if (args == null) {
// EOF reached.
closeSocket();
@@ -171,14 +188,19 @@
", effective=0x" + Long.toHexString(parsedArgs.effectiveCapabilities));
}
+
applyUidSecurityPolicy(parsedArgs, peer, peerSecurityContext);
applyRlimitSecurityPolicy(parsedArgs, peer, peerSecurityContext);
applyInvokeWithSecurityPolicy(parsedArgs, peer, peerSecurityContext);
applyseInfoSecurityPolicy(parsedArgs, peer, peerSecurityContext);
+ checkTime(startTime, "zygoteConnection.runOnce: apply security policies");
+
applyDebuggerSystemProperty(parsedArgs);
applyInvokeWithSystemProperty(parsedArgs);
+ checkTime(startTime, "zygoteConnection.runOnce: apply security policies");
+
int[][] rlimits = null;
if (parsedArgs.rlimits != null) {
@@ -220,9 +242,11 @@
fd = null;
+ checkTime(startTime, "zygoteConnection.runOnce: preForkAndSpecialize");
pid = Zygote.forkAndSpecialize(parsedArgs.uid, parsedArgs.gid, parsedArgs.gids,
parsedArgs.debugFlags, rlimits, parsedArgs.mountExternal, parsedArgs.seInfo,
parsedArgs.niceName, fdsToClose);
+ checkTime(startTime, "zygoteConnection.runOnce: postForkAndSpecialize");
} catch (IOException ex) {
logAndPrintError(newStderr, "Exception creating pipe", ex);
} catch (ErrnoException ex) {
diff --git a/core/java/com/android/internal/os/ZygoteInit.java b/core/java/com/android/internal/os/ZygoteInit.java
index 051de6e..0aee0e3 100644
--- a/core/java/com/android/internal/os/ZygoteInit.java
+++ b/core/java/com/android/internal/os/ZygoteInit.java
@@ -770,7 +770,7 @@
} else if (index == 0) {
ZygoteConnection newPeer = acceptCommandPeer(abiList);
peers.add(newPeer);
- fds.add(newPeer.getFileDesciptor());
+ fds.add(newPeer.getFileDescriptor());
} else {
boolean done;
done = peers.get(index).runOnce();
diff --git a/core/jni/com_android_internal_os_Zygote.cpp b/core/jni/com_android_internal_os_Zygote.cpp
index 1f7acec..3d2d471 100644
--- a/core/jni/com_android_internal_os_Zygote.cpp
+++ b/core/jni/com_android_internal_os_Zygote.cpp
@@ -43,6 +43,7 @@
#include <utils/String8.h>
#include <selinux/android.h>
#include <processgroup/processgroup.h>
+#include <inttypes.h>
#include "android_runtime/AndroidRuntime.h"
#include "JNIHelp.h"
@@ -398,6 +399,22 @@
}
}
+ // Temporary timing check.
+uint64_t MsTime() {
+ timespec now;
+ clock_gettime(CLOCK_MONOTONIC, &now);
+ return static_cast<uint64_t>(now.tv_sec) * UINT64_C(1000) + now.tv_nsec / UINT64_C(1000000);
+}
+
+
+void ckTime(uint64_t start, const char* where) {
+ uint64_t now = MsTime();
+ if ((now-start) > 1000) {
+ // If we are taking more than a second, log about it.
+ ALOGW("Slow operation: %"PRIu64" ms in %s", (uint64_t)(now-start), where);
+ }
+}
+
// Utility routine to fork zygote and specialize the child process.
static pid_t ForkAndSpecializeCommon(JNIEnv* env, uid_t uid, gid_t gid, jintArray javaGids,
jint debug_flags, jobjectArray javaRlimits,
@@ -405,7 +422,9 @@
jint mount_external,
jstring java_se_info, jstring java_se_name,
bool is_system_server, jintArray fdsToClose) {
+ uint64_t start = MsTime();
SetSigChldHandler();
+ ckTime(start, "ForkAndSpecializeCommon:SetSigChldHandler");
pid_t pid = fork();
@@ -413,9 +432,12 @@
// The child process.
gMallocLeakZygoteChild = 1;
+
// Clean up any descriptors which must be closed immediately
DetachDescriptors(env, fdsToClose);
+ ckTime(start, "ForkAndSpecializeCommon:Fork and detach");
+
// Keep capabilities across UID change, unless we're staying root.
if (uid != 0) {
EnableKeepCapabilities(env);
@@ -518,7 +540,10 @@
UnsetSigChldHandler();
+ ckTime(start, "ForkAndSpecializeCommon:child process setup");
+
env->CallStaticVoidMethod(gZygoteClass, gCallPostForkChildHooks, debug_flags);
+ ckTime(start, "ForkAndSpecializeCommon:PostForkChildHooks returns");
if (env->ExceptionCheck()) {
ALOGE("Error calling post fork hooks.");
RuntimeAbort(env);
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index 603fcde..3629cbb 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -6600,12 +6600,12 @@
<flag name="vertical" value="0x2" />
</attr>
<!-- Optional parameter which indicates where this widget can be shown,
- ie. home screen, keyguard, recents or any combination thereof.
+ ie. home screen, keyguard, search bar or any combination thereof.
Supports combined values using | operator. -->
<attr name="widgetCategory" format="integer">
<flag name="home_screen" value="0x1" />
<flag name="keyguard" value="0x2" />
- <flag name="recents" value="0x4" />
+ <flag name="searchbox" value="0x4" />
</attr>
</declare-styleable>
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index d68d12a..b63b91d 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -374,7 +374,7 @@
<bool name="config_useAttentionLight">false</bool>
<!-- If this is true, the screen will fade off. -->
- <bool name="config_animateScreenLights">true</bool>
+ <bool name="config_animateScreenLights">false</bool>
<!-- If this is true, key chords can be used to take a screenshot on the device. -->
<bool name="config_enableScreenshotChord">true</bool>
diff --git a/packages/SystemUI/res/layout/status_bar_notification_keyguard_overflow.xml b/packages/SystemUI/res/layout/status_bar_notification_keyguard_overflow.xml
index 351177b..ef85847 100644
--- a/packages/SystemUI/res/layout/status_bar_notification_keyguard_overflow.xml
+++ b/packages/SystemUI/res/layout/status_bar_notification_keyguard_overflow.xml
@@ -64,9 +64,4 @@
/>
</LinearLayout>
- <com.android.systemui.statusbar.NotificationScrimView
- android:id="@+id/scrim_view"
- android:layout_width="match_parent"
- android:layout_height="match_parent" />
-
</com.android.systemui.statusbar.NotificationOverflowContainer>
diff --git a/packages/SystemUI/res/layout/status_bar_notification_row.xml b/packages/SystemUI/res/layout/status_bar_notification_row.xml
index ef4e27c..6b829e5 100644
--- a/packages/SystemUI/res/layout/status_bar_notification_row.xml
+++ b/packages/SystemUI/res/layout/status_bar_notification_row.xml
@@ -59,9 +59,4 @@
android:layout_height="match_parent"
/>
- <com.android.systemui.statusbar.NotificationScrimView
- android:id="@+id/scrim_view"
- android:layout_width="match_parent"
- android:layout_height="match_parent" />
-
</com.android.systemui.statusbar.ExpandableNotificationRow>
diff --git a/packages/SystemUI/res/layout/super_status_bar.xml b/packages/SystemUI/res/layout/super_status_bar.xml
index 09e541f..29fec41 100644
--- a/packages/SystemUI/res/layout/super_status_bar.xml
+++ b/packages/SystemUI/res/layout/super_status_bar.xml
@@ -26,24 +26,6 @@
android:fitsSystemWindows="true"
android:descendantFocusability="afterDescendants">
- <FrameLayout android:id="@+id/brightness_mirror"
- android:layout_width="@dimen/notification_panel_width"
- android:layout_height="wrap_content"
- android:layout_gravity="@integer/notification_panel_layout_gravity"
- android:paddingLeft="@dimen/notification_side_padding"
- android:paddingRight="@dimen/notification_side_padding"
- android:visibility="gone">
- <FrameLayout
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:elevation="2dp"
- android:background="@drawable/brightness_mirror_background">
- <include layout="@layout/quick_settings_brightness_dialog"
- android:layout_width="match_parent"
- android:layout_height="wrap_content" />
- </FrameLayout>
- </FrameLayout>
-
<com.android.systemui.statusbar.AlphaOptimizedFrameLayout
android:id="@+id/backdrop"
android:layout_width="match_parent"
@@ -69,6 +51,24 @@
android:layout_width="match_parent"
android:layout_height="@dimen/status_bar_height" />
+ <FrameLayout android:id="@+id/brightness_mirror"
+ android:layout_width="@dimen/notification_panel_width"
+ android:layout_height="wrap_content"
+ android:layout_gravity="@integer/notification_panel_layout_gravity"
+ android:paddingLeft="@dimen/notification_side_padding"
+ android:paddingRight="@dimen/notification_side_padding"
+ android:visibility="gone">
+ <FrameLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:elevation="2dp"
+ android:background="@drawable/brightness_mirror_background">
+ <include layout="@layout/quick_settings_brightness_dialog"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content" />
+ </FrameLayout>
+ </FrameLayout>
+
<com.android.systemui.statusbar.phone.PanelHolder
android:id="@+id/panel_holder"
android:layout_width="match_parent"
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index c7a91af..23d9748 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -756,6 +756,9 @@
<!-- Accessibility label for the button that opens the user switcher. -->
<string name="accessibility_multi_user_switch_switcher">Switch user</string>
+ <!-- Accessibility label for the button that opens the user switcher and announces the current user. -->
+ <string name="accessibility_multi_user_switch_switcher_with_current">Switch user, current user <xliff:g id="current_user_name" example="John Doe">%s</xliff:g></string>
+
<!-- Accessibility label for the button that opens the quick contact of the user. -->
<string name="accessibility_multi_user_switch_quick_contact">Show profile</string>
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
index f8d0d9e..8d35eb0 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
@@ -1142,7 +1142,6 @@
}
handleHide();
- sendUserPresentBroadcast();
}
private void sendUserPresentBroadcast() {
@@ -1313,6 +1312,7 @@
mHideAnimationRun = false;
updateActivityLockScreenState();
adjustStatusBarLocked();
+ sendUserPresentBroadcast();
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java
index 082dde6..ec7799a 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java
@@ -296,7 +296,7 @@
mSearchAppWidgetInfo);
Bundle opts = new Bundle();
opts.putInt(AppWidgetManager.OPTION_APPWIDGET_HOST_CATEGORY,
- AppWidgetProviderInfo.WIDGET_CATEGORY_RECENTS);
+ AppWidgetProviderInfo.WIDGET_CATEGORY_SEARCHBOX);
mSearchAppWidgetHostView.updateAppWidgetOptions(opts);
// Set the padding to 0 for this search widget
mSearchAppWidgetHostView.setPadding(0, 0, 0, 0);
diff --git a/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java b/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java
index e27c0ac..78fc4fb 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java
@@ -392,7 +392,7 @@
// Find the first Recents widget from the same package as the global assist activity
List<AppWidgetProviderInfo> widgets = mAwm.getInstalledProviders(
- AppWidgetProviderInfo.WIDGET_CATEGORY_RECENTS);
+ AppWidgetProviderInfo.WIDGET_CATEGORY_SEARCHBOX);
for (AppWidgetProviderInfo info : widgets) {
if (info.provider.getPackageName().equals(mAssistComponent.getPackageName())) {
return info;
@@ -418,7 +418,7 @@
int searchWidgetId = host.allocateAppWidgetId();
Bundle opts = new Bundle();
opts.putInt(AppWidgetManager.OPTION_APPWIDGET_HOST_CATEGORY,
- AppWidgetProviderInfo.WIDGET_CATEGORY_RECENTS);
+ AppWidgetProviderInfo.WIDGET_CATEGORY_SEARCHBOX);
if (!mAwm.bindAppWidgetIdIfAllowed(searchWidgetId, searchWidgetInfo.provider, opts)) {
return null;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java b/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java
index e6984b2..c869ba4 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java
@@ -121,7 +121,6 @@
private NotificationBackgroundView mBackgroundNormal;
private NotificationBackgroundView mBackgroundDimmed;
- private NotificationScrimView mScrimView;
private ObjectAnimator mBackgroundAnimator;
private RectF mAppearAnimationRect = new RectF();
private PorterDuffColorFilter mAppearAnimationFilter;
@@ -173,8 +172,6 @@
mBackgroundDimmed.setCustomBackground(R.drawable.notification_material_bg_dim);
updateBackground();
updateBackgroundTint();
- mScrimView = (NotificationScrimView) findViewById(R.id.scrim_view);
- setScrimAmount(0);
}
private final Runnable mTapTimeoutRunnable = new Runnable() {
@@ -465,7 +462,6 @@
setPivotY(actualHeight / 2);
mBackgroundNormal.setActualHeight(actualHeight);
mBackgroundDimmed.setActualHeight(actualHeight);
- mScrimView.setActualHeight(actualHeight);
}
@Override
@@ -473,7 +469,6 @@
super.setClipTopAmount(clipTopAmount);
mBackgroundNormal.setClipTopAmount(clipTopAmount);
mBackgroundDimmed.setClipTopAmount(clipTopAmount);
- mScrimView.setClipTopAmount(clipTopAmount);
}
@Override
@@ -496,11 +491,6 @@
}
}
- @Override
- public void setScrimAmount(float scrimAmount) {
- mScrimView.setAlpha(scrimAmount);
- }
-
private void startAppearAnimation(boolean isAppearing, float translationDirection, long delay,
long duration, final Runnable onFinishedRunnable) {
if (mAppearAnimator != null) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
index 2c1d70d..e5ca488 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
@@ -558,6 +558,8 @@
// disable lockscreen notifications until user acts on the banner.
Settings.Secure.putInt(mContext.getContentResolver(),
Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS, 0);
+ Settings.Secure.putInt(mContext.getContentResolver(),
+ Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS, 0);
final String packageName = mContext.getPackageName();
PendingIntent cancelIntent = PendingIntent.getBroadcast(mContext, 0,
@@ -1623,10 +1625,11 @@
}
}
boolean showOnKeyguard = shouldShowOnKeyguard(entry.notification);
- if (onKeyguard && (visibleNotifications >= maxKeyguardNotifications
- || !showOnKeyguard)) {
+ if ((isLockscreenPublicMode() && !showOnKeyguard) ||
+ (onKeyguard && (visibleNotifications >= maxKeyguardNotifications
+ || !showOnKeyguard))) {
entry.row.setVisibility(View.GONE);
- if (showOnKeyguard) {
+ if (onKeyguard && showOnKeyguard) {
mKeyguardIconOverflowContainer.getIconsView().addNotification(entry);
}
} else {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
index e3a0b18..c13593a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
@@ -147,6 +147,7 @@
mMaxExpandHeight = 0;
mWasReset = true;
onHeightReset();
+ requestLayout();
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java
index 2838747..c8f756e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java
@@ -255,8 +255,6 @@
public abstract void performAddAnimation(long delay, long duration);
- public abstract void setScrimAmount(float scrimAmount);
-
public void setBelowSpeedBump(boolean below) {
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationScrimView.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationScrimView.java
deleted file mode 100644
index 440b2c1..0000000
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationScrimView.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.android.systemui.statusbar;
-
-import android.content.Context;
-import android.graphics.Canvas;
-import android.graphics.PorterDuff;
-import android.graphics.drawable.Drawable;
-import android.util.AttributeSet;
-import android.view.View;
-
-import com.android.keyguard.R;
-
-/**
- * A view that can be used for both the dimmed and normal background of an notification.
- */
-public class NotificationScrimView extends View {
-
- private Drawable mBackground;
- private int mClipTopAmount;
- private int mActualHeight;
-
- public NotificationScrimView(Context context, AttributeSet attrs) {
- super(context, attrs);
- mBackground = getResources().getDrawable(R.drawable.notification_scrim);
- }
-
- @Override
- protected void onDraw(Canvas canvas) {
- draw(canvas, mBackground);
- }
-
- private void draw(Canvas canvas, Drawable drawable) {
- if (drawable != null) {
- drawable.setBounds(0, mClipTopAmount, getWidth(), mActualHeight);
- drawable.draw(canvas);
- }
- }
-
- @Override
- protected boolean verifyDrawable(Drawable who) {
- return super.verifyDrawable(who) || who == mBackground;
- }
-
- public void setActualHeight(int actualHeight) {
- mActualHeight = actualHeight;
- invalidate();
- }
-
- public int getActualHeight() {
- return mActualHeight;
- }
-
- public void setClipTopAmount(int clipTopAmount) {
- mClipTopAmount = clipTopAmount;
- invalidate();
- }
-
- @Override
- public boolean hasOverlappingRendering() {
-
- // Prevents this view from creating a layer when alpha is animating.
- return false;
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/SpeedBumpView.java b/packages/SystemUI/src/com/android/systemui/statusbar/SpeedBumpView.java
index 816612b..1fc8744 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/SpeedBumpView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/SpeedBumpView.java
@@ -126,9 +126,4 @@
// TODO: Use duration
performVisibilityAnimation(true, delay);
}
-
- @Override
- public void setScrimAmount(float scrimAmount) {
- // We don't need to scrim the speedbumps
- }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StackScrollerDecorView.java b/packages/SystemUI/src/com/android/systemui/statusbar/StackScrollerDecorView.java
index 62a492e..c620046 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/StackScrollerDecorView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/StackScrollerDecorView.java
@@ -127,11 +127,6 @@
}
@Override
- public void setScrimAmount(float scrimAmount) {
- // We don't need to scrim the dismissView
- }
-
- @Override
public boolean hasOverlappingRendering() {
return false;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/MultiUserSwitch.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/MultiUserSwitch.java
index d7144da..dc49118 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/MultiUserSwitch.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/MultiUserSwitch.java
@@ -30,6 +30,7 @@
import com.android.systemui.R;
import com.android.systemui.qs.QSPanel;
import com.android.systemui.statusbar.policy.KeyguardUserSwitcher;
+import com.android.systemui.statusbar.policy.UserSwitcherController;
/**
* Container for image of the multi user switcher (tappable).
@@ -90,9 +91,21 @@
if (isClickable()) {
final UserManager um = UserManager.get(getContext());
- String text = mContext.getString(um.isUserSwitcherEnabled()
- ? R.string.accessibility_multi_user_switch_switcher
- : R.string.accessibility_multi_user_switch_quick_contact);
+ String text;
+ if (um.isUserSwitcherEnabled()) {
+ UserSwitcherController controller = mQsPanel.getHost()
+ .getUserSwitcherController();
+ String currentUser = controller.getCurrentUserName(mContext);
+ if (TextUtils.isEmpty(currentUser)) {
+ text = mContext.getString(R.string.accessibility_multi_user_switch_switcher);
+ } else {
+ text = mContext.getString(
+ R.string.accessibility_multi_user_switch_switcher_with_current,
+ currentUser);
+ }
+ } else {
+ text = mContext.getString(R.string.accessibility_multi_user_switch_quick_contact);
+ }
if (!TextUtils.isEmpty(text)) {
event.getText().add(text);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
index bae1864..f467e27 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
@@ -1047,7 +1047,6 @@
int startDistance = mQsMinExpansionHeight + mNotificationScrimWaitDistance;
float progress = (height - startDistance) / (mQsMaxExpansionHeight - startDistance);
progress = Math.max(0.0f, Math.min(progress, 1.0f));
- mNotificationStackScroller.setScrimAlpha(progress);
}
private float getHeaderExpansionFraction() {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
index ddd03d6..271371a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -1559,8 +1559,9 @@
}
}
- for (View remove : toRemove) {
- mNotificationIcons.removeView(remove);
+ final int toRemoveCount = toRemove.size();
+ for (int i = 0; i < toRemoveCount; i++) {
+ mNotificationIcons.removeView(toRemove.get(i));
}
for (int i=0; i<toShow.size(); i++) {
@@ -1569,6 +1570,18 @@
mNotificationIcons.addView(v, i, params);
}
}
+
+ // Resort notification icons
+ final int childCount = mNotificationIcons.getChildCount();
+ for (int i = 0; i < childCount; i++) {
+ View actual = mNotificationIcons.getChildAt(i);
+ StatusBarIconView expected = toShow.get(i);
+ if (actual == expected) {
+ continue;
+ }
+ mNotificationIcons.removeView(expected);
+ mNotificationIcons.addView(expected, i);
+ }
}
@Override
@@ -3774,7 +3787,9 @@
row = (ExpandableNotificationRow) expandView;
row.setUserExpanded(true);
}
- if (isLockscreenPublicMode() && !userAllowsPrivateNotificationsInPublic(mCurrentUserId)) {
+ boolean fullShadeNeedsBouncer = !userAllowsPrivateNotificationsInPublic(mCurrentUserId)
+ || !mShowLockscreenNotifications;
+ if (isLockscreenPublicMode() && fullShadeNeedsBouncer) {
mLeaveOpenOnKeyguardHide = true;
showBouncer();
mDraggedDownRow = row;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java
index e4b1945..52fa621 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java
@@ -334,6 +334,14 @@
}
}
+ public String getCurrentUserName(Context context) {
+ if (mUsers.isEmpty()) return null;
+ UserRecord item = mUsers.get(0);
+ if (item == null || item.info == null) return null;
+ if (item.isGuest) return context.getString(R.string.guest_nickname);
+ return item.info.name;
+ }
+
public static abstract class BaseUserAdapter extends BaseAdapter {
final UserSwitcherController mController;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/AmbientState.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/AmbientState.java
index ddb5cb8..8e677f1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/AmbientState.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/AmbientState.java
@@ -32,7 +32,6 @@
private float mOverScrollTopAmount;
private float mOverScrollBottomAmount;
private int mSpeedBumpIndex = -1;
- private float mScrimAmount;
private boolean mDark;
private boolean mHideSensitive;
@@ -105,14 +104,6 @@
}
}
- public void setScrimAmount(float scrimAmount) {
- mScrimAmount = scrimAmount;
- }
-
- public float getScrimAmount() {
- return mScrimAmount;
- }
-
public float getOverScrollAmount(boolean top) {
return top ? mOverScrollTopAmount : mOverScrollBottomAmount;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java
index fed579c..6f477ef 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java
@@ -2094,13 +2094,6 @@
return true;
}
- public void setScrimAlpha(float progress) {
- if (progress != mAmbientState.getScrimAmount()) {
- mAmbientState.setScrimAmount(progress);
- requestChildrenUpdate();
- }
- }
-
/**
* See {@link AmbientState#setDark}.
*/
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java
index fe855d9..7c4c0e8 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java
@@ -172,7 +172,6 @@
handleDraggedViews(ambientState, resultState, algorithmState);
updateDimmedActivatedHideSensitive(ambientState, resultState, algorithmState);
updateClipping(resultState, algorithmState);
- updateScrimAmount(resultState, algorithmState, ambientState.getScrimAmount());
updateSpeedBumpState(resultState, algorithmState, ambientState.getSpeedBumpIndex());
}
@@ -189,16 +188,6 @@
}
}
- private void updateScrimAmount(StackScrollState resultState,
- StackScrollAlgorithmState algorithmState, float scrimAmount) {
- int childCount = algorithmState.visibleChildren.size();
- for (int i = 0; i < childCount; i++) {
- View child = algorithmState.visibleChildren.get(i);
- StackScrollState.ViewState childViewState = resultState.getViewStateForView(child);
- childViewState.scrimAmount = scrimAmount;
- }
- }
-
private void updateClipping(StackScrollState resultState,
StackScrollAlgorithmState algorithmState) {
float previousNotificationEnd = 0;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollState.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollState.java
index f7a2824..0967ecd 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollState.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollState.java
@@ -165,9 +165,6 @@
// apply speed bump state
child.setBelowSpeedBump(state.belowSpeedBump);
- // apply scrimming
- child.setScrimAmount(state.scrimAmount);
-
// apply clipping
float oldClipTopAmount = child.getClipTopAmount();
if (oldClipTopAmount != state.clipTopAmount) {
@@ -252,12 +249,6 @@
boolean belowSpeedBump;
/**
- * A value between 0 and 1 indicating how much the view should be scrimmed.
- * 1 means that the notifications will be darkened as much as possible.
- */
- float scrimAmount;
-
- /**
* The amount which the view should be clipped from the top. This is calculated to
* perceive consistent shadows.
*/
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java
index 58d5813..ece82a1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java
@@ -251,9 +251,6 @@
child.setHideSensitive(viewState.hideSensitive, mAnimationFilter.animateHideSensitive &&
!wasAdded && !noAnimation, delay, duration);
- // apply scrimming
- child.setScrimAmount(viewState.scrimAmount);
-
if (wasAdded) {
child.performAddAnimation(delay, mCurrentLength);
}
diff --git a/services/core/java/com/android/server/notification/ConditionProviders.java b/services/core/java/com/android/server/notification/ConditionProviders.java
index 189131c..05ad1fe 100644
--- a/services/core/java/com/android/server/notification/ConditionProviders.java
+++ b/services/core/java/com/android/server/notification/ConditionProviders.java
@@ -545,8 +545,9 @@
setZenModeCondition(condition, "downtime");
}
// exit downtime
- if (!inDowntime && mode == Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS
- && mDowntime.isDowntimeCondition(mExitCondition)) {
+ if (!inDowntime && mDowntime.isDowntimeCondition(mExitCondition)
+ && (mode == Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS
+ || mode == Global.ZEN_MODE_NO_INTERRUPTIONS)) {
mZenModeHelper.setZenMode(Global.ZEN_MODE_OFF, "downtimeExit");
}
}
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index 0794edf..bc538ed 100644
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -1470,7 +1470,14 @@
@Override
public boolean matchesCallFilter(Bundle extras) {
enforceSystemOrSystemUI("INotificationManager.matchesCallFilter");
- return mZenModeHelper.matchesCallFilter(extras,
+ return matchesCallFilterAsUser(extras, Binder.getCallingUid());
+ }
+
+ @Override
+ public boolean matchesCallFilterAsUser(Bundle extras, int userId) {
+ enforceSystemOrSystemUI("INotificationManager.matchesCallFilter");
+ UserHandle userHandle = new UserHandle(userId);
+ return mZenModeHelper.matchesCallFilter(userHandle, extras,
mRankingHelper.findExtractor(ValidateNotificationPeople.class));
}
};
@@ -2636,7 +2643,10 @@
visibilityOverrides.putInt(record.sbn.getKey(),
record.getPackageVisibilityOverride());
}
+ // Find first min-prio notification for speedbump placement.
if (speedBumpIndex == -1 &&
+ // Intrusiveness trumps priority, hence ignore intrusives.
+ !record.isRecentlyIntrusive() &&
record.sbn.getNotification().priority == Notification.PRIORITY_MIN) {
speedBumpIndex = keys.size() - 1;
}
diff --git a/services/core/java/com/android/server/notification/NotificationRecord.java b/services/core/java/com/android/server/notification/NotificationRecord.java
index 84b4d97..fd34aa5 100644
--- a/services/core/java/com/android/server/notification/NotificationRecord.java
+++ b/services/core/java/com/android/server/notification/NotificationRecord.java
@@ -21,6 +21,7 @@
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.media.AudioAttributes;
+import android.os.UserHandle;
import android.service.notification.StatusBarNotification;
import com.android.internal.annotations.VisibleForTesting;
@@ -88,8 +89,10 @@
public Notification getNotification() { return sbn.getNotification(); }
public int getFlags() { return sbn.getNotification().flags; }
- public int getUserId() { return sbn.getUserId(); }
+ public UserHandle getUser() { return sbn.getUser(); }
public String getKey() { return sbn.getKey(); }
+ /** @deprecated Use {@link #getUser()} instead. */
+ public int getUserId() { return sbn.getUserId(); }
void dump(PrintWriter pw, String prefix, Context baseContext) {
final Notification notification = sbn.getNotification();
diff --git a/services/core/java/com/android/server/notification/ValidateNotificationPeople.java b/services/core/java/com/android/server/notification/ValidateNotificationPeople.java
index aa47858..f266916 100644
--- a/services/core/java/com/android/server/notification/ValidateNotificationPeople.java
+++ b/services/core/java/com/android/server/notification/ValidateNotificationPeople.java
@@ -18,18 +18,23 @@
import android.app.Notification;
import android.content.Context;
+import android.content.pm.PackageManager;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
+import android.os.UserHandle;
import android.provider.ContactsContract;
import android.provider.ContactsContract.Contacts;
import android.provider.Settings;
import android.text.TextUtils;
+import android.util.ArrayMap;
+import android.util.Log;
import android.util.LruCache;
import android.util.Slog;
import java.util.ArrayList;
import java.util.LinkedList;
+import java.util.Map;
/**
* This {@link NotificationSignalExtractor} attempts to validate
@@ -65,21 +70,88 @@
static final float STARRED_CONTACT = 1f;
protected boolean mEnabled;
- private Context mContext;
+ private Context mBaseContext;
// maps raw person handle to resolved person object
private LruCache<String, LookupResult> mPeopleCache;
+ private Map<Integer, Context> mUserToContextMap;
- private RankingReconsideration validatePeople(final NotificationRecord record) {
+ public void initialize(Context context) {
+ if (DEBUG) Slog.d(TAG, "Initializing " + getClass().getSimpleName() + ".");
+ mUserToContextMap = new ArrayMap<>();
+ mBaseContext = context;
+ mPeopleCache = new LruCache<String, LookupResult>(PEOPLE_CACHE_SIZE);
+ mEnabled = ENABLE_PEOPLE_VALIDATOR && 1 == Settings.Global.getInt(
+ mBaseContext.getContentResolver(), SETTING_ENABLE_PEOPLE_VALIDATOR, 1);
+ }
+
+ public RankingReconsideration process(NotificationRecord record) {
+ if (!mEnabled) {
+ if (INFO) Slog.i(TAG, "disabled");
+ return null;
+ }
+ if (record == null || record.getNotification() == null) {
+ if (INFO) Slog.i(TAG, "skipping empty notification");
+ return null;
+ }
+ if (record.getUserId() == UserHandle.USER_ALL) {
+ if (INFO) Slog.i(TAG, "skipping global notification");
+ return null;
+ }
+ Context context = getContextAsUser(record.getUser());
+ if (context == null) {
+ if (INFO) Slog.i(TAG, "skipping notification that lacks a context");
+ return null;
+ }
+ return validatePeople(context, record);
+ }
+
+ @Override
+ public void setConfig(RankingConfig config) {
+ // ignore: config has no relevant information yet.
+ }
+
+ public float getContactAffinity(UserHandle userHandle, Bundle extras) {
+ if (extras == null) return NONE;
+ final String key = Long.toString(System.nanoTime());
+ final float[] affinityOut = new float[1];
+ Context context = getContextAsUser(userHandle);
+ if (context == null) {
+ return NONE;
+ }
+ final PeopleRankingReconsideration prr = validatePeople(context, key, extras, affinityOut);
+ float affinity = affinityOut[0];
+ if (prr != null) {
+ prr.work();
+ affinity = Math.max(prr.getContactAffinity(), affinity);
+ }
+ return affinity;
+ }
+
+ private Context getContextAsUser(UserHandle userHandle) {
+ Context context = mUserToContextMap.get(userHandle.getIdentifier());
+ if (context == null) {
+ try {
+ context = mBaseContext.createPackageContextAsUser("android", 0, userHandle);
+ mUserToContextMap.put(userHandle.getIdentifier(), context);
+ } catch (PackageManager.NameNotFoundException e) {
+ Log.e(TAG, "failed to create package context for lookups", e);
+ }
+ }
+ return context;
+ }
+
+ private RankingReconsideration validatePeople(Context context,
+ final NotificationRecord record) {
final String key = record.getKey();
final Bundle extras = record.getNotification().extras;
final float[] affinityOut = new float[1];
- final RankingReconsideration rr = validatePeople(key, extras, affinityOut);
+ final RankingReconsideration rr = validatePeople(context, key, extras, affinityOut);
record.setContactAffinity(affinityOut[0]);
return rr;
}
- private PeopleRankingReconsideration validatePeople(String key, Bundle extras,
+ private PeopleRankingReconsideration validatePeople(Context context, String key, Bundle extras,
float[] affinityOut) {
float affinity = NONE;
if (extras == null) {
@@ -98,7 +170,8 @@
if (TextUtils.isEmpty(handle)) continue;
synchronized (mPeopleCache) {
- LookupResult lookupResult = mPeopleCache.get(handle);
+ final String cacheKey = getCacheKey(context.getUserId(), handle);
+ LookupResult lookupResult = mPeopleCache.get(cacheKey);
if (lookupResult == null || lookupResult.isExpired()) {
pendingLookups.add(handle);
} else {
@@ -119,7 +192,11 @@
}
if (DEBUG) Slog.d(TAG, "Pending: future work scheduled for: " + key);
- return new PeopleRankingReconsideration(key, pendingLookups);
+ return new PeopleRankingReconsideration(context, key, pendingLookups);
+ }
+
+ private String getCacheKey(int userId, String handle) {
+ return Integer.toString(userId) + ":" + handle;
}
// VisibleForTesting
@@ -185,24 +262,24 @@
return null;
}
- private LookupResult resolvePhoneContact(final String number) {
+ private LookupResult resolvePhoneContact(Context context, final String number) {
Uri phoneUri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI,
Uri.encode(number));
- return searchContacts(phoneUri);
+ return searchContacts(context, phoneUri);
}
- private LookupResult resolveEmailContact(final String email) {
+ private LookupResult resolveEmailContact(Context context, final String email) {
Uri numberUri = Uri.withAppendedPath(
ContactsContract.CommonDataKinds.Email.CONTENT_LOOKUP_URI,
Uri.encode(email));
- return searchContacts(numberUri);
+ return searchContacts(context, numberUri);
}
- private LookupResult searchContacts(Uri lookupUri) {
+ private LookupResult searchContacts(Context context, Uri lookupUri) {
LookupResult lookupResult = new LookupResult();
Cursor c = null;
try {
- c = mContext.getContentResolver().query(lookupUri, LOOKUP_PROJECTION, null, null, null);
+ c = context.getContentResolver().query(lookupUri, LOOKUP_PROJECTION, null, null, null);
if (c != null && c.getCount() > 0) {
c.moveToFirst();
lookupResult.readContact(c);
@@ -217,44 +294,6 @@
return lookupResult;
}
- public void initialize(Context context) {
- if (DEBUG) Slog.d(TAG, "Initializing " + getClass().getSimpleName() + ".");
- mContext = context;
- mPeopleCache = new LruCache<String, LookupResult>(PEOPLE_CACHE_SIZE);
- mEnabled = ENABLE_PEOPLE_VALIDATOR && 1 == Settings.Global.getInt(
- mContext.getContentResolver(), SETTING_ENABLE_PEOPLE_VALIDATOR, 1);
- }
-
- public RankingReconsideration process(NotificationRecord record) {
- if (!mEnabled) {
- if (INFO) Slog.i(TAG, "disabled");
- return null;
- }
- if (record == null || record.getNotification() == null) {
- if (INFO) Slog.i(TAG, "skipping empty notification");
- return null;
- }
- return validatePeople(record);
- }
-
- @Override
- public void setConfig(RankingConfig config) {
- // ignore: config has no relevant information yet.
- }
-
- public float getContactAffinity(Bundle extras) {
- if (extras == null) return NONE;
- final String key = Long.toString(System.nanoTime());
- final float[] affinityOut = new float[1];
- final PeopleRankingReconsideration prr = validatePeople(key, extras, affinityOut);
- float affinity = affinityOut[0];
- if (prr != null) {
- prr.work();
- affinity = Math.max(prr.getContactAffinity(), affinity);
- }
- return affinity;
- }
-
private static class LookupResult {
private static final long CONTACT_REFRESH_MILLIS = 60 * 60 * 1000; // 1hr
public static final int INVALID_ID = -1;
@@ -317,11 +356,13 @@
private class PeopleRankingReconsideration extends RankingReconsideration {
private final LinkedList<String> mPendingLookups;
+ private final Context mContext;
private float mContactAffinity = NONE;
- private PeopleRankingReconsideration(String key, LinkedList<String> pendingLookups) {
+ private PeopleRankingReconsideration(Context context, String key, LinkedList<String> pendingLookups) {
super(key);
+ mContext = context;
mPendingLookups = pendingLookups;
}
@@ -333,20 +374,21 @@
final Uri uri = Uri.parse(handle);
if ("tel".equals(uri.getScheme())) {
if (DEBUG) Slog.d(TAG, "checking telephone URI: " + handle);
- lookupResult = resolvePhoneContact(uri.getSchemeSpecificPart());
+ lookupResult = resolvePhoneContact(mContext, uri.getSchemeSpecificPart());
} else if ("mailto".equals(uri.getScheme())) {
if (DEBUG) Slog.d(TAG, "checking mailto URI: " + handle);
- lookupResult = resolveEmailContact(uri.getSchemeSpecificPart());
+ lookupResult = resolveEmailContact(mContext, uri.getSchemeSpecificPart());
} else if (handle.startsWith(Contacts.CONTENT_LOOKUP_URI.toString())) {
if (DEBUG) Slog.d(TAG, "checking lookup URI: " + handle);
- lookupResult = searchContacts(uri);
+ lookupResult = searchContacts(mContext, uri);
} else {
lookupResult = new LookupResult(); // invalid person for the cache
Slog.w(TAG, "unsupported URI " + handle);
}
if (lookupResult != null) {
synchronized (mPeopleCache) {
- mPeopleCache.put(handle, lookupResult);
+ final String cacheKey = getCacheKey(mContext.getUserId(), handle);
+ mPeopleCache.put(cacheKey, lookupResult);
}
mContactAffinity = Math.max(mContactAffinity, lookupResult.getAffinity());
}
diff --git a/services/core/java/com/android/server/notification/ZenModeHelper.java b/services/core/java/com/android/server/notification/ZenModeHelper.java
index fd35ede..168328f 100644
--- a/services/core/java/com/android/server/notification/ZenModeHelper.java
+++ b/services/core/java/com/android/server/notification/ZenModeHelper.java
@@ -373,13 +373,14 @@
return record.isCategory(Notification.CATEGORY_MESSAGE) || isDefaultMessagingApp(record);
}
- public boolean matchesCallFilter(Bundle extras, ValidateNotificationPeople validator) {
+ public boolean matchesCallFilter(UserHandle userHandle, Bundle extras,
+ ValidateNotificationPeople validator) {
final int zen = mZenMode;
if (zen == Global.ZEN_MODE_NO_INTERRUPTIONS) return false; // nothing gets through
if (zen == Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS) {
if (!mConfig.allowCalls) return false; // no calls get through
if (validator != null) {
- final float contactAffinity = validator.getContactAffinity(extras);
+ final float contactAffinity = validator.getContactAffinity(userHandle, extras);
return audienceMatches(contactAffinity);
}
}
diff --git a/telecomm/java/android/telecomm/TelecommManager.java b/telecomm/java/android/telecomm/TelecommManager.java
index 5486be1..d5a06f5 100644
--- a/telecomm/java/android/telecomm/TelecommManager.java
+++ b/telecomm/java/android/telecomm/TelecommManager.java
@@ -390,6 +390,17 @@
}
/**
+ * Returns the current connection manager. Apps must be prepared for this method to return
+ * {@code null}, indicating that there currently exists no user-chosen default
+ * {@code PhoneAccount}.
+ *
+ * @return The phone account handle of the current connection manager.
+ */
+ public PhoneAccountHandle getConnectionManager() {
+ return getSimCallManager();
+ }
+
+ /**
* Returns a list of {@link PhoneAccountHandle}s which can be used to make and receive phone
* calls which support the specified URI scheme.
* <P>
@@ -724,4 +735,4 @@
}
return isConnected;
}
-}
\ No newline at end of file
+}
diff --git a/telephony/java/android/telephony/IccOpenLogicalChannelResponse.java b/telephony/java/android/telephony/IccOpenLogicalChannelResponse.java
index dbe38ea..4621f91 100644
--- a/telephony/java/android/telephony/IccOpenLogicalChannelResponse.java
+++ b/telephony/java/android/telephony/IccOpenLogicalChannelResponse.java
@@ -27,7 +27,7 @@
/**
* Indicates an invalid channel.
*/
- public static int INVALID_CHANNEL = -1;
+ public static final int INVALID_CHANNEL = -1;
/**
* Possible status values returned by open channel command.
@@ -37,10 +37,10 @@
* STATUS_NO_SUCH_ELEMENT: AID not found on UICC.
* STATUS_UNKNOWN_ERROR: Unknown error in open channel command.
*/
- public static int STATUS_NO_ERROR = 1;
- public static int STATUS_MISSING_RESOURCE = 2;
- public static int STATUS_NO_SUCH_ELEMENT = 3;
- public static int STATUS_UNKNOWN_ERROR = 4;
+ public static final int STATUS_NO_ERROR = 1;
+ public static final int STATUS_MISSING_RESOURCE = 2;
+ public static final int STATUS_NO_SUCH_ELEMENT = 3;
+ public static final int STATUS_UNKNOWN_ERROR = 4;
private final int mChannel;
private final int mStatus;
diff --git a/tests/VoiceInteraction/src/com/android/test/voiceinteraction/MainInteractionService.java b/tests/VoiceInteraction/src/com/android/test/voiceinteraction/MainInteractionService.java
index 1f01461..4639114 100644
--- a/tests/VoiceInteraction/src/com/android/test/voiceinteraction/MainInteractionService.java
+++ b/tests/VoiceInteraction/src/com/android/test/voiceinteraction/MainInteractionService.java
@@ -92,7 +92,7 @@
break;
case AlwaysOnHotwordDetector.STATE_KEYPHRASE_UNENROLLED:
Log.i(TAG, "STATE_KEYPHRASE_UNENROLLED");
- Intent enroll = mHotwordDetector.createIntentToEnroll();
+ Intent enroll = mHotwordDetector.createEnrollIntent();
Log.i(TAG, "Need to enroll with " + enroll);
break;
case AlwaysOnHotwordDetector.STATE_KEYPHRASE_ENROLLED: