Home | History | Annotate | Download | only in notification
      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
     67     public int getMetricsCategory() {
     68         return MetricsEvent.CONFIGURE_NOTIFICATION;
     69     }
     70 
     71     @Override
     72     protected String getLogTag() {
     73         return TAG;
     74     }
     75 
     76     @Override
     77     protected int getPreferenceScreenResId() {
     78         return R.xml.configure_notification_settings;
     79     }
     80 
     81     @Override
     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 
     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
    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
    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
    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 
    162         public SummaryProvider(Context context, SummaryLoader summaryLoader) {
    163             mContext = context;
    164             mSummaryLoader = summaryLoader;
    165             mBackend = new NotificationBackend();
    166         }
    167 
    168         @VisibleForTesting
    169         protected void setBackend(NotificationBackend backend) {
    170             mBackend = backend;
    171         }
    172 
    173         @Override
    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