176 lines
5.9 KiB
Java
176 lines
5.9 KiB
Java
/*
|
|
* 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];
|
|
}
|
|
};
|
|
}
|
|
}
|