Manual merge of ag/2319717

Bug: 62104030
Test: Manually tested as described in original commit msg.
Change-Id: Ie00bafa736c837881a258c9de10891b27c5baefd
This commit is contained in:
Phil Weaver
2017-05-30 10:41:52 -07:00
parent 8e0754e84c
commit 2e2dbfe549
5 changed files with 53 additions and 7 deletions

View File

@@ -82,6 +82,7 @@
<uses-permission android:name="android.permission.PEERS_MAC_ADDRESS"/>
<uses-permission android:name="android.permission.MANAGE_NOTIFICATIONS"/>
<uses-permission android:name="android.permission.DELETE_PACKAGES"/>
<uses-permission android:name="android.permission.MANAGE_APP_OPS_RESTRICTIONS"/>
<application android:label="@string/settings_label"
android:icon="@drawable/ic_launcher_settings"

View File

@@ -25,6 +25,7 @@ import android.annotation.Nullable;
import android.app.ActivityManager;
import android.app.AlertDialog;
import android.app.AppGlobals;
import android.app.AppOpsManager;
import android.app.Dialog;
import android.app.Fragment;
import android.app.IActivityManager;
@@ -1272,6 +1273,20 @@ public final class Utils extends com.android.settingslib.Utils {
return info.enabled ? R.string.installed : R.string.disabled;
}
/**
* Control if other apps can display overlays. By default this is allowed. Be sure to
* re-enable overlays, as the effect is system-wide.
*/
public static void setOverlayAllowed(Context context, IBinder token, boolean allowed) {
AppOpsManager appOpsManager = context.getSystemService(AppOpsManager.class);
if (appOpsManager != null) {
appOpsManager.setUserRestriction(AppOpsManager.OP_SYSTEM_ALERT_WINDOW,
!allowed, token);
appOpsManager.setUserRestriction(AppOpsManager.OP_TOAST_WINDOW,
!allowed, token);
}
}
private static boolean isVolumeValid(VolumeInfo volume) {
return (volume != null) && (volume.getType() == VolumeInfo.TYPE_PRIVATE)
&& volume.isMountedReadable();

View File

@@ -48,14 +48,14 @@ public class AccessibilityServiceWarning {
.setTitle(parentActivity.getString(R.string.enable_service_title,
getServiceName(parentActivity, info)))
.setView(createEnableDialogContentView(parentActivity, info))
.setCancelable(true)
.setPositiveButton(android.R.string.ok, listener)
.setNegativeButton(android.R.string.cancel, listener)
.create();
final View.OnTouchListener filterTouchListener = (View v, MotionEvent event) -> {
// Filter obscured touches by consuming them.
if ((event.getFlags() & MotionEvent.FLAG_WINDOW_IS_PARTIALLY_OBSCURED) != 0) {
if (((event.getFlags() & MotionEvent.FLAG_WINDOW_IS_OBSCURED) != 0)
|| ((event.getFlags() & MotionEvent.FLAG_WINDOW_IS_PARTIALLY_OBSCURED) != 0)) {
if (event.getAction() == MotionEvent.ACTION_UP) {
Toast.makeText(v.getContext(), R.string.touch_filtered_warning,
Toast.LENGTH_SHORT).show();
@@ -67,6 +67,8 @@ public class AccessibilityServiceWarning {
ad.create();
ad.getButton(AlertDialog.BUTTON_POSITIVE).setOnTouchListener(filterTouchListener);
ad.setCanceledOnTouchOutside(true);
return ad;
}

View File

@@ -16,26 +16,24 @@
package com.android.settings.accessibility;
import static android.content.DialogInterface.BUTTON_POSITIVE;
import static com.android.settings.Utils.setOverlayAllowed;
import android.accessibilityservice.AccessibilityServiceInfo;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.app.Fragment;
import android.content.ComponentName;
import android.content.DialogInterface;
import android.content.pm.PackageManager;
import android.content.pm.PackageParser;
import android.os.Binder;
import android.os.Bundle;
import android.os.IBinder;
import android.os.UserHandle;
import android.provider.Settings;
import android.support.v7.preference.Preference;
import android.text.TextUtils;
import android.view.accessibility.AccessibilityManager;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.DialogCreatable;
import com.android.settings.applications.defaultapps.DefaultAppInfo;
import com.android.settings.applications.defaultapps.DefaultAppPickerFragment;
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
@@ -118,6 +116,7 @@ public class ShortcutServicePickerFragment extends DefaultAppPickerFragment {
implements DialogInterface.OnClickListener {
private static final String EXTRA_KEY = "extra_key";
private static final String TAG = "ConfirmationDialogFragment";
private IBinder mToken;
public static ConfirmationDialogFragment newInstance(ShortcutServicePickerFragment parent,
String key) {
@@ -126,6 +125,7 @@ public class ShortcutServicePickerFragment extends DefaultAppPickerFragment {
argument.putString(EXTRA_KEY, key);
fragment.setArguments(argument);
fragment.setTargetFragment(parent, 0);
fragment.mToken = new Binder();
return fragment;
}
@@ -146,6 +146,22 @@ public class ShortcutServicePickerFragment extends DefaultAppPickerFragment {
return AccessibilityServiceWarning.createCapabilitiesDialog(getActivity(), info, this);
}
@Override
public void onResume() {
super.onResume();
if (mToken != null) {
setOverlayAllowed(getActivity(), mToken, false);
}
}
@Override
public void onPause() {
super.onPause();
if (mToken != null) {
setOverlayAllowed(getActivity(), mToken, true);
}
}
@Override
public void onClick(DialogInterface dialog, int which) {
final Fragment fragment = getTargetFragment();

View File

@@ -26,8 +26,10 @@ import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ResolveInfo;
import android.net.Uri;
import android.os.Binder;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.UserHandle;
import android.os.storage.StorageManager;
import android.provider.Settings;
@@ -47,6 +49,8 @@ import com.android.settingslib.accessibility.AccessibilityUtils;
import java.util.List;
import static com.android.settings.Utils.setOverlayAllowed;
public class ToggleAccessibilityServicePreferenceFragment
extends ToggleFeaturePreferenceFragment implements DialogInterface.OnClickListener {
@@ -69,6 +73,8 @@ public class ToggleAccessibilityServicePreferenceFragment
private int mShownDialogId;
private final IBinder mToken = new Binder();
@Override
public int getMetricsCategory() {
return MetricsEvent.ACCESSIBILITY_SERVICE;
@@ -99,12 +105,18 @@ public class ToggleAccessibilityServicePreferenceFragment
public void onResume() {
mSettingsContentObserver.register(getContentResolver());
updateSwitchBarToggleSwitch();
if (mToken != null) {
setOverlayAllowed(getActivity(), mToken, false);
}
super.onResume();
}
@Override
public void onPause() {
mSettingsContentObserver.unregister(getContentResolver());
if (mToken != null) {
setOverlayAllowed(getActivity(), mToken, true);
}
super.onPause();
}