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 com.android.internal.logging.MetricsLogger; 20 import com.android.settings.R; 21 import com.android.settings.SettingsActivity; 22 import com.android.settings.SettingsPreferenceFragment; 23 24 import android.app.admin.DevicePolicyManager; 25 import android.content.Context; 26 import android.content.Intent; 27 import android.os.Bundle; 28 import android.provider.Settings; 29 import android.view.LayoutInflater; 30 import android.view.View; 31 import android.view.ViewGroup; 32 import android.widget.RadioButton; 33 import android.widget.RadioGroup; 34 35 public class RedactionInterstitial extends SettingsActivity { 36 37 @Override getIntent()38 public Intent getIntent() { 39 Intent modIntent = new Intent(super.getIntent()); 40 modIntent.putExtra(EXTRA_SHOW_FRAGMENT, RedactionInterstitialFragment.class.getName()); 41 return modIntent; 42 } 43 44 @Override isValidFragment(String fragmentName)45 protected boolean isValidFragment(String fragmentName) { 46 return RedactionInterstitialFragment.class.getName().equals(fragmentName); 47 } 48 49 /** 50 * Create an intent for launching RedactionInterstitial. 51 * @return An intent to launch the activity is if is available, @null if the activity is not 52 * available to be launched. 53 */ createStartIntent(Context ctx)54 public static Intent createStartIntent(Context ctx) { 55 if (isSecureNotificationsDisabled(ctx)) { 56 // If there is no choices for the user, we should not start the activity. 57 return null; 58 } else { 59 return new Intent(ctx, RedactionInterstitial.class) 60 .putExtra(EXTRA_PREFS_SHOW_BUTTON_BAR, true) 61 .putExtra(EXTRA_PREFS_SET_BACK_TEXT, (String) null) 62 .putExtra(EXTRA_PREFS_SET_NEXT_TEXT, ctx.getString( 63 R.string.app_notifications_dialog_done)) 64 .putExtra(EXTRA_SHOW_FRAGMENT_TITLE_RESID, 65 R.string.lock_screen_notifications_interstitial_title); 66 } 67 } 68 isSecureNotificationsDisabled(Context context)69 private static boolean isSecureNotificationsDisabled(Context context) { 70 final DevicePolicyManager dpm = 71 (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE); 72 return dpm != null && (dpm.getKeyguardDisabledFeatures(null) 73 & DevicePolicyManager.KEYGUARD_DISABLE_SECURE_NOTIFICATIONS) != 0; 74 } 75 isUnredactedNotificationsDisabled(Context context)76 private static boolean isUnredactedNotificationsDisabled(Context context) { 77 final DevicePolicyManager dpm = 78 (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE); 79 return dpm != null && (dpm.getKeyguardDisabledFeatures(null) 80 & DevicePolicyManager.KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS) != 0; 81 } 82 83 public static class RedactionInterstitialFragment extends SettingsPreferenceFragment 84 implements RadioGroup.OnCheckedChangeListener { 85 86 private RadioGroup mRadioGroup; 87 private RadioButton mShowAllButton; 88 private RadioButton mRedactSensitiveButton; 89 90 @Override getMetricsCategory()91 protected int getMetricsCategory() { 92 return MetricsLogger.NOTIFICATION_REDACTION; 93 } 94 95 @Override onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)96 public View onCreateView(LayoutInflater inflater, ViewGroup container, 97 Bundle savedInstanceState) { 98 return inflater.inflate(R.layout.redaction_interstitial, container, false); 99 } 100 101 @Override onViewCreated(View view, Bundle savedInstanceState)102 public void onViewCreated(View view, Bundle savedInstanceState) { 103 super.onViewCreated(view, savedInstanceState); 104 mRadioGroup = (RadioGroup) view.findViewById(R.id.radio_group); 105 mShowAllButton = (RadioButton) view.findViewById(R.id.show_all); 106 mRedactSensitiveButton = (RadioButton) view.findViewById(R.id.redact_sensitive); 107 108 mRadioGroup.setOnCheckedChangeListener(this); 109 110 // Disable buttons according to policy. 111 if (isSecureNotificationsDisabled(getActivity())) { 112 mShowAllButton.setEnabled(false); 113 mRedactSensitiveButton.setEnabled(false); 114 } else if (isUnredactedNotificationsDisabled(getActivity())) { 115 mShowAllButton.setEnabled(false); 116 } 117 } 118 119 @Override onResume()120 public void onResume() { 121 super.onResume(); 122 loadFromSettings(); 123 } 124 loadFromSettings()125 private void loadFromSettings() { 126 final boolean enabled = Settings.Secure.getInt(getContentResolver(), 127 Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS, 0) != 0; 128 final boolean show = Settings.Secure.getInt(getContentResolver(), 129 Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS, 1) != 0; 130 131 int checkedButtonId = R.id.hide_all; 132 if (enabled) { 133 if (show && mShowAllButton.isEnabled()) { 134 checkedButtonId = R.id.show_all; 135 } else if (mRedactSensitiveButton.isEnabled()) { 136 checkedButtonId = R.id.redact_sensitive; 137 } 138 } 139 140 mRadioGroup.check(checkedButtonId); 141 } 142 143 @Override onCheckedChanged(RadioGroup group, int checkedId)144 public void onCheckedChanged(RadioGroup group, int checkedId) { 145 final boolean show = (checkedId == R.id.show_all); 146 final boolean enabled = (checkedId != R.id.hide_all); 147 148 Settings.Secure.putInt(getContentResolver(), 149 Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS, show ? 1 : 0); 150 Settings.Secure.putInt(getContentResolver(), 151 Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS, enabled ? 1 : 0); 152 } 153 } 154 } 155