blob: 5dca34884ab57cf19253b44755788eeb3babde16 [file] [log] [blame]
/*
* Copyright (C) 2011 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 android.view.textservice;
import com.android.internal.textservice.ITextServicesManager;
import android.content.Context;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.util.Log;
import android.view.textservice.SpellCheckerSession.SpellCheckerSessionListener;
import java.util.Locale;
/**
* System API to the overall text services, which arbitrates interaction between applications
* and text services. You can retrieve an instance of this interface with
* {@link Context#getSystemService(String) Context.getSystemService()}.
*
* The user can change the current text services in Settings. And also applications can specify
* the target text services.
*/
public final class TextServicesManager {
private static final String TAG = TextServicesManager.class.getSimpleName();
private static final boolean DBG = false;
private static TextServicesManager sInstance;
private static ITextServicesManager sService;
private TextServicesManager() {
if (sService == null) {
IBinder b = ServiceManager.getService(Context.TEXT_SERVICES_MANAGER_SERVICE);
sService = ITextServicesManager.Stub.asInterface(b);
}
}
/**
* Retrieve the global TextServicesManager instance, creating it if it doesn't already exist.
* @hide
*/
public static TextServicesManager getInstance() {
synchronized (TextServicesManager.class) {
if (sInstance != null) {
return sInstance;
}
sInstance = new TextServicesManager();
}
return sInstance;
}
/**
* Get a spell checker session for the specified spell checker
* @param locale the locale for the spell checker
* @param listener a spell checker session lister for getting results from a spell checker.
* @param referToSpellCheckerLanguageSettings if true, the session for one of enabled
* languages in settings will be returned.
* @return the spell checker session of the spell checker
*/
// TODO: Add a method to get enabled spell checkers.
// TODO: Handle referToSpellCheckerLanguageSettings
public SpellCheckerSession newSpellCheckerSession(Bundle bundle, Locale locale,
SpellCheckerSessionListener listener, boolean referToSpellCheckerLanguageSettings) {
if (listener == null) {
throw new NullPointerException();
}
// TODO: set a proper locale instead of the dummy locale
final String localeString = locale == null ? "en" : locale.toString();
final SpellCheckerInfo sci;
try {
sci = sService.getCurrentSpellChecker(localeString);
} catch (RemoteException e) {
return null;
}
if (sci == null) {
return null;
}
final SpellCheckerSession session = new SpellCheckerSession(sci, sService, listener);
try {
sService.getSpellCheckerService(sci.getId(), localeString,
session.getTextServicesSessionListener(),
session.getSpellCheckerSessionListener(), bundle);
} catch (RemoteException e) {
return null;
}
return session;
}
/**
* @hide
*/
public SpellCheckerInfo[] getEnabledSpellCheckers() {
try {
final SpellCheckerInfo[] retval = sService.getEnabledSpellCheckers();
if (DBG) {
Log.d(TAG, "getEnabledSpellCheckers: " + (retval != null ? retval.length : "null"));
}
return retval;
} catch (RemoteException e) {
Log.e(TAG, "Error in getEnabledSpellCheckers: " + e);
return null;
}
}
/**
* @hide
*/
public SpellCheckerInfo getCurrentSpellChecker() {
try {
// Passing null as a locale for ICS
return sService.getCurrentSpellChecker(null);
} catch (RemoteException e) {
return null;
}
}
/**
* @hide
*/
public void setCurrentSpellChecker(SpellCheckerInfo sci) {
try {
if (sci == null) {
throw new NullPointerException("SpellCheckerInfo is null.");
}
sService.setCurrentSpellChecker(null, sci.getId());
} catch (RemoteException e) {
Log.e(TAG, "Error in setCurrentSpellChecker: " + e);
}
}
/**
* @hide
*/
public SpellCheckerSubtype getCurrentSpellCheckerSubtype() {
try {
// Passing null as a locale for ICS
return sService.getCurrentSpellCheckerSubtype(null);
} catch (RemoteException e) {
Log.e(TAG, "Error in getCurrentSpellCheckerSubtype: " + e);
return null;
}
}
/**
* @hide
*/
public void setSpellCheckerSubtype(SpellCheckerSubtype subtype) {
try {
if (subtype == null) {
throw new NullPointerException("SpellCheckerSubtype is null.");
}
sService.setCurrentSpellCheckerSubtype(null, subtype.hashCode());
} catch (RemoteException e) {
Log.e(TAG, "Error in setSpellCheckerSubtype:" + e);
}
}
/**
* @hide
*/
public void setSpellCheckerEnabled(boolean enabled) {
try {
sService.setSpellCheckerEnabled(enabled);
} catch (RemoteException e) {
Log.e(TAG, "Error in setSpellCheckerSubtype:" + e);
}
}
/**
* @hide
*/
public boolean isSpellCheckerEnabled() {
try {
return sService.isSpellCheckerEnabled();
} catch (RemoteException e) {
Log.e(TAG, "Error in setSpellCheckerSubtype:" + e);
return false;
}
}
}