/* * Copyright (C) 2016 The CyanogenMod Project * Copyright (C) 2017-2018,2020 The LineageOS Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.lineageos.setupwizard; import android.app.Activity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.res.Configuration; import android.content.res.Resources; import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.widget.ArrayAdapter; import android.widget.NumberPicker; import android.widget.Toast; import com.android.internal.telephony.MccTable; import com.android.internal.telephony.TelephonyIntents; import org.lineageos.setupwizard.R; import org.lineageos.setupwizard.widget.LocalePicker; import java.util.List; import java.util.Locale; public class LocaleActivity extends BaseSetupWizardActivity { public static final String TAG = LocaleActivity.class.getSimpleName(); private ArrayAdapter mLocaleAdapter; private Locale mCurrentLocale; private int[] mAdapterIndices; private LocalePicker mLanguagePicker; private FetchUpdateSimLocaleTask mFetchUpdateSimLocaleTask; private final Handler mHandler = new Handler(); private boolean mPendingLocaleUpdate; private boolean mPaused = true; private final Runnable mUpdateLocale = new Runnable() { public void run() { if (mCurrentLocale != null) { mLanguagePicker.setEnabled(false); com.android.internal.app.LocalePicker.updateLocale(mCurrentLocale); } } }; private final BroadcastReceiver mSimChangedReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(TelephonyIntents.ACTION_SIM_STATE_CHANGED)) { fetchAndUpdateSimLocale(); } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setNextText(R.string.next); mLanguagePicker = (LocalePicker) findViewById(R.id.locale_list); loadLanguages(); } @Override public void onPause() { super.onPause(); mPaused = true; unregisterReceiver(mSimChangedReceiver); } @Override public void onResume() { super.onResume(); mPaused = false; registerReceiver(mSimChangedReceiver, new IntentFilter(TelephonyIntents.ACTION_SIM_STATE_CHANGED)); if (mLanguagePicker != null) { mLanguagePicker.setEnabled(true); } if (mPendingLocaleUpdate) { mPendingLocaleUpdate = false; fetchAndUpdateSimLocale(); } } @Override protected int getLayoutResId() { return R.layout.setup_locale; } @Override protected int getTitleResId() { return R.string.setup_locale; } @Override protected int getIconResId() { return R.drawable.ic_locale; } private void loadLanguages() { mLocaleAdapter = com.android.internal.app.LocalePicker.constructAdapter(this, R.layout.locale_picker_item, R.id.locale); mCurrentLocale = Locale.getDefault(); fetchAndUpdateSimLocale(); mAdapterIndices = new int[mLocaleAdapter.getCount()]; int currentLocaleIndex = 0; String [] labels = new String[mLocaleAdapter.getCount()]; for (int i=0; i setLocaleFromPicker()); mLanguagePicker.setOnScrollListener((view, scrollState) -> { if (scrollState == NumberPicker.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) { ((SetupWizardApp)getApplication()).setIgnoreSimLocale(true); } }); } private void setLocaleFromPicker() { ((SetupWizardApp)getApplication()).setIgnoreSimLocale(true); int i = mAdapterIndices[mLanguagePicker.getValue()]; final com.android.internal.app.LocalePicker.LocaleInfo localLocaleInfo = mLocaleAdapter.getItem(i); onLocaleChanged(localLocaleInfo.getLocale()); } private void onLocaleChanged(Locale paramLocale) { mLanguagePicker.setEnabled(true); Resources localResources = getResources(); Configuration localConfiguration1 = localResources.getConfiguration(); Configuration localConfiguration2 = new Configuration(); localConfiguration2.locale = paramLocale; localResources.updateConfiguration(localConfiguration2, null); localResources.updateConfiguration(localConfiguration1, null); mHandler.removeCallbacks(mUpdateLocale); mCurrentLocale = paramLocale; mHandler.postDelayed(mUpdateLocale, 1000); } private void fetchAndUpdateSimLocale() { if (((SetupWizardApp)getApplication()).ignoreSimLocale() || isDestroyed()) { return; } if (mPaused) { mPendingLocaleUpdate = true; return; } if (mFetchUpdateSimLocaleTask != null) { mFetchUpdateSimLocaleTask.cancel(true); } mFetchUpdateSimLocaleTask = new FetchUpdateSimLocaleTask(); mFetchUpdateSimLocaleTask.execute(); } private class FetchUpdateSimLocaleTask extends AsyncTask { @Override protected Locale doInBackground(Void... params) { Locale locale = null; Activity activity = LocaleActivity.this; if (!activity.isFinishing() || !activity.isDestroyed()) { // If the sim is currently pin locked, return TelephonyManager telephonyManager = (TelephonyManager) activity.getSystemService(Context.TELEPHONY_SERVICE); int state = telephonyManager.getSimState(); if(state == TelephonyManager.SIM_STATE_PIN_REQUIRED || state == TelephonyManager.SIM_STATE_PUK_REQUIRED) { return null; } final SubscriptionManager subscriptionManager = SubscriptionManager.from(activity); List activeSubs = subscriptionManager.getActiveSubscriptionInfoList(); if (activeSubs == null || activeSubs.isEmpty()) { return null; } // Fetch locale for active sim's MCC int mcc = activeSubs.get(0).getMcc(); locale = MccTable.getLocaleFromMcc(activity, mcc, null); // If that fails, fall back to preferred languages reported // by the sim if (locale == null) { String localeString = telephonyManager.getLocaleFromDefaultSim(); if (localeString != null) { locale = Locale.forLanguageTag(localeString); } } } return locale; } @Override protected void onPostExecute(Locale simLocale) { if (simLocale != null && !simLocale.equals(mCurrentLocale)) { if (!((SetupWizardApp)getApplication()).ignoreSimLocale() && !isDestroyed()) { String label = getString(R.string.sim_locale_changed, simLocale.getDisplayName()); Toast.makeText(LocaleActivity.this, label, Toast.LENGTH_SHORT).show(); onLocaleChanged(simLocale); ((SetupWizardApp)getApplication()).setIgnoreSimLocale(true); } } } } }