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.ContentResolver; 23 import android.content.Context; 24 import android.content.Intent; 25 import android.content.IntentFilter; 26 import android.content.pm.ResolveInfo; 27 import android.content.res.Resources; 28 import android.database.Cursor; 29 import android.net.Uri; 30 import android.os.Bundle; 31 import android.os.UserHandle; 32 33 import com.android.intentresolver.chooser.DisplayResolveInfo; 34 import com.android.intentresolver.chooser.TargetInfo; 35 import com.android.intentresolver.emptystate.CrossProfileIntentsChecker; 36 import com.android.intentresolver.shortcuts.ShortcutLoader; 37 38 import java.util.List; 39 import java.util.function.Consumer; 40 41 /** 42 * Simple wrapper around chooser activity to be able to initiate it under test. For more 43 * information, see {@code com.android.internal.app.ChooserWrapperActivity}. 44 */ 45 public class ChooserWrapperActivity extends ChooserActivity implements IChooserWrapper { 46 static final ChooserActivityOverrideData sOverrides = ChooserActivityOverrideData.getInstance(); 47 private UsageStatsManager mUsm; 48 49 @Override createChooserListAdapter( Context context, List<Intent> payloadIntents, Intent[] initialIntents, List<ResolveInfo> rList, boolean filterLastUsed, ResolverListController resolverListController, UserHandle userHandle, Intent targetIntent, Intent referrerFillInIntent, int maxTargetsPerRow)50 public final ChooserListAdapter createChooserListAdapter( 51 Context context, 52 List<Intent> payloadIntents, 53 Intent[] initialIntents, 54 List<ResolveInfo> rList, 55 boolean filterLastUsed, 56 ResolverListController resolverListController, 57 UserHandle userHandle, 58 Intent targetIntent, 59 Intent referrerFillInIntent, 60 int maxTargetsPerRow) { 61 62 return new ChooserListAdapter( 63 context, 64 payloadIntents, 65 initialIntents, 66 rList, 67 filterLastUsed, 68 resolverListController, 69 userHandle, 70 targetIntent, 71 referrerFillInIntent, 72 this, 73 mPackageManager, 74 getEventLog(), 75 maxTargetsPerRow, 76 userHandle, 77 mTargetDataLoader, 78 null); 79 } 80 81 @Override getAdapter()82 public ChooserListAdapter getAdapter() { 83 return mChooserMultiProfilePagerAdapter.getActiveListAdapter(); 84 } 85 86 @Override getPersonalListAdapter()87 public ChooserListAdapter getPersonalListAdapter() { 88 return mChooserMultiProfilePagerAdapter.getPersonalListAdapter(); 89 } 90 91 @Override getWorkListAdapter()92 public ChooserListAdapter getWorkListAdapter() { 93 return mChooserMultiProfilePagerAdapter.getWorkListAdapter(); 94 } 95 96 @Override getIsSelected()97 public boolean getIsSelected() { 98 return mIsSuccessfullySelected; 99 } 100 101 @Override getUsageStatsManager()102 public UsageStatsManager getUsageStatsManager() { 103 if (mUsm == null) { 104 mUsm = getSystemService(UsageStatsManager.class); 105 } 106 return mUsm; 107 } 108 109 @Override isVoiceInteraction()110 public boolean isVoiceInteraction() { 111 if (sOverrides.isVoiceInteraction != null) { 112 return sOverrides.isVoiceInteraction; 113 } 114 return super.isVoiceInteraction(); 115 } 116 117 @Override createCrossProfileIntentsChecker()118 protected CrossProfileIntentsChecker createCrossProfileIntentsChecker() { 119 if (sOverrides.mCrossProfileIntentsChecker != null) { 120 return sOverrides.mCrossProfileIntentsChecker; 121 } 122 return super.createCrossProfileIntentsChecker(); 123 } 124 125 @Override safelyStartActivityInternal(TargetInfo cti, UserHandle user, @Nullable Bundle options)126 public void safelyStartActivityInternal(TargetInfo cti, UserHandle user, 127 @Nullable Bundle options) { 128 if (sOverrides.onSafelyStartInternalCallback != null 129 && sOverrides.onSafelyStartInternalCallback.apply(cti)) { 130 return; 131 } 132 super.safelyStartActivityInternal(cti, user, options); 133 } 134 135 @Override createListController(UserHandle userHandle)136 public final ChooserListController createListController(UserHandle userHandle) { 137 if (userHandle == sOverrides.personalUserHandle) { 138 return sOverrides.resolverListController; 139 } 140 return sOverrides.workResolverListController; 141 } 142 143 @Override getResources()144 public Resources getResources() { 145 if (sOverrides.resources != null) { 146 return sOverrides.resources; 147 } 148 return super.getResources(); 149 } 150 151 @Override queryResolver(ContentResolver resolver, Uri uri)152 public Cursor queryResolver(ContentResolver resolver, Uri uri) { 153 if (sOverrides.resolverCursor != null) { 154 return sOverrides.resolverCursor; 155 } 156 157 if (sOverrides.resolverForceException) { 158 throw new SecurityException("Test exception handling"); 159 } 160 161 return super.queryResolver(resolver, uri); 162 } 163 164 @Override createTestDisplayResolveInfo( Intent originalIntent, ResolveInfo pri, CharSequence pLabel, CharSequence pInfo, Intent replacementIntent)165 public DisplayResolveInfo createTestDisplayResolveInfo( 166 Intent originalIntent, 167 ResolveInfo pri, 168 CharSequence pLabel, 169 CharSequence pInfo, 170 Intent replacementIntent) { 171 return DisplayResolveInfo.newDisplayResolveInfo( 172 originalIntent, 173 pri, 174 pLabel, 175 pInfo, 176 replacementIntent); 177 } 178 179 @Override getCurrentUserHandle()180 public UserHandle getCurrentUserHandle() { 181 return mChooserMultiProfilePagerAdapter.getCurrentUserHandle(); 182 } 183 184 @Override createContextAsUser(UserHandle user, int flags)185 public Context createContextAsUser(UserHandle user, int flags) { 186 // return the current context as a work profile doesn't really exist in these tests 187 return this; 188 } 189 190 @Override createShortcutLoader( Context context, AppPredictor appPredictor, UserHandle userHandle, IntentFilter targetIntentFilter, Consumer<ShortcutLoader.Result> callback)191 protected ShortcutLoader createShortcutLoader( 192 Context context, 193 AppPredictor appPredictor, 194 UserHandle userHandle, 195 IntentFilter targetIntentFilter, 196 Consumer<ShortcutLoader.Result> callback) { 197 ShortcutLoader shortcutLoader = 198 sOverrides.shortcutLoaderFactory.invoke(userHandle, callback); 199 if (shortcutLoader != null) { 200 return shortcutLoader; 201 } 202 return super.createShortcutLoader( 203 context, appPredictor, userHandle, targetIntentFilter, callback); 204 } 205 } 206