diff --git a/core/java/com/android/internal/app/ResolverActivity.java b/core/java/com/android/internal/app/ResolverActivity.java index 3fba1be19f502..05638465eb50a 100644 --- a/core/java/com/android/internal/app/ResolverActivity.java +++ b/core/java/com/android/internal/app/ResolverActivity.java @@ -17,6 +17,8 @@ package com.android.internal.app; import com.android.internal.R; +import com.android.internal.content.PackageMonitor; + import android.content.ComponentName; import android.content.Context; import android.content.DialogInterface; @@ -58,6 +60,12 @@ public class ResolverActivity extends AlertActivity implements private TextView mClearDefaultHint; private PackageManager mPm; + private final PackageMonitor mPackageMonitor = new PackageMonitor() { + @Override public void onSomePackagesChanged() { + mAdapter.handlePackagesChanged(); + } + }; + private Intent makeMyIntent() { Intent intent = new Intent(getIntent()); // The resolver activity is set to be hidden from recent tasks. @@ -88,6 +96,8 @@ public class ResolverActivity extends AlertActivity implements ap.mTitle = title; ap.mOnClickListener = this; + mPackageMonitor.register(this, false); + if (alwaysUseOption) { LayoutInflater inflater = (LayoutInflater) getSystemService( Context.LAYOUT_INFLATER_SERVICE); @@ -114,6 +124,19 @@ public class ResolverActivity extends AlertActivity implements setupAlert(); } + @Override + protected void onRestart() { + super.onRestart(); + mPackageMonitor.register(this, false); + mAdapter.handlePackagesChanged(); + } + + @Override + protected void onStop() { + super.onStop(); + mPackageMonitor.unregister(); + } + public void onClick(DialogInterface dialog, int which) { ResolveInfo ri = mAdapter.resolveInfoForPosition(which); Intent intent = mAdapter.intentForPosition(which); @@ -225,29 +248,48 @@ public class ResolverActivity extends AlertActivity implements } private final class ResolveListAdapter extends BaseAdapter { + private final Intent[] mInitialIntents; + private final List mBaseResolveList; private final Intent mIntent; private final LayoutInflater mInflater; + private List mCurrentResolveList; private List mList; public ResolveListAdapter(Context context, Intent intent, Intent[] initialIntents, List rList) { mIntent = new Intent(intent); mIntent.setComponent(null); + mInitialIntents = initialIntents; + mBaseResolveList = rList; mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + rebuildList(); + } - if (rList == null) { - rList = mPm.queryIntentActivities( - intent, PackageManager.MATCH_DEFAULT_ONLY + public void handlePackagesChanged() { + rebuildList(); + notifyDataSetChanged(); + if (mList.size() <= 0) { + // We no longer have any items... just finish the activity. + finish(); + } + } + + private void rebuildList() { + if (mBaseResolveList != null) { + mCurrentResolveList = mBaseResolveList; + } else { + mCurrentResolveList = mPm.queryIntentActivities( + mIntent, PackageManager.MATCH_DEFAULT_ONLY | (mAlwaysCheck != null ? PackageManager.GET_RESOLVED_FILTER : 0)); } int N; - if ((rList != null) && ((N = rList.size()) > 0)) { + if ((mCurrentResolveList != null) && ((N = mCurrentResolveList.size()) > 0)) { // Only display the first matches that are either of equal // priority or have asked to be default options. - ResolveInfo r0 = rList.get(0); + ResolveInfo r0 = mCurrentResolveList.get(0); for (int i=1; i