Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cb1001b2 authored by satok's avatar satok Committed by Android (Google) Code Review
Browse files

Merge "Fix a memory leak of a Binder in SpellCheckerService" into ics-mr1

parents 808ee95d 74061ff9
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -18637,6 +18637,7 @@ package android.service.textservice {
    method public android.os.Bundle getBundle();
    method public java.lang.String getLocale();
    method public void onCancel();
    method public void onClose();
    method public abstract void onCreate();
    method public abstract android.view.textservice.SuggestionsInfo onGetSuggestions(android.view.textservice.TextInfo, int);
    method public android.view.textservice.SuggestionsInfo[] onGetSuggestionsMultiple(android.view.textservice.TextInfo[], int, boolean);
+15 −1
Original line number Diff line number Diff line
@@ -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;
        }
+27 −0
Original line number Diff line number Diff line
@@ -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;
+1 −0
Original line number Diff line number Diff line
@@ -25,4 +25,5 @@ oneway interface ISpellCheckerSession {
    void onGetSuggestionsMultiple(
            in TextInfo[] textInfos, int suggestionsLimit, boolean multipleWords);
    void onCancel();
    void onClose();
}