Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bca7e4e9 authored by Tadashi G. Takaoka's avatar Tadashi G. Takaoka
Browse files

Make AccessibleKeyboardViewProxy not singleton

This CL also renames AccessibleKeyboardViewProxy and
AccessibilityEntityProvider to MainKeyboardAccessibilityDelegate and
MainKeyboardAccessibilityNodeProvider.

Change-Id: I2b0ec091a11aa8a495794d633efecb6d8b818f42
parent 24536580
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -68,7 +68,6 @@ public final class AccessibilityUtils {
        // These only need to be initialized if the kill switch is off.
        sInstance.initInternal(context);
        KeyCodeDescriptionMapper.init();
        AccessibleKeyboardViewProxy.init(context);
    }

    public static AccessibilityUtils getInstance() {
+11 −55
Original line number Diff line number Diff line
@@ -36,9 +36,7 @@ import com.android.inputmethod.keyboard.MainKeyboardView;
import com.android.inputmethod.latin.R;
import com.android.inputmethod.latin.utils.SubtypeLocaleUtils;

public final class AccessibleKeyboardViewProxy extends AccessibilityDelegateCompat {
    private static final AccessibleKeyboardViewProxy sInstance = new AccessibleKeyboardViewProxy();

public final class MainKeyboardAccessibilityDelegate extends AccessibilityDelegateCompat {
    /** Map of keyboard modes to resource IDs. */
    private static final SparseIntArray KEYBOARD_MODE_RES_IDS = new SparseIntArray();

@@ -54,9 +52,9 @@ public final class AccessibleKeyboardViewProxy extends AccessibilityDelegateComp
        KEYBOARD_MODE_RES_IDS.put(KeyboardId.MODE_URL, R.string.keyboard_mode_url);
    }

    private MainKeyboardView mView;
    private final MainKeyboardView mView;
    private Keyboard mKeyboard;
    private AccessibilityEntityProvider mAccessibilityNodeProvider;
    private MainKeyboardAccessibilityNodeProvider mAccessibilityNodeProvider;

    private Key mLastHoverKey = null;

@@ -69,46 +67,14 @@ public final class AccessibleKeyboardViewProxy extends AccessibilityDelegateComp
    private int mLastKeyboardMode = KEYBOARD_IS_HIDDEN;
    private static final int KEYBOARD_IS_HIDDEN = -1;

    public static void init(final Context context) {
        sInstance.initInternal(context);
    }

    public static AccessibleKeyboardViewProxy getInstance() {
        return sInstance;
    }

    private AccessibleKeyboardViewProxy() {
        // Not publicly instantiable.
    }

    private void initInternal(final Context context) {
    public MainKeyboardAccessibilityDelegate(final MainKeyboardView view) {
        final Context context = view.getContext();
        mEdgeSlop = context.getResources().getDimensionPixelSize(
                R.dimen.config_accessibility_edge_slop);
    }

    /**
     * Sets the view wrapped by this proxy.
     *
     * @param view The view to wrap.
     */
    public void setView(final MainKeyboardView view) {
        if (view == null) {
            // Ignore null views.
            return;
        }
        mView = view;

        // Ensure that the view has an accessibility delegate.
        ViewCompat.setAccessibilityDelegate(view, this);

        if (mAccessibilityNodeProvider == null) {
            return;
        }
        mAccessibilityNodeProvider.setView(view);

        // Since this class is constructed lazily, we might not get a subsequent
        // call to setKeyboard() and therefore need to call it now.
        setKeyboard(view.getKeyboard());
    }

    /**
@@ -156,9 +122,6 @@ public final class AccessibleKeyboardViewProxy extends AccessibilityDelegateComp
     * Called when the keyboard is hidden and accessibility is enabled.
     */
    public void onHideWindow() {
        if (mView == null) {
            return;
        }
        announceKeyboardHidden();
        mLastKeyboardMode = KEYBOARD_IS_HIDDEN;
    }
@@ -264,7 +227,7 @@ public final class AccessibleKeyboardViewProxy extends AccessibilityDelegateComp
    }

    /**
     * Proxy method for View.getAccessibilityNodeProvider(). This method is called in SDK
     * Delegate method for View.getAccessibilityNodeProvider(). This method is called in SDK
     * version 15 (Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) and higher to obtain the virtual
     * node hierarchy provider.
     *
@@ -272,10 +235,7 @@ public final class AccessibleKeyboardViewProxy extends AccessibilityDelegateComp
     * @return The accessibility node provider for the current keyboard.
     */
    @Override
    public AccessibilityEntityProvider getAccessibilityNodeProvider(final View host) {
        if (mView == null) {
            return null;
        }
    public MainKeyboardAccessibilityNodeProvider getAccessibilityNodeProvider(final View host) {
        return getAccessibilityNodeProvider();
    }

@@ -288,10 +248,6 @@ public final class AccessibleKeyboardViewProxy extends AccessibilityDelegateComp
     * @return {@code true} if the event is handled
     */
    public boolean dispatchHoverEvent(final MotionEvent event, final KeyDetector keyDetector) {
        if (mView == null) {
            return false;
        }

        final int x = (int) event.getX();
        final int y = (int) event.getY();
        final Key previousKey = mLastHoverKey;
@@ -325,14 +281,14 @@ public final class AccessibleKeyboardViewProxy extends AccessibilityDelegateComp
    }

    /**
     * @return A lazily-instantiated node provider for this view proxy.
     * @return A lazily-instantiated node provider for this view delegate.
     */
    private AccessibilityEntityProvider getAccessibilityNodeProvider() {
    private MainKeyboardAccessibilityNodeProvider getAccessibilityNodeProvider() {
        // Instantiate the provide only when requested. Since the system
        // will call this method multiple times it is a good practice to
        // cache the provider instance.
        if (mAccessibilityNodeProvider == null) {
            mAccessibilityNodeProvider = new AccessibilityEntityProvider(mView);
            mAccessibilityNodeProvider = new MainKeyboardAccessibilityNodeProvider(mView);
        }
        return mAccessibilityNodeProvider;
    }
@@ -417,7 +373,7 @@ public final class AccessibleKeyboardViewProxy extends AccessibilityDelegateComp
        if (key == null) {
            return false;
        }
        final AccessibilityEntityProvider provider = getAccessibilityNodeProvider();
        final MainKeyboardAccessibilityNodeProvider provider = getAccessibilityNodeProvider();

        switch (event.getAction()) {
        case MotionEvent.ACTION_HOVER_ENTER:
+4 −13
Original line number Diff line number Diff line
@@ -47,8 +47,8 @@ import java.util.List;
 * virtual views, thus conveying their logical structure.
 * </p>
 */
public final class AccessibilityEntityProvider extends AccessibilityNodeProviderCompat {
    private static final String TAG = AccessibilityEntityProvider.class.getSimpleName();
public final class MainKeyboardAccessibilityNodeProvider extends AccessibilityNodeProviderCompat {
    private static final String TAG = MainKeyboardAccessibilityNodeProvider.class.getSimpleName();
    private static final int UNDEFINED = Integer.MIN_VALUE;

    private final KeyCodeDescriptionMapper mKeyCodeDescriptionMapper;
@@ -64,23 +64,14 @@ public final class AccessibilityEntityProvider extends AccessibilityNodeProvider
    private int mAccessibilityFocusedView = UNDEFINED;

    /** The current keyboard view. */
    private KeyboardView mKeyboardView;
    private final KeyboardView mKeyboardView;

    /** The current keyboard. */
    private Keyboard mKeyboard;

    public AccessibilityEntityProvider(final KeyboardView keyboardView) {
    public MainKeyboardAccessibilityNodeProvider(final KeyboardView keyboardView) {
        mKeyCodeDescriptionMapper = KeyCodeDescriptionMapper.getInstance();
        mAccessibilityUtils = AccessibilityUtils.getInstance();
        setView(keyboardView);
    }

    /**
     * Sets the keyboard view represented by this node provider.
     *
     * @param keyboardView The keyboard view to represent.
     */
    public void setView(final KeyboardView keyboardView) {
        mKeyboardView = keyboardView;
        updateParentLocation();

+1 −6
Original line number Diff line number Diff line
@@ -26,7 +26,6 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.inputmethod.EditorInfo;

import com.android.inputmethod.accessibility.AccessibleKeyboardViewProxy;
import com.android.inputmethod.compat.InputMethodServiceCompatUtils;
import com.android.inputmethod.keyboard.KeyboardLayoutSet.KeyboardLayoutSetException;
import com.android.inputmethod.keyboard.internal.KeyboardState;
@@ -148,6 +147,7 @@ public final class KeyboardSwitcher implements KeyboardState.SwitchActions {

    public void onHideWindow() {
        mIsAutoCorrectionActive = false;
        mKeyboardView.onHideWindow();
    }

    private void setKeyboard(final Keyboard keyboard) {
@@ -353,11 +353,6 @@ public final class KeyboardSwitcher implements KeyboardState.SwitchActions {
        mEmojiPalettesView.setHardwareAcceleratedDrawingEnabled(
                isHardwareAcceleratedDrawingEnabled);
        mEmojiPalettesView.setKeyboardActionListener(mLatinIME);

        // This always needs to be set since the accessibility state can
        // potentially change without the input view being re-created.
        AccessibleKeyboardViewProxy.getInstance().setView(mKeyboardView);

        return mCurrentInputView;
    }

+11 −6
Original line number Diff line number Diff line
@@ -39,7 +39,7 @@ import android.view.inputmethod.InputMethodSubtype;
import android.widget.TextView;

import com.android.inputmethod.accessibility.AccessibilityUtils;
import com.android.inputmethod.accessibility.AccessibleKeyboardViewProxy;
import com.android.inputmethod.accessibility.MainKeyboardAccessibilityDelegate;
import com.android.inputmethod.annotations.ExternallyReferenced;
import com.android.inputmethod.keyboard.internal.DrawingHandler;
import com.android.inputmethod.keyboard.internal.DrawingPreviewPlacerView;
@@ -179,6 +179,8 @@ public final class MainKeyboardView extends KeyboardView implements PointerTrack
    private final DrawingHandler mDrawingHandler =
            new DrawingHandler(this);

    private final MainKeyboardAccessibilityDelegate mAccessibilityDelegate;

    public MainKeyboardView(final Context context, final AttributeSet attrs) {
        this(context, attrs, R.attr.mainKeyboardViewStyle);
    }
@@ -278,6 +280,8 @@ public final class MainKeyboardView extends KeyboardView implements PointerTrack

        mLanguageOnSpacebarHorizontalMargin = (int)getResources().getDimension(
                R.dimen.config_language_on_spacebar_horizontal_margin);

        mAccessibilityDelegate = new MainKeyboardAccessibilityDelegate(this);
    }

    @Override
@@ -404,9 +408,7 @@ public final class MainKeyboardView extends KeyboardView implements PointerTrack
            ResearchLogger.mainKeyboardView_setKeyboard(keyboard, orientation);
        }

        // This always needs to be set since the accessibility state can
        // potentially change without the keyboard being set again.
        AccessibleKeyboardViewProxy.getInstance().setKeyboard(keyboard);
        mAccessibilityDelegate.setKeyboard(keyboard);
    }

    /**
@@ -769,6 +771,10 @@ public final class MainKeyboardView extends KeyboardView implements PointerTrack
        mMoreKeysKeyboardCache.clear();
    }

    public void onHideWindow() {
        mAccessibilityDelegate.onHideWindow();
    }

    /**
     * Receives hover events from the input framework.
     *
@@ -779,8 +785,7 @@ public final class MainKeyboardView extends KeyboardView implements PointerTrack
    @Override
    public boolean dispatchHoverEvent(final MotionEvent event) {
        if (AccessibilityUtils.getInstance().isTouchExplorationEnabled()) {
            return AccessibleKeyboardViewProxy.getInstance().dispatchHoverEvent(
                    event, mKeyDetector);
            return mAccessibilityDelegate.dispatchHoverEvent(event, mKeyDetector);
        }

        // Reflection doesn't support calling superclass methods.
Loading