blob: 44e56eaf0593108e1fefdd68373e9cfd3d67ebe6 [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;
Matt Pietalf38e9d22019-02-15 10:01:03 -050027import android.database.Cursor;
Matt Pietal26038402019-01-08 07:29:34 -050028import android.graphics.Bitmap;
29import android.net.Uri;
30import android.util.Size;
Hakan Seyalioglue1276bf2016-12-07 16:38:57 -080031
Susi Kharraz-Post7e2115d2019-02-01 16:51:22 -050032import com.android.internal.logging.MetricsLogger;
Susi Kharraz-Post0446fab2019-02-21 09:42:31 -050033import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
Susi Kharraz-Post7e2115d2019-02-01 16:51:22 -050034
Hakan Seyalioglue1276bf2016-12-07 16:38:57 -080035import java.util.function.Function;
36
Hakan Seyalioglue1276bf2016-12-07 16:38:57 -080037public class ChooserWrapperActivity extends ChooserActivity {
Hakan Seyalioglu9149dca2017-01-17 12:20:01 -080038 /*
39 * Simple wrapper around chooser activity to be able to initiate it under test
40 */
Hakan Seyalioglue1276bf2016-12-07 16:38:57 -080041 static final OverrideData sOverrides = new OverrideData();
Kang Li64b018e2017-01-05 17:30:06 -080042 private UsageStatsManager mUsm;
Hakan Seyalioglue1276bf2016-12-07 16:38:57 -080043
Matt Pietal95574b02019-03-13 08:12:25 -040044 ChooserListAdapter getAdapter() {
45 return (ChooserListAdapter) mAdapter;
Hakan Seyalioglue1276bf2016-12-07 16:38:57 -080046 }
47
Kang Li64b018e2017-01-05 17:30:06 -080048 boolean getIsSelected() { return mIsSuccessfullySelected; }
49
50 UsageStatsManager getUsageStatsManager() {
51 if (mUsm == null) {
52 mUsm = (UsageStatsManager) getSystemService(Context.USAGE_STATS_SERVICE);
53 }
54 return mUsm;
55 }
56
Hakan Seyalioglue1276bf2016-12-07 16:38:57 -080057 @Override
58 public boolean isVoiceInteraction() {
59 if (sOverrides.isVoiceInteraction != null) {
60 return sOverrides.isVoiceInteraction;
61 }
62 return super.isVoiceInteraction();
63 }
64
65 @Override
66 public void safelyStartActivity(TargetInfo cti) {
67 if (sOverrides.onSafelyStartCallback != null &&
68 sOverrides.onSafelyStartCallback.apply(cti)) {
69 return;
70 }
71 super.safelyStartActivity(cti);
72 }
73
74 @Override
75 protected ResolverListController createListController() {
76 return sOverrides.resolverListController;
77 }
78
79 @Override
80 public PackageManager getPackageManager() {
81 if (sOverrides.createPackageManager != null) {
82 return sOverrides.createPackageManager.apply(super.getPackageManager());
83 }
84 return super.getPackageManager();
85 }
86
Matt Pietal26038402019-01-08 07:29:34 -050087 @Override
88 protected Bitmap loadThumbnail(Uri uri, Size size) {
89 if (sOverrides.previewThumbnail != null) {
90 return sOverrides.previewThumbnail;
91 }
92 return super.loadThumbnail(uri, size);
93 }
94
Matt Pietal0ea391b2019-01-30 10:44:15 -050095 @Override
96 protected boolean isImageType(String mimeType) {
Matt Pietal46d828c2019-02-05 08:07:07 -050097 return sOverrides.isImageType;
Matt Pietal0ea391b2019-01-30 10:44:15 -050098 }
99
Susi Kharraz-Post7e2115d2019-02-01 16:51:22 -0500100 @Override
101 protected MetricsLogger getMetricsLogger() {
102 return sOverrides.metricsLogger;
103 }
104
Matt Pietalf38e9d22019-02-15 10:01:03 -0500105 @Override
106 public Cursor queryResolver(ContentResolver resolver, Uri uri) {
107 if (sOverrides.resolverCursor != null) {
108 return sOverrides.resolverCursor;
109 }
110
111 if (sOverrides.resolverForceException) {
112 throw new SecurityException("Test exception handling");
113 }
114
115 return super.queryResolver(resolver, uri);
116 }
117
Susi Kharraz-Post0446fab2019-02-21 09:42:31 -0500118 @Override
119 protected boolean isWorkProfile() {
120 if (sOverrides.alternateProfileSetting != 0) {
121 return sOverrides.alternateProfileSetting == MetricsEvent.MANAGED_PROFILE;
122 }
123 return super.isWorkProfile();
124 }
125
Susi Kharraz-Post14cbfcd2019-04-01 11:07:59 -0400126 public DisplayResolveInfo createTestDisplayResolveInfo(Intent originalIntent, ResolveInfo pri,
127 CharSequence pLabel, CharSequence pInfo, Intent pOrigIntent) {
128 return new DisplayResolveInfo(originalIntent, pri, pLabel, pInfo, pOrigIntent);
129 }
130
Hakan Seyalioglue1276bf2016-12-07 16:38:57 -0800131 /**
132 * We cannot directly mock the activity created since instrumentation creates it.
133 * <p>
134 * Instead, we use static instances of this object to modify behavior.
135 */
136 static class OverrideData {
137 @SuppressWarnings("Since15")
138 public Function<PackageManager, PackageManager> createPackageManager;
139 public Function<TargetInfo, Boolean> onSafelyStartCallback;
140 public ResolverListController resolverListController;
141 public Boolean isVoiceInteraction;
Matt Pietal46d828c2019-02-05 08:07:07 -0500142 public boolean isImageType;
Matt Pietalf38e9d22019-02-15 10:01:03 -0500143 public Cursor resolverCursor;
144 public boolean resolverForceException;
Matt Pietal26038402019-01-08 07:29:34 -0500145 public Bitmap previewThumbnail;
Susi Kharraz-Post7e2115d2019-02-01 16:51:22 -0500146 public MetricsLogger metricsLogger;
Susi Kharraz-Post0446fab2019-02-21 09:42:31 -0500147 public int alternateProfileSetting;
Hakan Seyalioglue1276bf2016-12-07 16:38:57 -0800148
149 public void reset() {
150 onSafelyStartCallback = null;
151 isVoiceInteraction = null;
152 createPackageManager = null;
Matt Pietal26038402019-01-08 07:29:34 -0500153 previewThumbnail = null;
Matt Pietal46d828c2019-02-05 08:07:07 -0500154 isImageType = false;
Matt Pietalf38e9d22019-02-15 10:01:03 -0500155 resolverCursor = null;
156 resolverForceException = false;
Hakan Seyalioglue1276bf2016-12-07 16:38:57 -0800157 resolverListController = mock(ResolverListController.class);
Susi Kharraz-Post7e2115d2019-02-01 16:51:22 -0500158 metricsLogger = mock(MetricsLogger.class);
Susi Kharraz-Post0446fab2019-02-21 09:42:31 -0500159 alternateProfileSetting = 0;
Hakan Seyalioglue1276bf2016-12-07 16:38:57 -0800160 }
161 }
Hakan Seyalioglu9149dca2017-01-17 12:20:01 -0800162}