Loading api/current.txt +2 −0 Original line number Diff line number Diff line Loading @@ -4749,6 +4749,8 @@ package android.app.admin { } public class DevicePolicyManager { method public void addPersistentPreferredActivity(android.content.ComponentName, android.content.IntentFilter, android.content.ComponentName); method public void clearPackagePersistentPreferredActivities(android.content.ComponentName, java.lang.String); method public java.util.List<android.content.ComponentName> getActiveAdmins(); method public boolean getCameraDisabled(android.content.ComponentName); method public int getCurrentFailedPasswordAttempts(); core/java/android/app/admin/DevicePolicyManager.java +50 −0 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import android.annotation.SdkConstant; import android.annotation.SdkConstant.SdkConstantType; import android.content.ComponentName; import android.content.Context; import android.content.IntentFilter; import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; Loading Loading @@ -1766,4 +1767,53 @@ public class DevicePolicyManager { } return null; } /** * Called by a profile owner or device owner to add a default intent handler activity for * intents that match a certain intent filter. This activity will remain the default intent * handler even if the set of potential event handlers for the intent filter changes and if * the intent preferences are reset. * * <p>The default disambiguation mechanism takes over if the activity is not installed * (anymore). When the activity is (re)installed, it is automatically reset as default * intent handler for the filter. * * <p>The calling device admin must be a profile owner or device owner. If it is not, a * security exception will be thrown. * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. * @param filter The IntentFilter for which a default handler is added. * @param activity The Activity that is added as default intent handler. */ public void addPersistentPreferredActivity(ComponentName admin, IntentFilter filter, ComponentName activity) { if (mService != null) { try { mService.addPersistentPreferredActivity(admin, filter, activity); } catch (RemoteException e) { Log.w(TAG, "Failed talking with device policy service", e); } } } /** * Called by a profile owner or device owner to remove all persistent intent handler preferences * associated with the given package that were set by {@link addPersistentPreferredActivity}. * * <p>The calling device admin must be a profile owner. If it is not, a security * exception will be thrown. * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. * @param packageName The name of the package for which preferences are removed. */ public void clearPackagePersistentPreferredActivities(ComponentName admin, String packageName) { if (mService != null) { try { mService.clearPackagePersistentPreferredActivities(admin, packageName); } catch (RemoteException e) { Log.w(TAG, "Failed talking with device policy service", e); } } } } core/java/android/app/admin/IDevicePolicyManager.aidl +4 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package android.app.admin; import android.content.ComponentName; import android.content.IntentFilter; import android.os.RemoteCallback; /** Loading Loading @@ -109,4 +110,7 @@ interface IDevicePolicyManager { boolean installCaCert(in byte[] certBuffer); void uninstallCaCert(in byte[] certBuffer); void addPersistentPreferredActivity(in ComponentName admin, in IntentFilter filter, in ComponentName activity); void clearPackagePersistentPreferredActivities(in ComponentName admin, String packageName); } core/java/android/content/pm/IPackageManager.aidl +4 −0 Original line number Diff line number Diff line Loading @@ -237,6 +237,10 @@ interface IPackageManager { int getPreferredActivities(out List<IntentFilter> outFilters, out List<ComponentName> outActivities, String packageName); void addPersistentPreferredActivity(in IntentFilter filter, in ComponentName activity, int userId); void clearPackagePersistentPreferredActivities(String packageName, int userId); /** * Report the set of 'Home' activity candidates, plus (if any) which of them * is the current "always use this one" setting. Loading services/core/java/com/android/server/pm/PackageManagerService.java +132 −0 Original line number Diff line number Diff line Loading @@ -2777,6 +2777,63 @@ public class PackageManagerService extends IPackageManager.Stub { return null; } private ResolveInfo findPersistentPreferredActivityLP(Intent intent, String resolvedType, int flags, List<ResolveInfo> query, boolean debug, int userId) { final int N = query.size(); PersistentPreferredIntentResolver ppir = mSettings.mPersistentPreferredActivities .get(userId); // Get the list of persistent preferred activities that handle the intent if (DEBUG_PREFERRED || debug) Slog.v(TAG, "Looking for presistent preferred activities..."); List<PersistentPreferredActivity> pprefs = ppir != null ? ppir.queryIntent(intent, resolvedType, (flags & PackageManager.MATCH_DEFAULT_ONLY) != 0, userId) : null; if (pprefs != null && pprefs.size() > 0) { final int M = pprefs.size(); for (int i=0; i<M; i++) { final PersistentPreferredActivity ppa = pprefs.get(i); if (DEBUG_PREFERRED || debug) { Slog.v(TAG, "Checking PersistentPreferredActivity ds=" + (ppa.countDataSchemes() > 0 ? ppa.getDataScheme(0) : "<none>") + "\n component=" + ppa.mComponent); ppa.dump(new LogPrinter(Log.VERBOSE, TAG, Log.LOG_ID_SYSTEM), " "); } final ActivityInfo ai = getActivityInfo(ppa.mComponent, flags | PackageManager.GET_DISABLED_COMPONENTS, userId); if (DEBUG_PREFERRED || debug) { Slog.v(TAG, "Found persistent preferred activity:"); if (ai != null) { ai.dump(new LogPrinter(Log.VERBOSE, TAG, Log.LOG_ID_SYSTEM), " "); } else { Slog.v(TAG, " null"); } } if (ai == null) { // This previously registered persistent preferred activity // component is no longer known. Ignore it and do NOT remove it. continue; } for (int j=0; j<N; j++) { final ResolveInfo ri = query.get(j); if (!ri.activityInfo.applicationInfo.packageName .equals(ai.applicationInfo.packageName)) { continue; } if (!ri.activityInfo.name.equals(ai.name)) { continue; } // Found a persistent preference that can handle the intent. if (DEBUG_PREFERRED || debug) { Slog.v(TAG, "Returning persistent preferred activity: " + ri.activityInfo.packageName + "/" + ri.activityInfo.name); } return ri; } } } return null; } ResolveInfo findPreferredActivity(Intent intent, String resolvedType, int flags, List<ResolveInfo> query, int priority, boolean always, boolean removeMatches, boolean debug, int userId) { Loading @@ -2787,6 +2844,16 @@ public class PackageManagerService extends IPackageManager.Stub { intent = intent.getSelector(); } if (DEBUG_PREFERRED) intent.addFlags(Intent.FLAG_DEBUG_LOG_RESOLUTION); // Try to find a matching persistent preferred activity. ResolveInfo pri = findPersistentPreferredActivityLP(intent, resolvedType, flags, query, debug, userId); // If a persistent preferred activity matched, use it. if (pri != null) { return pri; } PreferredIntentResolver pir = mSettings.mPreferredActivities.get(userId); // Get the list of preferred activities that handle the intent if (DEBUG_PREFERRED || debug) Slog.v(TAG, "Looking for preferred activities..."); Loading Loading @@ -10340,6 +10407,71 @@ public class PackageManagerService extends IPackageManager.Stub { return num; } @Override public void addPersistentPreferredActivity(IntentFilter filter, ComponentName activity, int userId) { int callingUid = Binder.getCallingUid(); if (callingUid != Process.SYSTEM_UID) { throw new SecurityException( "addPersistentPreferredActivity can only be run by the system"); } if (filter.countActions() == 0) { Slog.w(TAG, "Cannot set a preferred activity with no filter actions"); return; } 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)); mSettings.writePackageRestrictionsLPr(userId); } } @Override public void clearPackagePersistentPreferredActivities(String packageName, int userId) { int callingUid = Binder.getCallingUid(); if (callingUid != Process.SYSTEM_UID) { throw new SecurityException( "clearPackagePersistentPreferredActivities can only be run by the system"); } ArrayList<PersistentPreferredActivity> removed = null; boolean changed = false; synchronized (mPackages) { for (int i=0; i<mSettings.mPersistentPreferredActivities.size(); i++) { final int thisUserId = mSettings.mPersistentPreferredActivities.keyAt(i); PersistentPreferredIntentResolver ppir = mSettings.mPersistentPreferredActivities .valueAt(i); if (userId != thisUserId) { continue; } Iterator<PersistentPreferredActivity> it = ppir.filterIterator(); while (it.hasNext()) { PersistentPreferredActivity ppa = it.next(); // Mark entry for removal only if it matches the package name. if (ppa.mComponent.getPackageName().equals(packageName)) { if (removed == null) { removed = new ArrayList<PersistentPreferredActivity>(); } removed.add(ppa); } } if (removed != null) { for (int j=0; j<removed.size(); j++) { PersistentPreferredActivity ppa = removed.get(j); ppir.removeFilter(ppa); } changed = true; } } if (changed) { mSettings.writePackageRestrictionsLPr(userId); } } } @Override public ComponentName getHomeActivities(List<ResolveInfo> allHomeCandidates) { Intent intent = new Intent(Intent.ACTION_MAIN); Loading Loading
api/current.txt +2 −0 Original line number Diff line number Diff line Loading @@ -4749,6 +4749,8 @@ package android.app.admin { } public class DevicePolicyManager { method public void addPersistentPreferredActivity(android.content.ComponentName, android.content.IntentFilter, android.content.ComponentName); method public void clearPackagePersistentPreferredActivities(android.content.ComponentName, java.lang.String); method public java.util.List<android.content.ComponentName> getActiveAdmins(); method public boolean getCameraDisabled(android.content.ComponentName); method public int getCurrentFailedPasswordAttempts();
core/java/android/app/admin/DevicePolicyManager.java +50 −0 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import android.annotation.SdkConstant; import android.annotation.SdkConstant.SdkConstantType; import android.content.ComponentName; import android.content.Context; import android.content.IntentFilter; import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; Loading Loading @@ -1766,4 +1767,53 @@ public class DevicePolicyManager { } return null; } /** * Called by a profile owner or device owner to add a default intent handler activity for * intents that match a certain intent filter. This activity will remain the default intent * handler even if the set of potential event handlers for the intent filter changes and if * the intent preferences are reset. * * <p>The default disambiguation mechanism takes over if the activity is not installed * (anymore). When the activity is (re)installed, it is automatically reset as default * intent handler for the filter. * * <p>The calling device admin must be a profile owner or device owner. If it is not, a * security exception will be thrown. * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. * @param filter The IntentFilter for which a default handler is added. * @param activity The Activity that is added as default intent handler. */ public void addPersistentPreferredActivity(ComponentName admin, IntentFilter filter, ComponentName activity) { if (mService != null) { try { mService.addPersistentPreferredActivity(admin, filter, activity); } catch (RemoteException e) { Log.w(TAG, "Failed talking with device policy service", e); } } } /** * Called by a profile owner or device owner to remove all persistent intent handler preferences * associated with the given package that were set by {@link addPersistentPreferredActivity}. * * <p>The calling device admin must be a profile owner. If it is not, a security * exception will be thrown. * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. * @param packageName The name of the package for which preferences are removed. */ public void clearPackagePersistentPreferredActivities(ComponentName admin, String packageName) { if (mService != null) { try { mService.clearPackagePersistentPreferredActivities(admin, packageName); } catch (RemoteException e) { Log.w(TAG, "Failed talking with device policy service", e); } } } }
core/java/android/app/admin/IDevicePolicyManager.aidl +4 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package android.app.admin; import android.content.ComponentName; import android.content.IntentFilter; import android.os.RemoteCallback; /** Loading Loading @@ -109,4 +110,7 @@ interface IDevicePolicyManager { boolean installCaCert(in byte[] certBuffer); void uninstallCaCert(in byte[] certBuffer); void addPersistentPreferredActivity(in ComponentName admin, in IntentFilter filter, in ComponentName activity); void clearPackagePersistentPreferredActivities(in ComponentName admin, String packageName); }
core/java/android/content/pm/IPackageManager.aidl +4 −0 Original line number Diff line number Diff line Loading @@ -237,6 +237,10 @@ interface IPackageManager { int getPreferredActivities(out List<IntentFilter> outFilters, out List<ComponentName> outActivities, String packageName); void addPersistentPreferredActivity(in IntentFilter filter, in ComponentName activity, int userId); void clearPackagePersistentPreferredActivities(String packageName, int userId); /** * Report the set of 'Home' activity candidates, plus (if any) which of them * is the current "always use this one" setting. Loading
services/core/java/com/android/server/pm/PackageManagerService.java +132 −0 Original line number Diff line number Diff line Loading @@ -2777,6 +2777,63 @@ public class PackageManagerService extends IPackageManager.Stub { return null; } private ResolveInfo findPersistentPreferredActivityLP(Intent intent, String resolvedType, int flags, List<ResolveInfo> query, boolean debug, int userId) { final int N = query.size(); PersistentPreferredIntentResolver ppir = mSettings.mPersistentPreferredActivities .get(userId); // Get the list of persistent preferred activities that handle the intent if (DEBUG_PREFERRED || debug) Slog.v(TAG, "Looking for presistent preferred activities..."); List<PersistentPreferredActivity> pprefs = ppir != null ? ppir.queryIntent(intent, resolvedType, (flags & PackageManager.MATCH_DEFAULT_ONLY) != 0, userId) : null; if (pprefs != null && pprefs.size() > 0) { final int M = pprefs.size(); for (int i=0; i<M; i++) { final PersistentPreferredActivity ppa = pprefs.get(i); if (DEBUG_PREFERRED || debug) { Slog.v(TAG, "Checking PersistentPreferredActivity ds=" + (ppa.countDataSchemes() > 0 ? ppa.getDataScheme(0) : "<none>") + "\n component=" + ppa.mComponent); ppa.dump(new LogPrinter(Log.VERBOSE, TAG, Log.LOG_ID_SYSTEM), " "); } final ActivityInfo ai = getActivityInfo(ppa.mComponent, flags | PackageManager.GET_DISABLED_COMPONENTS, userId); if (DEBUG_PREFERRED || debug) { Slog.v(TAG, "Found persistent preferred activity:"); if (ai != null) { ai.dump(new LogPrinter(Log.VERBOSE, TAG, Log.LOG_ID_SYSTEM), " "); } else { Slog.v(TAG, " null"); } } if (ai == null) { // This previously registered persistent preferred activity // component is no longer known. Ignore it and do NOT remove it. continue; } for (int j=0; j<N; j++) { final ResolveInfo ri = query.get(j); if (!ri.activityInfo.applicationInfo.packageName .equals(ai.applicationInfo.packageName)) { continue; } if (!ri.activityInfo.name.equals(ai.name)) { continue; } // Found a persistent preference that can handle the intent. if (DEBUG_PREFERRED || debug) { Slog.v(TAG, "Returning persistent preferred activity: " + ri.activityInfo.packageName + "/" + ri.activityInfo.name); } return ri; } } } return null; } ResolveInfo findPreferredActivity(Intent intent, String resolvedType, int flags, List<ResolveInfo> query, int priority, boolean always, boolean removeMatches, boolean debug, int userId) { Loading @@ -2787,6 +2844,16 @@ public class PackageManagerService extends IPackageManager.Stub { intent = intent.getSelector(); } if (DEBUG_PREFERRED) intent.addFlags(Intent.FLAG_DEBUG_LOG_RESOLUTION); // Try to find a matching persistent preferred activity. ResolveInfo pri = findPersistentPreferredActivityLP(intent, resolvedType, flags, query, debug, userId); // If a persistent preferred activity matched, use it. if (pri != null) { return pri; } PreferredIntentResolver pir = mSettings.mPreferredActivities.get(userId); // Get the list of preferred activities that handle the intent if (DEBUG_PREFERRED || debug) Slog.v(TAG, "Looking for preferred activities..."); Loading Loading @@ -10340,6 +10407,71 @@ public class PackageManagerService extends IPackageManager.Stub { return num; } @Override public void addPersistentPreferredActivity(IntentFilter filter, ComponentName activity, int userId) { int callingUid = Binder.getCallingUid(); if (callingUid != Process.SYSTEM_UID) { throw new SecurityException( "addPersistentPreferredActivity can only be run by the system"); } if (filter.countActions() == 0) { Slog.w(TAG, "Cannot set a preferred activity with no filter actions"); return; } 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)); mSettings.writePackageRestrictionsLPr(userId); } } @Override public void clearPackagePersistentPreferredActivities(String packageName, int userId) { int callingUid = Binder.getCallingUid(); if (callingUid != Process.SYSTEM_UID) { throw new SecurityException( "clearPackagePersistentPreferredActivities can only be run by the system"); } ArrayList<PersistentPreferredActivity> removed = null; boolean changed = false; synchronized (mPackages) { for (int i=0; i<mSettings.mPersistentPreferredActivities.size(); i++) { final int thisUserId = mSettings.mPersistentPreferredActivities.keyAt(i); PersistentPreferredIntentResolver ppir = mSettings.mPersistentPreferredActivities .valueAt(i); if (userId != thisUserId) { continue; } Iterator<PersistentPreferredActivity> it = ppir.filterIterator(); while (it.hasNext()) { PersistentPreferredActivity ppa = it.next(); // Mark entry for removal only if it matches the package name. if (ppa.mComponent.getPackageName().equals(packageName)) { if (removed == null) { removed = new ArrayList<PersistentPreferredActivity>(); } removed.add(ppa); } } if (removed != null) { for (int j=0; j<removed.size(); j++) { PersistentPreferredActivity ppa = removed.get(j); ppir.removeFilter(ppa); } changed = true; } } if (changed) { mSettings.writePackageRestrictionsLPr(userId); } } } @Override public ComponentName getHomeActivities(List<ResolveInfo> allHomeCandidates) { Intent intent = new Intent(Intent.ACTION_MAIN); Loading