summaryrefslogtreecommitdiff
path: root/java/src
diff options
context:
space:
mode:
author Andrey Epin <ayepin@google.com> 2022-10-28 14:16:24 -0700
committer Andrey Epin <ayepin@google.com> 2022-11-03 12:56:18 -0700
commit578b259bd38d2a75fc7b1ecca1bfeb2009d99e07 (patch)
treeaf643554131e6c9c1eccf0851b59ad4ffc761e6d /java/src
parent9bcaf18b0fda7adb1a93c5d170e390bf3b7ce0e3 (diff)
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$<sorting task> from #createSortingTask - ChooserListAdapter.LoadDirectShareIconTask - ResolverListAdapter.LoadIconTask - ResolverListAdapter.LoadLabelTask Fix: 257285237 Test: manual test Test: atest IntentResolverUnitTests Change-Id: I70eeababa2fa684f0a160ff6ed9ab0900e3c9648
Diffstat (limited to 'java/src')
-rw-r--r--java/src/com/android/intentresolver/ChooserActivity.java150
-rw-r--r--java/src/com/android/intentresolver/ChooserListAdapter.java20
2 files changed, 42 insertions, 128 deletions
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<UserHandle, ServiceResultInfo[]> args =
- (Pair<UserHandle, ServiceResultInfo[]>) 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<ShortcutManager.ShareShortcutInfo> 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<ShortcutManager.ShareShortcutInfo> resultList,
ChooserListAdapter chooserListAdapter,
- @Nullable List<AppTarget> appTargets, UserHandle userHandle) {
+ @Nullable List<AppTarget> 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<ShortcutManager.ShareShortcutInfo> 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<ServiceResultInfo> 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<RecyclerView.ViewHolder> {
- 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<ChooserTarget> resultTargets;
- public final UserHandle userHandle;
- public ServiceResultInfo(DisplayResolveInfo ot, List<ChooserTarget> rt,
- UserHandle userHandle) {
+ ServiceResultInfo(DisplayResolveInfo ot, List<ChooserTarget> 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<TargetInfo> mServiceTargets = new ArrayList<>();
private final List<DisplayResolveInfo> mCallerTargets = new ArrayList<>();
- private boolean mListViewDataChanged = false;
-
// Sorted list of DisplayResolveInfos for the alphabetical app section.
private List<DisplayResolveInfo> 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);
}