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:
Yohei Yukawa
2016-03-17 02:02:59 +00:00
committed by Android (Google) Code Review
4 changed files with 68 additions and 37 deletions

View File

@@ -50,7 +50,10 @@ public final class SpellCheckerSubtype implements Parcelable {
private static final String TAG = SpellCheckerSubtype.class.getSimpleName(); private static final String TAG = SpellCheckerSubtype.class.getSimpleName();
private static final String EXTRA_VALUE_PAIR_SEPARATOR = ","; private static final String EXTRA_VALUE_PAIR_SEPARATOR = ",";
private static final String EXTRA_VALUE_KEY_VALUE_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 static final String SUBTYPE_LANGUAGE_TAG_NONE = "";
private final int mSubtypeId; private final int mSubtypeId;

View File

@@ -854,7 +854,8 @@ public class InputMethodUtils {
private final HashMap<String, String> mCopyOnWriteDataStore = new HashMap<>(); private final HashMap<String, String> mCopyOnWriteDataStore = new HashMap<>();
private boolean mCopyOnWrite = false; private boolean mCopyOnWrite = false;
private String mEnabledInputMethodsStrCache; @NonNull
private String mEnabledInputMethodsStrCache = "";
@UserIdInt @UserIdInt
private int mCurrentUserId; private int mCurrentUserId;
private int[] mCurrentProfileIds = new int[0]; private int[] mCurrentProfileIds = new int[0];
@@ -949,7 +950,7 @@ public class InputMethodUtils {
// TODO: mCurrentProfileIds should be updated here. // 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) { if (mCopyOnWrite) {
mCopyOnWriteDataStore.put(key, str); mCopyOnWriteDataStore.put(key, str);
} else { } 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)) { if (mCopyOnWrite && mCopyOnWriteDataStore.containsKey(key)) {
final String result = mCopyOnWriteDataStore.get(key); result = mCopyOnWriteDataStore.get(key);
return result != null ? result : ""; } 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) { private void putInt(final String key, final int value) {
@@ -1124,16 +1128,24 @@ public class InputMethodUtils {
return res; return res;
} }
private void putEnabledInputMethodsStr(String str) { private void putEnabledInputMethodsStr(@Nullable String str) {
if (DEBUG) { if (DEBUG) {
Slog.d(TAG, "putEnabledInputMethodStr: " + str); Slog.d(TAG, "putEnabledInputMethodStr: " + str);
} }
putString(Settings.Secure.ENABLED_INPUT_METHODS, str); if (TextUtils.isEmpty(str)) {
mEnabledInputMethodsStrCache = 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() { public String getEnabledInputMethodsStr() {
mEnabledInputMethodsStrCache = getString(Settings.Secure.ENABLED_INPUT_METHODS); mEnabledInputMethodsStrCache = getString(Settings.Secure.ENABLED_INPUT_METHODS, "");
if (DEBUG) { if (DEBUG) {
Slog.d(TAG, "getEnabledInputMethodsStr: " + mEnabledInputMethodsStrCache Slog.d(TAG, "getEnabledInputMethodsStr: " + mEnabledInputMethodsStrCache
+ ", " + mCurrentUserId); + ", " + mCurrentUserId);
@@ -1187,11 +1199,17 @@ public class InputMethodUtils {
saveSubtypeHistory(subtypeHistory, imeId, subtypeId); saveSubtypeHistory(subtypeHistory, imeId, subtypeId);
} }
private void putSubtypeHistoryStr(String str) { private void putSubtypeHistoryStr(@NonNull String str) {
if (DEBUG) { if (DEBUG) {
Slog.d(TAG, "putSubtypeHistoryStr: " + str); 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() { public Pair<String, String> getLastInputMethodAndSubtypeLocked() {
@@ -1308,8 +1326,9 @@ public class InputMethodUtils {
return imsList; return imsList;
} }
@NonNull
private String getSubtypeHistoryStr() { 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) { if (DEBUG) {
Slog.d(TAG, "getSubtypeHistoryStr: " + history); Slog.d(TAG, "getSubtypeHistoryStr: " + history);
} }
@@ -1332,8 +1351,9 @@ public class InputMethodUtils {
putInt(Settings.Secure.SELECTED_INPUT_METHOD_SUBTYPE, subtypeId); putInt(Settings.Secure.SELECTED_INPUT_METHOD_SUBTYPE, subtypeId);
} }
@Nullable
public String getSelectedInputMethod() { public String getSelectedInputMethod() {
final String imi = getString(Settings.Secure.DEFAULT_INPUT_METHOD); final String imi = getString(Settings.Secure.DEFAULT_INPUT_METHOD, null);
if (DEBUG) { if (DEBUG) {
Slog.d(TAG, "getSelectedInputMethodStr: " + imi); Slog.d(TAG, "getSelectedInputMethodStr: " + imi);
} }

View File

@@ -456,6 +456,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
class SettingsObserver extends ContentObserver { class SettingsObserver extends ContentObserver {
int mUserId; int mUserId;
boolean mRegistered = false; boolean mRegistered = false;
@NonNull
String mLastEnabled = ""; String mLastEnabled = "";
/** /**

View File

@@ -28,6 +28,7 @@ import com.android.internal.textservice.ITextServicesSessionListener;
import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlPullParserException;
import android.annotation.NonNull; import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.UserIdInt; import android.annotation.UserIdInt;
import android.app.ActivityManagerNative; import android.app.ActivityManagerNative;
import android.app.AppGlobals; import android.app.AppGlobals;
@@ -464,9 +465,10 @@ public class TextServicesManagerService extends ITextServicesManager.Stub {
return null; return null;
} }
synchronized (mSpellCheckerMap) { synchronized (mSpellCheckerMap) {
final String subtypeHashCodeStr = mSettings.getSelectedSpellCheckerSubtype(); final int subtypeHashCode =
mSettings.getSelectedSpellCheckerSubtype(SpellCheckerSubtype.SUBTYPE_ID_NONE);
if (DBG) { if (DBG) {
Slog.w(TAG, "getCurrentSpellCheckerSubtype: " + subtypeHashCodeStr); Slog.w(TAG, "getCurrentSpellCheckerSubtype: " + subtypeHashCode);
} }
final SpellCheckerInfo sci = getCurrentSpellChecker(null); final SpellCheckerInfo sci = getCurrentSpellChecker(null);
if (sci == null || sci.getSubtypeCount() == 0) { if (sci == null || sci.getSubtypeCount() == 0) {
@@ -475,17 +477,12 @@ public class TextServicesManagerService extends ITextServicesManager.Stub {
} }
return null; return null;
} }
final int hashCode; if (subtypeHashCode == SpellCheckerSubtype.SUBTYPE_ID_NONE
if (!TextUtils.isEmpty(subtypeHashCodeStr)) { && !allowImplicitlySelectedSubtype) {
hashCode = Integer.valueOf(subtypeHashCodeStr);
} else {
hashCode = 0;
}
if (hashCode == 0 && !allowImplicitlySelectedSubtype) {
return null; return null;
} }
String candidateLocale = null; String candidateLocale = null;
if (hashCode == 0) { if (subtypeHashCode == 0) {
// Spell checker language settings == "auto" // Spell checker language settings == "auto"
final InputMethodManager imm = mContext.getSystemService(InputMethodManager.class); final InputMethodManager imm = mContext.getSystemService(InputMethodManager.class);
if (imm != null) { if (imm != null) {
@@ -507,7 +504,7 @@ public class TextServicesManagerService extends ITextServicesManager.Stub {
SpellCheckerSubtype candidate = null; SpellCheckerSubtype candidate = null;
for (int i = 0; i < sci.getSubtypeCount(); ++i) { for (int i = 0; i < sci.getSubtypeCount(); ++i) {
final SpellCheckerSubtype scs = sci.getSubtypeAt(i); final SpellCheckerSubtype scs = sci.getSubtypeAt(i);
if (hashCode == 0) { if (subtypeHashCode == 0) {
final String scsLocale = scs.getLocale(); final String scsLocale = scs.getLocale();
if (candidateLocale.equals(scsLocale)) { if (candidateLocale.equals(scsLocale)) {
return scs; return scs;
@@ -518,7 +515,7 @@ public class TextServicesManagerService extends ITextServicesManager.Stub {
candidate = scs; candidate = scs;
} }
} }
} else if (scs.hashCode() == hashCode) { } else if (scs.hashCode() == subtypeHashCode) {
if (DBG) { if (DBG) {
Slog.w(TAG, "Return subtype " + scs.hashCode() + ", input= " + locale Slog.w(TAG, "Return subtype " + scs.hashCode() + ", input= " + locale
+ ", " + scs.getLocale()); + ", " + 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)) { if (mCopyOnWrite && mCopyOnWriteDataStore.containsKey(key)) {
final String result = mCopyOnWriteDataStore.get(key); result = mCopyOnWriteDataStore.get(key);
return result != null ? result : ""; } 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) { private void putInt(final String key, final int value) {
@@ -1149,24 +1149,31 @@ public class TextServicesManagerService extends ITextServicesManager.Stub {
return mCurrentUserId; return mCurrentUserId;
} }
public void putSelectedSpellChecker(String sciId) { public void putSelectedSpellChecker(@Nullable String sciId) {
putString(Settings.Secure.SELECTED_SPELL_CHECKER, 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) { 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) { public void setSpellCheckerEnabled(boolean enabled) {
putBoolean(Settings.Secure.SPELL_CHECKER_ENABLED, enabled); putBoolean(Settings.Secure.SPELL_CHECKER_ENABLED, enabled);
} }
@NonNull
public String getSelectedSpellChecker() { public String getSelectedSpellChecker() {
return getString(Settings.Secure.SELECTED_SPELL_CHECKER); return getString(Settings.Secure.SELECTED_SPELL_CHECKER, "");
} }
public String getSelectedSpellCheckerSubtype() { public int getSelectedSpellCheckerSubtype(final int defaultValue) {
return getString(Settings.Secure.SELECTED_SPELL_CHECKER_SUBTYPE); return getInt(Settings.Secure.SELECTED_SPELL_CHECKER_SUBTYPE, defaultValue);
} }
public boolean isSpellCheckerEnabled() { public boolean isSpellCheckerEnabled() {