1 /*
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 
17 package com.android.internal.app;
18 
19 import android.annotation.Nullable;
20 import android.content.Context;
21 import android.os.UserHandle;
22 import android.view.LayoutInflater;
23 import android.view.View;
24 import android.view.ViewGroup;
25 
26 import com.android.internal.R;
27 import com.android.internal.annotations.VisibleForTesting;
28 import com.android.internal.widget.GridLayoutManager;
29 import com.android.internal.widget.PagerAdapter;
30 import com.android.internal.widget.RecyclerView;
31 
32 /**
33  * A {@link PagerAdapter} which describes the work and personal profile share sheet screens.
34  */
35 @VisibleForTesting
36 public class ChooserMultiProfilePagerAdapter extends AbstractMultiProfilePagerAdapter {
37     private static final int SINGLE_CELL_SPAN_SIZE = 1;
38 
39     private final ChooserProfileDescriptor[] mItems;
40     private int mBottomOffset;
41     private int mMaxTargetsPerRow;
42 
ChooserMultiProfilePagerAdapter(Context context, ChooserActivity.ChooserGridAdapter adapter, EmptyStateProvider emptyStateProvider, QuietModeManager quietModeManager, UserHandle workProfileUserHandle, UserHandle cloneUserHandle, int maxTargetsPerRow)43     ChooserMultiProfilePagerAdapter(Context context,
44             ChooserActivity.ChooserGridAdapter adapter,
45             EmptyStateProvider emptyStateProvider,
46             QuietModeManager quietModeManager,
47             UserHandle workProfileUserHandle,
48             UserHandle cloneUserHandle,
49             int maxTargetsPerRow) {
50         super(context, /* currentPage */ 0, emptyStateProvider, quietModeManager,
51                 workProfileUserHandle, cloneUserHandle);
52         mItems = new ChooserProfileDescriptor[] {
53                 createProfileDescriptor(adapter)
54         };
55         mMaxTargetsPerRow = maxTargetsPerRow;
56     }
57 
ChooserMultiProfilePagerAdapter(Context context, ChooserActivity.ChooserGridAdapter personalAdapter, ChooserActivity.ChooserGridAdapter workAdapter, EmptyStateProvider emptyStateProvider, QuietModeManager quietModeManager, @Profile int defaultProfile, UserHandle workProfileUserHandle, UserHandle cloneUserHandle, int maxTargetsPerRow)58     ChooserMultiProfilePagerAdapter(Context context,
59             ChooserActivity.ChooserGridAdapter personalAdapter,
60             ChooserActivity.ChooserGridAdapter workAdapter,
61             EmptyStateProvider emptyStateProvider,
62             QuietModeManager quietModeManager,
63             @Profile int defaultProfile,
64             UserHandle workProfileUserHandle,
65             UserHandle cloneUserHandle,
66             int maxTargetsPerRow) {
67         super(context, /* currentPage */ defaultProfile, emptyStateProvider,
68                 quietModeManager, workProfileUserHandle, cloneUserHandle);
69         mItems = new ChooserProfileDescriptor[] {
70                 createProfileDescriptor(personalAdapter),
71                 createProfileDescriptor(workAdapter)
72         };
73         mMaxTargetsPerRow = maxTargetsPerRow;
74     }
75 
createProfileDescriptor( ChooserActivity.ChooserGridAdapter adapter)76     private ChooserProfileDescriptor createProfileDescriptor(
77             ChooserActivity.ChooserGridAdapter adapter) {
78         final LayoutInflater inflater = LayoutInflater.from(getContext());
79         final ViewGroup rootView =
80                 (ViewGroup) inflater.inflate(R.layout.chooser_list_per_profile, null, false);
81         ChooserProfileDescriptor profileDescriptor =
82                 new ChooserProfileDescriptor(rootView, adapter);
83         profileDescriptor.recyclerView.setAccessibilityDelegateCompat(
84                 new ChooserRecyclerViewAccessibilityDelegate(profileDescriptor.recyclerView));
85         return profileDescriptor;
86     }
87 
setMaxTargetsPerRow(int maxTargetsPerRow)88     public void setMaxTargetsPerRow(int maxTargetsPerRow) {
89         mMaxTargetsPerRow = maxTargetsPerRow;
90     }
91 
getListViewForIndex(int index)92     RecyclerView getListViewForIndex(int index) {
93         return getItem(index).recyclerView;
94     }
95 
96     @Override
getItem(int pageIndex)97     public ChooserProfileDescriptor getItem(int pageIndex) {
98         return mItems[pageIndex];
99     }
100 
101     @Override
getItemCount()102     int getItemCount() {
103         return mItems.length;
104     }
105 
106     @Override
107     @VisibleForTesting
getAdapterForIndex(int pageIndex)108     public ChooserActivity.ChooserGridAdapter getAdapterForIndex(int pageIndex) {
109         return mItems[pageIndex].chooserGridAdapter;
110     }
111 
112     @Override
113     @Nullable
getListAdapterForUserHandle(UserHandle userHandle)114     ChooserListAdapter getListAdapterForUserHandle(UserHandle userHandle) {
115         if (getPersonalListAdapter().getUserHandle().equals(userHandle)
116                 || userHandle.equals(getCloneUserHandle())) {
117             return getPersonalListAdapter();
118         } else if (getWorkListAdapter() != null
119                 && getWorkListAdapter().getUserHandle().equals(userHandle)) {
120             return getWorkListAdapter();
121         }
122         return null;
123     }
124 
125     @Override
setupListAdapter(int pageIndex)126     void setupListAdapter(int pageIndex) {
127         final RecyclerView recyclerView = getItem(pageIndex).recyclerView;
128         ChooserActivity.ChooserGridAdapter chooserGridAdapter =
129                 getItem(pageIndex).chooserGridAdapter;
130         GridLayoutManager glm = (GridLayoutManager) recyclerView.getLayoutManager();
131         glm.setSpanCount(mMaxTargetsPerRow);
132         glm.setSpanSizeLookup(
133                 new GridLayoutManager.SpanSizeLookup() {
134                     @Override
135                     public int getSpanSize(int position) {
136                         return chooserGridAdapter.shouldCellSpan(position)
137                                 ? SINGLE_CELL_SPAN_SIZE
138                                 : glm.getSpanCount();
139                     }
140                 });
141     }
142 
143     @Override
144     @VisibleForTesting
getActiveListAdapter()145     public ChooserListAdapter getActiveListAdapter() {
146         return getAdapterForIndex(getCurrentPage()).getListAdapter();
147     }
148 
149     @Override
150     @VisibleForTesting
getInactiveListAdapter()151     public ChooserListAdapter getInactiveListAdapter() {
152         if (getCount() == 1) {
153             return null;
154         }
155         return getAdapterForIndex(1 - getCurrentPage()).getListAdapter();
156     }
157 
158     @Override
getPersonalListAdapter()159     public ChooserListAdapter getPersonalListAdapter() {
160         return getAdapterForIndex(PROFILE_PERSONAL).getListAdapter();
161     }
162 
163     @Override
164     @Nullable
getWorkListAdapter()165     public ChooserListAdapter getWorkListAdapter() {
166         if (getCount() == 1) {
167             return null;
168         }
169         return getAdapterForIndex(PROFILE_WORK).getListAdapter();
170     }
171 
172     @Override
getCurrentRootAdapter()173     ChooserActivity.ChooserGridAdapter getCurrentRootAdapter() {
174         return getAdapterForIndex(getCurrentPage());
175     }
176 
177     @Override
getActiveAdapterView()178     RecyclerView getActiveAdapterView() {
179         return getListViewForIndex(getCurrentPage());
180     }
181 
182     @Override
183     @Nullable
getInactiveAdapterView()184     RecyclerView getInactiveAdapterView() {
185         if (getCount() == 1) {
186             return null;
187         }
188         return getListViewForIndex(1 - getCurrentPage());
189     }
190 
setEmptyStateBottomOffset(int bottomOffset)191     void setEmptyStateBottomOffset(int bottomOffset) {
192         mBottomOffset = bottomOffset;
193     }
194 
195     @Override
setupContainerPadding(View container)196     protected void setupContainerPadding(View container) {
197         int initialBottomPadding = getContext().getResources().getDimensionPixelSize(
198                 R.dimen.resolver_empty_state_container_padding_bottom);
199         container.setPadding(container.getPaddingLeft(), container.getPaddingTop(),
200                 container.getPaddingRight(), initialBottomPadding + mBottomOffset);
201     }
202 
203     class ChooserProfileDescriptor extends ProfileDescriptor {
204         private ChooserActivity.ChooserGridAdapter chooserGridAdapter;
205         private RecyclerView recyclerView;
ChooserProfileDescriptor(ViewGroup rootView, ChooserActivity.ChooserGridAdapter adapter)206         ChooserProfileDescriptor(ViewGroup rootView, ChooserActivity.ChooserGridAdapter adapter) {
207             super(rootView);
208             chooserGridAdapter = adapter;
209             recyclerView = rootView.findViewById(R.id.resolver_list);
210         }
211     }
212 }
213