Improve the Accessibility warning dialog with new design
Create new Accessibility warning dialog based on the style of permission dialog Bug: 129788631 Test: Visual Change-Id: I0ec693f9c29e6e85e17d5bd1a64a4c0fe9499f95
This commit is contained in:
12
res/drawable/ic_pan_tool_18dp.xml
Normal file
12
res/drawable/ic_pan_tool_18dp.xml
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="18dp"
|
||||||
|
android:height="18dp"
|
||||||
|
android:viewportWidth="48"
|
||||||
|
android:viewportHeight="48">
|
||||||
|
<group>
|
||||||
|
<clip-path android:pathData="M0,0h48v48H0z M 0,0"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M46,11v29c0,4.4 -3.6,8 -8,8H23.4c-2.16,0 -4.2,-0.86 -5.7,-2.38L2,29.66s2.52,-2.46 2.6,-2.5c0.44,-0.38 0.98,-0.58 1.58,-0.58 0.44,0 0.84,0.12 1.2,0.32 0.08,0.02 8.62,4.92 8.62,4.92V8c0,-1.66 1.34,-3 3,-3s3,1.34 3,3v14h2V3c0,-1.66 1.34,-3 3,-3s3,1.34 3,3v19h2V5c0,-1.66 1.34,-3 3,-3s3,1.34 3,3v17h2V11c0,-1.66 1.34,-3 3,-3s3,1.34 3,3z"
|
||||||
|
android:fillColor="#757575"/>
|
||||||
|
</group>
|
||||||
|
</vector>
|
9
res/drawable/ic_visibility_18dp.xml
Normal file
9
res/drawable/ic_visibility_18dp.xml
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="18dp"
|
||||||
|
android:height="18dp"
|
||||||
|
android:viewportWidth="48"
|
||||||
|
android:viewportHeight="48">
|
||||||
|
<path
|
||||||
|
android:pathData="M24,9C14,9 5.46,15.22 2,24c3.46,8.78 12,15 22,15 10.01,0 18.54,-6.22 22,-15 -3.46,-8.78 -11.99,-15 -22,-15zM24,34c-5.52,0 -10,-4.48 -10,-10s4.48,-10 10,-10 10,4.48 10,10 -4.48,10 -10,10zM24,18c-3.31,0 -6,2.69 -6,6s2.69,6 6,6 6,-2.69 6,-6 -2.69,-6 -6,-6z"
|
||||||
|
android:fillColor="#757575"/>
|
||||||
|
</vector>
|
71
res/layout/disable_accessibility_service_dialog_content.xml
Normal file
71
res/layout/disable_accessibility_service_dialog_content.xml
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
~ Copyright (C) 2019 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
|
||||||
|
-->
|
||||||
|
|
||||||
|
<ScrollView
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="fill_parent"
|
||||||
|
android:layout_height="fill_parent"
|
||||||
|
android:textDirection="locale"
|
||||||
|
android:scrollbarStyle="outsideOverlay"
|
||||||
|
android:gravity="top">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:theme="@style/Theme.AlertDialog"
|
||||||
|
style="@style/AccessibilityDialog">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:gravity="center_horizontal"
|
||||||
|
android:paddingTop="32dp"
|
||||||
|
android:paddingLeft="24dp"
|
||||||
|
android:paddingRight="24dp">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/permissionDialog_disable_title"
|
||||||
|
style="@style/AccessibilityDialogTitle" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/permissionDialog_disable_message"
|
||||||
|
android:gravity="center"
|
||||||
|
android:text="@string/accessibility_service_warning_description"
|
||||||
|
style="@style/AccessibilityDialogDescription" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
<!-- Buttons on bottom of dialog -->
|
||||||
|
<LinearLayout
|
||||||
|
style="@style/AccessibilityDialogButtonList">
|
||||||
|
|
||||||
|
<Space
|
||||||
|
style="@style/AccessibilityDialogButtonBarSpace"/>
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/permission_disable_stop_button"
|
||||||
|
android:text="@string/accessibility_dialog_button_stop"
|
||||||
|
style="@style/AccessibilityDialogButtonAllow" />
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/permission_disable_cancel_button"
|
||||||
|
android:text="@string/accessibility_dialog_button_cancel"
|
||||||
|
style="@style/AccessibilityDialogButtonDeny" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</ScrollView>
|
@@ -23,28 +23,118 @@
|
|||||||
android:gravity="top">
|
android:gravity="top">
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_width="match_parent"
|
android:theme="@style/Theme.AlertDialog"
|
||||||
android:layout_height="wrap_content"
|
style="@style/AccessibilityDialog">
|
||||||
android:orientation="vertical"
|
|
||||||
android:paddingStart="16dip"
|
|
||||||
android:paddingEnd="16dip">
|
|
||||||
|
|
||||||
<TextView
|
<LinearLayout
|
||||||
android:id="@+id/encryption_warning"
|
android:layout_width="match_parent"
|
||||||
android:layout_width="fill_parent"
|
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:padding="10dip"
|
android:orientation="vertical"
|
||||||
android:textAlignment="viewStart"
|
android:gravity="center_horizontal"
|
||||||
android:textAppearance="?android:attr/textAppearanceMedium"/>
|
android:paddingLeft="24dp"
|
||||||
|
android:paddingRight="24dp">
|
||||||
|
|
||||||
<TextView
|
<ImageView
|
||||||
android:id="@+id/accessibility_service_warning"
|
android:id="@+id/permissionDialog_icon"
|
||||||
android:layout_width="fill_parent"
|
style="@style/AccessibilityDialogServiceIcon" />
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:padding="10dip"
|
|
||||||
android:textAlignment="viewStart"
|
|
||||||
android:textAppearance="?android:attr/textAppearanceMedium"/>
|
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/permissionDialog_title"
|
||||||
|
style="@style/AccessibilityDialogTitle" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/encryption_warning"
|
||||||
|
android:layout_width="fill_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:padding="10dip"
|
||||||
|
android:textAlignment="viewStart"
|
||||||
|
android:textAppearance="?android:attr/textAppearanceMedium"/>
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/permissionDialog_description"
|
||||||
|
android:text="@string/accessibility_service_warning_description"
|
||||||
|
style="@style/AccessibilityDialogDescription" />
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:layout_marginBottom="24dp" >
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/controlScreen_icon"
|
||||||
|
android:src="@drawable/ic_visibility_18dp"
|
||||||
|
style="@style/AccessibilityDialogIcon" />
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="vertical" >
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/controlScreen_title"
|
||||||
|
android:text="@string/accessibility_service_screen_control_title"
|
||||||
|
style="@style/AccessibilityDialogPermissionTitle" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/controlScreen_description"
|
||||||
|
android:text="@string/accessibility_service_screen_control_description"
|
||||||
|
style="@style/AccessibilityDialogPermissionDescription" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:layout_marginBottom="24dp" >
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/performAction_icon"
|
||||||
|
android:src="@drawable/ic_pan_tool_18dp"
|
||||||
|
style="@style/AccessibilityDialogIcon" />
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="vertical" >
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/performAction_title"
|
||||||
|
android:text="@string/accessibility_service_action_perform_title"
|
||||||
|
style="@style/AccessibilityDialogPermissionTitle" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/performAction_description"
|
||||||
|
android:text="@string/accessibility_service_action_perform_description"
|
||||||
|
style="@style/AccessibilityDialogPermissionDescription" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<!-- Buttons on bottom of dialog -->
|
||||||
|
<LinearLayout
|
||||||
|
style="@style/AccessibilityDialogButtonList">
|
||||||
|
|
||||||
|
<Space
|
||||||
|
style="@style/AccessibilityDialogButtonBarSpace"/>
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/permission_enable_allow_button"
|
||||||
|
android:text="@string/accessibility_dialog_button_allow"
|
||||||
|
style="@style/AccessibilityDialogButtonAllow" />
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/permission_enable_deny_button"
|
||||||
|
android:text="@string/accessibility_dialog_button_deny"
|
||||||
|
style="@style/AccessibilityDialogButtonDeny" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
</ScrollView>
|
</ScrollView>
|
||||||
|
@@ -5065,8 +5065,9 @@
|
|||||||
|
|
||||||
<!-- Title for a warning about security implications of enabling an accessibility
|
<!-- Title for a warning about security implications of enabling an accessibility
|
||||||
service. [CHAR LIMIT=NONE] -->
|
service. [CHAR LIMIT=NONE] -->
|
||||||
<string name="enable_service_title">Use
|
<string name="enable_service_title">Allow
|
||||||
<xliff:g id="service" example="TalkBack">%1$s</xliff:g>?</string>
|
<xliff:g id="service" example="TalkBack">%1$s</xliff:g> to have full contol of your
|
||||||
|
device?</string>
|
||||||
<!-- Title for the list of capabilities of an accessibility service. -->
|
<!-- Title for the list of capabilities of an accessibility service. -->
|
||||||
<string name="capabilities_list_title"><xliff:g id="service" example="TalkBack">%1$s</xliff:g>
|
<string name="capabilities_list_title"><xliff:g id="service" example="TalkBack">%1$s</xliff:g>
|
||||||
needs to:</string>
|
needs to:</string>
|
||||||
@@ -5107,11 +5108,43 @@
|
|||||||
This level of control is not appropriate for most apps.
|
This level of control is not appropriate for most apps.
|
||||||
</string>
|
</string>
|
||||||
|
|
||||||
|
<!-- Warning description that explains that it's appropriate for accessibility
|
||||||
|
services to have full control to help users with accessibility needs. [CHAR LIMIT=NONE] -->
|
||||||
|
<string name="accessibility_service_warning_description">Full control is appropriate for apps
|
||||||
|
that help you with accessibility needs, but not for most apps.
|
||||||
|
</string>
|
||||||
|
|
||||||
|
<!-- Title for the screen control in accessibility dialog. [CHAR LIMIT=NONE] -->
|
||||||
|
<string name="accessibility_service_screen_control_title">View and control screen</string>
|
||||||
|
|
||||||
|
<!-- Description for the screen control in accessibility dialog. [CHAR LIMIT=NONE] -->
|
||||||
|
<string name="accessibility_service_screen_control_description">It can read all content on the
|
||||||
|
screen and display content over other apps.
|
||||||
|
</string>
|
||||||
|
|
||||||
|
<!-- Title for the action perform in accessibility dialog. [CHAR LIMIT=NONE] -->
|
||||||
|
<string name="accessibility_service_action_perform_title">View and platform actions</string>
|
||||||
|
|
||||||
|
<!-- Description for the action perform in accessibility dialog. [CHAR LIMIT=NONE] -->
|
||||||
|
<string name="accessibility_service_action_perform_description">It can track your interactions
|
||||||
|
with an app or a hardware sensor, and interact with apps on your behalf.
|
||||||
|
</string>
|
||||||
|
|
||||||
|
<!-- String for the allow button in accessibility permission dialog. [CHAR LIMIT=10] -->
|
||||||
|
<string name="accessibility_dialog_button_allow">Allow</string>
|
||||||
|
<!-- String for the deny button in accessibility permission dialog. [CHAR LIMIT=10] -->
|
||||||
|
<string name="accessibility_dialog_button_deny">Deny</string>
|
||||||
|
|
||||||
|
<!-- String for the allow button in accessibility permission dialog. [CHAR LIMIT=10] -->
|
||||||
|
<string name="accessibility_dialog_button_stop">Stop</string>
|
||||||
|
<!-- String for the deny button in accessibility permission dialog. [CHAR LIMIT=10] -->
|
||||||
|
<string name="accessibility_dialog_button_cancel">Cancel</string>
|
||||||
|
|
||||||
<!-- Title for a warning about disabling an accessibility service. [CHAR LIMIT=NONE] -->
|
<!-- Title for a warning about disabling an accessibility service. [CHAR LIMIT=NONE] -->
|
||||||
<string name="disable_service_title">Stop <xliff:g id="service" example="TalkBack">%1$s</xliff:g>?</string>
|
<string name="disable_service_title">Stop <xliff:g id="service" example="TalkBack">%1$s</xliff:g>?</string>
|
||||||
<!-- Message for a warning about disabling accessibility service. [CHAR LIMIT=NONE] -->
|
<!-- Message for a warning about disabling accessibility service. [CHAR LIMIT=NONE] -->
|
||||||
<string name="disable_service_message">Tapping OK will
|
<string name="disable_service_message">Tapping <xliff:g id="stop" example="Stop">%1$s</xliff:g> will
|
||||||
stop <xliff:g id="service" example="TalkBack">%1$s</xliff:g>.</string>
|
stop <xliff:g id="service" example="TalkBack">%2$s</xliff:g>.</string>
|
||||||
|
|
||||||
<!-- Title for the prompt shown as a placeholder if no accessibility services are installed. [CHAR LIMIT=50] -->
|
<!-- Title for the prompt shown as a placeholder if no accessibility services are installed. [CHAR LIMIT=50] -->
|
||||||
<string name="accessibility_no_services_installed">No services installed</string>
|
<string name="accessibility_no_services_installed">No services installed</string>
|
||||||
|
@@ -562,4 +562,94 @@
|
|||||||
<item name="android:textColor">?android:attr/textColorPrimary</item>
|
<item name="android:textColor">?android:attr/textColorPrimary</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
<style name="AccessibilityDialog">
|
||||||
|
<item name="android:layout_width">match_parent</item>
|
||||||
|
<item name="android:layout_height">wrap_content</item>
|
||||||
|
<item name="android:orientation">vertical</item>
|
||||||
|
<item name="android:divider">@*android:drawable/list_divider_material</item>
|
||||||
|
<item name="android:showDividers">middle</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="AccessibilityDialogServiceIcon">
|
||||||
|
<item name="android:layout_width">36dp</item>
|
||||||
|
<item name="android:layout_height">36dp</item>
|
||||||
|
<item name="android:layout_marginTop">16dp</item>
|
||||||
|
<item name="android:layout_marginBottom">16dp</item>
|
||||||
|
<item name="android:scaleType">fitCenter</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="AccessibilityDialogIcon">
|
||||||
|
<item name="android:layout_width">18dp</item>
|
||||||
|
<item name="android:layout_height">18dp</item>
|
||||||
|
<item name="android:layout_marginRight">12dp</item>
|
||||||
|
<item name="android:scaleType">fitCenter</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="AccessibilityDialogTitle"
|
||||||
|
parent="@android:style/TextAppearance.DeviceDefault">
|
||||||
|
<item name="android:layout_width">match_parent</item>
|
||||||
|
<item name="android:layout_height">wrap_content</item>
|
||||||
|
<item name="android:gravity">center</item>
|
||||||
|
<item name="android:textSize">20sp</item>
|
||||||
|
<item name="android:textColor">?android:attr/textColorPrimary</item>
|
||||||
|
<item name="android:fontFamily">google-sans-medium</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="AccessibilityDialogDescription"
|
||||||
|
parent="@android:style/TextAppearance.DeviceDefault">
|
||||||
|
<item name="android:layout_width">match_parent</item>
|
||||||
|
<item name="android:layout_height">wrap_content</item>
|
||||||
|
<item name="android:layout_marginTop">16dp</item>
|
||||||
|
<item name="android:layout_marginBottom">32dp</item>
|
||||||
|
<item name="android:textSize">16sp</item>
|
||||||
|
<item name="android:textColor">?android:attr/textColorPrimary</item>
|
||||||
|
<item name="android:fontFamily">sans-serif</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="AccessibilityDialogPermissionTitle"
|
||||||
|
parent="@android:style/TextAppearance.DeviceDefault">
|
||||||
|
<item name="android:layout_width">match_parent</item>
|
||||||
|
<item name="android:layout_height">wrap_content</item>
|
||||||
|
<item name="android:textSize">16sp</item>
|
||||||
|
<item name="android:textColor">?android:attr/textColorPrimary</item>
|
||||||
|
<item name="android:fontFamily">sans-serif</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="AccessibilityDialogPermissionDescription"
|
||||||
|
parent="@android:style/TextAppearance.DeviceDefault">
|
||||||
|
<item name="android:layout_width">match_parent</item>
|
||||||
|
<item name="android:layout_height">wrap_content</item>
|
||||||
|
<item name="android:textSize">14sp</item>
|
||||||
|
<item name="android:textColor">?android:attr/textColorSecondary</item>
|
||||||
|
<item name="android:fontFamily">sans-serif</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="AccessibilityDialogButtonBarSpace">
|
||||||
|
<item name="android:layout_width">0dp</item>
|
||||||
|
<item name="android:layout_height">0dp</item>
|
||||||
|
<item name="android:visibility">gone</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="AccessibilityDialogButtonList">
|
||||||
|
<item name="android:layout_width">match_parent</item>
|
||||||
|
<item name="android:layout_height">wrap_content</item>
|
||||||
|
<item name="android:orientation">vertical</item>
|
||||||
|
<item name="android:divider">@*android:drawable/list_divider_material</item>
|
||||||
|
<item name="android:showDividers">middle</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="AccessibilityDialogButton"
|
||||||
|
parent="@*android:style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog">
|
||||||
|
<item name="android:layout_width">match_parent</item>
|
||||||
|
<item name="android:layout_height">56dp</item>
|
||||||
|
<item name="android:paddingLeft">8dp</item>
|
||||||
|
<item name="android:paddingRight">8dp</item>
|
||||||
|
<item name="android:background">?android:attr/selectableItemBackground</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="AccessibilityDialogButtonAllow"
|
||||||
|
parent="@style/AccessibilityDialogButton"></style>
|
||||||
|
<style name="AccessibilityDialogButtonDeny"
|
||||||
|
parent="@style/AccessibilityDialogButton"></style>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
@@ -22,7 +22,7 @@ import android.accessibilityservice.AccessibilityServiceInfo;
|
|||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.app.Dialog;
|
import android.app.Dialog;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.DialogInterface;
|
import android.graphics.drawable.Drawable;
|
||||||
import android.os.storage.StorageManager;
|
import android.os.storage.StorageManager;
|
||||||
import android.text.BidiFormatter;
|
import android.text.BidiFormatter;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
@@ -30,10 +30,13 @@ import android.view.MotionEvent;
|
|||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.Window;
|
import android.view.Window;
|
||||||
import android.view.WindowManager;
|
import android.view.WindowManager;
|
||||||
|
import android.widget.Button;
|
||||||
|
import android.widget.ImageView;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
import androidx.appcompat.app.AlertDialog;
|
import androidx.appcompat.app.AlertDialog;
|
||||||
|
import androidx.core.content.ContextCompat;
|
||||||
|
|
||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
|
|
||||||
@@ -44,40 +47,45 @@ import java.util.Locale;
|
|||||||
* accessibility service to access user data before the service is enabled
|
* accessibility service to access user data before the service is enabled
|
||||||
*/
|
*/
|
||||||
public class AccessibilityServiceWarning {
|
public class AccessibilityServiceWarning {
|
||||||
public static Dialog createCapabilitiesDialog(Activity parentActivity,
|
private static final View.OnTouchListener filterTouchListener = (View v, MotionEvent event) -> {
|
||||||
AccessibilityServiceInfo info, DialogInterface.OnClickListener listener) {
|
// Filter obscured touches by consuming them.
|
||||||
final AlertDialog ad = new AlertDialog.Builder(parentActivity)
|
if (((event.getFlags() & MotionEvent.FLAG_WINDOW_IS_OBSCURED) != 0)
|
||||||
.setTitle(parentActivity.getString(R.string.enable_service_title,
|
|| ((event.getFlags() & MotionEvent.FLAG_WINDOW_IS_PARTIALLY_OBSCURED) != 0)) {
|
||||||
getServiceName(parentActivity, info)))
|
if (event.getAction() == MotionEvent.ACTION_UP) {
|
||||||
.setView(createEnableDialogContentView(parentActivity, info))
|
Toast.makeText(v.getContext(), R.string.touch_filtered_warning,
|
||||||
.setPositiveButton(android.R.string.ok, listener)
|
Toast.LENGTH_SHORT).show();
|
||||||
.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_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();
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
return false;
|
return true;
|
||||||
};
|
}
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
|
||||||
|
public static Dialog createCapabilitiesDialog(Activity parentActivity,
|
||||||
|
AccessibilityServiceInfo info, View.OnClickListener listener) {
|
||||||
|
final AlertDialog ad = new AlertDialog.Builder(parentActivity)
|
||||||
|
.setView(createEnableDialogContentView(parentActivity, info, listener))
|
||||||
|
.create();
|
||||||
|
|
||||||
Window window = ad.getWindow();
|
Window window = ad.getWindow();
|
||||||
WindowManager.LayoutParams params = window.getAttributes();
|
WindowManager.LayoutParams params = window.getAttributes();
|
||||||
params.privateFlags |= SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS;
|
params.privateFlags |= SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS;
|
||||||
window.setAttributes(params);
|
window.setAttributes(params);
|
||||||
ad.create();
|
ad.create();
|
||||||
ad.getButton(AlertDialog.BUTTON_POSITIVE).setOnTouchListener(filterTouchListener);
|
|
||||||
ad.setCanceledOnTouchOutside(true);
|
ad.setCanceledOnTouchOutside(true);
|
||||||
|
|
||||||
return ad;
|
return ad;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Dialog createDisableDialog(Activity parentActivity,
|
||||||
|
AccessibilityServiceInfo info, View.OnClickListener listener) {
|
||||||
|
final AlertDialog ad = new AlertDialog.Builder(parentActivity)
|
||||||
|
.setView(createDisableDialogContentView(parentActivity, info, listener))
|
||||||
|
.setCancelable(true)
|
||||||
|
.create();
|
||||||
|
|
||||||
|
return ad;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return whether the device is encrypted with legacy full disk encryption. Newer devices
|
* Return whether the device is encrypted with legacy full disk encryption. Newer devices
|
||||||
* should be using File Based Encryption.
|
* should be using File Based Encryption.
|
||||||
@@ -96,7 +104,7 @@ public class AccessibilityServiceWarning {
|
|||||||
* @return A content view suitable for viewing
|
* @return A content view suitable for viewing
|
||||||
*/
|
*/
|
||||||
private static View createEnableDialogContentView(Context context,
|
private static View createEnableDialogContentView(Context context,
|
||||||
AccessibilityServiceInfo info) {
|
AccessibilityServiceInfo info, View.OnClickListener listener) {
|
||||||
LayoutInflater inflater = (LayoutInflater) context.getSystemService(
|
LayoutInflater inflater = (LayoutInflater) context.getSystemService(
|
||||||
Context.LAYOUT_INFLATER_SERVICE);
|
Context.LAYOUT_INFLATER_SERVICE);
|
||||||
|
|
||||||
@@ -114,9 +122,55 @@ public class AccessibilityServiceWarning {
|
|||||||
encryptionWarningView.setVisibility(View.GONE);
|
encryptionWarningView.setVisibility(View.GONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
TextView serviceWarningTextView = content.findViewById(R.id.accessibility_service_warning);
|
final Drawable icon;
|
||||||
serviceWarningTextView.setText(context.getString(R.string.accessibility_service_warning,
|
if (info.getResolveInfo().getIconResource() == 0) {
|
||||||
getServiceName(context, info)));
|
icon = ContextCompat.getDrawable(context, R.drawable.ic_accessibility_generic);
|
||||||
|
} else {
|
||||||
|
icon = info.getResolveInfo().loadIcon(context.getPackageManager());
|
||||||
|
}
|
||||||
|
|
||||||
|
ImageView permissionDialogIcon = content.findViewById(
|
||||||
|
R.id.permissionDialog_icon);
|
||||||
|
permissionDialogIcon.setImageDrawable(icon);
|
||||||
|
|
||||||
|
TextView permissionDialogTitle = content.findViewById(R.id.permissionDialog_title);
|
||||||
|
permissionDialogTitle.setText(context.getString(R.string.enable_service_title,
|
||||||
|
getServiceName(context, info)));
|
||||||
|
|
||||||
|
Button permissionAllowButton = content.findViewById(
|
||||||
|
R.id.permission_enable_allow_button);
|
||||||
|
Button permissionDenyButton = content.findViewById(
|
||||||
|
R.id.permission_enable_deny_button);
|
||||||
|
permissionAllowButton.setOnClickListener(listener);
|
||||||
|
permissionAllowButton.setOnTouchListener(filterTouchListener);
|
||||||
|
permissionDenyButton.setOnClickListener(listener);
|
||||||
|
|
||||||
|
return content;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static View createDisableDialogContentView(Context context,
|
||||||
|
AccessibilityServiceInfo info, View.OnClickListener listener) {
|
||||||
|
LayoutInflater inflater = (LayoutInflater) context.getSystemService(
|
||||||
|
Context.LAYOUT_INFLATER_SERVICE);
|
||||||
|
|
||||||
|
View content = inflater.inflate(R.layout.disable_accessibility_service_dialog_content,
|
||||||
|
null);
|
||||||
|
|
||||||
|
TextView permissionDialogTitle = content.findViewById(R.id.permissionDialog_disable_title);
|
||||||
|
permissionDialogTitle.setText(context.getString(R.string.disable_service_title,
|
||||||
|
getServiceName(context, info)));
|
||||||
|
TextView permissionDialogMessage = content
|
||||||
|
.findViewById(R.id.permissionDialog_disable_message);
|
||||||
|
permissionDialogMessage.setText(context.getString(R.string.disable_service_message,
|
||||||
|
context.getString(R.string.accessibility_dialog_button_stop),
|
||||||
|
getServiceName(context, info)));
|
||||||
|
|
||||||
|
Button permissionAllowButton = content.findViewById(
|
||||||
|
R.id.permission_disable_stop_button);
|
||||||
|
Button permissionDenyButton = content.findViewById(
|
||||||
|
R.id.permission_disable_cancel_button);
|
||||||
|
permissionAllowButton.setOnClickListener(listener);
|
||||||
|
permissionDenyButton.setOnClickListener(listener);
|
||||||
|
|
||||||
return content;
|
return content;
|
||||||
}
|
}
|
||||||
|
@@ -37,6 +37,7 @@ import android.os.UserHandle;
|
|||||||
import android.provider.Settings;
|
import android.provider.Settings;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.view.accessibility.AccessibilityManager;
|
import android.view.accessibility.AccessibilityManager;
|
||||||
|
import android.view.View;
|
||||||
|
|
||||||
import androidx.fragment.app.Fragment;
|
import androidx.fragment.app.Fragment;
|
||||||
import androidx.fragment.app.FragmentActivity;
|
import androidx.fragment.app.FragmentActivity;
|
||||||
@@ -148,7 +149,7 @@ public class ShortcutServicePickerFragment extends RadioButtonPickerFragment {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static class ConfirmationDialogFragment extends InstrumentedDialogFragment
|
public static class ConfirmationDialogFragment extends InstrumentedDialogFragment
|
||||||
implements DialogInterface.OnClickListener {
|
implements View.OnClickListener {
|
||||||
private static final String EXTRA_KEY = "extra_key";
|
private static final String EXTRA_KEY = "extra_key";
|
||||||
private static final String TAG = "ConfirmationDialogFragment";
|
private static final String TAG = "ConfirmationDialogFragment";
|
||||||
private IBinder mToken;
|
private IBinder mToken;
|
||||||
@@ -182,9 +183,10 @@ public class ShortcutServicePickerFragment extends RadioButtonPickerFragment {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onClick(DialogInterface dialog, int which) {
|
public void onClick(View view) {
|
||||||
final Fragment fragment = getTargetFragment();
|
final Fragment fragment = getTargetFragment();
|
||||||
if ((which == BUTTON_POSITIVE) && (fragment instanceof ShortcutServicePickerFragment)) {
|
if ((view.getId() == R.id.permission_enable_allow_button)
|
||||||
|
&& (fragment instanceof ShortcutServicePickerFragment)) {
|
||||||
final Bundle bundle = getArguments();
|
final Bundle bundle = getArguments();
|
||||||
((ShortcutServicePickerFragment) fragment).onServiceConfirmed(
|
((ShortcutServicePickerFragment) fragment).onServiceConfirmed(
|
||||||
bundle.getString(EXTRA_KEY));
|
bundle.getString(EXTRA_KEY));
|
||||||
|
@@ -22,7 +22,6 @@ import android.app.Dialog;
|
|||||||
import android.app.admin.DevicePolicyManager;
|
import android.app.admin.DevicePolicyManager;
|
||||||
import android.app.settings.SettingsEnums;
|
import android.app.settings.SettingsEnums;
|
||||||
import android.content.ComponentName;
|
import android.content.ComponentName;
|
||||||
import android.content.DialogInterface;
|
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.pm.ResolveInfo;
|
import android.content.pm.ResolveInfo;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
@@ -34,10 +33,9 @@ import android.provider.Settings;
|
|||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.view.Menu;
|
import android.view.Menu;
|
||||||
import android.view.MenuInflater;
|
import android.view.MenuInflater;
|
||||||
|
import android.view.View;
|
||||||
import android.view.accessibility.AccessibilityManager;
|
import android.view.accessibility.AccessibilityManager;
|
||||||
|
|
||||||
import androidx.appcompat.app.AlertDialog;
|
|
||||||
|
|
||||||
import com.android.internal.widget.LockPatternUtils;
|
import com.android.internal.widget.LockPatternUtils;
|
||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
import com.android.settings.password.ConfirmDeviceCredentialActivity;
|
import com.android.settings.password.ConfirmDeviceCredentialActivity;
|
||||||
@@ -48,7 +46,7 @@ import com.android.settingslib.accessibility.AccessibilityUtils;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class ToggleAccessibilityServicePreferenceFragment
|
public class ToggleAccessibilityServicePreferenceFragment
|
||||||
extends ToggleFeaturePreferenceFragment implements DialogInterface.OnClickListener {
|
extends ToggleFeaturePreferenceFragment implements View.OnClickListener {
|
||||||
|
|
||||||
private static final int DIALOG_ID_ENABLE_WARNING = 1;
|
private static final int DIALOG_ID_ENABLE_WARNING = 1;
|
||||||
private static final int DIALOG_ID_DISABLE_WARNING = 2;
|
private static final int DIALOG_ID_DISABLE_WARNING = 2;
|
||||||
@@ -67,7 +65,7 @@ public class ToggleAccessibilityServicePreferenceFragment
|
|||||||
|
|
||||||
private ComponentName mComponentName;
|
private ComponentName mComponentName;
|
||||||
|
|
||||||
private int mShownDialogId;
|
private Dialog mDialog;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getMetricsCategory() {
|
public int getMetricsCategory() {
|
||||||
@@ -129,35 +127,28 @@ public class ToggleAccessibilityServicePreferenceFragment
|
|||||||
public Dialog onCreateDialog(int dialogId) {
|
public Dialog onCreateDialog(int dialogId) {
|
||||||
switch (dialogId) {
|
switch (dialogId) {
|
||||||
case DIALOG_ID_ENABLE_WARNING: {
|
case DIALOG_ID_ENABLE_WARNING: {
|
||||||
mShownDialogId = DIALOG_ID_ENABLE_WARNING;
|
|
||||||
final AccessibilityServiceInfo info = getAccessibilityServiceInfo();
|
final AccessibilityServiceInfo info = getAccessibilityServiceInfo();
|
||||||
if (info == null) {
|
if (info == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
mDialog = AccessibilityServiceWarning
|
||||||
return AccessibilityServiceWarning
|
|
||||||
.createCapabilitiesDialog(getActivity(), info, this);
|
.createCapabilitiesDialog(getActivity(), info, this);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
case DIALOG_ID_DISABLE_WARNING: {
|
case DIALOG_ID_DISABLE_WARNING: {
|
||||||
mShownDialogId = DIALOG_ID_DISABLE_WARNING;
|
|
||||||
AccessibilityServiceInfo info = getAccessibilityServiceInfo();
|
AccessibilityServiceInfo info = getAccessibilityServiceInfo();
|
||||||
if (info == null) {
|
if (info == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return new AlertDialog.Builder(getActivity())
|
mDialog = AccessibilityServiceWarning
|
||||||
.setTitle(getString(R.string.disable_service_title,
|
.createDisableDialog(getActivity(), info, this);
|
||||||
info.getResolveInfo().loadLabel(getPackageManager())))
|
break;
|
||||||
.setMessage(getString(R.string.disable_service_message,
|
|
||||||
info.getResolveInfo().loadLabel(getPackageManager())))
|
|
||||||
.setCancelable(true)
|
|
||||||
.setPositiveButton(android.R.string.ok, this)
|
|
||||||
.setNegativeButton(android.R.string.cancel, this)
|
|
||||||
.create();
|
|
||||||
}
|
}
|
||||||
default: {
|
default: {
|
||||||
throw new IllegalArgumentException();
|
throw new IllegalArgumentException();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return mDialog;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -205,30 +196,31 @@ public class ToggleAccessibilityServicePreferenceFragment
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onClick(DialogInterface dialog, int which) {
|
public void onClick(View view) {
|
||||||
final boolean checked;
|
switch (view.getId()) {
|
||||||
switch (which) {
|
case R.id.permission_enable_allow_button:
|
||||||
case DialogInterface.BUTTON_POSITIVE:
|
if (isFullDiskEncrypted()) {
|
||||||
if (mShownDialogId == DIALOG_ID_ENABLE_WARNING) {
|
String title = createConfirmCredentialReasonMessage();
|
||||||
if (isFullDiskEncrypted()) {
|
Intent intent = ConfirmDeviceCredentialActivity.createIntent(title, null);
|
||||||
String title = createConfirmCredentialReasonMessage();
|
startActivityForResult(intent,
|
||||||
Intent intent = ConfirmDeviceCredentialActivity.createIntent(title, null);
|
ACTIVITY_REQUEST_CONFIRM_CREDENTIAL_FOR_WEAKER_ENCRYPTION);
|
||||||
startActivityForResult(intent,
|
|
||||||
ACTIVITY_REQUEST_CONFIRM_CREDENTIAL_FOR_WEAKER_ENCRYPTION);
|
|
||||||
} else {
|
|
||||||
handleConfirmServiceEnabled(true);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
handleConfirmServiceEnabled(false);
|
handleConfirmServiceEnabled(true);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case DialogInterface.BUTTON_NEGATIVE:
|
case R.id.permission_enable_deny_button:
|
||||||
checked = (mShownDialogId == DIALOG_ID_DISABLE_WARNING);
|
handleConfirmServiceEnabled(false);
|
||||||
handleConfirmServiceEnabled(checked);
|
break;
|
||||||
|
case R.id.permission_disable_stop_button:
|
||||||
|
handleConfirmServiceEnabled(false);
|
||||||
|
break;
|
||||||
|
case R.id.permission_disable_cancel_button:
|
||||||
|
handleConfirmServiceEnabled(true);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
throw new IllegalArgumentException();
|
throw new IllegalArgumentException();
|
||||||
}
|
}
|
||||||
|
mDialog.dismiss();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void handleConfirmServiceEnabled(boolean confirmed) {
|
private void handleConfirmServiceEnabled(boolean confirmed) {
|
||||||
|
Reference in New Issue
Block a user