diff --git a/res/layout/lockscreen_remote_input.xml b/res/layout/lockscreen_remote_input.xml new file mode 100644 index 00000000000..af4bee07782 --- /dev/null +++ b/res/layout/lockscreen_remote_input.xml @@ -0,0 +1,35 @@ + + + + + + + \ No newline at end of file diff --git a/res/layout/restricted_dialog_singlechoice.xml b/res/layout/restricted_dialog_singlechoice.xml index e5e449b1067..0e0fe4c475b 100644 --- a/res/layout/restricted_dialog_singlechoice.xml +++ b/res/layout/restricted_dialog_singlechoice.xml @@ -15,7 +15,8 @@ limitations under the License. --> - - \ No newline at end of file + \ No newline at end of file diff --git a/res/values/strings.xml b/res/values/strings.xml index 5f6327aefec..f1f43c066ac 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -5912,7 +5912,7 @@ Pulse notification light - When device is locked + On the lock screen Not using battery optimization + + If device is locked, prevent typing replies or other text in notifications + @*android:string/megabyteShort @*android:string/gigabyteShort diff --git a/res/xml/configure_notification_settings.xml b/res/xml/configure_notification_settings.xml index 88d42df2f5f..cb93792b51f 100644 --- a/res/xml/configure_notification_settings.xml +++ b/res/xml/configure_notification_settings.xml @@ -25,7 +25,7 @@ android:title="@string/notification_pulse_title" /> - diff --git a/src/com/android/settings/CustomListPreference.java b/src/com/android/settings/CustomListPreference.java index 1603d2d39f2..143c9093671 100644 --- a/src/com/android/settings/CustomListPreference.java +++ b/src/com/android/settings/CustomListPreference.java @@ -17,12 +17,14 @@ package com.android.settings; import android.app.AlertDialog; +import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; import android.os.Bundle; import android.support.v14.preference.ListPreferenceDialogFragment; import android.support.v7.preference.ListPreference; import android.util.AttributeSet; +import android.view.View; public class CustomListPreference extends ListPreference { @@ -42,6 +44,13 @@ public class CustomListPreference extends ListPreference { protected void onDialogClosed(boolean positiveResult) { } + protected void onDialogCreated(Dialog dialog) { + } + + protected boolean isAutoClosePreference() { + return true; + } + public static class CustomListPreferenceDialogFragment extends ListPreferenceDialogFragment { private int mClickedDialogEntryIndex; @@ -64,6 +73,23 @@ public class CustomListPreference extends ListPreference { mClickedDialogEntryIndex = getCustomizablePreference() .findIndexOfValue(getCustomizablePreference().getValue()); getCustomizablePreference().onPrepareDialogBuilder(builder, getOnItemClickListener()); + if (!getCustomizablePreference().isAutoClosePreference()) { + builder.setPositiveButton(R.string.okay, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + CustomListPreferenceDialogFragment.this.onClick(dialog, + DialogInterface.BUTTON_POSITIVE); + dialog.dismiss(); + } + }); + } + } + + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + Dialog dialog = super.onCreateDialog(savedInstanceState); + getCustomizablePreference().onDialogCreated(dialog); + return dialog; } protected DialogInterface.OnClickListener getOnItemClickListener() { @@ -71,13 +97,16 @@ public class CustomListPreference extends ListPreference { public void onClick(DialogInterface dialog, int which) { setClickedDialogEntryIndex(which); - /* - * Clicking on an item simulates the positive button - * click, and dismisses the dialog. - */ - CustomListPreferenceDialogFragment.this.onClick(dialog, - DialogInterface.BUTTON_POSITIVE); - dialog.dismiss(); + + if (getCustomizablePreference().isAutoClosePreference()) { + /* + * Clicking on an item simulates the positive button + * click, and dismisses the dialog. + */ + CustomListPreferenceDialogFragment.this.onClick(dialog, + DialogInterface.BUTTON_POSITIVE); + dialog.dismiss(); + } } }; } diff --git a/src/com/android/settings/RestrictedListPreference.java b/src/com/android/settings/RestrictedListPreference.java index 77af19ef035..fca0071c494 100644 --- a/src/com/android/settings/RestrictedListPreference.java +++ b/src/com/android/settings/RestrictedListPreference.java @@ -149,8 +149,12 @@ public class RestrictedListPreference extends CustomListPreference { text.setChecked(false); padlock.setVisibility(View.VISIBLE); } else { - text.setChecked(position == mSelectedIndex); - text.setEnabled(true); + if (mSelectedIndex != -1) { + text.setChecked(position == mSelectedIndex); + } + if (!text.isEnabled()) { + text.setEnabled(true); + } padlock.setVisibility(View.GONE); } return root; @@ -199,13 +203,15 @@ public class RestrictedListPreference extends CustomListPreference { setClickedDialogEntryIndex(which); } - /* - * Clicking on an item simulates the positive button - * click, and dismisses the dialog. - */ - RestrictedListPreferenceDialogFragment.this.onClick(dialog, - DialogInterface.BUTTON_POSITIVE); - dialog.dismiss(); + if (getCustomizablePreference().isAutoClosePreference()) { + /* + * Clicking on an item simulates the positive button + * click, and dismisses the dialog. + */ + RestrictedListPreferenceDialogFragment.this.onClick(dialog, + DialogInterface.BUTTON_POSITIVE); + dialog.dismiss(); + } } }; } diff --git a/src/com/android/settings/notification/ConfigureNotificationSettings.java b/src/com/android/settings/notification/ConfigureNotificationSettings.java index 17571c9e475..842b06f526f 100644 --- a/src/com/android/settings/notification/ConfigureNotificationSettings.java +++ b/src/com/android/settings/notification/ConfigureNotificationSettings.java @@ -32,13 +32,11 @@ import android.util.Log; import com.android.internal.widget.LockPatternUtils; import com.android.settings.InstrumentedFragment; import com.android.settings.R; +import com.android.settings.RestrictedListPreference.RestrictedItem; import com.android.settings.SettingsPreferenceFragment; -import com.android.settingslib.RestrictedDropDownPreference; -import com.android.settingslib.RestrictedDropDownPreference.RestrictedItem; import com.android.settingslib.RestrictedLockUtils; import java.util.ArrayList; -import java.util.List; import static android.app.admin.DevicePolicyManager.KEYGUARD_DISABLE_SECURE_NOTIFICATIONS; import static android.app.admin.DevicePolicyManager.KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS; @@ -56,7 +54,7 @@ public class ConfigureNotificationSettings extends SettingsPreferenceFragment { private Context mContext; private TwoStatePreference mNotificationPulse; - private RestrictedDropDownPreference mLockscreen; + private NotificationLockscreenPreference mLockscreen; private boolean mSecure; private int mLockscreenSelectedValue; @@ -131,7 +129,7 @@ public class ConfigureNotificationSettings extends SettingsPreferenceFragment { // === Lockscreen (public / private) notifications === private void initLockscreenNotifications() { - mLockscreen = (RestrictedDropDownPreference) getPreferenceScreen().findPreference( + mLockscreen = (NotificationLockscreenPreference) getPreferenceScreen().findPreference( KEY_LOCK_SCREEN_NOTIFICATIONS); if (mLockscreen == null) { Log.i(TAG, "Preference not found: " + KEY_LOCK_SCREEN_NOTIFICATIONS); diff --git a/src/com/android/settings/notification/NotificationLockscreenPreference.java b/src/com/android/settings/notification/NotificationLockscreenPreference.java new file mode 100644 index 00000000000..60f451f3767 --- /dev/null +++ b/src/com/android/settings/notification/NotificationLockscreenPreference.java @@ -0,0 +1,118 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.settings.notification; + +import com.android.settings.R; +import com.android.settings.RestrictedListPreference; + +import android.app.AlertDialog; +import android.app.Dialog; +import android.content.Context; +import android.content.DialogInterface; +import android.provider.Settings; +import android.util.AttributeSet; +import android.view.View; +import android.widget.CheckBox; +import android.widget.CompoundButton; +import android.widget.ListAdapter; + +public class NotificationLockscreenPreference extends RestrictedListPreference { + + private boolean mAllowRemoteInput; + private int mInitialIndex; + private Listener mListener; + private boolean mShowRemoteInput; + + public NotificationLockscreenPreference(Context context, AttributeSet attrs) { + super(context, attrs); + } + + @Override + protected void onPrepareDialogBuilder(AlertDialog.Builder builder, + DialogInterface.OnClickListener innerListener) { + + final String selectedValue = getValue(); + mInitialIndex = (selectedValue == null) ? -1 : findIndexOfValue(selectedValue); + mListener = new Listener(innerListener); + builder.setSingleChoiceItems(createListAdapter(), mInitialIndex, mListener); + mShowRemoteInput = getEntryValues().length == 3; + mAllowRemoteInput = Settings.Secure.getInt(getContext().getContentResolver(), + Settings.Secure.LOCK_SCREEN_ALLOW_REMOTE_INPUT, 0) != 0; + builder.setView(R.layout.lockscreen_remote_input); + } + + @Override + protected void onDialogCreated(Dialog dialog) { + super.onDialogCreated(dialog); + dialog.create(); + CheckBox view = (CheckBox) dialog.findViewById(R.id.lockscreen_remote_input); + view.setChecked(mAllowRemoteInput); + view.setOnCheckedChangeListener(mListener); + View panel = dialog.findViewById(com.android.internal.R.id.customPanel); + panel.setVisibility(checkboxVisibilityForSelectedIndex(mInitialIndex, mShowRemoteInput)); + mListener.setView(panel); + } + + @Override + protected ListAdapter createListAdapter() { + return new RestrictedArrayAdapter(getContext(), getEntries(), -1); + } + + @Override + protected void onDialogClosed(boolean positiveResult) { + super.onDialogClosed(positiveResult); + Settings.Secure.putInt(getContext().getContentResolver(), + Settings.Secure.LOCK_SCREEN_ALLOW_REMOTE_INPUT, mAllowRemoteInput ? 1 : 0); + } + + @Override + protected boolean isAutoClosePreference() { + return false; + } + + private static int checkboxVisibilityForSelectedIndex(int selected, boolean showRemoteAtAll) { + return selected == 0 && showRemoteAtAll ? View.VISIBLE : View.GONE; + } + + private class Listener implements DialogInterface.OnClickListener, + CompoundButton.OnCheckedChangeListener { + + private final DialogInterface.OnClickListener mInner; + private View mView; + + public Listener(DialogInterface.OnClickListener inner) { + mInner = inner; + } + + @Override + public void onClick(DialogInterface dialog, int which) { + mInner.onClick(dialog, which); + if (mView != null) { + mView.setVisibility(checkboxVisibilityForSelectedIndex(which, mShowRemoteInput)); + } + } + + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + mAllowRemoteInput = isChecked; + } + + public void setView(View view) { + mView = view; + } + } +}