Merge "Allow the old launcher content URI to be overrided" into ub-now-mister-ugly
diff --git a/WallpaperPicker/src/com/android/launcher3/WallpaperCropActivity.java b/WallpaperPicker/src/com/android/launcher3/WallpaperCropActivity.java
index 1f35622..11684c3 100644
--- a/WallpaperPicker/src/com/android/launcher3/WallpaperCropActivity.java
+++ b/WallpaperPicker/src/com/android/launcher3/WallpaperCropActivity.java
@@ -367,17 +367,12 @@
         // Get the crop
         RectF cropRect = mCropView.getCrop();
 
-        // due to rounding errors in the cropview renderer the edges can be slightly offset
-        // therefore we ensure that the boundaries are sanely defined
-        cropRect.left = Math.max(0, cropRect.left);
-        cropRect.right = Math.min(mCropView.getWidth(), cropRect.right);
-        cropRect.top = Math.max(0, cropRect.top);
-        cropRect.bottom = Math.min(mCropView.getHeight(), cropRect.bottom);
+        Point inSize = mCropView.getSourceDimensions();
 
         int cropRotation = mCropView.getImageRotation();
         float cropScale = mCropView.getWidth() / (float) cropRect.width();
 
-        Point inSize = mCropView.getSourceDimensions();
+
         Matrix rotateMatrix = new Matrix();
         rotateMatrix.setRotate(cropRotation);
         float[] rotatedInSize = new float[] { inSize.x, inSize.y };
@@ -385,6 +380,14 @@
         rotatedInSize[0] = Math.abs(rotatedInSize[0]);
         rotatedInSize[1] = Math.abs(rotatedInSize[1]);
 
+
+        // due to rounding errors in the cropview renderer the edges can be slightly offset
+        // therefore we ensure that the boundaries are sanely defined
+        cropRect.left = Math.max(0, cropRect.left);
+        cropRect.right = Math.min(rotatedInSize[0], cropRect.right);
+        cropRect.top = Math.max(0, cropRect.top);
+        cropRect.bottom = Math.min(rotatedInSize[1], cropRect.bottom);
+
         // ADJUST CROP WIDTH
         // Extend the crop all the way to the right, for parallax
         // (or all the way to the left, in RTL)
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index dfd11f1..3d337db 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -111,5 +111,5 @@
     <string name="package_state_downloading" msgid="4088770468458724721">"Laai tans af…"</string>
     <string name="package_state_installing" msgid="7588193972189849870">"Installeer tans…"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Onbekend"</string>
-    <string name="package_state_error" msgid="6858560020210815018">"Fout"</string>
+    <string name="package_state_error" msgid="7672093962724223588">"Nie teruggestel nie"</string>
 </resources>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index 05ecc9d..489164c 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -111,5 +111,5 @@
     <string name="package_state_downloading" msgid="4088770468458724721">"በማውረድ ላይ"</string>
     <string name="package_state_installing" msgid="7588193972189849870">"በመጫን ላይ"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"የማይታወቅ"</string>
-    <string name="package_state_error" msgid="6858560020210815018">"ስህተት"</string>
+    <string name="package_state_error" msgid="7672093962724223588">"ወደነበረበት አልተመለሰም"</string>
 </resources>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index 21c4135..90eae74 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -111,5 +111,5 @@
     <string name="package_state_downloading" msgid="4088770468458724721">"جارٍ التنزيل"</string>
     <string name="package_state_installing" msgid="7588193972189849870">"جارٍ التثبيت"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"غير معروفة"</string>
-    <string name="package_state_error" msgid="6858560020210815018">"خطأ"</string>
+    <string name="package_state_error" msgid="7672093962724223588">"استعادة مخفقة"</string>
 </resources>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index 322777c..198cd18 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -111,5 +111,5 @@
     <string name="package_state_downloading" msgid="4088770468458724721">"Изтегля се"</string>
     <string name="package_state_installing" msgid="7588193972189849870">"Инсталира се"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Няма информация"</string>
-    <string name="package_state_error" msgid="6858560020210815018">"Грешка"</string>
+    <string name="package_state_error" msgid="7672093962724223588">"Не е възстановено"</string>
 </resources>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index 6ff3b4f..c187094 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -111,5 +111,5 @@
     <string name="package_state_downloading" msgid="4088770468458724721">"S\'està baixant"</string>
     <string name="package_state_installing" msgid="7588193972189849870">"Instal·lant"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Desconegut"</string>
-    <string name="package_state_error" msgid="6858560020210815018">"Error"</string>
+    <string name="package_state_error" msgid="7672093962724223588">"No restaurat"</string>
 </resources>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index 59400ca..6870f89 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -111,5 +111,5 @@
     <string name="package_state_downloading" msgid="4088770468458724721">"Stahování"</string>
     <string name="package_state_installing" msgid="7588193972189849870">"Instalace"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Neznámé"</string>
-    <string name="package_state_error" msgid="6858560020210815018">"Chyba"</string>
+    <string name="package_state_error" msgid="7672093962724223588">"Nebylo obnoveno"</string>
 </resources>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index d6cfb83..f0ff7dc 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -111,5 +111,5 @@
     <string name="package_state_downloading" msgid="4088770468458724721">"Downloader"</string>
     <string name="package_state_installing" msgid="7588193972189849870">"Installerer"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Ukendt"</string>
-    <string name="package_state_error" msgid="6858560020210815018">"Fejl"</string>
+    <string name="package_state_error" msgid="7672093962724223588">"Ikke gendannet"</string>
 </resources>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index b4f189d..62e5266 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -111,5 +111,5 @@
     <string name="package_state_downloading" msgid="4088770468458724721">"Download läuft"</string>
     <string name="package_state_installing" msgid="7588193972189849870">"Installation"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Unbekannt"</string>
-    <string name="package_state_error" msgid="6858560020210815018">"Fehler"</string>
+    <string name="package_state_error" msgid="7672093962724223588">"Nicht wiederhergestellt"</string>
 </resources>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index 096c1d2..66cea00 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -111,5 +111,5 @@
     <string name="package_state_downloading" msgid="4088770468458724721">"Λήψη "</string>
     <string name="package_state_installing" msgid="7588193972189849870">"Εγκατάσταση"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Άγνωστο"</string>
-    <string name="package_state_error" msgid="6858560020210815018">"Σφάλμα"</string>
+    <string name="package_state_error" msgid="7672093962724223588">"Δεν ανακτήθηκε"</string>
 </resources>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index ff83b1b..eed1f80 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -111,5 +111,5 @@
     <string name="package_state_downloading" msgid="4088770468458724721">"Downloading"</string>
     <string name="package_state_installing" msgid="7588193972189849870">"Installing"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Unknown"</string>
-    <string name="package_state_error" msgid="6858560020210815018">"Error"</string>
+    <string name="package_state_error" msgid="7672093962724223588">"Not restored"</string>
 </resources>
diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml
index ff83b1b..eed1f80 100644
--- a/res/values-en-rIN/strings.xml
+++ b/res/values-en-rIN/strings.xml
@@ -111,5 +111,5 @@
     <string name="package_state_downloading" msgid="4088770468458724721">"Downloading"</string>
     <string name="package_state_installing" msgid="7588193972189849870">"Installing"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Unknown"</string>
-    <string name="package_state_error" msgid="6858560020210815018">"Error"</string>
+    <string name="package_state_error" msgid="7672093962724223588">"Not restored"</string>
 </resources>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index 7f5f06c..b325c35 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -111,5 +111,5 @@
     <string name="package_state_downloading" msgid="4088770468458724721">"Descargando"</string>
     <string name="package_state_installing" msgid="7588193972189849870">"Instalando"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Desconocido"</string>
-    <string name="package_state_error" msgid="6858560020210815018">"Error"</string>
+    <string name="package_state_error" msgid="7672093962724223588">"No restaurado"</string>
 </resources>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index da36650..3efdf9b 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -111,5 +111,5 @@
     <string name="package_state_downloading" msgid="4088770468458724721">"Descargando"</string>
     <string name="package_state_installing" msgid="7588193972189849870">"Instalando"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Desconocido"</string>
-    <string name="package_state_error" msgid="6858560020210815018">"Error"</string>
+    <string name="package_state_error" msgid="7672093962724223588">"No restaurado"</string>
 </resources>
diff --git a/res/values-et-rEE/strings.xml b/res/values-et-rEE/strings.xml
index 185ddea..73e4779 100644
--- a/res/values-et-rEE/strings.xml
+++ b/res/values-et-rEE/strings.xml
@@ -111,5 +111,5 @@
     <string name="package_state_downloading" msgid="4088770468458724721">"Allalaadimine"</string>
     <string name="package_state_installing" msgid="7588193972189849870">"Installimine"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Teadmata"</string>
-    <string name="package_state_error" msgid="6858560020210815018">"Viga"</string>
+    <string name="package_state_error" msgid="7672093962724223588">"Ei taastatud"</string>
 </resources>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index ba2d222..d5e271b 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -111,5 +111,5 @@
     <string name="package_state_downloading" msgid="4088770468458724721">"در حال دانلود"</string>
     <string name="package_state_installing" msgid="7588193972189849870">"در حال نصب"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"نامشخص"</string>
-    <string name="package_state_error" msgid="6858560020210815018">"خطا"</string>
+    <string name="package_state_error" msgid="7672093962724223588">"بازیابی نشد"</string>
 </resources>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index 57a3bb5..c6ffdf6 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -111,5 +111,5 @@
     <string name="package_state_downloading" msgid="4088770468458724721">"Ladataan"</string>
     <string name="package_state_installing" msgid="7588193972189849870">"Asennetaan"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Tuntematon"</string>
-    <string name="package_state_error" msgid="6858560020210815018">"Virhe"</string>
+    <string name="package_state_error" msgid="7672093962724223588">"Ei palautettu"</string>
 </resources>
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
index cd7d6c0..0c71823 100644
--- a/res/values-fr-rCA/strings.xml
+++ b/res/values-fr-rCA/strings.xml
@@ -111,5 +111,5 @@
     <string name="package_state_downloading" msgid="4088770468458724721">"Téléchargement..."</string>
     <string name="package_state_installing" msgid="7588193972189849870">"Installation…"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Inconnu"</string>
-    <string name="package_state_error" msgid="6858560020210815018">"Erreur"</string>
+    <string name="package_state_error" msgid="7672093962724223588">"Non restauré"</string>
 </resources>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index f228628..41ea546 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -111,5 +111,5 @@
     <string name="package_state_downloading" msgid="4088770468458724721">"Téléchargement…"</string>
     <string name="package_state_installing" msgid="7588193972189849870">"Installation…"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Inconnu"</string>
-    <string name="package_state_error" msgid="6858560020210815018">"Erreur"</string>
+    <string name="package_state_error" msgid="7672093962724223588">"Non restauré"</string>
 </resources>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index c79125a..d5e4074 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -111,5 +111,5 @@
     <string name="package_state_downloading" msgid="4088770468458724721">"डाउनलोड हो रहा है"</string>
     <string name="package_state_installing" msgid="7588193972189849870">"इंस्टॉल हो रहा है"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"अज्ञात"</string>
-    <string name="package_state_error" msgid="6858560020210815018">"त्रुटि"</string>
+    <string name="package_state_error" msgid="7672093962724223588">"पुन:स्थापित नहीं हुआ"</string>
 </resources>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index 59ad94c..8116ba4 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -111,5 +111,5 @@
     <string name="package_state_downloading" msgid="4088770468458724721">"Preuzimanje"</string>
     <string name="package_state_installing" msgid="7588193972189849870">"Instaliranje"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Nepoznato"</string>
-    <string name="package_state_error" msgid="6858560020210815018">"Pogreška"</string>
+    <string name="package_state_error" msgid="7672093962724223588">"Nije vraćeno"</string>
 </resources>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index b9ffbb5..59fc6e1 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -108,8 +108,8 @@
     <string name="wallpaper_button_text" msgid="8404103075899945851">"Háttérképek"</string>
     <string name="settings_button_text" msgid="8119458837558863227">"Beállítások"</string>
     <string name="package_state_enqueued" msgid="6227252464303085641">"Várakozik"</string>
-    <string name="package_state_downloading" msgid="4088770468458724721">"Letöltés"</string>
-    <string name="package_state_installing" msgid="7588193972189849870">"Telepítése"</string>
+    <string name="package_state_downloading" msgid="4088770468458724721">"Letöltés alatt"</string>
+    <string name="package_state_installing" msgid="7588193972189849870">"Települ"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Ismeretlen"</string>
-    <string name="package_state_error" msgid="6858560020210815018">"Hiba"</string>
+    <string name="package_state_error" msgid="7672093962724223588">"Nincs visszaállítva"</string>
 </resources>
diff --git a/res/values-hy-rAM/strings.xml b/res/values-hy-rAM/strings.xml
index 23a50c6..d02d48e 100644
--- a/res/values-hy-rAM/strings.xml
+++ b/res/values-hy-rAM/strings.xml
@@ -111,5 +111,5 @@
     <string name="package_state_downloading" msgid="4088770468458724721">"Ներբեռնվում է"</string>
     <string name="package_state_installing" msgid="7588193972189849870">"Տեղադրվում է"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Անհայտ է"</string>
-    <string name="package_state_error" msgid="6858560020210815018">"Սխալ կա"</string>
+    <string name="package_state_error" msgid="7672093962724223588">"Չի վերականգնվել"</string>
 </resources>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index eb3d287..ba85886 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -111,5 +111,5 @@
     <string name="package_state_downloading" msgid="4088770468458724721">"Mengunduh"</string>
     <string name="package_state_installing" msgid="7588193972189849870">"Memasang"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Tidak dikenal"</string>
-    <string name="package_state_error" msgid="6858560020210815018">"Kesalahan"</string>
+    <string name="package_state_error" msgid="7672093962724223588">"Tak dipulihkan"</string>
 </resources>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index c71a14f..0d3bcc4 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -111,5 +111,5 @@
     <string name="package_state_downloading" msgid="4088770468458724721">"Download..."</string>
     <string name="package_state_installing" msgid="7588193972189849870">"Installazione..."</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Sconosciuto"</string>
-    <string name="package_state_error" msgid="6858560020210815018">"Errore"</string>
+    <string name="package_state_error" msgid="7672093962724223588">"Non ripristinato"</string>
 </resources>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index 3a79a1f..cdfaf04 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -111,5 +111,5 @@
     <string name="package_state_downloading" msgid="4088770468458724721">"מוריד"</string>
     <string name="package_state_installing" msgid="7588193972189849870">"מתקין"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"לא ידוע"</string>
-    <string name="package_state_error" msgid="6858560020210815018">"שגיאה"</string>
+    <string name="package_state_error" msgid="7672093962724223588">"לא שוחזרה"</string>
 </resources>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index d10089f..e3ec47d 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -111,5 +111,5 @@
     <string name="package_state_downloading" msgid="4088770468458724721">"ダウンロード中"</string>
     <string name="package_state_installing" msgid="7588193972189849870">"インストール中"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"不明"</string>
-    <string name="package_state_error" msgid="6858560020210815018">"エラー"</string>
+    <string name="package_state_error" msgid="7672093962724223588">"復元失敗"</string>
 </resources>
diff --git a/res/values-ka-rGE/strings.xml b/res/values-ka-rGE/strings.xml
index 74d1d45..de701ca 100644
--- a/res/values-ka-rGE/strings.xml
+++ b/res/values-ka-rGE/strings.xml
@@ -109,7 +109,7 @@
     <string name="settings_button_text" msgid="8119458837558863227">"პარამეტრები"</string>
     <string name="package_state_enqueued" msgid="6227252464303085641">"მოცდა..."</string>
     <string name="package_state_downloading" msgid="4088770468458724721">"ჩამოტვირთვა..."</string>
-    <string name="package_state_installing" msgid="7588193972189849870">"ინსტალაცია,,,"</string>
+    <string name="package_state_installing" msgid="7588193972189849870">"ინსტალაცია..."</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"უცნობი"</string>
-    <string name="package_state_error" msgid="6858560020210815018">"შეცდომა"</string>
+    <string name="package_state_error" msgid="7672093962724223588">"არ აღდგა"</string>
 </resources>
diff --git a/res/values-km-rKH/strings.xml b/res/values-km-rKH/strings.xml
index d397cff..a5b53be 100644
--- a/res/values-km-rKH/strings.xml
+++ b/res/values-km-rKH/strings.xml
@@ -111,5 +111,5 @@
     <string name="package_state_downloading" msgid="4088770468458724721">"​ទាញ​យក"</string>
     <string name="package_state_installing" msgid="7588193972189849870">"ដំឡើង"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"មិន​ស្គាល់"</string>
-    <string name="package_state_error" msgid="6858560020210815018">"កំហុស"</string>
+    <string name="package_state_error" msgid="7672093962724223588">"មិនបាន​​ស្តា​រ"</string>
 </resources>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 02dd6b1..f8a06c7 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -111,5 +111,5 @@
     <string name="package_state_downloading" msgid="4088770468458724721">"다운로드 중"</string>
     <string name="package_state_installing" msgid="7588193972189849870">"설치 중"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"알 수 없음"</string>
-    <string name="package_state_error" msgid="6858560020210815018">"오류"</string>
+    <string name="package_state_error" msgid="7672093962724223588">"복원되지 않음"</string>
 </resources>
diff --git a/res/values-lo-rLA/strings.xml b/res/values-lo-rLA/strings.xml
index ec7316a..fd8c2c4 100644
--- a/res/values-lo-rLA/strings.xml
+++ b/res/values-lo-rLA/strings.xml
@@ -111,5 +111,5 @@
     <string name="package_state_downloading" msgid="4088770468458724721">"ກຳລັງດາວໂຫລດ"</string>
     <string name="package_state_installing" msgid="7588193972189849870">"​ກຳ​ລັງ​ຕິດ​ຕັ້ງ"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"​ບໍ່​ຮູ້​ຈັກ"</string>
-    <string name="package_state_error" msgid="6858560020210815018">"ຜິດພາດ"</string>
+    <string name="package_state_error" msgid="7672093962724223588">"ບໍ່​ໄດ້​ກູ້​ຂໍ້ມູນ​ມາ​ເທື່ອ"</string>
 </resources>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index 631508d..471201d 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -111,5 +111,5 @@
     <string name="package_state_downloading" msgid="4088770468458724721">"Atsisiunčiama"</string>
     <string name="package_state_installing" msgid="7588193972189849870">"Diegiama"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Nežinoma"</string>
-    <string name="package_state_error" msgid="6858560020210815018">"Klaida"</string>
+    <string name="package_state_error" msgid="7672093962724223588">"Neatkurta"</string>
 </resources>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index 0ea54a4..6fb7d60 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -111,5 +111,5 @@
     <string name="package_state_downloading" msgid="4088770468458724721">"Lejupielādē"</string>
     <string name="package_state_installing" msgid="7588193972189849870">"Instalē"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Nezināma"</string>
-    <string name="package_state_error" msgid="6858560020210815018">"Kļūda"</string>
+    <string name="package_state_error" msgid="7672093962724223588">"Nav atjaunota"</string>
 </resources>
diff --git a/res/values-mn-rMN/strings.xml b/res/values-mn-rMN/strings.xml
index d783199..a8ad568 100644
--- a/res/values-mn-rMN/strings.xml
+++ b/res/values-mn-rMN/strings.xml
@@ -111,5 +111,5 @@
     <string name="package_state_downloading" msgid="4088770468458724721">"Татаж авч байна"</string>
     <string name="package_state_installing" msgid="7588193972189849870">"Суулгаж байна"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Тодорхойгүй"</string>
-    <string name="package_state_error" msgid="6858560020210815018">"Алдаа"</string>
+    <string name="package_state_error" msgid="7672093962724223588">"Сэргээгээгүй"</string>
 </resources>
diff --git a/res/values-ms-rMY/strings.xml b/res/values-ms-rMY/strings.xml
index a659e10..4c4b95f 100644
--- a/res/values-ms-rMY/strings.xml
+++ b/res/values-ms-rMY/strings.xml
@@ -111,5 +111,5 @@
     <string name="package_state_downloading" msgid="4088770468458724721">"Memuat turun"</string>
     <string name="package_state_installing" msgid="7588193972189849870">"Memasang"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Tidak diketahui"</string>
-    <string name="package_state_error" msgid="6858560020210815018">"Ralat"</string>
+    <string name="package_state_error" msgid="7672093962724223588">"Tak dipulihkan"</string>
 </resources>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index e88ff22..34cc488 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -111,5 +111,5 @@
     <string name="package_state_downloading" msgid="4088770468458724721">"Laster ned …"</string>
     <string name="package_state_installing" msgid="7588193972189849870">"Installerer …"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Ukjent"</string>
-    <string name="package_state_error" msgid="6858560020210815018">"Feil"</string>
+    <string name="package_state_error" msgid="7672093962724223588">"Ikke gjenoppr."</string>
 </resources>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index b2bb5e9..7bd3025 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -111,5 +111,5 @@
     <string name="package_state_downloading" msgid="4088770468458724721">"Downloaden"</string>
     <string name="package_state_installing" msgid="7588193972189849870">"Installeren"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Onbekend"</string>
-    <string name="package_state_error" msgid="6858560020210815018">"Fout"</string>
+    <string name="package_state_error" msgid="7672093962724223588">"Niet hersteld"</string>
 </resources>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index c408a32..07d7465 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -111,5 +111,5 @@
     <string name="package_state_downloading" msgid="4088770468458724721">"Pobieranie"</string>
     <string name="package_state_installing" msgid="7588193972189849870">"Instalowanie"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Brak informacji"</string>
-    <string name="package_state_error" msgid="6858560020210815018">"Błąd"</string>
+    <string name="package_state_error" msgid="7672093962724223588">"Nie przywrócono"</string>
 </resources>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index 7fdd23e..0717c52 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -111,5 +111,5 @@
     <string name="package_state_downloading" msgid="4088770468458724721">"A transferir "</string>
     <string name="package_state_installing" msgid="7588193972189849870">"A instalar"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Desconhecido"</string>
-    <string name="package_state_error" msgid="6858560020210815018">"Erro"</string>
+    <string name="package_state_error" msgid="7672093962724223588">"Não restaurado"</string>
 </resources>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index 156ad2a..e3f60ae 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -111,5 +111,5 @@
     <string name="package_state_downloading" msgid="4088770468458724721">"Transferindo"</string>
     <string name="package_state_installing" msgid="7588193972189849870">"Instalando"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Desconhecido"</string>
-    <string name="package_state_error" msgid="6858560020210815018">"Erro"</string>
+    <string name="package_state_error" msgid="7672093962724223588">"Não restaurado"</string>
 </resources>
diff --git a/res/values-rm/strings.xml b/res/values-rm/strings.xml
index 68d6dbf..be35c6b 100644
--- a/res/values-rm/strings.xml
+++ b/res/values-rm/strings.xml
@@ -200,6 +200,6 @@
     <skip />
     <!-- no translation found for package_state_unknown (7592128424511031410) -->
     <skip />
-    <!-- no translation found for package_state_error (6858560020210815018) -->
+    <!-- no translation found for package_state_error (7672093962724223588) -->
     <skip />
 </resources>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index ac6e6da..48fa11e 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -109,7 +109,7 @@
     <string name="settings_button_text" msgid="8119458837558863227">"Setări"</string>
     <string name="package_state_enqueued" msgid="6227252464303085641">"În așteptare"</string>
     <string name="package_state_downloading" msgid="4088770468458724721">"Se descarcă"</string>
-    <string name="package_state_installing" msgid="7588193972189849870">"În curs de instalare"</string>
+    <string name="package_state_installing" msgid="7588193972189849870">"Se instalează"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Necunoscut"</string>
-    <string name="package_state_error" msgid="6858560020210815018">"Eroare"</string>
+    <string name="package_state_error" msgid="7672093962724223588">"Nerestabilit"</string>
 </resources>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index 2575305..8303350 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -111,5 +111,5 @@
     <string name="package_state_downloading" msgid="4088770468458724721">"Скачивается"</string>
     <string name="package_state_installing" msgid="7588193972189849870">"Устанавливается"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Неизвестно"</string>
-    <string name="package_state_error" msgid="6858560020210815018">"Сбой"</string>
+    <string name="package_state_error" msgid="7672093962724223588">"Не восстановлен"</string>
 </resources>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index 0e47c5d..b274926 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -111,5 +111,5 @@
     <string name="package_state_downloading" msgid="4088770468458724721">"Sťahovanie"</string>
     <string name="package_state_installing" msgid="7588193972189849870">"Inštalácia"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Neznáme"</string>
-    <string name="package_state_error" msgid="6858560020210815018">"Chyba"</string>
+    <string name="package_state_error" msgid="7672093962724223588">"Nebolo obnovené"</string>
 </resources>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index 634c33f..62d90bb 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -108,8 +108,8 @@
     <string name="wallpaper_button_text" msgid="8404103075899945851">"Ozadja"</string>
     <string name="settings_button_text" msgid="8119458837558863227">"Nastavitve"</string>
     <string name="package_state_enqueued" msgid="6227252464303085641">"Čakanje"</string>
-    <string name="package_state_downloading" msgid="4088770468458724721">"Prenos"</string>
+    <string name="package_state_downloading" msgid="4088770468458724721">"Prenašanje"</string>
     <string name="package_state_installing" msgid="7588193972189849870">"Nameščanje"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Neznano"</string>
-    <string name="package_state_error" msgid="6858560020210815018">"Napaka"</string>
+    <string name="package_state_error" msgid="7672093962724223588">"Ni obnovljen"</string>
 </resources>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index ce4e749..9b30913 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -111,5 +111,5 @@
     <string name="package_state_downloading" msgid="4088770468458724721">"Преузима се"</string>
     <string name="package_state_installing" msgid="7588193972189849870">"Инсталира се"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Непознато"</string>
-    <string name="package_state_error" msgid="6858560020210815018">"Грешка"</string>
+    <string name="package_state_error" msgid="7672093962724223588">"Није враћено"</string>
 </resources>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index b154a3a..0469a8a 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -111,5 +111,5 @@
     <string name="package_state_downloading" msgid="4088770468458724721">"Hämtas"</string>
     <string name="package_state_installing" msgid="7588193972189849870">"Installerar"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Okänt"</string>
-    <string name="package_state_error" msgid="6858560020210815018">"Fel"</string>
+    <string name="package_state_error" msgid="7672093962724223588">"Inte återställt"</string>
 </resources>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index 8dfcff7..12f2428 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -113,5 +113,5 @@
     <string name="package_state_downloading" msgid="4088770468458724721">"Inapakua"</string>
     <string name="package_state_installing" msgid="7588193972189849870">"Inasakinisha"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Yasiyojulikana"</string>
-    <string name="package_state_error" msgid="6858560020210815018">"Hitilafu"</string>
+    <string name="package_state_error" msgid="7672093962724223588">"Haijarejeshwa"</string>
 </resources>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index a79afaf..1c55e77 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -111,5 +111,5 @@
     <string name="package_state_downloading" msgid="4088770468458724721">"กำลังดาวน์โหลด"</string>
     <string name="package_state_installing" msgid="7588193972189849870">"กำลังติดตั้ง"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"ไม่รู้จัก"</string>
-    <string name="package_state_error" msgid="6858560020210815018">"ข้อผิดพลาด"</string>
+    <string name="package_state_error" msgid="7672093962724223588">"ไม่ได้คืนค่า"</string>
 </resources>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index 77173bb..d30fb11 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -111,5 +111,5 @@
     <string name="package_state_downloading" msgid="4088770468458724721">"Nagda-download"</string>
     <string name="package_state_installing" msgid="7588193972189849870">"Nag-i-install"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Hindi kilala"</string>
-    <string name="package_state_error" msgid="6858560020210815018">"Error"</string>
+    <string name="package_state_error" msgid="7672093962724223588">"Hindi naibalik"</string>
 </resources>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index d65a5d0..bdc97df 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -111,5 +111,5 @@
     <string name="package_state_downloading" msgid="4088770468458724721">"İndiriliyor"</string>
     <string name="package_state_installing" msgid="7588193972189849870">"Yükleniyor"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Bilinmiyor"</string>
-    <string name="package_state_error" msgid="6858560020210815018">"Hata"</string>
+    <string name="package_state_error" msgid="7672093962724223588">"Geri yüklenmedi"</string>
 </resources>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index acf8e27..94df4f3 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -111,5 +111,5 @@
     <string name="package_state_downloading" msgid="4088770468458724721">"Завантаження"</string>
     <string name="package_state_installing" msgid="7588193972189849870">"Встановлення"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Невідомо"</string>
-    <string name="package_state_error" msgid="6858560020210815018">"Помилка"</string>
+    <string name="package_state_error" msgid="7672093962724223588">"Не відновлено"</string>
 </resources>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index 7797651..434b556 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -111,5 +111,5 @@
     <string name="package_state_downloading" msgid="4088770468458724721">"Đang tải xuống"</string>
     <string name="package_state_installing" msgid="7588193972189849870">"Đang cài đặt"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Không xác định"</string>
-    <string name="package_state_error" msgid="6858560020210815018">"Lỗi"</string>
+    <string name="package_state_error" msgid="7672093962724223588">"Không được khôi phục"</string>
 </resources>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index a4c80cc..a771f47 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -111,5 +111,5 @@
     <string name="package_state_downloading" msgid="4088770468458724721">"正在下载"</string>
     <string name="package_state_installing" msgid="7588193972189849870">"正在安装"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"未知"</string>
-    <string name="package_state_error" msgid="6858560020210815018">"错误"</string>
+    <string name="package_state_error" msgid="7672093962724223588">"无法还原"</string>
 </resources>
diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
index 93e74cf..ed19b44 100644
--- a/res/values-zh-rHK/strings.xml
+++ b/res/values-zh-rHK/strings.xml
@@ -111,5 +111,5 @@
     <string name="package_state_downloading" msgid="4088770468458724721">"下載中"</string>
     <string name="package_state_installing" msgid="7588193972189849870">"安裝中"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"不明"</string>
-    <string name="package_state_error" msgid="6858560020210815018">"錯誤"</string>
+    <string name="package_state_error" msgid="7672093962724223588">"無法還原"</string>
 </resources>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index 5764bb7..2449f60 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -111,5 +111,5 @@
     <string name="package_state_downloading" msgid="4088770468458724721">"下載中…"</string>
     <string name="package_state_installing" msgid="7588193972189849870">"安裝中"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"不明"</string>
-    <string name="package_state_error" msgid="6858560020210815018">"發生錯誤"</string>
+    <string name="package_state_error" msgid="7672093962724223588">"無法還原"</string>
 </resources>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index 7401bfb..209816e 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -111,5 +111,5 @@
     <string name="package_state_downloading" msgid="4088770468458724721">"Iyalanda"</string>
     <string name="package_state_installing" msgid="7588193972189849870">"Iyafaka"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Akwaziwa"</string>
-    <string name="package_state_error" msgid="6858560020210815018">"Iphutha"</string>
+    <string name="package_state_error" msgid="7672093962724223588">"Ayibuyiselwe"</string>
 </resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index b963edd..ad3a1c4 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -276,5 +276,5 @@
     <!-- Label on an icon that references an uninstalled package, for which we have no information about when it might be installed. [CHAR_LIMIT=15] -->
     <string name="package_state_unknown">Unknown</string>
     <!-- Label on an icon that references an uninstalled package, for which restore from market has failed. [CHAR_LIMIT=15] -->
-    <string name="package_state_error">Error</string>
+    <string name="package_state_error">Not restored</string>
 </resources>
diff --git a/src/com/android/launcher3/DragLayer.java b/src/com/android/launcher3/DragLayer.java
index 862ceca..c54db01 100644
--- a/src/com/android/launcher3/DragLayer.java
+++ b/src/com/android/launcher3/DragLayer.java
@@ -73,7 +73,9 @@
 
     private final Rect mInsets = new Rect();
 
-    private int mDragViewIndex;
+    private View mOverlayView;
+    private int mTopViewIndex;
+    private int mChildCountOnLastUpdate = -1;
 
     /**
      * Used to create a new DragLayer from XML.
@@ -120,6 +122,20 @@
         setInsets(child, mInsets, new Rect());
     }
 
+    public void showOverlayView(View overlayView) {
+        LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
+        mOverlayView = overlayView;
+        addView(overlayView, lp);
+
+        // ensure that the overlay view stays on top. we can't use drawing order for this
+        // because in API level 16 touch dispatch doesn't respect drawing order.
+        mOverlayView.bringToFront();
+    }
+
+    public void dismissOverlayView() {
+        removeView(mOverlayView);
+    }
+
     private void setInsets(View child, Rect newInsets, Rect oldInsets) {
         final FrameLayout.LayoutParams flp = (FrameLayout.LayoutParams) child.getLayoutParams();
         if (child instanceof Insettable) {
@@ -762,6 +778,11 @@
 
     @Override
     public void onChildViewAdded(View parent, View child) {
+        if (mOverlayView != null) {
+            // ensure that the overlay view stays on top. we can't use drawing order for this
+            // because in API level 16 touch dispatch doesn't respect drawing order.
+            mOverlayView.bringToFront();
+        }
         updateChildIndices();
     }
 
@@ -770,27 +791,51 @@
         updateChildIndices();
     }
 
+    @Override
+    public void bringChildToFront(View child) {
+        super.bringChildToFront(child);
+        if (child != mOverlayView && mOverlayView != null) {
+            // ensure that the overlay view stays on top. we can't use drawing order for this
+            // because in API level 16 touch dispatch doesn't respect drawing order.
+            mOverlayView.bringToFront();
+        }
+        updateChildIndices();
+    }
+
     private void updateChildIndices() {
-        mDragViewIndex = -1;
+        mTopViewIndex = -1;
         int childCount = getChildCount();
         for (int i = 0; i < childCount; i++) {
             if (getChildAt(i) instanceof DragView) {
-                mDragViewIndex = i;
+                mTopViewIndex = i;
             }
         }
+        mChildCountOnLastUpdate = childCount;
     }
 
     @Override
     protected int getChildDrawingOrder(int childCount, int i) {
-        if (mDragViewIndex == -1) {
+        if (mChildCountOnLastUpdate != childCount) {
+            // between platform versions 17 and 18, behavior for onChildViewRemoved / Added changed.
+            // Pre-18, the child was not added / removed by the time of those callbacks. We need to
+            // force update our representation of things here to avoid crashing on pre-18 devices
+            // in certain instances.
+            updateChildIndices();
+        }
+
+        // i represents the current draw iteration
+        if (mTopViewIndex == -1) {
+            // in general we do nothing
             return i;
-        } else if (i == mDragViewIndex) {
-            return getChildCount()-1;
-        } else if (i < mDragViewIndex) {
+        } else if (i == childCount - 1) {
+            // if we have a top index, we return it when drawing last item (highest z-order)
+            return mTopViewIndex;
+        } else if (i < mTopViewIndex) {
             return i;
         } else {
-            // i > mDragViewIndex
-            return i-1;
+            // for indexes greater than the top index, we fetch one item above to shift for the
+            // displacement of the top index
+            return i + 1;
         }
     }
 
diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java
index 05be4ae..ff5b1eb 100644
--- a/src/com/android/launcher3/Launcher.java
+++ b/src/com/android/launcher3/Launcher.java
@@ -191,6 +191,7 @@
     private static final String RUNTIME_STATE_VIEW_IDS = "launcher.view_ids";
 
 
+    static final String INTRO_SCREEN_DISMISSED = "launcher.intro_screen_dismissed";
     static final String FIRST_RUN_ACTIVITY_DISPLAYED = "launcher.first_run_activity_displayed";
 
     private static final String TOOLBAR_ICON_METADATA_NAME = "com.android.launcher.toolbar_icon";
@@ -213,6 +214,7 @@
     public static final int EXIT_SPRINGLOADED_MODE_SHORT_TIMEOUT = 300;
     public static final int EXIT_SPRINGLOADED_MODE_SHORT_TIMEOUT_FOLDER_CLOSE = 400;
     private static final int ON_ACTIVITY_RESULT_ANIMATION_DELAY = 500;
+    private static final int ACTIVITY_START_DELAY = 1000;
 
     private static final Object sLock = new Object();
     private static int sScreen = DEFAULT_SCREEN;
@@ -481,10 +483,15 @@
         // On large interfaces, we want the screen to auto-rotate based on the current orientation
         unlockScreenOrientation(true);
 
+        if (shouldShowIntroScreen()) {
+            showIntroScreen();
+        } else {
+            showFirstRunActivity();
+        }
+
         // The two first run cling paths are mutually exclusive, if the launcher is preinstalled
         // on the device, then we always show the first run cling experience (or if there is no
         // launcher2). Otherwise, we prompt the user upon started for migration
-        showFirstRunActivity();
         if (mLauncherClings.shouldShowFirstRunOrMigrationClings()) {
             if (mModel.canMigrateFromOldLauncherDb(this)) {
                 mLauncherClings.showMigrationCling();
@@ -518,21 +525,6 @@
     }
 
     /**
-     * To be overridden by subclasses to indicate that there is an activity to launch
-     * before showing the standard launcher experience.
-     */
-    protected boolean hasFirstRunActivity() {
-        return false;
-    }
-
-    /**
-     * To be overridden by subclasses to launch any first run activity
-     */
-    protected Intent getFirstRunActivity() {
-        return null;
-    }
-
-    /**
      * Invoked by subclasses to signal a change to the {@link #addCustomContentToLeft} value to
      * ensure the custom content page is added or removed if necessary.
      */
@@ -3990,7 +3982,15 @@
                     if (item.container == LauncherSettings.Favorites.CONTAINER_DESKTOP) {
                         CellLayout cl = mWorkspace.getScreenWithId(item.screenId);
                         if (cl != null && cl.isOccupied(item.cellX, item.cellY)) {
-                            throw new RuntimeException("OCCUPIED");
+                            View v = cl.getChildAt(item.cellX, item.cellY);
+                            Object tag = v.getTag();
+                            String desc = "Collision while binding workspace item: " + item
+                                    + ". Collides with " + tag;
+                            if (LauncherAppState.isDogfoodBuild()) {
+                                throw (new RuntimeException(desc));
+                            } else {
+                                Log.d(TAG, desc);
+                            }
                         }
                     }
 
@@ -4441,20 +4441,42 @@
         mLauncherClings.dismissFolderCling(v);
     }
 
+
+    /**
+     * To be overridden by subclasses to indicate that there is an activity to launch
+     * before showing the standard launcher experience.
+     */
+    protected boolean hasFirstRunActivity() {
+        return false;
+    }
+
+    /**
+     * To be overridden by subclasses to launch any first run activity
+     */
+    protected Intent getFirstRunActivity() {
+        return null;
+    }
+
     private boolean shouldRunFirstRunActivity() {
         return !ActivityManager.isRunningInTestHarness() &&
                 !mSharedPrefs.getBoolean(FIRST_RUN_ACTIVITY_DISPLAYED, false);
     }
 
-    public void showFirstRunActivity() {
+    protected boolean hasRunFirstRunActivity() {
+        return mSharedPrefs.getBoolean(FIRST_RUN_ACTIVITY_DISPLAYED, false);
+    }
+
+    public boolean showFirstRunActivity() {
         if (shouldRunFirstRunActivity() &&
                 hasFirstRunActivity()) {
             Intent firstRunIntent = getFirstRunActivity();
             if (firstRunIntent != null) {
                 startActivity(firstRunIntent);
                 markFirstRunActivityShown();
+                return true;
             }
         }
+        return false;
     }
 
     private void markFirstRunActivityShown() {
@@ -4463,6 +4485,61 @@
         editor.apply();
     }
 
+    /**
+     * To be overridden by subclasses to indicate that there is an in-activity full-screen intro
+     * screen that must be displayed and dismissed.
+     */
+    protected boolean hasDismissableIntroScreen() {
+        return false;
+    }
+
+    /**
+     * Full screen intro screen to be shown and dismissed before the launcher can be used.
+     */
+    protected View getIntroScreen() {
+        return null;
+    }
+
+    /**
+     * To be overriden by subclasses to indicate whether the in-activity intro screen has been
+     * dismissed. This method is ignored if #hasDismissableIntroScreen returns false.
+     */
+    private boolean shouldShowIntroScreen() {
+        return hasDismissableIntroScreen() &&
+                !mSharedPrefs.getBoolean(INTRO_SCREEN_DISMISSED, false);
+    }
+
+    protected void showIntroScreen() {
+        View introScreen = getIntroScreen();
+        changeWallpaperVisiblity(false);
+        if (introScreen != null) {
+            mDragLayer.showOverlayView(introScreen);
+        }
+    }
+
+    public void dismissIntroScreen() {
+        markIntroScreenDismissed();
+        if (showFirstRunActivity()) {
+            // We delay hiding the intro view until the first run activity is showing. This
+            // avoids a blip.
+            mWorkspace.postDelayed(new Runnable() {
+                @Override
+                public void run() {
+                    mDragLayer.dismissOverlayView();
+                }
+            }, ACTIVITY_START_DELAY);
+        } else {
+            mDragLayer.dismissOverlayView();
+        }
+        changeWallpaperVisiblity(true);
+    }
+
+    private void markIntroScreenDismissed() {
+        SharedPreferences.Editor editor = mSharedPrefs.edit();
+        editor.putBoolean(INTRO_SCREEN_DISMISSED, true);
+        editor.apply();
+    }
+
     void showWorkspaceSearchAndHotseat() {
         if (mWorkspace != null) mWorkspace.setAlpha(1f);
         if (mHotseat != null) mHotseat.setAlpha(1f);
@@ -4477,7 +4554,6 @@
         if (mSearchDropTargetBar != null) mSearchDropTargetBar.hideSearchBar(false);
     }
 
-
     public ItemInfo createAppDragInfo(Intent appLaunchIntent) {
         ResolveInfo ri = getPackageManager().resolveActivity(appLaunchIntent, 0);
         if (ri == null) {
@@ -4491,10 +4567,14 @@
         return new ShortcutInfo(shortcutIntent, caption, icon);
     }
 
+    protected void moveWorkspaceToDefaultScreen() {
+        mWorkspace.moveToDefaultScreen(false);
+    }
+
     public void startDrag(View dragView, ItemInfo dragInfo, DragSource source) {
         dragView.setTag(dragInfo);
-        mWorkspace.onDragStartedWithItem(dragView);
-        mWorkspace.beginDragShared(dragView, source);
+        mWorkspace.onExternalDragStartedWithItem(dragView);
+        mWorkspace.beginExternalDragShared(dragView, source);
     }
 
     @Override
diff --git a/src/com/android/launcher3/LauncherAppState.java b/src/com/android/launcher3/LauncherAppState.java
index ba10f51..5ddafea 100644
--- a/src/com/android/launcher3/LauncherAppState.java
+++ b/src/com/android/launcher3/LauncherAppState.java
@@ -30,7 +30,7 @@
     private static final String TAG = "LauncherAppState";
     private static final String SHARED_PREFERENCES_KEY = "com.android.launcher3.prefs";
 
-    private static final boolean DEBUG = true; // TODO STOPSHIP: set this to false
+    private static final boolean DEBUG = false;
 
     private final AppFilter mAppFilter;
     private final BuildInfo mBuildInfo;
diff --git a/src/com/android/launcher3/LauncherBackupAgentHelper.java b/src/com/android/launcher3/LauncherBackupAgentHelper.java
index 7dd8cde..de6aedd 100644
--- a/src/com/android/launcher3/LauncherBackupAgentHelper.java
+++ b/src/com/android/launcher3/LauncherBackupAgentHelper.java
@@ -61,7 +61,7 @@
     @Override
     public void onCreate() {
         boolean restoreEnabled = 0 != Settings.Secure.getInt(
-                getContentResolver(), SETTING_RESTORE_ENABLED, 1);
+                getContentResolver(), SETTING_RESTORE_ENABLED, 0);
         if (VERBOSE) Log.v(TAG, "restore is " + (restoreEnabled ? "enabled" : "disabled"));
 
         addHelper(LauncherBackupHelper.LAUNCHER_PREFS_PREFIX,
diff --git a/src/com/android/launcher3/LauncherClings.java b/src/com/android/launcher3/LauncherClings.java
index 952edfd..97138ee 100644
--- a/src/com/android/launcher3/LauncherClings.java
+++ b/src/com/android/launcher3/LauncherClings.java
@@ -21,8 +21,11 @@
 import android.animation.Animator;
 import android.animation.AnimatorListenerAdapter;
 import android.app.ActivityManager;
+import android.content.ComponentName;
 import android.content.Context;
 import android.content.SharedPreferences;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
 import android.graphics.Rect;
 import android.os.Bundle;
 import android.os.UserManager;
@@ -262,12 +265,21 @@
             Cling c = initCling(R.id.workspace_cling, 0, false, true);
             c.updateWorkspaceBubblePosition();
 
-            // Set the focused hotseat app if there is one
-            c.setFocusedHotseatApp(mLauncher.getFirstRunFocusedHotseatAppDrawableId(),
-                    mLauncher.getFirstRunFocusedHotseatAppRank(),
-                    mLauncher.getFirstRunFocusedHotseatAppComponentName(),
-                    mLauncher.getFirstRunFocusedHotseatAppBubbleTitle(),
-                    mLauncher.getFirstRunFocusedHotseatAppBubbleDescription());
+            try {
+                // We only enable the focused hotseat app if we are preinstalled
+                PackageManager pm = mLauncher.getPackageManager();
+                ApplicationInfo ai = pm.getApplicationInfo(mLauncher.getPackageName(), 0);
+                if ((ai.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
+                    // Set the focused hotseat app
+                    c.setFocusedHotseatApp(mLauncher.getFirstRunFocusedHotseatAppDrawableId(),
+                        mLauncher.getFirstRunFocusedHotseatAppRank(),
+                        mLauncher.getFirstRunFocusedHotseatAppComponentName(),
+                        mLauncher.getFirstRunFocusedHotseatAppBubbleTitle(),
+                        mLauncher.getFirstRunFocusedHotseatAppBubbleDescription());
+                }
+            } catch (PackageManager.NameNotFoundException e) {
+                e.printStackTrace();
+            }
         } else {
             removeCling(R.id.workspace_cling);
         }
diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java
index 937f02b..d8645aa 100644
--- a/src/com/android/launcher3/LauncherModel.java
+++ b/src/com/android/launcher3/LauncherModel.java
@@ -971,6 +971,7 @@
         values.put(LauncherSettings.Favorites._ID, item.id);
         item.updateValuesWithCoordinates(values, item.cellX, item.cellY);
 
+        final StackTraceElement[] stackTrace = new Throwable().getStackTrace();
         Runnable r = new Runnable() {
             public void run() {
                 cr.insert(notify ? LauncherSettings.Favorites.CONTENT_URI :
@@ -978,7 +979,7 @@
 
                 // Lock on mBgLock *after* the db operation
                 synchronized (sBgLock) {
-                    checkItemInfoLocked(item.id, item, null);
+                    checkItemInfoLocked(item.id, item, stackTrace);
                     sBgItemsIdMap.put(item.id, item);
                     switch (item.itemType) {
                         case LauncherSettings.Favorites.ITEM_TYPE_FOLDER:
diff --git a/src/com/android/launcher3/LauncherProvider.java b/src/com/android/launcher3/LauncherProvider.java
index 734db65..0e559a8 100644
--- a/src/com/android/launcher3/LauncherProvider.java
+++ b/src/com/android/launcher3/LauncherProvider.java
@@ -74,7 +74,7 @@
 
     private static final String DATABASE_NAME = "launcher.db";
 
-    private static final int DATABASE_VERSION = 17;
+    private static final int DATABASE_VERSION = 18;
 
     static final String OLD_AUTHORITY = "com.android.launcher2.settings";
     static final String AUTHORITY = ProviderConfig.AUTHORITY;
@@ -492,6 +492,13 @@
                     ");");
         }
 
+        private void removeOrphanedItems(SQLiteDatabase db) {
+            db.execSQL("DELETE FROM " + TABLE_FAVORITES + " WHERE " +
+                    LauncherSettings.Favorites.SCREEN + " NOT IN (SELECT " +
+                    LauncherSettings.WorkspaceScreens._ID + " FROM " + TABLE_WORKSPACE_SCREENS +
+                    ")");
+        }
+
         private void setFlagJustLoadedOldDb() {
             String spKey = LauncherAppState.getSharedPreferencesKey();
             SharedPreferences sp = mContext.getSharedPreferences(spKey, Context.MODE_PRIVATE);
@@ -792,6 +799,17 @@
                 version = 17;
             }
 
+            if (version < 18) {
+                // Due to a data loss bug, some users may have items associated with screen ids
+                // which no longer exist. Since this can cause other problems, and since the user
+                // will never see these items anyway, we use database upgrade as an opportunity to
+                // clean things up.
+
+                // TODO: this needs to be fixed, currently causes data loss.
+                //removeOrphanedItems(db);
+                version = 18;
+            }
+
             if (version != DATABASE_VERSION) {
                 Log.w(TAG, "Destroying all old data.");
                 db.execSQL("DROP TABLE IF EXISTS " + TABLE_FAVORITES);
diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java
index 1732e37..9800cf3 100644
--- a/src/com/android/launcher3/Workspace.java
+++ b/src/com/android/launcher3/Workspace.java
@@ -37,6 +37,7 @@
 import android.graphics.Bitmap;
 import android.graphics.Canvas;
 import android.graphics.Matrix;
+import android.graphics.Paint;
 import android.graphics.Point;
 import android.graphics.PointF;
 import android.graphics.Rect;
@@ -59,7 +60,6 @@
 import android.view.animation.DecelerateInterpolator;
 import android.view.animation.Interpolator;
 import android.widget.TextView;
-
 import com.android.launcher3.FolderIcon.FolderRingAnimator;
 import com.android.launcher3.Launcher.CustomContentCallbacks;
 import com.android.launcher3.LauncherSettings.Favorites;
@@ -696,6 +696,12 @@
         // Log to disk
         Launcher.addDumpLog(TAG, "11683562 - convertFinalScreenToEmptyScreenIfNecessary()", true);
 
+        if (mLauncher.isWorkspaceLoading()) {
+            // Invalid and dangerous operation if workspace is loading
+            Launcher.addDumpLog(TAG, "    - workspace loading, skip", true);
+            return;
+        }
+
         if (hasExtraEmptyScreen() || mScreenOrder.size() == 0) return;
         long finalScreenId = mScreenOrder.get(mScreenOrder.size() - 1);
 
@@ -726,6 +732,12 @@
             final int delay, final boolean stripEmptyScreens) {
         // Log to disk
         Launcher.addDumpLog(TAG, "11683562 - removeExtraEmptyScreen()", true);
+        if (mLauncher.isWorkspaceLoading()) {
+            // Don't strip empty screens if the workspace is still loading
+            Launcher.addDumpLog(TAG, "    - workspace loading, skip", true);
+            return;
+        }
+
         if (delay > 0) {
             postDelayed(new Runnable() {
                 @Override
@@ -810,6 +822,11 @@
     public long commitExtraEmptyScreen() {
         // Log to disk
         Launcher.addDumpLog(TAG, "11683562 - commitExtraEmptyScreen()", true);
+        if (mLauncher.isWorkspaceLoading()) {
+            // Invalid and dangerous operation if workspace is loading
+            Launcher.addDumpLog(TAG, "    - workspace loading, skip", true);
+            return -1;
+        }
 
         int index = getPageIndexForScreenId(EXTRA_EMPTY_SCREEN_ID);
         CellLayout cl = mWorkspaceScreens.get(EXTRA_EMPTY_SCREEN_ID);
@@ -867,7 +884,8 @@
         Launcher.addDumpLog(TAG, "11683562 - stripEmptyScreens()", true);
 
         if (mLauncher.isWorkspaceLoading()) {
-            // Don't strip empty screens if the workspace is still loading
+            // Don't strip empty screens if the workspace is still loading.
+            // This is dangerous and can result in data loss.
             Launcher.addDumpLog(TAG, "    - workspace loading, skip", true);
             return;
         }
@@ -1974,6 +1992,45 @@
         mDragOutline = createDragOutline(v, canvas, DRAG_BITMAP_PADDING);
     }
 
+    private Rect getDrawableBounds(Drawable d) {
+        Rect bounds = new Rect();
+        d.copyBounds(bounds);
+        if (bounds.width() == 0 || bounds.height() == 0) {
+            bounds.set(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight());
+        }
+        return bounds;
+    }
+
+    public void onExternalDragStartedWithItem(View v) {
+        final Canvas canvas = new Canvas();
+
+        // Compose a drag bitmap with the view scaled to the icon size
+        LauncherAppState app = LauncherAppState.getInstance();
+        DeviceProfile grid = app.getDynamicGrid().getDeviceProfile();
+        int iconSize = grid.iconSizePx;
+        int bmpWidth = v.getMeasuredWidth();
+        int bmpHeight = v.getMeasuredHeight();
+
+        // If this is a text view, use its drawable instead
+        if (v instanceof TextView) {
+            TextView tv = (TextView) v;
+            Drawable d = tv.getCompoundDrawables()[1];
+            Rect bounds = getDrawableBounds(d);
+            bmpWidth = bounds.width();
+            bmpHeight = bounds.height();
+        }
+
+        // Compose the bitmap to create the icon from
+        Bitmap b = Bitmap.createBitmap(bmpWidth, bmpHeight,
+                Bitmap.Config.ARGB_8888);
+        Canvas c = new Canvas(b);
+        drawDragView(v, c, 0, true);
+        c.setBitmap(null);
+
+        // The outline is used to visualize where the item will land if dropped
+        mDragOutline = createDragOutline(b, canvas, DRAG_BITMAP_PADDING, iconSize, iconSize, true);
+    }
+
     public void onDragStartedWithItem(PendingAddItemInfo info, Bitmap b, boolean clipAlpha) {
         final Canvas canvas = new Canvas();
 
@@ -2022,6 +2079,11 @@
     protected void onEndReordering() {
         super.onEndReordering();
 
+        if (mLauncher.isWorkspaceLoading()) {
+            // Invalid and dangerous operation if workspace is loading
+            return;
+        }
+
         hideOutlines();
         mScreenOrder.clear();
         int count = getChildCount();
@@ -2475,7 +2537,8 @@
         destCanvas.save();
         if (v instanceof TextView && pruneToDrawable) {
             Drawable d = ((TextView) v).getCompoundDrawables()[1];
-            clipRect.set(0, 0, d.getIntrinsicWidth() + padding, d.getIntrinsicHeight() + padding);
+            Rect bounds = getDrawableBounds(d);
+            clipRect.set(0, 0, bounds.width() + padding, bounds.height() + padding);
             destCanvas.translate(padding / 2, padding / 2);
             d.draw(destCanvas);
         } else {
@@ -2516,8 +2579,9 @@
 
         if (v instanceof TextView) {
             Drawable d = ((TextView) v).getCompoundDrawables()[1];
-            b = Bitmap.createBitmap(d.getIntrinsicWidth() + padding,
-                    d.getIntrinsicHeight() + padding, Bitmap.Config.ARGB_8888);
+            Rect bounds = getDrawableBounds(d);
+            b = Bitmap.createBitmap(bounds.width() + padding,
+                    bounds.height() + padding, Bitmap.Config.ARGB_8888);
         } else {
             b = Bitmap.createBitmap(
                     v.getWidth() + padding, v.getHeight() + padding, Bitmap.Config.ARGB_8888);
@@ -2606,10 +2670,8 @@
         final int bmpHeight = b.getHeight();
 
         float scale = mLauncher.getDragLayer().getLocationInDragLayer(child, mTempXY);
-        int dragLayerX =
-                Math.round(mTempXY[0] - (bmpWidth - scale * child.getWidth()) / 2);
-        int dragLayerY =
-                Math.round(mTempXY[1] - (bmpHeight - scale * bmpHeight) / 2
+        int dragLayerX = Math.round(mTempXY[0] - (bmpWidth - scale * child.getWidth()) / 2);
+        int dragLayerY = Math.round(mTempXY[1] - (bmpHeight - scale * bmpHeight) / 2
                         - DRAG_BITMAP_PADDING / 2);
 
         LauncherAppState app = LauncherAppState.getInstance();
@@ -2659,6 +2721,52 @@
         b.recycle();
     }
 
+    public void beginExternalDragShared(View child, DragSource source) {
+        LauncherAppState app = LauncherAppState.getInstance();
+        DeviceProfile grid = app.getDynamicGrid().getDeviceProfile();
+        int iconSize = grid.iconSizePx;
+
+        // Notify launcher of drag start
+        mLauncher.onDragStarted(child);
+
+        // Compose a new drag bitmap that is of the icon size
+        final Bitmap tmpB = createDragBitmap(child, new Canvas(), DRAG_BITMAP_PADDING);
+        Bitmap b = Bitmap.createBitmap(iconSize, iconSize, Bitmap.Config.ARGB_8888);
+        Paint p = new Paint();
+        p.setFilterBitmap(true);
+        Canvas c = new Canvas(b);
+        c.drawBitmap(tmpB, new Rect(0, 0, tmpB.getWidth(), tmpB.getHeight()),
+                new Rect(0, 0, iconSize, iconSize), p);
+        c.setBitmap(null);
+
+        // Find the child's location on the screen
+        int bmpWidth = tmpB.getWidth();
+        float iconScale = (float) bmpWidth / iconSize;
+        float scale = mLauncher.getDragLayer().getLocationInDragLayer(child, mTempXY) * iconScale;
+        int dragLayerX = Math.round(mTempXY[0] - (bmpWidth - scale * child.getWidth()) / 2);
+        int dragLayerY = Math.round(mTempXY[1]);
+
+        // Note: The drag region is used to calculate drag layer offsets, but the
+        // dragVisualizeOffset in addition to the dragRect (the size) to position the outline.
+        Point dragVisualizeOffset = new Point(-DRAG_BITMAP_PADDING / 2, DRAG_BITMAP_PADDING / 2);
+        Rect dragRect = new Rect(0, 0, iconSize, iconSize);
+
+        if (child.getTag() == null || !(child.getTag() instanceof ItemInfo)) {
+            String msg = "Drag started with a view that has no tag set. This "
+                    + "will cause a crash (issue 11627249) down the line. "
+                    + "View: " + child + "  tag: " + child.getTag();
+            throw new IllegalStateException(msg);
+        }
+
+        // Start the drag
+        DragView dv = mDragController.startDrag(b, dragLayerX, dragLayerY, source, child.getTag(),
+                DragController.DRAG_ACTION_MOVE, dragVisualizeOffset, dragRect, scale);
+        dv.setIntrinsicIconScaleFactor(source.getIntrinsicIconScaleFactor());
+
+        // Recycle temporary bitmaps
+        tmpB.recycle();
+    }
+
     void addApplicationShortcut(ShortcutInfo info, CellLayout target, long container, long screenId,
             int cellX, int cellY, boolean insertAtFirst, int intersectX, int intersectY) {
         View view = mLauncher.createShortcut(R.layout.application, target, (ShortcutInfo) info);