diff options
5 files changed, 70 insertions, 41 deletions
diff --git a/java/src/com/android/intentresolver/v2/ChooserActivity.java b/java/src/com/android/intentresolver/v2/ChooserActivity.java index 95eedf47..60ea1b1c 100644 --- a/java/src/com/android/intentresolver/v2/ChooserActivity.java +++ b/java/src/com/android/intentresolver/v2/ChooserActivity.java @@ -236,21 +236,20 @@ public class ChooserActivity extends Hilt_ChooserActivity implements private final AtomicLong mIntentReceivedTime = new AtomicLong(-1); - public ChooserActivity() { - super(); - mLogic = new ChooserActivityLogic( + @Override + protected void onCreate(Bundle savedInstanceState) { + Tracer.INSTANCE.markLaunched(); + super.onCreate(savedInstanceState); + setLogic(new ChooserActivityLogic( TAG, () -> this, this::onWorkProfileStatusUpdated, () -> mTargetDataLoader, - this::onPreinitialization - ); + this::onPreinitialization)); + addInitializer(this::init); } - @Override - protected void onCreate(Bundle savedInstanceState) { - Tracer.INSTANCE.markLaunched(); - super.onCreate(savedInstanceState); + private void init() { if (getChooserRequest() == null) { finish(); return; @@ -719,7 +718,9 @@ public class ChooserActivity extends Hilt_ChooserActivity implements @Override protected void onStop() { super.onStop(); - mRefinementManager.onActivityStop(isChangingConfigurations()); + if (mRefinementManager != null) { + mRefinementManager.onActivityStop(isChangingConfigurations()); + } if (mFinishWhenStopped) { mFinishWhenStopped = false; diff --git a/java/src/com/android/intentresolver/v2/ChooserActivityLogic.kt b/java/src/com/android/intentresolver/v2/ChooserActivityLogic.kt index 5303a7e7..7bc39a24 100644 --- a/java/src/com/android/intentresolver/v2/ChooserActivityLogic.kt +++ b/java/src/com/android/intentresolver/v2/ChooserActivityLogic.kt @@ -10,6 +10,8 @@ import com.android.intentresolver.R import com.android.intentresolver.icons.TargetDataLoader import com.android.intentresolver.v2.util.mutableLazy +private const val TAG = "ChooserActivityLogic" + /** * Activity logic for [ChooserActivity]. * diff --git a/java/src/com/android/intentresolver/v2/ResolverActivity.java b/java/src/com/android/intentresolver/v2/ResolverActivity.java index a7f2047d..8f8a7d0d 100644 --- a/java/src/com/android/intentresolver/v2/ResolverActivity.java +++ b/java/src/com/android/intentresolver/v2/ResolverActivity.java @@ -33,7 +33,9 @@ import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTE import static com.android.internal.annotations.VisibleForTesting.Visibility.PROTECTED; +import static java.util.Collections.emptyList; import static java.util.Objects.requireNonNull; +import static java.util.Objects.requireNonNullElse; import android.app.ActivityManager; import android.app.ActivityThread; @@ -91,6 +93,7 @@ import android.widget.TabWidget; import android.widget.TextView; import android.widget.Toast; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.StringRes; import androidx.annotation.UiThread; @@ -129,9 +132,12 @@ import kotlin.Unit; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; +import java.util.LinkedList; import java.util.List; import java.util.Objects; +import java.util.Queue; import java.util.Set; +import java.util.function.Consumer; /** * This is a copy of ResolverActivity to support IntentResolver's ChooserActivity. This code is @@ -143,11 +149,9 @@ import java.util.Set; public class ResolverActivity extends FragmentActivity implements ResolverListAdapter.ResolverListCommunicator { - protected ActivityLogic mLogic = new ResolverActivityLogic( - TAG, - () -> this, - this::onWorkProfileStatusUpdated - ); + private final List<Runnable> mInit = new ArrayList<>(); + + protected ActivityLogic mLogic; public ResolverActivity() { mIsIntentPicker = getClass().equals(ResolverActivity.class); @@ -307,30 +311,47 @@ public class ResolverActivity extends FragmentActivity implements } }; } + protected interface Initializer { + void initialize(ActivityLogic value); + } + + protected void setLogic(ActivityLogic logic) { + mLogic = logic; + } + + protected void addInitializer(Runnable initializer) { + mInit.add(initializer); + } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (isFinishing()) { // Performing a clean exit: - // Skip initializing any additional resources. + // Skip initializing anything. return; } + setLogic(new ResolverActivityLogic( + TAG, + () -> this, + this::onWorkProfileStatusUpdated)); + addInitializer(this::init); + } + + @Override + protected final void onPostCreate(@Nullable Bundle savedInstanceState) { + super.onPostCreate(savedInstanceState); + mInit.forEach(Runnable::run); + } + + private void init() { setTheme(mLogic.getThemeResId()); mLogic.preInitialization(); - init( - mLogic.getTargetIntent(), - mLogic.getInitialIntents() == null - ? null : mLogic.getInitialIntents().toArray(new Intent[0]), - mLogic.getTargetDataLoader() - ); - } - protected void init( - Intent intent, - Intent[] initialIntents, - TargetDataLoader targetDataLoader - ) { + Intent intent = mLogic.getTargetIntent(); + List<Intent> initialIntents = mLogic.getInitialIntents(); + TargetDataLoader targetDataLoader = mLogic.getTargetDataLoader(); + // Calling UID did not have valid permissions if (mLogic.getAnnotatedUserHandles() == null) { finish(); @@ -350,7 +371,7 @@ public class ResolverActivity extends FragmentActivity implements boolean filterLastUsed = mLogic.getSupportsAlwaysUseOption() && !isVoiceInteraction() && !shouldShowTabs() && !hasCloneProfile(); mMultiProfilePagerAdapter = createMultiProfilePagerAdapter( - initialIntents, + requireNonNullElse(initialIntents, emptyList()).toArray(new Intent[0]), /* resolutionList = */ null, filterLastUsed, targetDataLoader diff --git a/tests/activity/src/com/android/intentresolver/v2/ChooserWrapperActivity.java b/tests/activity/src/com/android/intentresolver/v2/ChooserWrapperActivity.java index a314ee97..6eace9f4 100644 --- a/tests/activity/src/com/android/intentresolver/v2/ChooserWrapperActivity.java +++ b/tests/activity/src/com/android/intentresolver/v2/ChooserWrapperActivity.java @@ -57,16 +57,16 @@ public class ChooserWrapperActivity extends ChooserActivity implements IChooserW static final ChooserActivityOverrideData sOverrides = ChooserActivityOverrideData.getInstance(); private UsageStatsManager mUsm; - public ChooserWrapperActivity() { - super(); - mLogic = new TestChooserActivityLogic( - "ChooserWrapper", - () -> this, - this::onWorkProfileStatusUpdated, - () -> mTargetDataLoader, - this::onPreinitialization, - sOverrides - ); + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setLogic(new TestChooserActivityLogic( + "ChooserWrapper", + () -> this, + this::onWorkProfileStatusUpdated, + () -> mTargetDataLoader, + this::onPreinitialization, + sOverrides)); } // ResolverActivity (the base class of ChooserActivity) inspects the launched-from UID at diff --git a/tests/activity/src/com/android/intentresolver/v2/ResolverWrapperActivity.java b/tests/activity/src/com/android/intentresolver/v2/ResolverWrapperActivity.java index 92b73d92..7ae58254 100644 --- a/tests/activity/src/com/android/intentresolver/v2/ResolverWrapperActivity.java +++ b/tests/activity/src/com/android/intentresolver/v2/ResolverWrapperActivity.java @@ -62,7 +62,12 @@ public class ResolverWrapperActivity extends ResolverActivity { public ResolverWrapperActivity() { super(/* isIntentPicker= */ true); - mLogic = new TestResolverActivityLogic( + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setLogic(new TestResolverActivityLogic( "ResolverWrapper", () -> this, () -> { @@ -70,7 +75,7 @@ public class ResolverWrapperActivity extends ResolverActivity { return Unit.INSTANCE; }, sOverrides - ); + )); } public CountingIdlingResource getLabelIdlingResource() { |