From 578b259bd38d2a75fc7b1ecca1bfeb2009d99e07 Mon Sep 17 00:00:00 2001 From: Andrey Epin Date: Fri, 28 Oct 2022 14:16:24 -0700 Subject: Remove ChooserListAdapter notifyDataSetChange throttling ChooserListAdapter notifyDataSetChange throttling period has been, practically, reduced to 0 and this change removes the logic completely. The remaining ChooserHandler's message turned into posting on the UI thread and thus ChooserHandler is also removed. Safety Check All ChooserListAdapter#notifyDataSetChanged invocations I've found (posted below) are originated by some posting on the main thread i.e. not initiated from a view binding in the adapter. Invocations - ChooserActivity.onHandlePackageChanged (and - ResolverActivity.onHandlePackageChanged) - ChooserListAdapter.onListRebuilt - ChooserListAdapter.updateAlphabeticalList - ChooserListAdapter.addServiceResults - ChooserListAdapter.completeServiceTargetLoading - ChooserListAdapter$ from #createSortingTask - ChooserListAdapter.LoadDirectShareIconTask - ResolverListAdapter.LoadIconTask - ResolverListAdapter.LoadLabelTask Fix: 257285237 Test: manual test Test: atest IntentResolverUnitTests Change-Id: I70eeababa2fa684f0a160ff6ed9ab0900e3c9648 --- .../android/intentresolver/ChooserActivity.java | 150 ++++++--------------- .../android/intentresolver/ChooserListAdapter.java | 20 --- 2 files changed, 42 insertions(+), 128 deletions(-) (limited to 'java/src') diff --git a/java/src/com/android/intentresolver/ChooserActivity.java b/java/src/com/android/intentresolver/ChooserActivity.java index 6735ab4e..53d3829e 100644 --- a/java/src/com/android/intentresolver/ChooserActivity.java +++ b/java/src/com/android/intentresolver/ChooserActivity.java @@ -88,7 +88,6 @@ import android.text.TextUtils; import android.util.AttributeSet; import android.util.HashedStringCache; import android.util.Log; -import android.util.Pair; import android.util.PluralsMessageFormatter; import android.util.Size; import android.util.Slog; @@ -111,6 +110,7 @@ import android.widget.ImageView; import android.widget.Space; import android.widget.TextView; +import androidx.annotation.MainThread; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.RecyclerView; import androidx.viewpager.widget.ViewPager; @@ -238,22 +238,15 @@ public class ChooserActivity extends ResolverActivity implements private static final float DIRECT_SHARE_EXPANSION_RATE = 0.78f; private static final int DEFAULT_SALT_EXPIRATION_DAYS = 7; - private int mMaxHashSaltDays = DeviceConfig.getInt(DeviceConfig.NAMESPACE_SYSTEMUI, + private final int mMaxHashSaltDays = DeviceConfig.getInt(DeviceConfig.NAMESPACE_SYSTEMUI, SystemUiDeviceConfigFlags.HASH_SALT_MAX_DAYS, DEFAULT_SALT_EXPIRATION_DAYS); - private static final int DEFAULT_LIST_VIEW_UPDATE_DELAY_MS = 0; - private static final int URI_PERMISSION_INTENT_FLAGS = Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION | Intent.FLAG_GRANT_PREFIX_URI_PERMISSION; - @VisibleForTesting - int mListViewUpdateDelayMs = DeviceConfig.getInt(DeviceConfig.NAMESPACE_SYSTEMUI, - SystemUiDeviceConfigFlags.SHARESHEET_LIST_VIEW_UPDATE_DELAY, - DEFAULT_LIST_VIEW_UPDATE_DELAY_MS); - private Bundle mReplacementExtras; private IntentSender mChosenComponentSender; private IntentSender mRefinementIntentSender; @@ -454,74 +447,6 @@ public class ChooserActivity extends ResolverActivity implements } } - private final ChooserHandler mChooserHandler = new ChooserHandler(); - - private class ChooserHandler extends Handler { - private static final int LIST_VIEW_UPDATE_MESSAGE = 6; - private static final int SHORTCUT_MANAGER_ALL_SHARE_TARGET_RESULTS = 7; - - private void removeAllMessages() { - removeMessages(LIST_VIEW_UPDATE_MESSAGE); - removeMessages(SHORTCUT_MANAGER_ALL_SHARE_TARGET_RESULTS); - } - - @Override - public void handleMessage(Message msg) { - if (mChooserMultiProfilePagerAdapter.getActiveListAdapter() == null || isDestroyed()) { - return; - } - - switch (msg.what) { - case LIST_VIEW_UPDATE_MESSAGE: - if (DEBUG) { - Log.d(TAG, "LIST_VIEW_UPDATE_MESSAGE; "); - } - - mChooserMultiProfilePagerAdapter - .getListAdapterForUserHandle((UserHandle) msg.obj) - .refreshListView(); - break; - - case SHORTCUT_MANAGER_ALL_SHARE_TARGET_RESULTS: - if (DEBUG) Log.d(TAG, "SHORTCUT_MANAGER_ALL_SHARE_TARGET_RESULTS"); - final Pair args = - (Pair) msg.obj; - final UserHandle userHandle = args.first; - final ServiceResultInfo[] resultInfos = args.second; - - for (ServiceResultInfo resultInfo : resultInfos) { - if (resultInfo.resultTargets != null) { - ChooserListAdapter adapterForUserHandle = - mChooserMultiProfilePagerAdapter.getListAdapterForUserHandle( - resultInfo.userHandle); - if (adapterForUserHandle != null) { - adapterForUserHandle.addServiceResults( - resultInfo.originalTarget, - resultInfo.resultTargets, - msg.arg1, - emptyIfNull(mDirectShareShortcutInfoCache), - emptyIfNull(mDirectShareAppTargetCache)); - } - } - } - - logDirectShareTargetReceived( - MetricsEvent.ACTION_DIRECT_SHARE_TARGETS_LOADED_SHORTCUT_MANAGER, - userHandle); - - sendVoiceChoicesIfNeeded(); - getChooserActivityLogger().logSharesheetDirectLoadComplete(); - - mChooserMultiProfilePagerAdapter.getActiveListAdapter() - .completeServiceTargetLoading(); - break; - - default: - super.handleMessage(msg); - } - } - }; - @Override protected void onCreate(Bundle savedInstanceState) { final long intentReceivedTime = System.currentTimeMillis(); @@ -791,8 +716,7 @@ public class ChooserActivity extends ResolverActivity implements new ComponentName( appTarget.getPackageName(), appTarget.getClassName()))); } - sendShareShortcutInfoList(shareShortcutInfos, chooserListAdapter, resultList, - chooserListAdapter.getUserHandle()); + sendShareShortcutInfoList(shareShortcutInfos, chooserListAdapter, resultList); }; } @@ -1622,7 +1546,6 @@ public class ChooserActivity extends ResolverActivity implements mRefinementResultReceiver.destroy(); mRefinementResultReceiver = null; } - mChooserHandler.removeAllMessages(); if (mPreviewCoord != null) mPreviewCoord.cancelLoads(); @@ -2003,7 +1926,7 @@ public class ChooserActivity extends ResolverActivity implements ShortcutManager sm = (ShortcutManager) selectedProfileContext .getSystemService(Context.SHORTCUT_SERVICE); List resultList = sm.getShareTargets(filter); - sendShareShortcutInfoList(resultList, adapter, null, userHandle); + sendShareShortcutInfoList(resultList, adapter, null); }); } @@ -2033,12 +1956,13 @@ public class ChooserActivity extends ResolverActivity implements private void sendShareShortcutInfoList( List resultList, ChooserListAdapter chooserListAdapter, - @Nullable List appTargets, UserHandle userHandle) { + @Nullable List appTargets) { if (appTargets != null && appTargets.size() != resultList.size()) { throw new RuntimeException("resultList and appTargets must have the same size." + " resultList.size()=" + resultList.size() + " appTargets.size()=" + appTargets.size()); } + UserHandle userHandle = chooserListAdapter.getUserHandle(); Context selectedProfileContext = createContextAsUser(userHandle, 0 /* flags */); for (int i = resultList.size() - 1; i >= 0; i--) { final String packageName = resultList.get(i).getTargetComponent().getPackageName(); @@ -2075,12 +1999,15 @@ public class ChooserActivity extends ResolverActivity implements mDirectShareShortcutInfoCache); ServiceResultInfo resultRecord = new ServiceResultInfo( - displayResolveInfo, chooserTargets, userHandle); + displayResolveInfo, chooserTargets); resultRecords.add(resultRecord); } - sendShortcutManagerShareTargetResults( - userHandle, shortcutType, resultRecords.toArray(new ServiceResultInfo[0])); + runOnUiThread(() -> { + if (!isDestroyed()) { + onShortcutsLoaded(chooserListAdapter, shortcutType, resultRecords); + } + }); } private List filterShortcutsByTargetComponentName( @@ -2094,15 +2021,6 @@ public class ChooserActivity extends ResolverActivity implements return matchingShortcuts; } - private void sendShortcutManagerShareTargetResults( - UserHandle userHandle, int shortcutType, ServiceResultInfo[] results) { - final Message msg = Message.obtain(); - msg.what = ChooserHandler.SHORTCUT_MANAGER_ALL_SHARE_TARGET_RESULTS; - msg.obj = Pair.create(userHandle, results); - msg.arg1 = shortcutType; - mChooserHandler.sendMessage(msg); - } - private boolean isPackageEnabled(Context context, String packageName) { if (TextUtils.isEmpty(packageName)) { return false; @@ -2579,14 +2497,6 @@ public class ChooserActivity extends ResolverActivity implements return mMaxTargetsPerRow; } - @Override // ChooserListCommunicator - public void sendListViewUpdateMessage(UserHandle userHandle) { - Message msg = Message.obtain(); - msg.what = ChooserHandler.LIST_VIEW_UPDATE_MESSAGE; - msg.obj = userHandle; - mChooserHandler.sendMessageDelayed(msg, mListViewUpdateDelayMs); - } - @Override public void onListRebuilt(ResolverListAdapter listAdapter, boolean rebuildComplete) { setupScrollListener(); @@ -2633,6 +2543,33 @@ public class ChooserActivity extends ResolverActivity implements queryDirectShareTargets(chooserListAdapter, false); } + @MainThread + private void onShortcutsLoaded( + ChooserListAdapter adapter, int targetType, List resultInfos) { + UserHandle userHandle = adapter.getUserHandle(); + if (DEBUG) { + Log.d(TAG, "onShortcutsLoaded for user: " + userHandle); + } + for (ServiceResultInfo resultInfo : resultInfos) { + if (resultInfo.resultTargets != null) { + adapter.addServiceResults( + resultInfo.originalTarget, + resultInfo.resultTargets, + targetType, + emptyIfNull(mDirectShareShortcutInfoCache), + emptyIfNull(mDirectShareAppTargetCache)); + } + } + adapter.completeServiceTargetLoading(); + + logDirectShareTargetReceived( + MetricsEvent.ACTION_DIRECT_SHARE_TARGETS_LOADED_SHORTCUT_MANAGER, + userHandle); + + sendVoiceChoicesIfNeeded(); + getChooserActivityLogger().logSharesheetDirectLoadComplete(); + } + @VisibleForTesting protected boolean isUserRunning(UserHandle userHandle) { UserManager userManager = getSystemService(UserManager.class); @@ -2965,12 +2902,12 @@ public class ChooserActivity extends ResolverActivity implements */ @VisibleForTesting public final class ChooserGridAdapter extends RecyclerView.Adapter { - private ChooserListAdapter mChooserListAdapter; + private final ChooserListAdapter mChooserListAdapter; private final LayoutInflater mLayoutInflater; private DirectShareViewHolder mDirectShareViewHolder; private int mChooserTargetWidth = 0; - private boolean mShowAzLabelIfPoss; + private final boolean mShowAzLabelIfPoss; private boolean mLayoutRequested = false; private int mFooterHeight = 0; @@ -3703,13 +3640,10 @@ public class ChooserActivity extends ResolverActivity implements static class ServiceResultInfo { public final DisplayResolveInfo originalTarget; public final List resultTargets; - public final UserHandle userHandle; - public ServiceResultInfo(DisplayResolveInfo ot, List rt, - UserHandle userHandle) { + ServiceResultInfo(DisplayResolveInfo ot, List rt) { originalTarget = ot; resultTargets = rt; - this.userHandle = userHandle; } } diff --git a/java/src/com/android/intentresolver/ChooserListAdapter.java b/java/src/com/android/intentresolver/ChooserListAdapter.java index 2443659f..92cd0043 100644 --- a/java/src/com/android/intentresolver/ChooserListAdapter.java +++ b/java/src/com/android/intentresolver/ChooserListAdapter.java @@ -33,7 +33,6 @@ import android.content.pm.ShortcutInfo; import android.graphics.drawable.Drawable; import android.os.AsyncTask; import android.os.Trace; -import android.os.UserHandle; import android.os.UserManager; import android.provider.DeviceConfig; import android.service.chooser.ChooserTarget; @@ -90,8 +89,6 @@ public class ChooserListAdapter extends ResolverListAdapter { private final List mServiceTargets = new ArrayList<>(); private final List mCallerTargets = new ArrayList<>(); - private boolean mListViewDataChanged = false; - // Sorted list of DisplayResolveInfos for the alphabetical app section. private List mSortedList = new ArrayList<>(); @@ -225,21 +222,6 @@ public class ChooserListAdapter extends ResolverListAdapter { } - @Override - public void notifyDataSetChanged() { - if (!mListViewDataChanged) { - mChooserListCommunicator.sendListViewUpdateMessage(getUserHandle()); - mListViewDataChanged = true; - } - } - - void refreshListView() { - if (mListViewDataChanged) { - super.notifyDataSetChanged(); - } - mListViewDataChanged = false; - } - private void createPlaceHolders() { mServiceTargets.clear(); for (int i = 0; i < mChooserListCommunicator.getMaxRankedTargets(); i++) { @@ -652,8 +634,6 @@ public class ChooserListAdapter extends ResolverListAdapter { int getMaxRankedTargets(); - void sendListViewUpdateMessage(UserHandle userHandle); - boolean isSendAction(Intent targetIntent); } -- cgit v1.2.3-59-g8ed1b