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