Merge "Import translations. DO NOT MERGE" into nyc-dev
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index c02d0f5..c39bd5b 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -69,8 +69,7 @@
         android:supportsRtl="true"
         android:backupAgent='com.android.dialer.DialerBackupAgent'
         android:usesCleartextTraffic="false"
-        android:forceDeviceEncrypted="true"
-        android:encryptionAware="true">
+        android:forceDeviceEncrypted="false">
 
         <meta-data android:name="com.google.android.backup.api_key"
             android:value="AEdPqrEAAAAIBXgtCEKQ6W0PXVnW-ZVia2KmlV2AxsTw3GjAeQ" />
@@ -86,6 +85,7 @@
             android:icon="@mipmap/ic_launcher_phone"
             android:windowSoftInputMode="stateAlwaysHidden|adjustNothing"
             android:resizeableActivity="true"
+            android:encryptionAware="true"
             >
             <intent-filter>
                 <action android:name="android.intent.action.DIAL" />
@@ -281,10 +281,12 @@
 
         <service
             android:name=".calllog.CallLogNotificationsService"
+            android:encryptionAware="true"
             android:exported="false"
         />
 
-        <receiver android:name=".calllog.MissedCallNotificationReceiver">
+        <receiver android:name=".calllog.MissedCallNotificationReceiver"
+            android:encryptionAware="true">
             <intent-filter>
                 <action android:name="android.telecom.action.SHOW_MISSED_CALLS_NOTIFICATION" />
             </intent-filter>
@@ -318,11 +320,6 @@
                   android:resizeableActivity="true">
         </activity>
 
-        <!-- BroadcastReceiver for receiving Intents from Notification mechanism. -->
-        <receiver android:name="com.android.incallui.NotificationBroadcastReceiver"
-                  android:encryptionAware="true"
-                  android:exported="false" />
-
         <service android:name="com.android.incallui.InCallServiceImpl"
                  android:permission="android.permission.BIND_INCALL_SERVICE"
                  android:encryptionAware="true" >
@@ -334,6 +331,11 @@
             </intent-filter>
         </service>
 
+        <!-- BroadcastReceiver for receiving Intents from Notification mechanism. -->
+        <receiver android:name="com.android.incallui.NotificationBroadcastReceiver"
+            android:encryptionAware="true"
+            android:exported="false" />
+
         <provider
             android:name=".database.FilteredNumberProvider"
             android:authorities="com.android.dialer.database.filterednumberprovider"
diff --git a/InCallUI/src/com/android/incallui/StatusBarNotifier.java b/InCallUI/src/com/android/incallui/StatusBarNotifier.java
index 946e0eb..173fe42 100644
--- a/InCallUI/src/com/android/incallui/StatusBarNotifier.java
+++ b/InCallUI/src/com/android/incallui/StatusBarNotifier.java
@@ -100,10 +100,7 @@
         mNotificationManager =
                 (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
         mDialerRingtoneManager = new DialerRingtoneManager(
-                new InCallTonePlayer(
-                        AudioModeProvider.getInstance(),
-                        new ToneGeneratorFactory(),
-                        new PausableExecutorImpl()),
+                new InCallTonePlayer(new ToneGeneratorFactory(), new PausableExecutorImpl()),
                 CallList.getInstance());
         mCurrentNotification = NOTIFICATION_NONE;
     }
diff --git a/InCallUI/src/com/android/incallui/ringtone/InCallTonePlayer.java b/InCallUI/src/com/android/incallui/ringtone/InCallTonePlayer.java
index d930a92..3a8b03d 100644
--- a/InCallUI/src/com/android/incallui/ringtone/InCallTonePlayer.java
+++ b/InCallUI/src/com/android/incallui/ringtone/InCallTonePlayer.java
@@ -21,20 +21,14 @@
 
 import android.media.AudioManager;
 import android.media.ToneGenerator;
-import android.provider.MediaStore.Audio;
 import android.support.annotation.Nullable;
-import android.telecom.CallAudioState;
 
-import com.android.contacts.common.testing.NeededForTesting;
-import com.android.incallui.AudioModeProvider;
 import com.android.incallui.Log;
 import com.android.incallui.async.PausableExecutor;
 
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
-import javax.annotation.concurrent.NotThreadSafe;
-
 /**
  * Class responsible for playing in-call related tones in a background thread. This class only
  * allows one tone to be played at a time.
@@ -45,7 +39,6 @@
 
     public static final int VOLUME_RELATIVE_HIGH_PRIORITY = 80;
 
-    private final AudioModeProvider mAudioModeProvider;
     private final ToneGeneratorFactory mToneGeneratorFactory;
     private final PausableExecutor mExecutor;
     private @Nullable CountDownLatch mNumPlayingTones;
@@ -53,23 +46,19 @@
     /**
      * Creates a new InCallTonePlayer.
      *
-     * @param audioModeProvider the {@link AudioModeProvider} used to determine through which stream
-     * to play tones.
      * @param toneGeneratorFactory the {@link ToneGeneratorFactory} used to create
      * {@link ToneGenerator}s.
      * @param executor the {@link PausableExecutor} used to play tones in a background thread.
      * @throws NullPointerException if audioModeProvider, toneGeneratorFactory, or executor are
      * {@code null}.
      */
-    public InCallTonePlayer(AudioModeProvider audioModeProvider,
-            ToneGeneratorFactory toneGeneratorFactory, PausableExecutor executor) {
-        mAudioModeProvider = Preconditions.checkNotNull(audioModeProvider);
+    public InCallTonePlayer(ToneGeneratorFactory toneGeneratorFactory, PausableExecutor executor) {
         mToneGeneratorFactory = Preconditions.checkNotNull(toneGeneratorFactory);
         mExecutor = Preconditions.checkNotNull(executor);
     }
 
     /**
-     * @return {@code true} if a tone is currently playing, {@code false} otherwise
+     * @return {@code true} if a tone is currently playing, {@code false} otherwise.
      */
     public boolean isPlayingTone() {
         return mNumPlayingTones != null && mNumPlayingTones.getCount() > 0;
@@ -79,8 +68,8 @@
      * Plays the given tone in a background thread.
      *
      * @param tone the tone to play.
-     * @throws IllegalStateException if a tone is already playing
-     * @throws IllegalArgumentException if the tone is invalid
+     * @throws IllegalStateException if a tone is already playing.
+     * @throws IllegalArgumentException if the tone is invalid.
      */
     public void play(int tone) {
         if (isPlayingTone()) {
@@ -97,26 +86,24 @@
     }
 
     private ToneGeneratorInfo getToneGeneratorInfo(int tone) {
-        int stream = getPlaybackStream();
         switch (tone) {
             case TONE_CALL_WAITING:
+                /*
+                 * Call waiting tones play until they're stopped either by the user accepting or
+                 * declining the call so the tone length is set at what's effectively forever. The
+                 * tone is played at a high priority volume and through STREAM_VOICE_CALL since it's
+                 * call related and using that stream will route it through bluetooth devices
+                 * appropriately.
+                 */
                 return new ToneGeneratorInfo(ToneGenerator.TONE_SUP_CALL_WAITING,
                         VOLUME_RELATIVE_HIGH_PRIORITY,
                         Integer.MAX_VALUE,
-                        stream);
+                        AudioManager.STREAM_VOICE_CALL);
             default:
                 throw new IllegalArgumentException("Bad tone: " + tone);
         }
     }
 
-    private int getPlaybackStream() {
-        if (mAudioModeProvider.getAudioMode() == CallAudioState.ROUTE_BLUETOOTH) {
-            // TODO (maxwelb): b/26932998 play through bluetooth
-            // return AudioManager.STREAM_BLUETOOTH_SCO;
-        }
-        return AudioManager.STREAM_VOICE_CALL;
-    }
-
     private void playOnBackgroundThread(ToneGeneratorInfo info) {
         ToneGenerator toneGenerator = null;
         try {
diff --git a/InCallUI/tests/src/com/android/incallui/ringtone/InCallTonePlayerTest.java b/InCallUI/tests/src/com/android/incallui/ringtone/InCallTonePlayerTest.java
index 59611f7..bde5c50 100644
--- a/InCallUI/tests/src/com/android/incallui/ringtone/InCallTonePlayerTest.java
+++ b/InCallUI/tests/src/com/android/incallui/ringtone/InCallTonePlayerTest.java
@@ -21,7 +21,6 @@
 import android.test.AndroidTestCase;
 import android.test.suitebuilder.annotation.SmallTest;
 
-import com.android.incallui.AudioModeProvider;
 import com.android.incallui.async.PausableExecutor;
 import com.android.incallui.async.SingleProdThreadExecutor;
 
@@ -32,7 +31,6 @@
 @SmallTest
 public class InCallTonePlayerTest extends AndroidTestCase {
 
-    @Mock private AudioModeProvider mAudioModeProvider;
     @Mock private ToneGeneratorFactory mToneGeneratorFactory;
     @Mock private ToneGenerator mToneGenerator;
     private InCallTonePlayer mInCallTonePlayer;
@@ -52,8 +50,7 @@
         Mockito.when(mToneGeneratorFactory.newInCallToneGenerator(Mockito.anyInt(),
                 Mockito.anyInt())).thenReturn(mToneGenerator);
         mExecutor = new SingleProdThreadExecutor();
-        mInCallTonePlayer = new InCallTonePlayer(mAudioModeProvider, mToneGeneratorFactory,
-                mExecutor);
+        mInCallTonePlayer = new InCallTonePlayer(mToneGeneratorFactory, mExecutor);
     }
 
     @Override
@@ -92,10 +89,6 @@
         } catch (IllegalStateException e) {}
     }
 
-    public void testPlay_BlueToothStream() {
-        // TODO (maxwelb): b/26932998 play through bluetooth
-    }
-
     public void testPlay_VoiceCallStream() throws InterruptedException {
         mInCallTonePlayer.play(InCallTonePlayer.TONE_CALL_WAITING);
         mExecutor.awaitMilestoneForTesting();
diff --git a/src/com/android/dialer/calllog/MissedCallNotifier.java b/src/com/android/dialer/calllog/MissedCallNotifier.java
index c422dd5..98d02d0 100644
--- a/src/com/android/dialer/calllog/MissedCallNotifier.java
+++ b/src/com/android/dialer/calllog/MissedCallNotifier.java
@@ -33,6 +33,7 @@
 import com.android.dialer.R;
 import com.android.dialer.calllog.CallLogNotificationsHelper.NewCall;
 import com.android.dialer.contactinfo.ContactPhotoLoader;
+import com.android.dialer.compat.UserManagerCompat;
 import com.android.dialer.list.ListsFragment;
 import com.android.dialer.util.DialerUtils;
 import com.android.dialer.util.IntentUtil;
@@ -153,8 +154,8 @@
                 // sensitive notification information.
                 .setPublicVersion(publicBuilder.build());
 
-        // Add additional actions when there is only 1 missed call, like call-back and SMS.
-        if (count == 1) {
+        // Add additional actions when there is only 1 missed call and the user isn't locked
+        if (UserManagerCompat.isUserUnlocked(mContext) && count == 1) {
             if (!TextUtils.isEmpty(number)
                     && !TextUtils.equals(
                     number, mContext.getString(R.string.handle_restricted))) {
@@ -181,21 +182,24 @@
         AsyncTask.execute(new Runnable() {
             @Override
             public void run() {
-                // Clear the list of new missed calls from the call log.
-                ContentValues values = new ContentValues();
-                values.put(Calls.NEW, 0);
-                values.put(Calls.IS_READ, 1);
-                StringBuilder where = new StringBuilder();
-                where.append(Calls.NEW);
-                where.append(" = 1 AND ");
-                where.append(Calls.TYPE);
-                where.append(" = ?");
-                try {
-                    mContext.getContentResolver().update(Calls.CONTENT_URI, values,
-                            where.toString(), new String[]{ Integer.toString(Calls.
-                            MISSED_TYPE) });
-                } catch (IllegalArgumentException e) {
-                    Log.w(TAG, "ContactsProvider update command failed", e);
+                // Call log is only accessible when unlocked. If that's the case, clear the list of
+                // new missed calls from the call log.
+                if (UserManagerCompat.isUserUnlocked(mContext)) {
+                    ContentValues values = new ContentValues();
+                    values.put(Calls.NEW, 0);
+                    values.put(Calls.IS_READ, 1);
+                    StringBuilder where = new StringBuilder();
+                    where.append(Calls.NEW);
+                    where.append(" = 1 AND ");
+                    where.append(Calls.TYPE);
+                    where.append(" = ?");
+                    try {
+                        mContext.getContentResolver().update(Calls.CONTENT_URI, values,
+                                where.toString(), new String[]{Integer.toString(Calls.
+                                        MISSED_TYPE)});
+                    } catch (IllegalArgumentException e) {
+                        Log.w(TAG, "ContactsProvider update command failed", e);
+                    }
                 }
                 getNotificationMgr().cancel(NOTIFICATION_TAG, NOTIFICATION_ID);
             }