blob: a2e0095c2aee7e41f54de1470cf7b7c8423fad7a [file] [log] [blame]
Hakan Seyalioglue1276bf2016-12-07 16:38:57 -08001/*
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
17package com.android.internal.app;
18
Tadashi G. Takaokab4470f22019-01-15 18:29:15 +090019import static org.mockito.Mockito.mock;
20
arangelovb0802dc2019-10-18 18:03:44 +010021import android.annotation.Nullable;
Kang Li64b018e2017-01-05 17:30:06 -080022import android.app.usage.UsageStatsManager;
Matt Pietalf38e9d22019-02-15 10:01:03 -050023import android.content.ContentResolver;
Kang Li64b018e2017-01-05 17:30:06 -080024import android.content.Context;
Susi Kharraz-Post14cbfcd2019-04-01 11:07:59 -040025import android.content.Intent;
Hakan Seyalioglue1276bf2016-12-07 16:38:57 -080026import android.content.pm.PackageManager;
Susi Kharraz-Post14cbfcd2019-04-01 11:07:59 -040027import android.content.pm.ResolveInfo;
Mehdi Alizadehe870e972019-09-11 17:54:15 -070028import android.content.res.Resources;
Matt Pietalf38e9d22019-02-15 10:01:03 -050029import android.database.Cursor;
Matt Pietal26038402019-01-08 07:29:34 -050030import android.graphics.Bitmap;
31import android.net.Uri;
arangelov2c1c37a2019-12-06 14:43:34 +000032import android.os.UserHandle;
Matt Pietal26038402019-01-08 07:29:34 -050033import android.util.Size;
Hakan Seyalioglue1276bf2016-12-07 16:38:57 -080034
arangelovb0802dc2019-10-18 18:03:44 +010035import com.android.internal.app.ResolverListAdapter.ResolveInfoPresentationGetter;
36import com.android.internal.app.chooser.DisplayResolveInfo;
37import com.android.internal.app.chooser.TargetInfo;
Susi Kharraz-Post7e2115d2019-02-01 16:51:22 -050038import com.android.internal.logging.MetricsLogger;
Susi Kharraz-Post0446fab2019-02-21 09:42:31 -050039import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
Susi Kharraz-Post7e2115d2019-02-01 16:51:22 -050040
Hakan Seyalioglue1276bf2016-12-07 16:38:57 -080041import java.util.function.Function;
42
Hakan Seyalioglue1276bf2016-12-07 16:38:57 -080043public class ChooserWrapperActivity extends ChooserActivity {
Hakan Seyalioglu9149dca2017-01-17 12:20:01 -080044 /*
45 * Simple wrapper around chooser activity to be able to initiate it under test
46 */
Hakan Seyalioglue1276bf2016-12-07 16:38:57 -080047 static final OverrideData sOverrides = new OverrideData();
Kang Li64b018e2017-01-05 17:30:06 -080048 private UsageStatsManager mUsm;
Hakan Seyalioglue1276bf2016-12-07 16:38:57 -080049
Matt Pietal95574b02019-03-13 08:12:25 -040050 ChooserListAdapter getAdapter() {
arangelov2c1c37a2019-12-06 14:43:34 +000051 return mChooserMultiProfilePagerAdapter.getCurrentListAdapter();
Hakan Seyalioglue1276bf2016-12-07 16:38:57 -080052 }
53
Kang Li64b018e2017-01-05 17:30:06 -080054 boolean getIsSelected() { return mIsSuccessfullySelected; }
55
56 UsageStatsManager getUsageStatsManager() {
57 if (mUsm == null) {
58 mUsm = (UsageStatsManager) getSystemService(Context.USAGE_STATS_SERVICE);
59 }
60 return mUsm;
61 }
62
Hakan Seyalioglue1276bf2016-12-07 16:38:57 -080063 @Override
64 public boolean isVoiceInteraction() {
65 if (sOverrides.isVoiceInteraction != null) {
66 return sOverrides.isVoiceInteraction;
67 }
68 return super.isVoiceInteraction();
69 }
70
71 @Override
arangelovb0802dc2019-10-18 18:03:44 +010072 public void safelyStartActivity(com.android.internal.app.chooser.TargetInfo cti) {
Hakan Seyalioglue1276bf2016-12-07 16:38:57 -080073 if (sOverrides.onSafelyStartCallback != null &&
74 sOverrides.onSafelyStartCallback.apply(cti)) {
75 return;
76 }
77 super.safelyStartActivity(cti);
78 }
79
80 @Override
arangelov2c1c37a2019-12-06 14:43:34 +000081 protected ResolverListController createListController(UserHandle userHandle) {
Hakan Seyalioglue1276bf2016-12-07 16:38:57 -080082 return sOverrides.resolverListController;
83 }
84
85 @Override
86 public PackageManager getPackageManager() {
87 if (sOverrides.createPackageManager != null) {
88 return sOverrides.createPackageManager.apply(super.getPackageManager());
89 }
90 return super.getPackageManager();
91 }
92
Matt Pietal26038402019-01-08 07:29:34 -050093 @Override
Mehdi Alizadehe870e972019-09-11 17:54:15 -070094 public Resources getResources() {
95 if (sOverrides.resources != null) {
96 return sOverrides.resources;
97 }
98 return super.getResources();
99 }
100
101 @Override
Matt Pietal26038402019-01-08 07:29:34 -0500102 protected Bitmap loadThumbnail(Uri uri, Size size) {
103 if (sOverrides.previewThumbnail != null) {
104 return sOverrides.previewThumbnail;
105 }
106 return super.loadThumbnail(uri, size);
107 }
108
Matt Pietal0ea391b2019-01-30 10:44:15 -0500109 @Override
110 protected boolean isImageType(String mimeType) {
Matt Pietal46d828c2019-02-05 08:07:07 -0500111 return sOverrides.isImageType;
Matt Pietal0ea391b2019-01-30 10:44:15 -0500112 }
113
Susi Kharraz-Post7e2115d2019-02-01 16:51:22 -0500114 @Override
115 protected MetricsLogger getMetricsLogger() {
116 return sOverrides.metricsLogger;
117 }
118
Matt Pietalf38e9d22019-02-15 10:01:03 -0500119 @Override
120 public Cursor queryResolver(ContentResolver resolver, Uri uri) {
121 if (sOverrides.resolverCursor != null) {
122 return sOverrides.resolverCursor;
123 }
124
125 if (sOverrides.resolverForceException) {
126 throw new SecurityException("Test exception handling");
127 }
128
129 return super.queryResolver(resolver, uri);
130 }
131
Susi Kharraz-Post0446fab2019-02-21 09:42:31 -0500132 @Override
133 protected boolean isWorkProfile() {
134 if (sOverrides.alternateProfileSetting != 0) {
135 return sOverrides.alternateProfileSetting == MetricsEvent.MANAGED_PROFILE;
136 }
137 return super.isWorkProfile();
138 }
139
Susi Kharraz-Post14cbfcd2019-04-01 11:07:59 -0400140 public DisplayResolveInfo createTestDisplayResolveInfo(Intent originalIntent, ResolveInfo pri,
arangelovb0802dc2019-10-18 18:03:44 +0100141 CharSequence pLabel, CharSequence pInfo, Intent replacementIntent,
142 @Nullable ResolveInfoPresentationGetter resolveInfoPresentationGetter) {
143 return new DisplayResolveInfo(originalIntent, pri, pLabel, pInfo, replacementIntent,
144 resolveInfoPresentationGetter);
Susi Kharraz-Post14cbfcd2019-04-01 11:07:59 -0400145 }
146
Hakan Seyalioglue1276bf2016-12-07 16:38:57 -0800147 /**
148 * We cannot directly mock the activity created since instrumentation creates it.
149 * <p>
150 * Instead, we use static instances of this object to modify behavior.
151 */
152 static class OverrideData {
153 @SuppressWarnings("Since15")
154 public Function<PackageManager, PackageManager> createPackageManager;
155 public Function<TargetInfo, Boolean> onSafelyStartCallback;
156 public ResolverListController resolverListController;
157 public Boolean isVoiceInteraction;
Matt Pietal46d828c2019-02-05 08:07:07 -0500158 public boolean isImageType;
Matt Pietalf38e9d22019-02-15 10:01:03 -0500159 public Cursor resolverCursor;
160 public boolean resolverForceException;
Matt Pietal26038402019-01-08 07:29:34 -0500161 public Bitmap previewThumbnail;
Susi Kharraz-Post7e2115d2019-02-01 16:51:22 -0500162 public MetricsLogger metricsLogger;
Susi Kharraz-Post0446fab2019-02-21 09:42:31 -0500163 public int alternateProfileSetting;
Mehdi Alizadehe870e972019-09-11 17:54:15 -0700164 public Resources resources;
Hakan Seyalioglue1276bf2016-12-07 16:38:57 -0800165
166 public void reset() {
167 onSafelyStartCallback = null;
168 isVoiceInteraction = null;
169 createPackageManager = null;
Matt Pietal26038402019-01-08 07:29:34 -0500170 previewThumbnail = null;
Matt Pietal46d828c2019-02-05 08:07:07 -0500171 isImageType = false;
Matt Pietalf38e9d22019-02-15 10:01:03 -0500172 resolverCursor = null;
173 resolverForceException = false;
Hakan Seyalioglue1276bf2016-12-07 16:38:57 -0800174 resolverListController = mock(ResolverListController.class);
Susi Kharraz-Post7e2115d2019-02-01 16:51:22 -0500175 metricsLogger = mock(MetricsLogger.class);
Susi Kharraz-Post0446fab2019-02-21 09:42:31 -0500176 alternateProfileSetting = 0;
Mehdi Alizadehe870e972019-09-11 17:54:15 -0700177 resources = null;
Hakan Seyalioglue1276bf2016-12-07 16:38:57 -0800178 }
179 }
Hakan Seyalioglu9149dca2017-01-17 12:20:01 -0800180}