/* * Copyright (C) 2014 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. */ package com.android.inputmethod.compat; import android.annotation.TargetApi; import android.graphics.Matrix; import android.graphics.RectF; import android.os.Build; import android.view.inputmethod.CursorAnchorInfo; import javax.annotation.Nonnull; import javax.annotation.Nullable; /** * A wrapper for {@link CursorAnchorInfo}, which has been introduced in API Level 21. You can use * this wrapper to avoid direct dependency on newly introduced types. */ public class CursorAnchorInfoCompatWrapper { /** * The insertion marker or character bounds have at least one visible region. */ public static final int FLAG_HAS_VISIBLE_REGION = 0x01; /** * The insertion marker or character bounds have at least one invisible (clipped) region. */ public static final int FLAG_HAS_INVISIBLE_REGION = 0x02; /** * The insertion marker or character bounds is placed at right-to-left (RTL) character. */ public static final int FLAG_IS_RTL = 0x04; CursorAnchorInfoCompatWrapper() { // This class is not publicly instantiable. } @TargetApi(Build.VERSION_CODES.LOLLIPOP) @Nullable public static CursorAnchorInfoCompatWrapper wrap(@Nullable final CursorAnchorInfo instance) { if (BuildCompatUtils.EFFECTIVE_SDK_INT < Build.VERSION_CODES.LOLLIPOP) { return null; } if (instance == null) { return null; } return new RealWrapper(instance); } public int getSelectionStart() { throw new UnsupportedOperationException("not supported."); } public int getSelectionEnd() { throw new UnsupportedOperationException("not supported."); } public CharSequence getComposingText() { throw new UnsupportedOperationException("not supported."); } public int getComposingTextStart() { throw new UnsupportedOperationException("not supported."); } public Matrix getMatrix() { throw new UnsupportedOperationException("not supported."); } @SuppressWarnings("unused") public RectF getCharacterBounds(final int index) { throw new UnsupportedOperationException("not supported."); } @SuppressWarnings("unused") public int getCharacterBoundsFlags(final int index) { throw new UnsupportedOperationException("not supported."); } public float getInsertionMarkerBaseline() { throw new UnsupportedOperationException("not supported."); } public float getInsertionMarkerBottom() { throw new UnsupportedOperationException("not supported."); } public float getInsertionMarkerHorizontal() { throw new UnsupportedOperationException("not supported."); } public float getInsertionMarkerTop() { throw new UnsupportedOperationException("not supported."); } public int getInsertionMarkerFlags() { throw new UnsupportedOperationException("not supported."); } @TargetApi(Build.VERSION_CODES.LOLLIPOP) private static final class RealWrapper extends CursorAnchorInfoCompatWrapper { @Nonnull private final CursorAnchorInfo mInstance; public RealWrapper(@Nonnull final CursorAnchorInfo info) { mInstance = info; } @Override public int getSelectionStart() { return mInstance.getSelectionStart(); } @Override public int getSelectionEnd() { return mInstance.getSelectionEnd(); } @Override public CharSequence getComposingText() { return mInstance.getComposingText(); } @Override public int getComposingTextStart() { return mInstance.getComposingTextStart(); } @Override public Matrix getMatrix() { return mInstance.getMatrix(); } @Override public RectF getCharacterBounds(final int index) { return mInstance.getCharacterBounds(index); } @Override public int getCharacterBoundsFlags(final int index) { return mInstance.getCharacterBoundsFlags(index); } @Override public float getInsertionMarkerBaseline() { return mInstance.getInsertionMarkerBaseline(); } @Override public float getInsertionMarkerBottom() { return mInstance.getInsertionMarkerBottom(); } @Override public float getInsertionMarkerHorizontal() { return mInstance.getInsertionMarkerHorizontal(); } @Override public float getInsertionMarkerTop() { return mInstance.getInsertionMarkerTop(); } @Override public int getInsertionMarkerFlags() { return mInstance.getInsertionMarkerFlags(); } } }