Stylus: Introduce Show Stylus Hover Pointer Setting (1/2)
Currently, the stylus hover icon can only be shown when
config_enableStylusPointerIcon is set to true. This means that the
users do not have a choice of turning the feature on or off.
This CL introduces the capability to do the same. This CL introduces
a new Secure Setting, STYLUS_POINTER_ICON_ENABLED which can be used to
turn on/off this feature.
Test: manual
Steps:
1. Change the value of config_enableStylusPointerIcon as true.
2. Build the images and flash it to a stylus supporting device.
3. After the device is booted, hover over the screen, the stylus
pointer should appear.
4. Go to Settings > Connected Devices > Stylus and tap on
"Show pointer while hovering" toggle.
5. Try hovering over the screen, check no pointer icon is shown
6. Repeat Step#4, check that stylus pointer appears.
Run
- make RunSettingsRoboTests \
ROBOTEST_FILTER=StylusDevicesControllerTest
- atest SettingsProviderTest
Change-Id: Ie4a0e708ba2e5f9b95f9a4ebd96786e64d9c30cd
diff --git a/core/java/android/hardware/input/InputSettings.java b/core/java/android/hardware/input/InputSettings.java
index 54e34ec..62473c5 100644
--- a/core/java/android/hardware/input/InputSettings.java
+++ b/core/java/android/hardware/input/InputSettings.java
@@ -76,6 +76,12 @@
*/
public static final int MAX_ACCESSIBILITY_SLOW_KEYS_THRESHOLD_MILLIS = 5000;
+ /**
+ * Default value for {@link Settings.Secure#STYLUS_POINTER_ICON_ENABLED}.
+ * @hide
+ */
+ public static final int DEFAULT_STYLUS_POINTER_ICON_ENABLED = 1;
+
private InputSettings() {
}
@@ -383,14 +389,19 @@
}
/**
- * Whether a pointer icon will be shown over the location of a
- * stylus pointer.
+ * Whether a pointer icon will be shown over the location of a stylus pointer.
+ *
* @hide
*/
public static boolean isStylusPointerIconEnabled(@NonNull Context context) {
+ if (InputProperties.force_enable_stylus_pointer_icon().orElse(false)) {
+ return true;
+ }
return context.getResources()
- .getBoolean(com.android.internal.R.bool.config_enableStylusPointerIcon)
- || InputProperties.force_enable_stylus_pointer_icon().orElse(false);
+ .getBoolean(com.android.internal.R.bool.config_enableStylusPointerIcon)
+ && Settings.Secure.getIntForUser(context.getContentResolver(),
+ Settings.Secure.STYLUS_POINTER_ICON_ENABLED,
+ DEFAULT_STYLUS_POINTER_ICON_ENABLED, UserHandle.USER_CURRENT_OR_SELF) != 0;
}
/**
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index ef2d5eb..ce7a026 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -12312,6 +12312,16 @@
public static final String PRIVATE_SPACE_AUTO_LOCK = "private_space_auto_lock";
/**
+ * Toggle for enabling stylus pointer icon. Pointer icons for styluses will only be be shown
+ * when this is enabled. Enabling this alone won't enable the stylus pointer;
+ * config_enableStylusPointerIcon needs to be true as well.
+ *
+ * @hide
+ */
+ @Readable
+ public static final String STYLUS_POINTER_ICON_ENABLED = "stylus_pointer_icon_enabled";
+
+ /**
* These entries are considered common between the personal and the managed profile,
* since the managed profile doesn't get to change them.
*/
diff --git a/core/proto/android/providers/settings/secure.proto b/core/proto/android/providers/settings/secure.proto
index 104c023..10f75d0 100644
--- a/core/proto/android/providers/settings/secure.proto
+++ b/core/proto/android/providers/settings/secure.proto
@@ -612,6 +612,7 @@
}
optional Sounds sounds = 72;
+ optional SettingProto stylus_pointer_icon_enabled = 99 [ (android.privacy).dest = DEST_AUTOMATIC ];
optional SettingProto swipe_bottom_to_notification_enabled = 82 [ (android.privacy).dest = DEST_AUTOMATIC ];
// Defines whether managed profile ringtones should be synced from its
// parent profile.
@@ -720,5 +721,5 @@
// Please insert fields in alphabetical order and group them into messages
// if possible (to avoid reaching the method limit).
- // Next tag = 99;
+ // Next tag = 100;
}
diff --git a/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java b/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java
index 8ad5f24..dc8116d 100644
--- a/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java
+++ b/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java
@@ -261,6 +261,7 @@
Settings.Secure.CREDENTIAL_SERVICE,
Settings.Secure.CREDENTIAL_SERVICE_PRIMARY,
Settings.Secure.EVEN_DIMMER_ACTIVATED,
- Settings.Secure.EVEN_DIMMER_MIN_NITS
+ Settings.Secure.EVEN_DIMMER_MIN_NITS,
+ Settings.Secure.STYLUS_POINTER_ICON_ENABLED,
};
}
diff --git a/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java b/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java
index d854df38..fabdafc 100644
--- a/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java
+++ b/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java
@@ -416,5 +416,6 @@
VALIDATORS.put(Secure.CREDENTIAL_SERVICE, CREDENTIAL_SERVICE_VALIDATOR);
VALIDATORS.put(Secure.CREDENTIAL_SERVICE_PRIMARY, NULLABLE_COMPONENT_NAME_VALIDATOR);
VALIDATORS.put(Secure.AUTOFILL_SERVICE, AUTOFILL_SERVICE_VALIDATOR);
+ VALIDATORS.put(Secure.STYLUS_POINTER_ICON_ENABLED, BOOLEAN_VALIDATOR);
}
}
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
index e4a762a..bc07836 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
@@ -2601,6 +2601,9 @@
p.end(soundsToken);
dumpSetting(s, p,
+ Settings.Secure.STYLUS_POINTER_ICON_ENABLED,
+ SecureSettingsProto.STYLUS_POINTER_ICON_ENABLED);
+ dumpSetting(s, p,
Settings.Secure.SWIPE_BOTTOM_TO_NOTIFICATION_ENABLED,
SecureSettingsProto.SWIPE_BOTTOM_TO_NOTIFICATION_ENABLED);
dumpSetting(s, p,
diff --git a/services/core/java/com/android/server/input/InputManagerService.java b/services/core/java/com/android/server/input/InputManagerService.java
index 7726609..574be34 100644
--- a/services/core/java/com/android/server/input/InputManagerService.java
+++ b/services/core/java/com/android/server/input/InputManagerService.java
@@ -621,10 +621,6 @@
mBatteryController.systemRunning();
mKeyboardBacklightController.systemRunning();
mKeyRemapper.systemRunning();
-
- mNative.setStylusPointerIconEnabled(
- Objects.requireNonNull(mContext.getSystemService(InputManager.class))
- .isStylusPointerIconEnabled());
}
private void reloadDeviceAliases() {
diff --git a/services/core/java/com/android/server/input/InputSettingsObserver.java b/services/core/java/com/android/server/input/InputSettingsObserver.java
index 5ffc380..c02d524 100644
--- a/services/core/java/com/android/server/input/InputSettingsObserver.java
+++ b/services/core/java/com/android/server/input/InputSettingsObserver.java
@@ -94,7 +94,9 @@
Map.entry(Settings.Secure.getUriFor(Settings.Secure.ACCESSIBILITY_SLOW_KEYS),
(reason) -> updateAccessibilitySlowKeys()),
Map.entry(Settings.Secure.getUriFor(Settings.Secure.ACCESSIBILITY_STICKY_KEYS),
- (reason) -> updateAccessibilityStickyKeys()));
+ (reason) -> updateAccessibilityStickyKeys()),
+ Map.entry(Settings.Secure.getUriFor(Settings.Secure.STYLUS_POINTER_ICON_ENABLED),
+ (reason) -> updateStylusPointerIconEnabled()));
}
/**
@@ -254,4 +256,8 @@
mNative.setMinTimeBetweenUserActivityPokes(intervalMillis);
}
}
+
+ private void updateStylusPointerIconEnabled() {
+ mNative.setStylusPointerIconEnabled(InputSettings.isStylusPointerIconEnabled(mContext));
+ }
}