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

Commit 10d66669 authored by Jean Chalard's avatar Jean Chalard
Browse files

Fix a concurrency bug.

This probably only ever happens in tests, but still, that's
the right thing to do.

Bug: 10139031
Change-Id: I259be9e7306162e19faf738a093a77762f2e7675
parent f0a7f70c
Loading
Loading
Loading
Loading
+27 −14
Original line number Diff line number Diff line
@@ -27,12 +27,14 @@ import com.android.inputmethod.latin.AudioAndHapticFeedbackManager;
import com.android.inputmethod.latin.InputAttributes;
import com.android.inputmethod.latin.R;
import com.android.inputmethod.latin.utils.AdditionalSubtypeUtils;
import com.android.inputmethod.latin.utils.DebugLogUtils;
import com.android.inputmethod.latin.utils.LocaleUtils;
import com.android.inputmethod.latin.utils.ResourceUtils;
import com.android.inputmethod.latin.utils.RunInLocale;

import java.util.HashMap;
import java.util.Locale;
import java.util.concurrent.locks.ReentrantLock;

public final class Settings implements SharedPreferences.OnSharedPreferenceChangeListener {
    private static final String TAG = Settings.class.getSimpleName();
@@ -94,6 +96,7 @@ public final class Settings implements SharedPreferences.OnSharedPreferenceChang
    private Resources mRes;
    private SharedPreferences mPrefs;
    private SettingsValues mSettingsValues;
    private final ReentrantLock mSettingsValuesLock = new ReentrantLock();

    private static final Settings sInstance = new Settings();

@@ -121,6 +124,8 @@ public final class Settings implements SharedPreferences.OnSharedPreferenceChang

    @Override
    public void onSharedPreferenceChanged(final SharedPreferences prefs, final String key) {
        mSettingsValuesLock.lock();
        try {
            if (mSettingsValues == null) {
                // TODO: Introduce a static function to register this class and ensure that
                // loadSettings must be called before "onSharedPreferenceChanged" is called.
@@ -128,9 +133,14 @@ public final class Settings implements SharedPreferences.OnSharedPreferenceChang
                return;
            }
            loadSettings(mSettingsValues.mLocale, mSettingsValues.mInputAttributes);
        } finally {
            mSettingsValuesLock.unlock();
        }
    }

    public void loadSettings(final Locale locale, final InputAttributes inputAttributes) {
        mSettingsValuesLock.lock();
        try {
            final SharedPreferences prefs = mPrefs;
            final RunInLocale<SettingsValues> job = new RunInLocale<SettingsValues>() {
                @Override
@@ -139,6 +149,9 @@ public final class Settings implements SharedPreferences.OnSharedPreferenceChang
                }
            };
            mSettingsValues = job.runInLocale(mRes, locale);
        } finally {
            mSettingsValuesLock.unlock();
        }
    }

    // TODO: Remove this method and add proxy method to SettingsValues.