blob: 03705d0599e50809e688eaa7c1d9127cebc064f4 [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;
32import android.util.Size;
Hakan Seyalioglue1276bf2016-12-07 16:38:57 -080033
arangelovb0802dc2019-10-18 18:03:44 +010034import com.android.internal.app.ResolverListAdapter.ResolveInfoPresentationGetter;
35import com.android.internal.app.chooser.DisplayResolveInfo;
36import com.android.internal.app.chooser.TargetInfo;
Susi Kharraz-Post7e2115d2019-02-01 16:51:22 -050037import com.android.internal.logging.MetricsLogger;
Susi Kharraz-Post0446fab2019-02-21 09:42:31 -050038import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
Susi Kharraz-Post7e2115d2019-02-01 16:51:22 -050039
Hakan Seyalioglue1276bf2016-12-07 16:38:57 -080040import java.util.function.Function;
41
Hakan Seyalioglue1276bf2016-12-07 16:38:57 -080042public class ChooserWrapperActivity extends ChooserActivity {
Hakan Seyalioglu9149dca2017-01-17 12:20:01 -080043 /*
44 * Simple wrapper around chooser activity to be able to initiate it under test
45 */
Hakan Seyalioglue1276bf2016-12-07 16:38:57 -080046 static final OverrideData sOverrides = new OverrideData();
Kang Li64b018e2017-01-05 17:30:06 -080047 private UsageStatsManager mUsm;
Hakan Seyalioglue1276bf2016-12-07 16:38:57 -080048
Matt Pietal95574b02019-03-13 08:12:25 -040049 ChooserListAdapter getAdapter() {
50 return (ChooserListAdapter) mAdapter;
Hakan Seyalioglue1276bf2016-12-07 16:38:57 -080051 }
52
Kang Li64b018e2017-01-05 17:30:06 -080053 boolean getIsSelected() { return mIsSuccessfullySelected; }
54
55 UsageStatsManager getUsageStatsManager() {
56 if (mUsm == null) {
57 mUsm = (UsageStatsManager) getSystemService(Context.USAGE_STATS_SERVICE);
58 }
59 return mUsm;
60 }
61
Hakan Seyalioglue1276bf2016-12-07 16:38:57 -080062 @Override
63 public boolean isVoiceInteraction() {
64 if (sOverrides.isVoiceInteraction != null) {
65 return sOverrides.isVoiceInteraction;
66 }
67 return super.isVoiceInteraction();
68 }
69
70 @Override
arangelovb0802dc2019-10-18 18:03:44 +010071 public void safelyStartActivity(com.android.internal.app.chooser.TargetInfo cti) {
Hakan Seyalioglue1276bf2016-12-07 16:38:57 -080072 if (sOverrides.onSafelyStartCallback != null &&
73 sOverrides.onSafelyStartCallback.apply(cti)) {
74 return;
75 }
76 super.safelyStartActivity(cti);
77 }
78
79 @Override
80 protected ResolverListController createListController() {
81 return sOverrides.resolverListController;
82 }
83
84 @Override
85 public PackageManager getPackageManager() {
86 if (sOverrides.createPackageManager != null) {
87 return sOverrides.createPackageManager.apply(super.getPackageManager());
88 }
89 return super.getPackageManager();
90 }
91
Matt Pietal26038402019-01-08 07:29:34 -050092 @Override
Mehdi Alizadehe870e972019-09-11 17:54:15 -070093 public Resources getResources() {
94 if (sOverrides.resources != null) {
95 return sOverrides.resources;
96 }
97 return super.getResources();
98 }
99
100 @Override
Matt Pietal26038402019-01-08 07:29:34 -0500101 protected Bitmap loadThumbnail(Uri uri, Size size) {
102 if (sOverrides.previewThumbnail != null) {
103 return sOverrides.previewThumbnail;
104 }
105 return super.loadThumbnail(uri, size);
106 }
107
Matt Pietal0ea391b2019-01-30 10:44:15 -0500108 @Override
109 protected boolean isImageType(String mimeType) {
Matt Pietal46d828c2019-02-05 08:07:07 -0500110 return sOverrides.isImageType;
Matt Pietal0ea391b2019-01-30 10:44:15 -0500111 }
112
Susi Kharraz-Post7e2115d2019-02-01 16:51:22 -0500113 @Override
114 protected MetricsLogger getMetricsLogger() {
115 return sOverrides.metricsLogger;
116 }
117
Matt Pietalf38e9d22019-02-15 10:01:03 -0500118 @Override
119 public Cursor queryResolver(ContentResolver resolver, Uri uri) {
120 if (sOverrides.resolverCursor != null) {
121 return sOverrides.resolverCursor;
122 }
123
124 if (sOverrides.resolverForceException) {
125 throw new SecurityException("Test exception handling");
126 }
127
128 return super.queryResolver(resolver, uri);
129 }
130
Susi Kharraz-Post0446fab2019-02-21 09:42:31 -0500131 @Override
132 protected boolean isWorkProfile() {
133 if (sOverrides.alternateProfileSetting != 0) {
134 return sOverrides.alternateProfileSetting == MetricsEvent.MANAGED_PROFILE;
135 }
136 return super.isWorkProfile();
137 }
138
Susi Kharraz-Post14cbfcd2019-04-01 11:07:59 -0400139 public DisplayResolveInfo createTestDisplayResolveInfo(Intent originalIntent, ResolveInfo pri,
arangelovb0802dc2019-10-18 18:03:44 +0100140 CharSequence pLabel, CharSequence pInfo, Intent replacementIntent,
141 @Nullable ResolveInfoPresentationGetter resolveInfoPresentationGetter) {
142 return new DisplayResolveInfo(originalIntent, pri, pLabel, pInfo, replacementIntent,
143 resolveInfoPresentationGetter);
Susi Kharraz-Post14cbfcd2019-04-01 11:07:59 -0400144 }
145
Hakan Seyalioglue1276bf2016-12-07 16:38:57 -0800146 /**
147 * We cannot directly mock the activity created since instrumentation creates it.
148 * <p>
149 * Instead, we use static instances of this object to modify behavior.
150 */
151 static class OverrideData {
152 @SuppressWarnings("Since15")
153 public Function<PackageManager, PackageManager> createPackageManager;
154 public Function<TargetInfo, Boolean> onSafelyStartCallback;
155 public ResolverListController resolverListController;
156 public Boolean isVoiceInteraction;
Matt Pietal46d828c2019-02-05 08:07:07 -0500157 public boolean isImageType;
Matt Pietalf38e9d22019-02-15 10:01:03 -0500158 public Cursor resolverCursor;
159 public boolean resolverForceException;
Matt Pietal26038402019-01-08 07:29:34 -0500160 public Bitmap previewThumbnail;
Susi Kharraz-Post7e2115d2019-02-01 16:51:22 -0500161 public MetricsLogger metricsLogger;
Susi Kharraz-Post0446fab2019-02-21 09:42:31 -0500162 public int alternateProfileSetting;
Mehdi Alizadehe870e972019-09-11 17:54:15 -0700163 public Resources resources;
Hakan Seyalioglue1276bf2016-12-07 16:38:57 -0800164
165 public void reset() {
166 onSafelyStartCallback = null;
167 isVoiceInteraction = null;
168 createPackageManager = null;
Matt Pietal26038402019-01-08 07:29:34 -0500169 previewThumbnail = null;
Matt Pietal46d828c2019-02-05 08:07:07 -0500170 isImageType = false;
Matt Pietalf38e9d22019-02-15 10:01:03 -0500171 resolverCursor = null;
172 resolverForceException = false;
Hakan Seyalioglue1276bf2016-12-07 16:38:57 -0800173 resolverListController = mock(ResolverListController.class);
Susi Kharraz-Post7e2115d2019-02-01 16:51:22 -0500174 metricsLogger = mock(MetricsLogger.class);
Susi Kharraz-Post0446fab2019-02-21 09:42:31 -0500175 alternateProfileSetting = 0;
Mehdi Alizadehe870e972019-09-11 17:54:15 -0700176 resources = null;
Hakan Seyalioglue1276bf2016-12-07 16:38:57 -0800177 }
178 }
Hakan Seyalioglu9149dca2017-01-17 12:20:01 -0800179}