Merge tag 'android-6.0.1_r3' into 601r3

Android 6.0.1 release 3

* tag 'android-6.0.1_r3':
  DO NOT MERGE. Fixed emergency alert TTS not playing on bluetooth speaker.
  Fixed that emergency alert reminder does not trigger every 2 minutes.
  Fixed that "Turn on notification" does not work.

Change-Id: Ie67c5bec6b7c0e61ffb2126921f6a060f16afd1c
diff --git a/src/com/android/cellbroadcastreceiver/CellBroadcastAlertAudio.java b/src/com/android/cellbroadcastreceiver/CellBroadcastAlertAudio.java
index 6a70079..2381689 100644
--- a/src/com/android/cellbroadcastreceiver/CellBroadcastAlertAudio.java
+++ b/src/com/android/cellbroadcastreceiver/CellBroadcastAlertAudio.java
@@ -122,6 +122,9 @@
                                 PAUSE_DURATION_BEFORE_SPEAKING_MSEC);
                         mState = STATE_PAUSING;
                     } else {
+                        if (DBG) log("MessageEmpty = " + (mMessageBody == null) +
+                                ", mTtsEngineReady = " + mTtsEngineReady +
+                                ", mTtsLanguageSupported = " + mTtsLanguageSupported);
                         stopSelf();
                         mState = STATE_IDLE;
                     }
@@ -135,6 +138,10 @@
                         HashMap<String, String> ttsHashMap = new HashMap<String, String>();
                         ttsHashMap.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID,
                                 TTS_UTTERANCE_ID);
+                        // Play TTS on notification stream.
+                        ttsHashMap.put(TextToSpeech.Engine.KEY_PARAM_STREAM,
+                                Integer.toString(AudioManager.STREAM_NOTIFICATION));
+
                         res = mTts.speak(mMessageBody, TextToSpeech.QUEUE_FLUSH, ttsHashMap);
                         mState = STATE_SPEAKING;
                     }
@@ -206,7 +213,11 @@
     @Override
     public void onUtteranceCompleted(String utteranceId) {
         if (utteranceId.equals(TTS_UTTERANCE_ID)) {
-            stopSelf();
+            // When we reach here, it could be TTS completed or TTS was cut due to another
+            // new alert started playing. We don't want to stop the service in the later case.
+            if (mState == STATE_SPEAKING) {
+                stopSelf();
+            }
         }
     }
 
@@ -236,6 +247,14 @@
                 loge("exception trying to shutdown text-to-speech");
             }
         }
+
+        if (mEnableAudio) {
+            // Release the audio focus so other audio (e.g. music) can resume.
+            // Do not do this in stop() because stop() is also called when we stop the tone (before
+            // TTS is playing). We only want to release the focus when tone and TTS are played.
+            mAudioManager.abandonAudioFocus(null);
+        }
+
         // release CPU wake lock acquired by CellBroadcastAlertService
         CellBroadcastAlertWakeLock.releaseCpuLock();
     }
@@ -435,7 +454,7 @@
                 loge("exception trying to stop text-to-speech");
             }
         }
-        mAudioManager.abandonAudioFocus(null);
+
         mState = STATE_IDLE;
     }
 
diff --git a/src/com/android/cellbroadcastreceiver/CellBroadcastAlertReminder.java b/src/com/android/cellbroadcastreceiver/CellBroadcastAlertReminder.java
index b2cdef7..6bb981c 100644
--- a/src/com/android/cellbroadcastreceiver/CellBroadcastAlertReminder.java
+++ b/src/com/android/cellbroadcastreceiver/CellBroadcastAlertReminder.java
@@ -139,7 +139,9 @@
 
         // remind user after 2 minutes or 15 minutes
         long triggerTime = SystemClock.elapsedRealtime() + (interval * 60000);
-        alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerTime, sPlayReminderIntent);
+        // We use setExact instead of set because this is for emergency reminder.
+        alarmManager.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP, 
+                triggerTime, sPlayReminderIntent);
         return true;
     }