am 3e2ffa63: (-s ours) am 0ed51eff: (-s ours) Import translations. DO NOT MERGE

* commit '3e2ffa63ebf6827fbe261ec6e9357cc40ec6fe1f':
  Import translations. DO NOT MERGE
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index e8cbf1e..d771d02 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -19,7 +19,7 @@
     <string name="app_name" msgid="170210454004696382">"Klíčenka"</string>
     <string name="title_no_certs" msgid="8350009443064722873">"Nebyly nalezeny žádné certifikáty"</string>
     <string name="title_select_cert" msgid="3588447616418041699">"Vyberte certifikát"</string>
-    <string name="requesting_application" msgid="1589142627467598421">"Aplikace %s vyžaduje certifikát. Výběrem certifikátu aplikaci umožníte, aby nyní i v budoucnosti používala na serverech tuto identitu."</string>
+    <string name="requesting_application" msgid="1589142627467598421">"Aplikace %s vyžaduje certifikát. Výběrem certifikátu aplikaci umožníte, aby nyní i v budoucnosti používala na serverech tuto identitu."</string>
     <string name="requesting_server" msgid="5832565605998634370">"Aplikace identifikovala server požadavku: %s. Přístup k certifikátu byste měli povolit, pouze pokud aplikaci důvěřujete."</string>
     <string name="install_new_cert_message" msgid="4451971501142085495">"Certifikáty můžete instalovat ze souboru PKCS#12 s příponou %1$s nebo %2$s, umístěného v externím úložišti."</string>
     <string name="install_new_cert_button_label" msgid="510732745267546907">"Instalovat"</string>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index 60604fe..0034f93 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -21,7 +21,7 @@
     <string name="title_select_cert" msgid="3588447616418041699">"प्रमाणपत्र चुनें"</string>
     <string name="requesting_application" msgid="1589142627467598421">"%s ऐप्स ने प्रमाणपत्र का अनुरोध किया है. प्रमाणपत्र चुनने से ऐप्स इस पहचान का उपयोग अभी और भविष्‍य में सर्वर के साथ कर सकेगा."</string>
     <string name="requesting_server" msgid="5832565605998634370">"ऐप्स ने अनुरोध करने वाले सर्वर को %s के रूप में पहचाना है, लेकिन आपको ऐप्स  को प्रमाणपत्र पर केवल तब ही पहुंच देना चाहिए जब आप ऐप्स पर विश्वास करते हों."</string>
-    <string name="install_new_cert_message" msgid="4451971501142085495">"आप बाहरी संग्रहण में मौजूद %1$s या %2$s एक्‍सटेंशन वाली PKCS#12 फ़ाइल से प्रमाणपत्र इंस्‍टॉल कर सकते हैं."</string>
+    <string name="install_new_cert_message" msgid="4451971501142085495">"आप बाहरी मेमोरी में मौजूद %1$s या %2$s एक्‍सटेंशन वाली PKCS#12 फ़ाइल से प्रमाणपत्र इंस्‍टॉल कर सकते हैं."</string>
     <string name="install_new_cert_button_label" msgid="510732745267546907">"इंस्टॉल करें"</string>
     <string name="allow_button" msgid="5340501035618157678">"अनुमति दें"</string>
     <string name="deny_button" msgid="3766539809121892584">"अस्वीकार करें"</string>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index fa660e9..4db4d20 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -19,8 +19,8 @@
     <string name="app_name" msgid="170210454004696382">"Chaveiro"</string>
     <string name="title_no_certs" msgid="8350009443064722873">"Nenhum certificado encontrado"</string>
     <string name="title_select_cert" msgid="3588447616418041699">"Escolher certificado"</string>
-    <string name="requesting_application" msgid="1589142627467598421">"O aplicativo %s solicitou um certificado. A escolha de um certificado permitirá que o aplicativo use esta identidade com os servidores de agora em diante."</string>
-    <string name="requesting_server" msgid="5832565605998634370">"O aplicativo identificou o servidor da solicitação como %s, mas você só deve permitir o acesso ao certificado caso confie no aplicativo."</string>
+    <string name="requesting_application" msgid="1589142627467598421">"O app %s solicitou um certificado. A escolha de um certificado permitirá que o app use esta identidade com os servidores de agora em diante."</string>
+    <string name="requesting_server" msgid="5832565605998634370">"O app identificou o servidor da solicitação como %s, mas você só deve permitir o acesso ao certificado caso confie no app."</string>
     <string name="install_new_cert_message" msgid="4451971501142085495">"Você pode instalar certificados a partir de um arquivo PKCS#12 com a extensão %1$s ou %2$s armazenado externamente."</string>
     <string name="install_new_cert_button_label" msgid="510732745267546907">"Instalar"</string>
     <string name="allow_button" msgid="5340501035618157678">"Permitir"</string>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index f9aea02..be18ddf 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="170210454004696382">"Key Chain"</string>
+    <string name="app_name" msgid="170210454004696382">"Shramba poverilnic"</string>
     <string name="title_no_certs" msgid="8350009443064722873">"Potrdil ni mogoče najti"</string>
     <string name="title_select_cert" msgid="3588447616418041699">"Izberite potrdilo"</string>
     <string name="requesting_application" msgid="1589142627467598421">"Aplikacija %s je zahtevala potrdilo. Če izberete potrdilo, boste aplikaciji omogočili uporabo te identitete s strežniki zdaj in v prihodnosti."</string>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index 6bdcd5a..fa08917 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -26,7 +26,7 @@
     <!-- no translation found for requesting_server (5832565605998634370) -->
     <skip />
     <string name="install_new_cert_message" msgid="4451971501142085495">"Unaweza kusakinisha vyeti kutoka katika faili PKCS#12 kwa kirefusho %1$s au %2$s kilicho katika hifadhi ya nje."</string>
-    <string name="install_new_cert_button_label" msgid="510732745267546907">"Sakinisha"</string>
+    <string name="install_new_cert_button_label" msgid="510732745267546907">"Weka"</string>
     <string name="allow_button" msgid="5340501035618157678">"Ruhusu"</string>
     <string name="deny_button" msgid="3766539809121892584">"Kana"</string>
 </resources>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index 53c355e..955681b 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="170210454004696382">"Pangunahing Chain"</string>
+    <string name="app_name" msgid="170210454004696382">"Key Chain"</string>
     <string name="title_no_certs" msgid="8350009443064722873">"Walang nahanap na mga certificate"</string>
     <string name="title_select_cert" msgid="3588447616418041699">"Pumili ng certificate"</string>
     <string name="requesting_application" msgid="1589142627467598421">"Humiling ng certificate ang app na %s. Bibigyang-daan ng pagpili ng certificate ang app na magamit ang pagkakakilanlang ito sa mga server ngayon at sa hinaharap."</string>
diff --git a/src/com/android/keychain/KeyChainActivity.java b/src/com/android/keychain/KeyChainActivity.java
index 23aa1a1..7b31702 100644
--- a/src/com/android/keychain/KeyChainActivity.java
+++ b/src/com/android/keychain/KeyChainActivity.java
@@ -17,15 +17,21 @@
 package com.android.keychain;
 
 import android.app.Activity;
+import android.app.ActivityManagerNative;
+import android.app.admin.IDevicePolicyManager;
 import android.app.AlertDialog;
 import android.app.Dialog;
 import android.app.PendingIntent;
+import android.content.Context;
 import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.content.res.Resources;
 import android.os.AsyncTask;
 import android.os.Bundle;
+import android.os.IBinder;
+import android.os.RemoteException;
+import android.os.ServiceManager;
 import android.security.Credentials;
 import android.security.IKeyChainAliasCallback;
 import android.security.KeyChain;
@@ -49,6 +55,7 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.concurrent.ExecutionException;
 import java.util.List;
 
 import javax.security.auth.x500.X500Principal;
@@ -118,7 +125,7 @@
                     // onActivityResult is called with REQUEST_UNLOCK
                     return;
                 }
-                showCertChooserDialog();
+                chooseCertificate();
                 return;
             case UNLOCK_REQUESTED:
                 // we've already asked, but have not heard back, probably just rotated.
@@ -134,8 +141,59 @@
         }
     }
 
-    private void showCertChooserDialog() {
-        new AliasLoader().execute();
+    private void chooseCertificate() {
+        // Start loading the set of certs to choose from now- if device policy doesn't return an
+        // alias, having aliases loading already will save some time waiting for UI to start.
+        final AliasLoader loader = new AliasLoader();
+        loader.execute();
+
+        final IKeyChainAliasCallback.Stub callback = new IKeyChainAliasCallback.Stub() {
+            @Override public void alias(String alias) {
+                // Use policy-suggested alias if provided
+                if (alias != null) {
+                    finish(alias);
+                    return;
+                }
+
+                // No suggested alias - instead finish loading and show UI to pick one
+                final CertificateAdapter certAdapter;
+                try {
+                    certAdapter = loader.get();
+                } catch (InterruptedException | ExecutionException e) {
+                    Log.e(TAG, "Loading certificate aliases interrupted", e);
+                    finish(null);
+                    return;
+                }
+                runOnUiThread(new Runnable() {
+                    @Override public void run() {
+                        displayCertChooserDialog(certAdapter);
+                    }
+                });
+            }
+        };
+
+        // Give a profile or device owner the chance to intercept the request, if a private key
+        // access listener is registered with the DevicePolicyManagerService.
+        IDevicePolicyManager devicePolicyManager = IDevicePolicyManager.Stub.asInterface(
+                ServiceManager.getService(Context.DEVICE_POLICY_SERVICE));
+
+        String host = getIntent().getStringExtra(KeyChain.EXTRA_HOST);
+        int port = getIntent().getIntExtra(KeyChain.EXTRA_PORT, -1);
+        String url = getIntent().getStringExtra(KeyChain.EXTRA_URL);
+        String alias = getIntent().getStringExtra(KeyChain.EXTRA_ALIAS);
+
+        try {
+            int uid = ActivityManagerNative.getDefault().getLaunchedFromUid(getActivityToken());
+            devicePolicyManager.choosePrivateKeyAlias(uid, host, port, url, alias, callback);
+        } catch (RemoteException e) {
+            Log.e(TAG, "Unable to request alias from DevicePolicyManager", e);
+            // Proceed without a suggested alias.
+            try {
+                callback.alias(null);
+            } catch (RemoteException shouldNeverHappen) {
+                finish(null);
+            }
+        }
     }
 
     private class AliasLoader extends AsyncTask<Void, Void, CertificateAdapter> {
@@ -147,9 +205,6 @@
             Collections.sort(aliasList);
             return new CertificateAdapter(aliasList);
         }
-        @Override protected void onPostExecute(CertificateAdapter adapter) {
-            displayCertChooserDialog(adapter);
-        }
     }
 
     private void displayCertChooserDialog(final CertificateAdapter adapter) {
@@ -363,7 +418,7 @@
             case REQUEST_UNLOCK:
                 if (mKeyStore.isUnlocked()) {
                     mState = State.INITIAL;
-                    showCertChooserDialog();
+                    chooseCertificate();
                 } else {
                     // user must have canceled unlock, give up
                     mState = State.UNLOCK_CANCELED;