1 /* 2 * Copyright (C) 2008 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.intentresolver; 18 19 import android.annotation.Nullable; 20 import android.app.prediction.AppPredictor; 21 import android.app.usage.UsageStatsManager; 22 import android.content.ComponentName; 23 import android.content.ContentResolver; 24 import android.content.Context; 25 import android.content.Intent; 26 import android.content.IntentFilter; 27 import android.content.pm.PackageManager; 28 import android.content.pm.ResolveInfo; 29 import android.content.res.Resources; 30 import android.database.Cursor; 31 import android.net.Uri; 32 import android.os.UserHandle; 33 34 import com.android.intentresolver.AbstractMultiProfilePagerAdapter.CrossProfileIntentsChecker; 35 import com.android.intentresolver.AbstractMultiProfilePagerAdapter.MyUserIdProvider; 36 import com.android.intentresolver.chooser.DisplayResolveInfo; 37 import com.android.intentresolver.chooser.TargetInfo; 38 import com.android.intentresolver.flags.FeatureFlagRepository; 39 import com.android.intentresolver.grid.ChooserGridAdapter; 40 import com.android.intentresolver.shortcuts.ShortcutLoader; 41 import com.android.internal.logging.nano.MetricsProto.MetricsEvent; 42 43 import java.util.List; 44 import java.util.function.Consumer; 45 46 /** 47 * Simple wrapper around chooser activity to be able to initiate it under test. For more 48 * information, see {@code com.android.internal.app.ChooserWrapperActivity}. 49 */ 50 public class ChooserWrapperActivity 51 extends com.android.intentresolver.ChooserActivity implements IChooserWrapper { 52 static final ChooserActivityOverrideData sOverrides = ChooserActivityOverrideData.getInstance(); 53 private UsageStatsManager mUsm; 54 55 // ResolverActivity (the base class of ChooserActivity) inspects the launched-from UID at 56 // onCreate and needs to see some non-negative value in the test. 57 @Override getLaunchedFromUid()58 public int getLaunchedFromUid() { 59 return 1234; 60 } 61 62 @Override createChooserListAdapter( Context context, List<Intent> payloadIntents, Intent[] initialIntents, List<ResolveInfo> rList, boolean filterLastUsed, ResolverListController resolverListController, UserHandle userHandle, Intent targetIntent, ChooserRequestParameters chooserRequest, int maxTargetsPerRow)63 public ChooserListAdapter createChooserListAdapter( 64 Context context, 65 List<Intent> payloadIntents, 66 Intent[] initialIntents, 67 List<ResolveInfo> rList, 68 boolean filterLastUsed, 69 ResolverListController resolverListController, 70 UserHandle userHandle, 71 Intent targetIntent, 72 ChooserRequestParameters chooserRequest, 73 int maxTargetsPerRow) { 74 PackageManager packageManager = 75 sOverrides.packageManager == null ? context.getPackageManager() 76 : sOverrides.packageManager; 77 return new ChooserListAdapter( 78 context, 79 payloadIntents, 80 initialIntents, 81 rList, 82 filterLastUsed, 83 resolverListController, 84 userHandle, 85 targetIntent, 86 this, 87 packageManager, 88 getChooserActivityLogger(), 89 chooserRequest, 90 maxTargetsPerRow); 91 } 92 93 @Override getAdapter()94 public ChooserListAdapter getAdapter() { 95 return mChooserMultiProfilePagerAdapter.getActiveListAdapter(); 96 } 97 98 @Override getPersonalListAdapter()99 public ChooserListAdapter getPersonalListAdapter() { 100 return ((ChooserGridAdapter) mMultiProfilePagerAdapter.getAdapterForIndex(0)) 101 .getListAdapter(); 102 } 103 104 @Override getWorkListAdapter()105 public ChooserListAdapter getWorkListAdapter() { 106 if (mMultiProfilePagerAdapter.getInactiveListAdapter() == null) { 107 return null; 108 } 109 return ((ChooserGridAdapter) mMultiProfilePagerAdapter.getAdapterForIndex(1)) 110 .getListAdapter(); 111 } 112 113 @Override getIsSelected()114 public boolean getIsSelected() { 115 return mIsSuccessfullySelected; 116 } 117 118 @Override getIntegratedDeviceComponents()119 protected ChooserIntegratedDeviceComponents getIntegratedDeviceComponents() { 120 return new ChooserIntegratedDeviceComponents( 121 /* editSharingComponent=*/ null, 122 // An arbitrary pre-installed activity that handles this type of intent: 123 /* nearbySharingComponent=*/ new ComponentName( 124 "com.google.android.apps.messaging", 125 ".ui.conversationlist.ShareIntentActivity")); 126 } 127 128 @Override getUsageStatsManager()129 public UsageStatsManager getUsageStatsManager() { 130 if (mUsm == null) { 131 mUsm = getSystemService(UsageStatsManager.class); 132 } 133 return mUsm; 134 } 135 136 @Override isVoiceInteraction()137 public boolean isVoiceInteraction() { 138 if (sOverrides.isVoiceInteraction != null) { 139 return sOverrides.isVoiceInteraction; 140 } 141 return super.isVoiceInteraction(); 142 } 143 144 @Override createMyUserIdProvider()145 protected MyUserIdProvider createMyUserIdProvider() { 146 if (sOverrides.mMyUserIdProvider != null) { 147 return sOverrides.mMyUserIdProvider; 148 } 149 return super.createMyUserIdProvider(); 150 } 151 152 @Override createCrossProfileIntentsChecker()153 protected CrossProfileIntentsChecker createCrossProfileIntentsChecker() { 154 if (sOverrides.mCrossProfileIntentsChecker != null) { 155 return sOverrides.mCrossProfileIntentsChecker; 156 } 157 return super.createCrossProfileIntentsChecker(); 158 } 159 160 @Override createWorkProfileAvailabilityManager()161 protected WorkProfileAvailabilityManager createWorkProfileAvailabilityManager() { 162 if (sOverrides.mWorkProfileAvailability != null) { 163 return sOverrides.mWorkProfileAvailability; 164 } 165 return super.createWorkProfileAvailabilityManager(); 166 } 167 168 @Override safelyStartActivity(TargetInfo cti)169 public void safelyStartActivity(TargetInfo cti) { 170 if (sOverrides.onSafelyStartCallback != null 171 && sOverrides.onSafelyStartCallback.apply(cti)) { 172 return; 173 } 174 super.safelyStartActivity(cti); 175 } 176 177 @Override createListController(UserHandle userHandle)178 protected ChooserListController createListController(UserHandle userHandle) { 179 if (userHandle == UserHandle.SYSTEM) { 180 return sOverrides.resolverListController; 181 } 182 return sOverrides.workResolverListController; 183 } 184 185 @Override getPackageManager()186 public PackageManager getPackageManager() { 187 if (sOverrides.createPackageManager != null) { 188 return sOverrides.createPackageManager.apply(super.getPackageManager()); 189 } 190 return super.getPackageManager(); 191 } 192 193 @Override getResources()194 public Resources getResources() { 195 if (sOverrides.resources != null) { 196 return sOverrides.resources; 197 } 198 return super.getResources(); 199 } 200 201 @Override createPreviewImageLoader()202 protected ImageLoader createPreviewImageLoader() { 203 return new TestPreviewImageLoader( 204 super.createPreviewImageLoader(), 205 () -> sOverrides.previewThumbnail); 206 } 207 208 @Override isImageType(String mimeType)209 protected boolean isImageType(String mimeType) { 210 return sOverrides.isImageType; 211 } 212 213 @Override getChooserActivityLogger()214 public ChooserActivityLogger getChooserActivityLogger() { 215 return sOverrides.chooserActivityLogger; 216 } 217 218 @Override queryResolver(ContentResolver resolver, Uri uri)219 public Cursor queryResolver(ContentResolver resolver, Uri uri) { 220 if (sOverrides.resolverCursor != null) { 221 return sOverrides.resolverCursor; 222 } 223 224 if (sOverrides.resolverForceException) { 225 throw new SecurityException("Test exception handling"); 226 } 227 228 return super.queryResolver(resolver, uri); 229 } 230 231 @Override isWorkProfile()232 protected boolean isWorkProfile() { 233 if (sOverrides.alternateProfileSetting != 0) { 234 return sOverrides.alternateProfileSetting == MetricsEvent.MANAGED_PROFILE; 235 } 236 return super.isWorkProfile(); 237 } 238 239 @Override createTestDisplayResolveInfo(Intent originalIntent, ResolveInfo pri, CharSequence pLabel, CharSequence pInfo, Intent replacementIntent, @Nullable TargetPresentationGetter resolveInfoPresentationGetter)240 public DisplayResolveInfo createTestDisplayResolveInfo(Intent originalIntent, ResolveInfo pri, 241 CharSequence pLabel, CharSequence pInfo, Intent replacementIntent, 242 @Nullable TargetPresentationGetter resolveInfoPresentationGetter) { 243 return DisplayResolveInfo.newDisplayResolveInfo( 244 originalIntent, 245 pri, 246 pLabel, 247 pInfo, 248 replacementIntent, 249 resolveInfoPresentationGetter); 250 } 251 252 @Override getWorkProfileUserHandle()253 protected UserHandle getWorkProfileUserHandle() { 254 return sOverrides.workProfileUserHandle; 255 } 256 257 @Override getCurrentUserHandle()258 public UserHandle getCurrentUserHandle() { 259 return mMultiProfilePagerAdapter.getCurrentUserHandle(); 260 } 261 262 @Override createContextAsUser(UserHandle user, int flags)263 public Context createContextAsUser(UserHandle user, int flags) { 264 // return the current context as a work profile doesn't really exist in these tests 265 return getApplicationContext(); 266 } 267 268 @Override createShortcutLoader( Context context, AppPredictor appPredictor, UserHandle userHandle, IntentFilter targetIntentFilter, Consumer<ShortcutLoader.Result> callback)269 protected ShortcutLoader createShortcutLoader( 270 Context context, 271 AppPredictor appPredictor, 272 UserHandle userHandle, 273 IntentFilter targetIntentFilter, 274 Consumer<ShortcutLoader.Result> callback) { 275 ShortcutLoader shortcutLoader = 276 sOverrides.shortcutLoaderFactory.invoke(userHandle, callback); 277 if (shortcutLoader != null) { 278 return shortcutLoader; 279 } 280 return super.createShortcutLoader( 281 context, appPredictor, userHandle, targetIntentFilter, callback); 282 } 283 284 @Override createFeatureFlagRepository()285 protected FeatureFlagRepository createFeatureFlagRepository() { 286 if (sOverrides.featureFlagRepository != null) { 287 return sOverrides.featureFlagRepository; 288 } 289 return super.createFeatureFlagRepository(); 290 } 291 } 292