1 /* 2 * Copyright (C) 2021 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 static org.mockito.ArgumentMatchers.any; 20 import static org.mockito.ArgumentMatchers.anyInt; 21 import static org.mockito.Mockito.mock; 22 import static org.mockito.Mockito.when; 23 24 import android.content.pm.PackageManager; 25 import android.content.res.Resources; 26 import android.database.Cursor; 27 import android.graphics.Bitmap; 28 import android.os.UserHandle; 29 30 import com.android.intentresolver.AbstractMultiProfilePagerAdapter.CrossProfileIntentsChecker; 31 import com.android.intentresolver.AbstractMultiProfilePagerAdapter.MyUserIdProvider; 32 import com.android.intentresolver.chooser.TargetInfo; 33 import com.android.intentresolver.flags.FeatureFlagRepository; 34 import com.android.intentresolver.shortcuts.ShortcutLoader; 35 36 import java.util.function.Consumer; 37 import java.util.function.Function; 38 39 import kotlin.jvm.functions.Function2; 40 41 /** 42 * Singleton providing overrides to be applied by any {@code IChooserWrapper} used in testing. 43 * We cannot directly mock the activity created since instrumentation creates it, so instead we use 44 * this singleton to modify behavior. 45 */ 46 public class ChooserActivityOverrideData { 47 private static ChooserActivityOverrideData sInstance = null; 48 getInstance()49 public static ChooserActivityOverrideData getInstance() { 50 if (sInstance == null) { 51 sInstance = new ChooserActivityOverrideData(); 52 } 53 return sInstance; 54 } 55 56 @SuppressWarnings("Since15") 57 public Function<PackageManager, PackageManager> createPackageManager; 58 public Function<TargetInfo, Boolean> onSafelyStartCallback; 59 public Function2<UserHandle, Consumer<ShortcutLoader.Result>, ShortcutLoader> 60 shortcutLoaderFactory = (userHandle, callback) -> null; 61 public ChooserActivity.ChooserListController resolverListController; 62 public ChooserActivity.ChooserListController workResolverListController; 63 public Boolean isVoiceInteraction; 64 public boolean isImageType; 65 public Cursor resolverCursor; 66 public boolean resolverForceException; 67 public Bitmap previewThumbnail; 68 public ChooserActivityLogger chooserActivityLogger; 69 public int alternateProfileSetting; 70 public Resources resources; 71 public UserHandle workProfileUserHandle; 72 public boolean hasCrossProfileIntents; 73 public boolean isQuietModeEnabled; 74 public Integer myUserId; 75 public WorkProfileAvailabilityManager mWorkProfileAvailability; 76 public MyUserIdProvider mMyUserIdProvider; 77 public CrossProfileIntentsChecker mCrossProfileIntentsChecker; 78 public PackageManager packageManager; 79 public FeatureFlagRepository featureFlagRepository; 80 reset()81 public void reset() { 82 onSafelyStartCallback = null; 83 isVoiceInteraction = null; 84 createPackageManager = null; 85 previewThumbnail = null; 86 isImageType = false; 87 resolverCursor = null; 88 resolverForceException = false; 89 resolverListController = mock(ChooserActivity.ChooserListController.class); 90 workResolverListController = mock(ChooserActivity.ChooserListController.class); 91 chooserActivityLogger = mock(ChooserActivityLogger.class); 92 alternateProfileSetting = 0; 93 resources = null; 94 workProfileUserHandle = null; 95 hasCrossProfileIntents = true; 96 isQuietModeEnabled = false; 97 myUserId = null; 98 packageManager = null; 99 mWorkProfileAvailability = new WorkProfileAvailabilityManager(null, null, null) { 100 @Override 101 public boolean isQuietModeEnabled() { 102 return isQuietModeEnabled; 103 } 104 105 @Override 106 public boolean isWorkProfileUserUnlocked() { 107 return true; 108 } 109 110 @Override 111 public void requestQuietModeEnabled(boolean enabled) { 112 isQuietModeEnabled = enabled; 113 } 114 115 @Override 116 public void markWorkProfileEnabledBroadcastReceived() {} 117 118 @Override 119 public boolean isWaitingToEnableWorkProfile() { 120 return false; 121 } 122 }; 123 shortcutLoaderFactory = ((userHandle, resultConsumer) -> null); 124 125 mMyUserIdProvider = new MyUserIdProvider() { 126 @Override 127 public int getMyUserId() { 128 return myUserId != null ? myUserId : UserHandle.myUserId(); 129 } 130 }; 131 132 mCrossProfileIntentsChecker = mock(CrossProfileIntentsChecker.class); 133 when(mCrossProfileIntentsChecker.hasCrossProfileIntents(any(), anyInt(), anyInt())) 134 .thenAnswer(invocation -> hasCrossProfileIntents); 135 featureFlagRepository = null; 136 } 137 ChooserActivityOverrideData()138 private ChooserActivityOverrideData() {} 139 } 140 141