blob: 3575d885cfeac699fa3206faa38fb38756f188b5 [file] [log] [blame]
/**
* Copyright (C) 2016 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 androidx.core.view.inputmethod;
import android.os.Build;
import android.os.Bundle;
import android.view.inputmethod.EditorInfo;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
/**
* Helper for accessing features in {@link EditorInfo} in a backwards compatible fashion.
*/
public final class EditorInfoCompat {
/**
* Flag of {@link EditorInfo#imeOptions}: used to request that the IME does not update any
* personalized data such as typing history and personalized language model based on what the
* user typed on this text editing object. Typical use cases are:
* <ul>
* <li>When the application is in a special mode, where user's activities are expected to be
* not recorded in the application's history. Some web browsers and chat applications may
* have this kind of modes.</li>
* <li>When storing typing history does not make much sense. Specifying this flag in typing
* games may help to avoid typing history from being filled up with words that the user is
* less likely to type in their daily life. Another example is that when the application
* already knows that the expected input is not a valid word (e.g. a promotion code that is
* not a valid word in any natural language).</li>
* </ul>
*
* <p>Applications need to be aware that the flag is not a guarantee, and some IMEs may not
* respect it.</p>
*/
public static final int IME_FLAG_NO_PERSONALIZED_LEARNING = 0x1000000;
/**
* Flag of {@link EditorInfo#imeOptions}: used to request an IME that is capable of inputting
* ASCII characters.
*
* <p>The intention of this flag is to ensure that the user can type Roman alphabet characters
* in a {@link android.widget.TextView}. It is typically used for an account ID or password
* input.</p>
*
* <p>In many cases, IMEs are already able to input ASCII even without being told so (such IMEs
* already respect this flag in a sense), but there are cases when this is not the default. For
* instance, users of languages using a different script like Arabic, Greek, Hebrew or Russian
* typically have a keyboard that can't input ASCII characters by default.</p>
*
* <p>Applications need to be aware that the flag is not a guarantee, and some IMEs may not
* respect it. However, it is strongly recommended for IME authors to respect this flag
* especially when their IME could end up with a state where only languages using non-ASCII are
* enabled.</p>
*/
public static final int IME_FLAG_FORCE_ASCII = 0x80000000;
private static final String[] EMPTY_STRING_ARRAY = new String[0];
private static final String CONTENT_MIME_TYPES_KEY =
"androidx.core.view.inputmethod.EditorInfoCompat.CONTENT_MIME_TYPES";
/**
* Sets MIME types that can be accepted by the target editor if the IME calls
* {@link InputConnectionCompat#commitContent(InputConnection, EditorInfo,
* InputContentInfoCompat, int, Bundle)}.
*
* @param editorInfo the editor with which we associate supported MIME types
* @param contentMimeTypes an array of MIME types. {@code null} and an empty array means that
* {@link InputConnectionCompat#commitContent(
* InputConnection, EditorInfo, InputContentInfoCompat, int, Bundle)}
* is not supported on this Editor
*/
public static void setContentMimeTypes(@NonNull EditorInfo editorInfo,
@Nullable String[] contentMimeTypes) {
if (Build.VERSION.SDK_INT >= 25) {
editorInfo.contentMimeTypes = contentMimeTypes;
} else {
if (editorInfo.extras == null) {
editorInfo.extras = new Bundle();
}
editorInfo.extras.putStringArray(CONTENT_MIME_TYPES_KEY, contentMimeTypes);
}
}
/**
* Gets MIME types that can be accepted by the target editor if the IME calls
* {@link InputConnectionCompat#commitContent(InputConnection, EditorInfo,
* InputContentInfoCompat, int, Bundle)}
*
* @param editorInfo the editor from which we get the MIME types
* @return an array of MIME types. An empty array means that {@link
* InputConnectionCompat#commitContent(InputConnection, EditorInfo, InputContentInfoCompat,
* int, Bundle)} is not supported on this editor
*/
@NonNull
public static String[] getContentMimeTypes(EditorInfo editorInfo) {
if (Build.VERSION.SDK_INT >= 25) {
final String[] result = editorInfo.contentMimeTypes;
return result != null ? result : EMPTY_STRING_ARRAY;
} else {
if (editorInfo.extras == null) {
return EMPTY_STRING_ARRAY;
}
String[] result = editorInfo.extras.getStringArray(CONTENT_MIME_TYPES_KEY);
return result != null ? result : EMPTY_STRING_ARRAY;
}
}
/** @deprecated This type should not be instantiated as it contains only static methods. */
@Deprecated
@SuppressWarnings("PrivateConstructorForUtilityClass")
public EditorInfoCompat() {
}
}