DO NOT MERGE : Add link to home screen settings

Bug: 19536065
Change-Id: Idda0ff64336b16d6b28a7f68eb2d8246985b0fa9
diff --git a/Settings/res/drawable-hdpi/ic_settings_home.png b/Settings/res/drawable-hdpi/ic_settings_home.png
new file mode 100644
index 0000000..09d384a
--- /dev/null
+++ b/Settings/res/drawable-hdpi/ic_settings_home.png
Binary files differ
diff --git a/Settings/res/drawable-mdpi/ic_settings_home.png b/Settings/res/drawable-mdpi/ic_settings_home.png
new file mode 100644
index 0000000..5965e31
--- /dev/null
+++ b/Settings/res/drawable-mdpi/ic_settings_home.png
Binary files differ
diff --git a/Settings/res/drawable-xhdpi/ic_settings_home.png b/Settings/res/drawable-xhdpi/ic_settings_home.png
new file mode 100644
index 0000000..693d81f
--- /dev/null
+++ b/Settings/res/drawable-xhdpi/ic_settings_home.png
Binary files differ
diff --git a/Settings/res/drawable-xxhdpi/ic_settings_home.png b/Settings/res/drawable-xxhdpi/ic_settings_home.png
new file mode 100644
index 0000000..9c6d5c5
--- /dev/null
+++ b/Settings/res/drawable-xxhdpi/ic_settings_home.png
Binary files differ
diff --git a/Settings/res/values/strings.xml b/Settings/res/values/strings.xml
index b208f1e..edf9153 100644
--- a/Settings/res/values/strings.xml
+++ b/Settings/res/values/strings.xml
@@ -197,6 +197,8 @@
     <string name="system_language">Language</string>
     <!-- Preference which manages input method settings. [CHAR LIMIT=50] -->
     <string name="system_keyboard">Keyboard</string>
+    <!-- Preference which manages home screen settings. [CHAR LIMIT=50] -->
+    <string name="system_home">Home screen</string>
     <!-- Preference which manages search and google now settings. [CHAR LIMIT=50] -->
     <string name="system_search">Search</string>
     <!-- Preference which manages security settings. [CHAR LIMIT=50] -->
diff --git a/Settings/res/xml/preferences.xml b/Settings/res/xml/preferences.xml
index 4666230..bb72890 100644
--- a/Settings/res/xml/preferences.xml
+++ b/Settings/res/xml/preferences.xml
@@ -40,6 +40,12 @@
             android:targetPackage="com.android.tv.settings" />
     </Preference>
     <Preference
+        android:icon="@drawable/ic_settings_home"
+        android:key="home"
+        android:title="@string/system_home" >
+        <intent android:action="com.google.android.leanbacklauncher.SETTINGS" />
+    </Preference>
+    <Preference
         android:icon="@drawable/ic_settings_search"
         android:key="search"
         android:title="@string/system_search" >
diff --git a/Settings/src/com/android/tv/settings/BrowseInfo.java b/Settings/src/com/android/tv/settings/BrowseInfo.java
index 8f38f82..e453ab6 100644
--- a/Settings/src/com/android/tv/settings/BrowseInfo.java
+++ b/Settings/src/com/android/tv/settings/BrowseInfo.java
@@ -26,8 +26,10 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.Intent.ShortcutIconResource;
+import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManager.NameNotFoundException;
+import android.content.pm.ResolveInfo;
 import android.content.res.Resources;
 import android.content.res.Resources.NotFoundException;
 import android.content.res.TypedArray;
@@ -175,6 +177,7 @@
     private static final String PREF_KEY_WIFI = "network";
     private static final String PREF_KEY_DEVELOPER = "developer";
     private static final String PREF_KEY_INPUTS = "inputs";
+    private static final String PREF_KEY_HOME = "home";
 
     private final Context mContext;
     private final AuthenticatorHelper mAuthenticatorHelper;
@@ -278,6 +281,17 @@
             if (PREF_KEY_ADD_ACCOUNT.equals(key)) {
                 mAccountHeaderId = mHeaderId;
                 addAccounts(mRow);
+            } else if (PREF_KEY_HOME.equals(key)) {
+                // Only show home screen setting if there's a system app to handle the intent.
+                Intent recIntent = getIntent(parser, attrs, mHeaderId);
+                if (systemIntentIsHandled(recIntent)) {
+                    mRow.add(new MenuItem.Builder()
+                            .id(mNextItemId++)
+                            .title(title)
+                            .imageResourceId(mContext, iconRes)
+                            .intent(recIntent)
+                            .build());
+                }
             } else if ((!key.equals(PREF_KEY_DEVELOPER) || mDeveloperEnabled)
                     && (!key.equals(PREF_KEY_INPUTS) || mInputSettingNeeded)) {
                 MenuItem.TextGetter descriptionGetter = getDescriptionTextGetterFromKey(key);
@@ -572,4 +586,24 @@
                 R.drawable.ic_settings_google_account);
         return UriUtils.getShortcutIconResourceUri(iconResource).toString();
     }
+
+    private boolean systemIntentIsHandled(Intent intent) {
+        if (mContext == null || intent == null) {
+            return false;
+        }
+
+        PackageManager pm = mContext.getPackageManager();
+        if (pm == null) {
+            return false;
+        }
+
+        for (ResolveInfo info : pm.queryIntentActivities(intent, 0)) {
+            if (info.activityInfo != null && info.activityInfo.enabled &&
+                (info.activityInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) ==
+                        ApplicationInfo.FLAG_SYSTEM) {
+                return true;
+            }
+        }
+        return false;
+    }
 }