diff options
40 files changed, 350 insertions, 342 deletions
diff --git a/api/current.txt b/api/current.txt index 78de86028377..9d0f2988fa81 100644 --- a/api/current.txt +++ b/api/current.txt @@ -36740,7 +36740,6 @@ package android.test.mock { method public android.graphics.drawable.Drawable getApplicationLogo(java.lang.String) throws android.content.pm.PackageManager.NameNotFoundException; method public int getComponentEnabledSetting(android.content.ComponentName); method public android.graphics.drawable.Drawable getDefaultActivityIcon(); - method public java.lang.String getDefaultBrowserPackageName(int); method public android.graphics.drawable.Drawable getDrawable(java.lang.String, int, android.content.pm.ApplicationInfo); method public byte[] getEphemeralCookie(); method public int getEphemeralCookieMaxSizeBytes(); @@ -36792,7 +36791,6 @@ package android.test.mock { method public android.content.pm.ResolveInfo resolveService(android.content.Intent, int); method public void setApplicationEnabledSetting(java.lang.String, int, int); method public void setComponentEnabledSetting(android.content.ComponentName, int, int); - method public boolean setDefaultBrowserPackageName(java.lang.String, int); method public boolean setEphemeralCookie(byte[]); method public void setInstallerPackageName(java.lang.String, java.lang.String); method public void verifyPendingInstall(int, int); diff --git a/api/removed.txt b/api/removed.txt index f12e61eea332..6b7961e9f1f6 100644 --- a/api/removed.txt +++ b/api/removed.txt @@ -199,6 +199,15 @@ package android.provider { } +package android.test.mock { + + public class MockPackageManager extends android.content.pm.PackageManager { + method public deprecated java.lang.String getDefaultBrowserPackageName(int); + method public deprecated boolean setDefaultBrowserPackageName(java.lang.String, int); + } + +} + package android.text.format { public class DateFormat { diff --git a/api/system-current.txt b/api/system-current.txt index 24d257d49514..5cbf06c0e96b 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -39081,7 +39081,6 @@ package android.test.mock { method public android.graphics.drawable.Drawable getApplicationLogo(java.lang.String) throws android.content.pm.PackageManager.NameNotFoundException; method public int getComponentEnabledSetting(android.content.ComponentName); method public android.graphics.drawable.Drawable getDefaultActivityIcon(); - method public java.lang.String getDefaultBrowserPackageName(int); method public android.graphics.drawable.Drawable getDrawable(java.lang.String, int, android.content.pm.ApplicationInfo); method public byte[] getEphemeralCookie(); method public int getEphemeralCookieMaxSizeBytes(); @@ -39137,7 +39136,6 @@ package android.test.mock { method public void revokeRuntimePermission(java.lang.String, java.lang.String, android.os.UserHandle); method public void setApplicationEnabledSetting(java.lang.String, int, int); method public void setComponentEnabledSetting(android.content.ComponentName, int, int); - method public boolean setDefaultBrowserPackageName(java.lang.String, int); method public boolean setEphemeralCookie(byte[]); method public void setInstallerPackageName(java.lang.String, java.lang.String); method public void updatePermissionFlags(java.lang.String, java.lang.String, int, int, android.os.UserHandle); diff --git a/api/system-removed.txt b/api/system-removed.txt index 642d2a8ac19c..90a5dc7c474f 100644 --- a/api/system-removed.txt +++ b/api/system-removed.txt @@ -190,6 +190,15 @@ package android.provider { } +package android.test.mock { + + public class MockPackageManager extends android.content.pm.PackageManager { + method public deprecated java.lang.String getDefaultBrowserPackageName(int); + method public deprecated boolean setDefaultBrowserPackageName(java.lang.String, int); + } + +} + package android.text.format { public class DateFormat { diff --git a/api/test-current.txt b/api/test-current.txt index 6b6bafb9454e..49779e8d6823 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -36743,7 +36743,6 @@ package android.test.mock { method public android.graphics.drawable.Drawable getApplicationLogo(java.lang.String) throws android.content.pm.PackageManager.NameNotFoundException; method public int getComponentEnabledSetting(android.content.ComponentName); method public android.graphics.drawable.Drawable getDefaultActivityIcon(); - method public java.lang.String getDefaultBrowserPackageName(int); method public android.graphics.drawable.Drawable getDrawable(java.lang.String, int, android.content.pm.ApplicationInfo); method public byte[] getEphemeralCookie(); method public int getEphemeralCookieMaxSizeBytes(); @@ -36795,7 +36794,6 @@ package android.test.mock { method public android.content.pm.ResolveInfo resolveService(android.content.Intent, int); method public void setApplicationEnabledSetting(java.lang.String, int, int); method public void setComponentEnabledSetting(android.content.ComponentName, int, int); - method public boolean setDefaultBrowserPackageName(java.lang.String, int); method public boolean setEphemeralCookie(byte[]); method public void setInstallerPackageName(java.lang.String, java.lang.String); method public void verifyPendingInstall(int, int); diff --git a/api/test-removed.txt b/api/test-removed.txt index f12e61eea332..6b7961e9f1f6 100644 --- a/api/test-removed.txt +++ b/api/test-removed.txt @@ -199,6 +199,15 @@ package android.provider { } +package android.test.mock { + + public class MockPackageManager extends android.content.pm.PackageManager { + method public deprecated java.lang.String getDefaultBrowserPackageName(int); + method public deprecated boolean setDefaultBrowserPackageName(java.lang.String, int); + } + +} + package android.text.format { public class DateFormat { diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java index a60fbf6374c9..e34b1ac713be 100644 --- a/core/java/android/app/ApplicationPackageManager.java +++ b/core/java/android/app/ApplicationPackageManager.java @@ -228,7 +228,7 @@ public class ApplicationPackageManager extends PackageManager { } @Override - public int getPackageUid(String packageName, int userHandle) + public int getPackageUidAsUser(String packageName, int userHandle) throws NameNotFoundException { try { int uid = mPM.getPackageUid(packageName, userHandle); @@ -590,12 +590,12 @@ public class ApplicationPackageManager extends PackageManager { @SuppressWarnings("unchecked") @Override public List<PackageInfo> getInstalledPackages(int flags) { - return getInstalledPackages(flags, mContext.getUserId()); + return getInstalledPackagesAsUser(flags, mContext.getUserId()); } /** @hide */ @Override - public List<PackageInfo> getInstalledPackages(int flags, int userId) { + public List<PackageInfo> getInstalledPackagesAsUser(int flags, int userId) { try { ParceledListSlice<PackageInfo> slice = mPM.getInstalledPackages(flags, userId); return slice.getList(); @@ -779,7 +779,7 @@ public class ApplicationPackageManager extends PackageManager { * @hide */ @Override - public List<ResolveInfo> queryBroadcastReceivers(Intent intent, int flags, int userId) { + public List<ResolveInfo> queryBroadcastReceiversAsUser(Intent intent, int flags, int userId) { try { return mPM.queryIntentReceivers( intent, @@ -793,7 +793,7 @@ public class ApplicationPackageManager extends PackageManager { @Override public List<ResolveInfo> queryBroadcastReceivers(Intent intent, int flags) { - return queryBroadcastReceivers(intent, flags, mContext.getUserId()); + return queryBroadcastReceiversAsUser(intent, flags, mContext.getUserId()); } @Override @@ -1546,7 +1546,7 @@ public class ApplicationPackageManager extends PackageManager { } @Override - public int getIntentVerificationStatus(String packageName, int userId) { + public int getIntentVerificationStatusAsUser(String packageName, int userId) { try { return mPM.getIntentVerificationStatus(packageName, userId); } catch (RemoteException e) { @@ -1556,7 +1556,7 @@ public class ApplicationPackageManager extends PackageManager { } @Override - public boolean updateIntentVerificationStatus(String packageName, int status, int userId) { + public boolean updateIntentVerificationStatusAsUser(String packageName, int status, int userId) { try { return mPM.updateIntentVerificationStatus(packageName, status, userId); } catch (RemoteException e) { @@ -1586,7 +1586,7 @@ public class ApplicationPackageManager extends PackageManager { } @Override - public String getDefaultBrowserPackageName(int userId) { + public String getDefaultBrowserPackageNameAsUser(int userId) { try { return mPM.getDefaultBrowserPackageName(userId); } catch (RemoteException e) { @@ -1596,7 +1596,7 @@ public class ApplicationPackageManager extends PackageManager { } @Override - public boolean setDefaultBrowserPackageName(String packageName, int userId) { + public boolean setDefaultBrowserPackageNameAsUser(String packageName, int userId) { try { return mPM.setDefaultBrowserPackageName(packageName, userId); } catch (RemoteException e) { @@ -1867,7 +1867,7 @@ public class ApplicationPackageManager extends PackageManager { } @Override - public void getPackageSizeInfo(String packageName, int userHandle, + public void getPackageSizeInfoAsUser(String packageName, int userHandle, IPackageStatsObserver observer) { try { mPM.getPackageSizeInfo(packageName, userHandle, observer); @@ -1914,7 +1914,7 @@ public class ApplicationPackageManager extends PackageManager { } @Override - public void addPreferredActivity(IntentFilter filter, int match, + public void addPreferredActivityAsUser(IntentFilter filter, int match, ComponentName[] set, ComponentName activity, int userId) { try { mPM.addPreferredActivity(filter, match, set, activity, userId); diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index a38a9d767b4a..719bfceb7cbb 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -2380,7 +2380,7 @@ public abstract class PackageManager { * * @return Returns an integer uid who owns the given package name. */ - public abstract int getPackageUid(String packageName, int userHandle) + public abstract int getPackageUidAsUser(String packageName, int userId) throws NameNotFoundException; /** @@ -2674,7 +2674,8 @@ public abstract class PackageManager { * * @hide */ - public abstract List<PackageInfo> getInstalledPackages(@PackageInfoFlags int flags, int userId); + public abstract List<PackageInfo> getInstalledPackagesAsUser(@PackageInfoFlags int flags, + int userId); /** * Check whether a particular package has been granted a particular @@ -3298,7 +3299,7 @@ public abstract class PackageManager { * @see #GET_RESOLVED_FILTER * @hide */ - public abstract List<ResolveInfo> queryBroadcastReceivers(Intent intent, + public abstract List<ResolveInfo> queryBroadcastReceiversAsUser(Intent intent, @ResolveInfoFlags int flags, int userId); /** @@ -4230,7 +4231,7 @@ public abstract class PackageManager { * * @hide */ - public abstract int getIntentVerificationStatus(String packageName, int userId); + public abstract int getIntentVerificationStatusAsUser(String packageName, int userId); /** * Allow to change the status of a Intent Verification status for all IntentFilter of an App. @@ -4252,7 +4253,7 @@ public abstract class PackageManager { * * @hide */ - public abstract boolean updateIntentVerificationStatus(String packageName, int status, + public abstract boolean updateIntentVerificationStatusAsUser(String packageName, int status, int userId); /** @@ -4293,7 +4294,7 @@ public abstract class PackageManager { * * @hide */ - public abstract String getDefaultBrowserPackageName(int userId); + public abstract String getDefaultBrowserPackageNameAsUser(int userId); /** * Set the default Browser package name for a specific user. @@ -4307,7 +4308,7 @@ public abstract class PackageManager { * * @hide */ - public abstract boolean setDefaultBrowserPackageName(String packageName, int userId); + public abstract boolean setDefaultBrowserPackageNameAsUser(String packageName, int userId); /** * Change the installer associated with a given package. There are limitations @@ -4479,7 +4480,7 @@ public abstract class PackageManager { * should have the {@link android.Manifest.permission#GET_PACKAGE_SIZE} permission. * * @param packageName The name of the package whose size information is to be retrieved - * @param userHandle The user whose size information should be retrieved. + * @param userId The user whose size information should be retrieved. * @param observer An observer callback to get notified when the operation * is complete. * {@link android.content.pm.IPackageStatsObserver#onGetStatsCompleted(PackageStats, boolean)} @@ -4490,17 +4491,17 @@ public abstract class PackageManager { * * @hide */ - public abstract void getPackageSizeInfo(String packageName, int userHandle, + public abstract void getPackageSizeInfoAsUser(String packageName, int userId, IPackageStatsObserver observer); /** - * Like {@link #getPackageSizeInfo(String, int, IPackageStatsObserver)}, but + * Like {@link #getPackageSizeInfoAsUser(String, int, IPackageStatsObserver)}, but * returns the size for the calling user. * * @hide */ public void getPackageSizeInfo(String packageName, IPackageStatsObserver observer) { - getPackageSizeInfo(packageName, UserHandle.myUserId(), observer); + getPackageSizeInfoAsUser(packageName, UserHandle.myUserId(), observer); } /** @@ -4579,7 +4580,7 @@ public abstract class PackageManager { to. * @hide */ - public void addPreferredActivity(IntentFilter filter, int match, + public void addPreferredActivityAsUser(IntentFilter filter, int match, ComponentName[] set, ComponentName activity, int userId) { throw new RuntimeException("Not implemented. Must override in a subclass."); } diff --git a/core/java/android/content/pm/ResolveInfo.java b/core/java/android/content/pm/ResolveInfo.java index d5d300760c8a..c9be6edab424 100644 --- a/core/java/android/content/pm/ResolveInfo.java +++ b/core/java/android/content/pm/ResolveInfo.java @@ -172,7 +172,8 @@ public class ResolveInfo implements Parcelable { */ public boolean handleAllWebDataURI; - private ComponentInfo getComponentInfo() { + /** {@hide} */ + public ComponentInfo getComponentInfo() { if (activityInfo != null) return activityInfo; if (serviceInfo != null) return serviceInfo; if (providerInfo != null) return providerInfo; diff --git a/core/java/android/net/NetworkScorerAppManager.java b/core/java/android/net/NetworkScorerAppManager.java index ec76b8a6633e..a66ea49f2022 100644 --- a/core/java/android/net/NetworkScorerAppManager.java +++ b/core/java/android/net/NetworkScorerAppManager.java @@ -33,6 +33,7 @@ import android.util.Log; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.List; /** @@ -90,13 +91,18 @@ public final class NetworkScorerAppManager { * @return the list of scorers, or the empty list if there are no valid scorers. */ public static Collection<NetworkScorerAppData> getAllValidScorers(Context context) { - List<NetworkScorerAppData> scorers = new ArrayList<>(); + // Network scorer apps can only run as the primary user so exit early if we're not the + // primary user. + if (UserHandle.getCallingUserId() != 0 /*USER_SYSTEM*/) { + return Collections.emptyList(); + } + List<NetworkScorerAppData> scorers = new ArrayList<>(); PackageManager pm = context.getPackageManager(); // Only apps installed under the primary user of the device can be scorers. // TODO: http://b/23422763 List<ResolveInfo> receivers = - pm.queryBroadcastReceivers(SCORE_INTENT, 0 /* flags */, UserHandle.USER_SYSTEM); + pm.queryBroadcastReceiversAsUser(SCORE_INTENT, 0 /* flags */, UserHandle.USER_SYSTEM); for (ResolveInfo receiver : receivers) { // This field is a misnomer, see android.content.pm.ResolveInfo#activityInfo final ActivityInfo receiverInfo = receiver.activityInfo; @@ -105,8 +111,9 @@ public final class NetworkScorerAppManager { continue; } if (!permission.BROADCAST_NETWORK_PRIVILEGED.equals(receiverInfo.permission)) { - // Receiver doesn't require the BROADCAST_NETWORK_PRIVILEGED permission, which means - // anyone could trigger network scoring and flood the framework with score requests. + // Receiver doesn't require the BROADCAST_NETWORK_PRIVILEGED permission, which + // means anyone could trigger network scoring and flood the framework with score + // requests. continue; } if (pm.checkPermission(permission.SCORE_NETWORKS, receiverInfo.packageName) != @@ -128,8 +135,8 @@ public final class NetworkScorerAppManager { } } - // NOTE: loadLabel will attempt to load the receiver's label and fall back to the app - // label if none is present. + // NOTE: loadLabel will attempt to load the receiver's label and fall back to the + // app label if none is present. scorers.add(new NetworkScorerAppData(receiverInfo.packageName, receiverInfo.applicationInfo.uid, receiverInfo.loadLabel(pm), configurationActivityClassName)); diff --git a/core/java/android/service/quicksettings/TileService.java b/core/java/android/service/quicksettings/TileService.java index 1e134c7efaba..9b50ef5e1a38 100644 --- a/core/java/android/service/quicksettings/TileService.java +++ b/core/java/android/service/quicksettings/TileService.java @@ -279,6 +279,10 @@ public class TileService extends Service { } break; case MSG_TILE_REMOVED: + if (mListening) { + mListening = false; + TileService.this.onStopListening(); + } TileService.this.onTileRemoved(); break; case MSG_STOP_LISTENING: diff --git a/core/java/com/android/internal/app/ResolverActivity.java b/core/java/com/android/internal/app/ResolverActivity.java index ba0912a5536a..aa38de737484 100644 --- a/core/java/com/android/internal/app/ResolverActivity.java +++ b/core/java/com/android/internal/app/ResolverActivity.java @@ -718,9 +718,9 @@ public class ResolverActivity extends Activity { if (ri.handleAllWebDataURI) { // Set default Browser if needed - final String packageName = pm.getDefaultBrowserPackageName(userId); + final String packageName = pm.getDefaultBrowserPackageNameAsUser(userId); if (TextUtils.isEmpty(packageName)) { - pm.setDefaultBrowserPackageName(ri.activityInfo.packageName, userId); + pm.setDefaultBrowserPackageNameAsUser(ri.activityInfo.packageName, userId); } } else { // Update Domain Verification status @@ -737,7 +737,7 @@ public class ResolverActivity extends Activity { categories.contains(Intent.CATEGORY_BROWSABLE); if (isHttpOrHttps && isViewAction && hasCategoryBrowsable) { - pm.updateIntentVerificationStatus(packageName, + pm.updateIntentVerificationStatusAsUser(packageName, PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS, userId); } diff --git a/packages/DocumentsUI/src/com/android/documentsui/dirlist/MultiSelectManager.java b/packages/DocumentsUI/src/com/android/documentsui/dirlist/MultiSelectManager.java index 5994df952de9..5f317ffb29e6 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/dirlist/MultiSelectManager.java +++ b/packages/DocumentsUI/src/com/android/documentsui/dirlist/MultiSelectManager.java @@ -945,16 +945,27 @@ public final class MultiSelectManager implements View.OnKeyListener { if (vh != null) { vh.itemView.requestFocus(); } else { - // Don't smooth scroll; that taxes the system unnecessarily and makes the scroll - // handling logic below more complicated. See b/24865658. - mView.scrollToPosition(pos); + mView.smoothScrollToPosition(pos); // Set a one-time listener to request focus when the scroll has completed. mView.addOnScrollListener( new RecyclerView.OnScrollListener() { @Override - public void onScrolled(RecyclerView view, int dx, int dy) { - view.findViewHolderForAdapterPosition(pos).itemView.requestFocus(); - view.removeOnScrollListener(this); + public void onScrollStateChanged (RecyclerView view, int newState) { + if (newState == RecyclerView.SCROLL_STATE_IDLE) { + // When scrolling stops, find the item and focus it. + RecyclerView.ViewHolder vh = + view.findViewHolderForAdapterPosition(pos); + if (vh != null) { + vh.itemView.requestFocus(); + } else { + // This might happen in weird corner cases, e.g. if the user is + // scrolling while a delete operation is in progress. In that + // case, just don't attempt to focus the missing item. + Log.w( + TAG, "Unable to focus position " + pos + " after a scroll"); + } + view.removeOnScrollListener(this); + } } }); } diff --git a/packages/SettingsLib/src/com/android/settingslib/applications/AppUtils.java b/packages/SettingsLib/src/com/android/settingslib/applications/AppUtils.java index 344bf6228bf2..f6d9134c5e2b 100644 --- a/packages/SettingsLib/src/com/android/settingslib/applications/AppUtils.java +++ b/packages/SettingsLib/src/com/android/settingslib/applications/AppUtils.java @@ -38,7 +38,7 @@ public class AppUtils { String packageName = appEntry.info.packageName; boolean hasPreferred = hasPreferredActivities(pm, packageName) || hasUsbDefaults(usbManager, packageName); - int status = pm.getIntentVerificationStatus(packageName, UserHandle.myUserId()); + int status = pm.getIntentVerificationStatusAsUser(packageName, UserHandle.myUserId()); // consider a visible current link-handling state to be any explicitly designated behavior boolean hasDomainURLsPreference = status != PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED; diff --git a/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java b/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java index e6fe447c8d98..d353f31e59b1 100644 --- a/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java +++ b/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java @@ -316,7 +316,7 @@ public class ApplicationsState { synchronized (mEntriesMap) { AppEntry entry = mEntriesMap.get(userId).get(packageName); if (entry != null) { - mPm.getPackageSizeInfo(packageName, userId, mBackgroundHandler.mStatsObserver); + mPm.getPackageSizeInfoAsUser(packageName, userId, mBackgroundHandler.mStatsObserver); } if (DEBUG_LOCKING) Log.v(TAG, "...requestSize releasing lock"); } @@ -906,7 +906,7 @@ public class ApplicationsState { entry.sizeLoadStart = now; mCurComputingSizePkg = entry.info.packageName; mCurComputingSizeUserId = UserHandle.getUserId(entry.info.uid); - mPm.getPackageSizeInfo(mCurComputingSizePkg, + mPm.getPackageSizeInfoAsUser(mCurComputingSizePkg, mCurComputingSizeUserId, mStatsObserver); } if (DEBUG_LOCKING) Log.v(TAG, "MSG_LOAD_SIZES releasing: now computing"); diff --git a/packages/SettingsLib/src/com/android/settingslib/deviceinfo/StorageMeasurement.java b/packages/SettingsLib/src/com/android/settingslib/deviceinfo/StorageMeasurement.java index 9790e6408cc2..3b818c851626 100644 --- a/packages/SettingsLib/src/com/android/settingslib/deviceinfo/StorageMeasurement.java +++ b/packages/SettingsLib/src/com/android/settingslib/deviceinfo/StorageMeasurement.java @@ -422,7 +422,7 @@ public class StorageMeasurement { ActivityManager.getCurrentUser(), currentProfiles, finished, count); for (UserInfo user : users) { for (ApplicationInfo app : volumeApps) { - packageManager.getPackageSizeInfo(app.packageName, user.id, observer); + packageManager.getPackageSizeInfoAsUser(app.packageName, user.id, observer); } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java index bda46756e1aa..5fa38c6e0304 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java @@ -49,6 +49,11 @@ public class QuickQSPanel extends QSPanel { mQsContainer.addView((View) mTileLayout, 1 /* Between brightness and footer */); } + @Override + protected void createCustomizePanel() { + // No customizing from the header. + } + public void setQSPanelAndHeader(QSPanel fullPanel, View header) { mFullPanel = fullPanel; mHeader = header; diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/CustomQSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/customize/CustomQSPanel.java index cdba3eb56f1f..7448493b4880 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/customize/CustomQSPanel.java +++ b/packages/SystemUI/src/com/android/systemui/qs/customize/CustomQSPanel.java @@ -16,32 +16,28 @@ package com.android.systemui.qs.customize; import android.app.ActivityManager; -import android.app.Service; import android.content.ClipData; -import android.content.ComponentName; import android.content.Context; import android.content.Intent; -import android.content.ServiceConnection; -import android.os.IBinder; +import android.os.Handler; import android.os.UserHandle; import android.provider.Settings.Secure; -import android.service.quicksettings.IQSTileService; import android.text.TextUtils; import android.util.AttributeSet; import android.util.Log; import android.view.LayoutInflater; import android.view.View; - import com.android.systemui.R; import com.android.systemui.qs.QSPanel; import com.android.systemui.qs.QSTile; -import com.android.systemui.qs.external.QSTileServiceWrapper; import com.android.systemui.qs.external.CustomTile; +import com.android.systemui.qs.external.TileLifecycleManager; import com.android.systemui.statusbar.phone.QSTileHost; import com.android.systemui.tuner.TunerService; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.List; /** @@ -52,8 +48,9 @@ import java.util.List; public class CustomQSPanel extends QSPanel { private static final String TAG = "CustomQSPanel"; + private static final boolean DEBUG = false; - private List<String> mSavedTiles; + private List<String> mSavedTiles = Collections.emptyList(); private ArrayList<String> mStash; private List<String> mTiles = new ArrayList<>(); @@ -67,17 +64,25 @@ public class CustomQSPanel extends QSPanel { ((NonPagedTileLayout) mTileLayout).setCustomQsPanel(this); removeView(mFooter.getView()); + if (DEBUG) Log.d(TAG, "new CustomQSPanel", new Throwable()); TunerService.get(mContext).addTunable(this, QSTileHost.TILES_SETTING); } @Override + protected void onDetachedFromWindow() { + // Don't allow the super to unregister the tunable. + } + + @Override public void onTuningChanged(String key, String newValue) { if (key.equals(QS_SHOW_BRIGHTNESS)) { // No Brightness for you. super.onTuningChanged(key, "0"); } if (QSTileHost.TILES_SETTING.equals(key)) { - mSavedTiles = QSTileHost.loadTileSpecs(mContext, newValue); + mSavedTiles = Collections.unmodifiableList( + QSTileHost.loadTileSpecs(mContext, newValue)); + if (DEBUG) Log.d(TAG, "New saved tiles " + TextUtils.join(",", mSavedTiles)); } } @@ -106,6 +111,7 @@ public class CustomQSPanel extends QSPanel { } public void setSavedTiles() { + if (DEBUG) Log.d(TAG, "setSavedTiles " + TextUtils.join(",", mSavedTiles)); setTiles(mSavedTiles); } @@ -114,47 +120,26 @@ public class CustomQSPanel extends QSPanel { String tileSpec = mSavedTiles.get(i); if (!tileSpec.startsWith(CustomTile.PREFIX)) continue; if (!mTiles.contains(tileSpec)) { - mContext.bindServiceAsUser( - new Intent().setComponent(CustomTile.getComponentFromSpec(tileSpec)), - new ServiceConnection() { - @Override - public void onServiceDisconnected(ComponentName name) { - } - - @Override - public void onServiceConnected(ComponentName name, IBinder service) { - QSTileServiceWrapper wrapper = new QSTileServiceWrapper( - IQSTileService.Stub.asInterface(service)); - wrapper.onStopListening(); - wrapper.onTileRemoved(); - mContext.unbindService(this); - } - }, Service.BIND_AUTO_CREATE, - new UserHandle(ActivityManager.getCurrentUser())); + Intent intent = new Intent().setComponent(CustomTile.getComponentFromSpec(tileSpec)); + TileLifecycleManager lifecycleManager = new TileLifecycleManager(new Handler(), + mContext, intent, new UserHandle(ActivityManager.getCurrentUser())); + lifecycleManager.onStopListening(); + lifecycleManager.onTileRemoved(); + lifecycleManager.flushMessagesAndUnbind(); } } for (int i = 0; i < mTiles.size(); i++) { String tileSpec = mTiles.get(i); if (!tileSpec.startsWith(CustomTile.PREFIX)) continue; if (!mSavedTiles.contains(tileSpec)) { - mContext.bindServiceAsUser( - new Intent().setComponent(CustomTile.getComponentFromSpec(tileSpec)), - new ServiceConnection() { - @Override - public void onServiceDisconnected(ComponentName name) { - } - - @Override - public void onServiceConnected(ComponentName name, IBinder service) { - QSTileServiceWrapper wrapper = new QSTileServiceWrapper( - IQSTileService.Stub.asInterface(service)); - wrapper.onTileAdded(); - mContext.unbindService(this); - } - }, Service.BIND_AUTO_CREATE, - new UserHandle(ActivityManager.getCurrentUser())); + Intent intent = new Intent().setComponent(CustomTile.getComponentFromSpec(tileSpec)); + TileLifecycleManager lifecycleManager = new TileLifecycleManager(new Handler(), + mContext, intent, new UserHandle(ActivityManager.getCurrentUser())); + lifecycleManager.onTileAdded(); + lifecycleManager.flushMessagesAndUnbind(); } } + if (DEBUG) Log.d(TAG, "saveCurrentTiles " + mTiles); Secure.putStringForUser(getContext().getContentResolver(), QSTileHost.TILES_SETTING, TextUtils.join(",", mTiles), ActivityManager.getCurrentUser()); } @@ -173,6 +158,7 @@ public class CustomQSPanel extends QSPanel { } private void setTilesInternal() { + if (DEBUG) Log.d(TAG, "Set tiles internal"); for (int i = 0; i < mCurrentTiles.size(); i++) { mCurrentTiles.get(i).destroy(); } @@ -187,6 +173,8 @@ public class CustomQSPanel extends QSPanel { if (tile != null) { tile.setTileSpec(mTiles.get(i)); mCurrentTiles.add(tile); + } else { + if (DEBUG) Log.d(TAG, "Skipping " + mTiles.get(i)); } } } @@ -194,11 +182,13 @@ public class CustomQSPanel extends QSPanel { } public void addTile(String spec) { + if (DEBUG) Log.d(TAG, "addTile " + spec); mTiles.add(spec); setTilesInternal(); } public void moveTo(String from, String to) { + if (DEBUG) Log.d(TAG, "moveTo " + from + " " + to); int fromIndex = mTiles.indexOf(from); if (fromIndex < 0) { Log.e(TAG, "Unknown from tile " + from); @@ -222,6 +212,7 @@ public class CustomQSPanel extends QSPanel { } public void setTiles(List<String> tiles) { + if (DEBUG) Log.d(TAG, "Set tiles " + TextUtils.join(",", tiles)); mTiles = new ArrayList<>(tiles); setTilesInternal(); } diff --git a/packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java b/packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java index 41fce9f1fb98..8c5e87e1a0f6 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java +++ b/packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java @@ -76,6 +76,7 @@ public class TileLifecycleManager extends BroadcastReceiver implements @VisibleForTesting boolean mReceiverRegistered; private IQSService mService; + private boolean mUnbindImmediate; public TileLifecycleManager(Handler handler, Context context, Intent intent, UserHandle user) { mContext = context; @@ -94,6 +95,14 @@ public class TileLifecycleManager extends BroadcastReceiver implements } } + /** + * Binds just long enough to send any queued messages, then unbinds. + */ + public void flushMessagesAndUnbind() { + mUnbindImmediate = true; + setBindService(true); + } + public void setBindService(boolean bind) { mBound = bind; if (bind) { @@ -173,6 +182,10 @@ public class TileLifecycleManager extends BroadcastReceiver implements } onTileRemoved(); } + if (mUnbindImmediate) { + mUnbindImmediate = false; + setBindService(false); + } } public void handleDestroy() { diff --git a/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java b/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java index 00f76990c1e8..7403ae0321bc 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java +++ b/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java @@ -119,7 +119,7 @@ public class TileServices extends IQSService.Stub { private void verifyCaller(String packageName) { try { - int uid = mContext.getPackageManager().getPackageUid(packageName, + int uid = mContext.getPackageManager().getPackageUidAsUser(packageName, Binder.getCallingUserHandle().getIdentifier()); if (Binder.getCallingUid() != uid) { throw new SecurityException("Component outside caller's uid"); diff --git a/packages/SystemUI/src/com/android/systemui/tuner/TunerService.java b/packages/SystemUI/src/com/android/systemui/tuner/TunerService.java index 9081af156f00..47a4667f29f0 100644 --- a/packages/SystemUI/src/com/android/systemui/tuner/TunerService.java +++ b/packages/SystemUI/src/com/android/systemui/tuner/TunerService.java @@ -32,7 +32,7 @@ import android.os.Looper; import android.os.UserHandle; import android.provider.Settings; import android.util.ArrayMap; - +import android.util.ArraySet; import com.android.systemui.BatteryMeterDrawable; import com.android.systemui.DemoMode; import com.android.systemui.R; @@ -41,9 +41,8 @@ import com.android.systemui.SystemUIApplication; import com.android.systemui.settings.CurrentUserTracker; import com.android.systemui.statusbar.phone.SystemUIDialog; -import java.util.ArrayList; import java.util.HashMap; -import java.util.List; +import java.util.Set; public class TunerService extends SystemUI { @@ -54,7 +53,7 @@ public class TunerService extends SystemUI { // Map of Uris we listen on to their settings keys. private final ArrayMap<Uri, String> mListeningUris = new ArrayMap<>(); // Map of settings keys to the listener. - private final HashMap<String, List<Tunable>> mTunableLookup = new HashMap<>(); + private final HashMap<String, Set<Tunable>> mTunableLookup = new HashMap<>(); private ContentResolver mContentResolver; private int mCurrentUser; @@ -85,7 +84,7 @@ public class TunerService extends SystemUI { private void addTunable(Tunable tunable, String key) { if (!mTunableLookup.containsKey(key)) { - mTunableLookup.put(key, new ArrayList<Tunable>()); + mTunableLookup.put(key, new ArraySet<Tunable>()); } mTunableLookup.get(key).add(tunable); Uri uri = Settings.Secure.getUriFor(key); @@ -99,7 +98,7 @@ public class TunerService extends SystemUI { } public void removeTunable(Tunable tunable) { - for (List<Tunable> list : mTunableLookup.values()) { + for (Set<Tunable> list : mTunableLookup.values()) { list.remove(tunable); } } @@ -116,7 +115,7 @@ public class TunerService extends SystemUI { public void reloadSetting(Uri uri) { String key = mListeningUris.get(uri); - List<Tunable> tunables = mTunableLookup.get(key); + Set<Tunable> tunables = mTunableLookup.get(key); if (tunables == null) { return; } diff --git a/services/core/java/com/android/server/BluetoothManagerService.java b/services/core/java/com/android/server/BluetoothManagerService.java index f329cff2c98d..3c91423a5d11 100644 --- a/services/core/java/com/android/server/BluetoothManagerService.java +++ b/services/core/java/com/android/server/BluetoothManagerService.java @@ -268,7 +268,7 @@ class BluetoothManagerService extends IBluetoothManager.Stub { int sysUiUid = -1; try { - sysUiUid = mContext.getPackageManager().getPackageUid("com.android.systemui", + sysUiUid = mContext.getPackageManager().getPackageUidAsUser("com.android.systemui", UserHandle.USER_SYSTEM); } catch (PackageManager.NameNotFoundException e) { // Some platforms, such as wearables do not have a system ui. diff --git a/services/core/java/com/android/server/DeviceIdleController.java b/services/core/java/com/android/server/DeviceIdleController.java index f5ed83ed5f1d..8d707d610ae0 100644 --- a/services/core/java/com/android/server/DeviceIdleController.java +++ b/services/core/java/com/android/server/DeviceIdleController.java @@ -1326,7 +1326,7 @@ public class DeviceIdleController extends SystemService void addPowerSaveTempWhitelistAppInternal(int callingUid, String packageName, long duration, int userId, boolean sync, String reason) { try { - int uid = getContext().getPackageManager().getPackageUid(packageName, userId); + int uid = getContext().getPackageManager().getPackageUidAsUser(packageName, userId); int appId = UserHandle.getAppId(uid); addPowerSaveTempWhitelistAppDirectInternal(callingUid, appId, duration, sync, reason); } catch (NameNotFoundException e) { diff --git a/services/core/java/com/android/server/PersistentDataBlockService.java b/services/core/java/com/android/server/PersistentDataBlockService.java index e8b90d893ec5..1249c8c681b5 100644 --- a/services/core/java/com/android/server/PersistentDataBlockService.java +++ b/services/core/java/com/android/server/PersistentDataBlockService.java @@ -94,7 +94,7 @@ public class PersistentDataBlockService extends SystemService { PackageManager pm = mContext.getPackageManager(); int allowedUid = -1; try { - allowedUid = pm.getPackageUid(allowedPackage, userHandle); + allowedUid = pm.getPackageUidAsUser(allowedPackage, userHandle); } catch (PackageManager.NameNotFoundException e) { // not expected Slog.e(TAG, "not able to find package " + allowedPackage, e); diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 15d0fc42823c..fb62a95516c6 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -14870,7 +14870,7 @@ public final class ActivityManagerService extends ActivityManagerNative int dumpUid = -2; if (dumpPackage != null) { try { - dumpUid = mContext.getPackageManager().getPackageUid(dumpPackage, 0); + dumpUid = mContext.getPackageManager().getPackageUidAsUser(dumpPackage, 0); } catch (NameNotFoundException e) { dumpUid = -1; } diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java index f64b80323b91..82862e8a1935 100644 --- a/services/core/java/com/android/server/am/BatteryStatsService.java +++ b/services/core/java/com/android/server/am/BatteryStatsService.java @@ -1114,7 +1114,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub } else { // Not an option, last argument must be a package name. try { - reqUid = mContext.getPackageManager().getPackageUid(arg, + reqUid = mContext.getPackageManager().getPackageUidAsUser(arg, UserHandle.getCallingUserId()); } catch (PackageManager.NameNotFoundException e) { pw.println("Unknown package: " + arg); diff --git a/services/core/java/com/android/server/connectivity/Vpn.java b/services/core/java/com/android/server/connectivity/Vpn.java index 2bea278aad1a..5bd4f987073e 100644 --- a/services/core/java/com/android/server/connectivity/Vpn.java +++ b/services/core/java/com/android/server/connectivity/Vpn.java @@ -309,7 +309,7 @@ public class Vpn { PackageManager pm = mContext.getPackageManager(); int result; try { - result = pm.getPackageUid(app, userHandle); + result = pm.getPackageUidAsUser(app, userHandle); } catch (NameNotFoundException e) { result = -1; } diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java index 1997e40e610e..5aaa9304fbfb 100644 --- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java +++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java @@ -2333,7 +2333,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { @Override public void onAppIdleStateChanged(String packageName, int userId, boolean idle) { try { - int uid = mContext.getPackageManager().getPackageUid(packageName, userId); + int uid = mContext.getPackageManager().getPackageUidAsUser(packageName, userId); synchronized (mRulesLock) { updateRuleForAppIdleLocked(uid); } diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 86570496e095..9dcccc41e2cf 100644 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -2106,12 +2106,12 @@ public class NotificationManagerService extends SystemService { for (UserInfo user : UserManager.get(getContext()).getUsers()) { final int userId = user.getUserHandle().getIdentifier(); final PackageManager packageManager = getContext().getPackageManager(); - List<PackageInfo> packages = packageManager.getInstalledPackages(0, userId); + List<PackageInfo> packages = packageManager.getInstalledPackagesAsUser(0, userId); final int packageCount = packages.size(); for (int p = 0; p < packageCount; p++) { final String packageName = packages.get(p).packageName; if (filter == null || filter.matches(packageName)) { - final int uid = packageManager.getPackageUid(packageName, userId); + final int uid = packageManager.getPackageUidAsUser(packageName, userId); if (!checkNotificationOp(packageName, uid)) { packageNames.add(packageName); } diff --git a/services/core/java/com/android/server/notification/RankingHelper.java b/services/core/java/com/android/server/notification/RankingHelper.java index 0662e7a68cea..f1fd42c69101 100644 --- a/services/core/java/com/android/server/notification/RankingHelper.java +++ b/services/core/java/com/android/server/notification/RankingHelper.java @@ -148,7 +148,7 @@ public class RankingHelper implements RankingConfig { if (forRestore) { try { //TODO: http://b/22388012 - uid = pm.getPackageUid(name, UserHandle.USER_SYSTEM); + uid = pm.getPackageUidAsUser(name, UserHandle.USER_SYSTEM); } catch (NameNotFoundException e) { // noop } @@ -537,7 +537,7 @@ public class RankingHelper implements RankingConfig { if (r != null) { try { //TODO: http://b/22388012 - r.uid = pm.getPackageUid(r.pkg, UserHandle.USER_SYSTEM); + r.uid = pm.getPackageUidAsUser(r.pkg, UserHandle.USER_SYSTEM); mRestoredWithoutUids.remove(pkg); mRecords.put(recordKey(r.pkg, r.uid), r); updated = true; diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 7e186a0da0ee..99f403104b01 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -59,6 +59,10 @@ import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATIO import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_NEVER; import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED; import static android.content.pm.PackageManager.MATCH_ALL; +import static android.content.pm.PackageManager.MATCH_DISABLED_COMPONENTS; +import static android.content.pm.PackageManager.MATCH_ENCRYPTION_AWARE_AND_UNAWARE; +import static android.content.pm.PackageManager.MATCH_SYSTEM_ONLY; +import static android.content.pm.PackageManager.MATCH_UNINSTALLED_PACKAGES; import static android.content.pm.PackageManager.MOVE_FAILED_DOESNT_EXIST; import static android.content.pm.PackageManager.MOVE_FAILED_INTERNAL_ERROR; import static android.content.pm.PackageManager.MOVE_FAILED_OPERATION_PENDING; @@ -88,6 +92,8 @@ import static com.android.server.pm.PermissionsState.PERMISSION_OPERATION_SUCCES import static com.android.server.pm.PermissionsState.PERMISSION_OPERATION_SUCCESS_GIDS_CHANGED; import android.Manifest; +import android.annotation.NonNull; +import android.annotation.Nullable; import android.app.ActivityManager; import android.app.ActivityManagerNative; import android.app.AppGlobals; @@ -807,7 +813,7 @@ public class PackageManagerService extends IPackageManager.Stub { packageName); } if (DEBUG_DOMAIN_VERIFICATION) { - Slog.d(TAG, "Adding verification filter for " + packageName + " : " + filter); + Slog.d(TAG, "Adding verification filter for " + packageName + ": " + filter); } ivs.addFilter(filter); return true; @@ -2426,113 +2432,60 @@ public class PackageManagerService extends IPackageManager.Stub { return mIsUpgrade; } - private String getRequiredVerifierLPr() { - final Intent verification = new Intent(Intent.ACTION_PACKAGE_NEEDS_VERIFICATION); - // We only care about verifier that's installed under system user. - final List<ResolveInfo> receivers = queryIntentReceivers(verification, PACKAGE_MIME_TYPE, - PackageManager.GET_DISABLED_COMPONENTS, UserHandle.USER_SYSTEM); + private @NonNull String getRequiredVerifierLPr() { + final Intent intent = new Intent(Intent.ACTION_PACKAGE_NEEDS_VERIFICATION); - String requiredVerifier = null; - - final int N = receivers.size(); - for (int i = 0; i < N; i++) { - final ResolveInfo info = receivers.get(i); - - if (info.activityInfo == null) { - continue; - } - - final String packageName = info.activityInfo.packageName; - - if (checkPermission(android.Manifest.permission.PACKAGE_VERIFICATION_AGENT, - packageName, UserHandle.USER_SYSTEM) != PackageManager.PERMISSION_GRANTED) { - continue; - } - - if (requiredVerifier != null) { - throw new RuntimeException("There can be only one required verifier"); - } - - requiredVerifier = packageName; + final List<ResolveInfo> matches = queryIntentReceivers(intent, PACKAGE_MIME_TYPE, + MATCH_SYSTEM_ONLY | MATCH_ENCRYPTION_AWARE_AND_UNAWARE, UserHandle.USER_SYSTEM); + if (matches.size() == 1) { + return matches.get(0).getComponentInfo().packageName; + } else { + throw new RuntimeException("There must be exactly one verifier; found " + matches); } - - return requiredVerifier; } - private String getRequiredInstallerLPr() { - Intent installerIntent = new Intent(Intent.ACTION_INSTALL_PACKAGE); - installerIntent.addCategory(Intent.CATEGORY_DEFAULT); - installerIntent.setDataAndType(Uri.fromFile(new File("foo.apk")), PACKAGE_MIME_TYPE); - - final List<ResolveInfo> installers = queryIntentActivities(installerIntent, - PACKAGE_MIME_TYPE, 0, UserHandle.USER_SYSTEM); - - String requiredInstaller = null; + private @NonNull String getRequiredInstallerLPr() { + final Intent intent = new Intent(Intent.ACTION_INSTALL_PACKAGE); + intent.addCategory(Intent.CATEGORY_DEFAULT); + intent.setDataAndType(Uri.fromFile(new File("foo.apk")), PACKAGE_MIME_TYPE); - final int N = installers.size(); - for (int i = 0; i < N; i++) { - final ResolveInfo info = installers.get(i); - final String packageName = info.activityInfo.packageName; - - if (!info.activityInfo.applicationInfo.isSystemApp()) { - continue; - } - - if (requiredInstaller != null) { - throw new RuntimeException("There must be one required installer"); - } - - requiredInstaller = packageName; - } - - if (requiredInstaller == null) { - throw new RuntimeException("There must be one required installer"); + final List<ResolveInfo> matches = queryIntentActivities(intent, PACKAGE_MIME_TYPE, + MATCH_SYSTEM_ONLY | MATCH_ENCRYPTION_AWARE_AND_UNAWARE, UserHandle.USER_SYSTEM); + if (matches.size() == 1) { + return matches.get(0).getComponentInfo().packageName; + } else { + throw new RuntimeException("There must be exactly one installer; found " + matches); } - - return requiredInstaller; } - private ComponentName getIntentFilterVerifierComponentNameLPr() { - final Intent verification = new Intent(Intent.ACTION_INTENT_FILTER_NEEDS_VERIFICATION); - final List<ResolveInfo> receivers = queryIntentReceivers(verification, PACKAGE_MIME_TYPE, - PackageManager.GET_DISABLED_COMPONENTS, UserHandle.USER_SYSTEM); + private @NonNull ComponentName getIntentFilterVerifierComponentNameLPr() { + final Intent intent = new Intent(Intent.ACTION_INTENT_FILTER_NEEDS_VERIFICATION); - ComponentName verifierComponentName = null; - - int priority = -1000; - final int N = receivers.size(); + final List<ResolveInfo> matches = queryIntentReceivers(intent, PACKAGE_MIME_TYPE, + MATCH_SYSTEM_ONLY | MATCH_ENCRYPTION_AWARE_AND_UNAWARE, UserHandle.USER_SYSTEM); + ResolveInfo best = null; + final int N = matches.size(); for (int i = 0; i < N; i++) { - final ResolveInfo info = receivers.get(i); - - if (info.activityInfo == null) { - continue; - } - - final String packageName = info.activityInfo.packageName; - - final PackageSetting ps = mSettings.mPackages.get(packageName); - if (ps == null) { - continue; - } - + final ResolveInfo cur = matches.get(i); + final String packageName = cur.getComponentInfo().packageName; if (checkPermission(android.Manifest.permission.INTENT_FILTER_VERIFICATION_AGENT, packageName, UserHandle.USER_SYSTEM) != PackageManager.PERMISSION_GRANTED) { continue; } - // Select the IntentFilterVerifier with the highest priority - if (priority < info.priority) { - priority = info.priority; - verifierComponentName = new ComponentName(packageName, info.activityInfo.name); - if (DEBUG_DOMAIN_VERIFICATION) Slog.d(TAG, "Selecting IntentFilterVerifier: " - + verifierComponentName + " with priority: " + info.priority); + if (best == null || cur.priority > best.priority) { + best = cur; } } - return verifierComponentName; + if (best != null) { + return best.getComponentInfo().getComponentName(); + } else { + throw new RuntimeException("There must be at least one intent filter verifier"); + } } - private ComponentName getEphemeralResolverLPr() { + private @Nullable ComponentName getEphemeralResolverLPr() { final String[] packageArray = mContext.getResources().getStringArray(R.array.config_ephemeralResolverPackage); if (packageArray.length == 0) { @@ -2542,9 +2495,9 @@ public class PackageManagerService extends IPackageManager.Stub { return null; } - Intent resolverIntent = new Intent(Intent.ACTION_RESOLVE_EPHEMERAL_PACKAGE); - final List<ResolveInfo> resolvers = queryIntentServices(resolverIntent, - null /*resolvedType*/, 0 /*flags*/, UserHandle.USER_SYSTEM); + final Intent resolverIntent = new Intent(Intent.ACTION_RESOLVE_EPHEMERAL_PACKAGE); + final List<ResolveInfo> resolvers = queryIntentServices(resolverIntent, null, + MATCH_SYSTEM_ONLY | MATCH_ENCRYPTION_AWARE_AND_UNAWARE, UserHandle.USER_SYSTEM); final int N = resolvers.size(); if (N == 0) { @@ -2583,36 +2536,21 @@ public class PackageManagerService extends IPackageManager.Stub { return null; } - private ComponentName getEphemeralInstallerLPr() { - Intent installerIntent = new Intent(Intent.ACTION_INSTALL_EPHEMERAL_PACKAGE); - installerIntent.addCategory(Intent.CATEGORY_DEFAULT); - installerIntent.setDataAndType(Uri.fromFile(new File("foo.apk")), PACKAGE_MIME_TYPE); - final List<ResolveInfo> installers = queryIntentActivities(installerIntent, - PACKAGE_MIME_TYPE, 0 /*flags*/, 0 /*userId*/); + private @Nullable ComponentName getEphemeralInstallerLPr() { + final Intent intent = new Intent(Intent.ACTION_INSTALL_EPHEMERAL_PACKAGE); + intent.addCategory(Intent.CATEGORY_DEFAULT); + intent.setDataAndType(Uri.fromFile(new File("foo.apk")), PACKAGE_MIME_TYPE); - ComponentName ephemeralInstaller = null; - - final int N = installers.size(); - for (int i = 0; i < N; i++) { - final ResolveInfo info = installers.get(i); - final String packageName = info.activityInfo.packageName; - - if (!info.activityInfo.applicationInfo.isSystemApp()) { - if (DEBUG_EPHEMERAL) { - Slog.d(TAG, "Ephemeral installer is not system app;" - + " pkg: " + packageName + ", info:" + info); - } - continue; - } - - if (ephemeralInstaller != null) { - throw new RuntimeException("There must only be one ephemeral installer"); - } - - ephemeralInstaller = new ComponentName(packageName, info.activityInfo.name); + final List<ResolveInfo> matches = queryIntentActivities(intent, PACKAGE_MIME_TYPE, + MATCH_SYSTEM_ONLY | MATCH_ENCRYPTION_AWARE_AND_UNAWARE, UserHandle.USER_SYSTEM); + if (matches.size() == 0) { + return null; + } else if (matches.size() == 1) { + return matches.get(0).getComponentInfo().getComponentName(); + } else { + throw new RuntimeException( + "There must be at most one ephemeral installer; found " + matches); } - - return ephemeralInstaller; } private void primeDomainVerificationsLPw(int userId) { @@ -2659,7 +2597,7 @@ public class PackageManagerService extends IPackageManager.Stub { + "' does not handle web links"); } } else { - Slog.w(TAG, "Unknown package '" + packageName + "' in sysconfig <app-link>"); + Slog.w(TAG, "Unknown package " + packageName + " in sysconfig <app-link>"); } } @@ -2857,7 +2795,7 @@ public class PackageManagerService extends IPackageManager.Stub { if (p != null) { return generatePackageInfo(p, flags, userId); } - if((flags & PackageManager.GET_UNINSTALLED_PACKAGES) != 0) { + if ((flags & MATCH_UNINSTALLED_PACKAGES) != 0) { return generatePackageInfoFromSettingsLPw(packageName, flags, userId); } } @@ -2907,7 +2845,7 @@ public class PackageManagerService extends IPackageManager.Stub { if (p != null) { return UserHandle.getUid(userId, p.applicationInfo.uid); } - if ((flags & PackageManager.GET_UNINSTALLED_PACKAGES) != 0) { + if ((flags & MATCH_UNINSTALLED_PACKAGES) != 0) { final PackageSetting ps = mSettings.mPackages.get(packageName); if (ps != null) { return UserHandle.getUid(userId, ps.appId); @@ -2937,7 +2875,7 @@ public class PackageManagerService extends IPackageManager.Stub { PackageSetting ps = (PackageSetting) p.mExtras; return ps.getPermissionsState().computeGids(userId); } - if ((flags & PackageManager.GET_UNINSTALLED_PACKAGES) != 0) { + if ((flags & MATCH_UNINSTALLED_PACKAGES) != 0) { final PackageSetting ps = mSettings.mPackages.get(packageName); if (ps != null) { return ps.getPermissionsState().computeGids(userId); @@ -3045,7 +2983,7 @@ public class PackageManagerService extends IPackageManager.Stub { if (ps != null) { PackageParser.Package pkg = ps.pkg; if (pkg == null) { - if ((flags & PackageManager.GET_UNINSTALLED_PACKAGES) == 0) { + if ((flags & MATCH_UNINSTALLED_PACKAGES) == 0) { return null; } // Only data remains, so we aren't worried about code paths @@ -3084,7 +3022,7 @@ public class PackageManagerService extends IPackageManager.Stub { if ("android".equals(packageName)||"system".equals(packageName)) { return mAndroidApplication; } - if ((flags & PackageManager.GET_UNINSTALLED_PACKAGES) != 0) { + if ((flags & MATCH_UNINSTALLED_PACKAGES) != 0) { return generateApplicationInfoFromSettingsLPw(packageName, flags, userId); } } @@ -3773,8 +3711,8 @@ public class PackageManagerService extends IPackageManager.Stub { final int flags = permissionsState.getPermissionFlags(name, userId); if ((flags & PackageManager.FLAG_PERMISSION_SYSTEM_FIXED) != 0) { - throw new SecurityException("Cannot grant system fixed permission: " - + name + " for package: " + packageName); + throw new SecurityException("Cannot grant system fixed permission " + + name + " for package " + packageName); } if (bp.isDevelopment()) { @@ -3882,8 +3820,8 @@ public class PackageManagerService extends IPackageManager.Stub { final int flags = permissionsState.getPermissionFlags(name, userId); if ((flags & PackageManager.FLAG_PERMISSION_SYSTEM_FIXED) != 0) { - throw new SecurityException("Cannot revoke system fixed permission: " - + name + " for package: " + packageName); + throw new SecurityException("Cannot revoke system fixed permission " + + name + " for package " + packageName); } if (bp.isDevelopment()) { @@ -4688,7 +4626,7 @@ public class PackageManagerService extends IPackageManager.Stub { ppa.dump(new LogPrinter(Log.VERBOSE, TAG, Log.LOG_ID_SYSTEM), " "); } final ActivityInfo ai = getActivityInfo(ppa.mComponent, - flags | PackageManager.GET_DISABLED_COMPONENTS, userId); + flags | MATCH_DISABLED_COMPONENTS, userId); if (DEBUG_PREFERRED || debug) { Slog.v(TAG, "Found persistent preferred activity:"); if (ai != null) { @@ -4797,7 +4735,7 @@ public class PackageManagerService extends IPackageManager.Stub { continue; } final ActivityInfo ai = getActivityInfo(pa.mPref.mComponent, - flags | PackageManager.GET_DISABLED_COMPONENTS, userId); + flags | MATCH_DISABLED_COMPONENTS, userId); if (DEBUG_PREFERRED || debug) { Slog.v(TAG, "Found preferred activity:"); if (ai != null) { @@ -5713,7 +5651,7 @@ public class PackageManagerService extends IPackageManager.Stub { public ParceledListSlice<PackageInfo> getInstalledPackages(int flags, int userId) { if (!sUserManager.exists(userId)) return ParceledListSlice.emptyList(); flags = updateFlagsForPackage(flags, userId, null); - final boolean listUninstalled = (flags & PackageManager.GET_UNINSTALLED_PACKAGES) != 0; + final boolean listUninstalled = (flags & MATCH_UNINSTALLED_PACKAGES) != 0; enforceCrossUserPermission(Binder.getCallingUid(), userId, true, false, "get installed packages"); // writer @@ -5794,7 +5732,7 @@ public class PackageManagerService extends IPackageManager.Stub { String[] permissions, int flags, int userId) { if (!sUserManager.exists(userId)) return ParceledListSlice.emptyList(); flags = updateFlagsForPackage(flags, userId, permissions); - final boolean listUninstalled = (flags & PackageManager.GET_UNINSTALLED_PACKAGES) != 0; + final boolean listUninstalled = (flags & MATCH_UNINSTALLED_PACKAGES) != 0; // writer synchronized (mPackages) { @@ -5822,7 +5760,7 @@ public class PackageManagerService extends IPackageManager.Stub { public ParceledListSlice<ApplicationInfo> getInstalledApplications(int flags, int userId) { if (!sUserManager.exists(userId)) return ParceledListSlice.emptyList(); flags = updateFlagsForApplication(flags, userId, null); - final boolean listUninstalled = (flags & PackageManager.GET_UNINSTALLED_PACKAGES) != 0; + final boolean listUninstalled = (flags & MATCH_UNINSTALLED_PACKAGES) != 0; // writer synchronized (mPackages) { @@ -6335,7 +6273,7 @@ public class PackageManagerService extends IPackageManager.Stub { + " ignored: updated version " + ps.versionCode + " better than this " + pkg.mVersionCode); if (!updatedPkg.codePath.equals(scanFile)) { - Slog.w(PackageManagerService.TAG, "Code path for hidden system pkg : " + Slog.w(PackageManagerService.TAG, "Code path for hidden system pkg " + ps.name + " changing from " + updatedPkg.codePathString + " to " + scanFile); updatedPkg.codePath = scanFile; @@ -6460,7 +6398,7 @@ public class PackageManagerService extends IPackageManager.Stub { baseResourcePath = ps.resourcePathString; } else { // Should not happen at all. Just log an error. - Slog.e(TAG, "Resource path not set for pkg : " + pkg.packageName); + Slog.e(TAG, "Resource path not set for package " + pkg.packageName); } } else { resourcePath = pkg.codePath; @@ -6709,7 +6647,7 @@ public class PackageManagerService extends IPackageManager.Stub { synchronized (mPackages) { pkg = mPackages.get(packageName); if (pkg == null) { - throw new IllegalArgumentException("Missing package: " + packageName); + throw new IllegalArgumentException("Unknown package: " + packageName); } } @@ -7219,7 +7157,7 @@ public class PackageManagerService extends IPackageManager.Stub { pkg.mSignatures) != PackageManager.SIGNATURE_MATCH) { throw new PackageManagerException( INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES, - "Signature mismatch for shared user : " + "Signature mismatch for shared user: " + pkgSetting.sharedUser); } } @@ -7471,7 +7409,7 @@ public class PackageManagerService extends IPackageManager.Stub { if ((scanFlags & SCAN_NO_DEX) == 0 && (scanFlags & SCAN_NEW_INSTALL) != 0) { if (cpuAbiOverride == null && pkgSetting.cpuAbiOverrideString != null) { Slog.w(TAG, "Ignoring persisted ABI override " + cpuAbiOverride + - " for package: " + pkg.packageName); + " for package " + pkg.packageName); } } @@ -8178,7 +8116,7 @@ public class PackageManagerService extends IPackageManager.Stub { ps.primaryCpuAbiString = adjustedAbi; if (ps.pkg != null && ps.pkg.applicationInfo != null) { ps.pkg.applicationInfo.primaryCpuAbi = adjustedAbi; - Slog.i(TAG, "Adjusting ABI for : " + ps.name + " to " + adjustedAbi); + Slog.i(TAG, "Adjusting ABI for " + ps.name + " to " + adjustedAbi); mInstaller.rmdex(ps.codePathString, getDexCodeInstructionSet(getPreferredInstructionSet())); } @@ -8416,7 +8354,7 @@ public class PackageManagerService extends IPackageManager.Stub { // 64 bit apps will see a 64 bit primary ABI, if ((pkg.applicationInfo.flags & ApplicationInfo.FLAG_MULTIARCH) == 0) { - Slog.e(TAG, "Package: " + pkg + " has multiple bundled libs, but is not multiarch."); + Slog.e(TAG, "Package " + pkg + " has multiple bundled libs, but is not multiarch."); } if (VMRuntime.is64BitInstructionSet(getPreferredInstructionSet())) { @@ -10662,7 +10600,7 @@ public class PackageManagerService extends IPackageManager.Stub { throw new SecurityException("Bad object " + obj + " for uid " + uid); } } else { - throw new SecurityException("Unknown calling uid " + uid); + throw new SecurityException("Unknown calling UID: " + uid); } // Verify: can't set installerPackageName to a package that is @@ -11263,9 +11201,9 @@ public class PackageManagerService extends IPackageManager.Stub { PACKAGE_MIME_TYPE); verification.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + // Query all live verifiers based on current user state final List<ResolveInfo> receivers = queryIntentReceivers(verification, - PACKAGE_MIME_TYPE, PackageManager.GET_DISABLED_COMPONENTS, - verifierUser.getIdentifier()); + PACKAGE_MIME_TYPE, 0, verifierUser.getIdentifier()); if (DEBUG_VERIFY) { Slog.d(TAG, "Found " + receivers.size() + " verifiers for intent " @@ -11576,8 +11514,8 @@ public class PackageManagerService extends IPackageManager.Stub { for (String dexCodeInstructionSet : dexCodeInstructionSets) { int retCode = mInstaller.rmdex(codePath, dexCodeInstructionSet); if (retCode < 0) { - Slog.w(TAG, "Couldn't remove dex file for package: " - + " at location " + codePath + ", retcode=" + retCode); + Slog.w(TAG, "Couldn't remove dex file for package at location " + codePath + + ", retcode=" + retCode); // we don't consider this to be a failure of the core package deletion } } @@ -12611,7 +12549,7 @@ public class PackageManagerService extends IPackageManager.Stub { if((oldPkg == null) || (oldPkg.applicationInfo == null) || (oldPkgSetting == null)) { res.setError(INSTALL_FAILED_REPLACE_COULDNT_DELETE, - "Couldn't find package:" + packageName + " information"); + "Couldn't find package " + packageName + " information"); return; } } @@ -13696,7 +13634,7 @@ public class PackageManagerService extends IPackageManager.Stub { try { newPkg = scanPackageTracedLI(disabledPs.codePath, parseFlags, SCAN_NO_PATHS, 0, null); } catch (PackageManagerException e) { - Slog.w(TAG, "Failed to restore system package:" + newPs.name + ": " + e.getMessage()); + Slog.w(TAG, "Failed to restore system package " + newPs.name + ": " + e.getMessage()); return false; } @@ -13914,13 +13852,13 @@ public class PackageManagerService extends IPackageManager.Stub { boolean ret = false; if (isSystemApp(ps)) { - if (DEBUG_REMOVE) Slog.d(TAG, "Removing system package:" + ps.name); + if (DEBUG_REMOVE) Slog.d(TAG, "Removing system package: " + ps.name); // When an updated system application is deleted we delete the existing resources as well and // fall back to existing code in system partition ret = deleteSystemPackageLI(ps, allUserHandles, perUserInstalled, flags, outInfo, writeSettings); } else { - if (DEBUG_REMOVE) Slog.d(TAG, "Removing non-system package:" + ps.name); + if (DEBUG_REMOVE) Slog.d(TAG, "Removing non-system package: " + ps.name); // Kill application pre-emptively especially for apps on sd. killApplication(packageName, ps.appId, "uninstall pkg"); ret = deleteInstalledPackageLI(ps, deleteCodeAndResources, flags, @@ -14069,7 +14007,7 @@ public class PackageManagerService extends IPackageManager.Stub { // resorting to a full data wipe. int retCode = mInstaller.clearUserData(pkg.volumeUuid, packageName, userId); if (retCode < 0) { - Slog.w(TAG, "Couldn't remove cache files for package: " + packageName); + Slog.w(TAG, "Couldn't remove cache files for package " + packageName); return false; } @@ -14299,7 +14237,7 @@ public class PackageManagerService extends IPackageManager.Stub { } int retCode = mInstaller.deleteCacheFiles(p.volumeUuid, packageName, userId); if (retCode < 0) { - Slog.w(TAG, "Couldn't remove cache files for package: " + Slog.w(TAG, "Couldn't remove cache files for package " + packageName + " u" + userId); return false; } @@ -14744,7 +14682,7 @@ public class PackageManagerService extends IPackageManager.Stub { } synchronized (mPackages) { Slog.i(TAG, "Adding persistent preferred activity " + activity + " for user " + userId + - " :"); + ":"); filter.dump(new LogPrinter(Log.INFO, TAG), " "); mSettings.editPersistentPreferredActivitiesLPw(userId).addFilter( new PersistentPreferredActivity(filter, activity)); @@ -15149,12 +15087,10 @@ public class PackageManagerService extends IPackageManager.Stub { pkgSetting = mSettings.mPackages.get(packageName); if (pkgSetting == null) { if (className == null) { - throw new IllegalArgumentException( - "Unknown package: " + packageName); + throw new IllegalArgumentException("Unknown package: " + packageName); } throw new IllegalArgumentException( - "Unknown component: " + packageName - + "/" + className); + "Unknown component: " + packageName + "/" + className); } // Allow root and verify that userId is not being specified by a different user if (!allowedByPermission && !UserHandle.isSameApp(uid, pkgSetting.appId)) { @@ -17196,7 +17132,7 @@ public class PackageManagerService extends IPackageManager.Stub { synchronized(mPackages) { final PackageParser.Package pkg = mPackages.get(packageName); if (pkg == null) { - Slog.w(TAG, "KeySet requested for unknown package:" + packageName); + Slog.w(TAG, "KeySet requested for unknown package: " + packageName); throw new IllegalArgumentException("Unknown package: " + packageName); } KeySetManagerService ksms = mSettings.mKeySetManagerService; @@ -17212,7 +17148,7 @@ public class PackageManagerService extends IPackageManager.Stub { synchronized(mPackages) { final PackageParser.Package pkg = mPackages.get(packageName); if (pkg == null) { - Slog.w(TAG, "KeySet requested for unknown package:" + packageName); + Slog.w(TAG, "KeySet requested for unknown package: " + packageName); throw new IllegalArgumentException("Unknown package: " + packageName); } if (pkg.applicationInfo.uid != Binder.getCallingUid() @@ -17232,7 +17168,7 @@ public class PackageManagerService extends IPackageManager.Stub { synchronized(mPackages) { final PackageParser.Package pkg = mPackages.get(packageName); if (pkg == null) { - Slog.w(TAG, "KeySet requested for unknown package:" + packageName); + Slog.w(TAG, "KeySet requested for unknown package: " + packageName); throw new IllegalArgumentException("Unknown package: " + packageName); } IBinder ksh = ks.getToken(); @@ -17252,7 +17188,7 @@ public class PackageManagerService extends IPackageManager.Stub { synchronized(mPackages) { final PackageParser.Package pkg = mPackages.get(packageName); if (pkg == null) { - Slog.w(TAG, "KeySet requested for unknown package:" + packageName); + Slog.w(TAG, "KeySet requested for unknown package: " + packageName); throw new IllegalArgumentException("Unknown package: " + packageName); } IBinder ksh = ks.getToken(); diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java index b33013995350..3f9ce7a64aae 100644 --- a/services/core/java/com/android/server/pm/Settings.java +++ b/services/core/java/com/android/server/pm/Settings.java @@ -16,23 +16,42 @@ package com.android.server.pm; +import static android.Manifest.permission.READ_EXTERNAL_STORAGE; import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DEFAULT; import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED; import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED; import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER; import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_ENABLED; -import static android.Manifest.permission.READ_EXTERNAL_STORAGE; import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS; import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED; -import static android.os.Process.SYSTEM_UID; +import static android.content.pm.PackageManager.MATCH_DEFAULT_ONLY; +import static android.content.pm.PackageManager.MATCH_DISABLED_COMPONENTS; +import static android.content.pm.PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS; +import static android.content.pm.PackageManager.MATCH_ENCRYPTION_AWARE; +import static android.content.pm.PackageManager.MATCH_ENCRYPTION_UNAWARE; +import static android.content.pm.PackageManager.MATCH_SYSTEM_ONLY; import static android.os.Process.PACKAGE_INFO_GID; +import static android.os.Process.SYSTEM_UID; + import static com.android.server.pm.PackageManagerService.DEBUG_DOMAIN_VERIFICATION; import android.annotation.NonNull; +import android.content.ComponentName; +import android.content.Intent; import android.content.IntentFilter; import android.content.pm.ActivityInfo; +import android.content.pm.ApplicationInfo; +import android.content.pm.ComponentInfo; import android.content.pm.IntentFilterVerificationInfo; +import android.content.pm.PackageCleanItem; +import android.content.pm.PackageManager; +import android.content.pm.PackageParser; +import android.content.pm.PackageUserState; +import android.content.pm.PermissionInfo; import android.content.pm.ResolveInfo; +import android.content.pm.Signature; +import android.content.pm.UserInfo; +import android.content.pm.VerifierDeviceIdentity; import android.net.Uri; import android.os.Binder; import android.os.Build; @@ -47,11 +66,18 @@ import android.os.UserHandle; import android.os.UserManager; import android.os.storage.StorageManager; import android.os.storage.VolumeInfo; -import android.util.AtomicFile; import android.text.TextUtils; +import android.util.ArrayMap; +import android.util.ArraySet; +import android.util.AtomicFile; +import android.util.Log; import android.util.LogPrinter; +import android.util.Slog; +import android.util.SparseArray; import android.util.SparseBooleanArray; +import android.util.SparseIntArray; import android.util.SparseLongArray; +import android.util.Xml; import com.android.internal.annotations.GuardedBy; import com.android.internal.os.BackgroundThread; @@ -65,58 +91,37 @@ import com.android.server.backup.PreferredActivityBackupHelper; import com.android.server.pm.PackageManagerService.DumpState; import com.android.server.pm.PermissionsState.PermissionState; -import java.io.BufferedInputStream; -import java.io.BufferedWriter; -import java.io.FileNotFoundException; -import java.io.InputStream; -import java.io.OutputStreamWriter; -import java.nio.charset.Charset; -import java.util.Collection; +import libcore.io.IoUtils; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlSerializer; -import android.content.ComponentName; -import android.content.Intent; -import android.content.pm.ApplicationInfo; -import android.content.pm.ComponentInfo; -import android.content.pm.PackageCleanItem; -import android.content.pm.PackageManager; -import android.content.pm.PackageParser; -import android.content.pm.PermissionInfo; -import android.content.pm.Signature; -import android.content.pm.UserInfo; -import android.content.pm.PackageUserState; -import android.content.pm.VerifierDeviceIdentity; -import android.util.ArrayMap; -import android.util.ArraySet; -import android.util.Log; -import android.util.Slog; -import android.util.SparseArray; -import android.util.SparseIntArray; -import android.util.Xml; - +import java.io.BufferedInputStream; import java.io.BufferedOutputStream; +import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; +import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; import java.io.PrintWriter; +import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.Objects; import java.util.Set; -import java.util.Map.Entry; - -import libcore.io.IoUtils; /** * Holds information about dynamic settings. @@ -426,7 +431,7 @@ final class Settings { boolean disableSystemPackageLPw(String name) { final PackageSetting p = mPackages.get(name); if(p == null) { - Log.w(PackageManagerService.TAG, "Package:"+name+" is not an installed package"); + Log.w(PackageManagerService.TAG, "Package " + name + " is not an installed package"); return false; } final PackageSetting dp = mDisabledSysPackages.get(name); @@ -451,7 +456,7 @@ final class Settings { PackageSetting enableSystemPackageLPw(String name) { PackageSetting p = mDisabledSysPackages.get(name); if(p == null) { - Log.w(PackageManagerService.TAG, "Package:"+name+" is not disabled"); + Log.w(PackageManagerService.TAG, "Package " + name + " is not disabled"); return null; } // Reset flag in ApplicationInfo object @@ -1338,7 +1343,7 @@ final class Settings { throws XmlPullParserException, IOException { IntentFilterVerificationInfo ivi = new IntentFilterVerificationInfo(parser); packageSetting.setIntentFilterVerificationInfo(ivi); - Log.d(TAG, "Read domain verification for package:" + ivi.getPackageName()); + Log.d(TAG, "Read domain verification for package: " + ivi.getPackageName()); } private void readRestoredIntentFilterVerifications(XmlPullParser parser) @@ -1472,7 +1477,7 @@ final class Settings { String name = parser.getAttributeValue(null, ATTR_NAME); ps = mPackages.get(name); if (ps == null) { - Slog.w(PackageManagerService.TAG, "No package known for stopped package: " + Slog.w(PackageManagerService.TAG, "No package known for stopped package " + name); XmlUtils.skipCurrentTag(parser); continue; @@ -2036,7 +2041,7 @@ final class Settings { } } else { Slog.w(PackageManagerService.TAG, - "No package known for stopped package: " + name); + "No package known for stopped package " + name); } XmlUtils.skipCurrentTag(parser); } else { @@ -2857,7 +2862,7 @@ final class Settings { for (int i=0; i<tmpPa.countCategories(); i++) { String cat = tmpPa.getCategory(i); if (cat.equals(Intent.CATEGORY_DEFAULT)) { - flags |= PackageManager.MATCH_DEFAULT_ONLY; + flags |= MATCH_DEFAULT_ONLY; } else { intent.addCategory(cat); } @@ -3007,7 +3012,7 @@ final class Settings { filter.addCategory(cat); } } - if ((flags&PackageManager.MATCH_DEFAULT_ONLY) != 0) { + if ((flags & MATCH_DEFAULT_ONLY) != 0) { filter.addCategory(Intent.CATEGORY_DEFAULT); } if (scheme != null) { @@ -3799,7 +3804,7 @@ final class Settings { } private boolean isEnabledLPr(ComponentInfo componentInfo, int flags, int userId) { - if ((flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) { + if ((flags & MATCH_DISABLED_COMPONENTS) != 0) { return true; } final PackageSetting packageSettings = mPackages.get(componentInfo.packageName); @@ -3815,7 +3820,7 @@ final class Settings { return false; } PackageUserState ustate = packageSettings.readUserState(userId); - if ((flags&PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS) != 0) { + if ((flags & MATCH_DISABLED_UNTIL_USED_COMPONENTS) != 0) { if (ustate.enabled == COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED) { return true; } @@ -3839,16 +3844,16 @@ final class Settings { } private boolean isMatchLPr(ComponentInfo componentInfo, int flags) { - if ((flags & PackageManager.MATCH_SYSTEM_ONLY) != 0) { + if ((flags & MATCH_SYSTEM_ONLY) != 0) { final PackageSetting ps = mPackages.get(componentInfo.packageName); if ((ps.pkgFlags & ApplicationInfo.FLAG_SYSTEM) == 0) { return false; } } - final boolean matchesUnaware = ((flags & PackageManager.MATCH_ENCRYPTION_UNAWARE) != 0) + final boolean matchesUnaware = ((flags & MATCH_ENCRYPTION_UNAWARE) != 0) && !componentInfo.encryptionAware; - final boolean matchesAware = ((flags & PackageManager.MATCH_ENCRYPTION_AWARE) != 0) + final boolean matchesAware = ((flags & MATCH_ENCRYPTION_AWARE) != 0) && componentInfo.encryptionAware; return matchesUnaware || matchesAware; } diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 213f14b8c679..f6e62f6cffb6 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -3888,7 +3888,7 @@ public class WindowManagerService extends IWindowManager.Stub return false; } WindowState startingWindow = ttoken.startingWindow; - if (startingWindow != null) { + if (startingWindow != null && ttoken.startingView != null) { // In this case, the starting icon has already been displayed, so start // letting windows get shown immediately without any more transitions. mSkipAppTransitionAnimation = true; diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index 7d1e66f2787c..53edc78960d0 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -1790,7 +1790,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { enforceCrossUserPermission(userHandle); Intent resolveIntent = new Intent(); resolveIntent.setComponent(adminName); - List<ResolveInfo> infos = mContext.getPackageManager().queryBroadcastReceivers( + List<ResolveInfo> infos = mContext.getPackageManager().queryBroadcastReceiversAsUser( resolveIntent, PackageManager.GET_META_DATA | PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS, userHandle); @@ -3618,7 +3618,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } try { - int uid = mContext.getPackageManager().getPackageUid( + int uid = mContext.getPackageManager().getPackageUidAsUser( policy.mDelegatedCertInstallerPackage, userHandle); return uid == callingUid; } catch (NameNotFoundException e) { @@ -4778,7 +4778,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { Preconditions.checkNotNull(packageName, "packageName is null"); final int callingUid = mInjector.binderGetCallingUid(); try { - int uid = mContext.getPackageManager().getPackageUid(packageName, 0); + int uid = mContext.getPackageManager().getPackageUidAsUser(packageName, 0); if (uid != callingUid) { throw new SecurityException("Invalid packageName"); } @@ -5287,7 +5287,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } try { - int uid = mContext.getPackageManager().getPackageUid( + int uid = mContext.getPackageManager().getPackageUidAsUser( policy.mApplicationRestrictionsManagingPackage, userHandle); return uid == callingUid; } catch (NameNotFoundException e) { diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java index 8270eef26d0d..672058bca8d7 100644 --- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java @@ -758,7 +758,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { when(mContext.userManager.getUserRestrictions()).thenReturn(new Bundle()); // Now call clear. - doReturn(DpmMockContext.CALLER_SYSTEM_USER_UID).when(mContext.packageManager).getPackageUid( + doReturn(DpmMockContext.CALLER_SYSTEM_USER_UID).when(mContext.packageManager).getPackageUidAsUser( eq(admin1.getPackageName()), anyInt()); dpm.clearDeviceOwnerApp(admin1.getPackageName()); @@ -797,7 +797,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { mContext.binder.callingUid = DpmMockContext.CALLER_UID; // Now call clear. - doReturn(DpmMockContext.CALLER_UID).when(mContext.packageManager).getPackageUid( + doReturn(DpmMockContext.CALLER_UID).when(mContext.packageManager).getPackageUidAsUser( eq(admin1.getPackageName()), anyInt()); try { @@ -951,7 +951,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { final int appRestrictionsManagerAppId = 20987; final int appRestrictionsManagerUid = UserHandle.getUid( DpmMockContext.CALLER_USER_HANDLE, appRestrictionsManagerAppId); - doReturn(appRestrictionsManagerUid).when(mContext.packageManager).getPackageUid( + doReturn(appRestrictionsManagerUid).when(mContext.packageManager).getPackageUidAsUser( eq(appRestrictionsManagerPackage), eq(DpmMockContext.CALLER_USER_HANDLE)); mContext.binder.callingUid = appRestrictionsManagerUid; diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DpmTestBase.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DpmTestBase.java index 5b33e4d4ca40..c557ab7e1e93 100644 --- a/services/tests/servicestests/src/com/android/server/devicepolicy/DpmTestBase.java +++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DpmTestBase.java @@ -117,7 +117,7 @@ public abstract class DpmTestBase extends AndroidTestCase { // We need to rewrite the UID in the activity info. realResolveInfo.get(0).activityInfo.applicationInfo = ai; - doReturn(realResolveInfo).when(mMockContext.packageManager).queryBroadcastReceivers( + doReturn(realResolveInfo).when(mMockContext.packageManager).queryBroadcastReceiversAsUser( MockUtils.checkIntentComponent(admin), eq(PackageManager.GET_META_DATA | PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS), diff --git a/services/usage/java/com/android/server/usage/UsageStatsService.java b/services/usage/java/com/android/server/usage/UsageStatsService.java index 2b0919b7bfc0..23e889406394 100644 --- a/services/usage/java/com/android/server/usage/UsageStatsService.java +++ b/services/usage/java/com/android/server/usage/UsageStatsService.java @@ -374,7 +374,7 @@ public class UsageStatsService extends SystemService implements for (int i = 0; i < userIds.length; i++) { final int userId = userIds[i]; List<PackageInfo> packages = - getContext().getPackageManager().getInstalledPackages( + getContext().getPackageManager().getInstalledPackagesAsUser( PackageManager.GET_DISABLED_COMPONENTS | PackageManager.GET_UNINSTALLED_PACKAGES, userId); diff --git a/services/usage/java/com/android/server/usage/UserUsageStatsService.java b/services/usage/java/com/android/server/usage/UserUsageStatsService.java index 5188e5fd1f7d..72621a422ce6 100644 --- a/services/usage/java/com/android/server/usage/UserUsageStatsService.java +++ b/services/usage/java/com/android/server/usage/UserUsageStatsService.java @@ -148,7 +148,7 @@ class UserUsageStatsService { private void initializeDefaultsForApps(long currentTimeMillis, long deviceUsageTime, boolean firstUpdate) { PackageManager pm = mContext.getPackageManager(); - List<PackageInfo> packages = pm.getInstalledPackages(0, mUserId); + List<PackageInfo> packages = pm.getInstalledPackagesAsUser(0, mUserId); final int packageCount = packages.size(); for (int i = 0; i < packageCount; i++) { final PackageInfo pi = packages.get(i); diff --git a/test-runner/src/android/test/mock/MockPackageManager.java b/test-runner/src/android/test/mock/MockPackageManager.java index 2cef1b3273a9..85d567d8e369 100644 --- a/test-runner/src/android/test/mock/MockPackageManager.java +++ b/test-runner/src/android/test/mock/MockPackageManager.java @@ -103,7 +103,7 @@ public class MockPackageManager extends PackageManager { /** @hide */ @Override - public int getPackageUid(String packageName, int userHandle) + public int getPackageUidAsUser(String packageName, int userHandle) throws NameNotFoundException { throw new UnsupportedOperationException(); } @@ -174,7 +174,7 @@ public class MockPackageManager extends PackageManager { /** @hide */ @Override - public List<PackageInfo> getInstalledPackages(int flags, int userId) { + public List<PackageInfo> getInstalledPackagesAsUser(int flags, int userId) { throw new UnsupportedOperationException(); } @@ -355,7 +355,7 @@ public class MockPackageManager extends PackageManager { /** @hide */ @Override - public List<ResolveInfo> queryBroadcastReceivers(Intent intent, int flags, int userId) { + public List<ResolveInfo> queryBroadcastReceiversAsUser(Intent intent, int flags, int userId) { throw new UnsupportedOperationException(); } @@ -746,7 +746,7 @@ public class MockPackageManager extends PackageManager { * @hide - to match hiding in superclass */ @Override - public void getPackageSizeInfo(String packageName, int userHandle, + public void getPackageSizeInfoAsUser(String packageName, int userHandle, IPackageStatsObserver observer) { throw new UnsupportedOperationException(); } @@ -890,7 +890,7 @@ public class MockPackageManager extends PackageManager { * @hide */ @Override - public int getIntentVerificationStatus(String packageName, int userId) { + public int getIntentVerificationStatusAsUser(String packageName, int userId) { throw new UnsupportedOperationException(); } @@ -898,7 +898,7 @@ public class MockPackageManager extends PackageManager { * @hide */ @Override - public boolean updateIntentVerificationStatus(String packageName, int status, int userId) { + public boolean updateIntentVerificationStatusAsUser(String packageName, int status, int userId) { throw new UnsupportedOperationException(); } @@ -915,16 +915,30 @@ public class MockPackageManager extends PackageManager { throw new UnsupportedOperationException(); } - @Override + /** {@removed} */ + @Deprecated public String getDefaultBrowserPackageName(int userId) { throw new UnsupportedOperationException(); } + /** {@hide} */ @Override + public String getDefaultBrowserPackageNameAsUser(int userId) { + throw new UnsupportedOperationException(); + } + + /** {@removed} */ + @Deprecated public boolean setDefaultBrowserPackageName(String packageName, int userId) { throw new UnsupportedOperationException(); } + /** {@hide} */ + @Override + public boolean setDefaultBrowserPackageNameAsUser(String packageName, int userId) { + throw new UnsupportedOperationException(); + } + /** * @hide */ diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePackageManager.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePackageManager.java index 3f9574f3ba83..27751eb7d267 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePackageManager.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePackageManager.java @@ -97,7 +97,7 @@ public class BridgePackageManager extends PackageManager { } @Override - public int getPackageUid(String packageName, int userHandle) throws NameNotFoundException { + public int getPackageUidAsUser(String packageName, int userHandle) throws NameNotFoundException { return 0; } @@ -164,7 +164,7 @@ public class BridgePackageManager extends PackageManager { } @Override - public List<PackageInfo> getInstalledPackages(int flags, int userId) { + public List<PackageInfo> getInstalledPackagesAsUser(int flags, int userId) { return null; } @@ -328,7 +328,7 @@ public class BridgePackageManager extends PackageManager { } @Override - public List<ResolveInfo> queryBroadcastReceivers(Intent intent, int flags, int userId) { + public List<ResolveInfo> queryBroadcastReceiversAsUser(Intent intent, int flags, int userId) { return null; } @@ -578,12 +578,12 @@ public class BridgePackageManager extends PackageManager { } @Override - public int getIntentVerificationStatus(String packageName, int userId) { + public int getIntentVerificationStatusAsUser(String packageName, int userId) { return 0; } @Override - public boolean updateIntentVerificationStatus(String packageName, int status, int userId) { + public boolean updateIntentVerificationStatusAsUser(String packageName, int status, int userId) { return false; } @@ -598,12 +598,12 @@ public class BridgePackageManager extends PackageManager { } @Override - public String getDefaultBrowserPackageName(int userId) { + public String getDefaultBrowserPackageNameAsUser(int userId) { return null; } @Override - public boolean setDefaultBrowserPackageName(String packageName, int userId) { + public boolean setDefaultBrowserPackageNameAsUser(String packageName, int userId) { return false; } @@ -643,7 +643,7 @@ public class BridgePackageManager extends PackageManager { } @Override - public void getPackageSizeInfo(String packageName, int userHandle, + public void getPackageSizeInfoAsUser(String packageName, int userHandle, IPackageStatsObserver observer) { } |