* commit 'f65951bf5db7a248651cbfa89886d773f95c3e03': Make ResolverActivity update dynamically.
This commit is contained in:
@ -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<ResolveInfo> mBaseResolveList;
|
||||
private final Intent mIntent;
|
||||
private final LayoutInflater mInflater;
|
||||
|
||||
private List<ResolveInfo> mCurrentResolveList;
|
||||
private List<DisplayResolveInfo> mList;
|
||||
|
||||
public ResolveListAdapter(Context context, Intent intent,
|
||||
Intent[] initialIntents, List<ResolveInfo> 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<N; i++) {
|
||||
ResolveInfo ri = rList.get(i);
|
||||
ResolveInfo ri = mCurrentResolveList.get(i);
|
||||
if (false) Log.v(
|
||||
"ResolveListActivity",
|
||||
r0.activityInfo.name + "=" +
|
||||
@ -257,7 +299,7 @@ public class ResolverActivity extends AlertActivity implements
|
||||
if (r0.priority != ri.priority ||
|
||||
r0.isDefault != ri.isDefault) {
|
||||
while (i < N) {
|
||||
rList.remove(i);
|
||||
mCurrentResolveList.remove(i);
|
||||
N--;
|
||||
}
|
||||
}
|
||||
@ -265,15 +307,15 @@ public class ResolverActivity extends AlertActivity implements
|
||||
if (N > 1) {
|
||||
ResolveInfo.DisplayNameComparator rComparator =
|
||||
new ResolveInfo.DisplayNameComparator(mPm);
|
||||
Collections.sort(rList, rComparator);
|
||||
Collections.sort(mCurrentResolveList, rComparator);
|
||||
}
|
||||
|
||||
mList = new ArrayList<DisplayResolveInfo>();
|
||||
|
||||
// First put the initial items at the top.
|
||||
if (initialIntents != null) {
|
||||
for (int i=0; i<initialIntents.length; i++) {
|
||||
Intent ii = initialIntents[i];
|
||||
if (mInitialIntents != null) {
|
||||
for (int i=0; i<mInitialIntents.length; i++) {
|
||||
Intent ii = mInitialIntents[i];
|
||||
if (ii == null) {
|
||||
continue;
|
||||
}
|
||||
@ -300,14 +342,14 @@ public class ResolverActivity extends AlertActivity implements
|
||||
|
||||
// Check for applications with same name and use application name or
|
||||
// package name if necessary
|
||||
r0 = rList.get(0);
|
||||
r0 = mCurrentResolveList.get(0);
|
||||
int start = 0;
|
||||
CharSequence r0Label = r0.loadLabel(mPm);
|
||||
for (int i = 1; i < N; i++) {
|
||||
if (r0Label == null) {
|
||||
r0Label = r0.activityInfo.packageName;
|
||||
}
|
||||
ResolveInfo ri = rList.get(i);
|
||||
ResolveInfo ri = mCurrentResolveList.get(i);
|
||||
CharSequence riLabel = ri.loadLabel(mPm);
|
||||
if (riLabel == null) {
|
||||
riLabel = ri.activityInfo.packageName;
|
||||
@ -315,13 +357,13 @@ public class ResolverActivity extends AlertActivity implements
|
||||
if (riLabel.equals(r0Label)) {
|
||||
continue;
|
||||
}
|
||||
processGroup(rList, start, (i-1), r0, r0Label);
|
||||
processGroup(mCurrentResolveList, start, (i-1), r0, r0Label);
|
||||
r0 = ri;
|
||||
r0Label = riLabel;
|
||||
start = i;
|
||||
}
|
||||
// Process last group
|
||||
processGroup(rList, start, (N-1), r0, r0Label);
|
||||
processGroup(mCurrentResolveList, start, (N-1), r0, r0Label);
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user