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.internal.app; 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 import android.util.Pair; 30 31 import com.android.internal.app.AbstractMultiProfilePagerAdapter.CrossProfileIntentsChecker; 32 import com.android.internal.app.AbstractMultiProfilePagerAdapter.MyUserIdProvider; 33 import com.android.internal.app.AbstractMultiProfilePagerAdapter.QuietModeManager; 34 import com.android.internal.app.chooser.TargetInfo; 35 import com.android.internal.logging.MetricsLogger; 36 37 import java.util.function.BiFunction; 38 import java.util.function.Function; 39 40 /** 41 * Singleton providing overrides to be applied by any {@code IChooserWrapper} used in testing. 42 * We cannot directly mock the activity created since instrumentation creates it, so instead we use 43 * this singleton to modify behavior. 44 */ 45 public class ChooserActivityOverrideData { 46 private static ChooserActivityOverrideData sInstance = null; 47 getInstance()48 public static ChooserActivityOverrideData getInstance() { 49 if (sInstance == null) { 50 sInstance = new ChooserActivityOverrideData(); 51 } 52 return sInstance; 53 } 54 55 @SuppressWarnings("Since15") 56 public Function<PackageManager, PackageManager> createPackageManager; 57 public Function<TargetInfo, Boolean> onSafelyStartCallback; 58 public Function<ChooserListAdapter, Void> onQueryDirectShareTargets; 59 public BiFunction< 60 IChooserWrapper, ChooserListAdapter, Pair<Integer, ChooserActivity.ServiceResultInfo[]>> 61 directShareTargets; 62 public ResolverListController resolverListController; 63 public ResolverListController workResolverListController; 64 public Boolean isVoiceInteraction; 65 public boolean isImageType; 66 public Cursor resolverCursor; 67 public boolean resolverForceException; 68 public Bitmap previewThumbnail; 69 public MetricsLogger metricsLogger; 70 public ChooserActivityLogger chooserActivityLogger; 71 public int alternateProfileSetting; 72 public Resources resources; 73 public UserHandle workProfileUserHandle; 74 public boolean hasCrossProfileIntents; 75 public boolean isQuietModeEnabled; 76 public boolean isWorkProfileUserRunning; 77 public boolean isWorkProfileUserUnlocked; 78 public Integer myUserId; 79 public QuietModeManager mQuietModeManager; 80 public MyUserIdProvider mMyUserIdProvider; 81 public CrossProfileIntentsChecker mCrossProfileIntentsChecker; 82 public PackageManager packageManager; 83 reset()84 public void reset() { 85 onSafelyStartCallback = null; 86 onQueryDirectShareTargets = null; 87 directShareTargets = null; 88 isVoiceInteraction = null; 89 createPackageManager = null; 90 previewThumbnail = null; 91 isImageType = false; 92 resolverCursor = null; 93 resolverForceException = false; 94 resolverListController = mock(ResolverListController.class); 95 workResolverListController = mock(ResolverListController.class); 96 metricsLogger = mock(MetricsLogger.class); 97 chooserActivityLogger = new ChooserActivityLoggerFake(); 98 alternateProfileSetting = 0; 99 resources = null; 100 workProfileUserHandle = null; 101 hasCrossProfileIntents = true; 102 isQuietModeEnabled = false; 103 isWorkProfileUserRunning = true; 104 isWorkProfileUserUnlocked = true; 105 myUserId = null; 106 packageManager = null; 107 mQuietModeManager = new QuietModeManager() { 108 @Override 109 public boolean isQuietModeEnabled(UserHandle workProfileUserHandle) { 110 return isQuietModeEnabled; 111 } 112 113 @Override 114 public void requestQuietModeEnabled(boolean enabled, 115 UserHandle workProfileUserHandle) { 116 isQuietModeEnabled = enabled; 117 } 118 119 @Override 120 public void markWorkProfileEnabledBroadcastReceived() { 121 } 122 123 @Override 124 public boolean isWaitingToEnableWorkProfile() { 125 return false; 126 } 127 }; 128 129 mMyUserIdProvider = new MyUserIdProvider() { 130 @Override 131 public int getMyUserId() { 132 return myUserId != null ? myUserId : UserHandle.myUserId(); 133 } 134 }; 135 136 mCrossProfileIntentsChecker = mock(CrossProfileIntentsChecker.class); 137 when(mCrossProfileIntentsChecker.hasCrossProfileIntents(any(), anyInt(), anyInt())) 138 .thenAnswer(invocation -> hasCrossProfileIntents); 139 } 140 ChooserActivityOverrideData()141 private ChooserActivityOverrideData() {} 142 } 143