Merge "The main menu must not be set as a pending activity instance"
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index ff487ab..1beb3ae 100755
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -22,6 +22,8 @@
 
     <original-package android:name="com.android.stk" />
 
+    <protected-broadcast android:name="com.android.stk.DIALOG_ALARM_TIMEOUT" />
+
     <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
     <uses-permission android:name="android.permission.GET_TASKS"/>
     <uses-permission android:name="android.permission.RECEIVE_STK_COMMANDS" />
@@ -30,7 +32,9 @@
         android:label="@string/app_name"
         android:clearTaskOnLaunch="true"
         android:process="com.android.phone"
-        android:taskAffinity="android.task.stk">
+        android:taskAffinity="android.task.stk"
+        android:defaultToDeviceProtectedStorage="true"
+        android:directBootAware="true">
 
         <activity android:name="StkMain"
             android:theme="@android:style/Theme.NoDisplay"
@@ -92,7 +96,8 @@
 
         <activity android:name="ToneDialog"
             android:exported="false"
-            android:theme="@android:style/Theme.DeviceDefault.Dialog">
+            android:theme="@android:style/Theme.DeviceDefault.Dialog"
+            android:taskAffinity="android.task.stk.StkLauncherActivity">
         </activity>
 
         <receiver android:name="com.android.stk.StkCmdReceiver">
diff --git a/res/drawable-hdpi/ic_launcher_sim_toolkit.png b/res/drawable-hdpi/ic_launcher_sim_toolkit.png
index ce4ac43..51d6688 100644
--- a/res/drawable-hdpi/ic_launcher_sim_toolkit.png
+++ b/res/drawable-hdpi/ic_launcher_sim_toolkit.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_launcher_sim_toolkit.png b/res/drawable-mdpi/ic_launcher_sim_toolkit.png
index 0dfec74..913ab12 100755
--- a/res/drawable-mdpi/ic_launcher_sim_toolkit.png
+++ b/res/drawable-mdpi/ic_launcher_sim_toolkit.png
Binary files differ
diff --git a/res/values-kn-rIN/strings.xml b/res/values-kn-rIN/strings.xml
index 25f760b..795c6b9 100644
--- a/res/values-kn-rIN/strings.xml
+++ b/res/values-kn-rIN/strings.xml
@@ -23,7 +23,7 @@
     <string name="service_name" msgid="6860303747999592491">"ಸೇವೆಯ ಹೆಸರು"</string>
     <string name="stk_no_service" msgid="5427773116839809131">"ಯಾವುದೇ ಸೇವೆ ಲಭ್ಯವಿಲ್ಲ"</string>
     <string name="button_ok" msgid="5760722312558549555">"ಸರಿ"</string>
-    <string name="button_cancel" msgid="1997847915560800261">"ರದ್ದುಮಾಡು"</string>
+    <string name="button_cancel" msgid="1997847915560800261">"ರದ್ದುಮಾಡಿ"</string>
     <string name="button_yes" msgid="624420260648337203">"ಹೌದು"</string>
     <string name="button_no" msgid="1824959157582605627">"ಇಲ್ಲ"</string>
     <string name="alphabet" msgid="1583185545938805861">"ವರ್ಣಮಾಲೆಗಳು"</string>
diff --git a/res/values-my-rMM/strings.xml b/res/values-my-rMM/strings.xml
index 6314419..8853d46 100644
--- a/res/values-my-rMM/strings.xml
+++ b/res/values-my-rMM/strings.xml
@@ -19,18 +19,18 @@
     <string name="app_name" msgid="8396461461738434341">"SIM တူးလ်ကစ်"</string>
     <string name="menu_end_session" msgid="7368541737750982217">"သတ်မှတ်ကဏ္ဏကို ပြီးဆုံးမည်"</string>
     <string name="help" msgid="9209980881219397319">"အကူအညီ"</string>
-    <string name="menu_back" msgid="301227740977453364">"နောက်ပြန်"</string>
+    <string name="menu_back" msgid="301227740977453364">"နောက်သို့"</string>
     <string name="service_name" msgid="6860303747999592491">"ဝန်ဆောင်မှုအမည်"</string>
     <string name="stk_no_service" msgid="5427773116839809131">"ဆက်သွယ်ချိတ်ဆက်ရန် ဝန်ဆောင်မှု တစ်ခုမှမရှိပါ"</string>
     <string name="button_ok" msgid="5760722312558549555">"အိုကေ"</string>
-    <string name="button_cancel" msgid="1997847915560800261">"မလုပ်တော့ပါ"</string>
-    <string name="button_yes" msgid="624420260648337203">"မှန်ပါသည်"</string>
+    <string name="button_cancel" msgid="1997847915560800261">"မလုပ်တော့"</string>
+    <string name="button_yes" msgid="624420260648337203">"Yes"</string>
     <string name="button_no" msgid="1824959157582605627">"No"</string>
     <string name="alphabet" msgid="1583185545938805861">"အက္ခရာများ"</string>
     <string name="digits" msgid="1746796679021682388">"ဂဏန်းများ (0-9, *, #, +)"</string>
     <string name="default_call_setup_msg" msgid="7960194995759849940">"ခေါ်ဆိုနေပါသည်"</string>
     <string name="default_setup_call_msg" msgid="6126904475461162162">"ခေါ်ဆိုရန် သတ်မှတ်ပြင်ဆင်ပြီး"</string>
-    <string name="stk_app_state" msgid="18582277302584082">"အပ်ပလီကေးရှင်းအနေအထား"</string>
+    <string name="stk_app_state" msgid="18582277302584082">"အပလီကေးရှင်းအနေအထား"</string>
     <string name="enable_app" msgid="3701224550936728203">"ဖွင့်ထားသည်"</string>
     <string name="disable_app" msgid="6725081975611415214">"သုံးမရအောင် ပိတ်ထားခြင်း"</string>
     <string name="stk_dialog_title" msgid="6954825385456886726">"SIM တူးလ်ကစ်"</string>
diff --git a/src/com/android/stk/StkAppService.java b/src/com/android/stk/StkAppService.java
index c2c8874..9eec59e 100755
--- a/src/com/android/stk/StkAppService.java
+++ b/src/com/android/stk/StkAppService.java
@@ -313,6 +313,7 @@
                 //If all StkServices are not available, stop itself and uninstall apk.
                 for (i = PhoneConstants.SIM_ID_1; i < mSimCount; i++) {
                     if (i != slotId
+                            && (mStkService[i] != null)
                             && (mStkContext[i].mStkServiceState == STATE_UNKNOWN
                             || mStkContext[i].mStkServiceState == STATE_EXIST)) {
                        break;
@@ -797,14 +798,17 @@
 
     // returns true if any Stk related activity already has focus on the screen
     private boolean isTopOfStack() {
-        ActivityManager mAcivityManager = (ActivityManager) mContext
+        ActivityManager mActivityManager = (ActivityManager) mContext
                 .getSystemService(ACTIVITY_SERVICE);
-        String currentPackageName = mAcivityManager.getRunningTasks(1).get(0).topActivity
-                .getPackageName();
+        String currentPackageName = null;
+        List<RunningTaskInfo> tasks = mActivityManager.getRunningTasks(1);
+        if (tasks == null || tasks.get(0).topActivity == null) {
+            return false;
+        }
+        currentPackageName = tasks.get(0).topActivity.getPackageName();
         if (null != currentPackageName) {
             return currentPackageName.equals(PACKAGE_NAME);
         }
-
         return false;
     }
 
diff --git a/src/com/android/stk/StkDialogActivity.java b/src/com/android/stk/StkDialogActivity.java
index 0d63043..78e1a2e 100755
--- a/src/com/android/stk/StkDialogActivity.java
+++ b/src/com/android/stk/StkDialogActivity.java
@@ -70,6 +70,15 @@
         super.onCreate(icicle);
 
         CatLog.d(LOG_TAG, "onCreate, sim id: " + mSlotId);
+
+        // appService can be null if this activity is automatically recreated by the system
+        // with the saved instance state right after the phone process is killed.
+        if (appService == null) {
+            CatLog.d(LOG_TAG, "onCreate - appService is null");
+            finish();
+            return;
+        }
+
         // New Dialog is created - set to no response sent
         mIsResponseSent = false;
 
@@ -229,6 +238,9 @@
         super.onDestroy();
         CatLog.d(LOG_TAG, "onDestroy - mIsResponseSent[" + mIsResponseSent +
                 "], sim id: " + mSlotId);
+        if (appService == null) {
+            return;
+        }
         // if dialog activity is finished by stkappservice
         // when receiving OP_LAUNCH_APP from the other SIM, we can not send TR here
         // , since the dialog cmd is waiting user to process.
diff --git a/src/com/android/stk/StkInputActivity.java b/src/com/android/stk/StkInputActivity.java
old mode 100644
new mode 100755
index 4dbad00..96b7dca
--- a/src/com/android/stk/StkInputActivity.java
+++ b/src/com/android/stk/StkInputActivity.java
@@ -134,6 +134,14 @@
 
         CatLog.d(LOG_TAG, "onCreate - mIsResponseSent[" + mIsResponseSent + "]");
 
+        // appService can be null if this activity is automatically recreated by the system
+        // with the saved instance state right after the phone process is killed.
+        if (appService == null) {
+            CatLog.d(LOG_TAG, "onCreate - appService is null");
+            finish();
+            return;
+        }
+
         // Set the layout for this activity.
         requestWindowFeature(Window.FEATURE_LEFT_ICON);
         setContentView(R.layout.stk_input);
@@ -201,6 +209,9 @@
         super.onDestroy();
         CatLog.d(LOG_TAG, "onDestroy - before Send End Session mIsResponseSent[" +
                 mIsResponseSent + " , " + mSlotId + "]");
+        if (appService == null) {
+            return;
+        }
         //If the input activity is finished by stkappservice
         //when receiving OP_LAUNCH_APP from the other SIM, we can not send TR here
         //, since the input cmd is waiting user to process.
diff --git a/src/com/android/stk/StkMenuActivity.java b/src/com/android/stk/StkMenuActivity.java
index fbe8dbc..42cd60a 100755
--- a/src/com/android/stk/StkMenuActivity.java
+++ b/src/com/android/stk/StkMenuActivity.java
@@ -110,6 +110,15 @@
         mContext = getBaseContext();
         mAcceptUsersInput = true;
         getListView().setOnCreateContextMenuListener(this);
+
+        // appService can be null if this activity is automatically recreated by the system
+        // with the saved instance state right after the phone process is killed.
+        if (appService == null) {
+            CatLog.d(LOG_TAG, "onCreate - appService is null");
+            finish();
+            return;
+        }
+
         initFromIntent(getIntent());
     }
 
@@ -274,6 +283,9 @@
         getListView().setOnCreateContextMenuListener(null);
         super.onDestroy();
         CatLog.d(LOG_TAG, "onDestroy" + "," + mState);
+        if (appService == null) {
+            return;
+        }
         //isMenuPending: if input act is finish by stkappservice when OP_LAUNCH_APP again,
         //we can not send TR here, since the input cmd is waiting user to process.
         if (mState == STATE_SECONDARY && !mIsResponseSent && !appService.isMenuPending(mSlotId)) {