10c3a9b549c3ff9bdf47c52cf59347f7e111dd183Tadashi G. Takaoka/*
20c3a9b549c3ff9bdf47c52cf59347f7e111dd183Tadashi G. Takaoka * Copyright (C) 2013 The Android Open Source Project
30c3a9b549c3ff9bdf47c52cf59347f7e111dd183Tadashi G. Takaoka *
40c3a9b549c3ff9bdf47c52cf59347f7e111dd183Tadashi G. Takaoka * Licensed under the Apache License, Version 2.0 (the "License");
50c3a9b549c3ff9bdf47c52cf59347f7e111dd183Tadashi G. Takaoka * you may not use this file except in compliance with the License.
60c3a9b549c3ff9bdf47c52cf59347f7e111dd183Tadashi G. Takaoka * You may obtain a copy of the License at
70c3a9b549c3ff9bdf47c52cf59347f7e111dd183Tadashi G. Takaoka *
80c3a9b549c3ff9bdf47c52cf59347f7e111dd183Tadashi G. Takaoka *      http://www.apache.org/licenses/LICENSE-2.0
90c3a9b549c3ff9bdf47c52cf59347f7e111dd183Tadashi G. Takaoka *
100c3a9b549c3ff9bdf47c52cf59347f7e111dd183Tadashi G. Takaoka * Unless required by applicable law or agreed to in writing, software
110c3a9b549c3ff9bdf47c52cf59347f7e111dd183Tadashi G. Takaoka * distributed under the License is distributed on an "AS IS" BASIS,
120c3a9b549c3ff9bdf47c52cf59347f7e111dd183Tadashi G. Takaoka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130c3a9b549c3ff9bdf47c52cf59347f7e111dd183Tadashi G. Takaoka * See the License for the specific language governing permissions and
140c3a9b549c3ff9bdf47c52cf59347f7e111dd183Tadashi G. Takaoka * limitations under the License.
150c3a9b549c3ff9bdf47c52cf59347f7e111dd183Tadashi G. Takaoka */
160c3a9b549c3ff9bdf47c52cf59347f7e111dd183Tadashi G. Takaoka
170c3a9b549c3ff9bdf47c52cf59347f7e111dd183Tadashi G. Takaokapackage com.android.inputmethod.latin.utils;
180c3a9b549c3ff9bdf47c52cf59347f7e111dd183Tadashi G. Takaoka
190c3a9b549c3ff9bdf47c52cf59347f7e111dd183Tadashi G. Takaokaimport android.content.res.Configuration;
200c3a9b549c3ff9bdf47c52cf59347f7e111dd183Tadashi G. Takaokaimport android.content.res.Resources;
210c3a9b549c3ff9bdf47c52cf59347f7e111dd183Tadashi G. Takaoka
220c3a9b549c3ff9bdf47c52cf59347f7e111dd183Tadashi G. Takaokaimport java.util.Locale;
230c3a9b549c3ff9bdf47c52cf59347f7e111dd183Tadashi G. Takaoka
240c3a9b549c3ff9bdf47c52cf59347f7e111dd183Tadashi G. Takaokapublic abstract class RunInLocale<T> {
250c3a9b549c3ff9bdf47c52cf59347f7e111dd183Tadashi G. Takaoka    private static final Object sLockForRunInLocale = new Object();
260c3a9b549c3ff9bdf47c52cf59347f7e111dd183Tadashi G. Takaoka
270c3a9b549c3ff9bdf47c52cf59347f7e111dd183Tadashi G. Takaoka    protected abstract T job(final Resources res);
280c3a9b549c3ff9bdf47c52cf59347f7e111dd183Tadashi G. Takaoka
290c3a9b549c3ff9bdf47c52cf59347f7e111dd183Tadashi G. Takaoka    /**
300c3a9b549c3ff9bdf47c52cf59347f7e111dd183Tadashi G. Takaoka     * Execute {@link #job(Resources)} method in specified system locale exclusively.
310c3a9b549c3ff9bdf47c52cf59347f7e111dd183Tadashi G. Takaoka     *
320c3a9b549c3ff9bdf47c52cf59347f7e111dd183Tadashi G. Takaoka     * @param res the resources to use.
335c490e5da5a1a403c307eb3660fe74158434a0dcTadashi G. Takaoka     * @param newLocale the locale to change to. Run in system locale if null.
340c3a9b549c3ff9bdf47c52cf59347f7e111dd183Tadashi G. Takaoka     * @return the value returned from {@link #job(Resources)}.
350c3a9b549c3ff9bdf47c52cf59347f7e111dd183Tadashi G. Takaoka     */
360c3a9b549c3ff9bdf47c52cf59347f7e111dd183Tadashi G. Takaoka    public T runInLocale(final Resources res, final Locale newLocale) {
370c3a9b549c3ff9bdf47c52cf59347f7e111dd183Tadashi G. Takaoka        synchronized (sLockForRunInLocale) {
38543d3d24bdfcdcae94f6c63331ba77c00842d489Tadashi G. Takaoka            final Configuration conf = res.getConfiguration();
39543d3d24bdfcdcae94f6c63331ba77c00842d489Tadashi G. Takaoka            if (newLocale == null || newLocale.equals(conf.locale)) {
405c490e5da5a1a403c307eb3660fe74158434a0dcTadashi G. Takaoka                return job(res);
415c490e5da5a1a403c307eb3660fe74158434a0dcTadashi G. Takaoka            }
42543d3d24bdfcdcae94f6c63331ba77c00842d489Tadashi G. Takaoka            final Locale savedLocale = conf.locale;
430c3a9b549c3ff9bdf47c52cf59347f7e111dd183Tadashi G. Takaoka            try {
44543d3d24bdfcdcae94f6c63331ba77c00842d489Tadashi G. Takaoka                conf.locale = newLocale;
45543d3d24bdfcdcae94f6c63331ba77c00842d489Tadashi G. Takaoka                res.updateConfiguration(conf, null);
460c3a9b549c3ff9bdf47c52cf59347f7e111dd183Tadashi G. Takaoka                return job(res);
470c3a9b549c3ff9bdf47c52cf59347f7e111dd183Tadashi G. Takaoka            } finally {
48543d3d24bdfcdcae94f6c63331ba77c00842d489Tadashi G. Takaoka                conf.locale = savedLocale;
49543d3d24bdfcdcae94f6c63331ba77c00842d489Tadashi G. Takaoka                res.updateConfiguration(conf, null);
500c3a9b549c3ff9bdf47c52cf59347f7e111dd183Tadashi G. Takaoka            }
510c3a9b549c3ff9bdf47c52cf59347f7e111dd183Tadashi G. Takaoka        }
520c3a9b549c3ff9bdf47c52cf59347f7e111dd183Tadashi G. Takaoka    }
530c3a9b549c3ff9bdf47c52cf59347f7e111dd183Tadashi G. Takaoka}
54