diff options
11 files changed, 331 insertions, 0 deletions
diff --git a/core/java/android/util/NativeTextHelper.java b/core/java/android/util/NativeTextHelper.java new file mode 100644 index 0000000..eb380e9 --- /dev/null +++ b/core/java/android/util/NativeTextHelper.java @@ -0,0 +1,92 @@ +/* + * Copyright (C) 2015, The Linux Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package android.util; + +import android.content.Context; + +/** + *@hide + */ +public class NativeTextHelper { + + /** + * parse the string to current language. + * + * @param context base context of the application + * @param originalString original string + * @param defPackage the target package where the local language strings + * defined + * @param originNamesId the id of the original string array. + * @param localNamesId the id of the local string keys. + * @return local language string + */ + private static final String getLocalString(Context context, String originalString, + String defPackage, int originNamesId, int localNamesId) { + String[] origNames = context.getResources().getStringArray(originNamesId); + String[] localNames = context.getResources().getStringArray(localNamesId); + for (int i = 0; i < origNames.length; i++) { + if (origNames[i].equalsIgnoreCase(originalString)) { + return context.getString(context.getResources().getIdentifier(localNames[i], + "string", defPackage)); + } + } + return originalString; + } + + /** + * parse the string to current language string in public resources. + * + * @param context base context of the application + * @param originalString original string + * @param originNamesId the id of the original string array. + * @param localNamesId the id of the local string keys. + * @return local language string + */ + public static final String getLocalString(Context context, String originalString, + int originNamesId, int localNamesId) { + return getLocalString(context, originalString, "android", originNamesId, localNamesId); + } + + /** + * parse the string to current language string in current resources. + * + * @param context base context of the application + * @param originalString original string + * @param originNamesId the id of the original string array. + * @param localNamesId the id of the local string keys. + * @return local language string + */ + public static final String getInternalLocalString(Context context, String originalString, + int originNamesId, + int localNamesId) { + return getLocalString(context, originalString, context.getPackageName(), originNamesId, + localNamesId); + } + +} diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index fcfc1ff..e2b0704 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -1523,4 +1523,8 @@ <item quantity="other">已选择 <xliff:g id="COUNT_1">%1$d</xliff:g> 项</item> <item quantity="one">已选择 <xliff:g id="COUNT_0">%1$d</xliff:g> 项</item> </plurals> + <!-- Carrier Name --> + <string name="China_Mobile">中国移动</string> + <string name="China_Unicom">中国联通</string> + <string name="China_Telecom">中国电信</string> </resources> diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml index ffa6fb1..188723e 100644 --- a/core/res/res/values-zh-rHK/strings.xml +++ b/core/res/res/values-zh-rHK/strings.xml @@ -1516,4 +1516,8 @@ <item quantity="other">已選取 <xliff:g id="COUNT_1">%1$d</xliff:g> 個項目</item> <item quantity="one">已選取 <xliff:g id="COUNT_0">%1$d</xliff:g> 個項目</item> </plurals> + <!-- Carrier Name --> + <string name="China_Mobile">中國移動</string> + <string name="China_Unicom">中國聯通</string> + <string name="China_Telecom">中國電信</string> </resources> diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index e4089b5..ffae186 100755 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -2323,4 +2323,47 @@ <!-- Configuration that determines if PROTOCOL_ERRORS is to be treated as a permanent error --> <bool translatable="false" name="config_protocol_errors_perm_failure">true</bool> + + <string-array name="origin_carrier_names"> + <item>CHINA\u0020\u0020MOBILE</item> + <item>CMCC</item> + <item>CHN-UNICOM</item> + <item>China Mobile</item> + <item>China Unicom</item> + <item>China Telecom</item> + <item>中国移动</item> + <item>中国联通</item> + <item>中国电信</item> + <item>中國移動</item> + <item>中國聯通</item> + <item>中國電信</item> + <item>Searching for Service</item> + </string-array> + + <string-array name="locale_carrier_names"> + <item>China_Mobile</item> + <item>China_Mobile</item> + <item>China_Unicom</item> + <item>China_Mobile</item> + <item>China_Unicom</item> + <item>China_Telecom</item> + <item>China_Mobile</item> + <item>China_Unicom</item> + <item>China_Telecom</item> + <item>China_Mobile</item> + <item>China_Unicom</item> + <item>China_Telecom</item> + <item>roamingTextSearching</item> + </string-array> + + <!-- monitor locale change --> + <bool name="config_monitor_locale_change">false</bool> + + <!-- display for radio tech --> + <bool name="config_display_rat">false</bool> + + <!-- config 2G/3G/4G RAT strings for carriers --> + <string name="config_rat_2g" translatable="false">2G</string> + <string name="config_rat_3g" translatable="false">3G</string> + <string name="config_rat_4g" translatable="false">4G</string> </resources> diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index bec1600..51440e4 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -4120,4 +4120,9 @@ <item quantity="one"><xliff:g id="count" example="1">%1$d</xliff:g> selected</item> <item quantity="other"><xliff:g id="count" example="3">%1$d</xliff:g> selected</item> </plurals> + + <!-- Carrier Name --> + <string name="China_Mobile">China Mobile</string> + <string name="China_Unicom">China Unicom</string> + <string name="China_Telecom">China Telecom</string> </resources> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index bbf882a..535dbe1 100755 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -2376,4 +2376,19 @@ <!-- Data Connectivity Error Configurations --> <java-symbol type="bool" name="config_reject_ggsn_perm_failure" /> <java-symbol type="bool" name="config_protocol_errors_perm_failure" /> + + <!-- config 2G/3G/4G RAT strings for carriers --> + <java-symbol type="string" name="config_rat_2g" /> + <java-symbol type="string" name="config_rat_3g" /> + <java-symbol type="string" name="config_rat_4g" /> + + <!-- monitor locale change --> + <java-symbol type="bool" name="config_monitor_locale_change" /> + + <!-- display for radio tech --> + <java-symbol type="bool" name="config_display_rat" /> + + <java-symbol type="array" name="origin_carrier_names" /> + <java-symbol type="array" name="locale_carrier_names" /> + </resources> diff --git a/packages/Keyguard/src/com/android/keyguard/CarrierText.java b/packages/Keyguard/src/com/android/keyguard/CarrierText.java index f04db02..230ad42 100644 --- a/packages/Keyguard/src/com/android/keyguard/CarrierText.java +++ b/packages/Keyguard/src/com/android/keyguard/CarrierText.java @@ -28,6 +28,7 @@ import android.net.ConnectivityManager; import android.net.wifi.WifiManager; import android.telephony.ServiceState; import android.telephony.SubscriptionInfo; +import android.telephony.TelephonyManager; import android.text.TextUtils; import android.text.method.SingleLineTransformationMethod; import android.util.AttributeSet; @@ -153,15 +154,59 @@ public class CarrierText extends TextView { protected void updateCarrierText() { boolean allSimsMissing = true; boolean anySimReadyAndInService = false; + boolean showLocale = getContext().getResources().getBoolean( + com.android.internal.R.bool.config_monitor_locale_change); + boolean showRat = getContext().getResources().getBoolean( + com.android.internal.R.bool.config_display_rat); CharSequence displayText = null; List<SubscriptionInfo> subs = mKeyguardUpdateMonitor.getSubscriptionInfo(false); final int N = subs.size(); if (DEBUG) Log.d(TAG, "updateCarrierText(): " + N); for (int i = 0; i < N; i++) { + CharSequence networkClass = ""; int subId = subs.get(i).getSubscriptionId(); State simState = mKeyguardUpdateMonitor.getSimState(subId); + if (showRat) { + ServiceState ss = mKeyguardUpdateMonitor.mServiceStates.get(subId); + TelephonyManager tm = new TelephonyManager(getContext()); + if (ss != null && (ss.getDataRegState() == ServiceState.STATE_IN_SERVICE + || ss.getVoiceRegState() == ServiceState.STATE_IN_SERVICE)) { + int networkType = TelephonyManager.NETWORK_TYPE_UNKNOWN; + if (ss.getRilDataRadioTechnology() != + ServiceState.RIL_RADIO_TECHNOLOGY_UNKNOWN) { + networkType = ss.getDataNetworkType(); + } else if (ss.getRilVoiceRadioTechnology() != + ServiceState.RIL_RADIO_TECHNOLOGY_UNKNOWN) { + networkType = ss.getVoiceNetworkType(); + } + networkClass = tm.networkClassToString(networkType); + } + } CharSequence carrierName = subs.get(i).getCarrierName(); + if (showLocale || showRat) { + String[] names = carrierName.toString().split(mSeparator.toString(), 2); + StringBuilder newCarrierName = new StringBuilder(); + for (int j = 0; j < names.length; j++) { + if (showLocale) { + names[j] = android.util.NativeTextHelper.getLocalString(getContext(), + names[j], com.android.internal.R.array.origin_carrier_names, + com.android.internal.R.array.locale_carrier_names); + } + if (!TextUtils.isEmpty(names[j])) { + if (!TextUtils.isEmpty(networkClass) && showRat) { + names[j] = new StringBuilder().append(names[j]).append(" ") + .append(networkClass).toString(); + } + if (j > 0 && names[j].equals(names[j-1])) { + continue; + } + if (j > 0) newCarrierName.append(mSeparator); + newCarrierName.append(names[j]); + } + } + carrierName = newCarrierName.toString(); + } CharSequence carrierTextForSimState = getCarrierTextForSimState(simState, carrierName); if (DEBUG) { Log.d(TAG, "Handling (subId=" + subId + "): " + simState + " " + carrierName); diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java index 2f00bb1..eabfc34 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -141,6 +141,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { private static final int MSG_SIM_SUBSCRIPTION_INFO_CHANGED = 328; private static final int MSG_AIRPLANE_MODE_CHANGED = 329; private static final int MSG_SERVICE_STATE_CHANGE = 330; + private static final int MSG_LOCALE_CHANGED = 500; private static KeyguardUpdateMonitor sInstance; @@ -247,6 +248,9 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { case MSG_SERVICE_STATE_CHANGE: handleServiceStateChange(msg.arg1, (ServiceState) msg.obj); break; + case MSG_LOCALE_CHANGED: + handleLocaleChanged(); + break; } } }; @@ -593,6 +597,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { } mHandler.sendMessage( mHandler.obtainMessage(MSG_SERVICE_STATE_CHANGE, subId, 0, serviceState)); + } else if (Intent.ACTION_LOCALE_CHANGED.equals(action)) { + mHandler.sendEmptyMessage(MSG_LOCALE_CHANGED); } } }; @@ -836,6 +842,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { filter.addAction(Intent.ACTION_BATTERY_CHANGED); filter.addAction(Intent.ACTION_TIMEZONE_CHANGED); filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED); + filter.addAction(Intent.ACTION_LOCALE_CHANGED); filter.addAction(TelephonyIntents.ACTION_SIM_STATE_CHANGED); filter.addAction(TelephonyIntents.ACTION_SERVICE_STATE_CHANGED); filter.addAction(TelephonyManager.ACTION_PHONE_STATE_CHANGED); @@ -1159,6 +1166,18 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { } /** + * Handle {@link #MSG_LOCALE_CHANGED} + */ + private void handleLocaleChanged() { + for (int j = 0; j < mCallbacks.size(); j++) { + KeyguardUpdateMonitorCallback cb = mCallbacks.get(j).get(); + if (cb != null) { + cb.onRefreshCarrierInfo(); + } + } + } + + /** * Handle {@link #MSG_SERVICE_STATE_CHANGE} */ private void handleServiceStateChange(int subId, ServiceState serviceState) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java index 62f1ec4..631a4d0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java @@ -57,6 +57,12 @@ public class MobileSignalController extends SignalController< // @VisibleForDemoMode final SparseArray<MobileIconGroup> mNetworkToIconLookup; + private boolean mLastShowSpn; + private String mLastSpn; + private String mLastDataSpn; + private boolean mLastShowPlmn; + private String mLastPlmn; + // Since some pieces of the phone state are interdependent we store it locally, // this could potentially become part of MobileState for simplification/complication // of code. @@ -333,6 +339,11 @@ public class MobileSignalController extends SignalController< } else if (action.equals(TelephonyIntents.ACTION_DEFAULT_DATA_SUBSCRIPTION_CHANGED)) { updateDataSim(); notifyListenersIfNecessary(); + } else if (action.equals(Intent.ACTION_LOCALE_CHANGED)) { + if (mConfig.showLocale) { + updateNetworkName(mLastShowSpn, mLastSpn, mLastDataSpn, mLastShowPlmn, mLastPlmn); + notifyListenersIfNecessary(); + } } } @@ -352,27 +363,75 @@ public class MobileSignalController extends SignalController< } } + private String getLocalString(String originalString) { + return android.util.NativeTextHelper.getLocalString(mContext, originalString, + com.android.internal.R.array.origin_carrier_names, + com.android.internal.R.array.locale_carrier_names); + } + + private String getNetworkClassString(ServiceState state) { + if (state != null && (state.getDataRegState() == ServiceState.STATE_IN_SERVICE || + state.getVoiceRegState() == ServiceState.STATE_IN_SERVICE)) { + int voiceNetType = state.getVoiceNetworkType(); + int dataNetType = state.getDataNetworkType(); + int chosenNetType = + ((dataNetType == TelephonyManager.NETWORK_TYPE_UNKNOWN) + ? voiceNetType : dataNetType); + TelephonyManager tm = (TelephonyManager)mContext.getSystemService( + Context.TELEPHONY_SERVICE); + return tm.networkClassToString(chosenNetType); + } else { + return ""; + } + } + /** * Updates the network's name based on incoming spn and plmn. */ void updateNetworkName(boolean showSpn, String spn, String dataSpn, boolean showPlmn, String plmn) { + mLastShowSpn = showSpn; + mLastSpn = spn; + mLastDataSpn = dataSpn; + mLastShowPlmn = showPlmn; + mLastPlmn = plmn; if (CHATTY) { Log.d("CarrierLabel", "updateNetworkName showSpn=" + showSpn + " spn=" + spn + " dataSpn=" + dataSpn + " showPlmn=" + showPlmn + " plmn=" + plmn); } + if (mConfig.showLocale) { + if (showSpn && !TextUtils.isEmpty(spn)) { + spn = getLocalString(spn); + } + if (showSpn && !TextUtils.isEmpty(dataSpn)) { + dataSpn = getLocalString(dataSpn); + } + if (showPlmn && !TextUtils.isEmpty(plmn)) { + plmn = getLocalString(plmn); + } + } + if (showPlmn && showSpn && !TextUtils.isEmpty(spn) && !TextUtils.isEmpty(plmn) + && plmn.equals(spn)) { + showSpn = false; + } + String networkClass = getNetworkClassString(mServiceState); StringBuilder str = new StringBuilder(); StringBuilder strData = new StringBuilder(); if (showPlmn && plmn != null) { str.append(plmn); strData.append(plmn); + if (mConfig.showRat) { + str.append(" ").append(networkClass); + strData.append(" ").append(networkClass); + } } if (showSpn && spn != null) { if (str.length() != 0) { str.append(mNetworkNameSeparator); } str.append(spn); + if (mConfig.showRat) str.append(" ").append(networkClass); } if (str.length() != 0) { mCurrentState.networkName = str.toString(); @@ -384,6 +443,7 @@ public class MobileSignalController extends SignalController< strData.append(mNetworkNameSeparator); } strData.append(dataSpn); + if (mConfig.showRat) strData.append(" ").append(networkClass); } if (strData.length() != 0) { mCurrentState.networkNameData = strData.toString(); @@ -694,6 +754,7 @@ public class MobileSignalController extends SignalController< + " dataState=" + state.getDataRegState()); } mServiceState = state; + updateNetworkName(mLastShowSpn, mLastSpn, mLastDataSpn, mLastShowPlmn, mLastPlmn); updateTelephony(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java index 9008e51..8fbf4b6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java @@ -210,6 +210,7 @@ public class NetworkControllerImpl extends BroadcastReceiver filter.addAction(TelephonyIntents.SPN_STRINGS_UPDATED_ACTION); filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); filter.addAction(ConnectivityManager.INET_CONDITION_ACTION); + filter.addAction(Intent.ACTION_LOCALE_CHANGED); filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED); mContext.registerReceiver(this, filter, null, mReceiverHandler); mListening = true; @@ -377,6 +378,10 @@ public class NetworkControllerImpl extends BroadcastReceiver } else if (action.equals(TelephonyIntents.ACTION_SIM_STATE_CHANGED)) { // Might have different subscriptions now. updateMobileControllers(); + } else if (action.equals(Intent.ACTION_LOCALE_CHANGED)) { + for (MobileSignalController controller : mMobileSignalControllers.values()) { + controller.handleBroadcast(intent); + } } else if (action.equals(TelephonyIntents.ACTION_SERVICE_STATE_CHANGED)) { mLastServiceState = ServiceState.newFromBundle(intent.getExtras()); if (mMobileSignalControllers.size() == 0) { @@ -828,6 +833,8 @@ public class NetworkControllerImpl extends BroadcastReceiver boolean hspaDataDistinguishable; boolean readIconsFromXml; boolean showRsrpSignalLevelforLTE; + boolean showLocale; + boolean showRat; static Config readConfig(Context context) { Config config = new Config(); @@ -842,6 +849,11 @@ public class NetworkControllerImpl extends BroadcastReceiver config.readIconsFromXml = res.getBoolean(R.bool.config_read_icons_from_xml); config.showRsrpSignalLevelforLTE = res.getBoolean(R.bool.config_showRsrpSignalLevelforLTE); + config.showLocale = + res.getBoolean(com.android.internal.R.bool.config_monitor_locale_change); + config.showRat = + res.getBoolean(com.android.internal.R.bool.config_display_rat); + return config; } } diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index 4799753..8ea496b 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -1642,6 +1642,37 @@ public class TelephonyManager { } } + /** + * convert network class to string base on network type + * @param type for which network type is returned + * @return the network class type string + * @hide + */ + public String networkClassToString(int type) { + String ratClassName = ""; + int networkClass = getNetworkClass(type); + Rlog.d(TAG, "networkType = " + type + " networkClass = " + networkClass); + if (mContext == null) return null; + switch (networkClass) { + case TelephonyManager.NETWORK_CLASS_2_G: + ratClassName = mContext.getResources().getString( + com.android.internal.R.string.config_rat_2g); + break; + case TelephonyManager.NETWORK_CLASS_3_G: + ratClassName = mContext.getResources().getString( + com.android.internal.R.string.config_rat_3g); + break; + case TelephonyManager.NETWORK_CLASS_4_G: + ratClassName = mContext.getResources().getString( + com.android.internal.R.string.config_rat_4g); + break; + default: + ratClassName = ""; + break; + } + return ratClassName; + } + // // // SIM Card |