Introduce accessibility large pointer icons.
This patch does the following things:
- add new graphic assets of large icons for accessibility needs
(imported from ChromeOS data)
- add the logic to choose the set of normal icons or accessibility icons
- make InputManagerService to observe the settings change, so that
it can reload the new resources
This patch misses non-1x graphic though, because ChromeOS doesn't
have such data.
Bug: 25778857
Change-Id: Ia5f95d47f50b3f6eea555c3af8069bc6bae0b400
diff --git a/services/core/java/com/android/server/input/InputManagerService.java b/services/core/java/com/android/server/input/InputManagerService.java
index 81ae8ac..ab2b825 100644
--- a/services/core/java/com/android/server/input/InputManagerService.java
+++ b/services/core/java/com/android/server/input/InputManagerService.java
@@ -207,6 +207,7 @@
private static native String nativeDump(long ptr);
private static native void nativeMonitor(long ptr);
private static native void nativeSetPointerIconShape(long ptr, int iconId);
+ private static native void nativeReloadPointerIcons(long ptr);
// Input event injection constants defined in InputDispatcher.h.
private static final int INPUT_EVENT_INJECTION_SUCCEEDED = 0;
@@ -306,12 +307,14 @@
registerPointerSpeedSettingObserver();
registerShowTouchesSettingObserver();
+ registerAccessibilityLargePointerSettingObserver();
mContext.registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
updatePointerSpeedFromSettings();
updateShowTouchesFromSettings();
+ nativeReloadPointerIcons(mPtr);
}
}, new IntentFilter(Intent.ACTION_USER_SWITCHED), null, mHandler);
@@ -1348,6 +1351,17 @@
}, UserHandle.USER_ALL);
}
+ private void registerAccessibilityLargePointerSettingObserver() {
+ mContext.getContentResolver().registerContentObserver(
+ Settings.Secure.getUriFor(Settings.Secure.ACCESSIBILITY_LARGE_POINTER_ICON), true,
+ new ContentObserver(mHandler) {
+ @Override
+ public void onChange(boolean selfChange) {
+ nativeReloadPointerIcons(mPtr);
+ }
+ }, UserHandle.USER_ALL);
+ }
+
private int getShowTouchesSetting(int defaultValue) {
int result = defaultValue;
try {
@@ -1417,11 +1431,11 @@
}
}
- // Binder call
- @Override
- public void setPointerIconShape(int iconId) {
- nativeSetPointerIconShape(mPtr, iconId);
- }
+ // Binder call
+ @Override
+ public void setPointerIconShape(int iconId) {
+ nativeSetPointerIconShape(mPtr, iconId);
+ }
@Override
public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
diff --git a/services/core/jni/com_android_server_input_InputManagerService.cpp b/services/core/jni/com_android_server_input_InputManagerService.cpp
index b5654ee..9c9a5da 100644
--- a/services/core/jni/com_android_server_input_InputManagerService.cpp
+++ b/services/core/jni/com_android_server_input_InputManagerService.cpp
@@ -205,6 +205,7 @@
void setInteractive(bool interactive);
void reloadCalibration();
void setPointerIconShape(int32_t iconId);
+ void reloadPointerIcons();
/* --- InputReaderPolicyInterface implementation --- */
@@ -242,6 +243,7 @@
/* --- PointerControllerPolicyInterface implementation --- */
+ virtual void loadPointerIcon(SpriteIcon* icon);
virtual void loadPointerResources(PointerResources* outResources);
virtual void loadAdditionalMouseResources(std::map<int32_t, SpriteIcon>* outResources,
std::map<int32_t, PointerAnimation>* outAnimationResources);
@@ -477,22 +479,6 @@
v.logicalBottom - v.logicalTop,
v.orientation);
- JNIEnv* env = jniEnv();
- jobject pointerIconObj = env->CallObjectMethod(mServiceObj,
- gServiceClassInfo.getPointerIcon);
- if (!checkAndClearExceptionFromCallback(env, "getPointerIcon")) {
- PointerIcon pointerIcon;
- status_t status = android_view_PointerIcon_load(env, pointerIconObj,
- mContextObj, &pointerIcon);
- if (!status && !pointerIcon.isNullIcon()) {
- controller->setPointerIcon(SpriteIcon(pointerIcon.bitmap,
- pointerIcon.hotSpotX, pointerIcon.hotSpotY));
- } else {
- controller->setPointerIcon(SpriteIcon());
- }
- env->DeleteLocalRef(pointerIconObj);
- }
-
updateInactivityTimeoutLocked(controller);
}
return controller;
@@ -789,12 +775,19 @@
}
void NativeInputManager::setPointerIconShape(int32_t iconId) {
- AutoMutex _l(mLock);
- sp<PointerController> controller = mLocked.pointerController.promote();
- if (controller != NULL) {
- // Use 0 (the default icon) for ARROW.
+ AutoMutex _l(mLock);
+ sp<PointerController> controller = mLocked.pointerController.promote();
+ if (controller != NULL) {
controller->updatePointerShape(iconId);
- }
+ }
+}
+
+void NativeInputManager::reloadPointerIcons() {
+ AutoMutex _l(mLock);
+ sp<PointerController> controller = mLocked.pointerController.promote();
+ if (controller != NULL) {
+ controller->reloadPointerResources();
+ }
}
TouchAffineTransformation NativeInputManager::getTouchAffineTransformation(
@@ -1036,6 +1029,25 @@
return result;
}
+void NativeInputManager::loadPointerIcon(SpriteIcon* icon) {
+ JNIEnv* env = jniEnv();
+
+ ScopedLocalRef<jobject> pointerIconObj(env, env->CallObjectMethod(
+ mServiceObj, gServiceClassInfo.getPointerIcon));
+ if (checkAndClearExceptionFromCallback(env, "getPointerIcon")) {
+ return;
+ }
+
+ PointerIcon pointerIcon;
+ status_t status = android_view_PointerIcon_load(env, pointerIconObj.get(),
+ mContextObj, &pointerIcon);
+ if (!status && !pointerIcon.isNullIcon()) {
+ *icon = SpriteIcon(pointerIcon.bitmap, pointerIcon.hotSpotX, pointerIcon.hotSpotY);
+ } else {
+ *icon = SpriteIcon();
+ }
+}
+
void NativeInputManager::loadPointerResources(PointerResources* outResources) {
JNIEnv* env = jniEnv();
@@ -1420,6 +1432,11 @@
im->setPointerIconShape(iconId);
}
+static void nativeReloadPointerIcons(JNIEnv* /* env */, jclass /* clazz */, jlong ptr) {
+ NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr);
+ im->reloadPointerIcons();
+}
+
// ----------------------------------------------------------------------------
static const JNINativeMethod gInputManagerMethods[] = {
@@ -1480,6 +1497,8 @@
(void*) nativeMonitor },
{ "nativeSetPointerIconShape", "(JI)V",
(void*) nativeSetPointerIconShape },
+ { "nativeReloadPointerIcons", "(J)V",
+ (void*) nativeReloadPointerIcons },
};
#define FIND_CLASS(var, className) \