public boolean dispatchHoverEvent(MotionEvent event) { boolean z = true; if (!this.mManager.isEnabled() || !AccessibilityManagerCompat.isTouchExplorationEnabled(this.mManager)) { return false; } switch (event.getAction()) { case 7: case 9: int virtualViewId = getVirtualViewAt(event.getX(), event.getY()); updateHoveredVirtualView(virtualViewId); if (virtualViewId == Integer.MIN_VALUE) { z = false; } return z; case 10: if (this.mFocusedVirtualViewId == Integer.MIN_VALUE) { return false; } updateHoveredVirtualView(Integer.MIN_VALUE); return true; default: return false; } }
/** * Dispatches hover {@link MotionEvent}s to the virtual view hierarchy when * the Explore by Touch feature is enabled. * <p> * This method should be called by overriding * {@link View#dispatchHoverEvent}: * * <pre>@Override * public boolean dispatchHoverEvent(MotionEvent event) { * if (mHelper.dispatchHoverEvent(this, event) { * return true; * } * return super.dispatchHoverEvent(event); * } * </pre> * * @param event The hover event to dispatch to the virtual view hierarchy. * @return Whether the hover event was handled. */ public boolean dispatchHoverEvent(MotionEvent event) { if (!mManager.isEnabled() || !AccessibilityManagerCompat.isTouchExplorationEnabled(mManager)) { return false; } switch (event.getAction()) { case MotionEventCompat.ACTION_HOVER_MOVE: case MotionEventCompat.ACTION_HOVER_ENTER: final int virtualViewId = getVirtualViewAt(event.getX(), event.getY()); updateHoveredVirtualView(virtualViewId); return (virtualViewId != INVALID_ID); case MotionEventCompat.ACTION_HOVER_EXIT: if (mFocusedVirtualViewId != INVALID_ID) { updateHoveredVirtualView(INVALID_ID); return true; } return false; default: return false; } }
/** * Attempts to give accessibility focus to a virtual view. * <p> * A virtual view will not actually take focus if * {@link AccessibilityManager#isEnabled()} returns false, * {@link AccessibilityManager#isTouchExplorationEnabled()} returns false, * or the view already has accessibility focus. * * @param virtualViewId The id of the virtual view on which to place * accessibility focus. * @return Whether this virtual view actually took accessibility focus. */ private boolean requestAccessibilityFocus(int virtualViewId) { if (!mManager.isEnabled() || !AccessibilityManagerCompat.isTouchExplorationEnabled(mManager)) { return false; } // TODO: Check virtual view visibility. if (!isAccessibilityFocused(virtualViewId)) { mFocusedVirtualViewId = virtualViewId; // TODO: Only invalidate virtual view bounds. mView.invalidate(); sendEventForVirtualView(virtualViewId, AccessibilityEventCompat.TYPE_VIEW_ACCESSIBILITY_FOCUSED); return true; } return false; }
@Override protected void onResume() { super.onResume(); AccessibilityManager manager = (AccessibilityManager) getSystemService(ACCESSIBILITY_SERVICE); List<AccessibilityServiceInfo> list = AccessibilityManagerCompat.getEnabledAccessibilityServiceList(manager, AccessibilityServiceInfo.FEEDBACK_ALL_MASK); System.out.println("list.size = " + list.size()); for (int i = 0; i < list.size(); i++) { System.out.println("已经可用的服务列表 = " + list.get(i).getId()); if ("com.kale.floatbar/.service.FloatService".equals(list.get(i).getId())) { System.out.println("已启用"); isEnabled = true; break; } } if (!isEnabled) { showDialog(this, "激活悬浮窗", "您还没有激活悬浮窗。" + "在设置中:系统 → 辅助功能 → 服务 中激活" + getResources().getString(R.string.app_name) + "后,便可安全稳定的使用悬浮窗啦~", "去激活", "取消"); } }
/** * Registers an AccessibilityStateChangeListener that show a Toast * when the global accessibility state on the device changes. */ private void registerAccessibilityStateChangeListener() { // The AccessibilityStateChange listener APIs were added in ICS. Therefore to be // backwards compatible we use the APIs in the support library. Note that if the // platform API version is lower and the called API is not available no listener // is added and you will not receive a call of onAccessibilityStateChanged. AccessibilityManagerCompat.addAccessibilityStateChangeListener(mAccessibilityManager, new AccessibilityStateChangeListenerCompat() { @Override public void onAccessibilityStateChanged(boolean enabled) { Toast.makeText(AccessibilityManagerSupportActivity.this, getString(R.string.accessibility_manager_accessibility_state, enabled), Toast.LENGTH_SHORT).show(); } }); }
private boolean requestAccessibilityFocus(int virtualViewId) { if (!this.mManager.isEnabled() || !AccessibilityManagerCompat.isTouchExplorationEnabled(this.mManager) || isAccessibilityFocused(virtualViewId)) { return false; } if (this.mFocusedVirtualViewId != Integer.MIN_VALUE) { sendEventForVirtualView(this.mFocusedVirtualViewId, 65536); } this.mFocusedVirtualViewId = virtualViewId; this.mView.invalidate(); sendEventForVirtualView(virtualViewId, 32768); return true; }
private boolean f(int l) { while (!g.isEnabled() || !AccessibilityManagerCompat.isTouchExplorationEnabled(g) || e(l)) { return false; } j = l; h.invalidate(); sendEventForVirtualView(l, 32768); return true; }
public boolean dispatchHoverEvent(MotionEvent motionevent) { boolean flag = true; if (g.isEnabled() && AccessibilityManagerCompat.isTouchExplorationEnabled(g)) { switch (motionevent.getAction()) { case 8: // '\b' default: return false; case 7: // '\007' case 9: // '\t' int l = getVirtualViewAt(motionevent.getX(), motionevent.getY()); a(l); if (l == 0x80000000) { flag = false; } return flag; case 10: // '\n' break; } if (j != 0x80000000) { a(0x80000000); return flag; } } return false; }
public static boolean isAccessibilityServiceActive(Context c) { AccessibilityManager accessibilityManager = (AccessibilityManager) c.getSystemService(ACCESSIBILITY_SERVICE); List<AccessibilityServiceInfo> runningServices = AccessibilityManagerCompat.getEnabledAccessibilityServiceList(accessibilityManager, AccessibilityEventCompat.TYPES_ALL_MASK); for (AccessibilityServiceInfo service : runningServices) { Log.d(Aware.TAG, service.toString()); if (service.getId().contains("com.aware")) { return true; } } return false; }
private boolean requestAccessibilityFocus(int i) { while (!mManager.isEnabled() || !AccessibilityManagerCompat.isTouchExplorationEnabled(mManager) || isAccessibilityFocused(i)) { return false; } if (mFocusedVirtualViewId != 0x80000000) { sendEventForVirtualView(mFocusedVirtualViewId, 0x10000); } mFocusedVirtualViewId = i; mView.invalidate(); sendEventForVirtualView(i, 32768); return true; }
public boolean dispatchHoverEvent(MotionEvent motionevent) { boolean flag = true; if (mManager.isEnabled() && AccessibilityManagerCompat.isTouchExplorationEnabled(mManager)) { switch (motionevent.getAction()) { case 8: // '\b' default: return false; case 7: // '\007' case 9: // '\t' int i = getVirtualViewAt(motionevent.getX(), motionevent.getY()); updateHoveredVirtualView(i); if (i == 0x80000000) { flag = false; } return flag; case 10: // '\n' break; } if (mFocusedVirtualViewId != 0x80000000) { updateHoveredVirtualView(0x80000000); return true; } } return false; }
/** * Updates the content of a TextView with description of the enabled * accessibility services. */ private void updateAccessibilityStateView() { // The API for getting the enabled accessibility services based on feedback // type was added in ICS. Therefore to be backwards compatible we use the // APIs in the support library. Note that if the platform API version is lower // and the called API is not available an empty list of services is returned. List<AccessibilityServiceInfo> enabledServices = AccessibilityManagerCompat.getEnabledAccessibilityServiceList(mAccessibilityManager, AccessibilityServiceInfo.FEEDBACK_SPOKEN); if (!enabledServices.isEmpty()) { StringBuilder builder = new StringBuilder(); final int enabledServiceCount = enabledServices.size(); for (int i = 0; i < enabledServiceCount; i++) { AccessibilityServiceInfo service = enabledServices.get(i); // Some new APIs were added in ICS for getting more information about // an accessibility service. Again accessed them via the support library. ResolveInfo resolveInfo = AccessibilityServiceInfoCompat.getResolveInfo(service); String serviceDescription = getString( R.string.accessibility_manager_enabled_service, resolveInfo.loadLabel(getPackageManager()), AccessibilityServiceInfoCompat.feedbackTypeToString(service.feedbackType), AccessibilityServiceInfoCompat.getDescription(service), AccessibilityServiceInfoCompat.getSettingsActivityName(service)); builder.append(serviceDescription); } mAccessibilityStateView.setText(builder); } else { // Either no services or the platform API version is not high enough. mAccessibilityStateView.setText(getString( R.string.accessibility_manager_no_enabled_services)); } }
/** * Initialize the Layout with starting values. * * @param context * @param initialHoursOfDay * @param initialMinutes * @param is24HourMode */ public void initialize(Context context, int initialHoursOfDay, int initialMinutes, boolean is24HourMode) { if (mTimeInitialized) { Log.e(TAG, "Time has already been initialized."); return; } mIs24HourMode = is24HourMode; mHideAmPm = AccessibilityManagerCompat.isTouchExplorationEnabled(mAccessibilityManager) ? true : mIs24HourMode; // Initialize the circle and AM/PM circles if applicable. mCircleView.initialize(context, mHideAmPm); mCircleView.invalidate(); if (!mHideAmPm) { mAmPmCirclesView.initialize(initialHoursOfDay < 12 ? AM : PM); mAmPmCirclesView.invalidate(); } // Initialize the hours and minutes numbers. Resources res = context.getResources(); int[] hours = {12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}; int[] hours_24 = {0, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23}; int[] minutes = {0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55}; String[] hoursTexts = new String[12]; String[] innerHoursTexts = new String[12]; String[] minutesTexts = new String[12]; for (int i = 0; i < 12; i++) { hoursTexts[i] = is24HourMode ? String.format("%02d", hours_24[i]) : String.format("%d", hours[i]); innerHoursTexts[i] = String.format("%d", hours[i]); minutesTexts[i] = String.format("%02d", minutes[i]); } mHourRadialTextsView.initialize(res, hoursTexts, (is24HourMode ? innerHoursTexts : null), mHideAmPm, true); mHourRadialTextsView.invalidate(); mMinuteRadialTextsView.initialize(res, minutesTexts, null, mHideAmPm, false); mMinuteRadialTextsView.invalidate(); // Initialize the currently-selected hour and minute. setValueForItem(HOUR_INDEX, initialHoursOfDay); setValueForItem(MINUTE_INDEX, initialMinutes); int hourDegrees = (initialHoursOfDay % 12) * HOUR_VALUE_TO_DEGREES_STEP_SIZE; mHourRadialSelectorView.initialize(context, mHideAmPm, is24HourMode, true, hourDegrees, isHourInnerCircle(initialHoursOfDay)); int minuteDegrees = initialMinutes * MINUTE_VALUE_TO_DEGREES_STEP_SIZE; mMinuteRadialSelectorView.initialize(context, mHideAmPm, false, false, minuteDegrees, false); mTimeInitialized = true; }
/** * Initialize the Layout with starting values. */ public void initialize(Context context, HapticFeedbackController hapticFeedbackController, int initialHoursOfDay, int initialMinutes, boolean is24HourMode) { if (mTimeInitialized) { Log.e(TAG, "Time has already been initialized."); return; } mHapticFeedbackController = hapticFeedbackController; mIs24HourMode = is24HourMode; mHideAmPm = AccessibilityManagerCompat.isTouchExplorationEnabled(mAccessibilityManager) ? true : mIs24HourMode; // Initialize the circle and AM/PM circles if applicable. mCircleView.initialize(context, mHideAmPm); mCircleView.invalidate(); if (!mHideAmPm) { mAmPmCirclesView.initialize(context, initialHoursOfDay < 12 ? AM : PM); mAmPmCirclesView.invalidate(); } // Initialize the hours and minutes numbers. Resources res = context.getResources(); int[] hours = {12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}; int[] hours24 = {0, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23}; int[] minutes = {0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55}; String[] hoursTexts = new String[12]; String[] innerHoursTexts = new String[12]; String[] minutesTexts = new String[12]; for (int i = 0; i < 12; i++) { hoursTexts[i] = is24HourMode ? String.format("%02d", hours24[i]) : String.format("%d", hours[i]); innerHoursTexts[i] = String.format("%d", hours[i]); minutesTexts[i] = String.format("%02d", minutes[i]); } mHourRadialTextsView.initialize(res, hoursTexts, (is24HourMode ? innerHoursTexts : null), mHideAmPm, true); mHourRadialTextsView.invalidate(); mMinuteRadialTextsView.initialize(res, minutesTexts, null, mHideAmPm, false); mMinuteRadialTextsView.invalidate(); // Initialize the currently-selected hour and minute. setValueForItem(HOUR_INDEX, initialHoursOfDay); setValueForItem(MINUTE_INDEX, initialMinutes); int hourDegrees = (initialHoursOfDay % 12) * HOUR_VALUE_TO_DEGREES_STEP_SIZE; mHourRadialSelectorView.initialize(context, mHideAmPm, is24HourMode, true, hourDegrees, isHourInnerCircle(initialHoursOfDay)); int minuteDegrees = initialMinutes * MINUTE_VALUE_TO_DEGREES_STEP_SIZE; mMinuteRadialSelectorView.initialize(context, mHideAmPm, false, false, minuteDegrees, false); mTimeInitialized = true; }
/** * Initialize the Layout with starting values. * * @param context * @param initialHoursOfDay * @param initialMinutes * @param is24HourMode */ public void initialize(Context context, int initialHoursOfDay, int initialMinutes, boolean is24HourMode) { if (mTimeInitialized) { Log.e(TAG, "Time has already been initialized."); return; } mIs24HourMode = is24HourMode; mHideAmPm = AccessibilityManagerCompat.isTouchExplorationEnabled(mAccessibilityManager) ? true : mIs24HourMode; // Initialize the circle and AM/PM circles if applicable. mCircleView.initialize(context, mHideAmPm); mCircleView.invalidate(); if (!mHideAmPm) { mAmPmCirclesView.initialize(context, initialHoursOfDay < 12 ? AM : PM); mAmPmCirclesView.invalidate(); } // Initialize the hours and minutes numbers. Resources res = context.getResources(); int[] hours = { 12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; int[] hours_24 = { 0, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23 }; int[] minutes = { 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55 }; String[] hoursTexts = new String[12]; String[] innerHoursTexts = new String[12]; String[] minutesTexts = new String[12]; for (int i = 0; i < 12; i++) { hoursTexts[i] = is24HourMode ? String.format("%02d", hours_24[i]) : String.format("%d", hours[i]); innerHoursTexts[i] = String.format("%d", hours[i]); minutesTexts[i] = String.format("%02d", minutes[i]); } mHourRadialTextsView.initialize(res, hoursTexts, (is24HourMode ? innerHoursTexts : null), mHideAmPm, true); mHourRadialTextsView.invalidate(); mMinuteRadialTextsView.initialize(res, minutesTexts, null, mHideAmPm, false); mMinuteRadialTextsView.invalidate(); // Initialize the currently-selected hour and minute. setValueForItem(HOUR_INDEX, initialHoursOfDay); setValueForItem(MINUTE_INDEX, initialMinutes); int hourDegrees = (initialHoursOfDay % 12) * HOUR_VALUE_TO_DEGREES_STEP_SIZE; mHourRadialSelectorView.initialize(context, mHideAmPm, is24HourMode, true, hourDegrees, isHourInnerCircle(initialHoursOfDay)); int minuteDegrees = initialMinutes * MINUTE_VALUE_TO_DEGREES_STEP_SIZE; mMinuteRadialSelectorView.initialize(context, mHideAmPm, false, false, minuteDegrees, false); mTimeInitialized = true; }