• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2014 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 static android.app.admin.DevicePolicyManager.KEYGUARD_DISABLE_SECURE_NOTIFICATIONS;
20 import static android.app.admin.DevicePolicyManager.KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS;
21 import static android.provider.Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS;
22 import static android.provider.Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS;
23 
24 import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
25 
26 import android.content.Context;
27 import android.content.Intent;
28 import android.content.res.Resources;
29 import android.os.Bundle;
30 import android.os.UserManager;
31 import android.provider.Settings;
32 import android.view.LayoutInflater;
33 import android.view.View;
34 import android.view.ViewGroup;
35 import android.widget.Button;
36 import android.widget.LinearLayout;
37 import android.widget.RadioButton;
38 import android.widget.RadioGroup;
39 import android.widget.TextView;
40 
41 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
42 import com.android.settings.R;
43 import com.android.settings.RestrictedRadioButton;
44 import com.android.settings.SettingsActivity;
45 import com.android.settings.SettingsPreferenceFragment;
46 import com.android.settings.SetupRedactionInterstitial;
47 import com.android.settings.SetupWizardUtils;
48 import com.android.settings.Utils;
49 import com.android.settingslib.RestrictedLockUtils;
50 
51 public class RedactionInterstitial extends SettingsActivity {
52 
53     @Override
getIntent()54     public Intent getIntent() {
55         Intent modIntent = new Intent(super.getIntent());
56         modIntent.putExtra(EXTRA_SHOW_FRAGMENT, RedactionInterstitialFragment.class.getName());
57         return modIntent;
58     }
59 
60     @Override
onApplyThemeResource(Resources.Theme theme, int resid, boolean first)61     protected void onApplyThemeResource(Resources.Theme theme, int resid, boolean first) {
62         resid = SetupWizardUtils.getTheme(getIntent());
63         super.onApplyThemeResource(theme, resid, first);
64     }
65 
66     @Override
isValidFragment(String fragmentName)67     protected boolean isValidFragment(String fragmentName) {
68         return RedactionInterstitialFragment.class.getName().equals(fragmentName);
69     }
70 
71     @Override
onCreate(Bundle savedInstance)72     protected void onCreate(Bundle savedInstance) {
73         super.onCreate(savedInstance);
74         LinearLayout layout = (LinearLayout) findViewById(R.id.content_parent);
75         layout.setFitsSystemWindows(false);
76     }
77 
78     /**
79      * Create an intent for launching RedactionInterstitial.
80      * @return An intent to launch the activity is if is available, @null if the activity is not
81      * available to be launched.
82      */
createStartIntent(Context ctx, int userId)83     public static Intent createStartIntent(Context ctx, int userId) {
84         return new Intent(ctx, RedactionInterstitial.class)
85                 .putExtra(EXTRA_SHOW_FRAGMENT_TITLE_RESID,
86                         UserManager.get(ctx).isManagedProfile(userId)
87                             ? R.string.lock_screen_notifications_interstitial_title_profile
88                             : R.string.lock_screen_notifications_interstitial_title)
89                 .putExtra(Intent.EXTRA_USER_ID, userId);
90     }
91 
92     public static class RedactionInterstitialFragment extends SettingsPreferenceFragment
93             implements RadioGroup.OnCheckedChangeListener, View.OnClickListener {
94 
95         private RadioGroup mRadioGroup;
96         private RestrictedRadioButton mShowAllButton;
97         private RestrictedRadioButton mRedactSensitiveButton;
98         private int mUserId;
99 
100         @Override
getMetricsCategory()101         public int getMetricsCategory() {
102             return MetricsEvent.NOTIFICATION_REDACTION;
103         }
104 
105         @Override
onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)106         public View onCreateView(LayoutInflater inflater, ViewGroup container,
107                 Bundle savedInstanceState) {
108             return inflater.inflate(R.layout.redaction_interstitial, container, false);
109         }
110 
111         @Override
onViewCreated(View view, Bundle savedInstanceState)112         public void onViewCreated(View view, Bundle savedInstanceState) {
113             super.onViewCreated(view, savedInstanceState);
114             mRadioGroup = (RadioGroup) view.findViewById(R.id.radio_group);
115             mShowAllButton = (RestrictedRadioButton) view.findViewById(R.id.show_all);
116             mRedactSensitiveButton =
117                     (RestrictedRadioButton) view.findViewById(R.id.redact_sensitive);
118 
119             mRadioGroup.setOnCheckedChangeListener(this);
120             mUserId = Utils.getUserIdFromBundle(
121                     getContext(), getActivity().getIntent().getExtras());
122             if (UserManager.get(getContext()).isManagedProfile(mUserId)) {
123                 ((TextView) view.findViewById(R.id.message))
124                         .setText(R.string.lock_screen_notifications_interstitial_message_profile);
125                 mShowAllButton.setText(R.string.lock_screen_notifications_summary_show_profile);
126                 mRedactSensitiveButton
127                         .setText(R.string.lock_screen_notifications_summary_hide_profile);
128 
129                 ((RadioButton) view.findViewById(R.id.hide_all)).setVisibility(View.GONE);
130             }
131 
132             final Button button = (Button) view.findViewById(R.id.redaction_done_button);
133             button.setOnClickListener(this);
134         }
135 
136         @Override
onClick(View v)137         public void onClick(View v) {
138             if (v.getId() == R.id.redaction_done_button) {
139                 SetupRedactionInterstitial.setEnabled(getContext(), false);
140                 final RedactionInterstitial activity = (RedactionInterstitial) getActivity();
141                 if (activity != null) {
142                     activity.setResult(RESULT_OK, null);
143                     finish();
144                 }
145             }
146         }
147 
148         @Override
onResume()149         public void onResume() {
150             super.onResume();
151             // Disable buttons according to policy.
152 
153             checkNotificationFeaturesAndSetDisabled(mShowAllButton,
154                     KEYGUARD_DISABLE_SECURE_NOTIFICATIONS |
155                     KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS);
156             checkNotificationFeaturesAndSetDisabled(mRedactSensitiveButton,
157                     KEYGUARD_DISABLE_SECURE_NOTIFICATIONS);
158             loadFromSettings();
159         }
160 
checkNotificationFeaturesAndSetDisabled(RestrictedRadioButton button, int keyguardNotifications)161         private void checkNotificationFeaturesAndSetDisabled(RestrictedRadioButton button,
162                 int keyguardNotifications) {
163             EnforcedAdmin admin = RestrictedLockUtils.checkIfKeyguardFeaturesDisabled(
164                     getActivity(), keyguardNotifications, mUserId);
165             button.setDisabledByAdmin(admin);
166         }
167 
loadFromSettings()168         private void loadFromSettings() {
169             final boolean managedProfile = UserManager.get(getContext()).isManagedProfile(mUserId);
170             // Hiding all notifications is device-wide setting, managed profiles can only set
171             // whether their notifications are show in full or redacted.
172             final boolean showNotifications = managedProfile || Settings.Secure.getIntForUser(
173                     getContentResolver(), LOCK_SCREEN_SHOW_NOTIFICATIONS, 0, mUserId) != 0;
174             final boolean showUnredacted = Settings.Secure.getIntForUser(
175                     getContentResolver(), LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS, 1, mUserId) != 0;
176 
177             int checkedButtonId = R.id.hide_all;
178             if (showNotifications) {
179                 if (showUnredacted && !mShowAllButton.isDisabledByAdmin()) {
180                     checkedButtonId = R.id.show_all;
181                 } else if (!mRedactSensitiveButton.isDisabledByAdmin()) {
182                     checkedButtonId = R.id.redact_sensitive;
183                 }
184             }
185 
186             mRadioGroup.check(checkedButtonId);
187         }
188 
189         @Override
onCheckedChanged(RadioGroup group, int checkedId)190         public void onCheckedChanged(RadioGroup group, int checkedId) {
191             final boolean show = (checkedId == R.id.show_all);
192             final boolean enabled = (checkedId != R.id.hide_all);
193 
194             Settings.Secure.putIntForUser(getContentResolver(),
195                     LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS, show ? 1 : 0, mUserId);
196             Settings.Secure.putIntForUser(getContentResolver(),
197                     LOCK_SCREEN_SHOW_NOTIFICATIONS, enabled ? 1 : 0, mUserId);
198 
199         }
200     }
201 }
202