blob: 1d567c73f3761cab9ed61d1b2155df28808dcb65 [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
Kang Li64b018e2017-01-05 17:30:06 -080021import android.app.usage.UsageStatsManager;
Matt Pietalf38e9d22019-02-15 10:01:03 -050022import android.content.ContentResolver;
Kang Li64b018e2017-01-05 17:30:06 -080023import android.content.Context;
Susi Kharraz-Post14cbfcd2019-04-01 11:07:59 -040024import android.content.Intent;
Hakan Seyalioglue1276bf2016-12-07 16:38:57 -080025import android.content.pm.PackageManager;
Susi Kharraz-Post14cbfcd2019-04-01 11:07:59 -040026import android.content.pm.ResolveInfo;
Mehdi Alizadehe870e972019-09-11 17:54:15 -070027import android.content.res.Resources;
Matt Pietalf38e9d22019-02-15 10:01:03 -050028import android.database.Cursor;
Matt Pietal26038402019-01-08 07:29:34 -050029import android.graphics.Bitmap;
30import android.net.Uri;
31import android.util.Size;
Hakan Seyalioglue1276bf2016-12-07 16:38:57 -080032
Susi Kharraz-Post7e2115d2019-02-01 16:51:22 -050033import com.android.internal.logging.MetricsLogger;
Susi Kharraz-Post0446fab2019-02-21 09:42:31 -050034import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
Susi Kharraz-Post7e2115d2019-02-01 16:51:22 -050035
Hakan Seyalioglue1276bf2016-12-07 16:38:57 -080036import java.util.function.Function;
37
Hakan Seyalioglue1276bf2016-12-07 16:38:57 -080038public class ChooserWrapperActivity extends ChooserActivity {
Hakan Seyalioglu9149dca2017-01-17 12:20:01 -080039 /*
40 * Simple wrapper around chooser activity to be able to initiate it under test
41 */
Hakan Seyalioglue1276bf2016-12-07 16:38:57 -080042 static final OverrideData sOverrides = new OverrideData();
Kang Li64b018e2017-01-05 17:30:06 -080043 private UsageStatsManager mUsm;
Hakan Seyalioglue1276bf2016-12-07 16:38:57 -080044
Matt Pietal95574b02019-03-13 08:12:25 -040045 ChooserListAdapter getAdapter() {
46 return (ChooserListAdapter) mAdapter;
Hakan Seyalioglue1276bf2016-12-07 16:38:57 -080047 }
48
Kang Li64b018e2017-01-05 17:30:06 -080049 boolean getIsSelected() { return mIsSuccessfullySelected; }
50
51 UsageStatsManager getUsageStatsManager() {
52 if (mUsm == null) {
53 mUsm = (UsageStatsManager) getSystemService(Context.USAGE_STATS_SERVICE);
54 }
55 return mUsm;
56 }
57
Hakan Seyalioglue1276bf2016-12-07 16:38:57 -080058 @Override
59 public boolean isVoiceInteraction() {
60 if (sOverrides.isVoiceInteraction != null) {
61 return sOverrides.isVoiceInteraction;
62 }
63 return super.isVoiceInteraction();
64 }
65
66 @Override
67 public void safelyStartActivity(TargetInfo cti) {
68 if (sOverrides.onSafelyStartCallback != null &&
69 sOverrides.onSafelyStartCallback.apply(cti)) {
70 return;
71 }
72 super.safelyStartActivity(cti);
73 }
74
75 @Override
76 protected ResolverListController createListController() {
77 return sOverrides.resolverListController;
78 }
79
80 @Override
81 public PackageManager getPackageManager() {
82 if (sOverrides.createPackageManager != null) {
83 return sOverrides.createPackageManager.apply(super.getPackageManager());
84 }
85 return super.getPackageManager();
86 }
87
Matt Pietal26038402019-01-08 07:29:34 -050088 @Override
Mehdi Alizadehe870e972019-09-11 17:54:15 -070089 public Resources getResources() {
90 if (sOverrides.resources != null) {
91 return sOverrides.resources;
92 }
93 return super.getResources();
94 }
95
96 @Override
Matt Pietal26038402019-01-08 07:29:34 -050097 protected Bitmap loadThumbnail(Uri uri, Size size) {
98 if (sOverrides.previewThumbnail != null) {
99 return sOverrides.previewThumbnail;
100 }
101 return super.loadThumbnail(uri, size);
102 }
103
Matt Pietal0ea391b2019-01-30 10:44:15 -0500104 @Override
105 protected boolean isImageType(String mimeType) {
Matt Pietal46d828c2019-02-05 08:07:07 -0500106 return sOverrides.isImageType;
Matt Pietal0ea391b2019-01-30 10:44:15 -0500107 }
108
Susi Kharraz-Post7e2115d2019-02-01 16:51:22 -0500109 @Override
110 protected MetricsLogger getMetricsLogger() {
111 return sOverrides.metricsLogger;
112 }
113
Matt Pietalf38e9d22019-02-15 10:01:03 -0500114 @Override
115 public Cursor queryResolver(ContentResolver resolver, Uri uri) {
116 if (sOverrides.resolverCursor != null) {
117 return sOverrides.resolverCursor;
118 }
119
120 if (sOverrides.resolverForceException) {
121 throw new SecurityException("Test exception handling");
122 }
123
124 return super.queryResolver(resolver, uri);
125 }
126
Susi Kharraz-Post0446fab2019-02-21 09:42:31 -0500127 @Override
128 protected boolean isWorkProfile() {
129 if (sOverrides.alternateProfileSetting != 0) {
130 return sOverrides.alternateProfileSetting == MetricsEvent.MANAGED_PROFILE;
131 }
132 return super.isWorkProfile();
133 }
134
Susi Kharraz-Post14cbfcd2019-04-01 11:07:59 -0400135 public DisplayResolveInfo createTestDisplayResolveInfo(Intent originalIntent, ResolveInfo pri,
136 CharSequence pLabel, CharSequence pInfo, Intent pOrigIntent) {
137 return new DisplayResolveInfo(originalIntent, pri, pLabel, pInfo, pOrigIntent);
138 }
139
Hakan Seyalioglue1276bf2016-12-07 16:38:57 -0800140 /**
141 * We cannot directly mock the activity created since instrumentation creates it.
142 * <p>
143 * Instead, we use static instances of this object to modify behavior.
144 */
145 static class OverrideData {
146 @SuppressWarnings("Since15")
147 public Function<PackageManager, PackageManager> createPackageManager;
148 public Function<TargetInfo, Boolean> onSafelyStartCallback;
149 public ResolverListController resolverListController;
150 public Boolean isVoiceInteraction;
Matt Pietal46d828c2019-02-05 08:07:07 -0500151 public boolean isImageType;
Matt Pietalf38e9d22019-02-15 10:01:03 -0500152 public Cursor resolverCursor;
153 public boolean resolverForceException;
Matt Pietal26038402019-01-08 07:29:34 -0500154 public Bitmap previewThumbnail;
Susi Kharraz-Post7e2115d2019-02-01 16:51:22 -0500155 public MetricsLogger metricsLogger;
Susi Kharraz-Post0446fab2019-02-21 09:42:31 -0500156 public int alternateProfileSetting;
Mehdi Alizadehe870e972019-09-11 17:54:15 -0700157 public Resources resources;
Hakan Seyalioglue1276bf2016-12-07 16:38:57 -0800158
159 public void reset() {
160 onSafelyStartCallback = null;
161 isVoiceInteraction = null;
162 createPackageManager = null;
Matt Pietal26038402019-01-08 07:29:34 -0500163 previewThumbnail = null;
Matt Pietal46d828c2019-02-05 08:07:07 -0500164 isImageType = false;
Matt Pietalf38e9d22019-02-15 10:01:03 -0500165 resolverCursor = null;
166 resolverForceException = false;
Hakan Seyalioglue1276bf2016-12-07 16:38:57 -0800167 resolverListController = mock(ResolverListController.class);
Susi Kharraz-Post7e2115d2019-02-01 16:51:22 -0500168 metricsLogger = mock(MetricsLogger.class);
Susi Kharraz-Post0446fab2019-02-21 09:42:31 -0500169 alternateProfileSetting = 0;
Mehdi Alizadehe870e972019-09-11 17:54:15 -0700170 resources = null;
Hakan Seyalioglue1276bf2016-12-07 16:38:57 -0800171 }
172 }
Hakan Seyalioglu9149dca2017-01-17 12:20:01 -0800173}