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