Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e8f2c7ff authored by Dianne Hackborn's avatar Dianne Hackborn
Browse files

Make ResolverActivity update dynamically.

Watches for package changes so it can dynamically adjust
to reflect the actual list of available activities.

Change-Id: I3a2fef3dac4d13d1b2a7ed6fc117a7b814679669
parent ee329930
Loading
Loading
Loading
Loading
+57 −15
Original line number Diff line number Diff line
@@ -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();
        }

        public void handlePackagesChanged() {
            rebuildList();
            notifyDataSetChanged();
            if (mList.size() <= 0) {
                // We no longer have any items...  just finish the activity.
                finish();
            }
        }

            if (rList == null) {
                rList = mPm.queryIntentActivities(
                        intent, PackageManager.MATCH_DEFAULT_ONLY
        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);
            }
        }