diff options
Diffstat (limited to 'services/java/com/android/server/TextServicesManagerService.java')
-rw-r--r-- | services/java/com/android/server/TextServicesManagerService.java | 137 |
1 files changed, 133 insertions, 4 deletions
diff --git a/services/java/com/android/server/TextServicesManagerService.java b/services/java/com/android/server/TextServicesManagerService.java index 90824a6..321274f 100644 --- a/services/java/com/android/server/TextServicesManagerService.java +++ b/services/java/com/android/server/TextServicesManagerService.java @@ -41,6 +41,7 @@ import android.service.textservice.SpellCheckerService; import android.text.TextUtils; import android.util.Slog; import android.view.textservice.SpellCheckerInfo; +import android.view.textservice.SpellCheckerSubtype; import java.io.IOException; import java.util.ArrayList; @@ -172,9 +173,9 @@ public class TextServicesManagerService extends ITextServicesManager.Stub { @Override public SpellCheckerInfo getCurrentSpellChecker(String locale) { synchronized (mSpellCheckerMap) { - String curSpellCheckerId = + final String curSpellCheckerId = Settings.Secure.getString(mContext.getContentResolver(), - Settings.Secure.SPELL_CHECKER_SERVICE); + Settings.Secure.SELECTED_SPELL_CHECKER); if (DBG) { Slog.w(TAG, "getCurrentSpellChecker: " + curSpellCheckerId); } @@ -185,6 +186,47 @@ public class TextServicesManagerService extends ITextServicesManager.Stub { } } + // TODO: Save SpellCheckerSubtype by supported languages. + @Override + public SpellCheckerSubtype getCurrentSpellCheckerSubtype(String locale) { + synchronized (mSpellCheckerMap) { + final String subtypeHashCodeStr = + Settings.Secure.getString(mContext.getContentResolver(), + Settings.Secure.SELECTED_SPELL_CHECKER_SUBTYPE); + if (DBG) { + Slog.w(TAG, "getCurrentSpellChecker: " + subtypeHashCodeStr); + } + final SpellCheckerInfo sci = getCurrentSpellChecker(null); + if (sci == null || sci.getSubtypeCount() == 0) { + if (DBG) { + Slog.w(TAG, "Subtype not found."); + } + return null; + } + if (TextUtils.isEmpty(subtypeHashCodeStr)) { + if (DBG) { + Slog.w(TAG, "Return first subtype in " + sci.getId()); + } + // Return the first Subtype if there is no settings for the current subtype. + return sci.getSubtypeAt(0); + } + final int hashCode = Integer.valueOf(subtypeHashCodeStr); + for (int i = 0; i < sci.getSubtypeCount(); ++i) { + final SpellCheckerSubtype scs = sci.getSubtypeAt(i); + if (scs.hashCode() == hashCode) { + if (DBG) { + Slog.w(TAG, "Return subtype " + scs.hashCode()); + } + return scs; + } + } + if (DBG) { + Slog.w(TAG, "Return first subtype in " + sci.getId()); + } + return sci.getSubtypeAt(0); + } + } + @Override public void getSpellCheckerService(String sciId, String locale, ITextServicesSessionListener tsListener, ISpellCheckerSessionListener scListener, @@ -253,6 +295,13 @@ public class TextServicesManagerService extends ITextServicesManager.Stub { return; } + @Override + public boolean isSpellCheckerEnabled() { + synchronized(mSpellCheckerMap) { + return isSpellCheckerEnabledLocked(); + } + } + private void startSpellCheckerServiceInnerLocked(SpellCheckerInfo info, String locale, ITextServicesSessionListener tsListener, ISpellCheckerSessionListener scListener, int uid, Bundle bundle) { @@ -301,7 +350,7 @@ public class TextServicesManagerService extends ITextServicesManager.Stub { } @Override - public void setCurrentSpellChecker(String sciId) { + public void setCurrentSpellChecker(String locale, String sciId) { synchronized(mSpellCheckerMap) { if (mContext.checkCallingOrSelfPermission( android.Manifest.permission.WRITE_SECURE_SETTINGS) @@ -314,6 +363,34 @@ public class TextServicesManagerService extends ITextServicesManager.Stub { } } + @Override + public void setCurrentSpellCheckerSubtype(String locale, int hashCode) { + synchronized(mSpellCheckerMap) { + if (mContext.checkCallingOrSelfPermission( + android.Manifest.permission.WRITE_SECURE_SETTINGS) + != PackageManager.PERMISSION_GRANTED) { + throw new SecurityException( + "Requires permission " + + android.Manifest.permission.WRITE_SECURE_SETTINGS); + } + setCurrentSpellCheckerSubtypeLocked(hashCode); + } + } + + @Override + public void setSpellCheckerEnabled(boolean enabled) { + synchronized(mSpellCheckerMap) { + if (mContext.checkCallingOrSelfPermission( + android.Manifest.permission.WRITE_SECURE_SETTINGS) + != PackageManager.PERMISSION_GRANTED) { + throw new SecurityException( + "Requires permission " + + android.Manifest.permission.WRITE_SECURE_SETTINGS); + } + setSpellCheckerEnabledLocked(enabled); + } + } + private void setCurrentSpellCheckerLocked(String sciId) { if (DBG) { Slog.w(TAG, "setCurrentSpellChecker: " + sciId); @@ -322,7 +399,59 @@ public class TextServicesManagerService extends ITextServicesManager.Stub { final long ident = Binder.clearCallingIdentity(); try { Settings.Secure.putString(mContext.getContentResolver(), - Settings.Secure.SPELL_CHECKER_SERVICE, sciId); + Settings.Secure.SELECTED_SPELL_CHECKER, sciId); + } finally { + Binder.restoreCallingIdentity(ident); + } + } + + private void setCurrentSpellCheckerSubtypeLocked(int hashCode) { + if (DBG) { + Slog.w(TAG, "setCurrentSpellCheckerSubtype: " + hashCode); + } + final SpellCheckerInfo sci = getCurrentSpellChecker(null); + if (sci == null) return; + boolean found = false; + for (int i = 0; i < sci.getSubtypeCount(); ++i) { + if(sci.getSubtypeAt(i).hashCode() == hashCode) { + found = true; + break; + } + } + if (!found) { + return; + } + final long ident = Binder.clearCallingIdentity(); + try { + Settings.Secure.putString(mContext.getContentResolver(), + Settings.Secure.SELECTED_SPELL_CHECKER_SUBTYPE, String.valueOf(hashCode)); + } finally { + Binder.restoreCallingIdentity(ident); + } + } + + private void setSpellCheckerEnabledLocked(boolean enabled) { + if (DBG) { + Slog.w(TAG, "setSpellCheckerEnabled: " + enabled); + } + final long ident = Binder.clearCallingIdentity(); + try { + Settings.Secure.putInt(mContext.getContentResolver(), + Settings.Secure.SPELL_CHECKER_ENABLED, enabled ? 1 : 0); + } finally { + Binder.restoreCallingIdentity(ident); + } + } + + private boolean isSpellCheckerEnabledLocked() { + final long ident = Binder.clearCallingIdentity(); + try { + final boolean retval = Settings.Secure.getInt(mContext.getContentResolver(), + Settings.Secure.SPELL_CHECKER_ENABLED, 1) == 1; + if (DBG) { + Slog.w(TAG, "getSpellCheckerEnabled: " + retval); + } + return retval; } finally { Binder.restoreCallingIdentity(ident); } |