Merge tag android-5.1.0_r1 into AOSP_5.1_MERGE

Change-Id: Iac0ab0e30d9cfdfc000757eb2bee30e0cc90d431
diff --git a/apps/LeanbackCustomizer/AndroidManifest.xml b/apps/LeanbackCustomizer/AndroidManifest.xml
index ed313c6..e931ca2 100644
--- a/apps/LeanbackCustomizer/AndroidManifest.xml
+++ b/apps/LeanbackCustomizer/AndroidManifest.xml
@@ -2,6 +2,10 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="com.google.android.leanbacklauncher.partnercustomizer">
 
+    <uses-sdk
+        android:minSdkVersion="21"
+        android:targetSdkVersion="21" />
+
     <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
     <uses-permission android:name="android.permission.INTERNET" />
 
@@ -19,5 +23,6 @@
                 <data android:scheme="package"/>
             </intent-filter>
         </receiver>
+
     </application>
 </manifest>
diff --git a/apps/LeanbackCustomizer/res/drawable-mdpi/ic_blank.png b/apps/LeanbackCustomizer/res/drawable-mdpi/ic_blank.png
deleted file mode 100644
index edae9c4..0000000
--- a/apps/LeanbackCustomizer/res/drawable-mdpi/ic_blank.png
+++ /dev/null
Binary files differ
diff --git a/apps/LeanbackCustomizer/res/values/config.xml b/apps/LeanbackCustomizer/res/values/config.xml
index 02f97e7..863c886 100644
--- a/apps/LeanbackCustomizer/res/values/config.xml
+++ b/apps/LeanbackCustomizer/res/values/config.xml
@@ -1,7 +1,18 @@
 <?xml version="1.0" encoding="utf-8"?>
 <resources>
+    <bool name="partner_show_live_tv_on_start_up">true</bool>
+
+    <!-- DO NOT TRANSLATE -->
+    <string name="partner_app_sorting_mode" translatable="false">fixed</string>
     <!-- DO NOT TRANSLATE -->
     <string name="partner_wallpaper" translatable="false">bg_custom</string>
+    <!-- DO NOT TRANSLATE -->
+    <string name="partner_widget_provider_component_name" translatable="false">
+        com.google.android.leanbacklauncher.partnerwidget/.ClockWidgetProvider
+    </string>
+
+    <!-- DO NOT TRANSLATE -->
+    <string name="partner_search_icon" translatable="false">ic_launcher</string>
 
     <!--
         DO NOT TRANSLATE
@@ -43,5 +54,8 @@
     <item type="drawable" name="settings_row_icon">@drawable/ic_title_settings</item>
 
     <!-- DO NOT TRANSLATE -->
+    <string name="partner_font" translatable="false">sans-serif-bold</string>
+
+    <!-- DO NOT TRANSLATE -->
     <string name="launcher_category" translatable="false">android.intent.category.LEANBACK_LAUNCHER</string>
 </resources>
diff --git a/apps/LeanbackCustomizer/src/com/android/leanbacklauncher/partnercustomizer/PartnerReceiver.java b/apps/LeanbackCustomizer/src/com/google/android/leanbacklauncher/partnercustomizer/PartnerReceiver.java
similarity index 89%
rename from apps/LeanbackCustomizer/src/com/android/leanbacklauncher/partnercustomizer/PartnerReceiver.java
rename to apps/LeanbackCustomizer/src/com/google/android/leanbacklauncher/partnercustomizer/PartnerReceiver.java
index 2c1282b..daef196 100644
--- a/apps/LeanbackCustomizer/src/com/android/leanbacklauncher/partnercustomizer/PartnerReceiver.java
+++ b/apps/LeanbackCustomizer/src/com/google/android/leanbacklauncher/partnercustomizer/PartnerReceiver.java
@@ -16,34 +16,17 @@
 
 package com.google.android.leanbacklauncher.partnercustomizer;
 
-import android.app.Activity;
 import android.app.Notification;
 import android.app.NotificationManager;
 import android.app.PendingIntent;
 import android.content.BroadcastReceiver;
-import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.pm.ActivityInfo;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
 import android.net.Uri;
-import android.os.AsyncTask;
 import android.os.Bundle;
 import android.os.Handler;
-import android.provider.Settings;
-import android.text.TextUtils;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.HttpURLConnection;
-import java.util.ArrayList;
-import java.util.List;
 
 /**
  * This class posts notifications that are used to populate the Partner Row of the Leanback Launcher
@@ -70,7 +53,7 @@
     private NotificationManager mNotifMan;
     private PackageManager mPkgMan;
 
-    // Cutoff value for when the Launcher displayes the Partner row as a single
+    // Cutoff value for when the Launcher displays the Partner row as a single
     // row, or a two row grid. Can be used for correctly positioning the partner
     // app entries.
     private int mRowCutoff = 0;
diff --git a/apps/LeanbackCustomizer/src/com/android/leanbacklauncher/partnercustomizer/TestActivity.java b/apps/LeanbackCustomizer/src/com/google/android/leanbacklauncher/partnercustomizer/TestActivity.java
similarity index 100%
rename from apps/LeanbackCustomizer/src/com/android/leanbacklauncher/partnercustomizer/TestActivity.java
rename to apps/LeanbackCustomizer/src/com/google/android/leanbacklauncher/partnercustomizer/TestActivity.java
diff --git a/apps/LeanbackWidget/Android.mk b/apps/LeanbackWidget/Android.mk
new file mode 100644
index 0000000..7209b52
--- /dev/null
+++ b/apps/LeanbackWidget/Android.mk
@@ -0,0 +1,13 @@
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE_PATH := $(PRODUCT_OUT)/system/app
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_PACKAGE_NAME := LeanbackWidget
+
+LOCAL_SDK_VERSION := current
+
+include $(BUILD_PACKAGE)
diff --git a/apps/LeanbackWidget/AndroidManifest.xml b/apps/LeanbackWidget/AndroidManifest.xml
new file mode 100644
index 0000000..9474560
--- /dev/null
+++ b/apps/LeanbackWidget/AndroidManifest.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.google.android.leanbacklauncher.partnerwidget">
+
+    <uses-sdk
+        android:minSdkVersion="19"
+        android:targetSdkVersion="19" />
+
+    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
+
+    <application android:label="@string/app_label">
+        <receiver android:name=".ClockWidgetProvider" >
+            <intent-filter>
+                <action android:name="android.net.conn.INET_CONDITION_ACTION" />
+                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
+
+                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
+            </intent-filter>
+
+            <meta-data
+                android:name="android.appwidget.provider"
+                android:resource="@xml/clock_widget_info" />
+        </receiver>
+
+    </application>
+</manifest>
diff --git a/apps/LeanbackWidget/proguard-project.txt b/apps/LeanbackWidget/proguard-project.txt
new file mode 100644
index 0000000..f2fe155
--- /dev/null
+++ b/apps/LeanbackWidget/proguard-project.txt
@@ -0,0 +1,20 @@
+# To enable ProGuard in your project, edit project.properties
+# to define the proguard.config property as described in that file.
+#
+# Add project specific ProGuard rules here.
+# By default, the flags in this file are appended to flags specified
+# in ${sdk.dir}/tools/proguard/proguard-android.txt
+# You can edit the include path and order by changing the ProGuard
+# include property in project.properties.
+#
+# For more details, see
+#   http://developer.android.com/guide/developing/tools/proguard.html
+
+# Add any project specific keep options here:
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+#   public *;
+#}
diff --git a/apps/LeanbackWidget/res/drawable-hdpi/ic_launcher.png b/apps/LeanbackWidget/res/drawable-hdpi/ic_launcher.png
new file mode 100644
index 0000000..eb9dfe2
--- /dev/null
+++ b/apps/LeanbackWidget/res/drawable-hdpi/ic_launcher.png
Binary files differ
diff --git a/apps/LeanbackWidget/res/drawable-hdpi/ic_widget_ethernet_not_connected.png b/apps/LeanbackWidget/res/drawable-hdpi/ic_widget_ethernet_not_connected.png
new file mode 100644
index 0000000..df02569
--- /dev/null
+++ b/apps/LeanbackWidget/res/drawable-hdpi/ic_widget_ethernet_not_connected.png
Binary files differ
diff --git a/apps/LeanbackWidget/res/drawable-hdpi/ic_widget_wifi_no_internet.png b/apps/LeanbackWidget/res/drawable-hdpi/ic_widget_wifi_no_internet.png
new file mode 100644
index 0000000..1b891de
--- /dev/null
+++ b/apps/LeanbackWidget/res/drawable-hdpi/ic_widget_wifi_no_internet.png
Binary files differ
diff --git a/apps/LeanbackWidget/res/drawable-hdpi/ic_widget_wifi_not_connected.png b/apps/LeanbackWidget/res/drawable-hdpi/ic_widget_wifi_not_connected.png
new file mode 100644
index 0000000..d6d4a30
--- /dev/null
+++ b/apps/LeanbackWidget/res/drawable-hdpi/ic_widget_wifi_not_connected.png
Binary files differ
diff --git a/apps/LeanbackWidget/res/drawable-mdpi/ic_launcher.png b/apps/LeanbackWidget/res/drawable-mdpi/ic_launcher.png
new file mode 100644
index 0000000..d8e46f3
--- /dev/null
+++ b/apps/LeanbackWidget/res/drawable-mdpi/ic_launcher.png
Binary files differ
diff --git a/apps/LeanbackWidget/res/drawable-mdpi/ic_widget_ethernet_not_connected.png b/apps/LeanbackWidget/res/drawable-mdpi/ic_widget_ethernet_not_connected.png
new file mode 100644
index 0000000..ece1478
--- /dev/null
+++ b/apps/LeanbackWidget/res/drawable-mdpi/ic_widget_ethernet_not_connected.png
Binary files differ
diff --git a/apps/LeanbackWidget/res/drawable-mdpi/ic_widget_wifi_no_internet.png b/apps/LeanbackWidget/res/drawable-mdpi/ic_widget_wifi_no_internet.png
new file mode 100644
index 0000000..5054b40
--- /dev/null
+++ b/apps/LeanbackWidget/res/drawable-mdpi/ic_widget_wifi_no_internet.png
Binary files differ
diff --git a/apps/LeanbackWidget/res/drawable-mdpi/ic_widget_wifi_not_connected.png b/apps/LeanbackWidget/res/drawable-mdpi/ic_widget_wifi_not_connected.png
new file mode 100644
index 0000000..ad53107
--- /dev/null
+++ b/apps/LeanbackWidget/res/drawable-mdpi/ic_widget_wifi_not_connected.png
Binary files differ
diff --git a/apps/LeanbackWidget/res/drawable-xhdpi/ic_launcher.png b/apps/LeanbackWidget/res/drawable-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..e4e79c9
--- /dev/null
+++ b/apps/LeanbackWidget/res/drawable-xhdpi/ic_launcher.png
Binary files differ
diff --git a/apps/LeanbackWidget/res/drawable-xhdpi/ic_widget_ethernet_not_connected.png b/apps/LeanbackWidget/res/drawable-xhdpi/ic_widget_ethernet_not_connected.png
new file mode 100644
index 0000000..5d0bfb9
--- /dev/null
+++ b/apps/LeanbackWidget/res/drawable-xhdpi/ic_widget_ethernet_not_connected.png
Binary files differ
diff --git a/apps/LeanbackWidget/res/drawable-xhdpi/ic_widget_wifi_no_internet.png b/apps/LeanbackWidget/res/drawable-xhdpi/ic_widget_wifi_no_internet.png
new file mode 100644
index 0000000..909d020
--- /dev/null
+++ b/apps/LeanbackWidget/res/drawable-xhdpi/ic_widget_wifi_no_internet.png
Binary files differ
diff --git a/apps/LeanbackWidget/res/drawable-xhdpi/ic_widget_wifi_not_connected.png b/apps/LeanbackWidget/res/drawable-xhdpi/ic_widget_wifi_not_connected.png
new file mode 100644
index 0000000..c892b26
--- /dev/null
+++ b/apps/LeanbackWidget/res/drawable-xhdpi/ic_widget_wifi_not_connected.png
Binary files differ
diff --git a/apps/LeanbackWidget/res/drawable-xxhdpi/ic_launcher.png b/apps/LeanbackWidget/res/drawable-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000..53ced36
--- /dev/null
+++ b/apps/LeanbackWidget/res/drawable-xxhdpi/ic_launcher.png
Binary files differ
diff --git a/apps/LeanbackWidget/res/drawable-xxhdpi/ic_widget_ethernet_not_connected.png b/apps/LeanbackWidget/res/drawable-xxhdpi/ic_widget_ethernet_not_connected.png
new file mode 100644
index 0000000..edb5a69
--- /dev/null
+++ b/apps/LeanbackWidget/res/drawable-xxhdpi/ic_widget_ethernet_not_connected.png
Binary files differ
diff --git a/apps/LeanbackWidget/res/layout/clock_widget.xml b/apps/LeanbackWidget/res/layout/clock_widget.xml
new file mode 100644
index 0000000..3ceb63e
--- /dev/null
+++ b/apps/LeanbackWidget/res/layout/clock_widget.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:layout_marginTop="@dimen/widget_top_margin" >
+
+    <TextClock
+        android:id="@+id/clock"
+        android:layout_width="@dimen/clock_width"
+        android:layout_height="wrap_content"
+        android:layout_alignParentEnd="true"
+        android:gravity="center_vertical|end"
+        android:format12Hour="@string/widget_12_hours_format"
+        android:format24Hour="@string/widget_24_hours_format"
+        android:fontFamily="@string/light_font"
+        android:includeFontPadding="false"
+        android:textColor="@color/clock_text_color"
+        android:textSize="@dimen/clock_text_size" />
+
+    <ImageView
+        android:id="@+id/connectivity_indicator"
+        android:layout_width="@dimen/connectivity_status_size"
+        android:layout_height="@dimen/connectivity_status_size"
+        android:layout_toStartOf="@+id/clock"
+        android:layout_centerVertical="true"
+        android:src="@null" />
+
+</RelativeLayout>
diff --git a/apps/LeanbackWidget/res/values/colors.xml b/apps/LeanbackWidget/res/values/colors.xml
new file mode 100644
index 0000000..bcc3a80
--- /dev/null
+++ b/apps/LeanbackWidget/res/values/colors.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <color name="clock_text_color">#FFEEEEEE</color>
+</resources>
diff --git a/apps/LeanbackWidget/res/values/config.xml b/apps/LeanbackWidget/res/values/config.xml
new file mode 100644
index 0000000..9e4f1ba
--- /dev/null
+++ b/apps/LeanbackWidget/res/values/config.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+    <!-- DO NOT TRANSLATE -->
+    <string name="font" translatable="false">sans-serif-condensed</string>
+    <!-- DO NOT TRANSLATE -->
+    <string name="light_font" translatable="false">sans-serif-light</string>
+    <!-- DO NOT TRANSLATE -->
+    <string name="regular_font" translatable="false">sans-serif</string>
+
+    <string name="widget_12_hours_format" translatable="false">h:mm</string>
+    <string name="widget_24_hours_format" translatable="false">kk:mm</string>
+
+</resources>
diff --git a/apps/LeanbackWidget/res/values/dimens.xml b/apps/LeanbackWidget/res/values/dimens.xml
new file mode 100644
index 0000000..fe1728f
--- /dev/null
+++ b/apps/LeanbackWidget/res/values/dimens.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <dimen name="clock_text_size">36sp</dimen>
+    <dimen name="clock_width">106dp</dimen>
+    <dimen name="connectivity_status_size">32dp</dimen>
+    <dimen name="widget_top_margin">1dp</dimen>
+</resources>
diff --git a/apps/LeanbackWidget/res/values/strings.xml b/apps/LeanbackWidget/res/values/strings.xml
new file mode 100644
index 0000000..4f733a4
--- /dev/null
+++ b/apps/LeanbackWidget/res/values/strings.xml
@@ -0,0 +1,5 @@
+<resources>
+
+    <string name="app_label">LeanbackWidget</string>
+
+</resources>
diff --git a/apps/LeanbackWidget/res/xml/clock_widget_info.xml b/apps/LeanbackWidget/res/xml/clock_widget_info.xml
new file mode 100644
index 0000000..a877df8
--- /dev/null
+++ b/apps/LeanbackWidget/res/xml/clock_widget_info.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
+    android:updatePeriodMillis="1800000"
+    android:initialLayout="@layout/clock_widget"
+    android:widgetCategory="home_screen"
+    android:resizeMode="none" />
diff --git a/apps/LeanbackWidget/src/com/google/android/leanbacklauncher/partnerwidget/ClockWidgetProvider.java b/apps/LeanbackWidget/src/com/google/android/leanbacklauncher/partnerwidget/ClockWidgetProvider.java
new file mode 100644
index 0000000..77a2851
--- /dev/null
+++ b/apps/LeanbackWidget/src/com/google/android/leanbacklauncher/partnerwidget/ClockWidgetProvider.java
@@ -0,0 +1,95 @@
+package com.google.android.leanbacklauncher.partnerwidget;
+
+import android.appwidget.AppWidgetManager;
+import android.appwidget.AppWidgetProvider;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.net.ConnectivityManager;
+import android.net.NetworkInfo;
+import android.os.Bundle;
+import android.widget.RemoteViews;
+
+public class ClockWidgetProvider extends AppWidgetProvider {
+
+    private static final String SHARED_PREFS = "widget-prefs";
+    private static final int INET_CONDITION_THRESHOLD = 50;
+    private static final String INET_CONDITION_ACTION = "android.net.conn.INET_CONDITION_ACTION";
+    private static final String EXTRA_INET_CONDITION = "inetCondition";
+
+    @Override
+    public void onReceive(Context context, Intent intent) {
+        String intentAction = intent.getAction();
+
+        if (INET_CONDITION_ACTION.equals(intentAction) ||
+                ConnectivityManager.CONNECTIVITY_ACTION.equals(intentAction)) {
+
+            if (INET_CONDITION_ACTION.equals(intentAction)) {
+                // a broadcast with this intent action is only fired when we are actually connected
+                // (i.e connectionStatus = 100).  So, clearing connectivity status when changing
+                // networks is required
+                int connectionStatus = intent.getIntExtra(EXTRA_INET_CONDITION, -551);
+                writeConnectivity(context, connectionStatus > INET_CONDITION_THRESHOLD);
+            }
+
+            update(context);
+        }
+
+        super.onReceive(context, intent);
+    }
+
+    @Override
+    public void onAppWidgetOptionsChanged(Context context, AppWidgetManager appWidgetManager,
+            int appWidgetId, Bundle newOptions) {
+        update(context);
+    }
+
+    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
+        update(context);
+        super.onUpdate(context, appWidgetManager, appWidgetIds);
+    }
+
+    private void update(Context context) {
+        AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
+        ComponentName thisWidget = new ComponentName(context, ClockWidgetProvider.class);
+        appWidgetManager.updateAppWidget(thisWidget, getRemoteViews(context));
+    }
+
+    private RemoteViews getRemoteViews(Context context) {
+        RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.clock_widget);
+        remoteViews.setImageViewResource(R.id.connectivity_indicator, getConnectedResId(context));
+
+        return remoteViews;
+    }
+
+    private static int getConnectedResId(Context context) {
+        ConnectivityManager cm = (ConnectivityManager) context
+                .getSystemService(Context.CONNECTIVITY_SERVICE);
+        NetworkInfo info = cm.getActiveNetworkInfo();
+
+        int resId = 0;
+        if (info == null || !info.isAvailable() || !info.isConnected()) {
+            // can't have Internet access with no network
+            writeConnectivity(context, false);
+            resId = R.drawable.ic_widget_wifi_not_connected;
+        } else if (!readConnectivity(context)) {
+            resId = R.drawable.ic_widget_wifi_no_internet;
+        } else {
+            // internet is connected and working, show nothing
+            resId = android.R.color.transparent;
+        }
+
+        return resId;
+    }
+
+    private static void writeConnectivity(Context context, boolean inetConnected) {
+        context.getSharedPreferences(SHARED_PREFS, Context.MODE_PRIVATE).edit()
+                .putBoolean(EXTRA_INET_CONDITION, inetConnected).apply();
+    }
+
+    private static boolean readConnectivity(Context context) {
+        return context.getSharedPreferences(SHARED_PREFS, Context.MODE_PRIVATE).getBoolean(
+                EXTRA_INET_CONDITION, true);
+    }
+
+}
diff --git a/apps/SetupCustomizer/Android.mk b/apps/SetupCustomizer/Android.mk
new file mode 100644
index 0000000..9312a36
--- /dev/null
+++ b/apps/SetupCustomizer/Android.mk
@@ -0,0 +1,13 @@
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE_PATH := $(PRODUCT_OUT)/system/priv-app
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_PACKAGE_NAME := TvSetupCustomizer
+
+LOCAL_SDK_VERSION := current
+
+include $(BUILD_PACKAGE)
diff --git a/apps/SetupCustomizer/AndroidManifest.xml b/apps/SetupCustomizer/AndroidManifest.xml
new file mode 100644
index 0000000..bdd31ff
--- /dev/null
+++ b/apps/SetupCustomizer/AndroidManifest.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.google.android.tvsetup.partnercustomizer">
+
+    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
+    <uses-permission android:name="android.permission.INTERNET" />
+
+    <application android:label="@string/app_label">
+
+        <receiver android:name=".PartnerReceiver">
+            <intent-filter>
+                <action android:name="com.google.android.tvsetup.action.PARTNER_CUSTOMIZATION" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+
+            <intent-filter>
+                <action android:name="android.intent.action.PACKAGE_ADDED" />
+                <action android:name="android.intent.action.PACKAGE_REMOVED" />
+                <data android:scheme="package"/>
+            </intent-filter>
+        </receiver>
+    </application>
+</manifest>
diff --git a/apps/SetupCustomizer/proguard-project.txt b/apps/SetupCustomizer/proguard-project.txt
new file mode 100644
index 0000000..f2fe155
--- /dev/null
+++ b/apps/SetupCustomizer/proguard-project.txt
@@ -0,0 +1,20 @@
+# To enable ProGuard in your project, edit project.properties
+# to define the proguard.config property as described in that file.
+#
+# Add project specific ProGuard rules here.
+# By default, the flags in this file are appended to flags specified
+# in ${sdk.dir}/tools/proguard/proguard-android.txt
+# You can edit the include path and order by changing the ProGuard
+# include property in project.properties.
+#
+# For more details, see
+#   http://developer.android.com/guide/developing/tools/proguard.html
+
+# Add any project specific keep options here:
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+#   public *;
+#}
diff --git a/apps/SetupCustomizer/res/drawable-xhdpi/welcome_background.png b/apps/SetupCustomizer/res/drawable-xhdpi/welcome_background.png
new file mode 100644
index 0000000..2f2533a
--- /dev/null
+++ b/apps/SetupCustomizer/res/drawable-xhdpi/welcome_background.png
Binary files differ
diff --git a/apps/SetupCustomizer/res/values-de/strings.xml b/apps/SetupCustomizer/res/values-de/strings.xml
new file mode 100644
index 0000000..2794b47
--- /dev/null
+++ b/apps/SetupCustomizer/res/values-de/strings.xml
@@ -0,0 +1,4 @@
+<resources>
+    <!-- Welcome message -->
+    <string name="welcome_message">a really really long welcome message, because german</string>
+</resources>
diff --git a/apps/SetupCustomizer/res/values-en-rCA/strings.xml b/apps/SetupCustomizer/res/values-en-rCA/strings.xml
new file mode 100644
index 0000000..2b19782
--- /dev/null
+++ b/apps/SetupCustomizer/res/values-en-rCA/strings.xml
@@ -0,0 +1,4 @@
+<resources>
+    <!-- Welcome message -->
+    <string name="welcome_message">welcome_message, eh?</string>
+</resources>
diff --git a/apps/SetupCustomizer/res/values/bools.xml b/apps/SetupCustomizer/res/values/bools.xml
new file mode 100644
index 0000000..4e19b14
--- /dev/null
+++ b/apps/SetupCustomizer/res/values/bools.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright 2012-2014 Google Inc. All Rights Reserved. -->
+<resources xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <!-- Display "SKIP" in network selection screen -->
+    <bool name="show_skip_network">true</bool>
+
+    <!-- Allow user to skip Google signin at signin setup step -->
+    <bool name="show_skip_signin">true</bool>
+
+    <!-- Show wifi WPS option at top of list -->
+    <bool name="show_wps_at_top">true</bool>
+
+    <!-- Prevent users from returning to the pre-setup oem customization hook -->
+    <bool name="prevent_prehook_replay">true</bool>
+</resources>
diff --git a/apps/SetupCustomizer/res/values/dimens.xml b/apps/SetupCustomizer/res/values/dimens.xml
new file mode 100644
index 0000000..6907661
--- /dev/null
+++ b/apps/SetupCustomizer/res/values/dimens.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright 2012-2014 Google Inc. All Rights Reserved. -->
+<resources xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <!-- Max width for welcome text (default: 536dp) -->
+    <dimen name="welcome_message_max_width">400dp</dimen>
+
+    <!-- Offset (positive or negative) for the welcome message (default: 0) -->
+    <dimen name="welcome_message_offset">-100dp</dimen>
+
+</resources>
diff --git a/apps/SetupCustomizer/res/values/strings.xml b/apps/SetupCustomizer/res/values/strings.xml
new file mode 100644
index 0000000..f53fb11
--- /dev/null
+++ b/apps/SetupCustomizer/res/values/strings.xml
@@ -0,0 +1,11 @@
+<resources>
+
+    <string name="app_label">SetupCustomizer</string>
+
+    <!-- Welcome message -->
+    <string name="welcome_message">welcome_message</string>
+
+    <!-- Custom wallpaper [DO NOT TRANSLATE] -->
+    <string name="setup_wallpaper_component" translatable="false">com.android.systemui/com.android.systemui.ImageWallpaper</string>
+
+</resources>
diff --git a/apps/SetupCustomizer/src/com/android/tvsetup/partnercustomizer/PartnerReceiver.java b/apps/SetupCustomizer/src/com/android/tvsetup/partnercustomizer/PartnerReceiver.java
new file mode 100644
index 0000000..cf8efd9
--- /dev/null
+++ b/apps/SetupCustomizer/src/com/android/tvsetup/partnercustomizer/PartnerReceiver.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.android.tvsetup.partnercustomizer;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+
+/**
+ * This class allows the system/setup app to find the partner customization package.
+ *
+ * Package must be a system app to be used for partner customization.
+ */
+public class PartnerReceiver extends BroadcastReceiver {
+
+    @Override
+    public void onReceive(Context context, Intent intent) {
+    }
+}
diff --git a/etc/apns-full-conf.xml b/etc/apns-full-conf.xml
index 14f6e91..a78ea97 100755
--- a/etc/apns-full-conf.xml
+++ b/etc/apns-full-conf.xml
@@ -4097,48 +4097,6 @@
       type="mms"
   />
 
-  <apn carrier="BiBoB Internet profil"
-      mcc="238"
-      mnc="02"
-      apn="internet.bibob.dk"
-      type="default,supl"
-      mvno_type="spn"
-      mvno_match_data="BiBoB"
-  />
-
-  <apn carrier="BiBoB"
-      mcc="238"
-      mnc="02"
-      apn="mms.bibob.dk"
-      mmsproxy="212.88.64.8"
-      mmsport="8080"
-      mmsc="http://mms.telenor.dk"
-      type="mms"
-      mvno_type="spn"
-      mvno_match_data="BiBoB"
-  />
-
-  <apn carrier="CBB Internet"
-      mcc="238"
-      mnc="02"
-      apn="internet"
-      type="default,supl"
-      mvno_type="spn"
-      mvno_match_data="CBB Mobil"
-  />
-
-  <apn carrier="CBB MMS"
-      mcc="238"
-      mnc="02"
-      apn="telenor"
-      mmsproxy="212.88.64.8"
-      mmsport="8080"
-      mmsc="http://mms.telenor.dk"
-      type="mms"
-      mvno_type="spn"
-      mvno_match_data="CBB Mobil"
-  />
-
   <apn carrier="3"
       mcc="238"
       mnc="06"
@@ -4431,15 +4389,38 @@
       type="mms"
   />
 
-  <apn carrier="Tele2"
+  <apn carrier="Tele2 Internet"
       mcc="240"
       mnc="07"
-      apn="internet.tele2.no"
-      mmsc="http://mmsc.tele2.no"
-      mmsproxy="193.12.40.14"
+      apn="4g.tele2.se"
+      type="default,supl"
+  />
+
+  <apn carrier="Tele2 MMS"
+      mcc="240"
+      mnc="07"
+      apn="4g.tele2.se"
+      mmsc="http://mmsc.tele2.se"
+      mmsproxy="130.244.202.30"
       mmsport="8080"
-      protocol="IP"
-      type="default,supl,mms"
+      type="mms"
+  />
+
+  <apn carrier="Tele2 Internet 3G"
+      mcc="240"
+      mnc="07"
+      apn="internet.tele2.se"
+      type="default,supl"
+  />
+
+  <apn carrier="Tele2 MMS 3G"
+      mcc="240"
+      mnc="07"
+      apn="internet.tele2.se"
+      mmsc="http://mmsc.tele2.se"
+      mmsproxy="130.244.202.30"
+      mmsport="8080"
+      type="mms"
   />
 
   <apn carrier="Tele2 Internet"
@@ -5831,9 +5812,7 @@
       mcc="260"
       mnc="06"
       apn="mms"
-      mmsc="http://10.10.28.164/mms/wapenc"
-      mmsproxy="10.10.25.5"
-      mmsport="8080"
+      mmsc="http://mmsc.play.pl/mms/wapenc"
       type="mms"
   />
 
@@ -5995,8 +5974,6 @@
       user="vodafone"
       password="vodafone"
       authtype="1"
-      proxy="iproxy.vodafone.pt"
-      port="80"
       mmsc="http://mms.vodafone.pt/servlets/mms"
       mmsproxy="iproxy.vodafone.pt"
       mmsport="80"
@@ -6011,39 +5988,6 @@
       type="dun"
   />
 
-  <apn carrier="ZON Internet"
-      mcc="268"
-      mnc="01"
-      apn=""
-      type="ia"
-      mvno_match_data="ZON"
-      mvno_type="spn"
-  />
-
-  <apn carrier="ZON Internet"
-      mcc="268"
-      mnc="01"
-      apn="internet.zon.pt"
-      type="default,supl"
-      mvno_match_data="ZON"
-      mvno_type="spn"
-  />
-
-  <apn carrier="ZON MMS"
-      mcc="268"
-      mnc="01"
-      apn="vas.zon.pt"
-      user="vas"
-      password="vas"
-      authtype="1"
-      mmsc="http://mms/servlets/mms"
-      mmsproxy="213.30.27.63"
-      mmsport="8799"
-      type="mms"
-      mvno_match_data="ZON"
-      mvno_type="spn"
-  />
-
   <apn carrier="PortalOptimus"
       mcc="268"
       mnc="03"
@@ -6134,11 +6078,11 @@
       type="mms"
   />
 
-  <apn carrier="Vox Mobile"
+  <apn carrier="Orange"
       mcc="270"
       mnc="99"
-      apn="vox.lu"
-      mmsc="http://mms.vox.lu"
+      apn="orange.lu"
+      mmsc="http://mms.orange.lu"
       mmsproxy="212.88.139.44"
       mmsport="8080"
       type="default,supl,mms"
@@ -7085,7 +7029,7 @@
 
   <apn carrier="Verizon CDMA HRPD"
      mcc="310"
-     mnc="00"
+     mnc="000"
      mmsc="http://mms.vzwreseller.com/servlets/mms"
      type="default,mms,hipri,dun,supl"
      mvno_type="spn"
@@ -9826,6 +9770,16 @@
       mmsport="80"
   />
 
+  <apn carrier="ATT Phone"
+      mcc="310"
+      mnc="410"
+      apn="phone"
+      type="default,mms,supl,fota,hipri"
+      mmsc="http://mmsc.mobile.att.net"
+      mmsproxy="proxy.mobile.att.net"
+      mmsport="80"
+  />
+
   <apn carrier="ATT WAP"
       mcc="310"
       mnc="410"
@@ -27770,6 +27724,24 @@
       type="mms"
   />
 
+  <apn carrier="China Unicom 3G"
+      apn="3gnet"
+      mcc="460"
+      mnc="09"
+      port="80"
+      type="default, supl"/>
+
+  <apn carrier="China Unicom wap"
+      apn="3gwap"
+      mcc="460"
+      mnc="09"
+      proxy="10.0.0.172"
+      port="80"
+      mmsproxy="10.0.0.172"
+      mmsport="80"
+      mmsc="http://mmsc.myuni.com.cn"
+      type="default, mms"/>
+
   <apn carrier="遠傳電信(Far EasTone) (MMS)"
       mcc="466"
       mnc="01"
@@ -32983,7 +32955,7 @@
       mvno_type="spn"
   />
 
-  <apn carrier="Internet Éito"
+  <apn carrier="Internet Éxito"
       mcc="732"
       mnc="103"
       apn="movilexito.net.co"
@@ -33050,7 +33022,7 @@
       mvno_type="spn"
   />
 
-  <apn carrier="Internet Éito"
+  <apn carrier="Internet Éxito"
       mcc="732"
       mnc="111"
       apn="movilexito.net.co"
@@ -33123,6 +33095,14 @@
       type="default"
   />
 
+  <apn carrier="ETB 4G"
+      mcc="732"
+      mnc="187"
+      apn="internetmovil.etb.net.co"
+      authtype="0"
+      type="default"
+  />
+
   <apn carrier="Digitel 412"
       mcc="734"
       mnc="01"