From c5d2a0a21d5fb04440c7c759a193cbc6fad854cd Mon Sep 17 00:00:00 2001 From: Mark Renouf Date: Sat, 16 Dec 2023 13:36:17 -0500 Subject: Inject app prediction service availability directly Instead of depending on and mocking PackageManager, this change creates a module to provide the availability signal. This greatly simplifies test setup when used with Hilt. This also sets the @Parameter label to a human readable value shoing the parameter value for a given test (in the test name). Test: atest IntentResolver-tests-activity Bug: 300157408 Change-Id: Ief02bf0e51e879916296d5872d1946db43f78ad0 --- .../android/intentresolver/ChooserActivity.java | 3 +- .../shortcuts/AppPredictorFactory.kt | 8 ++-- .../android/intentresolver/v2/ChooserActivity.java | 11 +++--- .../intentresolver/v2/ResolverActivity.java | 8 ++-- .../v2/platform/AppPredictionModule.kt | 45 ++++++++++++++++++++++ 5 files changed, 59 insertions(+), 16 deletions(-) create mode 100644 java/src/com/android/intentresolver/v2/platform/AppPredictionModule.kt (limited to 'java/src') diff --git a/java/src/com/android/intentresolver/ChooserActivity.java b/java/src/com/android/intentresolver/ChooserActivity.java index b1c7d6fb..82e46a57 100644 --- a/java/src/com/android/intentresolver/ChooserActivity.java +++ b/java/src/com/android/intentresolver/ChooserActivity.java @@ -259,7 +259,8 @@ public class ChooserActivity extends Hilt_ChooserActivity implements new AppPredictorFactory( this, mChooserRequest.getSharedText(), - mChooserRequest.getTargetIntentFilter()), + mChooserRequest.getTargetIntentFilter(), + getPackageManager().getAppPredictionServicePackageName() != null), mChooserRequest.getTargetIntentFilter()); diff --git a/java/src/com/android/intentresolver/shortcuts/AppPredictorFactory.kt b/java/src/com/android/intentresolver/shortcuts/AppPredictorFactory.kt index 82f40b91..e544e064 100644 --- a/java/src/com/android/intentresolver/shortcuts/AppPredictorFactory.kt +++ b/java/src/com/android/intentresolver/shortcuts/AppPredictorFactory.kt @@ -41,16 +41,14 @@ private const val SHARED_TEXT_KEY = "shared_text" class AppPredictorFactory( private val context: Context, private val sharedText: String?, - private val targetIntentFilter: IntentFilter? + private val targetIntentFilter: IntentFilter?, + private val appPredictionAvailable: Boolean, ) { - private val mIsComponentAvailable = - context.packageManager.appPredictionServicePackageName != null - /** * Creates an AppPredictor instance for a profile or `null` if app predictor is not available. */ fun create(userHandle: UserHandle): AppPredictor? { - if (!mIsComponentAvailable) return null + if (!appPredictionAvailable) return null val contextAsUser = context.createContextAsUser(userHandle, 0 /* flags */) val extras = Bundle().apply { putParcelable(APP_PREDICTION_INTENT_FILTER_KEY, targetIntentFilter) diff --git a/java/src/com/android/intentresolver/v2/ChooserActivity.java b/java/src/com/android/intentresolver/v2/ChooserActivity.java index e281613d..54d8b4cb 100644 --- a/java/src/com/android/intentresolver/v2/ChooserActivity.java +++ b/java/src/com/android/intentresolver/v2/ChooserActivity.java @@ -145,6 +145,7 @@ import com.android.intentresolver.v2.emptystate.NoAppsAvailableEmptyStateProvide import com.android.intentresolver.v2.emptystate.NoCrossProfileEmptyStateProvider; import com.android.intentresolver.v2.emptystate.NoCrossProfileEmptyStateProvider.DevicePolicyBlockerEmptyState; import com.android.intentresolver.v2.emptystate.WorkProfilePausedEmptyStateProvider; +import com.android.intentresolver.v2.platform.AppPredictionAvailable; import com.android.intentresolver.v2.platform.ImageEditor; import com.android.intentresolver.v2.platform.NearbyShare; import com.android.intentresolver.v2.ui.ActionTitle; @@ -221,7 +222,6 @@ public class ChooserActivity extends Hilt_ChooserActivity implements protected static final int PROFILE_PERSONAL = MultiProfilePagerAdapter.PROFILE_PERSONAL; protected static final int PROFILE_WORK = MultiProfilePagerAdapter.PROFILE_WORK; private boolean mRegistered; - protected PackageManager mPm; private PackageMonitor mPersonalPackageMonitor; private PackageMonitor mWorkPackageMonitor; protected View mProfileView; @@ -262,11 +262,12 @@ public class ChooserActivity extends Hilt_ChooserActivity implements @Inject public FeatureFlags mFeatureFlags; @Inject public EventLog mEventLog; + @Inject @AppPredictionAvailable public boolean mAppPredictionAvailable; @Inject @ImageEditor public Optional mImageEditor; @Inject @NearbyShare public Optional mNearbyShare; @Inject public TargetDataLoader mTargetDataLoader; - @Inject public DevicePolicyResources mDevicePolicyResources; + private ChooserRefinementManager mRefinementManager; private ChooserContentPreviewUi mChooserContentPreviewUi; @@ -356,7 +357,8 @@ public class ChooserActivity extends Hilt_ChooserActivity implements new AppPredictorFactory( this, chooserRequest.getSharedText(), - chooserRequest.getTargetIntentFilter() + chooserRequest.getTargetIntentFilter(), + mAppPredictionAvailable ), chooserRequest.getTargetIntentFilter() ); @@ -371,7 +373,6 @@ public class ChooserActivity extends Hilt_ChooserActivity implements return; } - mPm = getPackageManager(); mChooserMultiProfilePagerAdapter = createMultiProfilePagerAdapter( requireNonNullElse(initialIntents, emptyList()).toArray(new Intent[0]), /* resolutionList = */ null, @@ -2180,7 +2181,7 @@ public class ChooserActivity extends Hilt_ChooserActivity implements return new ChooserListController( this, - mPm, + getPackageManager(), mLogic.getTargetIntent(), mLogic.getReferrerPackageName(), requireAnnotatedUserHandles().userIdOfCallingApp, diff --git a/java/src/com/android/intentresolver/v2/ResolverActivity.java b/java/src/com/android/intentresolver/v2/ResolverActivity.java index a56d15a2..dbc24604 100644 --- a/java/src/com/android/intentresolver/v2/ResolverActivity.java +++ b/java/src/com/android/intentresolver/v2/ResolverActivity.java @@ -151,7 +151,6 @@ public class ResolverActivity extends Hilt_ResolverActivity implements private PickTargetOptionRequest mPickOptionRequest; // Expected to be true if this object is ResolverActivity or is ResolverWrapperActivity. protected ResolverDrawerLayout mResolverDrawerLayout; - protected PackageManager mPm; private static final String TAG = "ResolverActivity"; private static final boolean DEBUG = false; @@ -257,7 +256,6 @@ public class ResolverActivity extends Hilt_ResolverActivity implements return; } - mPm = getPackageManager(); // The last argument of createResolverListAdapter is whether to do special handling // of the last used choice to highlight it in the list. We need to always @@ -755,7 +753,7 @@ public class ResolverActivity extends Hilt_ResolverActivity implements null); return new ResolverListController( this, - mPm, + getPackageManager(), mLogic.getTargetIntent(), mLogic.getReferrerPackageName(), requireAnnotatedUserHandles().userIdOfCallingApp, @@ -1239,8 +1237,8 @@ public class ResolverActivity extends Hilt_ResolverActivity implements if (ri != null) { ActivityInfo activityInfo = ri.activityInfo; - boolean hasRecordPermission = - mPm.checkPermission(android.Manifest.permission.RECORD_AUDIO, + boolean hasRecordPermission = getPackageManager() + .checkPermission(android.Manifest.permission.RECORD_AUDIO, activityInfo.packageName) == PackageManager.PERMISSION_GRANTED; diff --git a/java/src/com/android/intentresolver/v2/platform/AppPredictionModule.kt b/java/src/com/android/intentresolver/v2/platform/AppPredictionModule.kt new file mode 100644 index 00000000..9ca9d871 --- /dev/null +++ b/java/src/com/android/intentresolver/v2/platform/AppPredictionModule.kt @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2023 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.platform + +import android.content.pm.PackageManager +import dagger.Module +import dagger.Provides +import dagger.Reusable +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import javax.inject.Qualifier +import javax.inject.Singleton + +@Qualifier +@MustBeDocumented +@Retention(AnnotationRetention.RUNTIME) +annotation class AppPredictionAvailable + +@Module +@InstallIn(SingletonComponent::class) +object AppPredictionModule { + + /** + * Eventually replaced with: Optional, etc. + */ + @Provides + @Singleton + @AppPredictionAvailable + fun isAppPredictionAvailable(packageManager: PackageManager): Boolean { + return packageManager.appPredictionServicePackageName != null + } +} \ No newline at end of file -- cgit v1.2.3-59-g8ed1b