am cf424299: am 9e193890: am 0c671305: Merge "Handle runtime phone permission" into mnc-dev

* commit 'cf42429939c2da1f0f39c223a20d9996272f521a':
  Handle runtime phone permission
diff --git a/src/com/android/dialer/DialtactsActivity.java b/src/com/android/dialer/DialtactsActivity.java
index b159acf..214f320 100644
--- a/src/com/android/dialer/DialtactsActivity.java
+++ b/src/com/android/dialer/DialtactsActivity.java
@@ -257,6 +257,9 @@
 
             menu.findItem(R.id.menu_import_export).setVisible(hasContactsPermission);
             menu.findItem(R.id.menu_add_contact).setVisible(hasContactsPermission);
+
+            menu.findItem(R.id.menu_history).setVisible(
+                    PermissionsUtil.hasPhonePermissions(DialtactsActivity.this));
             super.show();
         }
     }
diff --git a/src/com/android/dialer/calllog/CallLogFragment.java b/src/com/android/dialer/calllog/CallLogFragment.java
index e8ed17e..f98fc21 100644
--- a/src/com/android/dialer/calllog/CallLogFragment.java
+++ b/src/com/android/dialer/calllog/CallLogFragment.java
@@ -188,7 +188,6 @@
                 mContactsObserver);
         resolver.registerContentObserver(Status.CONTENT_URI, true, mVoicemailStatusObserver);
         setHasOptionsMenu(true);
-        fetchCalls();
     }
 
     /** Called by the CallLogQueryHandler when the list of calls has been fetched or updated. */
@@ -203,7 +202,7 @@
         // This will update the state of the "Clear call log" menu item.
         getActivity().invalidateOptionsMenu();
 
-        boolean showListView = cursor.getCount() > 0;
+        boolean showListView = cursor != null && cursor.getCount() > 0;
         mRecyclerView.setVisibility(showListView ? View.VISIBLE : View.GONE);
         mEmptyListView.setVisibility(!showListView ? View.VISIBLE : View.GONE);
 
@@ -266,6 +265,7 @@
         mRecyclerView.setHasFixedSize(true);
         mLayoutManager = new LinearLayoutManager(getActivity());
         mRecyclerView.setLayoutManager(mLayoutManager);
+        mEmptyListView = view.findViewById(R.id.empty_list_view);
 
         String currentCountryIso = GeoUtil.getCurrentCountryIso(getActivity());
         boolean isShowingRecentsTab = mLogLimit != NO_LOG_LIMIT || mDateLimit != NO_DATE_LIMIT;
@@ -278,14 +278,13 @@
         mRecyclerView.setAdapter(mAdapter);
 
         mVoicemailStatusHelper = new VoicemailStatusHelperImpl();
+        fetchCalls();
         return view;
     }
 
     @Override
     public void onViewCreated(View view, Bundle savedInstanceState) {
         super.onViewCreated(view, savedInstanceState);
-        mEmptyListView = view.findViewById(R.id.empty_list_view);
-
         updateEmptyMessage(mCallTypeFilter);
     }
 
diff --git a/src/com/android/dialer/calllog/CallLogNotificationsService.java b/src/com/android/dialer/calllog/CallLogNotificationsService.java
index 22809db..9f48b09 100644
--- a/src/com/android/dialer/calllog/CallLogNotificationsService.java
+++ b/src/com/android/dialer/calllog/CallLogNotificationsService.java
@@ -22,6 +22,7 @@
 import android.net.Uri;
 import android.util.Log;
 
+import com.android.contacts.common.util.PermissionsUtil;
 import com.android.dialer.util.TelecomUtil;
 
 /**
@@ -78,6 +79,10 @@
             return;
         }
 
+        if (!PermissionsUtil.hasPhonePermissions(this)) {
+            return;
+        }
+
         if (ACTION_MARK_NEW_VOICEMAILS_AS_OLD.equals(intent.getAction())) {
             mVoicemailQueryHandler.markNewVoicemailsAsOld();
         } else if (ACTION_UPDATE_NOTIFICATIONS.equals(intent.getAction())) {
diff --git a/src/com/android/dialer/calllog/CallLogQueryHandler.java b/src/com/android/dialer/calllog/CallLogQueryHandler.java
index 49d6a41..a0e563a 100644
--- a/src/com/android/dialer/calllog/CallLogQueryHandler.java
+++ b/src/com/android/dialer/calllog/CallLogQueryHandler.java
@@ -35,6 +35,7 @@
 import android.util.Log;
 
 import com.android.contacts.common.database.NoNullCursorAsyncQueryHandler;
+import com.android.contacts.common.util.PermissionsUtil;
 import com.android.dialer.util.TelecomUtil;
 import com.android.dialer.voicemail.VoicemailStatusHelperImpl;
 
@@ -93,6 +94,10 @@
                 Log.w(TAG, "Exception on background worker thread", e);
             } catch (IllegalArgumentException e) {
                 Log.w(TAG, "ContactsProvider not present on device", e);
+            } catch (SecurityException e) {
+                // Shouldn't happen if we are protecting the entry points correctly,
+                // but just in case.
+                Log.w(TAG, "No permission to access ContactsProvider.", e);
             }
         }
     }
@@ -124,7 +129,11 @@
      */
     public void fetchCalls(int callType, long newerThan) {
         cancelFetch();
-        fetchCalls(QUERY_CALLLOG_TOKEN, callType, false /* newOnly */, newerThan);
+        if (PermissionsUtil.hasPhonePermissions(mContext)) {
+            fetchCalls(QUERY_CALLLOG_TOKEN, callType, false /* newOnly */, newerThan);
+        } else {
+            updateAdapterData(null);
+        }
     }
 
     public void fetchCalls(int callType) {
@@ -187,6 +196,9 @@
 
     /** Updates all new calls to mark them as old. */
     public void markNewCallsAsOld() {
+        if (!PermissionsUtil.hasPhonePermissions(mContext)) {
+            return;
+        }
         // Mark all "new" calls as not new anymore.
         StringBuilder where = new StringBuilder();
         where.append(Calls.NEW);
@@ -201,6 +213,9 @@
 
     /** Updates all missed calls to mark them as read. */
     public void markMissedCallsAsRead() {
+        if (!PermissionsUtil.hasPhonePermissions(mContext)) {
+            return;
+        }
         // Mark all "new" calls as not new anymore.
         StringBuilder where = new StringBuilder();
         where.append(Calls.IS_READ).append(" = 0");
diff --git a/src/com/android/dialer/dialpad/DialpadFragment.java b/src/com/android/dialer/dialpad/DialpadFragment.java
index de1d44f..89cab41 100644
--- a/src/com/android/dialer/dialpad/DialpadFragment.java
+++ b/src/com/android/dialer/dialpad/DialpadFragment.java
@@ -1600,6 +1600,9 @@
      */
     private void queryLastOutgoingCall() {
         mLastNumberDialed = EMPTY_NUMBER;
+        if (!PermissionsUtil.hasPhonePermissions(getActivity())) {
+            return;
+        }
         CallLogAsync.GetLastOutgoingCallArgs lastCallArgs =
                 new CallLogAsync.GetLastOutgoingCallArgs(
                     getActivity(),