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