From 3815561997eced7fd773062ce32eaa50bece072c Mon Sep 17 00:00:00 2001 From: PauloftheWest Date: Mon, 30 Jun 2014 10:02:36 -0700 Subject: [PATCH] Added SIM Card Activity to Settings + Added SIM Card menu to Settings menu + Added SIM card detail dialog when selecting a SIM Card + Added ability to select the default SIM for Cellular data, Calls, and SMS Bug: 16241745 Change-Id: I43437aa4c591c5097a8865d564f88726671e1b7d --- AndroidManifest.xml | 14 + res/drawable-hdpi/ic_sim_sd.png | Bin 0 -> 836 bytes res/drawable-mdpi/ic_sim_sd.png | Bin 0 -> 700 bytes res/drawable-xhdpi/ic_sim_sd.png | Bin 0 -> 912 bytes res/drawable-xxhdpi/ic_sim_sd.png | Bin 0 -> 1144 bytes res/drawable-xxxhdpi/ic_sim_sd.png | Bin 0 -> 1541 bytes res/layout/multi_sim_dialog.xml | 114 ++++++ res/values/dimens.xml | 9 + res/values/strings.xml | 4 + res/xml/dashboard_categories.xml | 8 + res/xml/sim_settings.xml | 44 +++ src/com/android/settings/Settings.java | 1 + .../android/settings/SettingsActivity.java | 8 +- .../notification/DropDownPreference.java | 7 +- src/com/android/settings/search/Ranking.java | 41 +- .../search/SearchIndexableResources.java | 8 + src/com/android/settings/sim/SimSettings.java | 373 ++++++++++++++++++ 17 files changed, 611 insertions(+), 20 deletions(-) create mode 100644 res/drawable-hdpi/ic_sim_sd.png create mode 100644 res/drawable-mdpi/ic_sim_sd.png create mode 100644 res/drawable-xhdpi/ic_sim_sd.png create mode 100644 res/drawable-xxhdpi/ic_sim_sd.png create mode 100644 res/drawable-xxxhdpi/ic_sim_sd.png create mode 100644 res/layout/multi_sim_dialog.xml create mode 100644 res/xml/sim_settings.xml create mode 100644 src/com/android/settings/sim/SimSettings.java diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 17f1e542a79..72defac760c 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -1896,6 +1896,20 @@ android:resource="@xml/file_paths" /> + + + + + + + + + + |k1|%Oc%$NbBSkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?skwBzpw;GB8xBF)%c=FfjZA3N^f7U???UV0e|lz+eS5K)hhiu0R{01Y44~ zy9>jA5L~c#`DCC7XMsm#F_88EW4Dvpb_@(mBAzaeArXh)&N!bZY$(ufZ|PYA>C^n{e;h4#PZ)qQ})z>B-5T8)q4a-O&4x z*bx07s>&p&@|;{kPeR%OI|HV5SDx40Jh1(%&0U83jT=i27d){)&#>z7mxh%Id?t}6 zx1E3TSo%ZYuQUA@jxia`XEkP3J1{eAb?E<~oq_jVa?_bVh*hW^xYcy4aaQ`VgEfKo zRX?y*aK1V5(eQ)Q(}-H@1KJO^9#fd1zA^K$!`BmEwoclZux#GbmRAert*(7-Tl{Nh zy70X9JPUr9)iUw1KI=DJ$r+Vn)cEMO3ERFZgYKBNn?dYV7H{8O_ubYnrEXP<9+ z%N^c5(>rts6XMW$3FWx=Ti>AE#eA{!!9F0H0k<4owuQ_BZ ztgpZ6UA)xc!}R^tVvN7^Kdor!s$0sv^y>G;jK6qeJjy#8L#OPliDM|YbeQ&P{dv)X zS6^p~imERU@obNiSo>^sZP61W;n^YbKi@A|@3cXB{l@(fRsl zlJCkRA+vSnZiuqWy{cptHiD0w}V+aP=h4MhT#0PlJdl&R0hYC h{G?O`&)mfH)S%SFl*+=Bsi4%%;OXk;vd$@?2>>qoUL61c literal 0 HcmV?d00001 diff --git a/res/drawable-mdpi/ic_sim_sd.png b/res/drawable-mdpi/ic_sim_sd.png new file mode 100644 index 0000000000000000000000000000000000000000..19266089bccd058e00733bd6d8090b8a7c629819 GIT binary patch literal 700 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaL-l0AZa85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YPV z+ueoXKL{?^yL>WGgtNdSvKUBvfU(=jY&)RwJ)SO(As)xyPTTKy*g)V|y%}p~*EBsH z8wQRFsd>$7PIm^|^#p!`6jg6&$P?#U$QC9FA2 z*$1RIFol$!5na4c>W@$AEyia{pUGCvXIOt=`9=BAMLD5AIR1F2E}ie1{ABkz1)ZbL zjPJe84sKMGthm^G-sr;SMdvv-eT`->n_B!LkatIT@7~~FYZ<~Dr(1M;xx6^`g4eYF zt3ajDPs!g4cAWEMNqNa?tKt5@>xHuIhcgv_gnfJ;{F`+}X+|d7$@Kxp5+bZC6C|fG z@a{`4FPi?Pei7$s4~g7^5+@Y|H_2^ak74o-b78$$eTg|e-k@zdOYEY6S=kTRBIYde z;j2)${?cyF{W|`Mr~is85%Ga*Cfa9xzApWM{daEqMFU~qW55VfEpd$~Nl7e8wMs5Z z1yT$~28JfO2IjhkW+8^=Rz^lvK(>Lom4QK*Y~O7Z4Y~O#nQ4`{HT-rkO9yI@1lbUr rpH@NS%G}U;vjb? zhIQv;UIIA^$sR$z3=CCj3=9n|3=F@3LJcn%7)pVryh>nTu$sZZAYL$MSD+10f-TA0 z-G$*l2rk&Wd@@jkv%n*=7)X17vD?XPI|c@(1Wy;okc@k8XT|1Sb`WW`U)~Vq!Q#J$ zG2~i9OM-c=i_;R3BmUlD7oIA#B(OI;XcYax(zImDAv6Bs_MXdyHOC*9Tsr06WwdYO z`#HwN&(-%aKbMJAkK)Nx0+%h)2b)zPIVG5zv~-Z zHuL!1_3VkU;(X@w4Y3bSWF8HWVSL~C{6PB0;47UO>I>%m;m+JRLvF+QdiHnB^BWkg zA0H|&uF(E@(q8maCGSF`1AGNMcUZpJd<`pDsr*Ub@U9I*o%Io;Gcy=|h$ie;y8gW( z`+!Kf%@&~t>igB76el>JxWiU=V(<0F{GffTe{we5XV}M}yz`#O{;d}{KTNJ?+B0cW z@6R9?pQpFZ`DnbAzS17*&G_}n_oaI*`Zo2Q($bMXQuk>$_Y-k#U283Ot`C#tnc2Nh z%(wi**$6iwnk8nyp%ag;k}(ekJH#+QcJL-MQ>&Km?Th`r!;?yvH* z*~Y!LP7Q@Y31So5`_^jaw9Tlz6Fb9f>7UR{d7%xmnX}wtFG;m;W3S=ZxY}7WM|1=1;h&)K=ZSTcmEXH*L$WSvpXIB*=!~{Irtt#G+IN$CUh}R0Yr6#Prml)Wnp^!jq|>oWbDf>gTe~ HDWM4faT|BB literal 0 HcmV?d00001 diff --git a/res/drawable-xxhdpi/ic_sim_sd.png b/res/drawable-xxhdpi/ic_sim_sd.png new file mode 100644 index 0000000000000000000000000000000000000000..e05e7adc25467e94031df5a97318dff7637cbf06 GIT binary patch literal 1144 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1|&n@ZgvM!Ea{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaL-l0AZa85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YPV z+ueoXKL{?^yL>WGgtNdSvKUB%?PPE}nQh0w!0h4a;uunK>+PJ=dBTPw4(FGcWF6_# zz0Y9JP{SB~giBzmRi=*utx6G_(}Kko)Umx{|8S#}+na@3!$jrqA+y36oaHtj zE&A^%htBPpbF28-uc|pWSX~39RJ@~Zck90RcIN$*9ag*dKG?oY*ksZq#>!1q3sYYk zm$G?zDX)m}TmCSr_yL2&t?O&|A7`92OWZ_HeRJ;~{yWQVdi-MD!@jNY`T_Gl(jkGD zCQ6>z$!?ReCC-`MBDr3VaeAZeACFZI+7o4R7QbWSe_MFDQe*qqFO9(mydTW4jsLl8 zwqQul92sHD{x=(~@2kw*yD!v7&x&`B@`qzb#6#|_eP8o26{y4$BpL zqQ5ryR=;sS=igOs%zSOn^^K=?I9PCQd0Q>SJxj)Nw#e?Qb_IKuEX+Qj?$gv8dTcpw zisIoK8ONtZe@-+emH+EI$!pi#cIrx6mE+OO!vddsKF>(n{wZ>0fnL~5NlvN$IbzSw zeQi(=kzD(a_vL?Q2`k^KMNX3&i z2}-HV6>0zDx>Y-5+#~q3-iN(D5Ukc8#_d}QRQ!rf*-~>E|4B~Sqkk^GQu}ac-umei zR`-}~Jf$M=goUT!^^7^jzT2fjEW}s)2stJwJ)Jex`0biM8b{f8ZEZWHA~+@anUVB1 zN4@t~7Bbg7`#f!i~AO2oW3o__%;cb{sp@fHeb1x zyEV?_j?^)E2f0l-7A8%64dp#%XY_CK2R!PDxUtVv-Sb=vgo~x``S)5Uhrpizj^jIUoK!)OztvEOmwat!;9*j(+GeI{t^TZ`a-G<|F&=12dRviEBhjN@7W> zRdP`(kYX@0Ff`FMFxNFS3o$geGBUCPvJK3w3=Fzt`);FX$jwj5OsmAL;kScXI#7co u$cEtjw370~qErUQl>DSr1<%~X^wgl##FWaylc}H*fWgz%&t;ucLK6VBY21SV literal 0 HcmV?d00001 diff --git a/res/drawable-xxxhdpi/ic_sim_sd.png b/res/drawable-xxxhdpi/ic_sim_sd.png new file mode 100644 index 0000000000000000000000000000000000000000..b12e34efdfb997fdba375785c9f2f9625e00bc39 GIT binary patch literal 1541 zcmbVLeNYr-9Dea6$<(YlC4y{QDV1SwcW;lo+mnOSJ5J6xB*46w99j0>gGKK4+FiT@ z^&7!Pu=Jn_5qP1(VL@+&Pc{Y3_z15FjU&q> zj*WyUE6w<*D3>!2vx*YL(lluVPibk)z-s6;9ZS=xn3kd$lBP&4OVG4QXE4!vZ0x~N zHp%TV<=gCIxzNmvmnn+hM3R9(KoejzqEt%KEX$IVmegtq6hX*UK7|VsK6!SO!3Jes z68wrF`mhKiS0Yv_W*jLUJ%ZQobdD4IG%P!=mC9^Hp$b`*@fdvKyiAW~ymA_?eHxC)!dS9+mOaoEf_+R?ZLw~1mn4_%_8 z2*${J2pyv{5S-h?5pKxqS*YU;B~TmXxgXw6X^pJio<->l6isL8j9P;(%V54fc`eI9jv^@9s3&wDK8-LMX&u2a6k~vV3FHiVd<^gY zzvhuh6d9?M|5Q$N36*1HINk?nGTuqhhuTL%eX@Stq+$Rj%yrln6b66!?ZP*U4;QPC z4DBkP5l=&KLE+E0q#a)!>tx#KY#wz>nAtnEblGq zZMyT_C#`q)Zt6?QV82Y7yMjq&p4p!&lk&67J79tS6hn&NF3? zP_|76Vq+}#AmRY1>r}1rw6+`K!H3M0-v=gG%!fgX2J~MGeLiJt_|451k}N;JxCc&e zoO!!w+39O3+3}v%j=bUOJ+MJzt^DCs!nV(He!A5C{t!LTq<{I=tj77fUhOK13*DW6 z)6v_p{&X15>gH3vKYBL1{8DOvMG}%(Gjmi1eXIqjz`$EoimQBJGui--tX$g{3yatN E1EjedqyPW_ literal 0 HcmV?d00001 diff --git a/res/layout/multi_sim_dialog.xml b/res/layout/multi_sim_dialog.xml new file mode 100644 index 00000000000..070b64ea971 --- /dev/null +++ b/res/layout/multi_sim_dialog.xml @@ -0,0 +1,114 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/values/dimens.xml b/res/values/dimens.xml index eda676f4c19..4d06c1c727c 100755 --- a/res/values/dimens.xml +++ b/res/values/dimens.xml @@ -192,4 +192,13 @@ 40dp + + 8dip + + 16dip + + 8dip + + 32 + diff --git a/res/values/strings.xml b/res/values/strings.xml index 76fdafc0961..1298289b2a4 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -5422,6 +5422,8 @@ SIM cards SIM cards + + %1$s - %2$s SIM cards have changed @@ -5436,6 +5438,8 @@ Select a SIM card SIM %1$d + + SIM empty SIM name diff --git a/res/xml/dashboard_categories.xml b/res/xml/dashboard_categories.xml index 53a6d5a6928..01a4f8386c1 100644 --- a/res/xml/dashboard_categories.xml +++ b/res/xml/dashboard_categories.xml @@ -38,6 +38,14 @@ android:icon="@drawable/ic_settings_bluetooth2" /> + + + + + + + + + + + + + + + + + + + + diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java index 01149f32b21..fcaa7aeb46f 100644 --- a/src/com/android/settings/Settings.java +++ b/src/com/android/settings/Settings.java @@ -28,6 +28,7 @@ public class Settings extends SettingsActivity { */ public static class BluetoothSettingsActivity extends SettingsActivity { /* empty */ } public static class WirelessSettingsActivity extends SettingsActivity { /* empty */ } + public static class SimSettingsActivity extends SettingsActivity { /* empty */ } public static class TetherSettingsActivity extends SettingsActivity { /* empty */ } public static class VpnSettingsActivity extends SettingsActivity { /* empty */ } public static class DateTimeSettingsActivity extends SettingsActivity { /* empty */ } diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java index 90e8fd4f536..bd53eb66478 100644 --- a/src/com/android/settings/SettingsActivity.java +++ b/src/com/android/settings/SettingsActivity.java @@ -100,6 +100,7 @@ import com.android.settings.notification.NotificationStation; import com.android.settings.notification.ZenModeSettings; import com.android.settings.print.PrintJobSettingsFragment; import com.android.settings.print.PrintSettingsFragment; +import com.android.settings.sim.SimSettings; import com.android.settings.tts.TextToSpeechSettings; import com.android.settings.users.UserSettings; import com.android.settings.vpn2.VpnSettings; @@ -204,6 +205,7 @@ public class SettingsActivity extends Activity R.id.wifi_settings, R.id.bluetooth_settings, R.id.data_usage_settings, + R.id.sim_settings, R.id.wireless_settings, R.id.device_section, R.id.notification_settings, @@ -234,6 +236,7 @@ public class SettingsActivity extends Activity SavedAccessPointsWifiSettings.class.getName(), BluetoothSettings.class.getName(), MessageAccessSettings.class.getName(), + SimSettings.class.getName(), TetherSettings.class.getName(), WifiP2pSettings.class.getName(), VpnSettings.class.getName(), @@ -1034,7 +1037,10 @@ public class SettingsActivity extends Activity curBundle = null; } - category.addTile(tile); + // Show the SIM Cards setting if there are more than 2 SIMs installed. + if(tile.id != R.id.sim_settings || SimSettings.showSimCardScreen(this)){ + category.addTile(tile); + } } else { XmlUtils.skipCurrentTag(parser); diff --git a/src/com/android/settings/notification/DropDownPreference.java b/src/com/android/settings/notification/DropDownPreference.java index 45c83a5d2f9..1d1b366785b 100644 --- a/src/com/android/settings/notification/DropDownPreference.java +++ b/src/com/android/settings/notification/DropDownPreference.java @@ -106,6 +106,11 @@ public class DropDownPreference extends Preference { mValues.add(value); } + public void clearItems(){ + mAdapter.clear(); + mValues.clear(); + } + @Override protected void onBindView(View view) { super.onBindView(view); @@ -123,4 +128,4 @@ public class DropDownPreference extends Preference { public interface Callback { boolean onItemSelected(int pos, Object value); } -} \ No newline at end of file +} diff --git a/src/com/android/settings/search/Ranking.java b/src/com/android/settings/search/Ranking.java index 96e057e0d63..44717c15443 100644 --- a/src/com/android/settings/search/Ranking.java +++ b/src/com/android/settings/search/Ranking.java @@ -41,6 +41,7 @@ import com.android.settings.notification.NotificationSettings; import com.android.settings.notification.OtherSoundSettings; import com.android.settings.notification.ZenModeSettings; import com.android.settings.print.PrintSettingsFragment; +import com.android.settings.sim.SimSettings; import com.android.settings.users.UserSettings; import com.android.settings.wifi.AdvancedWifiSettings; import com.android.settings.wifi.SavedAccessPointsWifiSettings; @@ -55,24 +56,25 @@ public final class Ranking { public static final int RANK_WIFI = 1; public static final int RANK_BT = 2; - public static final int RANK_DATA_USAGE = 3; - public static final int RANK_WIRELESS = 4; - public static final int RANK_HOME = 5; - public static final int RANK_DISPLAY = 6; - public static final int RANK_WALLPAPER = 7; - public static final int RANK_NOTIFICATIONS = 8; - public static final int RANK_MEMORY = 9; - public static final int RANK_POWER_USAGE = 10; - public static final int RANK_USERS = 11; - public static final int RANK_LOCATION = 12; - public static final int RANK_SECURITY = 13; - public static final int RANK_IME = 14; - public static final int RANK_PRIVACY = 15; - public static final int RANK_DATE_TIME = 16; - public static final int RANK_ACCESSIBILITY = 17; - public static final int RANK_PRINTING = 18; - public static final int RANK_DEVELOPEMENT = 19; - public static final int RANK_DEVICE_INFO = 20; + public static final int RANK_SIM = 3; + public static final int RANK_DATA_USAGE = 4; + public static final int RANK_WIRELESS = 5; + public static final int RANK_HOME = 6; + public static final int RANK_DISPLAY = 7; + public static final int RANK_WALLPAPER = 8; + public static final int RANK_NOTIFICATIONS = 9; + public static final int RANK_MEMORY = 10; + public static final int RANK_POWER_USAGE = 11; + public static final int RANK_USERS = 12; + public static final int RANK_LOCATION = 13; + public static final int RANK_SECURITY = 14; + public static final int RANK_IME = 15; + public static final int RANK_PRIVACY = 16; + public static final int RANK_DATE_TIME = 17; + public static final int RANK_ACCESSIBILITY = 18; + public static final int RANK_PRINTING = 19; + public static final int RANK_DEVELOPEMENT = 20; + public static final int RANK_DEVICE_INFO = 21; public static final int RANK_UNDEFINED = -1; public static final int RANK_OTHERS = 1024; @@ -93,6 +95,9 @@ public final class Ranking { sRankMap.put(BluetoothSettings.class.getName(), RANK_BT); sRankMap.put(MessageAccessSettings.class.getName(), RANK_BT); + // SIM Cards + sRankMap.put(SimSettings.class.getName(), RANK_SIM); + // DataUsage sRankMap.put(DataUsageSummary.class.getName(), RANK_DATA_USAGE); sRankMap.put(DataUsageMeteredSettings.class.getName(), RANK_DATA_USAGE); diff --git a/src/com/android/settings/search/SearchIndexableResources.java b/src/com/android/settings/search/SearchIndexableResources.java index 4749733ed41..a3d2b8d713f 100644 --- a/src/com/android/settings/search/SearchIndexableResources.java +++ b/src/com/android/settings/search/SearchIndexableResources.java @@ -44,6 +44,7 @@ import com.android.settings.notification.NotificationSettings; import com.android.settings.notification.OtherSoundSettings; import com.android.settings.notification.ZenModeSettings; import com.android.settings.print.PrintSettingsFragment; +import com.android.settings.sim.SimSettings; import com.android.settings.users.UserSettings; import com.android.settings.wifi.AdvancedWifiSettings; import com.android.settings.wifi.SavedAccessPointsWifiSettings; @@ -88,6 +89,13 @@ public final class SearchIndexableResources { BluetoothSettings.class.getName(), R.drawable.ic_settings_bluetooth2)); + sResMap.put(SimSettings.class.getName(), + new SearchIndexableResource( + Ranking.getRankForClassName(SimSettings.class.getName()), + R.xml.sim_settings, + SimSettings.class.getName(), + R.drawable.ic_sim_sd)); + sResMap.put(MessageAccessSettings.class.getName(), new SearchIndexableResource( Ranking.getRankForClassName(MessageAccessSettings.class.getName()), diff --git a/src/com/android/settings/sim/SimSettings.java b/src/com/android/settings/sim/SimSettings.java new file mode 100644 index 00000000000..2e1c0f5bc8b --- /dev/null +++ b/src/com/android/settings/sim/SimSettings.java @@ -0,0 +1,373 @@ +/* + * Copyright (C) 2014 The Android Open Source 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 com.android.settings.sim; + +import com.android.settings.R; + +import android.app.AlertDialog; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.DialogInterface; +import android.content.res.Resources; +import android.os.Bundle; +import android.os.IBinder; +import android.os.RemoteException; +import android.os.UserHandle; +import android.preference.ListPreference; +import android.preference.Preference; +import android.preference.PreferenceCategory; +import android.preference.Preference.OnPreferenceChangeListener; +import android.preference.PreferenceScreen; +import android.telephony.SubInfoRecord; +import android.telephony.SubscriptionManager; +import android.telephony.TelephonyManager; +import android.telecomm.PhoneAccount; +import android.telephony.CellInfo; +import android.text.TextUtils; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.ArrayAdapter; +import android.widget.EditText; +import android.widget.FrameLayout; +import android.widget.ImageView; +import android.widget.ListView; +import android.widget.Spinner; +import android.widget.TextView; + +import com.android.internal.telephony.PhoneConstants; +import com.android.internal.telephony.TelephonyIntents; +import com.android.settings.RestrictedSettingsFragment; +import com.android.settings.SettingsPreferenceFragment; +import com.android.settings.notification.DropDownPreference; +import com.android.settings.search.BaseSearchIndexProvider; +import com.android.settings.search.Indexable; +import com.android.settings.search.Indexable.SearchIndexProvider; +import com.android.settings.search.SearchIndexableRaw; + +import java.util.ArrayList; +import java.util.List; + +public class SimSettings extends RestrictedSettingsFragment implements Indexable { + private static final String TAG = "SimSettings"; + + private static final String DISALLOW_CONFIG_SIM = "no_config_sim"; + private static final String SIM_CARD_CATEGORY = "sim_cards"; + private static final String KEY_CELLULAR_DATA = "sim_cellular_data"; + private static final String KEY_CALLS = "sim_calls"; + private static final String KEY_SMS = "sim_sms"; + private static final String KEY_ACTIVITIES = "activities"; + + /** + * By UX design we have use only one Subscription Information(SubInfo) record per SIM slot. + * mAvalableSubInfos is the list of SubInfos we present to the user. + * mSubInfoList is the list of all SubInfos. + */ + private List mAvailableSubInfos = null; + private List mSubInfoList = null; + + private SubInfoRecord mCellularData = null; + private SubInfoRecord mCalls = null; + private SubInfoRecord mSMS = null; + + /** + * Return whether or not the user should have a SIM Cards option in Settings. + * TODO: Change back to returning true if count is greater than one after testing. + * TODO: See bug 16533525. + */ + public static boolean showSimCardScreen(Context context) { + final TelephonyManager tm = + (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); + + return tm.getSimCount() > 0; + } + + public SimSettings() { + super(DISALLOW_CONFIG_SIM); + } + + @Override + public void onCreate(final Bundle bundle) { + super.onCreate(bundle); + + if (mSubInfoList == null) { + mSubInfoList = SubscriptionManager.getActivatedSubInfoList(getActivity()); + } + + createPreferences(); + updateAllOptions(); + } + + private void createPreferences() { + final TelephonyManager tm = + (TelephonyManager) getActivity().getSystemService(Context.TELEPHONY_SERVICE); + + addPreferencesFromResource(R.xml.sim_settings); + + final PreferenceCategory simCards = (PreferenceCategory)findPreference(SIM_CARD_CATEGORY); + + final int numSlots = tm.getSimCount(); + mAvailableSubInfos = new ArrayList(numSlots); + for (int i = 0; i < numSlots; ++i) { + final SubInfoRecord sir = findRecordBySlotId(i); + simCards.addPreference(new SimPreference(getActivity(), sir, i)); + mAvailableSubInfos.add(sir); + } + + updateActivitesCategory(); + } + + private void updateAllOptions() { + updateSimSlotValues(); + updateActivitesCategory(); + } + + private void updateSimSlotValues() { + SubscriptionManager.getAllSubInfoList(getActivity()); + final PreferenceCategory simCards = (PreferenceCategory)findPreference(SIM_CARD_CATEGORY); + final PreferenceScreen prefScreen = getPreferenceScreen(); + + final int prefSize = prefScreen.getPreferenceCount(); + for (int i = 0; i < prefSize; ++i) { + Preference pref = prefScreen.getPreference(i); + if (pref instanceof SimPreference) { + ((SimPreference)pref).update(); + } + } + } + + private void updateActivitesCategory() { + createDropDown((DropDownPreference) findPreference(KEY_CELLULAR_DATA)); + createDropDown((DropDownPreference) findPreference(KEY_CALLS)); + createDropDown((DropDownPreference) findPreference(KEY_SMS)); + + updateCellularDataValues(); + updateCallValues(); + updateSmsValues(); + } + + /** + * finds a record with subId. + * Since the number of SIMs are few, an array is fine. + */ + private SubInfoRecord findRecordBySubId(final long subId) { + final int availableSubInfoLength = mAvailableSubInfos.size(); + + for (int i = 0; i < availableSubInfoLength; ++i) { + final SubInfoRecord sir = mAvailableSubInfos.get(i); + if (sir != null && sir.mSubId == subId) { + return sir; + } + } + + return null; + } + + /** + * finds a record with slotId. + * Since the number of SIMs are few, an array is fine. + */ + private SubInfoRecord findRecordBySlotId(final int slotId) { + if (mSubInfoList != null){ + final int availableSubInfoLength = mSubInfoList.size(); + + for (int i = 0; i < availableSubInfoLength; ++i) { + final SubInfoRecord sir = mSubInfoList.get(i); + if (sir.mSlotId == slotId) { + //Right now we take the first subscription on a SIM. + return sir; + } + } + } + + return null; + } + + private void updateSmsValues() { + final DropDownPreference simPref = (DropDownPreference) findPreference(KEY_SMS); + final SubInfoRecord sir = findRecordBySubId(SubscriptionManager.getPreferredSmsSubId()); + if (sir != null) { + simPref.setSelectedItem(sir.mSlotId + 1); + } + } + + private void updateCellularDataValues() { + final DropDownPreference simPref = (DropDownPreference) findPreference(KEY_CELLULAR_DATA); + final SubInfoRecord sir = findRecordBySubId(SubscriptionManager.getDefaultDataSubId()); + if (sir != null) { + simPref.setSelectedItem(sir.mSlotId); + } + } + + private void updateCallValues() { + final DropDownPreference simPref = (DropDownPreference) findPreference(KEY_CALLS); + final SubInfoRecord sir = findRecordBySubId(SubscriptionManager.getDefaultVoiceSubId()); + if (sir != null) { + simPref.setSelectedItem(sir.mSlotId + 1); + } + } + + @Override + public void onResume() { + super.onResume(); + updateAllOptions(); + } + + @Override + public boolean onPreferenceTreeClick(final PreferenceScreen preferenceScreen, + final Preference preference) { + if (preference instanceof SimPreference) { + ((SimPreference)preference).createEditDialog((SimPreference)preference); + } + + return true; + } + + public void createDropDown(DropDownPreference preference) { + final DropDownPreference simPref = preference; + final String keyPref = simPref.getKey(); + final boolean askFirst = keyPref.equals(KEY_CALLS) || keyPref.equals(KEY_SMS); + + simPref.clearItems(); + + if (askFirst) { + simPref.addItem(getResources().getString( + R.string.sim_calls_ask_first_prefs_title), null); + } + + final int subAvailableSize = mAvailableSubInfos.size(); + for (int i = 0; i < subAvailableSize; ++i) { + final SubInfoRecord sir = mAvailableSubInfos.get(i); + if(sir != null){ + simPref.addItem(sir.mDisplayName, sir); + } + } + + simPref.setCallback(new DropDownPreference.Callback() { + @Override + public boolean onItemSelected(int pos, Object value) { + final long subId = value == null ? 0 : ((SubInfoRecord)value).mSubId; + + if (simPref.getKey().equals(KEY_CELLULAR_DATA)) { + SubscriptionManager.setDefaultDataSubId(subId); + } else if (simPref.getKey().equals(KEY_CALLS)) { + SubscriptionManager.setDefaultVoiceSubId(subId); + } else if (simPref.getKey().equals(KEY_SMS)) { + // TODO: uncomment once implemented. Bug: 16520931 + // SubscriptionManager.setDefaultSMSSubId(subId); + } + + updateAllOptions(); + + return true; + } + }); + } + + private void setActivity(Preference preference, SubInfoRecord sir) { + final String key = preference.getKey(); + + if (key.equals(KEY_CELLULAR_DATA)) { + mCellularData = sir; + } else if (key.equals(KEY_CALLS)) { + mCalls = sir; + } else if (key.equals(KEY_SMS)) { + mSMS = sir; + } + + updateActivitesCategory(); + } + + private class SimPreference extends Preference{ + private SubInfoRecord mSubInfoRecord; + private int mSlotId; + + public SimPreference(Context context, SubInfoRecord subInfoRecord, int slotId) { + super(context); + + mSubInfoRecord = subInfoRecord; + mSlotId = slotId; + setKey("sim" + mSlotId); + update(); + } + + public void update() { + final Resources res = getResources(); + + setTitle(res.getString(R.string.sim_card_number_title, mSlotId + 1)); + if (mSubInfoRecord != null) { + setSummary(res.getString(R.string.sim_settings_summary, + mSubInfoRecord.mDisplayName, mSubInfoRecord.mNumber)); + setEnabled(true); + } else { + setSummary(R.string.sim_slot_empty); + setFragment(null); + setEnabled(false); + } + } + + public void createEditDialog(SimPreference simPref) { + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); + + final View dialogLayout = getActivity().getLayoutInflater().inflate( + R.layout.multi_sim_dialog, null); + builder.setView(dialogLayout); + + EditText nameText = (EditText)dialogLayout.findViewById(R.id.sim_name); + nameText.setText(mSubInfoRecord.mDisplayName); + + TextView numberView = (TextView)dialogLayout.findViewById(R.id.number); + numberView.setText(mSubInfoRecord.mNumber); + + TextView carrierView = (TextView)dialogLayout.findViewById(R.id.carrier); + carrierView.setText(mSubInfoRecord.mDisplayName); + + builder.setTitle(R.string.sim_editor_title); + + builder.setPositiveButton(R.string.okay, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int whichButton) { + final EditText nameText = (EditText)dialogLayout.findViewById(R.id.sim_name); + final Spinner displayNumbers = + (Spinner)dialogLayout.findViewById(R.id.display_numbers); + + SubscriptionManager.setDisplayNumberFormat(getActivity(), + displayNumbers.getSelectedItemPosition() == 0 + ? SubscriptionManager.DISPLAY_NUMBER_LAST + : SubscriptionManager.DISPLAY_NUMBER_FIRST, mSubInfoRecord.mSubId); + + mSubInfoRecord.mDisplayName = nameText.getText().toString(); + SubscriptionManager.setDisplayName(getActivity(), mSubInfoRecord.mDisplayName, + mSubInfoRecord.mSubId); + + updateAllOptions(); + } + }); + + builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int whichButton) { + dialog.dismiss(); + } + }); + + builder.create().show(); + } + } +}