Polish of the accessibility settings.
Change-Id: Ifb32ec6745e566cf7ffafe20019b68d95661b45d
This commit is contained in:
@@ -0,0 +1,175 @@
|
||||
/*
|
||||
* Copyright (C) 2011 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;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.res.TypedArray;
|
||||
import android.os.Parcel;
|
||||
import android.os.Parcelable;
|
||||
import android.preference.DialogPreference;
|
||||
import android.provider.Settings;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.View;
|
||||
import android.view.accessibility.AccessibilityEvent;
|
||||
import android.view.accessibility.AccessibilityManager;
|
||||
|
||||
/**
|
||||
* Preference for enabling accessibility script injection. It displays a warning
|
||||
* dialog before enabling the preference.
|
||||
*/
|
||||
public class AccessibilityEnableScriptInjectionPreference extends DialogPreference {
|
||||
|
||||
private boolean mInjectionAllowed;
|
||||
private boolean mSendClickAccessibilityEvent;
|
||||
|
||||
public AccessibilityEnableScriptInjectionPreference(Context context, AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
updateSummary();
|
||||
}
|
||||
|
||||
public void setInjectionAllowed(boolean injectionAllowed) {
|
||||
if (mInjectionAllowed != injectionAllowed) {
|
||||
mInjectionAllowed = injectionAllowed;
|
||||
persistBoolean(injectionAllowed);
|
||||
updateSummary();
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isInjectionAllowed() {
|
||||
return mInjectionAllowed;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onBindView(View view) {
|
||||
super.onBindView(view);
|
||||
View summaryView = view.findViewById(com.android.internal.R.id.summary);
|
||||
sendAccessibilityEvent(summaryView);
|
||||
}
|
||||
|
||||
private void sendAccessibilityEvent(View view) {
|
||||
// Since the view is still not attached we create, populate,
|
||||
// and send the event directly since we do not know when it
|
||||
// will be attached and posting commands is not as clean.
|
||||
AccessibilityManager accessibilityManager = AccessibilityManager.getInstance(getContext());
|
||||
if (mSendClickAccessibilityEvent && accessibilityManager.isEnabled()) {
|
||||
AccessibilityEvent event = AccessibilityEvent.obtain();
|
||||
event.setEventType(AccessibilityEvent.TYPE_VIEW_CLICKED);
|
||||
view.onInitializeAccessibilityEvent(event);
|
||||
view.dispatchPopulateAccessibilityEvent(event);
|
||||
accessibilityManager.sendAccessibilityEvent(event);
|
||||
}
|
||||
mSendClickAccessibilityEvent = false;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onClick() {
|
||||
if (isInjectionAllowed()) {
|
||||
setInjectionAllowed(false);
|
||||
// Update the system setting only upon user action.
|
||||
setSystemSetting(false);
|
||||
mSendClickAccessibilityEvent = true;
|
||||
} else {
|
||||
super.onClick();
|
||||
mSendClickAccessibilityEvent = false;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Object onGetDefaultValue(TypedArray a, int index) {
|
||||
return a.getBoolean(index, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
|
||||
setInjectionAllowed(restoreValue
|
||||
? getPersistedBoolean(mInjectionAllowed)
|
||||
: (Boolean) defaultValue);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDialogClosed(boolean result) {
|
||||
setInjectionAllowed(result);
|
||||
if (result) {
|
||||
// Update the system setting only upon user action.
|
||||
setSystemSetting(true);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Parcelable onSaveInstanceState() {
|
||||
Parcelable superState = super.onSaveInstanceState();
|
||||
if (isPersistent()) {
|
||||
return superState;
|
||||
}
|
||||
SavedState myState = new SavedState(superState);
|
||||
myState.mInjectionAllowed = mInjectionAllowed;
|
||||
return myState;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onRestoreInstanceState(Parcelable state) {
|
||||
if (state == null || !state.getClass().equals(SavedState.class)) {
|
||||
super.onRestoreInstanceState(state);
|
||||
return;
|
||||
}
|
||||
SavedState myState = (SavedState) state;
|
||||
super.onRestoreInstanceState(myState.getSuperState());
|
||||
setInjectionAllowed(myState.mInjectionAllowed);
|
||||
}
|
||||
|
||||
private void updateSummary() {
|
||||
setSummary(mInjectionAllowed
|
||||
? getContext().getString(R.string.accessibility_script_injection_allowed)
|
||||
: getContext().getString(R.string.accessibility_script_injection_disallowed));
|
||||
}
|
||||
|
||||
private void setSystemSetting(boolean enabled) {
|
||||
Settings.Secure.putInt(getContext().getContentResolver(),
|
||||
Settings.Secure.ACCESSIBILITY_SCRIPT_INJECTION, enabled ? 1 : 0);
|
||||
}
|
||||
|
||||
private static class SavedState extends BaseSavedState {
|
||||
private boolean mInjectionAllowed;
|
||||
|
||||
public SavedState(Parcel source) {
|
||||
super(source);
|
||||
mInjectionAllowed = (source.readInt() == 1);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeToParcel(Parcel parcel, int flags) {
|
||||
super.writeToParcel(parcel, flags);
|
||||
parcel.writeInt(mInjectionAllowed ? 1 : 0);
|
||||
}
|
||||
|
||||
public SavedState(Parcelable superState) {
|
||||
super(superState);
|
||||
}
|
||||
|
||||
@SuppressWarnings("all")
|
||||
public static final Parcelable.Creator<SavedState> CREATOR =
|
||||
new Parcelable.Creator<SavedState>() {
|
||||
public SavedState createFromParcel(Parcel in) {
|
||||
return new SavedState(in);
|
||||
}
|
||||
|
||||
public SavedState[] newArray(int size) {
|
||||
return new SavedState[size];
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user