blob: b690a18f2d0ead758735ff9152d3eeee107937c0 [file] [log] [blame]
arangelov38a6fce2019-12-02 18:21:22 +00001/*
2 * Copyright (C) 2019 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
arangelovcf268642020-01-15 15:09:51 +000019import android.annotation.Nullable;
arangelov38a6fce2019-12-02 18:21:22 +000020import android.content.Context;
arangelov5fc9e7d2020-01-07 17:59:14 +000021import android.os.UserHandle;
arangelov38a6fce2019-12-02 18:21:22 +000022import android.view.LayoutInflater;
arangelov78fd3602020-02-28 15:21:20 +000023import android.view.View;
arangelov38a6fce2019-12-02 18:21:22 +000024import android.view.ViewGroup;
25import android.widget.ListView;
26
27import com.android.internal.R;
28import com.android.internal.annotations.VisibleForTesting;
29import com.android.internal.widget.PagerAdapter;
30
31/**
32 * A {@link PagerAdapter} which describes the work and personal profile intent resolver screens.
33 */
34@VisibleForTesting
35public class ResolverMultiProfilePagerAdapter extends AbstractMultiProfilePagerAdapter {
36
37 private final ResolverProfileDescriptor[] mItems;
38
39 ResolverMultiProfilePagerAdapter(Context context,
arangelov7981b122020-01-16 10:58:27 +000040 ResolverListAdapter adapter,
41 UserHandle personalProfileUserHandle,
42 UserHandle workProfileUserHandle) {
43 super(context, /* currentPage */ 0, personalProfileUserHandle, workProfileUserHandle);
arangelov38a6fce2019-12-02 18:21:22 +000044 mItems = new ResolverProfileDescriptor[] {
45 createProfileDescriptor(adapter)
46 };
47 }
48
49 ResolverMultiProfilePagerAdapter(Context context,
50 ResolverListAdapter personalAdapter,
51 ResolverListAdapter workAdapter,
arangelov7981b122020-01-16 10:58:27 +000052 @Profile int defaultProfile,
53 UserHandle personalProfileUserHandle,
54 UserHandle workProfileUserHandle) {
55 super(context, /* currentPage */ defaultProfile, personalProfileUserHandle,
56 workProfileUserHandle);
arangelov38a6fce2019-12-02 18:21:22 +000057 mItems = new ResolverProfileDescriptor[] {
58 createProfileDescriptor(personalAdapter),
59 createProfileDescriptor(workAdapter)
60 };
61 }
62
63 private ResolverProfileDescriptor createProfileDescriptor(
64 ResolverListAdapter adapter) {
65 final LayoutInflater inflater = LayoutInflater.from(getContext());
66 final ViewGroup rootView =
67 (ViewGroup) inflater.inflate(R.layout.resolver_list_per_profile, null, false);
68 return new ResolverProfileDescriptor(rootView, adapter);
69 }
70
71 ListView getListViewForIndex(int index) {
72 return getItem(index).listView;
73 }
74
75 @Override
76 ResolverProfileDescriptor getItem(int pageIndex) {
77 return mItems[pageIndex];
78 }
79
80 @Override
81 int getItemCount() {
82 return mItems.length;
83 }
84
85 @Override
86 void setupListAdapter(int pageIndex) {
87 final ListView listView = getItem(pageIndex).listView;
88 listView.setAdapter(getItem(pageIndex).resolverListAdapter);
89 }
90
91 @Override
arangelovcf268642020-01-15 15:09:51 +000092 @VisibleForTesting
93 public ResolverListAdapter getAdapterForIndex(int pageIndex) {
arangelov38a6fce2019-12-02 18:21:22 +000094 return mItems[pageIndex].resolverListAdapter;
95 }
96
97 @Override
arangelovc4dbdbd2020-02-18 20:54:16 +000098 public ViewGroup instantiateItem(ViewGroup container, int position) {
99 setupListAdapter(position);
100 return super.instantiateItem(container, position);
101 }
102
103 @Override
arangelov5fc9e7d2020-01-07 17:59:14 +0000104 @Nullable
105 ResolverListAdapter getListAdapterForUserHandle(UserHandle userHandle) {
arangelove5b369c2020-03-12 17:36:05 +0000106 if (getActiveListAdapter().getUserHandle().equals(userHandle)) {
arangelov5fc9e7d2020-01-07 17:59:14 +0000107 return getActiveListAdapter();
108 } else if (getInactiveListAdapter() != null
arangelove5b369c2020-03-12 17:36:05 +0000109 && getInactiveListAdapter().getUserHandle().equals(userHandle)) {
arangelov5fc9e7d2020-01-07 17:59:14 +0000110 return getInactiveListAdapter();
111 }
112 return null;
113 }
114
115 @Override
arangelov38a6fce2019-12-02 18:21:22 +0000116 @VisibleForTesting
arangelova3912cf2019-12-13 14:34:45 +0000117 public ResolverListAdapter getActiveListAdapter() {
arangelov38a6fce2019-12-02 18:21:22 +0000118 return getAdapterForIndex(getCurrentPage());
119 }
120
121 @Override
arangelova3912cf2019-12-13 14:34:45 +0000122 @VisibleForTesting
123 public ResolverListAdapter getInactiveListAdapter() {
124 if (getCount() == 1) {
125 return null;
126 }
127 return getAdapterForIndex(1 - getCurrentPage());
128 }
129
130 @Override
arangelov7981b122020-01-16 10:58:27 +0000131 public ResolverListAdapter getPersonalListAdapter() {
132 return getAdapterForIndex(PROFILE_PERSONAL);
133 }
134
135 @Override
136 @Nullable
137 public ResolverListAdapter getWorkListAdapter() {
138 return getAdapterForIndex(PROFILE_WORK);
139 }
140
141 @Override
arangelov38a6fce2019-12-02 18:21:22 +0000142 ResolverListAdapter getCurrentRootAdapter() {
arangelova3912cf2019-12-13 14:34:45 +0000143 return getActiveListAdapter();
arangelov38a6fce2019-12-02 18:21:22 +0000144 }
145
146 @Override
arangelovcf268642020-01-15 15:09:51 +0000147 ListView getActiveAdapterView() {
arangelov38a6fce2019-12-02 18:21:22 +0000148 return getListViewForIndex(getCurrentPage());
149 }
150
arangelovcf268642020-01-15 15:09:51 +0000151 @Override
152 @Nullable
153 ViewGroup getInactiveAdapterView() {
154 if (getCount() == 1) {
155 return null;
156 }
157 return getListViewForIndex(1 - getCurrentPage());
158 }
159
arangelov4bf17472020-02-17 20:21:46 +0000160 @Override
161 String getMetricsCategory() {
162 return ResolverActivity.METRICS_CATEGORY_RESOLVER;
163 }
164
arangelov78fd3602020-02-28 15:21:20 +0000165 @Override
166 protected void showWorkProfileOffEmptyState(ResolverListAdapter activeListAdapter,
167 View.OnClickListener listener) {
168 showEmptyState(activeListAdapter,
169 R.drawable.ic_work_apps_off,
arangelovafec9d02020-03-17 12:41:01 +0000170 R.string.resolver_turn_on_work_apps,
arangelov78fd3602020-02-28 15:21:20 +0000171 /* subtitleRes */ 0,
172 listener);
173 }
174
175 @Override
176 protected void showNoPersonalToWorkIntentsEmptyState(ResolverListAdapter activeListAdapter) {
177 showEmptyState(activeListAdapter,
178 R.drawable.ic_sharing_disabled,
179 R.string.resolver_cant_access_work_apps,
180 R.string.resolver_cant_access_work_apps_explanation);
181 }
182
183 @Override
184 protected void showNoWorkToPersonalIntentsEmptyState(ResolverListAdapter activeListAdapter) {
185 showEmptyState(activeListAdapter,
186 R.drawable.ic_sharing_disabled,
187 R.string.resolver_cant_access_personal_apps,
188 R.string.resolver_cant_access_personal_apps_explanation);
189 }
190
arangelovafec9d02020-03-17 12:41:01 +0000191 @Override
192 protected void showNoPersonalAppsAvailableEmptyState(ResolverListAdapter listAdapter) {
193 showEmptyState(listAdapter,
194 R.drawable.ic_no_apps,
195 R.string.resolver_no_personal_apps_available_resolve,
196 /* subtitleRes */ 0);
197 }
198
199 @Override
200 protected void showNoWorkAppsAvailableEmptyState(ResolverListAdapter listAdapter) {
201 showEmptyState(listAdapter,
202 R.drawable.ic_no_apps,
203 R.string.resolver_no_work_apps_available_resolve,
204 /* subtitleRes */ 0);
205 }
206
arangelov38a6fce2019-12-02 18:21:22 +0000207 class ResolverProfileDescriptor extends ProfileDescriptor {
208 private ResolverListAdapter resolverListAdapter;
209 final ListView listView;
210 ResolverProfileDescriptor(ViewGroup rootView, ResolverListAdapter adapter) {
211 super(rootView);
212 resolverListAdapter = adapter;
213 listView = rootView.findViewById(R.id.resolver_list);
214 }
215 }
216}