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 import android.widget.ListView; 26 27 import com.android.internal.R; 28 import com.android.internal.annotations.VisibleForTesting; 29 import com.android.internal.widget.PagerAdapter; 30 31 /** 32 * A {@link PagerAdapter} which describes the work and personal profile intent resolver screens. 33 */ 34 @VisibleForTesting 35 public class ResolverMultiProfilePagerAdapter extends AbstractMultiProfilePagerAdapter { 36 37 private final ResolverProfileDescriptor[] mItems; 38 private boolean mUseLayoutWithDefault; 39 ResolverMultiProfilePagerAdapter(Context context, ResolverListAdapter adapter, EmptyStateProvider emptyStateProvider, QuietModeManager quietModeManager, UserHandle workProfileUserHandle)40 ResolverMultiProfilePagerAdapter(Context context, 41 ResolverListAdapter adapter, 42 EmptyStateProvider emptyStateProvider, 43 QuietModeManager quietModeManager, 44 UserHandle workProfileUserHandle) { 45 super(context, /* currentPage */ 0, emptyStateProvider, quietModeManager, 46 workProfileUserHandle); 47 mItems = new ResolverProfileDescriptor[] { 48 createProfileDescriptor(adapter) 49 }; 50 } 51 ResolverMultiProfilePagerAdapter(Context context, ResolverListAdapter personalAdapter, ResolverListAdapter workAdapter, EmptyStateProvider emptyStateProvider, QuietModeManager quietModeManager, @Profile int defaultProfile, UserHandle workProfileUserHandle)52 ResolverMultiProfilePagerAdapter(Context context, 53 ResolverListAdapter personalAdapter, 54 ResolverListAdapter workAdapter, 55 EmptyStateProvider emptyStateProvider, 56 QuietModeManager quietModeManager, 57 @Profile int defaultProfile, 58 UserHandle workProfileUserHandle) { 59 super(context, /* currentPage */ defaultProfile, emptyStateProvider, quietModeManager, 60 workProfileUserHandle); 61 mItems = new ResolverProfileDescriptor[] { 62 createProfileDescriptor(personalAdapter), 63 createProfileDescriptor(workAdapter) 64 }; 65 } 66 createProfileDescriptor( ResolverListAdapter adapter)67 private ResolverProfileDescriptor createProfileDescriptor( 68 ResolverListAdapter adapter) { 69 final LayoutInflater inflater = LayoutInflater.from(getContext()); 70 final ViewGroup rootView = 71 (ViewGroup) inflater.inflate(R.layout.resolver_list_per_profile, null, false); 72 return new ResolverProfileDescriptor(rootView, adapter); 73 } 74 getListViewForIndex(int index)75 ListView getListViewForIndex(int index) { 76 return getItem(index).listView; 77 } 78 79 @Override getItem(int pageIndex)80 ResolverProfileDescriptor getItem(int pageIndex) { 81 return mItems[pageIndex]; 82 } 83 84 @Override getItemCount()85 int getItemCount() { 86 return mItems.length; 87 } 88 89 @Override setupListAdapter(int pageIndex)90 void setupListAdapter(int pageIndex) { 91 final ListView listView = getItem(pageIndex).listView; 92 listView.setAdapter(getItem(pageIndex).resolverListAdapter); 93 } 94 95 @Override 96 @VisibleForTesting getAdapterForIndex(int pageIndex)97 public ResolverListAdapter getAdapterForIndex(int pageIndex) { 98 return mItems[pageIndex].resolverListAdapter; 99 } 100 101 @Override instantiateItem(ViewGroup container, int position)102 public ViewGroup instantiateItem(ViewGroup container, int position) { 103 setupListAdapter(position); 104 return super.instantiateItem(container, position); 105 } 106 107 @Override 108 @Nullable getListAdapterForUserHandle(UserHandle userHandle)109 ResolverListAdapter getListAdapterForUserHandle(UserHandle userHandle) { 110 if (getActiveListAdapter().getUserHandle().equals(userHandle)) { 111 return getActiveListAdapter(); 112 } else if (getInactiveListAdapter() != null 113 && getInactiveListAdapter().getUserHandle().equals(userHandle)) { 114 return getInactiveListAdapter(); 115 } 116 return null; 117 } 118 119 @Override 120 @VisibleForTesting getActiveListAdapter()121 public ResolverListAdapter getActiveListAdapter() { 122 return getAdapterForIndex(getCurrentPage()); 123 } 124 125 @Override 126 @VisibleForTesting getInactiveListAdapter()127 public ResolverListAdapter getInactiveListAdapter() { 128 if (getCount() == 1) { 129 return null; 130 } 131 return getAdapterForIndex(1 - getCurrentPage()); 132 } 133 134 @Override getPersonalListAdapter()135 public ResolverListAdapter getPersonalListAdapter() { 136 return getAdapterForIndex(PROFILE_PERSONAL); 137 } 138 139 @Override 140 @Nullable getWorkListAdapter()141 public ResolverListAdapter getWorkListAdapter() { 142 return getAdapterForIndex(PROFILE_WORK); 143 } 144 145 @Override getCurrentRootAdapter()146 ResolverListAdapter getCurrentRootAdapter() { 147 return getActiveListAdapter(); 148 } 149 150 @Override getActiveAdapterView()151 ListView getActiveAdapterView() { 152 return getListViewForIndex(getCurrentPage()); 153 } 154 155 @Override 156 @Nullable getInactiveAdapterView()157 ViewGroup getInactiveAdapterView() { 158 if (getCount() == 1) { 159 return null; 160 } 161 return getListViewForIndex(1 - getCurrentPage()); 162 } 163 setUseLayoutWithDefault(boolean useLayoutWithDefault)164 void setUseLayoutWithDefault(boolean useLayoutWithDefault) { 165 mUseLayoutWithDefault = useLayoutWithDefault; 166 } 167 168 @Override setupContainerPadding(View container)169 protected void setupContainerPadding(View container) { 170 int bottom = mUseLayoutWithDefault ? container.getPaddingBottom() : 0; 171 container.setPadding(container.getPaddingLeft(), container.getPaddingTop(), 172 container.getPaddingRight(), bottom); 173 } 174 175 class ResolverProfileDescriptor extends ProfileDescriptor { 176 private ResolverListAdapter resolverListAdapter; 177 final ListView listView; ResolverProfileDescriptor(ViewGroup rootView, ResolverListAdapter adapter)178 ResolverProfileDescriptor(ViewGroup rootView, ResolverListAdapter adapter) { 179 super(rootView); 180 resolverListAdapter = adapter; 181 listView = rootView.findViewById(R.id.resolver_list); 182 } 183 } 184 } 185