@@ -1300,27 +1300,6 @@ public PackageManagerService(Context context, Installer installer,
13001300 ? (UPDATE_PERMISSIONS_REPLACE_PKG |UPDATE_PERMISSIONS_REPLACE_ALL )
13011301 : 0 ));
13021302
1303- // Verify that all of the preferred activity components actually
1304- // exist. It is possible for applications to be updated and at
1305- // that point remove a previously declared activity component that
1306- // had been set as a preferred activity. We try to clean this up
1307- // the next time we encounter that preferred activity, but it is
1308- // possible for the user flow to never be able to return to that
1309- // situation so here we do a sanity check to make sure we haven't
1310- // left any junk around.
1311- ArrayList <PreferredActivity > removed = new ArrayList <PreferredActivity >();
1312- for (PreferredActivity pa : mSettings .mPreferredActivities .filterSet ()) {
1313- if (mActivities .mActivities .get (pa .mPref .mComponent ) == null ) {
1314- removed .add (pa );
1315- }
1316- }
1317- for (int i =0 ; i <removed .size (); i ++) {
1318- PreferredActivity pa = removed .get (i );
1319- Slog .w (TAG , "Removing dangling preferred activity: "
1320- + pa .mPref .mComponent );
1321- mSettings .mPreferredActivities .removeFilter (pa );
1322- }
1323-
13241303 // can downgrade to reader
13251304 mSettings .writeLPr ();
13261305
@@ -2504,9 +2483,11 @@ ResolveInfo findPreferredActivity(Intent intent, String resolvedType,
25042483 intent = intent .getSelector ();
25052484 }
25062485 if (DEBUG_PREFERRED ) intent .addFlags (Intent .FLAG_DEBUG_LOG_RESOLUTION );
2507- List <PreferredActivity > prefs =
2508- mSettings .mPreferredActivities .queryIntent (intent , resolvedType ,
2509- (flags & PackageManager .MATCH_DEFAULT_ONLY ) != 0 , userId );
2486+ PreferredIntentResolver pir = mSettings .mPreferredActivities .get (userId );
2487+ List <PreferredActivity > prefs = pir != null
2488+ ? pir .queryIntent (intent , resolvedType ,
2489+ (flags & PackageManager .MATCH_DEFAULT_ONLY ) != 0 , userId )
2490+ : null ;
25102491 if (prefs != null && prefs .size () > 0 ) {
25112492 // First figure out how good the original match set is.
25122493 // We will only allow preferred activities that came
@@ -2537,9 +2518,6 @@ ResolveInfo findPreferredActivity(Intent intent, String resolvedType,
25372518 final int M = prefs .size ();
25382519 for (int i =0 ; i <M ; i ++) {
25392520 final PreferredActivity pa = prefs .get (i );
2540- if (pa .mUserId != userId ) {
2541- continue ;
2542- }
25432521 if (pa .mPref .mMatch != match ) {
25442522 continue ;
25452523 }
@@ -2560,7 +2538,7 @@ ResolveInfo findPreferredActivity(Intent intent, String resolvedType,
25602538 // it from the preferred activities list, and skip it.
25612539 Slog .w (TAG , "Removing dangling preferred activity: "
25622540 + pa .mPref .mComponent );
2563- mSettings . mPreferredActivities .removeFilter (pa );
2541+ pir .removeFilter (pa );
25642542 continue ;
25652543 }
25662544 for (int j =0 ; j <N ; j ++) {
@@ -2580,7 +2558,7 @@ ResolveInfo findPreferredActivity(Intent intent, String resolvedType,
25802558 if (!pa .mPref .sameSet (query , priority )) {
25812559 Slog .i (TAG , "Result set changed, dropping preferred activity for "
25822560 + intent + " type " + resolvedType );
2583- mSettings . mPreferredActivities .removeFilter (pa );
2561+ pir .removeFilter (pa );
25842562 return null ;
25852563 }
25862564
@@ -8682,9 +8660,9 @@ public void addPreferredActivity(IntentFilter filter, int match,
86828660
86838661 Slog .i (TAG , "Adding preferred activity " + activity + " for user " + userId + " :" );
86848662 filter .dump (new LogPrinter (Log .INFO , TAG ), " " );
8685- mSettings .mPreferredActivities .addFilter (
8686- new PreferredActivity (filter , match , set , activity , userId ));
8687- scheduleWriteSettingsLocked ();
8663+ mSettings .editPreferredActivitiesLPw ( userId ) .addFilter (
8664+ new PreferredActivity (filter , match , set , activity ));
8665+ mSettings . writePackageRestrictionsLPr ( userId );
86888666 }
86898667 }
86908668
@@ -8722,25 +8700,27 @@ public void replacePreferredActivity(IntentFilter filter, int match,
87228700
87238701 final int callingUserId = UserHandle .getCallingUserId ();
87248702 ArrayList <PreferredActivity > removed = null ;
8725- Iterator <PreferredActivity > it = mSettings .mPreferredActivities .filterIterator ();
8726- String action = filter .getAction (0 );
8727- String category = filter .getCategory (0 );
8728- while (it .hasNext ()) {
8729- PreferredActivity pa = it .next ();
8730- if (pa .mUserId != callingUserId ) continue ;
8731- if (pa .getAction (0 ).equals (action ) && pa .getCategory (0 ).equals (category )) {
8732- if (removed == null ) {
8733- removed = new ArrayList <PreferredActivity >();
8703+ PreferredIntentResolver pir = mSettings .mPreferredActivities .get (callingUserId );
8704+ if (pir != null ) {
8705+ Iterator <PreferredActivity > it = pir .filterIterator ();
8706+ String action = filter .getAction (0 );
8707+ String category = filter .getCategory (0 );
8708+ while (it .hasNext ()) {
8709+ PreferredActivity pa = it .next ();
8710+ if (pa .getAction (0 ).equals (action ) && pa .getCategory (0 ).equals (category )) {
8711+ if (removed == null ) {
8712+ removed = new ArrayList <PreferredActivity >();
8713+ }
8714+ removed .add (pa );
8715+ Log .i (TAG , "Removing preferred activity " + pa .mPref .mComponent + ":" );
8716+ filter .dump (new LogPrinter (Log .INFO , TAG ), " " );
87348717 }
8735- removed .add (pa );
8736- Log .i (TAG , "Removing preferred activity " + pa .mPref .mComponent + ":" );
8737- filter .dump (new LogPrinter (Log .INFO , TAG ), " " );
87388718 }
8739- }
8740- if ( removed != null ) {
8741- for ( int i = 0 ; i < removed .size (); i ++) {
8742- PreferredActivity pa = removed . get ( i );
8743- mSettings . mPreferredActivities . removeFilter ( pa );
8719+ if ( removed != null ) {
8720+ for ( int i = 0 ; i < removed . size (); i ++ ) {
8721+ PreferredActivity pa = removed .get ( i );
8722+ pir . removeFilter ( pa );
8723+ }
87448724 }
87458725 }
87468726 addPreferredActivity (filter , match , set , activity , callingUserId );
@@ -8776,27 +8756,33 @@ public void clearPackagePreferredActivities(String packageName) {
87768756 /** This method takes a specific user id as well as UserHandle.USER_ALL. */
87778757 boolean clearPackagePreferredActivitiesLPw (String packageName , int userId ) {
87788758 ArrayList <PreferredActivity > removed = null ;
8779- Iterator <PreferredActivity > it = mSettings .mPreferredActivities .filterIterator ();
8780- while (it .hasNext ()) {
8781- PreferredActivity pa = it .next ();
8782- if (userId != UserHandle .USER_ALL && pa .mUserId != userId ) {
8759+ boolean changed = false ;
8760+ for (int i =0 ; i <mSettings .mPreferredActivities .size (); i ++) {
8761+ final int thisUserId = mSettings .mPreferredActivities .keyAt (i );
8762+ PreferredIntentResolver pir = mSettings .mPreferredActivities .valueAt (i );
8763+ if (userId != UserHandle .USER_ALL && userId != thisUserId ) {
87838764 continue ;
87848765 }
8785- if (pa .mPref .mComponent .getPackageName ().equals (packageName )) {
8786- if (removed == null ) {
8787- removed = new ArrayList <PreferredActivity >();
8766+ Iterator <PreferredActivity > it = pir .filterIterator ();
8767+ while (it .hasNext ()) {
8768+ PreferredActivity pa = it .next ();
8769+ if (pa .mPref .mComponent .getPackageName ().equals (packageName )) {
8770+ if (removed == null ) {
8771+ removed = new ArrayList <PreferredActivity >();
8772+ }
8773+ removed .add (pa );
87888774 }
8789- removed .add (pa );
87908775 }
8791- }
8792- if (removed != null ) {
8793- for (int i =0 ; i <removed .size (); i ++) {
8794- PreferredActivity pa = removed .get (i );
8795- mSettings .mPreferredActivities .removeFilter (pa );
8776+ if (removed != null ) {
8777+ for (int j =0 ; j <removed .size (); j ++) {
8778+ PreferredActivity pa = removed .get (j );
8779+ pir .removeFilter (pa );
8780+ }
8781+ changed = true ;
8782+ mSettings .writePackageRestrictionsLPr (thisUserId );
87968783 }
8797- return true ;
87988784 }
8799- return false ;
8785+ return changed ;
88008786 }
88018787
88028788 public int getPreferredActivities (List <IntentFilter > outFilters ,
@@ -8806,19 +8792,19 @@ public int getPreferredActivities(List<IntentFilter> outFilters,
88068792 final int userId = UserHandle .getCallingUserId ();
88078793 // reader
88088794 synchronized (mPackages ) {
8809- final Iterator < PreferredActivity > it = mSettings .mPreferredActivities .filterIterator ( );
8810- while ( it . hasNext () ) {
8811- final PreferredActivity pa = it . next ();
8812- if ( pa . mUserId != userId ) {
8813- continue ;
8814- }
8815- if ( packageName == null
8816- || pa . mPref . mComponent . getPackageName (). equals ( packageName ) ) {
8817- if ( outFilters != null ) {
8818- outFilters . add ( new IntentFilter ( pa ));
8819- }
8820- if ( outActivities != null ) {
8821- outActivities . add ( pa . mPref . mComponent );
8795+ PreferredIntentResolver pir = mSettings .mPreferredActivities .get ( userId );
8796+ if ( pir != null ) {
8797+ final Iterator < PreferredActivity > it = pir . filterIterator ();
8798+ while ( it . hasNext () ) {
8799+ final PreferredActivity pa = it . next () ;
8800+ if ( packageName == null
8801+ || pa . mPref . mComponent . getPackageName (). equals ( packageName )) {
8802+ if ( outFilters != null ) {
8803+ outFilters . add ( new IntentFilter ( pa ));
8804+ }
8805+ if ( outActivities != null ) {
8806+ outActivities . add ( pa . mPref . mComponent );
8807+ }
88228808 }
88238809 }
88248810 }
@@ -9041,6 +9027,39 @@ public void systemReady() {
90419027 if (DEBUG_SETTINGS ) {
90429028 Log .d (TAG , "compatibility mode:" + compatibilityModeEnabled );
90439029 }
9030+
9031+ synchronized (mPackages ) {
9032+ // Verify that all of the preferred activity components actually
9033+ // exist. It is possible for applications to be updated and at
9034+ // that point remove a previously declared activity component that
9035+ // had been set as a preferred activity. We try to clean this up
9036+ // the next time we encounter that preferred activity, but it is
9037+ // possible for the user flow to never be able to return to that
9038+ // situation so here we do a sanity check to make sure we haven't
9039+ // left any junk around.
9040+ ArrayList <PreferredActivity > removed = new ArrayList <PreferredActivity >();
9041+ for (int i =0 ; i <mSettings .mPreferredActivities .size (); i ++) {
9042+ PreferredIntentResolver pir = mSettings .mPreferredActivities .valueAt (i );
9043+ removed .clear ();
9044+ for (PreferredActivity pa : pir .filterSet ()) {
9045+ if (mActivities .mActivities .get (pa .mPref .mComponent ) == null ) {
9046+ removed .add (pa );
9047+ }
9048+ }
9049+ if (removed .size () > 0 ) {
9050+ for (int j =0 ; j <removed .size (); j ++) {
9051+ PreferredActivity pa = removed .get (i );
9052+ RuntimeException here = new RuntimeException ("here" );
9053+ here .fillInStackTrace ();
9054+ Slog .w (TAG , "Removing dangling preferred activity: "
9055+ + pa .mPref .mComponent , here );
9056+ pir .removeFilter (pa );
9057+ }
9058+ mSettings .writePackageRestrictionsLPr (
9059+ mSettings .mPreferredActivities .keyAt (i ));
9060+ }
9061+ }
9062+ }
90449063 }
90459064
90469065 public boolean isSafeMode () {
@@ -9281,11 +9300,16 @@ protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
92819300 }
92829301
92839302 if (dumpState .isDumping (DumpState .DUMP_PREFERRED )) {
9284- if (mSettings .mPreferredActivities .dump (pw ,
9285- dumpState .getTitlePrinted () ? "\n Preferred Activities:"
9286- : "Preferred Activities:" , " " ,
9287- packageName , dumpState .isOptionEnabled (DumpState .OPTION_SHOW_FILTERS ))) {
9288- dumpState .setTitlePrinted (true );
9303+ for (int i =0 ; i <mSettings .mPreferredActivities .size (); i ++) {
9304+ PreferredIntentResolver pir = mSettings .mPreferredActivities .valueAt (i );
9305+ int user = mSettings .mPreferredActivities .keyAt (i );
9306+ if (pir .dump (pw ,
9307+ dumpState .getTitlePrinted ()
9308+ ? "\n Preferred Activities User " + user + ":"
9309+ : "Preferred Activities User " + user + ":" , " " ,
9310+ packageName , dumpState .isOptionEnabled (DumpState .OPTION_SHOW_FILTERS ))) {
9311+ dumpState .setTitlePrinted (true );
9312+ }
92899313 }
92909314 }
92919315
@@ -9299,7 +9323,7 @@ protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
92999323 serializer .startDocument (null , true );
93009324 serializer .setFeature (
93019325 "http://xmlpull.org/v1/doc/features.html#indent-output" , true );
9302- mSettings .writePreferredActivitiesLPr (serializer );
9326+ mSettings .writePreferredActivitiesLPr (serializer , 0 );
93039327 serializer .endDocument ();
93049328 serializer .flush ();
93059329 } catch (IllegalArgumentException e ) {
@@ -10045,11 +10069,6 @@ public int getInstallLocation() {
1004510069
1004610070 /** Called by UserManagerService */
1004710071 void cleanUpUserLILPw (int userHandle ) {
10048- // Disable all the packages for the user first
10049- Set <Entry <String , PackageSetting >> entries = mSettings .mPackages .entrySet ();
10050- for (Entry <String , PackageSetting > entry : entries ) {
10051- entry .getValue ().removeUser (userHandle );
10052- }
1005310072 if (mDirtyUsers .remove (userHandle ));
1005410073 mSettings .removeUserLPr (userHandle );
1005510074 if (mInstaller != null ) {
@@ -10063,17 +10082,7 @@ void cleanUpUserLILPw(int userHandle) {
1006310082 /** Called by UserManagerService */
1006410083 void createNewUserLILPw (int userHandle , File path ) {
1006510084 if (mInstaller != null ) {
10066- path .mkdir ();
10067- FileUtils .setPermissions (path .toString (), FileUtils .S_IRWXU | FileUtils .S_IRWXG
10068- | FileUtils .S_IXOTH , -1 , -1 );
10069- for (PackageSetting ps : mSettings .mPackages .values ()) {
10070- // Only system apps are initially installed.
10071- ps .setInstalled ((ps .pkgFlags &ApplicationInfo .FLAG_SYSTEM ) != 0 , userHandle );
10072- // Need to create a data directory for all apps under this user.
10073- mInstaller .createUserData (ps .name ,
10074- UserHandle .getUid (userHandle , ps .appId ), userHandle );
10075- }
10076- mSettings .writePackageRestrictionsLPr (userHandle );
10085+ mSettings .createNewUserLILPw (mInstaller , userHandle , path );
1007710086 }
1007810087 }
1007910088
0 commit comments