Merge branch 'dev/11/fp3/security-aosp-rvc-release' into int/11/fp3

* origin/dev/11/fp3/security-aosp-rvc-release:
  enforce stricter CallLogProvider query

Change-Id: I03793a0f909dd89537f1fd78d07a9cbe51951458
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 9542e6d..6cb5337 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -4,6 +4,8 @@
         android:sharedUserLabel="@string/sharedUserLabel">
 
     <uses-permission android:name="android.permission.BIND_DIRECTORY_SEARCH" />
+    <!-- For sending voicemail intents -->
+    <uses-permission android:name="android.permission.CHANGE_DEVICE_IDLE_TEMP_WHITELIST" />
     <uses-permission android:name="android.permission.GET_ACCOUNTS" />
     <uses-permission android:name="android.permission.GET_ACCOUNTS_PRIVILEGED" />
     <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS" />
@@ -18,6 +20,7 @@
     <uses-permission android:name="android.permission.WRITE_CONTACTS" />
     <uses-permission android:name="android.permission.USE_RESERVED_DISK" />
     <uses-permission android:name="android.permission.READ_DEVICE_CONFIG" />
+    <uses-permission android:name="android.permission.HIDE_NON_SYSTEM_OVERLAY_WINDOWS" />
 
     <permission
             android:name="android.permission.SEND_CALL_LOG_CHANGE"
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index 9fa5c9b..a5cad58 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -26,7 +26,7 @@
     <string name="local_invisible_directory" msgid="705244318477396120">"سایر موارد"</string>
     <string name="voicemail_from_column" msgid="435732568832121444">"پست صوتی از "</string>
     <string name="debug_dump_title" msgid="4916885724165570279">"کپی پایگاه داده مخاطبین"</string>
-    <string name="debug_dump_database_message" msgid="406438635002392290">"شما در شرف ۱) ایجاد یک کپی از پایگاه داده‌ در حافظه داخلی هستید، این کپی حاوی همه اطلاعات مربوط به مخاطبین و همه گزارشات تماس است و همچنین می‌خواهید ۲) آنرا ایمیل کنید. به خاطر داشته باشید که به محض کپی کردن این نسخه در دستگاه یا دریافت ایمیل، آنرا حذف کنید."</string>
+    <string name="debug_dump_database_message" msgid="406438635002392290">"شما در شرف ۱) ایجاد یک نسخه از پایگاه داده‌ در حافظه داخلی هستید، این کپی حاوی همه اطلاعات مربوط به مخاطبین و همه گزارش‌های تماس است و همچنین می‌خواهید ۲) آن را ایمیل کنید. به‌خاطر داشته باشید که به محض تهیه این نسخه در دستگاه یا دریافت ایمیل، آن را حذف کنید."</string>
     <string name="debug_dump_delete_button" msgid="7832879421132026435">"اکنون حذف شود"</string>
     <string name="debug_dump_start_button" msgid="2837506913757600001">"شروع"</string>
     <string name="debug_dump_email_sender_picker" msgid="3534420908672176460">"یک برنامه را برای ارسال فایل خود انتخاب کنید"</string>
diff --git a/res/values-mr/strings.xml b/res/values-mr/strings.xml
index 67014ca..5924656 100644
--- a/res/values-mr/strings.xml
+++ b/res/values-mr/strings.xml
@@ -28,8 +28,8 @@
     <string name="debug_dump_title" msgid="4916885724165570279">"संपर्क डेटाबेस कॉपी करा"</string>
     <string name="debug_dump_database_message" msgid="406438635002392290">"तुम्ही 1) आपल्‍या डेटाबेसची प्रत बनवणार आहात जिच्‍यामध्‍ये सर्व संपर्कांसंबंधी माहिती आणि अंतर्गत संचयनावरील कॉल लॉग समाविष्‍ट असतात आणि 2) ती ईमेल करणार आहात. तुम्ही डिव्‍हाइसवरून यशस्‍वीरित्‍या प्रत कॉपी केल्‍यानंतर किंवा ईमेल प्राप्त केल्‍यानंतर लगेच ती हटविण्‍याचे लक्षात ठेवा."</string>
     <string name="debug_dump_delete_button" msgid="7832879421132026435">"आता हटवा"</string>
-    <string name="debug_dump_start_button" msgid="2837506913757600001">"प्रारंभ करा"</string>
-    <string name="debug_dump_email_sender_picker" msgid="3534420908672176460">"तुमची फाईल पाठविण्‍यासाठी एक प्रोग्राम निवडा"</string>
+    <string name="debug_dump_start_button" msgid="2837506913757600001">"सुरू करा"</string>
+    <string name="debug_dump_email_sender_picker" msgid="3534420908672176460">"तुमची फाइल पाठविण्‍यासाठी एक प्रोग्राम निवडा"</string>
     <string name="debug_dump_email_subject" msgid="108188398416385976">"संपर्क Db संलग्‍न केला"</string>
     <string name="debug_dump_email_body" msgid="4577749800871444318">"संलग्‍न केलेला माझ्‍या सर्व संपर्क माहितीसह माझा संपर्क डेटाबेस आहे. काळजीपूर्वक हाताळणी करा."</string>
 </resources>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index beaa2c7..8d94fbb 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/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="sharedUserLabel" msgid="8024311725474286801">"Aplicações Principais do Android"</string>
+    <string name="sharedUserLabel" msgid="8024311725474286801">"Apps Principais do Android"</string>
     <string name="app_label" msgid="3389954322874982620">"Armazenamento de contactos"</string>
     <string name="provider_label" msgid="6012150850819899907">"Contactos"</string>
     <string name="upgrade_out_of_memory_notification_ticker" msgid="7638747231223520477">"A atualização de contactos necessita de mais memória."</string>
diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml
index d6cbf41..bb60c01 100644
--- a/res/values-te/strings.xml
+++ b/res/values-te/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="sharedUserLabel" msgid="8024311725474286801">"Android ప్రధాన అనువర్తనాలు"</string>
+    <string name="sharedUserLabel" msgid="8024311725474286801">"Android ప్రధాన యాప్‌లు"</string>
     <string name="app_label" msgid="3389954322874982620">"పరిచయాల నిల్వ"</string>
     <string name="provider_label" msgid="6012150850819899907">"పరిచయాలు"</string>
     <string name="upgrade_out_of_memory_notification_ticker" msgid="7638747231223520477">"పరిచయాల అప్‌గ్రేడ్‌కు మరింత మెమరీ అవసరం."</string>
diff --git a/src/com/android/providers/contacts/ContactsDatabaseHelper.java b/src/com/android/providers/contacts/ContactsDatabaseHelper.java
index 2e5cdac..a1cc3ef 100644
--- a/src/com/android/providers/contacts/ContactsDatabaseHelper.java
+++ b/src/com/android/providers/contacts/ContactsDatabaseHelper.java
@@ -3428,6 +3428,11 @@
                 + "x_last_time_used = ifnull(last_time_used,0),"
                 + "times_used = 0,"
                 + "last_time_used = 0");
+
+        db.execSQL("UPDATE accounts SET "
+                + "account_name = ? ,account_type = ? "
+                + "where account_name = ? AND account_type = ?",
+                new Object[]{null, null, "PHONE", "com.android.localphone"});
     }
 
     public void upgradeToVersion1300(SQLiteDatabase db) {
diff --git a/src/com/android/providers/contacts/ContactsProvider2.java b/src/com/android/providers/contacts/ContactsProvider2.java
index 5159fb9..3a0f7db 100644
--- a/src/com/android/providers/contacts/ContactsProvider2.java
+++ b/src/com/android/providers/contacts/ContactsProvider2.java
@@ -5548,6 +5548,17 @@
             return null;
         }
 
+        if (cursor.getCount() > 0) {
+            final int callingUid = Binder.getCallingUid();
+            final String directoryAuthority = directoryInfo.authority;
+            if (VERBOSE_LOGGING) {
+                Log.v(TAG, "Making authority " + directoryAuthority
+                        + " visible to UID " + callingUid);
+            }
+            getContext().getPackageManager().grantImplicitAccess(
+                    callingUid, directoryAuthority);
+        }
+
         // Load the cursor contents into a memory cursor (backed by a cursor window) and close the
         // underlying cursor.
         try {
@@ -8628,7 +8639,7 @@
 
             case RAW_CONTACTS_ID_DISPLAY_PHOTO: {
                 long rawContactId = Long.parseLong(uri.getPathSegments().get(1));
-                boolean writeable = !mode.equals("r");
+                boolean writeable = mode.contains("w");
 
                 // Find the primary photo data record for this raw contact.
                 SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
diff --git a/src/com/android/providers/contacts/VoicemailNotifier.java b/src/com/android/providers/contacts/VoicemailNotifier.java
index 159cec7..b4033ea 100644
--- a/src/com/android/providers/contacts/VoicemailNotifier.java
+++ b/src/com/android/providers/contacts/VoicemailNotifier.java
@@ -1,5 +1,6 @@
 package com.android.providers.contacts;
 
+import android.app.BroadcastOptions;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
@@ -27,6 +28,12 @@
 
     private final String TAG = "VoicemailNotifier";
 
+    /**
+     * Grant recipients of new voicemail broadcasts a 10sec allowlist so they can start a background
+     * service to do VVM processing.
+     */
+    private final long VOICEMAIL_ALLOW_LIST_DURATION_MILLIS = 10000;
+
     private final Context mContext;
     private final Uri mBaseUri;
 
@@ -85,7 +92,17 @@
                     intent.putExtra(VoicemailContract.EXTRA_SELF_CHANGE,
                             callingPackages.contains(component.getPackageName()));
                 }
-                mContext.sendBroadcast(intent);
+                if (intentAction.equals(VoicemailContract.ACTION_NEW_VOICEMAIL)) {
+                    BroadcastOptions bopts = BroadcastOptions.makeBasic();
+                    bopts.setTemporaryAppWhitelistDuration(VOICEMAIL_ALLOW_LIST_DURATION_MILLIS);
+                    Log.i(TAG, String.format("sendNotification: allowMillis=%d, pkg=%s",
+                            VOICEMAIL_ALLOW_LIST_DURATION_MILLIS, component.getPackageName()));
+                    mContext.sendBroadcast(intent, android.Manifest.permission.READ_VOICEMAIL,
+                            bopts.toBundle());
+                } else {
+                    mContext.sendBroadcast(intent);
+                }
+
                 Log.v(TAG, String.format("Sent intent. act:%s, url:%s, comp:%s," +
                                 " self_change:%s", intent.getAction(), intent.getData(),
                         component.getClassName(),
diff --git a/src/com/android/providers/contacts/debug/ContactsDumpActivity.java b/src/com/android/providers/contacts/debug/ContactsDumpActivity.java
index 359f3f8..725b5bf 100644
--- a/src/com/android/providers/contacts/debug/ContactsDumpActivity.java
+++ b/src/com/android/providers/contacts/debug/ContactsDumpActivity.java
@@ -66,6 +66,13 @@
     }
 
     @Override
+    protected void onStart() {
+        super.onStart();
+        getWindow().addSystemFlags(android.view.WindowManager.LayoutParams
+                .SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS);
+    }
+
+    @Override
     public void onClick(View v) {
         switch (v.getId()) {
             case R.id.confirm:
diff --git a/tests/src/com/android/providers/contacts/ContactDirectoryManagerTest.java b/tests/src/com/android/providers/contacts/ContactDirectoryManagerTest.java
index b15d01a..fca00af 100644
--- a/tests/src/com/android/providers/contacts/ContactDirectoryManagerTest.java
+++ b/tests/src/com/android/providers/contacts/ContactDirectoryManagerTest.java
@@ -624,7 +624,7 @@
      */
     public void testGetDirectoryProviderPackages() {
         final PackageManager pm = getContext().getPackageManager();
-        final String googleSync = "com.google.android.syncadapters.contacts";
+        final String googleSync = "com.google.android.gms";
 
         // Skip if the package is not installed.
         try {