diff options
Diffstat (limited to 'core/java/android/app')
-rw-r--r-- | core/java/android/app/Activity.java | 29 | ||||
-rw-r--r-- | core/java/android/app/ApplicationPackageManager.java | 3 | ||||
-rw-r--r-- | core/java/android/app/Fragment.java | 5 | ||||
-rw-r--r-- | core/java/android/app/FragmentController.java | 1 | ||||
-rw-r--r-- | core/java/android/app/FragmentHostCallback.java | 11 | ||||
-rw-r--r-- | core/java/android/app/FragmentManager.java | 12 | ||||
-rw-r--r-- | core/java/android/app/Notification.java | 7 | ||||
-rw-r--r-- | core/java/android/app/usage/UsageStatsManagerInternal.java | 3 |
8 files changed, 52 insertions, 19 deletions
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java index 2cb3f39..ecd0050 100644 --- a/core/java/android/app/Activity.java +++ b/core/java/android/app/Activity.java @@ -689,6 +689,8 @@ public class Activity extends ContextThemeWrapper private static final String SAVED_DIALOGS_TAG = "android:savedDialogs"; private static final String SAVED_DIALOG_KEY_PREFIX = "android:dialog_"; private static final String SAVED_DIALOG_ARGS_KEY_PREFIX = "android:dialog_args_"; + private static final String HAS_CURENT_PERMISSIONS_REQUEST_KEY = + "android:hasCurrentPermissionsRequest"; private static final String REQUEST_PERMISSIONS_WHO_PREFIX = "@android:requestPermissions:"; @@ -797,6 +799,8 @@ public class Activity extends ContextThemeWrapper SharedElementCallback mEnterTransitionListener = SharedElementCallback.NULL_CALLBACK; SharedElementCallback mExitTransitionListener = SharedElementCallback.NULL_CALLBACK; + private boolean mHasCurrentPermissionsRequest; + /** Return the intent that started this activity. */ public Intent getIntent() { return mIntent; @@ -1298,6 +1302,7 @@ public class Activity extends ContextThemeWrapper onSaveInstanceState(outState); saveManagedDialogs(outState); mActivityTransitionState.saveState(outState); + storeHasCurrentPermissionRequest(outState); if (DEBUG_LIFECYCLE) Slog.v(TAG, "onSaveInstanceState " + this + ": " + outState); } @@ -1313,6 +1318,7 @@ public class Activity extends ContextThemeWrapper final void performSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) { onSaveInstanceState(outState, outPersistentState); saveManagedDialogs(outState); + storeHasCurrentPermissionRequest(outState); if (DEBUG_LIFECYCLE) Slog.v(TAG, "onSaveInstanceState " + this + ": " + outState + ", " + outPersistentState); } @@ -3811,8 +3817,15 @@ public class Activity extends ContextThemeWrapper * @see #shouldShowRequestPermissionRationale(String) */ public final void requestPermissions(@NonNull String[] permissions, int requestCode) { + if (mHasCurrentPermissionsRequest) { + Log.w(TAG, "Can reqeust only one set of permissions at a time"); + // Dispatch the callback with empty arrays which means a cancellation. + onRequestPermissionsResult(requestCode, new String[0], new int[0]); + return; + } Intent intent = getPackageManager().buildRequestPermissionsIntent(permissions); startActivityForResult(REQUEST_PERMISSIONS_WHO_PREFIX, intent, requestCode, null); + mHasCurrentPermissionsRequest = true; } /** @@ -6234,12 +6247,14 @@ public class Activity extends ContextThemeWrapper } final void performCreate(Bundle icicle) { + restoreHasCurrentPermissionRequest(icicle); onCreate(icicle); mActivityTransitionState.readState(icicle); performCreateCommon(); } final void performCreate(Bundle icicle, PersistableBundle persistentState) { + restoreHasCurrentPermissionRequest(icicle); onCreate(icicle, persistentState); mActivityTransitionState.readState(icicle); performCreateCommon(); @@ -6418,6 +6433,19 @@ public class Activity extends ContextThemeWrapper return mResumed; } + private void storeHasCurrentPermissionRequest(Bundle bundle) { + if (bundle != null && mHasCurrentPermissionsRequest) { + bundle.putBoolean(HAS_CURENT_PERMISSIONS_REQUEST_KEY, true); + } + } + + private void restoreHasCurrentPermissionRequest(Bundle bundle) { + if (bundle != null) { + mHasCurrentPermissionsRequest = bundle.getBoolean( + HAS_CURENT_PERMISSIONS_REQUEST_KEY, false); + } + } + void dispatchActivityResult(String who, int requestCode, int resultCode, Intent data) { if (false) Log.v( @@ -6545,6 +6573,7 @@ public class Activity extends ContextThemeWrapper } private void dispatchRequestPermissionsResult(int requestCode, Intent data) { + mHasCurrentPermissionsRequest = false; // If the package installer crashed we may have not data - best effort. String[] permissions = (data != null) ? data.getStringArrayExtra( PackageManager.EXTRA_REQUEST_PERMISSIONS_NAMES) : new String[0]; diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java index 1b89a38..c0cd9ec 100644 --- a/core/java/android/app/ApplicationPackageManager.java +++ b/core/java/android/app/ApplicationPackageManager.java @@ -1664,7 +1664,8 @@ final class ApplicationPackageManager extends PackageManager { // System apps and apps demanding internal storage can't be moved // anywhere else if (app.isSystemApp() - || app.installLocation == PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY) { + || app.installLocation == PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY + || app.installLocation == PackageInfo.INSTALL_LOCATION_UNSPECIFIED) { return false; } diff --git a/core/java/android/app/Fragment.java b/core/java/android/app/Fragment.java index d50483e..29e8dd4 100644 --- a/core/java/android/app/Fragment.java +++ b/core/java/android/app/Fragment.java @@ -460,9 +460,6 @@ public class Fragment implements ComponentCallbacks2, OnCreateContextMenuListene // If set this fragment is being retained across the current config change. boolean mRetaining; - // If set this fragment's loaders are being retained across the current config change. - boolean mRetainLoader; - // If set this fragment has menu items to contribute. boolean mHasMenu; @@ -2404,7 +2401,7 @@ public class Fragment implements ComponentCallbacks2, OnCreateContextMenuListene mLoaderManager = mHost.getLoaderManager(mWho, mLoadersStarted, false); } if (mLoaderManager != null) { - if (mRetainLoader) { + if (mHost.getRetainLoaders()) { mLoaderManager.doRetain(); } else { mLoaderManager.doStop(); diff --git a/core/java/android/app/FragmentController.java b/core/java/android/app/FragmentController.java index 1b45137..28dadfa 100644 --- a/core/java/android/app/FragmentController.java +++ b/core/java/android/app/FragmentController.java @@ -341,7 +341,6 @@ public class FragmentController { */ public void doLoaderStop(boolean retain) { mHost.doLoaderStop(retain); - mHost.mFragmentManager.setRetainLoader(retain); } /** diff --git a/core/java/android/app/FragmentHostCallback.java b/core/java/android/app/FragmentHostCallback.java index 7b01307..13517e6 100644 --- a/core/java/android/app/FragmentHostCallback.java +++ b/core/java/android/app/FragmentHostCallback.java @@ -42,9 +42,14 @@ public abstract class FragmentHostCallback<E> extends FragmentContainer { private final Handler mHandler; final int mWindowAnimations; final FragmentManagerImpl mFragmentManager = new FragmentManagerImpl(); + /** The loader managers for individual fragments [i.e. Fragment#getLoaderManager()] */ private ArrayMap<String, LoaderManager> mAllLoaderManagers; + /** Whether or not fragment loaders should retain their state */ + private boolean mRetainLoaders; + /** The loader manger for the fragment host [i.e. Activity#getLoaderManager()] */ private LoaderManagerImpl mLoaderManager; private boolean mCheckedForLoaderManager; + /** Whether or not the fragment host loader manager was started */ private boolean mLoadersStarted; public FragmentHostCallback(Context context, Handler handler, int windowAnimations) { @@ -166,6 +171,10 @@ public abstract class FragmentHostCallback<E> extends FragmentContainer { return true; } + boolean getRetainLoaders() { + return mRetainLoaders; + } + Activity getActivity() { return mActivity; } @@ -217,6 +226,8 @@ public abstract class FragmentHostCallback<E> extends FragmentContainer { } void doLoaderStop(boolean retain) { + mRetainLoaders = retain; + if (mLoaderManager == null) { return; } diff --git a/core/java/android/app/FragmentManager.java b/core/java/android/app/FragmentManager.java index 51d6132..696ccdb 100644 --- a/core/java/android/app/FragmentManager.java +++ b/core/java/android/app/FragmentManager.java @@ -869,17 +869,6 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate } } - void setRetainLoader(boolean retain) { - if (mActive != null) { - for (int i=0; i<mActive.size(); i++) { - Fragment f = mActive.get(i); - if (f != null) { - f.mRetainLoader = retain; - } - } - } - } - void moveToState(Fragment f, int newState, int transit, int transitionStyle, boolean keepActive) { if (DEBUG && false) Log.v(TAG, "moveToState: " + f @@ -2221,6 +2210,7 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate // This fragment was retained from a previous instance; get it // going now. fragment.mInLayout = true; + fragment.mHost = mHost; // If this fragment is newly instantiated (either right now, or // from last saved state), then give it the attributes to // initialize itself. diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index 5c5562d..cd07c9c 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -3970,13 +3970,18 @@ public class Notification implements Parcelable return this; } + /** @hide */ + public static final int MIN_ASHMEM_BITMAP_SIZE = 128 * (1 << 10); + /** * @hide */ @Override public void purgeResources() { super.purgeResources(); - if (mPicture != null && mPicture.isMutable()) { + if (mPicture != null && + mPicture.isMutable() && + mPicture.getAllocationByteCount() >= MIN_ASHMEM_BITMAP_SIZE) { mPicture = mPicture.createAshmemBitmap(); } if (mBigLargeIcon != null) { diff --git a/core/java/android/app/usage/UsageStatsManagerInternal.java b/core/java/android/app/usage/UsageStatsManagerInternal.java index 948ea1e..498ff81 100644 --- a/core/java/android/app/usage/UsageStatsManagerInternal.java +++ b/core/java/android/app/usage/UsageStatsManagerInternal.java @@ -71,10 +71,11 @@ public abstract class UsageStatsManagerInternal { * Could be hours, could be days, who knows? * * @param packageName + * @param uidForAppId The uid of the app, which will be used for its app id * @param userId * @return */ - public abstract boolean isAppIdle(String packageName, int userId); + public abstract boolean isAppIdle(String packageName, int uidForAppId, int userId); /** * Returns all of the uids for a given user where all packages associating with that uid |