Files
app_Settings/src/com/android/settings/notification/NotificationLockscreenPreference.java
Adrian Roos 4bd42073d4 Properly handle rotation in NotificationLockscreenPreference
There were some issues because we didn't explicitly
track and restore the selected position upon rotating,
so the fragment's oppinion of which item was selected
didn't match the ListView's.

Change-Id: Ia86e25dab36b44931297f8bcc7bcb7d6974f4b76
Fixes: 27921546
2016-04-29 14:37:16 -07:00

155 lines
5.3 KiB
Java

/*
* 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 com.android.settings.Utils;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.os.UserHandle;
import android.os.UserManager;
import android.provider.Settings;
import android.util.AttributeSet;
import android.view.View;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.ListAdapter;
import android.widget.ListView;
public class NotificationLockscreenPreference extends RestrictedListPreference {
private boolean mAllowRemoteInput;
private Listener mListener;
private boolean mShowRemoteInput;
private boolean mRemoteInputCheckBoxEnabled = true;
private int mUserId = UserHandle.myUserId();
public NotificationLockscreenPreference(Context context, AttributeSet attrs) {
super(context, attrs);
}
public void setRemoteInputCheckBoxEnabled(boolean enabled) {
mRemoteInputCheckBoxEnabled = enabled;
}
@Override
protected void onClick() {
final Context context = getContext();
if (!Utils.startQuietModeDialogIfNecessary(context, UserManager.get(context), mUserId)) {
// Call super to create preference dialog only when work mode is on
// startQuietModeDialogIfNecessary will return false if mUserId is not a managed user
super.onClick();
}
}
public void setUserId(int userId) {
mUserId = userId;
}
@Override
protected void onPrepareDialogBuilder(AlertDialog.Builder builder,
DialogInterface.OnClickListener innerListener) {
mListener = new Listener(innerListener);
builder.setSingleChoiceItems(createListAdapter(), getSelectedValuePos(), 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);
}
@Override
protected void onDialogStateRestored(Dialog dialog, Bundle savedInstanceState) {
super.onDialogStateRestored(dialog, savedInstanceState);
ListView listView = ((AlertDialog) dialog).getListView();
int selectedPosition = listView.getCheckedItemPosition();
View panel = dialog.findViewById(com.android.internal.R.id.customPanel);
panel.setVisibility(checkboxVisibilityForSelectedIndex(selectedPosition,
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 int checkboxVisibilityForSelectedIndex(int selected,
boolean showRemoteAtAll) {
return selected == 1 && showRemoteAtAll && mRemoteInputCheckBoxEnabled ? 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);
ListView listView = ((AlertDialog) dialog).getListView();
int selectedPosition = listView.getCheckedItemPosition();
if (mView != null) {
mView.setVisibility(
checkboxVisibilityForSelectedIndex(selectedPosition, mShowRemoteInput));
}
}
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
mAllowRemoteInput = !isChecked;
}
public void setView(View view) {
mView = view;
}
}
}