1 /*
2  * Copyright (C) 2024 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.intentresolver.profiles;
18 
19 import android.content.Context;
20 import android.os.UserHandle;
21 import android.view.LayoutInflater;
22 import android.view.ViewGroup;
23 import android.widget.ListView;
24 
25 import androidx.viewpager.widget.PagerAdapter;
26 
27 import com.android.intentresolver.R;
28 import com.android.intentresolver.ResolverListAdapter;
29 import com.android.intentresolver.emptystate.EmptyStateProvider;
30 
31 import com.google.common.collect.ImmutableList;
32 
33 import java.util.Optional;
34 import java.util.function.Supplier;
35 
36 /**
37  * A {@link PagerAdapter} which describes the work and personal profile intent resolver screens.
38  */
39 public class ResolverMultiProfilePagerAdapter extends
40         MultiProfilePagerAdapter<ListView, ResolverListAdapter, ResolverListAdapter> {
41     private final BottomPaddingOverrideSupplier mBottomPaddingOverrideSupplier;
42 
ResolverMultiProfilePagerAdapter(Context context, ImmutableList<TabConfig<ResolverListAdapter>> tabs, EmptyStateProvider emptyStateProvider, Supplier<Boolean> workProfileQuietModeChecker, @ProfileType int defaultProfile, UserHandle workProfileUserHandle, UserHandle cloneProfileUserHandle)43     public ResolverMultiProfilePagerAdapter(Context context,
44                                             ImmutableList<TabConfig<ResolverListAdapter>> tabs,
45                                             EmptyStateProvider emptyStateProvider,
46                                             Supplier<Boolean> workProfileQuietModeChecker,
47                                             @ProfileType int defaultProfile,
48                                             UserHandle workProfileUserHandle,
49                                             UserHandle cloneProfileUserHandle) {
50         this(
51                 context,
52                 tabs,
53                 emptyStateProvider,
54                 workProfileQuietModeChecker,
55                 defaultProfile,
56                 workProfileUserHandle,
57                 cloneProfileUserHandle,
58                 new BottomPaddingOverrideSupplier());
59     }
60 
ResolverMultiProfilePagerAdapter( Context context, ImmutableList<TabConfig<ResolverListAdapter>> tabs, EmptyStateProvider emptyStateProvider, Supplier<Boolean> workProfileQuietModeChecker, @ProfileType int defaultProfile, UserHandle workProfileUserHandle, UserHandle cloneProfileUserHandle, BottomPaddingOverrideSupplier bottomPaddingOverrideSupplier)61     private ResolverMultiProfilePagerAdapter(
62             Context context,
63             ImmutableList<TabConfig<ResolverListAdapter>> tabs,
64             EmptyStateProvider emptyStateProvider,
65             Supplier<Boolean> workProfileQuietModeChecker,
66             @ProfileType int defaultProfile,
67             UserHandle workProfileUserHandle,
68             UserHandle cloneProfileUserHandle,
69             BottomPaddingOverrideSupplier bottomPaddingOverrideSupplier) {
70         super(
71                         listAdapter -> listAdapter,
72                         (listView, bindAdapter) -> listView.setAdapter(bindAdapter),
73                 tabs,
74                 emptyStateProvider,
75                 workProfileQuietModeChecker,
76                 defaultProfile,
77                 workProfileUserHandle,
78                 cloneProfileUserHandle,
79                         () -> (ViewGroup) LayoutInflater.from(context).inflate(
80                                 R.layout.resolver_list_per_profile, null, false),
81                 bottomPaddingOverrideSupplier);
82         mBottomPaddingOverrideSupplier = bottomPaddingOverrideSupplier;
83     }
84 
setUseLayoutWithDefault(boolean useLayoutWithDefault)85     public void setUseLayoutWithDefault(boolean useLayoutWithDefault) {
86         mBottomPaddingOverrideSupplier.setUseLayoutWithDefault(useLayoutWithDefault);
87     }
88 
89     /** Un-check any item(s) that may be checked in any of our inactive adapter(s). */
clearCheckedItemsInInactiveProfiles()90     public void clearCheckedItemsInInactiveProfiles() {
91         // TODO: The "inactive" condition is legacy logic. Could we simplify and clear-all?
92         forEachInactivePage(pageNumber -> {
93             ListView inactiveListView = getListViewForIndex(pageNumber);
94             if (inactiveListView.getCheckedItemCount() > 0) {
95                 inactiveListView.setItemChecked(inactiveListView.getCheckedItemPosition(), false);
96             }
97         });
98     }
99 
100     private static class BottomPaddingOverrideSupplier implements Supplier<Optional<Integer>> {
101         private boolean mUseLayoutWithDefault;
102 
setUseLayoutWithDefault(boolean useLayoutWithDefault)103         public void setUseLayoutWithDefault(boolean useLayoutWithDefault) {
104             mUseLayoutWithDefault = useLayoutWithDefault;
105         }
106 
107         @Override
get()108         public Optional<Integer> get() {
109             return mUseLayoutWithDefault ? Optional.empty() : Optional.of(0);
110         }
111     }
112 }
113