Dialer: Introduce asking for default dialer role

* Permissions like (READ|WRITE)_CALL_LOG and others
  can only be granted to default dialer
* Add a screen which asks the user to make it default

Change-Id: I8aea9ca582d19191212b4a7a7cb15820d35d6bd0
diff --git a/java/com/android/dialer/app/res/values/cm_strings.xml b/java/com/android/dialer/app/res/values/cm_strings.xml
index 84d6ef7..79dee54 100644
--- a/java/com/android/dialer/app/res/values/cm_strings.xml
+++ b/java/com/android/dialer/app/res/values/cm_strings.xml
@@ -45,4 +45,7 @@
     <string name="call_log_stats_title">Statistics</string>
 
     <string name="action_menu_helplines">Helplines</string>
+
+    <string name="default_dialer_text">You must set Dialer as the default phone app to use it.</string>
+    <string name="default_dialer_action">Set as default</string>
 </resources>
diff --git a/java/com/android/dialer/main/impl/AndroidManifest.xml b/java/com/android/dialer/main/impl/AndroidManifest.xml
index 743e6f8..3d78968 100644
--- a/java/com/android/dialer/main/impl/AndroidManifest.xml
+++ b/java/com/android/dialer/main/impl/AndroidManifest.xml
@@ -111,5 +111,11 @@
 
     </activity>
 
+    <activity
+        android:name="com.android.dialer.main.impl.DefaultDialerActivity"
+        android:exported="false"
+        android:launchMode="singleTask"
+        android:theme="@style/MainActivityTheme" />
+
   </application>
 </manifest>
diff --git a/java/com/android/dialer/main/impl/DefaultDialerActivity.java b/java/com/android/dialer/main/impl/DefaultDialerActivity.java
new file mode 100644
index 0000000..d40e021
--- /dev/null
+++ b/java/com/android/dialer/main/impl/DefaultDialerActivity.java
@@ -0,0 +1,68 @@
+/*
+ * SPDX-FileCopyrightText: The LineageOS Project
+ * SPDX-License-Identifier: Apache-2.0
+ */
+package com.android.dialer.main.impl;
+
+import android.app.Activity;
+import android.app.role.RoleManager;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.v7.app.AppCompatActivity;
+import android.telecom.TelecomManager;
+import android.view.View;
+
+import com.android.dialer.R;
+import com.android.dialer.widget.EmptyContentView;
+
+public class DefaultDialerActivity extends AppCompatActivity implements
+        EmptyContentView.OnEmptyViewActionButtonClickedListener {
+
+    private static final int REQUEST_DEFAULT_DIALER = 1;
+
+    private RoleManager mRoleManager;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        setTheme(R.style.MainActivityTheme);
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.default_dialer_view);
+
+        mRoleManager = (RoleManager) getSystemService(Context.ROLE_SERVICE);
+
+        EmptyContentView emptyContentView = findViewById(R.id.empty_list_view);
+        emptyContentView.setDescription(R.string.default_dialer_text);
+        emptyContentView.setImage(R.drawable.quantum_ic_call_vd_theme_24);
+        emptyContentView.setActionLabel(R.string.default_dialer_action);
+        emptyContentView.setActionClickedListener(this);
+        emptyContentView.setVisibility(View.VISIBLE);
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        if (mRoleManager.isRoleHeld(RoleManager.ROLE_DIALER)) {
+            finish();
+        }
+    }
+
+    @Override
+    public void onEmptyViewActionButtonClicked() {
+        Intent roleRequest = mRoleManager.createRequestRoleIntent(RoleManager.ROLE_DIALER);
+        roleRequest.putExtra(TelecomManager.EXTRA_CHANGE_DEFAULT_DIALER_PACKAGE_NAME,
+                getPackageName());
+        startActivityForResult(roleRequest, REQUEST_DEFAULT_DIALER);
+    }
+
+    @Override
+    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+        super.onActivityResult(requestCode, resultCode, data);
+
+        if (requestCode == REQUEST_DEFAULT_DIALER) {
+            if (resultCode == Activity.RESULT_OK) {
+                finish();
+            }
+        }
+    }
+}
diff --git a/java/com/android/dialer/main/impl/MainActivity.java b/java/com/android/dialer/main/impl/MainActivity.java
index 60cb60f..d745483 100644
--- a/java/com/android/dialer/main/impl/MainActivity.java
+++ b/java/com/android/dialer/main/impl/MainActivity.java
@@ -25,6 +25,7 @@
 import com.android.dialer.main.MainActivityPeer;
 import com.android.dialer.main.impl.bottomnav.BottomNavBar.TabIndex;
 import com.android.dialer.R;
+import com.android.dialer.telecom.TelecomUtil;
 import com.android.dialer.util.TransactionSafeActivity;
 
 /** This is the main activity for dialer. It hosts favorites, call log, search, dialpad, etc... */
@@ -63,6 +64,12 @@
   @Override
   protected void onResume() {
     super.onResume();
+
+    if (!TelecomUtil.isDefaultDialer(this)) {
+      startActivity(new Intent(this, DefaultDialerActivity.class));
+      return;
+    }
+
     activePeer.onActivityResume();
 
     LocalBroadcastManager.getInstance(this)
diff --git a/java/com/android/dialer/main/impl/res/layout/default_dialer_view.xml b/java/com/android/dialer/main/impl/res/layout/default_dialer_view.xml
new file mode 100644
index 0000000..917ac99
--- /dev/null
+++ b/java/com/android/dialer/main/impl/res/layout/default_dialer_view.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  SPDX-FileCopyrightText: The LineageOS Project
+  SPDX-License-Identifier: Apache-2.0
+-->
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical">
+
+    <com.android.dialer.widget.EmptyContentView
+        android:id="@+id/empty_list_view"
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:layout_weight="1"
+        android:layout_gravity="center"
+        android:gravity="center_vertical"/>
+</LinearLayout>
diff --git a/java/com/android/dialer/telecom/TelecomUtil.java b/java/com/android/dialer/telecom/TelecomUtil.java
index fe7c2d2..7867820 100644
--- a/java/com/android/dialer/telecom/TelecomUtil.java
+++ b/java/com/android/dialer/telecom/TelecomUtil.java
@@ -16,6 +16,7 @@
 
 package com.android.dialer.telecom;
 
+import android.app.role.RoleManager;
 import android.Manifest;
 import android.Manifest.permission;
 import android.content.ComponentName;
@@ -364,19 +365,18 @@
     }
 
     public boolean isDefaultDialer(Context context) {
-      final boolean result =
-          TextUtils.equals(
-              context.getPackageName(), getTelecomManager(context).getDefaultDialerPackage());
-      if (result) {
-        warningLogged = false;
-      } else {
+      final RoleManager rm = (RoleManager) context.getSystemService(Context.ROLE_SERVICE);
+      if (rm == null || !rm.isRoleHeld(RoleManager.ROLE_DIALER)) {
         if (!warningLogged) {
           // Log only once to prevent spam.
           LogUtil.w(TAG, "Dialer is not currently set to be default dialer");
           warningLogged = true;
         }
+        return false;
       }
-      return result;
+
+      warningLogged = false;
+      return true;
     }
   }
 }
diff --git a/java/com/android/dialer/widget/EmptyContentView.java b/java/com/android/dialer/widget/EmptyContentView.java
index 0234c83..6c5571e 100644
--- a/java/com/android/dialer/widget/EmptyContentView.java
+++ b/java/com/android/dialer/widget/EmptyContentView.java
@@ -21,6 +21,7 @@
 import android.util.AttributeSet;
 import android.view.LayoutInflater;
 import android.view.View;
+import android.widget.Button;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
 import android.widget.TextView;
@@ -42,7 +43,7 @@
 
   private ImageView imageView;
   private TextView descriptionView;
-  private TextView actionView;
+  private Button actionView;
   private OnEmptyViewActionButtonClickedListener onActionButtonClickedListener;
 
   private @StringRes int actionLabel;
@@ -67,7 +68,7 @@
     setClickable(true);
     imageView = (ImageView) findViewById(R.id.empty_list_view_image);
     descriptionView = (TextView) findViewById(R.id.empty_list_view_message);
-    actionView = (TextView) findViewById(R.id.empty_list_view_action);
+    actionView = findViewById(R.id.empty_list_view_action);
     actionView.setOnClickListener(this);
 
     imageView.setImageTintList(
diff --git a/java/com/android/dialer/widget/res/layout-land/empty_content_view.xml b/java/com/android/dialer/widget/res/layout-land/empty_content_view.xml
index 84e6fc8..f912130 100644
--- a/java/com/android/dialer/widget/res/layout-land/empty_content_view.xml
+++ b/java/com/android/dialer/widget/res/layout-land/empty_content_view.xml
@@ -35,19 +35,13 @@
       android:textColor="?android:attr/textColorSecondary"
       android:textSize="@dimen/empty_list_message_text_size"/>
 
-  <TextView
+  <Button
       android:id="@+id/empty_list_view_action"
-      style="@style/TextActionStyle"
+      style="@style/DialerPrimaryFlatButtonStyle"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_gravity="center_horizontal"
-      android:paddingTop="8dp"
-      android:paddingBottom="8dp"
-      android:paddingLeft="16dp"
-      android:paddingRight="16dp"
-      android:background="?android:attr/selectableItemBackground"
-      android:clickable="true"
-      android:gravity="center_horizontal"/>
+      android:layout_marginTop="16dp"/>
 
   <Space
       android:layout_width="match_parent"
diff --git a/java/com/android/dialer/widget/res/layout/empty_content_view.xml b/java/com/android/dialer/widget/res/layout/empty_content_view.xml
index 57bb2fd..7aef66b 100644
--- a/java/com/android/dialer/widget/res/layout/empty_content_view.xml
+++ b/java/com/android/dialer/widget/res/layout/empty_content_view.xml
@@ -33,19 +33,13 @@
     android:textColor="?android:attr/textColorSecondary"
     android:textSize="@dimen/empty_list_message_text_size"/>
 
-  <TextView
+  <Button
     android:id="@+id/empty_list_view_action"
-    style="@style/TextActionStyle"
+    style="@style/DialerPrimaryFlatButtonStyle"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:layout_gravity="center_horizontal"
-    android:paddingTop="8dp"
-    android:paddingBottom="8dp"
-    android:paddingLeft="16dp"
-    android:paddingRight="16dp"
-    android:background="?android:attr/selectableItemBackground"
-    android:clickable="true"
-    android:gravity="center_horizontal"/>
+    android:layout_marginTop="16dp"/>
 
   <Space
     android:layout_width="match_parent"