Show settings app icon and name in recents

If user opens a settings activity by intent, it will show icon and
label get from activity. However, we should show settings app icon
and name constantly.

Bug: 34645742
Test: RunSettingsRoboTest
Change-Id: Ic2f0fef32529ba3f425a0130d25ead47fa0bb97d
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index 1b9b3b3..d0275ba 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -31,6 +31,10 @@
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManager.NameNotFoundException;
 import android.content.res.Configuration;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Canvas;
+import android.graphics.drawable.Drawable;
 import android.nfc.NfcAdapter;
 import android.os.AsyncTask;
 import android.os.Bundle;
@@ -679,6 +683,13 @@
         mDevelopmentPreferencesListener = null;
     }
 
+    @Override
+    public void setTaskDescription(ActivityManager.TaskDescription taskDescription) {
+        final Bitmap icon = getBitmapFromXmlResource(R.drawable.ic_launcher_settings);
+        taskDescription.setIcon(icon);
+        super.setTaskDescription(taskDescription);
+    }
+
     protected boolean isValidFragment(String fragmentName) {
         // Almost all fragments are wrapped in this,
         // except for a few that have their own activities.
@@ -1114,4 +1125,17 @@
         }
         super.onActivityResult(requestCode, resultCode, data);
     }
+
+    @VisibleForTesting
+    Bitmap getBitmapFromXmlResource(int drawableRes) {
+        Drawable drawable = getResources().getDrawable(drawableRes, getTheme());
+        Canvas canvas = new Canvas();
+        Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(),
+                drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
+        canvas.setBitmap(bitmap);
+        drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
+        drawable.draw(canvas);
+
+        return bitmap;
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/SettingsActivityTest.java b/tests/robotests/src/com/android/settings/SettingsActivityTest.java
index df7a454..6a5b935 100644
--- a/tests/robotests/src/com/android/settings/SettingsActivityTest.java
+++ b/tests/robotests/src/com/android/settings/SettingsActivityTest.java
@@ -16,12 +16,13 @@
 
 package com.android.settings;
 
+import android.app.ActivityManager;
 import android.app.FragmentManager;
 import android.app.FragmentTransaction;
 import android.content.Context;
 import android.content.Intent;
+import android.graphics.Bitmap;
 import com.android.settings.testutils.FakeFeatureFactory;
-
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -32,9 +33,12 @@
 import org.robolectric.annotation.Config;
 
 import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyInt;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 @RunWith(SettingsRobolectricTestRunner.class)
@@ -45,7 +49,10 @@
     private Context mContext;
     @Mock
     private FragmentManager mFragmentManager;
-
+    @Mock
+    private ActivityManager.TaskDescription mTaskDescription;
+    @Mock
+    private Bitmap mBitmap;
     private SettingsActivity mActivity;
 
     @Before
@@ -53,14 +60,16 @@
         MockitoAnnotations.initMocks(this);
         FakeFeatureFactory.setupForTest(mContext);
         final FakeFeatureFactory factory =
-            (FakeFeatureFactory) FakeFeatureFactory.getFactory(mContext);
+                (FakeFeatureFactory) FakeFeatureFactory.getFactory(mContext);
         when(factory.dashboardFeatureProvider.isEnabled()).thenReturn(true);
+
+        mActivity = spy(new SettingsActivity());
+        doReturn(mBitmap).when(mActivity).getBitmapFromXmlResource(anyInt());
     }
 
     @Test
     public void testQueryTextChange_shouldUpdate() {
         final String testQuery = "abc";
-        mActivity = new SettingsActivity();
 
         assertThat(mActivity.mSearchQuery).isNull();
         try {
@@ -83,4 +92,11 @@
 
         mActivity.launchSettingFragment(null, true, mock(Intent.class));
     }
+
+    @Test
+    public void testSetTaskDescription_IconChanged() {
+        mActivity.setTaskDescription(mTaskDescription);
+
+        verify(mTaskDescription).setIcon(any());
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/SettingsShadowResources.java b/tests/robotests/src/com/android/settings/testutils/shadow/SettingsShadowResources.java
index cc55a4e..181ae64 100644
--- a/tests/robotests/src/com/android/settings/testutils/shadow/SettingsShadowResources.java
+++ b/tests/robotests/src/com/android/settings/testutils/shadow/SettingsShadowResources.java
@@ -56,6 +56,10 @@
         // TODO: Remove this once Robolectric is updated.
         if (id == com.android.settings.R.drawable.switchbar_background) {
             return new ColorDrawable();
+        } else if (id == com.android.settings.R.drawable.ic_launcher_settings) {
+            // ic_launcher_settings uses adaptive-icon, which is not supported by robolectric,
+            // change it to a normal drawable.
+            id = com.android.settings.R.drawable.ic_settings_wireless;
         }
         return super.loadDrawable(value, id, theme);
     }