Merge "Fix a memory leak of a Binder in SpellCheckerService" into ics-mr1
This commit is contained in:
@ -145,6 +145,14 @@ public abstract class SpellCheckerService extends Service {
|
||||
*/
|
||||
public void onCancel() {}
|
||||
|
||||
/**
|
||||
* Request to close this session.
|
||||
* This function will run on the incoming IPC thread.
|
||||
* So, this is not called on the main thread,
|
||||
* but will be called in series on another thread.
|
||||
*/
|
||||
public void onClose() {}
|
||||
|
||||
/**
|
||||
* @return Locale for this session
|
||||
*/
|
||||
@ -162,7 +170,7 @@ public abstract class SpellCheckerService extends Service {
|
||||
|
||||
// Preventing from exposing ISpellCheckerSession.aidl, create an internal class.
|
||||
private static class InternalISpellCheckerSession extends ISpellCheckerSession.Stub {
|
||||
private final ISpellCheckerSessionListener mListener;
|
||||
private ISpellCheckerSessionListener mListener;
|
||||
private final Session mSession;
|
||||
private final String mLocale;
|
||||
private final Bundle mBundle;
|
||||
@ -192,6 +200,12 @@ public abstract class SpellCheckerService extends Service {
|
||||
mSession.onCancel();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClose() {
|
||||
mSession.onClose();
|
||||
mListener = null;
|
||||
}
|
||||
|
||||
public String getLocale() {
|
||||
return mLocale;
|
||||
}
|
||||
|
@ -152,6 +152,7 @@ public class SpellCheckerSession {
|
||||
public void close() {
|
||||
mIsUsed = false;
|
||||
try {
|
||||
mSpellCheckerSessionListenerImpl.close();
|
||||
mTextServicesManager.finishSpellCheckerService(mSpellCheckerSessionListenerImpl);
|
||||
} catch (RemoteException e) {
|
||||
// do nothing
|
||||
@ -190,6 +191,7 @@ public class SpellCheckerSession {
|
||||
private static class SpellCheckerSessionListenerImpl extends ISpellCheckerSessionListener.Stub {
|
||||
private static final int TASK_CANCEL = 1;
|
||||
private static final int TASK_GET_SUGGESTIONS_MULTIPLE = 2;
|
||||
private static final int TASK_CLOSE = 3;
|
||||
private final Queue<SpellCheckerParams> mPendingTasks =
|
||||
new LinkedList<SpellCheckerParams>();
|
||||
private final Handler mHandler;
|
||||
@ -224,6 +226,9 @@ public class SpellCheckerSession {
|
||||
case TASK_GET_SUGGESTIONS_MULTIPLE:
|
||||
processGetSuggestionsMultiple(scp);
|
||||
break;
|
||||
case TASK_CLOSE:
|
||||
processClose();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@ -247,6 +252,13 @@ public class SpellCheckerSession {
|
||||
suggestionsLimit, sequentialWords));
|
||||
}
|
||||
|
||||
public void close() {
|
||||
if (DBG) {
|
||||
Log.w(TAG, "close");
|
||||
}
|
||||
processOrEnqueueTask(new SpellCheckerParams(TASK_CLOSE, null, 0, false));
|
||||
}
|
||||
|
||||
public boolean isDisconnected() {
|
||||
return mOpened && mISpellCheckerSession == null;
|
||||
}
|
||||
@ -284,6 +296,21 @@ public class SpellCheckerSession {
|
||||
}
|
||||
}
|
||||
|
||||
private void processClose() {
|
||||
if (!checkOpenConnection()) {
|
||||
return;
|
||||
}
|
||||
if (DBG) {
|
||||
Log.w(TAG, "Close spell checker tasks.");
|
||||
}
|
||||
try {
|
||||
mISpellCheckerSession.onClose();
|
||||
mISpellCheckerSession = null;
|
||||
} catch (RemoteException e) {
|
||||
Log.e(TAG, "Failed to close " + e);
|
||||
}
|
||||
}
|
||||
|
||||
private void processGetSuggestionsMultiple(SpellCheckerParams scp) {
|
||||
if (!checkOpenConnection()) {
|
||||
return;
|
||||
|
Reference in New Issue
Block a user