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