• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2017 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
5  * except in compliance with the License. You may obtain a copy of the License at
6  *
7  *      http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software distributed under the
10  * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
11  * KIND, either express or implied. See the License for the specific language governing
12  * permissions and limitations under the License.
13  */
14 package com.android.settings.location;
15 
16 import android.content.Context;
17 import android.os.Bundle;
18 import android.os.UserHandle;
19 import android.support.annotation.VisibleForTesting;
20 import android.support.v7.preference.Preference;
21 import android.support.v7.preference.PreferenceCategory;
22 import android.support.v7.preference.PreferenceScreen;
23 import com.android.settings.R;
24 import com.android.settings.applications.appinfo.AppInfoDashboardFragment;
25 import com.android.settings.core.SubSettingLauncher;
26 import com.android.settings.dashboard.DashboardFragment;
27 import com.android.settings.widget.AppPreference;
28 import com.android.settingslib.core.lifecycle.Lifecycle;
29 import com.android.settingslib.location.RecentLocationApps;
30 import java.util.List;
31 
32 public class RecentLocationRequestPreferenceController extends LocationBasePreferenceController {
33 
34     /** Key for preference category "Recent location requests" */
35     private static final String KEY_RECENT_LOCATION_REQUESTS = "recent_location_requests";
36     @VisibleForTesting
37     static final String KEY_SEE_ALL_BUTTON = "recent_location_requests_see_all_button";
38     private final LocationSettings mFragment;
39     private final RecentLocationApps mRecentLocationApps;
40     private PreferenceCategory mCategoryRecentLocationRequests;
41     private Preference mSeeAllButton;
42 
43     /** Used in this class and {@link RecentLocationRequestSeeAllPreferenceController}*/
44     static class PackageEntryClickedListener implements Preference.OnPreferenceClickListener {
45         private final DashboardFragment mFragment;
46         private final String mPackage;
47         private final UserHandle mUserHandle;
48 
PackageEntryClickedListener(DashboardFragment fragment, String packageName, UserHandle userHandle)49         public PackageEntryClickedListener(DashboardFragment fragment, String packageName,
50                 UserHandle userHandle) {
51             mFragment = fragment;
52             mPackage = packageName;
53             mUserHandle = userHandle;
54         }
55 
56         @Override
onPreferenceClick(Preference preference)57         public boolean onPreferenceClick(Preference preference) {
58             // start new fragment to display extended information
59             final Bundle args = new Bundle();
60             args.putString(AppInfoDashboardFragment.ARG_PACKAGE_NAME, mPackage);
61 
62             new SubSettingLauncher(mFragment.getContext())
63                     .setDestination(AppInfoDashboardFragment.class.getName())
64                     .setArguments(args)
65                     .setTitle(R.string.application_info_label)
66                     .setUserHandle(mUserHandle)
67                     .setSourceMetricsCategory(mFragment.getMetricsCategory())
68                     .launch();
69             return true;
70         }
71     }
72 
RecentLocationRequestPreferenceController(Context context, LocationSettings fragment, Lifecycle lifecycle)73     public RecentLocationRequestPreferenceController(Context context, LocationSettings fragment,
74             Lifecycle lifecycle) {
75         this(context, fragment, lifecycle, new RecentLocationApps(context));
76     }
77 
78     @VisibleForTesting
RecentLocationRequestPreferenceController(Context context, LocationSettings fragment, Lifecycle lifecycle, RecentLocationApps recentApps)79     RecentLocationRequestPreferenceController(Context context, LocationSettings fragment,
80             Lifecycle lifecycle, RecentLocationApps recentApps) {
81         super(context, lifecycle);
82         mFragment = fragment;
83         mRecentLocationApps = recentApps;
84     }
85 
86     @Override
getPreferenceKey()87     public String getPreferenceKey() {
88         return KEY_RECENT_LOCATION_REQUESTS;
89     }
90 
91     @Override
displayPreference(PreferenceScreen screen)92     public void displayPreference(PreferenceScreen screen) {
93         super.displayPreference(screen);
94         mCategoryRecentLocationRequests =
95                 (PreferenceCategory) screen.findPreference(KEY_RECENT_LOCATION_REQUESTS);
96         mSeeAllButton = screen.findPreference(KEY_SEE_ALL_BUTTON);
97 
98     }
99 
100     @Override
updateState(Preference preference)101     public void updateState(Preference preference) {
102         mCategoryRecentLocationRequests.removeAll();
103         mSeeAllButton.setVisible(false);
104 
105         final Context prefContext = preference.getContext();
106         final List<RecentLocationApps.Request> recentLocationRequests =
107                 mRecentLocationApps.getAppListSorted();
108 
109         if (recentLocationRequests.size() > 3) {
110             // Display the top 3 preferences to container in original order.
111             for (int i = 0; i < 3; i ++) {
112                 mCategoryRecentLocationRequests.addPreference(
113                         createAppPreference(prefContext, recentLocationRequests.get(i)));
114             }
115             // Display a button to list all requests
116             mSeeAllButton.setVisible(true);
117         } else if (recentLocationRequests.size() > 0) {
118             // Add preferences to container in original order (already sorted by recency).
119             for (RecentLocationApps.Request request : recentLocationRequests) {
120                 mCategoryRecentLocationRequests.addPreference(
121                         createAppPreference(prefContext, request));
122             }
123         } else {
124             // If there's no item to display, add a "No recent apps" item.
125             final Preference banner = createAppPreference(prefContext);
126             banner.setTitle(R.string.location_no_recent_apps);
127             banner.setSelectable(false);
128             mCategoryRecentLocationRequests.addPreference(banner);
129         }
130     }
131 
132     @Override
onLocationModeChanged(int mode, boolean restricted)133     public void onLocationModeChanged(int mode, boolean restricted) {
134         mCategoryRecentLocationRequests.setEnabled(mLocationEnabler.isEnabled(mode));
135     }
136 
137     @VisibleForTesting
createAppPreference(Context prefContext)138     AppPreference createAppPreference(Context prefContext) {
139         return new AppPreference(prefContext);
140     }
141 
142     @VisibleForTesting
createAppPreference(Context prefContext, RecentLocationApps.Request request)143     AppPreference createAppPreference(Context prefContext, RecentLocationApps.Request request) {
144         final AppPreference pref = createAppPreference(prefContext);
145         pref.setSummary(request.contentDescription);
146         pref.setIcon(request.icon);
147         pref.setTitle(request.label);
148         pref.setOnPreferenceClickListener(new PackageEntryClickedListener(
149                 mFragment, request.packageName, request.userHandle));
150         return pref;
151     }
152 }
153