• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2015 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.settings.notification;
18 
19 import android.app.Activity;
20 import android.app.Application;
21 import android.app.Fragment;
22 import android.content.Context;
23 import android.content.Intent;
24 import android.os.Bundle;
25 import android.os.UserHandle;
26 import android.provider.SearchIndexableResource;
27 import android.support.annotation.VisibleForTesting;
28 import android.support.v7.preference.Preference;
29 import android.text.TextUtils;
30 
31 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
32 import com.android.settings.R;
33 import com.android.settings.RingtonePreference;
34 import com.android.settings.dashboard.DashboardFragment;
35 import com.android.settings.dashboard.SummaryLoader;
36 import com.android.settings.gestures.SwipeToNotificationPreferenceController;
37 import com.android.settings.search.BaseSearchIndexProvider;
38 import com.android.settings.search.Indexable;
39 import com.android.settingslib.core.AbstractPreferenceController;
40 import com.android.settingslib.core.lifecycle.Lifecycle;
41 
42 import java.util.ArrayList;
43 import java.util.Arrays;
44 import java.util.List;
45 
46 public class ConfigureNotificationSettings extends DashboardFragment {
47     private static final String TAG = "ConfigNotiSettings";
48 
49     @VisibleForTesting
50     static final String KEY_LOCKSCREEN = "lock_screen_notifications";
51     @VisibleForTesting
52     static final String KEY_LOCKSCREEN_WORK_PROFILE_HEADER =
53             "lock_screen_notifications_profile_header";
54     @VisibleForTesting
55     static final String KEY_LOCKSCREEN_WORK_PROFILE = "lock_screen_notifications_profile";
56     @VisibleForTesting
57     static final String KEY_SWIPE_DOWN = "gesture_swipe_down_fingerprint_notifications";
58 
59     private static final String KEY_NOTI_DEFAULT_RINGTONE = "notification_default_ringtone";
60     private static final String KEY_ZEN_MODE = "zen_mode_notifications";
61 
62     private RingtonePreference mRequestPreference;
63     private static final int REQUEST_CODE = 200;
64     private static final String SELECTED_PREFERENCE_KEY = "selected_preference";
65 
66     @Override
getMetricsCategory()67     public int getMetricsCategory() {
68         return MetricsEvent.CONFIGURE_NOTIFICATION;
69     }
70 
71     @Override
getLogTag()72     protected String getLogTag() {
73         return TAG;
74     }
75 
76     @Override
getPreferenceScreenResId()77     protected int getPreferenceScreenResId() {
78         return R.xml.configure_notification_settings;
79     }
80 
81     @Override
createPreferenceControllers(Context context)82     protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
83         final Activity activity = getActivity();
84         final Application app;
85         if (activity != null) {
86             app = activity.getApplication();
87         } else {
88             app = null;
89         }
90         return buildPreferenceControllers(context, getLifecycle(), app, this);
91     }
92 
buildPreferenceControllers(Context context, Lifecycle lifecycle, Application app, Fragment host)93     private static List<AbstractPreferenceController> buildPreferenceControllers(Context context,
94             Lifecycle lifecycle, Application app, Fragment host) {
95         final List<AbstractPreferenceController> controllers = new ArrayList<>();
96         final PulseNotificationPreferenceController pulseController =
97                 new PulseNotificationPreferenceController(context);
98         final LockScreenNotificationPreferenceController lockScreenNotificationController =
99                 new LockScreenNotificationPreferenceController(context,
100                         KEY_LOCKSCREEN,
101                         KEY_LOCKSCREEN_WORK_PROFILE_HEADER,
102                         KEY_LOCKSCREEN_WORK_PROFILE);
103         if (lifecycle != null) {
104             lifecycle.addObserver(pulseController);
105             lifecycle.addObserver(lockScreenNotificationController);
106         }
107         controllers.add(new RecentNotifyingAppsPreferenceController(
108                 context, new NotificationBackend(), app, host));
109         controllers.add(pulseController);
110         controllers.add(lockScreenNotificationController);
111         controllers.add(new NotificationRingtonePreferenceController(context) {
112             @Override
113             public String getPreferenceKey() {
114                 return KEY_NOTI_DEFAULT_RINGTONE;
115             }
116 
117         });
118         controllers.add(new ZenModePreferenceController(context, lifecycle, KEY_ZEN_MODE));
119         return controllers;
120     }
121 
122     @Override
onPreferenceTreeClick(Preference preference)123     public boolean onPreferenceTreeClick(Preference preference) {
124         if (preference instanceof RingtonePreference) {
125             mRequestPreference = (RingtonePreference) preference;
126             mRequestPreference.onPrepareRingtonePickerIntent(mRequestPreference.getIntent());
127             startActivityForResultAsUser(
128                     mRequestPreference.getIntent(),
129                     REQUEST_CODE,
130                     null,
131                     UserHandle.of(mRequestPreference.getUserId()));
132             return true;
133         }
134         return super.onPreferenceTreeClick(preference);
135     }
136 
137     @Override
onActivityResult(int requestCode, int resultCode, Intent data)138     public void onActivityResult(int requestCode, int resultCode, Intent data) {
139         if (mRequestPreference != null) {
140             mRequestPreference.onActivityResult(requestCode, resultCode, data);
141             mRequestPreference = null;
142         }
143     }
144 
145     @Override
onSaveInstanceState(Bundle outState)146     public void onSaveInstanceState(Bundle outState) {
147         super.onSaveInstanceState(outState);
148         if (mRequestPreference != null) {
149             outState.putString(SELECTED_PREFERENCE_KEY, mRequestPreference.getKey());
150         }
151     }
152 
153     /**
154      * For summary
155      */
156     static class SummaryProvider implements SummaryLoader.SummaryProvider {
157 
158         private final Context mContext;
159         private final SummaryLoader mSummaryLoader;
160         private NotificationBackend mBackend;
161 
SummaryProvider(Context context, SummaryLoader summaryLoader)162         public SummaryProvider(Context context, SummaryLoader summaryLoader) {
163             mContext = context;
164             mSummaryLoader = summaryLoader;
165             mBackend = new NotificationBackend();
166         }
167 
168         @VisibleForTesting
setBackend(NotificationBackend backend)169         protected void setBackend(NotificationBackend backend) {
170             mBackend = backend;
171         }
172 
173         @Override
setListening(boolean listening)174         public void setListening(boolean listening) {
175             if (!listening) {
176                 return;
177             }
178             int blockedAppCount = mBackend.getBlockedAppCount();
179             if (blockedAppCount == 0) {
180                 mSummaryLoader.setSummary(this,
181                         mContext.getText(R.string.app_notification_listing_summary_zero));
182             } else {
183                 mSummaryLoader.setSummary(this,
184                         mContext.getResources().getQuantityString(
185                                 R.plurals.app_notification_listing_summary_others,
186                                 blockedAppCount, blockedAppCount));
187             }
188         }
189     }
190 
191     public static final SummaryLoader.SummaryProviderFactory SUMMARY_PROVIDER_FACTORY =
192             new SummaryLoader.SummaryProviderFactory() {
193                 @Override
194                 public SummaryLoader.SummaryProvider createSummaryProvider(Activity activity,
195                         SummaryLoader summaryLoader) {
196                     return new ConfigureNotificationSettings.SummaryProvider(
197                             activity, summaryLoader);
198                 }
199             };
200 
201     /**
202      * For Search.
203      */
204     public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
205             new BaseSearchIndexProvider() {
206                 @Override
207                 public List<SearchIndexableResource> getXmlResourcesToIndex(
208                         Context context, boolean enabled) {
209                     final SearchIndexableResource sir = new SearchIndexableResource(context);
210                     sir.xmlResId = R.xml.configure_notification_settings;
211                     return Arrays.asList(sir);
212                 }
213 
214                 @Override
215                 public List<AbstractPreferenceController> createPreferenceControllers(
216                         Context context) {
217                     return buildPreferenceControllers(context, null, null, null);
218                 }
219 
220                 @Override
221                 public List<String> getNonIndexableKeys(Context context) {
222                     final List<String> keys = super.getNonIndexableKeys(context);
223                     keys.add(KEY_SWIPE_DOWN);
224                     keys.add(KEY_LOCKSCREEN);
225                     keys.add(KEY_LOCKSCREEN_WORK_PROFILE);
226                     keys.add(KEY_LOCKSCREEN_WORK_PROFILE_HEADER);
227                     keys.add(KEY_ZEN_MODE);
228                     return keys;
229                 }
230             };
231 }
232