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

Commit fa7392c9 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "SpellCheckerSession: Fix brittle finalizer pattern."

parents bbb485ff 9b643671
Loading
Loading
Loading
Loading
+14 −8
Original line number Original line Diff line number Diff line
@@ -29,6 +29,8 @@ import com.android.internal.textservice.ISpellCheckerSessionListener;
import com.android.internal.textservice.ITextServicesManager;
import com.android.internal.textservice.ITextServicesManager;
import com.android.internal.textservice.ITextServicesSessionListener;
import com.android.internal.textservice.ITextServicesSessionListener;


import dalvik.system.CloseGuard;

import java.util.LinkedList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Queue;


@@ -98,7 +100,7 @@ public class SpellCheckerSession {
    private final SpellCheckerSessionListener mSpellCheckerSessionListener;
    private final SpellCheckerSessionListener mSpellCheckerSessionListener;
    private final SpellCheckerSessionListenerImpl mSpellCheckerSessionListenerImpl;
    private final SpellCheckerSessionListenerImpl mSpellCheckerSessionListenerImpl;


    private boolean mIsUsed;
    private final CloseGuard mGuard = CloseGuard.get();


    /** Handler that will execute the main tasks */
    /** Handler that will execute the main tasks */
    private final Handler mHandler = new Handler() {
    private final Handler mHandler = new Handler() {
@@ -128,8 +130,9 @@ public class SpellCheckerSession {
        mSpellCheckerSessionListenerImpl = new SpellCheckerSessionListenerImpl(mHandler);
        mSpellCheckerSessionListenerImpl = new SpellCheckerSessionListenerImpl(mHandler);
        mInternalListener = new InternalListener(mSpellCheckerSessionListenerImpl);
        mInternalListener = new InternalListener(mSpellCheckerSessionListenerImpl);
        mTextServicesManager = tsm;
        mTextServicesManager = tsm;
        mIsUsed = true;
        mSpellCheckerSessionListener = listener;
        mSpellCheckerSessionListener = listener;

        mGuard.open("finishSession");
    }
    }


    /**
    /**
@@ -160,7 +163,7 @@ public class SpellCheckerSession {
     * checker.
     * checker.
     */
     */
    public void close() {
    public void close() {
        mIsUsed = false;
        mGuard.close();
        try {
        try {
            mSpellCheckerSessionListenerImpl.close();
            mSpellCheckerSessionListenerImpl.close();
            mTextServicesManager.finishSpellCheckerService(mSpellCheckerSessionListenerImpl);
            mTextServicesManager.finishSpellCheckerService(mSpellCheckerSessionListenerImpl);
@@ -542,12 +545,15 @@ public class SpellCheckerSession {


    @Override
    @Override
    protected void finalize() throws Throwable {
    protected void finalize() throws Throwable {
        super.finalize();
        try {
        if (mIsUsed) {
            // Note that mGuard will be null if the constructor threw.
            Log.e(TAG, "SpellCheckerSession was not finished properly." +
            if (mGuard != null) {
                    "You should call finishSession() when you finished to use a spell checker.");
                mGuard.warnIfOpen();
                close();
                close();
            }
            }
        } finally {
            super.finalize();
        }
    }
    }


    /**
    /**