summaryrefslogtreecommitdiff
path: root/java/src
diff options
context:
space:
mode:
Diffstat (limited to 'java/src')
-rw-r--r--java/src/com/android/intentresolver/v2/ChooserActivity.java22
-rw-r--r--java/src/com/android/intentresolver/v2/ResolverActivity.java12
-rw-r--r--java/src/com/android/intentresolver/v2/ext/CreationExtrasExt.kt13
-rw-r--r--java/src/com/android/intentresolver/v2/ui/model/ActivityModel.kt12
-rw-r--r--java/src/com/android/intentresolver/v2/ui/model/ActivityModelModule.kt43
-rw-r--r--java/src/com/android/intentresolver/v2/ui/viewmodel/ChooserViewModel.kt8
6 files changed, 47 insertions, 63 deletions
diff --git a/java/src/com/android/intentresolver/v2/ChooserActivity.java b/java/src/com/android/intentresolver/v2/ChooserActivity.java
index 765d7c2d..8387212a 100644
--- a/java/src/com/android/intentresolver/v2/ChooserActivity.java
+++ b/java/src/com/android/intentresolver/v2/ChooserActivity.java
@@ -31,6 +31,7 @@ import static androidx.lifecycle.LifecycleKt.getCoroutineScope;
import static com.android.intentresolver.contentpreview.ContentPreviewType.CONTENT_PREVIEW_PAYLOAD_SELECTION;
import static com.android.intentresolver.v2.ext.CreationExtrasExtKt.addDefaultArgs;
+import static com.android.intentresolver.v2.ui.model.ActivityModel.ACTIVITY_MODEL_KEY;
import static com.android.internal.annotations.VisibleForTesting.Visibility.PROTECTED;
import static com.android.internal.util.LatencyTracker.ACTION_LOAD_SHARE_SHEET;
@@ -274,7 +275,6 @@ public class ChooserActivity extends Hilt_ChooserActivity implements
private static final int SCROLL_STATUS_SCROLLING_HORIZONTAL = 2;
@Inject public ChooserHelper mChooserHelper;
- @Inject public ActivityModel mActivityModel;
@Inject public FeatureFlags mFeatureFlags;
@Inject public android.service.chooser.FeatureFlags mChooserServiceFeatureFlags;
@Inject public EventLog mEventLog;
@@ -333,7 +333,13 @@ public class ChooserActivity extends Hilt_ChooserActivity implements
private boolean mFinishWhenStopped = false;
private final AtomicLong mIntentReceivedTime = new AtomicLong(-1);
+
+ protected ActivityModel createActivityModel() {
+ return ActivityModel.createFrom(this);
+ }
+
private ChooserViewModel mViewModel;
+ private ActivityModel mActivityModel;
@VisibleForTesting
protected ChooserActivityLogic createActivityLogic() {
@@ -348,30 +354,32 @@ public class ChooserActivity extends Hilt_ChooserActivity implements
public CreationExtras getDefaultViewModelCreationExtras() {
return addDefaultArgs(
super.getDefaultViewModelCreationExtras(),
- new Pair<>(ActivityModel.ACTIVITY_MODEL_KEY, mActivityModel));
+ new Pair<>(ACTIVITY_MODEL_KEY, createActivityModel()));
}
@Override
protected final void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.i(TAG, "onCreate");
- Log.i(TAG, "mActivityModel=" + mActivityModel.toString());
-
- // The postInit hook is invoked when this function returns, via Lifecycle.
- mChooserHelper.setPostCreateCallback(this::init);
+ mViewModel = new ViewModelProvider(this).get(ChooserViewModel.class);
+ mActivityModel = mViewModel.getActivityModel();
int callerUid = mActivityModel.getLaunchedFromUid();
if (callerUid < 0 || UserHandle.isIsolated(callerUid)) {
Log.e(TAG, "Can't start a resolver from uid " + callerUid);
finish();
}
+
setTheme(R.style.Theme_DeviceDefault_Chooser);
Tracer.INSTANCE.markLaunched();
- mViewModel = new ViewModelProvider(this).get(ChooserViewModel.class);
if (!mViewModel.init()) {
finish();
return;
}
+
+ // The post-create callback is invoked when this function returns, via Lifecycle.
+ mChooserHelper.setPostCreateCallback(this::init);
+
IntentSender chosenComponentSender =
mViewModel.getChooserRequest().getChosenComponentSender();
if (chosenComponentSender != null) {
diff --git a/java/src/com/android/intentresolver/v2/ResolverActivity.java b/java/src/com/android/intentresolver/v2/ResolverActivity.java
index d985a161..a9d9f8b1 100644
--- a/java/src/com/android/intentresolver/v2/ResolverActivity.java
+++ b/java/src/com/android/intentresolver/v2/ResolverActivity.java
@@ -154,11 +154,10 @@ public class ResolverActivity extends Hilt_ResolverActivity implements
ResolverListAdapter.ResolverListCommunicator {
@Inject public PackageManager mPackageManager;
- @Inject public ActivityModel mActivityModel;
@Inject public DevicePolicyResources mDevicePolicyResources;
@Inject public IntentForwarding mIntentForwarding;
private ResolverRequest mResolverRequest;
-
+ private ActivityModel mActivityModel;
protected ActivityLogic mLogic;
protected TargetDataLoader mTargetDataLoader;
private boolean mResolvingHome;
@@ -218,6 +217,9 @@ public class ResolverActivity extends Hilt_ResolverActivity implements
}
};
}
+ protected ActivityModel createActivityModel() {
+ return ActivityModel.createFrom(this);
+ }
@VisibleForTesting
protected ActivityLogic createActivityLogic() {
@@ -232,15 +234,17 @@ public class ResolverActivity extends Hilt_ResolverActivity implements
public CreationExtras getDefaultViewModelCreationExtras() {
return addDefaultArgs(
super.getDefaultViewModelCreationExtras(),
- new Pair<>(ActivityModel.ACTIVITY_MODEL_KEY, mActivityModel));
+ new Pair<>(ActivityModel.ACTIVITY_MODEL_KEY, ActivityModel.createFrom(this)));
}
@Override
protected final void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setTheme(R.style.Theme_DeviceDefault_Resolver);
+ mActivityModel = createActivityModel();
+
Log.i(TAG, "onCreate");
- Log.i(TAG, "activityLaunch=" + mActivityModel.toString());
+ Log.i(TAG, "activityModel=" + mActivityModel.toString());
int callerUid = mActivityModel.getLaunchedFromUid();
if (callerUid < 0 || UserHandle.isIsolated(callerUid)) {
Log.e(TAG, "Can't start a resolver from uid " + callerUid);
diff --git a/java/src/com/android/intentresolver/v2/ext/CreationExtrasExt.kt b/java/src/com/android/intentresolver/v2/ext/CreationExtrasExt.kt
index ebd613f1..6c36e6aa 100644
--- a/java/src/com/android/intentresolver/v2/ext/CreationExtrasExt.kt
+++ b/java/src/com/android/intentresolver/v2/ext/CreationExtrasExt.kt
@@ -18,14 +18,17 @@ package com.android.intentresolver.v2.ext
import android.os.Bundle
import android.os.Parcelable
+import androidx.core.os.bundleOf
import androidx.lifecycle.DEFAULT_ARGS_KEY
import androidx.lifecycle.viewmodel.CreationExtras
+import androidx.lifecycle.viewmodel.MutableCreationExtras
-/** Adds one or more key-value pairs to the default Args bundle in this extras instance. */
+/**
+ * Returns a new instance with additional [values] added to the existing default args Bundle (if
+ * present), otherwise adds a new entry with a copy of this bundle.
+ */
fun CreationExtras.addDefaultArgs(vararg values: Pair<String, Parcelable>): CreationExtras {
val defaultArgs: Bundle = get(DEFAULT_ARGS_KEY) ?: Bundle()
- for ((key, value) in values) {
- defaultArgs.putParcelable(key, value)
- }
- return this
+ defaultArgs.putAll(bundleOf(*values))
+ return MutableCreationExtras(this).apply { set(DEFAULT_ARGS_KEY, defaultArgs) }
}
diff --git a/java/src/com/android/intentresolver/v2/ui/model/ActivityModel.kt b/java/src/com/android/intentresolver/v2/ui/model/ActivityModel.kt
index 02bb6640..07b17435 100644
--- a/java/src/com/android/intentresolver/v2/ui/model/ActivityModel.kt
+++ b/java/src/com/android/intentresolver/v2/ui/model/ActivityModel.kt
@@ -15,12 +15,14 @@
*/
package com.android.intentresolver.v2.ui.model
+import android.app.Activity
import android.content.Intent
import android.net.Uri
import android.os.Parcel
import android.os.Parcelable
import com.android.intentresolver.v2.ext.readParcelable
import com.android.intentresolver.v2.ext.requireParcelable
+import java.util.Objects
/** Contains Activity-scope information about the state when started. */
data class ActivityModel(
@@ -64,5 +66,15 @@ data class ActivityModel(
override fun newArray(size: Int) = arrayOfNulls<ActivityModel>(size)
override fun createFromParcel(source: Parcel) = ActivityModel(source)
}
+
+ @JvmStatic
+ fun createFrom(activity: Activity): ActivityModel {
+ return ActivityModel(
+ activity.intent,
+ activity.launchedFromUid,
+ Objects.requireNonNull<String>(activity.launchedFromPackage),
+ activity.referrer
+ )
+ }
}
}
diff --git a/java/src/com/android/intentresolver/v2/ui/model/ActivityModelModule.kt b/java/src/com/android/intentresolver/v2/ui/model/ActivityModelModule.kt
deleted file mode 100644
index d9fb1fa6..00000000
--- a/java/src/com/android/intentresolver/v2/ui/model/ActivityModelModule.kt
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (C) 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.intentresolver.v2.ui.model
-
-import android.app.Activity
-import dagger.Module
-import dagger.Provides
-import dagger.hilt.InstallIn
-import dagger.hilt.android.components.ActivityComponent
-import dagger.hilt.android.scopes.ActivityScoped
-
-@Module
-@InstallIn(ActivityComponent::class)
-object ActivityModelModule {
-
- @Provides
- @ActivityScoped
- fun activityModel(activity: Activity): ActivityModel {
- return ActivityModel(
- intent = activity.intent,
- launchedFromUid = activity.launchedFromUid,
- launchedFromPackage = requireNotNull(activity.launchedFromPackage) {
- "activity.launchedFromPackage was null. This is expected to be non-null for " +
- "any system-signed application!"
- },
- referrer = activity.referrer
- )
- }
-}
diff --git a/java/src/com/android/intentresolver/v2/ui/viewmodel/ChooserViewModel.kt b/java/src/com/android/intentresolver/v2/ui/viewmodel/ChooserViewModel.kt
index 424f36cd..8ed2fa29 100644
--- a/java/src/com/android/intentresolver/v2/ui/viewmodel/ChooserViewModel.kt
+++ b/java/src/com/android/intentresolver/v2/ui/viewmodel/ChooserViewModel.kt
@@ -39,17 +39,17 @@ constructor(
flags: ChooserServiceFlags,
) : ViewModel() {
- private val mActivityModel: ActivityModel =
+ /** Parcelable-only references provided from the creating Activity */
+ val activityModel: ActivityModel =
requireNotNull(args[ACTIVITY_MODEL_KEY]) {
"ActivityModel missing in SavedStateHandle! ($ACTIVITY_MODEL_KEY)"
}
/** The result of reading and validating the inputs provided in savedState. */
- private val status: ValidationResult<ChooserRequest> =
- readChooserRequest(mActivityModel, flags)
+ private val status: ValidationResult<ChooserRequest> = readChooserRequest(activityModel, flags)
val chooserRequest: ChooserRequest by lazy {
- when(status) {
+ when (status) {
is Valid -> status.value
is Invalid -> error(status.errors)
}