From b9ee1c48775daaae184105cb98be0c1314e6279f Mon Sep 17 00:00:00 2001 From: Chun-Ku Lin Date: Tue, 4 Jun 2024 01:45:57 +0000 Subject: [PATCH] Load icon in the background, also load extra data that would be used later in the background. Bug: 327052480 Test: atest com.android.settings.accessibility Flag: EXEMPT bugfix Change-Id: I9940772e60e2137aad2b3b70902565e36fb7aad6 --- .../AccessibilityActivityPreference.java | 43 +++++++++++++---- .../AccessibilityServicePreference.java | 46 ++++++++++++++----- 2 files changed, 69 insertions(+), 20 deletions(-) diff --git a/src/com/android/settings/accessibility/AccessibilityActivityPreference.java b/src/com/android/settings/accessibility/AccessibilityActivityPreference.java index da4598e6d48..e5568f6ccd0 100644 --- a/src/com/android/settings/accessibility/AccessibilityActivityPreference.java +++ b/src/com/android/settings/accessibility/AccessibilityActivityPreference.java @@ -24,6 +24,7 @@ import android.content.pm.PackageManager; import android.graphics.Color; import android.graphics.drawable.Drawable; import android.os.Bundle; +import android.util.Log; import androidx.core.content.ContextCompat; @@ -31,11 +32,17 @@ import com.android.settings.R; import com.android.settings.Utils; import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.RestrictedPreference; +import com.android.settingslib.utils.ThreadUtils; + +import com.google.common.util.concurrent.ListenableFuture; + +import java.util.concurrent.ExecutionException; /** * Preference item for showing an accessibility activity in a preference list */ public class AccessibilityActivityPreference extends RestrictedPreference { + private static final String LOG_TAG = AccessibilityActivityPreference.class.getSimpleName(); // Index of the first preference in a preference category. private static final int FIRST_PREFERENCE_IN_CATEGORY_INDEX = -1; private static final String TARGET_FRAGMENT = @@ -43,6 +50,7 @@ public class AccessibilityActivityPreference extends RestrictedPreference { private final AccessibilityShortcutInfo mA11yShortcutInfo; private final PackageManager mPm; private final ComponentName mComponentName; + private final ListenableFuture mExtraArgumentsFuture; public AccessibilityActivityPreference(Context context, String packageName, int uid, AccessibilityShortcutInfo a11yShortcutInfo) { @@ -60,13 +68,28 @@ public class AccessibilityActivityPreference extends RestrictedPreference { setPersistent(false); // Disable SharedPreferences. setOrder(FIRST_PREFERENCE_IN_CATEGORY_INDEX); - final Drawable icon = getA11yActivityIcon(); - setIcon(icon); + // kick off image loading tasks + ThreadUtils.postOnBackgroundThread(() -> { + final Drawable icon = getA11yActivityIcon(); + ThreadUtils.getUiThreadHandler().post(() -> this.setIcon(icon)); + }); final Bundle extras = getExtras(); extras.putParcelable(AccessibilitySettings.EXTRA_COMPONENT_NAME, mComponentName); - setupDataForOpenFragment(); + mExtraArgumentsFuture = ThreadUtils.postOnBackgroundThread(this::setupDataForOpenFragment); + } + + @Override + public void performClick() { + try { + mExtraArgumentsFuture.get(); + } catch (InterruptedException | ExecutionException e) { + Log.e(LOG_TAG, + "Unable to finish grabbing necessary arguments to open the fragment: " + + "componentName: " + mComponentName); + } + super.performClick(); } private Drawable getA11yActivityIcon() { @@ -93,11 +116,13 @@ public class AccessibilityActivityPreference extends RestrictedPreference { .getAccessibilityMetricsFeatureProvider() .getDownloadedFeatureMetricsCategory(mComponentName); - RestrictedPreferenceHelper.putBasicExtras( - this, prefKey, getTitle(), intro, description, imageRes, - htmlDescription, mComponentName, metricsCategory); - RestrictedPreferenceHelper.putSettingsExtras(this, getPackageName(), settingsClassName); - RestrictedPreferenceHelper.putTileServiceExtras( - this, getPackageName(), tileServiceClassName); + ThreadUtils.getUiThreadHandler().post(() -> { + RestrictedPreferenceHelper.putBasicExtras( + this, prefKey, getTitle(), intro, description, imageRes, + htmlDescription, mComponentName, metricsCategory); + RestrictedPreferenceHelper.putSettingsExtras(this, getPackageName(), settingsClassName); + RestrictedPreferenceHelper.putTileServiceExtras( + this, getPackageName(), tileServiceClassName); + }); } } diff --git a/src/com/android/settings/accessibility/AccessibilityServicePreference.java b/src/com/android/settings/accessibility/AccessibilityServicePreference.java index c2c1a22be9c..c1dfae80fb7 100644 --- a/src/com/android/settings/accessibility/AccessibilityServicePreference.java +++ b/src/com/android/settings/accessibility/AccessibilityServicePreference.java @@ -24,6 +24,7 @@ import android.content.pm.ResolveInfo; import android.graphics.Color; import android.graphics.drawable.Drawable; import android.os.Bundle; +import android.util.Log; import androidx.core.content.ContextCompat; @@ -31,17 +32,24 @@ import com.android.settings.R; import com.android.settings.Utils; import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.RestrictedPreference; +import com.android.settingslib.utils.ThreadUtils; + +import com.google.common.util.concurrent.ListenableFuture; + +import java.util.concurrent.ExecutionException; /** * Preference item for showing an accessibility service in a preference list */ public class AccessibilityServicePreference extends RestrictedPreference { + private static final String LOG_TAG = AccessibilityServicePreference.class.getSimpleName(); // Index of the first preference in a preference category. private static final int FIRST_PREFERENCE_IN_CATEGORY_INDEX = -1; private final PackageManager mPm; private final AccessibilityServiceInfo mA11yServiceInfo; private final ComponentName mComponentName; private final boolean mServiceEnabled; + private final ListenableFuture mExtraArgumentsFuture; public AccessibilityServicePreference(Context context, String packageName, int uid, AccessibilityServiceInfo a11yServiceInfo, boolean serviceEnabled) { @@ -63,13 +71,28 @@ public class AccessibilityServicePreference extends RestrictedPreference { setPersistent(false); // Disable SharedPreferences. setOrder(FIRST_PREFERENCE_IN_CATEGORY_INDEX); - final Drawable icon = getA11yServiceIcon(); - setIcon(icon); + // kick off image loading tasks + ThreadUtils.postOnBackgroundThread(() -> { + final Drawable icon = getA11yServiceIcon(); + ThreadUtils.getUiThreadHandler().post(() -> this.setIcon(icon)); + }); final Bundle extras = getExtras(); extras.putParcelable(AccessibilitySettings.EXTRA_COMPONENT_NAME, mComponentName); - setupDataForOpenFragment(); + mExtraArgumentsFuture = ThreadUtils.postOnBackgroundThread(this::setupDataForOpenFragment); + } + + @Override + public void performClick() { + try { + mExtraArgumentsFuture.get(); + } catch (InterruptedException | ExecutionException e) { + Log.e(LOG_TAG, + "Unable to finish grabbing necessary arguments to open the fragment: " + + "componentName: " + mComponentName); + } + super.performClick(); } private Drawable getA11yServiceIcon() { @@ -97,13 +120,14 @@ public class AccessibilityServicePreference extends RestrictedPreference { final int metricsCategory = FeatureFactory.getFeatureFactory() .getAccessibilityMetricsFeatureProvider() .getDownloadedFeatureMetricsCategory(mComponentName); - - RestrictedPreferenceHelper.putBasicExtras( - this, prefKey, getTitle(), intro, description, imageRes, - htmlDescription, mComponentName, metricsCategory); - RestrictedPreferenceHelper.putServiceExtras(this, resolveInfo, mServiceEnabled); - RestrictedPreferenceHelper.putSettingsExtras(this, getPackageName(), settingsClassName); - RestrictedPreferenceHelper.putTileServiceExtras( - this, getPackageName(), tileServiceClassName); + ThreadUtils.getUiThreadHandler().post(() -> { + RestrictedPreferenceHelper.putBasicExtras( + this, prefKey, getTitle(), intro, description, imageRes, + htmlDescription, mComponentName, metricsCategory); + RestrictedPreferenceHelper.putServiceExtras(this, resolveInfo, mServiceEnabled); + RestrictedPreferenceHelper.putSettingsExtras(this, getPackageName(), settingsClassName); + RestrictedPreferenceHelper.putTileServiceExtras( + this, getPackageName(), tileServiceClassName); + }); } }