diff options
| author | 2023-01-31 16:35:21 +0000 | |
|---|---|---|
| committer | 2023-01-31 16:35:21 +0000 | |
| commit | f05c774e2af5d766b2ea561abb8a8b0d361cbe9c (patch) | |
| tree | 95911d43ef49bce8d7b191fa18a143b2c052509a /java | |
| parent | 1ec46f3799bb75aa741eea2cc52af96db21c6f6f (diff) | |
| parent | 78f87a3886577b1937cbac96256596f1d72c5945 (diff) | |
Merge "Use SystemUI feature flags" into tm-qpr-dev
Diffstat (limited to 'java')
7 files changed, 78 insertions, 29 deletions
diff --git a/java/src/com/android/intentresolver/ChooserActivity.java b/java/src/com/android/intentresolver/ChooserActivity.java index 7fa715c3..e741b06c 100644 --- a/java/src/com/android/intentresolver/ChooserActivity.java +++ b/java/src/com/android/intentresolver/ChooserActivity.java @@ -98,6 +98,9 @@ import com.android.intentresolver.NoCrossProfileEmptyStateProvider.DevicePolicyB import com.android.intentresolver.chooser.DisplayResolveInfo; import com.android.intentresolver.chooser.MultiDisplayResolveInfo; import com.android.intentresolver.chooser.TargetInfo; +import com.android.intentresolver.flags.FeatureFlagRepository; +import com.android.intentresolver.flags.FeatureFlagRepositoryFactory; +import com.android.intentresolver.flags.Flags; import com.android.intentresolver.grid.ChooserGridAdapter; import com.android.intentresolver.grid.DirectShareViewHolder; import com.android.intentresolver.model.AbstractResolverComparator; @@ -160,8 +163,6 @@ public class ChooserActivity extends ResolverActivity implements private static final String CHIP_ICON_METADATA_KEY = "android.service.chooser.chip_icon"; private static final boolean DEBUG = true; - static final boolean ENABLE_CUSTOM_ACTIONS = false; - static final boolean ENABLE_RESELECTION_ACTION = false; public static final String LAUNCH_LOCATION_DIRECT_SHARE = "direct_share"; private static final String SHORTCUT_TARGET = "shortcut_target"; @@ -218,6 +219,9 @@ public class ChooserActivity extends ResolverActivity implements @Nullable private ChooserRequestParameters mChooserRequest; + private FeatureFlagRepository mFeatureFlagRepository; + private ChooserContentPreviewUi mChooserContentPreviewUi; + private boolean mShouldDisplayLandscape; // statsd logger wrapper protected ChooserActivityLogger mChooserActivityLogger; @@ -267,19 +271,20 @@ public class ChooserActivity extends ResolverActivity implements getChooserActivityLogger().logSharesheetTriggered(); + mFeatureFlagRepository = createFeatureFlagRepository(); try { mChooserRequest = new ChooserRequestParameters( getIntent(), getReferrer(), getNearbySharingComponent(), - ENABLE_CUSTOM_ACTIONS, - ENABLE_RESELECTION_ACTION); + mFeatureFlagRepository); } catch (IllegalArgumentException e) { Log.e(TAG, "Caller provided invalid Chooser request parameters", e); finish(); super_onCreate(null); return; } + mChooserContentPreviewUi = new ChooserContentPreviewUi(mFeatureFlagRepository); setAdditionalTargets(mChooserRequest.getAdditionalTargets()); @@ -366,6 +371,10 @@ public class ChooserActivity extends ResolverActivity implements return R.style.Theme_DeviceDefault_Chooser; } + protected FeatureFlagRepository createFeatureFlagRepository() { + return new FeatureFlagRepositoryFactory().create(getApplicationContext()); + } + private void createProfileRecords( AppPredictorFactory factory, IntentFilter targetIntentFilter) { UserHandle mainUserHandle = getPersonalProfileUserHandle(); @@ -753,7 +762,8 @@ public class ChooserActivity extends ResolverActivity implements @Nullable @Override public Runnable getReselectionAction() { - if (!ENABLE_RESELECTION_ACTION) { + if (!mFeatureFlagRepository + .isEnabled(Flags.SHARESHEET_RESELECTION_ACTION)) { return null; } PendingIntent reselectionAction = mChooserRequest.getReselectionAction(); @@ -763,15 +773,12 @@ public class ChooserActivity extends ResolverActivity implements } }; - ViewGroup layout = ChooserContentPreviewUi.displayContentPreview( + ViewGroup layout = mChooserContentPreviewUi.displayContentPreview( previewType, targetIntent, getResources(), getLayoutInflater(), actionFactory, - ENABLE_CUSTOM_ACTIONS - ? R.layout.scrollable_chooser_action_row - : R.layout.chooser_action_row, parent, imageLoader, mEnterTransitionAnimationDelegate, diff --git a/java/src/com/android/intentresolver/ChooserContentPreviewUi.java b/java/src/com/android/intentresolver/ChooserContentPreviewUi.java index f3d00c43..26c08e36 100644 --- a/java/src/com/android/intentresolver/ChooserContentPreviewUi.java +++ b/java/src/com/android/intentresolver/ChooserContentPreviewUi.java @@ -45,6 +45,8 @@ import android.widget.TextView; import androidx.annotation.LayoutRes; import androidx.annotation.Nullable; +import com.android.intentresolver.flags.FeatureFlagRepository; +import com.android.intentresolver.flags.Flags; import com.android.intentresolver.widget.ActionRow; import com.android.intentresolver.widget.ImagePreviewView; import com.android.intentresolver.widget.ImagePreviewView.TransitionElementStatusCallback; @@ -129,6 +131,8 @@ public final class ChooserContentPreviewUi { private static final String PLURALS_COUNT = "count"; private static final String PLURALS_FILE_NAME = "file_name"; + private final FeatureFlagRepository mFeatureFlagRepository; + /** Determine the most appropriate type of preview to show for the provided {@link Intent}. */ @ContentPreviewType public static int findPreferredContentPreview( @@ -164,17 +168,21 @@ public final class ChooserContentPreviewUi { return CONTENT_PREVIEW_TEXT; } + public ChooserContentPreviewUi( + FeatureFlagRepository featureFlagRepository) { + mFeatureFlagRepository = featureFlagRepository; + } + /** * Display a content preview of the specified {@code previewType} to preview the content of the * specified {@code intent}. */ - public static ViewGroup displayContentPreview( + public ViewGroup displayContentPreview( @ContentPreviewType int previewType, Intent targetIntent, Resources resources, LayoutInflater layoutInflater, ActionFactory actionFactory, - @LayoutRes int actionRowLayout, ViewGroup parent, ImageLoader previewImageLoader, TransitionElementStatusCallback transitionElementStatusCallback, @@ -185,6 +193,9 @@ public final class ChooserContentPreviewUi { if (previewType != CONTENT_PREVIEW_IMAGE) { transitionElementStatusCallback.onAllTransitionElementsReady(); } + int actionRowLayout = mFeatureFlagRepository.isEnabled(Flags.SHARESHEET_CUSTOM_ACTIONS) + ? R.layout.scrollable_chooser_action_row + : R.layout.chooser_action_row; List<ActionRow.Action> customActions = actionFactory.createCustomActions(); switch (previewType) { case CONTENT_PREVIEW_TEXT: @@ -230,7 +241,7 @@ public final class ChooserContentPreviewUi { } Runnable reselectionAction = actionFactory.getReselectionAction(); if (reselectionAction != null && layout != null - && ChooserActivity.ENABLE_RESELECTION_ACTION) { + && mFeatureFlagRepository.isEnabled(Flags.SHARESHEET_RESELECTION_ACTION)) { View reselectionView = layout.findViewById(R.id.reselection_action); if (reselectionView != null) { reselectionView.setVisibility(View.VISIBLE); @@ -241,12 +252,12 @@ public final class ChooserContentPreviewUi { return layout; } - private static List<ActionRow.Action> createActions( + private List<ActionRow.Action> createActions( List<ActionRow.Action> systemActions, List<ActionRow.Action> customActions) { ArrayList<ActionRow.Action> actions = new ArrayList<>(systemActions.size() + customActions.size()); actions.addAll(systemActions); - if (ChooserActivity.ENABLE_CUSTOM_ACTIONS) { + if (mFeatureFlagRepository.isEnabled(Flags.SHARESHEET_CUSTOM_ACTIONS)) { actions.addAll(customActions); } return actions; @@ -594,6 +605,4 @@ public final class ChooserContentPreviewUi { this.hasThumbnail = hasThumbnail; } } - - private ChooserContentPreviewUi() {} } diff --git a/java/src/com/android/intentresolver/ChooserRequestParameters.java b/java/src/com/android/intentresolver/ChooserRequestParameters.java index 97bee82c..0d004b0d 100644 --- a/java/src/com/android/intentresolver/ChooserRequestParameters.java +++ b/java/src/com/android/intentresolver/ChooserRequestParameters.java @@ -33,6 +33,9 @@ import android.text.TextUtils; import android.util.Log; import android.util.Pair; +import com.android.intentresolver.flags.FeatureFlagRepository; +import com.android.intentresolver.flags.Flags; + import com.google.common.collect.ImmutableList; import java.net.URISyntaxException; @@ -101,8 +104,7 @@ public class ChooserRequestParameters { final Intent clientIntent, final Uri referrer, @Nullable final ComponentName nearbySharingComponent, - boolean extractCustomActions, - boolean extractReslectionAction) { + FeatureFlagRepository featureFlags) { final Intent requestedTarget = parseTargetIntentExtra( clientIntent.getParcelableExtra(Intent.EXTRA_INTENT)); mTarget = intentWithModifiedLaunchFlags(requestedTarget); @@ -137,10 +139,10 @@ public class ChooserRequestParameters { mTargetIntentFilter = getTargetIntentFilter(mTarget); - mChooserActions = extractCustomActions + mChooserActions = featureFlags.isEnabled(Flags.SHARESHEET_CUSTOM_ACTIONS) ? getChooserActions(clientIntent) : ImmutableList.of(); - mReselectionAction = extractReslectionAction + mReselectionAction = featureFlags.isEnabled(Flags.SHARESHEET_RESELECTION_ACTION) ? getReselectionActionExtra(clientIntent) : null; } @@ -194,7 +196,7 @@ public class ChooserRequestParameters { } /** - * Whether the {@link ChooserActivity.EXTRA_PRIVATE_RETAIN_IN_ON_STOP} behavior was requested. + * Whether the {@link ChooserActivity#EXTRA_PRIVATE_RETAIN_IN_ON_STOP} behavior was requested. */ public boolean shouldRetainInOnStop() { return mRetainInOnStop; diff --git a/java/src/com/android/intentresolver/flags/Flags.kt b/java/src/com/android/intentresolver/flags/Flags.kt index c9271a6a..6962b1c3 100644 --- a/java/src/com/android/intentresolver/flags/Flags.kt +++ b/java/src/com/android/intentresolver/flags/Flags.kt @@ -18,11 +18,17 @@ package com.android.intentresolver.flags import com.android.systemui.flags.UnreleasedFlag -// keep in sync with com.android.systemui.flags.Flags to make the flags available in the -// flag flipper app (see go/sysui-flags) +// Flag id, name and namespace should be kept in sync with [com.android.systemui.flags.Flags] to +// make the flags available in the flag flipper app (see go/sysui-flags). object Flags { + // TODO(b/266983432) Tracking Bug @JvmField - val SHARESHEET_CUSTOM_ACTIONS = UnreleasedFlag( - id = 1501, name = "sharesheet_custom_actions", namespace = "systemui", teamfood = false - ) + val SHARESHEET_CUSTOM_ACTIONS = unreleasedFlag(1501, "sharesheet_custom_actions") + + // TODO(b/266982749) Tracking Bug + @JvmField + val SHARESHEET_RESELECTION_ACTION = unreleasedFlag(1502, "sharesheet_reselection_action") + + private fun unreleasedFlag(id: Int, name: String, teamfood: Boolean = false) = + UnreleasedFlag(id, name, "systemui", teamfood) } diff --git a/java/tests/src/com/android/intentresolver/ChooserActivityOverrideData.java b/java/tests/src/com/android/intentresolver/ChooserActivityOverrideData.java index 5df0d4a2..857fa124 100644 --- a/java/tests/src/com/android/intentresolver/ChooserActivityOverrideData.java +++ b/java/tests/src/com/android/intentresolver/ChooserActivityOverrideData.java @@ -31,6 +31,7 @@ import com.android.intentresolver.AbstractMultiProfilePagerAdapter.CrossProfileI import com.android.intentresolver.AbstractMultiProfilePagerAdapter.MyUserIdProvider; import com.android.intentresolver.AbstractMultiProfilePagerAdapter.QuietModeManager; import com.android.intentresolver.chooser.TargetInfo; +import com.android.intentresolver.flags.FeatureFlagRepository; import com.android.intentresolver.shortcuts.ShortcutLoader; import java.util.function.Consumer; @@ -76,6 +77,7 @@ public class ChooserActivityOverrideData { public MyUserIdProvider mMyUserIdProvider; public CrossProfileIntentsChecker mCrossProfileIntentsChecker; public PackageManager packageManager; + public FeatureFlagRepository featureFlagRepository; public void reset() { onSafelyStartCallback = null; @@ -128,6 +130,7 @@ public class ChooserActivityOverrideData { mCrossProfileIntentsChecker = mock(CrossProfileIntentsChecker.class); when(mCrossProfileIntentsChecker.hasCrossProfileIntents(any(), anyInt(), anyInt())) .thenAnswer(invocation -> hasCrossProfileIntents); + featureFlagRepository = null; } private ChooserActivityOverrideData() {} diff --git a/java/tests/src/com/android/intentresolver/ChooserWrapperActivity.java b/java/tests/src/com/android/intentresolver/ChooserWrapperActivity.java index 6bc5e12a..a47014e8 100644 --- a/java/tests/src/com/android/intentresolver/ChooserWrapperActivity.java +++ b/java/tests/src/com/android/intentresolver/ChooserWrapperActivity.java @@ -39,6 +39,7 @@ import com.android.intentresolver.AbstractMultiProfilePagerAdapter.QuietModeMana import com.android.intentresolver.chooser.DisplayResolveInfo; import com.android.intentresolver.chooser.NotSelectableTargetInfo; import com.android.intentresolver.chooser.TargetInfo; +import com.android.intentresolver.flags.FeatureFlagRepository; import com.android.intentresolver.grid.ChooserGridAdapter; import com.android.intentresolver.shortcuts.ShortcutLoader; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; @@ -287,4 +288,12 @@ public class ChooserWrapperActivity return super.createShortcutLoader( context, appPredictor, userHandle, targetIntentFilter, callback); } + + @Override + protected FeatureFlagRepository createFeatureFlagRepository() { + if (sOverrides.featureFlagRepository != null) { + return sOverrides.featureFlagRepository; + } + return super.createFeatureFlagRepository(); + } } diff --git a/java/tests/src/com/android/intentresolver/UnbundledChooserActivityTest.java b/java/tests/src/com/android/intentresolver/UnbundledChooserActivityTest.java index d7af8925..53c357d6 100644 --- a/java/tests/src/com/android/intentresolver/UnbundledChooserActivityTest.java +++ b/java/tests/src/com/android/intentresolver/UnbundledChooserActivityTest.java @@ -101,9 +101,13 @@ import androidx.test.rule.ActivityTestRule; import com.android.intentresolver.ResolverActivity.ResolvedComponentInfo; import com.android.intentresolver.chooser.DisplayResolveInfo; +import com.android.intentresolver.flags.FeatureFlagRepository; +import com.android.intentresolver.flags.Flags; import com.android.intentresolver.shortcuts.ShortcutLoader; import com.android.internal.config.sysui.SystemUiDeviceConfigFlags; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; +import com.android.systemui.flags.ReleasedFlag; +import com.android.systemui.flags.UnreleasedFlag; import org.hamcrest.Description; import org.hamcrest.Matcher; @@ -1673,9 +1677,18 @@ public class UnbundledChooserActivityTest { @Test public void testLaunchWithCustomAction() throws InterruptedException { - if (!ChooserActivity.ENABLE_CUSTOM_ACTIONS) { - return; - } + ChooserActivityOverrideData.getInstance().featureFlagRepository = + new FeatureFlagRepository() { + @Override + public boolean isEnabled(@NonNull UnreleasedFlag flag) { + return Flags.SHARESHEET_CUSTOM_ACTIONS.equals(flag) || flag.getDefault(); + } + + @Override + public boolean isEnabled(@NonNull ReleasedFlag flag) { + return false; + } + }; List<ResolvedComponentInfo> resolvedComponentInfos = createResolvedComponentsForTest(2); when( ChooserActivityOverrideData |