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

Commit 55d66aa0 authored by Zhen Zhang's avatar Zhen Zhang
Browse files

On demand label loading and async alphabetical sorting.

Refactor the loading of target labels. Make them on demand and
asynchronously. Also, use AsyncTask to update and sort alphabetical
list.

Bug: 142659056
Test: Passed all unit tests in ChooserActivityTest. Passed most
ResolverActvitiy unit tests after modification in another CL under same
topic, except setMaxHeight and setShowAtTopToTrue.
Change-Id: I9d0e2343d7ae549990b898fab7ab97f79ad57366
parent 2da6b815
Loading
Loading
Loading
Loading
+17 −4
Original line number Diff line number Diff line
@@ -2505,9 +2505,7 @@ public class ChooserActivity extends ResolverActivity {
                        ri.noResourceId = true;
                        ri.icon = 0;
                    }
                    ResolveInfoPresentationGetter getter = makePresentationGetter(ri);
                    mCallerTargets.add(new DisplayResolveInfo(ii, ri,
                            getter.getLabel(), getter.getSubLabel(), ii));
                    mCallerTargets.add(new DisplayResolveInfo(ii, ri, ii));
                }
            }
        }
@@ -2606,7 +2604,22 @@ public class ChooserActivity extends ResolverActivity {

        @Override
        public void onListRebuilt() {
            if (getDisplayList() == null || getDisplayList().isEmpty()) {
                notifyDataSetChanged();
            } else {
                new AsyncTask<Void, Void, Void>() {
                    @Override
                    protected Void doInBackground(Void... voids) {
                        updateAlphabeticalList();
                        return null;
                    }

                    @Override
                    protected void onPostExecute(Void aVoid) {
                        notifyDataSetChanged();
                    }
                }.execute();
            }

            // don't support direct share on low ram devices
            if (ActivityManager.isLowRamDeviceStatic()) {
+80 −23
Original line number Diff line number Diff line
@@ -1406,14 +1406,18 @@ public class ResolverActivity extends Activity {

    public final class DisplayResolveInfo implements TargetInfo {
        private final ResolveInfo mResolveInfo;
        private final CharSequence mDisplayLabel;
        private CharSequence mDisplayLabel;
        private Drawable mDisplayIcon;
        private Drawable mBadge;
        private final CharSequence mExtendedInfo;
        private CharSequence mExtendedInfo;
        private final Intent mResolvedIntent;
        private final List<Intent> mSourceIntents = new ArrayList<>();
        private boolean mIsSuspended;

        public DisplayResolveInfo(Intent originalIntent, ResolveInfo pri, Intent pOrigIntent) {
            this(originalIntent, pri, null /*mDisplayLabel*/, null /*mExtendedInfo*/, pOrigIntent);
        }

        public DisplayResolveInfo(Intent originalIntent, ResolveInfo pri, CharSequence pLabel,
                CharSequence pInfo, Intent pOrigIntent) {
            mSourceIntents.add(originalIntent);
@@ -1448,9 +1452,26 @@ public class ResolverActivity extends Activity {
        }

        public CharSequence getDisplayLabel() {
            if (mDisplayLabel == null) {
                ResolveInfoPresentationGetter pg = makePresentationGetter(mResolveInfo);
                mDisplayLabel = pg.getLabel();
                mExtendedInfo = pg.getSubLabel();
            }
            return mDisplayLabel;
        }

        public boolean hasDisplayLabel() {
            return mDisplayLabel != null;
        }

        public void setDisplayLabel(CharSequence displayLabel) {
            mDisplayLabel = displayLabel;
        }

        public void setExtendedInfo(CharSequence extendedInfo) {
            mExtendedInfo = extendedInfo;
        }

        public Drawable getDisplayIcon() {
            return mDisplayIcon;
        }
@@ -1866,9 +1887,7 @@ public class ResolverActivity extends Activity {
                    final ResolveInfo ri = rci.getResolveInfoAt(0);
                    if (ri != null) {
                        mAllTargetsAreBrowsers &= ri.handleAllWebDataURI;

                        ResolveInfoPresentationGetter pg = makePresentationGetter(ri);
                        addResolveInfoWithAlternates(rci, pg.getSubLabel(), pg.getLabel());
                        addResolveInfoWithAlternates(rci);
                    }
                }
            }
@@ -1915,14 +1934,12 @@ public class ResolverActivity extends Activity {
            return mFilterLastUsed;
        }

        private void addResolveInfoWithAlternates(ResolvedComponentInfo rci,
                CharSequence extraInfo, CharSequence roLabel) {
        private void addResolveInfoWithAlternates(ResolvedComponentInfo rci) {
            final int count = rci.getCount();
            final Intent intent = rci.getIntentAt(0);
            final ResolveInfo add = rci.getResolveInfoAt(0);
            final Intent replaceIntent = getReplacementIntent(add.activityInfo, intent);
            final DisplayResolveInfo dri = new DisplayResolveInfo(intent, add, roLabel,
                    extraInfo, replaceIntent);
            final DisplayResolveInfo dri = new DisplayResolveInfo(intent, add, replaceIntent);
            addResolveInfo(dri);
            if (replaceIntent == intent) {
                // Only add alternates if we didn't get a specific replacement from
@@ -2054,20 +2071,11 @@ public class ResolverActivity extends Activity {
                return;
            }

            final CharSequence label = info.getDisplayLabel();
            if (!TextUtils.equals(holder.text.getText(), label)) {
                holder.text.setText(info.getDisplayLabel());
            }

            // Always show a subLabel for visual consistency across list items. Show an empty
            // subLabel if the subLabel is the same as the label
            CharSequence subLabel = info.getExtendedInfo();
            if (TextUtils.equals(label, subLabel)) subLabel = null;

            if (!TextUtils.equals(holder.text2.getText(), subLabel)
                    && !TextUtils.isEmpty(subLabel)) {
                holder.text2.setVisibility(View.VISIBLE);
                holder.text2.setText(subLabel);
            if (info instanceof DisplayResolveInfo
                    && !((DisplayResolveInfo) info).hasDisplayLabel()) {
                getLoadLabelTask((DisplayResolveInfo) info, holder).execute();
            } else {
                holder.bindLabel(info.getDisplayLabel(), info.getExtendedInfo());
            }

            if (info.isSuspended()) {
@@ -2085,6 +2093,9 @@ public class ResolverActivity extends Activity {
        }
    }

    protected LoadLabelTask getLoadLabelTask(DisplayResolveInfo info, ViewHolder holder) {
        return new LoadLabelTask(info, holder);
    }

    @VisibleForTesting
    public static final class ResolvedComponentInfo {
@@ -2148,6 +2159,24 @@ public class ResolverActivity extends Activity {
            text2 = (TextView) view.findViewById(com.android.internal.R.id.text2);
            icon = (ImageView) view.findViewById(R.id.icon);
        }

        public void bindLabel(CharSequence label, CharSequence subLabel) {
            if (!TextUtils.equals(text.getText(), label)) {
                text.setText(label);
            }

            // Always show a subLabel for visual consistency across list items. Show an empty
            // subLabel if the subLabel is the same as the label
            if (TextUtils.equals(label, subLabel)) {
                subLabel = null;
            }

            if (!TextUtils.equals(text2.getText(), subLabel)
                    && !TextUtils.isEmpty(subLabel)) {
                text2.setVisibility(View.VISIBLE);
                text2.setText(subLabel);
            }
        }
    }

    class ItemClickListener implements AdapterView.OnItemClickListener,
@@ -2200,6 +2229,34 @@ public class ResolverActivity extends Activity {

    }

    protected class LoadLabelTask extends AsyncTask<Void, Void, CharSequence[]> {
        private final DisplayResolveInfo mDisplayResolveInfo;
        private final ViewHolder mHolder;

        protected LoadLabelTask(DisplayResolveInfo dri, ViewHolder holder) {
            mDisplayResolveInfo = dri;
            mHolder = holder;
        }


        @Override
        protected CharSequence[] doInBackground(Void... voids) {
            ResolveInfoPresentationGetter pg =
                    makePresentationGetter(mDisplayResolveInfo.mResolveInfo);
            return new CharSequence[] {
                    pg.getLabel(),
                    pg.getSubLabel()
            };
        }

        @Override
        protected void onPostExecute(CharSequence[] result) {
            mDisplayResolveInfo.setDisplayLabel(result[0]);
            mDisplayResolveInfo.setExtendedInfo(result[1]);
            mHolder.bindLabel(result[0], result[1]);
        }
    }

    class LoadIconTask extends AsyncTask<Void, Void, Drawable> {
        protected final DisplayResolveInfo mDisplayResolveInfo;
        private final ResolveInfo mResolveInfo;