Merge changes I068f8821,Ibcf12746,I169ad495 into nyc-dev
* changes: Add more @NonNull/@Nullable to TextServicesSettings. Remove an unnecessary int to String conversion. Add more @NonNull/@Nullable to InputMethodSettings.
This commit is contained in:
@@ -50,7 +50,10 @@ public final class SpellCheckerSubtype implements Parcelable {
|
||||
private static final String TAG = SpellCheckerSubtype.class.getSimpleName();
|
||||
private static final String EXTRA_VALUE_PAIR_SEPARATOR = ",";
|
||||
private static final String EXTRA_VALUE_KEY_VALUE_SEPARATOR = "=";
|
||||
private static final int SUBTYPE_ID_NONE = 0;
|
||||
/**
|
||||
* @hide
|
||||
*/
|
||||
public static final int SUBTYPE_ID_NONE = 0;
|
||||
private static final String SUBTYPE_LANGUAGE_TAG_NONE = "";
|
||||
|
||||
private final int mSubtypeId;
|
||||
|
||||
@@ -854,7 +854,8 @@ public class InputMethodUtils {
|
||||
private final HashMap<String, String> mCopyOnWriteDataStore = new HashMap<>();
|
||||
|
||||
private boolean mCopyOnWrite = false;
|
||||
private String mEnabledInputMethodsStrCache;
|
||||
@NonNull
|
||||
private String mEnabledInputMethodsStrCache = "";
|
||||
@UserIdInt
|
||||
private int mCurrentUserId;
|
||||
private int[] mCurrentProfileIds = new int[0];
|
||||
@@ -949,7 +950,7 @@ public class InputMethodUtils {
|
||||
// TODO: mCurrentProfileIds should be updated here.
|
||||
}
|
||||
|
||||
private void putString(final String key, final String str) {
|
||||
private void putString(@NonNull final String key, @Nullable final String str) {
|
||||
if (mCopyOnWrite) {
|
||||
mCopyOnWriteDataStore.put(key, str);
|
||||
} else {
|
||||
@@ -957,12 +958,15 @@ public class InputMethodUtils {
|
||||
}
|
||||
}
|
||||
|
||||
private String getString(final String key) {
|
||||
@Nullable
|
||||
private String getString(@NonNull final String key, @Nullable final String defaultValue) {
|
||||
final String result;
|
||||
if (mCopyOnWrite && mCopyOnWriteDataStore.containsKey(key)) {
|
||||
final String result = mCopyOnWriteDataStore.get(key);
|
||||
return result != null ? result : "";
|
||||
result = mCopyOnWriteDataStore.get(key);
|
||||
} else {
|
||||
result = Settings.Secure.getStringForUser(mResolver, key, mCurrentUserId);
|
||||
}
|
||||
return Settings.Secure.getStringForUser(mResolver, key, mCurrentUserId);
|
||||
return result != null ? result : defaultValue;
|
||||
}
|
||||
|
||||
private void putInt(final String key, final int value) {
|
||||
@@ -1124,16 +1128,24 @@ public class InputMethodUtils {
|
||||
return res;
|
||||
}
|
||||
|
||||
private void putEnabledInputMethodsStr(String str) {
|
||||
private void putEnabledInputMethodsStr(@Nullable String str) {
|
||||
if (DEBUG) {
|
||||
Slog.d(TAG, "putEnabledInputMethodStr: " + str);
|
||||
}
|
||||
putString(Settings.Secure.ENABLED_INPUT_METHODS, str);
|
||||
mEnabledInputMethodsStrCache = str;
|
||||
if (TextUtils.isEmpty(str)) {
|
||||
// OK to coalesce to null, since getEnabledInputMethodsStr() can take care of the
|
||||
// empty data scenario.
|
||||
putString(Settings.Secure.ENABLED_INPUT_METHODS, null);
|
||||
} else {
|
||||
putString(Settings.Secure.ENABLED_INPUT_METHODS, str);
|
||||
}
|
||||
// TODO: Update callers of putEnabledInputMethodsStr to make str @NonNull.
|
||||
mEnabledInputMethodsStrCache = (str != null ? str : "");
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public String getEnabledInputMethodsStr() {
|
||||
mEnabledInputMethodsStrCache = getString(Settings.Secure.ENABLED_INPUT_METHODS);
|
||||
mEnabledInputMethodsStrCache = getString(Settings.Secure.ENABLED_INPUT_METHODS, "");
|
||||
if (DEBUG) {
|
||||
Slog.d(TAG, "getEnabledInputMethodsStr: " + mEnabledInputMethodsStrCache
|
||||
+ ", " + mCurrentUserId);
|
||||
@@ -1187,11 +1199,17 @@ public class InputMethodUtils {
|
||||
saveSubtypeHistory(subtypeHistory, imeId, subtypeId);
|
||||
}
|
||||
|
||||
private void putSubtypeHistoryStr(String str) {
|
||||
private void putSubtypeHistoryStr(@NonNull String str) {
|
||||
if (DEBUG) {
|
||||
Slog.d(TAG, "putSubtypeHistoryStr: " + str);
|
||||
}
|
||||
putString(Settings.Secure.INPUT_METHODS_SUBTYPE_HISTORY, str);
|
||||
if (TextUtils.isEmpty(str)) {
|
||||
// OK to coalesce to null, since getSubtypeHistoryStr() can take care of the empty
|
||||
// data scenario.
|
||||
putString(Settings.Secure.INPUT_METHODS_SUBTYPE_HISTORY, null);
|
||||
} else {
|
||||
putString(Settings.Secure.INPUT_METHODS_SUBTYPE_HISTORY, str);
|
||||
}
|
||||
}
|
||||
|
||||
public Pair<String, String> getLastInputMethodAndSubtypeLocked() {
|
||||
@@ -1308,8 +1326,9 @@ public class InputMethodUtils {
|
||||
return imsList;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
private String getSubtypeHistoryStr() {
|
||||
final String history = getString(Settings.Secure.INPUT_METHODS_SUBTYPE_HISTORY);
|
||||
final String history = getString(Settings.Secure.INPUT_METHODS_SUBTYPE_HISTORY, "");
|
||||
if (DEBUG) {
|
||||
Slog.d(TAG, "getSubtypeHistoryStr: " + history);
|
||||
}
|
||||
@@ -1332,8 +1351,9 @@ public class InputMethodUtils {
|
||||
putInt(Settings.Secure.SELECTED_INPUT_METHOD_SUBTYPE, subtypeId);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public String getSelectedInputMethod() {
|
||||
final String imi = getString(Settings.Secure.DEFAULT_INPUT_METHOD);
|
||||
final String imi = getString(Settings.Secure.DEFAULT_INPUT_METHOD, null);
|
||||
if (DEBUG) {
|
||||
Slog.d(TAG, "getSelectedInputMethodStr: " + imi);
|
||||
}
|
||||
|
||||
@@ -456,6 +456,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
|
||||
class SettingsObserver extends ContentObserver {
|
||||
int mUserId;
|
||||
boolean mRegistered = false;
|
||||
@NonNull
|
||||
String mLastEnabled = "";
|
||||
|
||||
/**
|
||||
|
||||
@@ -28,6 +28,7 @@ import com.android.internal.textservice.ITextServicesSessionListener;
|
||||
import org.xmlpull.v1.XmlPullParserException;
|
||||
|
||||
import android.annotation.NonNull;
|
||||
import android.annotation.Nullable;
|
||||
import android.annotation.UserIdInt;
|
||||
import android.app.ActivityManagerNative;
|
||||
import android.app.AppGlobals;
|
||||
@@ -464,9 +465,10 @@ public class TextServicesManagerService extends ITextServicesManager.Stub {
|
||||
return null;
|
||||
}
|
||||
synchronized (mSpellCheckerMap) {
|
||||
final String subtypeHashCodeStr = mSettings.getSelectedSpellCheckerSubtype();
|
||||
final int subtypeHashCode =
|
||||
mSettings.getSelectedSpellCheckerSubtype(SpellCheckerSubtype.SUBTYPE_ID_NONE);
|
||||
if (DBG) {
|
||||
Slog.w(TAG, "getCurrentSpellCheckerSubtype: " + subtypeHashCodeStr);
|
||||
Slog.w(TAG, "getCurrentSpellCheckerSubtype: " + subtypeHashCode);
|
||||
}
|
||||
final SpellCheckerInfo sci = getCurrentSpellChecker(null);
|
||||
if (sci == null || sci.getSubtypeCount() == 0) {
|
||||
@@ -475,17 +477,12 @@ public class TextServicesManagerService extends ITextServicesManager.Stub {
|
||||
}
|
||||
return null;
|
||||
}
|
||||
final int hashCode;
|
||||
if (!TextUtils.isEmpty(subtypeHashCodeStr)) {
|
||||
hashCode = Integer.valueOf(subtypeHashCodeStr);
|
||||
} else {
|
||||
hashCode = 0;
|
||||
}
|
||||
if (hashCode == 0 && !allowImplicitlySelectedSubtype) {
|
||||
if (subtypeHashCode == SpellCheckerSubtype.SUBTYPE_ID_NONE
|
||||
&& !allowImplicitlySelectedSubtype) {
|
||||
return null;
|
||||
}
|
||||
String candidateLocale = null;
|
||||
if (hashCode == 0) {
|
||||
if (subtypeHashCode == 0) {
|
||||
// Spell checker language settings == "auto"
|
||||
final InputMethodManager imm = mContext.getSystemService(InputMethodManager.class);
|
||||
if (imm != null) {
|
||||
@@ -507,7 +504,7 @@ public class TextServicesManagerService extends ITextServicesManager.Stub {
|
||||
SpellCheckerSubtype candidate = null;
|
||||
for (int i = 0; i < sci.getSubtypeCount(); ++i) {
|
||||
final SpellCheckerSubtype scs = sci.getSubtypeAt(i);
|
||||
if (hashCode == 0) {
|
||||
if (subtypeHashCode == 0) {
|
||||
final String scsLocale = scs.getLocale();
|
||||
if (candidateLocale.equals(scsLocale)) {
|
||||
return scs;
|
||||
@@ -518,7 +515,7 @@ public class TextServicesManagerService extends ITextServicesManager.Stub {
|
||||
candidate = scs;
|
||||
}
|
||||
}
|
||||
} else if (scs.hashCode() == hashCode) {
|
||||
} else if (scs.hashCode() == subtypeHashCode) {
|
||||
if (DBG) {
|
||||
Slog.w(TAG, "Return subtype " + scs.hashCode() + ", input= " + locale
|
||||
+ ", " + scs.getLocale());
|
||||
@@ -1096,12 +1093,15 @@ public class TextServicesManagerService extends ITextServicesManager.Stub {
|
||||
}
|
||||
}
|
||||
|
||||
private String getString(final String key) {
|
||||
@Nullable
|
||||
private String getString(@NonNull final String key, @Nullable final String defaultValue) {
|
||||
final String result;
|
||||
if (mCopyOnWrite && mCopyOnWriteDataStore.containsKey(key)) {
|
||||
final String result = mCopyOnWriteDataStore.get(key);
|
||||
return result != null ? result : "";
|
||||
result = mCopyOnWriteDataStore.get(key);
|
||||
} else {
|
||||
result = Settings.Secure.getStringForUser(mResolver, key, mCurrentUserId);
|
||||
}
|
||||
return Settings.Secure.getStringForUser(mResolver, key, mCurrentUserId);
|
||||
return result != null ? result : defaultValue;
|
||||
}
|
||||
|
||||
private void putInt(final String key, final int value) {
|
||||
@@ -1149,24 +1149,31 @@ public class TextServicesManagerService extends ITextServicesManager.Stub {
|
||||
return mCurrentUserId;
|
||||
}
|
||||
|
||||
public void putSelectedSpellChecker(String sciId) {
|
||||
putString(Settings.Secure.SELECTED_SPELL_CHECKER, sciId);
|
||||
public void putSelectedSpellChecker(@Nullable String sciId) {
|
||||
if (TextUtils.isEmpty(sciId)) {
|
||||
// OK to coalesce to null, since getSelectedSpellChecker() can take care of the
|
||||
// empty data scenario.
|
||||
putString(Settings.Secure.SELECTED_SPELL_CHECKER, null);
|
||||
} else {
|
||||
putString(Settings.Secure.SELECTED_SPELL_CHECKER, sciId);
|
||||
}
|
||||
}
|
||||
|
||||
public void putSelectedSpellCheckerSubtype(int hashCode) {
|
||||
putString(Settings.Secure.SELECTED_SPELL_CHECKER_SUBTYPE, String.valueOf(hashCode));
|
||||
putInt(Settings.Secure.SELECTED_SPELL_CHECKER_SUBTYPE, hashCode);
|
||||
}
|
||||
|
||||
public void setSpellCheckerEnabled(boolean enabled) {
|
||||
putBoolean(Settings.Secure.SPELL_CHECKER_ENABLED, enabled);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public String getSelectedSpellChecker() {
|
||||
return getString(Settings.Secure.SELECTED_SPELL_CHECKER);
|
||||
return getString(Settings.Secure.SELECTED_SPELL_CHECKER, "");
|
||||
}
|
||||
|
||||
public String getSelectedSpellCheckerSubtype() {
|
||||
return getString(Settings.Secure.SELECTED_SPELL_CHECKER_SUBTYPE);
|
||||
public int getSelectedSpellCheckerSubtype(final int defaultValue) {
|
||||
return getInt(Settings.Secure.SELECTED_SPELL_CHECKER_SUBTYPE, defaultValue);
|
||||
}
|
||||
|
||||
public boolean isSpellCheckerEnabled() {
|
||||
|
||||
Reference in New Issue
Block a user