Bug 1393672 - Adjust per UX input. r?jwu draft
authorNevin Chen(:nechen) <cnevinchen@gmail.com>
Wed, 27 Sep 2017 18:18:19 +0800
changeset 678461 d1b3738b7ee93aa0d023242a6726b7744fbbc8ff
parent 678460 3cb3e55698dfb46ef4634fe2c71bc184f7925d6f
child 679045 3aa4953d265e5f4afd0e609933c577695c26071b
push id83926
push userbmo:cnevinchen@gmail.com
push dateWed, 11 Oct 2017 10:32:10 +0000
reviewersjwu
bugs1393672
milestone58.0a1
Bug 1393672 - Adjust per UX input. r?jwu MozReview-Commit-ID: 31WNIsTTWBW
mobile/android/app/src/main/res/drawable/pwa_cancel_button.xml
mobile/android/app/src/main/res/drawable/pwa_confirm_button.xml
mobile/android/app/src/main/res/drawable/pwa_confirm_button_normal.xml
mobile/android/app/src/main/res/drawable/pwa_confirm_button_pressed.xml
mobile/android/app/src/main/res/drawable/pwa_gradient.xml
mobile/android/app/src/main/res/layout/pwa_confirm.xml
mobile/android/app/src/main/res/layout/pwa_onboarding.xml
mobile/android/app/src/photon/res/drawable-xhdpi/add_to_homescreen.png
mobile/android/app/src/photon/res/drawable-xxhdpi/add_to_homescreen.png
mobile/android/app/src/photon/res/drawable-xxxhdpi/add_to_homescreen.png
mobile/android/app/src/photon/res/values-large/dimens.xml
mobile/android/app/src/photon/res/values-large/styles.xml
mobile/android/app/src/photon/res/values/colors.xml
mobile/android/app/src/photon/res/values/dimens.xml
mobile/android/app/src/photon/res/values/styles.xml
mobile/android/base/java/org/mozilla/gecko/BrowserApp.java
mobile/android/base/java/org/mozilla/gecko/Tab.java
mobile/android/base/java/org/mozilla/gecko/tabs/TabStripItemView.java
mobile/android/base/java/org/mozilla/gecko/toolbar/PageActionLayout.java
mobile/android/base/java/org/mozilla/gecko/toolbar/PwaConfirm.java
mobile/android/base/java/org/mozilla/gecko/toolbar/PwaOnboarding.java
mobile/android/base/locales/en-US/android_strings.dtd
mobile/android/base/moz.build
mobile/android/base/strings.xml.in
new file mode 100644
--- /dev/null
+++ b/mobile/android/app/src/main/res/drawable/pwa_cancel_button.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?><!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <!-- pressed state -->
+    <item android:drawable="@color/pwa_cancel_btn_press" android:state_pressed="true" />
+    <!-- normal mode -->
+    <item android:drawable="@color/pwa_cancel_btn" />
+
+</selector>
new file mode 100644
--- /dev/null
+++ b/mobile/android/app/src/main/res/drawable/pwa_confirm_button.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?><!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <!-- pressed state -->
+    <item android:drawable="@drawable/pwa_confirm_button_pressed" android:state_pressed="true" />
+    <!-- normal mode -->
+    <item android:drawable="@drawable/pwa_confirm_button_normal" />
+
+</selector>
new file mode 100644
--- /dev/null
+++ b/mobile/android/app/src/main/res/drawable/pwa_confirm_button_normal.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?><!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <!--  Gradient Bg for listrow -->
+    <gradient
+        android:angle="45"
+        android:endColor="#0A84FF"
+        android:startColor="#00CBD7" />
+</shape>
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/mobile/android/app/src/main/res/drawable/pwa_confirm_button_pressed.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?><!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <!--  Gradient Bg for listrow -->
+    <gradient
+        android:angle="45"
+        android:endColor="#0060DF"
+        android:startColor="#008EA4" />
+</shape>
\ No newline at end of file
deleted file mode 100644
--- a/mobile/android/app/src/main/res/drawable/pwa_gradient.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
-   - License, v. 2.0. If a copy of the MPL was not distributed with this
-   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-<shape xmlns:android="http://schemas.android.com/apk/res/android"
-    android:shape="rectangle">
-    <!--  Gradient Bg for listrow -->
-    <gradient
-        android:startColor="@color/photon_loading_indicator_light"
-        android:centerColor="@color/photon_loading_indicator_dark"
-        android:endColor="@color/photon_highlight"
-        android:angle="315" />
-</shape>
\ No newline at end of file
--- a/mobile/android/app/src/main/res/layout/pwa_confirm.xml
+++ b/mobile/android/app/src/main/res/layout/pwa_confirm.xml
@@ -1,66 +1,89 @@
 <?xml version="1.0" encoding="utf-8"?>
 <org.mozilla.gecko.toolbar.PwaConfirm xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:id="@+id/pwa_confirm_root"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:background="@color/photon_browser_toolbar_bg"
-    android:clickable="true"
-    android:elevation="15dp">
-
-
-    <ImageView
-        android:id="@+id/pwa_confirm_icon"
-        android:layout_width="40dp"
-        android:layout_height="40dp"
-        android:layout_margin="20dp"
-        tools:src="@drawable/favicon_globe" />
+                                      xmlns:tools="http://schemas.android.com/tools"
+                                      android:id="@+id/pwa_confirm_root"
+                                      android:layout_width="match_parent"
+                                      android:layout_height="match_parent"
+                                      android:layout_marginTop="@dimen/browser_toolbar_height_flipper"
+                                      android:background="@color/dark_transparent_overlay"
+                                      android:clickable="true">
 
 
-    <TextView
-        android:id="@+id/pwa_confirm_title"
-        android:layout_width="match_parent"
+    <RelativeLayout
+        style="@style/PwaConfirm"
         android:layout_height="wrap_content"
-        android:layout_alignTop="@+id/pwa_confirm_icon"
-        android:layout_toEndOf="@+id/pwa_confirm_icon"
-        android:layout_toStartOf="@+id/pwa_confirm_cancel"
-        android:maxLines="2"
-        android:textSize="18sp"
-        android:textStyle="bold"
-        tools:text="Mozilla title can grow to two lines... do" />
+        android:layout_centerHorizontal="true"
+        android:layout_marginTop="@dimen/tablet_tab_strip_height_pwa"
+        android:background="@color/photon_browser_toolbar_bg"
+        android:clickable="true"
+        android:elevation="15dp">
+
+        <android.support.v7.widget.CardView
+            xmlns:app="http://schemas.android.com/apk/res-auto"
+
+            android:id="@+id/pwa_confirm_icon_wrap"
+            android:layout_width="50dp"
+            android:layout_height="50dp"
+            android:layout_margin="20dp"
+            app:cardCornerRadius="3dp">
 
-    <TextView
-        android:id="@+id/pwa_confirm_url"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_alignEnd="@+id/pwa_confirm_title"
-        android:layout_alignStart="@+id/pwa_confirm_title"
-        android:layout_below="@+id/pwa_confirm_title"
-        android:maxLines="1"
-        android:textSize="13sp"
-        tools:text="http://www.mozilla.org/12345678911123" />
+            <ImageView
+                android:id="@+id/pwa_confirm_icon"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                tools:background="#f0f"/>
+
+        </android.support.v7.widget.CardView>
+
+        <TextView
+            android:id="@+id/pwa_confirm_title"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_alignTop="@+id/pwa_confirm_icon_wrap"
+            android:layout_toEndOf="@+id/pwa_confirm_icon_wrap"
+            android:layout_toStartOf="@+id/pwa_confirm_cancel"
+            android:ellipsize="end"
+            android:maxLines="2"
+            android:textColor="#333333"
+            android:textSize="18sp"
+            android:textStyle="bold"
+            tools:text="Mozilla title can grow to two lines... do"/>
 
 
-    <ImageButton
-        android:id="@+id/pwa_confirm_cancel"
-        android:layout_width="48dp"
-        android:layout_height="48dp"
-        android:layout_alignParentEnd="true"
-        android:layout_alignParentTop="true"
-        android:background="@null"
-        android:src="@drawable/ic_cancel_nm" />
+        <ImageButton
+            android:id="@+id/pwa_confirm_cancel"
+            android:layout_width="48dp"
+            android:layout_height="48dp"
+            android:layout_alignParentEnd="true"
+            android:layout_alignParentTop="true"
+            android:background="@drawable/pwa_cancel_button"
+            android:scaleType="center"
+            android:src="@drawable/ic_cancel_nm"/>
+x
+        <Button
+            android:id="@+id/pwa_confirm_action"
+            android:layout_width="match_parent"
+            android:layout_height="69dp"
+            android:layout_below="@+id/pwa_confirm_url"
+            android:layout_marginTop="20dp"
+            android:background="@drawable/pwa_confirm_button"
+            android:gravity="center"
+            android:text="@string/pwa_add_to_launcher_confirm"
+            android:textAllCaps="true"
+            android:textColor="#fff"
+            android:textStyle="bold"/>
 
-    <Button
-        android:id="@+id/pwa_confirm_action"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_below="@+id/pwa_confirm_url"
-        android:layout_marginTop="20dp"
-        android:background="@drawable/pwa_gradient"
-        android:gravity="center"
-        android:text="+ Add To Home Screen"
-        android:textAllCaps="true"
-        android:textColor="#fff"
-        android:textStyle="bold" />
+        <TextView
+            android:id="@+id/pwa_confirm_url"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_alignStart="@+id/pwa_confirm_title"
+            android:layout_below="@+id/pwa_confirm_title"
+            android:ellipsize="end"
+            android:maxLines="1"
+            android:textColor="@color/ob_subtitle"
+            android:textSize="13sp"
+            tools:text="http://www.mozilla.org/12345678911123"/>
+    </RelativeLayout>
 
 </org.mozilla.gecko.toolbar.PwaConfirm>
\ No newline at end of file
--- a/mobile/android/app/src/main/res/layout/pwa_onboarding.xml
+++ b/mobile/android/app/src/main/res/layout/pwa_onboarding.xml
@@ -1,73 +1,80 @@
 <?xml version="1.0" encoding="utf-8"?>
 <org.mozilla.gecko.toolbar.PwaOnboarding xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/pwa_onboarding_root"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:background="#CCBBBBBB"
-    android:clickable="true"
-    android:orientation="vertical"
-    android:paddingBottom="50dp"
-    android:paddingEnd="30dp"
-    android:paddingStart="30dp"
-    android:paddingTop="50dp">
+                                         xmlns:app="http://schemas.android.com/apk/res-auto"
+                                         android:id="@+id/pwa_onboarding_root"
+                                         android:layout_width="match_parent"
+                                         android:layout_height="match_parent"
+                                         android:background="@color/dark_transparent_overlay"
+                                         android:clickable="true"
+                                         android:gravity="center"
+                                         android:orientation="vertical"
+                                         android:padding="20dp">
+
+    <android.support.v7.widget.CardView
+        android:layout_width="290dp"
+        android:layout_height="wrap_content"
+        android:layout_centerHorizontal="true"
+        android:layout_centerVertical="true"
+        android:layout_gravity="center"
+        app:cardCornerRadius="5dp">
 
-    <LinearLayout
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:background="#fff"
-        android:clickable="true"
-        android:orientation="vertical"
-        android:weightSum="10">
-
-        <View
+        <LinearLayout
             android:layout_width="match_parent"
-            android:layout_height="0dp"
-            android:layout_weight="0.8" />
+            android:layout_height="match_parent"
+            android:orientation="vertical">
 
-        <ImageView
-            android:layout_width="match_parent"
-            android:layout_height="0dp"
-            android:layout_marginEnd="20dp"
-            android:layout_marginStart="20dp"
-            android:layout_weight="4"
-            android:src="@drawable/pwa_popup" />
+            <ScrollView
+                android:layout_width="match_parent"
+                android:layout_height="0dp"
+                android:layout_margin="5dp"
+                android:layout_weight="1">
 
-        <View
-            android:layout_width="match_parent"
-            android:layout_height="0dp"
-            android:layout_weight="0.6" />
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:background="#fff"
+                    android:clickable="true"
+                    android:orientation="vertical">
 
 
-        <TextView
-            android:id="@+id/pwa_onboarding_sumo"
-            android:layout_width="match_parent"
-            android:layout_height="0dp"
-            android:layout_marginEnd="20dp"
-            android:layout_marginStart="20dp"
-            android:layout_weight="3"
-            android:text="You can easily add this website to
-your Home screen to have instant
-access and browse faster with an
-app-like experience."
-            android:textSize="13sp" />
+                    <ImageView
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:layout_margin="10dp"
+                        android:src="@drawable/pwa_popup"/>
+
 
-        <View
-            android:layout_width="match_parent"
-            android:layout_height="0dp"
-            android:layout_weight="0.6" />
+                    <TextView
+                        android:id="@+id/pwa_onboarding_sumo"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:layout_marginBottom="30dp"
+                        android:layout_marginEnd="15dp"
+                        android:layout_marginStart="15dp"
+                        android:layout_marginTop="10dp"
+                        android:lineSpacingExtra="1.4dp"
+                        android:text="@string/pwa_onboarding_sumo"
+                        android:textColor="#737373"
+                        android:textSize="16sp"/>
+                </LinearLayout>
+            </ScrollView>
+
 
-        <TextView
-            android:id="@+id/pwa_onboarding_dismiss"
-            android:layout_width="match_parent"
-            android:layout_height="0dp"
-            android:layout_weight="1"
-            android:gravity="center"
-            android:minHeight="48dp"
+            <View
+                android:layout_width="match_parent"
+                android:layout_height="1dp"
+                android:background="#e5e5e5"/>
 
-            android:text="Continue to Website"
-            android:textAllCaps="true"
-            android:textColor="@color/photon_highlight"
-            android:textStyle="bold" />
-    </LinearLayout>
+            <TextView
+                android:id="@+id/pwa_onboarding_dismiss"
+                android:layout_width="match_parent"
+                android:layout_height="50dp"
+                android:gravity="center"
+                android:text="@string/pwa_continue_to_website"
+                android:textAllCaps="true"
+                android:textColor="@color/photon_highlight"
+                android:textStyle="bold"/>
+        </LinearLayout>
+    </android.support.v7.widget.CardView>
 
 </org.mozilla.gecko.toolbar.PwaOnboarding>
\ No newline at end of file
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..1216be3d40ca683ebfcdc0a21ffc46558a4d7884
GIT binary patch
literal 2156
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
BvT*<a
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..13ad692357e4e405340afae10efcf20be7e2ef0d
GIT binary patch
literal 2904
zc${sPdpy(oAIG<K$emi!ah=I6o2?PYT*7p5D|d!s7#6k}%dHkh4ho5hl1nx9Gq&ay
zmE5{nBqtl8TvFr`QWEi-Q|I^lJ<jiZACJ%X^Lc;1uh;wid44{Bd_U<<M-E9#C`teT
z0BPI9HZH>6Y_o}p3g76p0gA8#M!6ia22^(|PYDBY@?mTg0ANktY(V0oUxZM=Be;1*
zdpSCw14$A3xFAvhUOzTMsMyRDixv(e@X<I(Y(zLQ3LR?>{ZoM!jyI<fP{^N>=rD7r
zm!lH|L!#gz`}7U<kx&Z>2n1qA2?|EL*c|+67e?mL(CBC~8i9z3iP4WS&?iws5PMBb
zOb|#E0)>JL74WDyVl*xmPK?s{k>syDHu$JO3V|F=AQ2&(F)n~ajW&lue`<a_Ki3&S
z{!bxd)K4lQA0ie<M(ou`BL2w~O$ZMDXV>PJA2y5s`pkqy&=?9H7fqtLkx1bdn?wX+
zSX3a6jNjxkL;PLwKjzJp=%W+@UdXyhWU<!_@qcrF(Iftb|6^|vKR4GxLRjgqgR+p=
z#dG%(9<`ROjg?!dNZ)0jP-XXBkCz#a82$U#tLk^0LPlu3fF8^#4P}+f?yQxK<BCjG
z>PR%l+SkEdR+*D@l6NJ1sVo`dwJo_SKN-HStcRbM;)E2x>;vwi#;k2TC^j%DG&eB4
zYkJX9)}i}Z4Drp!Q*Tzf3vIV&R~^X++*MgsRfQ)IZYeFVny~QL_uPS*3xf@$<#Fc^
zPOA7Zh;zj+qEG5-Yil(xJ|&GU#F|>dWinQOBeJ0hvyaXzotCpb#yF6l>r4$_)&rQv
z%$@q3lWsE>sl))occzA$2C4Yehd1Uu4LS%3x%|W>uSEt{+N=p1GPbWwezd?+-mcaD
z3;ej8QJh-~vHv7_8-ucyv7Fc1hLyEXlTi`j$Ry-4G+`q{oTi04jHpVWiV;Ufk2nLY
zgjKNM#Ad}F9B7(DV`#DfP|xLBBRp-c3oT#4NffECtNXl-W!qLi2<)7FWD@F7XqR&R
zT%(<M`~kNln3VrxuF*`ODlo&!{`@j<vU@x}%Sy7*dmQA5bxU&4g>1=RXirLYf5=r0
z^Y90@syC5d--`<m51(0n_wJpDnNpd0_U;^a5Uc&0h>pq^Oj~Y|c#i_mJbUoHG=o7^
zJqgiM@JhRZzhAGa;sMjU&hyE`C-Mc+lSwRPe-)1g*lI8RXjT~iWZ*EjSCu;T=3We@
zMpi{J`*sfqd#i=$Wn$&5?u%v-v0#|`rL|HG@t_-kX^z!!zpPRAjC9w6hvj(VnB~qL
zUTJ;9{SgBJL>6SYvEasV&r*3tDScB4pO$g*z4$O!t+tsdKHG3~HOp1XD@~sFN?WI1
zFQn_+9=bImH0uVYri2SBRO2Y|r{&qc#>`&k+pYHl91EhLpFn&Zy(uyWfCm{qy;pim
zAQ5U-P|I{|L5J@EcK#BYE0U_Oo70#y%sIXa6M&~t`QXw;c;?0uT?jg2$=o8z8kNtc
zE&(QVfGfBw=d)kM+pmsEX$r`X#`i{lde>z?i9_%aRLb3$7naOK6<)boHJ0sZb|Nei
zsr+ljiLfv~6&00Y`nm7qN7wAoOCkcvG$Mhv`_mv7mP}z%*778rw(dl^2d6+jEiD<!
z<6Pp_b&E>6QBBloex$?KyJi(&x%NhFADHyjL(cDa-{)6r<ilyZ50&{PqM(LGMjxt)
zEHJl6`nyHhg`u98dQW4b6l(L|viCcEHJ7+&!Q)`e)9o?HwCBi@LH#bEM|<Z>`nX&U
z39G<inutGd>m9pwM{vHBJ*90#9QqnY`Ge_LQZ|=)Nmr!Y*m5=b`UiK(OA=E(4_2(A
zppzm`>aPvQcfZt=BQwPQ)y{QYew7&7wfph?+2Zm+QG-U~GQ!R8Fhk8kfSa6Pue+B9
zYJVsZ8=tFrs8o$Zliy|P#kKkv;367%w9+1bpPK*i7ML15C(>1wn_$F)qmtkImNS{}
zG;C`2&pQ}(y6RXK_YdAVGFrGiH&D(hvV|Mtf0ys+*)T`tq&kRIN8Xz_cDC(M?(bai
zV10zCEbxrGNk)dk1-163-{}7HyA@|spH0c(`=q?L2fi8{3@a)sLT{rQpUcjc#b|4_
zWmde>=7z;yJ-c_~?0N{GOJg2lI-+S%7xMh-x7V+aU%k>%-p|=DN;cM_S6^s**defL
zdTfI(rg7M85(p*JVVjOhzgk>ed~0-c6ufIgPW0Mw67cN~%EPk7UE0A!V)d7ApQjD#
z1CBVAw?($BXPRZw55x8RPnMq@L0W;W0x%fN=R|V=hLzS=r2b0q;)QeCm4mLFXJF52
zU+hc&hu_v(ZIFGC=D^2Ub@jmqY}aqH*%jT}LqcU^ed2?Hc1L*T*tVKupLB#!(--nC
zTkG5U`j`)Cm}qbcUW-uhqX{WhlznuN!ZWuCjAun!Y0HTSw?jNR;SXGSEGM6u`ef#P
z1Pzax_XaT)oYlrtzk5bMZ2nhs@6EzYV?)Ekzkc96>wnGQS+Ep6476cY?N#lupO=>A
zbGBVBEL_QMwClfElhd_0P#qYa9ncA1uJ1U>bbIOUaNaHld+gXTTjd>!cb@k~L^ef@
ziIxzsZEZ!%z+T;Ui+eHzJ&U0Ej)F&bt-6O9&ueOG2G-Zt?^-1l1ML#UT-;$i4M^6_
z66*oFq@*OVfcmX9XkON3AlRIuc?K65d0Rmi+M>qZ)7Ytd6xWOTZBL1q1WPfkSQ2R=
zY9Vc}G8XB)WkH$euHE$qBV=MCS*zAmKl3!!gRGE`@3Rb$SKc<2wWisWn|5{Zbhbhb
zXWUpzn#p83jJX8$?&tIShVRBaNU!^XVmWP{$bqw6`_$i>jkDY96g<zvH?~qY+P;Gp
zL0h;8-?dA|$&2jMNuvP<H#=yO=wuky)3X6+QssJ^FrTrk!e2CDje5@}7&momiyAo0
z!z`ppsfz+Y>+QmIhZ`<zj39Ed$fypl`Lgg~N4HYaLIck_T}Er4f2Ww1AMk>4`HbdU
zzmd*GbNM)|xLs$8x?L0xdwcedX@_Y-FpYM6sfPDXTU*;8W^QPd-y!gMkcZq8_hkkv
z@{Hu&erIm$l`ZE~Co}+yF(Vn@Io;1slq@M#<)My1zFn8(1&x@r?j8BESY7=&zavdd
z6b>?Io4#1)&inZ3pnsp(U<W>Bg{E{#seuwfTNrs23z(xS_UtbYmn+YBeeH$X<4~J*
z@JRg3f==dyTAAf&W$AjnPMRct*^bsCPJ{Q?g$WRVI0+R_H5aw&`X=7kGM(;}%gq4u
zy`}VdwD|B!335x;t(1b)8<GhBopzY;4}PtIO@PnHA=~wPR^IQ<JOR`X#Xzdgzkwf>
zKG*gKEq{-$tNw`(7?ueVi3Clb1__F{7;bR8XX|ws4{|5orbaFpPE-`w3R<|9D&v0P
zN3K0?cS@N~O-f>nq@>{7qrqka>@<9~kCYe7fhw22LRgaa1t&5!r@BXBzA|!1+zQzt
zM7LKIc-gKFk}nSbJfAs<7;Rof>cG4Gp5~!Ebf_zQdKPNtnd%v-hV2tM3U#OC{J(S^
z*4>$!;MYc&loL%5tx4Fin0ZIdx?A?EvsTimp6a7(4UW)isS)&3@D5Qed*_i2;OMV!
V-B4=|DVx__+XF{zs;&K#{|(uHB}4!K
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..3283ffdbdea3f68d4bc334743898f62673c4ac81
GIT binary patch
literal 3260
zc${sQc|4R||Hm(T4I*=!hS0=~EMsOYX)J?`ElZMW$kNQ%CSxBph$e28HCf9RMYe3o
z+>|6s$i6l*Xt9LsOsIIqeRuzU&+B=f^Lm}@obNgB&-Z(M&h^LjI#JeECW0Vw5C8yz
zW~Nvh_GrD=_wlly@dsB+*#k#_jmb%%tXpE19qjitwF>}%lfHYM!+X`)iw$&;Y;hEv
zrG*yJ$4dq8;zMv%p?a|icGID1v8P_H6g-UTMfMKRqUuWjMQE|-d&>xE*k1_6Q&$>i
zX$>><@ppx3sHm$Tr7<8F45s7n;-+PTHU1@MN4nA;6pF7F0&(@~Rh6r1Dn9=12oxHP
zMj%xYs;Y1{0S^fBrr@b??*N&<ll+qh>l#4xC;3uHKHjjs7*FsCr07aZ|6=}bzuwc!
z_x}oc2mEry_J^S2eGw=XB;tRGC?q$x|E=2F`CEqhf1M7yh?b$hE1u%xZ|mbj#_TyF
zd3y#B@xHEmzH|`(N&K65FQwLLf08TP>z*SFN(b>@YyY@M{D=L&&ld6Pa4{furGGvY
z1_bRmhXVjmv>DdGmdde^=|z@k5o-;-8rBjI9`zG>sO~pZ_cp;a|4ebQwAncW=Rca|
zw>hH1Jd9**^B}i5Iis<%(c%3fg|?#AvN`AHVg?cLLYs@SKWW^@4%ui%fwiqpf)i;I
zUJ|b|iQm3WEIM|#E-ZW<A6t}Snf5F!c77f2^m%Z9Waj=z+&Lp<3WYKVuGiAk{1X9*
z33Y18c<?|kUcxlrX19*I^2s(iI`g&-{<t@j;c)isny_o|e(GVyaai@&iD>3UM@QYU
z{(gUd4-XG5#i@AChI^NuIKE(|K7amviEGX*?|$KBEGhBwr#VI#O6pEenM3XB%h#`8
zi)qJMQjdawlHt;e?|K=GO+(mEfRtZ5ElV(D8Uz!%(ly$5cESt<H2yeXo$lTg0$s3Q
z;O=>>F4TOHu~g^x*;pf;${cR)h1~>IR8>_)VNQ3k4mJyB!-~-S1ewuMQG*9m=}rtv
zohFX#rSsj$#q?B;fNZQPwk^8v$}PHRSCdDcCdtUi<i>XA0uHajLiuIp{v<u^;mYaD
zADLc$5!6;Ij=K_&_3>QE`7B8&^j_V4@lK}?0Eu2|yBRhqTU>aT&PV_z9hrX!jlO>$
zJPR&A6k>pw;R9Kx%TsMPT@jJ$?Hz$jkY*N(l?~HCA!&1KU)_|tl*~W8VaD+cOfZ?(
zv<fjOVOsdDn>v5!@S#8Na+{_!o5Oa;vC^pSFHF(qFJuQXL`ub)y++SdWOk0fINC8n
z(Cen$)^Dqt@k`j)ZS&P4s~0tPH*m^R+#Y1S3s_VqCr(B$J3W0{mSlD*b{~keF%p!;
zYA@(R3&-S>0bP42A(w9w`hj;u&(xW<#(zj9_JEMkX(IjSEh1X@N`jG4pZ8H@OujM@
zii6J0bC(|p5}TiNckjuTJbgB?E9TM1m+#-(8wDm-D`ZVq2zC+_(E551Uj0EbpBGh6
zH*jvSwf54R*4DFvf`YBI!}4C*Gc_av3}SA^v0aHIQ~T)=UtclC#^BVgo8t@y0|&CS
zkk)LIQR_B;fP=*3y8tm2NE?sws=2k`kPx*lh<;Fn`d!S*1eGY)R&f|5p4EPVjr|V9
zR3d?IC(5=jbU)D3OHadPn{Gtu%w$QE0Qe94Y~}bfv0r4XanZbA-ZfTaEI!g%m%?0K
zWL6O4Bt_N}n1h3ZO<PBRsrdsVtHx^+vQ@Zf&YIwjIb$srUs1za^58QCyOf6`n77^Y
zvGic_im0)PNx^dCdS51jt3|0f5vLpmxGBd@b)@N8ynb+!X^iC;-g;(PG;(S!`bL_Z
zN-IY?qhq7Y_h&iGSTpfjaY!E|<_K*Ba#N?>xZ8R)A0F#IG_ysblRRoKk_eujo|?M{
zYg#^uT~bgMKyVqWC>IbnqVPE7Y+$<r**|UP#NV|4=ENpa8A7CC-~t_VxC?$Wa*E>A
z3yC?{pn4H%rTpU!-{s00PJy?L%jO-kbveqZ;Xni(nR#h5PN<RK#|=%5{CFsJAZP@_
ze+TV!gzgAWtpj+3<{Q@}cvDQzwEYwiH?o6TA%DCnfJ5H04!*1D=m<PfkkgVVh$P|}
zC3&$k$fuxW!t{c+dw1p;0~t}5%8Jy-d`hN}4yU}|A?C*$$o!8!C>C+L*mx|et?RD7
zGg8?{D1xU7=pTU?WAv+H!w?@fGrQ8Dku?%AEzMP>1nurh956J~N1lTAit8qwv$0Zk
zs|*mrisgXH`os|Ze$zPH-O<9T3^nXn2261x{2V^&!0_*$cJL^B*`Y>2Uuq&(8YsT<
zyxo5GR8~pR+5&lO`bjCOvHQ=Yvdf$W-Zo0QQ+-3}ldeXMXKNLCVXkqN!lZN_v)1Z6
z*Eo37PhSzdg6TRd|2g*5_Y;rk+{+HTCkSFs9zUKvEAjLeZ3PU?vv})KRs1<K)GusZ
z@rK67%l@kcD53gxlvC*@Phd#D;m^x$A-AS+X`I|vnI}-;sy}&y1W;}wCXz#Zzd0-{
zPKCeOm3SQs1tKV<@-xp`1)>Y4%L27m4l(Yx^R>qhC>9m869@I6Km78l*4NhstQ(qG
z4A{Urc*-*1=tuobQS04HGbC6jcV{vAj0EX>)OU?hQ~N{7C6fl}ZEIi43wOb7myUxM
z!18T+gk?10<JeQz7%6-`hh5kD^<kAh9=b_TLm1bZ`}W*W2~lExsN^KxpFnuHusYRo
z1Hn?UEo46P8l`*P%gS<$aB$&a+^U_OC5k~iSz}ErPLpc4jTg;*wHj-$4}GZ8*F)!K
zfsZE?fu1iV<vM?7Wnj}^l~QOcmKn!G#o)m}q}}OIb%pEDxbJCmv%djhN;=9ksAL-M
z2L+yWm7{^;vd9|X6y_;1G#JN5s9z@sUQi!u(rNs<G&i?8Wngc62etmKcuD11d9*>J
zh<ZiDW>@VgVsKp{@ZMTg>X;;#8b>pa-{a+E9~9@He!_nBDW2B*+)Y_6`+9}r?C7#I
zw@iruI0pqwOs(MVjZGq!$<pFIIz>`}bU**jYVO{HadwR&`f673wGdH#@_6mF-z%`I
zZ)Q3&4!b|AJNhkepG2#lz#xNOdd3guuiE3_+tk@<IrD-{z&dROJ7TTCk7DkcX>$3T
zE0%tVs>xf#dS>TJy$~L$bn2{hFzv?#japV)cRogP-1!J*I{S$qb3c}y%r}{s$eRKy
zJgk;3)V*CEyz||>=8e;n8jN+e3+R=>PF+HT`c{1OfPU@A6;MYKd1b9Q61|n*$c)*&
zo^e#ZYh~w{UQjg+W9J8G+^P(mAHKkWHZj7O1Psrt#J*SE!iLHxdI#BjMwR6T9eA0S
z6z~2H4S0*s8icuXTgyPx2Ili?C70!QBHxugGc9<MbSk}xQ6C!eZE|w*ykeQFLK(m#
zX1zh)wb*)sxf4q2|1R+=x~`*ML%hoQn6EuK5uLcp+SqVZ<@9j21Y5vOk1mxCzbB7Y
zx%Z5k+>wIMiyMR-Xj;?ZRZF<vH_UrNKW!NTHd=x_oKAMjdrIfMEce#S8|V8faN&LR
zl+|^p+qL=`9hh9N+`H5%TW=X!T}si5E4+RKilL;{kjYU?y`h_O!F|33s>WL5h2iZk
z{@!cTUDx@#LkEpR9dfM=o!L~1(uJ}g90>)LP`NMb9ox)<!!Gp)^*y@qoRavI#=J3~
z-#81OiC+Z2;%`HDmn0@De0k$g5LCv`^-!T92&1QSlJCbM8uRpxjk~x%b38MgCKl}P
zT58U54dfS8>9*~hBjKCF=ZO}zZ|C>J#&2Ohyo`q&7!fv9qSn%=FU#a<td<Rf3Ox=#
z@!K{nMuL4x4fkF~uL*zH*@uO9#yW)1eJHTQ<v_j{svbGmMQrB)>Qjd@xfFc&@8soa
zGL`gGCc<w^Qbq3Eb~4r3*DUp^RS_$8=$eYyfLf#~lX5ns&XE0gffb`=dd|>%M7A#K
zI}u8z%C~9v>c7c%$f}0sF_)Q>#AGw)?fjbaecfCuT=AiiC*wIj^RM1*K03Y~1Wr0#
zzCY7gtz2fi@ScVK%LtprZ`QHn37?FbwnUZA7fyZ6u~=x+ZqUYh&JiXqY#uSOq(%5>
RhW>S>Ff+2kmYuv5{x3?Y;luy{
--- a/mobile/android/app/src/photon/res/values-large/dimens.xml
+++ b/mobile/android/app/src/photon/res/values-large/dimens.xml
@@ -36,9 +36,12 @@
 
     <dimen name="tab_panel_grid_hpadding_autofit">30dp</dimen>
     <dimen name="tab_panel_grid_vpadding_autofit">30dp</dimen>
     <dimen name="tab_panel_grid_item_hpadding_autofit">20dp</dimen>
     <dimen name="tab_panel_grid_item_vpadding_autofit">8dp</dimen>
 
     <!-- PageActionButtons dimensions -->
     <dimen name="page_action_button_width">@dimen/browser_toolbar_icon_width</dimen>
+
+    <dimen name="tablet_tab_strip_height_pwa">48dp</dimen>
+
 </resources>
--- a/mobile/android/app/src/photon/res/values-large/styles.xml
+++ b/mobile/android/app/src/photon/res/values-large/styles.xml
@@ -202,17 +202,23 @@
 
     <style name="UrlBar.SiteIdentity" parent="UrlBar.V15.SiteIdentity" />
 
     <style name="UrlBar.V15.SiteIdentity" parent="UrlBar.Base.SiteIdentity">
         <item name="android:layout_marginLeft">8dp</item>
         <item name="android:paddingRight">@dimen/browser_toolbar_site_security_margin_end</item>
     </style>
 
+
     <style name="TabsTray.AddTab" parent="TabsTray.V15.AddTab"/>
     <style name="TabsTray.V15.AddTab" parent="TabsTray.Base.AddTab"/>
 
     <style name="TabsTray.Menu" parent="TabsTray.V15.Menu"/>
     <style name="TabsTray.V15.Menu" parent="TabsTray.Base.Menu">
         <item name="android:layout_marginRight">6dp</item>
     </style>
 
+    <style name="PwaConfirm">
+        <item name="android:layout_width">640dp</item>
+
+    </style>
+
 </resources>
--- a/mobile/android/app/src/photon/res/values/colors.xml
+++ b/mobile/android/app/src/photon/res/values/colors.xml
@@ -262,9 +262,15 @@
     <color name="activity_stream_subtitle">#FF919191</color>
     <color name="activity_stream_icon">#FF919191</color>
 
     <color name="tablet_tab_strip_divider_color">#737373</color>
     <color name="tablet_tab_strip_indicator">#0060DF</color>
     <color name="tablet_tab_strip_indicator_private">#8000D7</color>
 
     <color name="bookmark_folder_bg_color">#FCFCFC</color>
+
+    <!-- PWA -->
+    <color name="pwa_cancel_btn_press">#ededf0</color>
+    <color name="pwa_cancel_btn">#00ffffff</color>
+
+
 </resources>
--- a/mobile/android/app/src/photon/res/values/dimens.xml
+++ b/mobile/android/app/src/photon/res/values/dimens.xml
@@ -41,16 +41,17 @@
     <!-- If you update one of these values, update the others. -->
     <dimen name="tablet_nav_button_width">48dp</dimen>
     <dimen name="tablet_nav_button_width_half">21dp</dimen>
     <dimen name="tablet_nav_button_width_plus_half">36dp</dimen>
 
     <dimen name="tablet_fwd_button_padding_start">4dp</dimen>
     <dimen name="tablet_fwd_button_padding_end">4dp</dimen>
 
+    <dimen name="tablet_tab_strip_height_pwa">0dp</dimen>
     <dimen name="tablet_tab_strip_height">48dp</dimen>
     <dimen name="tablet_tab_strip_item_width">178dp</dimen>
     <dimen name="tablet_tab_strip_item_height">40dp</dimen>
     <dimen name="tablet_tab_strip_fading_edge_size">15dp</dimen>
     <dimen name="tablet_tab_strip_item_margin">0dp</dimen>
     <dimen name="tablet_tab_strip_divider_width">1dp</dimen>
     <dimen name="tablet_tab_strip_divider_height">30dp</dimen>
     <dimen name="tablet_tab_strip_divider_padding_bottom">4dp</dimen>
--- a/mobile/android/app/src/photon/res/values/styles.xml
+++ b/mobile/android/app/src/photon/res/values/styles.xml
@@ -956,20 +956,26 @@
 
     <style name="TabStrip.Favicon" parent="TabStrip.V15.Favicon"/>
     <style name="TabStrip.Base.Favicon" parent="TabStrip.Base"/>
     <style name="TabStrip.V15.Favicon" parent="TabStrip.Base.Favicon">
         <item name="android:layout_marginLeft">12dp</item>
         <item name="android:layout_marginRight">8dp</item>
     </style>
 
+
     <style name="TabStrip.Close" parent="TabStrip.V15.Close"/>
     <style name="TabStrip.V15.Close" parent="TabStrip.Base">
         <item name="android:layout_alignParentRight">true</item>
     </style>
 
     <style name="TabStrip.Title" parent="TabStrip.V15.Title"/>
     <style name="TabStrip.V15.Title" parent="TabStrip.Base">
         <item name="android:layout_toRightOf">@id/favicon</item>
         <item name="android:layout_toLeftOf">@id/close</item>
     </style>
 
+    <style name="PwaConfirm">
+        <item name="android:layout_width">match_parent</item>
+    </style>
+
+
 </resources>
--- a/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java
+++ b/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java
@@ -144,16 +144,17 @@ import org.mozilla.gecko.tabs.TabHistory
 import org.mozilla.gecko.tabs.TabHistoryPage;
 import org.mozilla.gecko.tabs.TabsPanel;
 import org.mozilla.gecko.telemetry.TelemetryCorePingDelegate;
 import org.mozilla.gecko.telemetry.TelemetryUploadService;
 import org.mozilla.gecko.telemetry.measurements.SearchCountMeasurements;
 import org.mozilla.gecko.toolbar.AutocompleteHandler;
 import org.mozilla.gecko.toolbar.BrowserToolbar;
 import org.mozilla.gecko.toolbar.BrowserToolbar.TabEditingState;
+import org.mozilla.gecko.toolbar.PageActionLayout;
 import org.mozilla.gecko.trackingprotection.TrackingProtectionPrompt;
 import org.mozilla.gecko.updater.PostUpdateHandler;
 import org.mozilla.gecko.updater.UpdateServiceHelper;
 import org.mozilla.gecko.util.ActivityUtils;
 import org.mozilla.gecko.util.Clipboard;
 import org.mozilla.gecko.util.ContextUtils;
 import org.mozilla.gecko.util.DrawableUtil;
 import org.mozilla.gecko.util.EventCallback;
@@ -1174,17 +1175,16 @@ public class BrowserApp extends GeckoApp
         if (urls != null) {
             openUrls(urls);
         }
     }
 
     @Override
     public void onResume() {
         super.onResume();
-
         if (mIsAbortingAppLaunch) {
             return;
         }
 
         if (!mHasResumed) {
             getAppEventDispatcher().unregisterUiThreadListener(this, "Prompt:ShowTop");
             mHasResumed = true;
         }
--- a/mobile/android/base/java/org/mozilla/gecko/Tab.java
+++ b/mobile/android/base/java/org/mozilla/gecko/Tab.java
@@ -33,16 +33,18 @@ import android.content.Context;
 import android.graphics.Bitmap;
 import android.graphics.drawable.BitmapDrawable;
 import android.os.Bundle;
 import android.support.annotation.NonNull;
 import android.text.TextUtils;
 import android.util.Log;
 import android.view.View;
 
+import static org.mozilla.gecko.toolbar.PageActionLayout.PageAction.UUID_PAGE_ACTION_PWA;
+
 public class Tab {
     private static final String LOGTAG = "GeckoTab";
 
     private static Pattern sColorPattern;
     private final int mId;
     private final BrowserDB mDB;
     private long mLastUsed;
     private String mUrl;
@@ -464,20 +466,20 @@ public class Tab {
 
     public void setManifestUrl(String manifestUrl) {
         mManifestUrl = manifestUrl;
         updatePageAction();
     }
 
     public void updatePageAction() {
         if (mManifestUrl != null) {
-            PageActionLayout.PageAction.showPwaPageAction();
+            showPwaPageAction();
 
         } else {
-            PageActionLayout.PageAction.clearPwaPageAction();
+            clearPwaPageAction();
         }
     }
 
     public void setHasOpenSearch(boolean hasOpenSearch) {
         mHasOpenSearch = hasOpenSearch;
     }
 
     public void setLoadedFromCache(boolean loadedFromCache) {
@@ -845,9 +847,26 @@ public class Tab {
 
     public void setShouldShowToolbarWithoutAnimationOnFirstSelection(final boolean shouldShowWithoutAnimation) {
         mShouldShowToolbarWithoutAnimationOnFirstSelection = shouldShowWithoutAnimation;
     }
 
     public boolean getShouldShowToolbarWithoutAnimationOnFirstSelection() {
         return mShouldShowToolbarWithoutAnimationOnFirstSelection;
     }
+
+    private void clearPwaPageAction() {
+        GeckoBundle bundle = new GeckoBundle();
+        bundle.putString("id", UUID_PAGE_ACTION_PWA);
+        EventDispatcher.getInstance().dispatch("PageActions:Remove", bundle);
+    }
+
+    private void showPwaPageAction() {
+        if (!isPrivate()) {
+            GeckoBundle bundle = new GeckoBundle();
+            bundle.putString("id", UUID_PAGE_ACTION_PWA);
+            bundle.putString("title", mAppContext.getString(R.string.pwa_add_to_launcher_badge));
+            bundle.putString("icon", "drawable://add_to_homescreen");
+            bundle.putBoolean("important", true);
+            EventDispatcher.getInstance().dispatch("PageActions:Add", bundle);
+        }
+    }
 }
--- a/mobile/android/base/java/org/mozilla/gecko/tabs/TabStripItemView.java
+++ b/mobile/android/base/java/org/mozilla/gecko/tabs/TabStripItemView.java
@@ -1,9 +1,9 @@
-/* -*- Mode: Java; c-basic-offset: 4; tab-width: 20; indent-tabs-mode: nil; -*-
+/* -*- Mode: Java; c-basic-offset: 4; tab-2: 20; indent-tabs-mode: nil; -*-
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this file,
  * You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 package org.mozilla.gecko.tabs;
 
 import org.mozilla.gecko.AboutPages;
 import org.mozilla.gecko.R;
--- a/mobile/android/base/java/org/mozilla/gecko/toolbar/PageActionLayout.java
+++ b/mobile/android/base/java/org/mozilla/gecko/toolbar/PageActionLayout.java
@@ -1,19 +1,19 @@
 /* -*- Mode: Java; c-basic-offset: 4; tab-width: 20; indent-tabs-mode: nil; -*-
  * This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 package org.mozilla.gecko.toolbar;
 
 import org.mozilla.gecko.EventDispatcher;
-import org.mozilla.gecko.GeckoApplication;
 import org.mozilla.gecko.GeckoSharedPrefs;
 import org.mozilla.gecko.R;
+import org.mozilla.gecko.Tabs;
 import org.mozilla.gecko.preferences.GeckoPreferences;
 import org.mozilla.gecko.util.DrawableUtil;
 import org.mozilla.gecko.util.ResourceDrawableUtils;
 import org.mozilla.gecko.util.BundleEventListener;
 import org.mozilla.gecko.util.EventCallback;
 import org.mozilla.gecko.util.GeckoBundle;
 import org.mozilla.gecko.util.ThreadUtils;
 import org.mozilla.gecko.widget.GeckoPopupMenu;
@@ -34,19 +34,21 @@ import android.widget.ImageButton;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
 
 import java.util.Iterator;
 import java.util.List;
 import java.util.UUID;
 import java.util.ArrayList;
 
+import static org.mozilla.gecko.toolbar.PageActionLayout.PageAction.UUID_PAGE_ACTION_PWA;
+
 public class PageActionLayout extends ThemedLinearLayout implements BundleEventListener,
-                                                              View.OnClickListener,
-                                                              View.OnLongClickListener {
+        View.OnClickListener,
+        View.OnLongClickListener {
     private static final String MENU_BUTTON_KEY = "MENU_BUTTON_KEY";
     private static final int DEFAULT_PAGE_ACTIONS_SHOWN = 2;
     public static final String PREF_PWA_ONBOARDING = GeckoPreferences.NON_PREF_PREFIX + "pref_pwa_onboarding";
 
 
     private final Context mContext;
     private final LinearLayout mLayout;
     private final List<PageAction> mPageActionList;
@@ -67,25 +69,25 @@ public class PageActionLayout extends Th
         refreshPageActionIcons();
     }
 
     @Override
     protected void onAttachedToWindow() {
         super.onAttachedToWindow();
 
         EventDispatcher.getInstance().registerUiThreadListener(this,
-            "PageActions:Add",
-            "PageActions:Remove");
+                "PageActions:Add",
+                "PageActions:Remove");
     }
 
     @Override
     protected void onDetachedFromWindow() {
         EventDispatcher.getInstance().unregisterUiThreadListener(this,
-            "PageActions:Add",
-            "PageActions:Remove");
+                "PageActions:Add",
+                "PageActions:Remove");
 
         super.onDetachedFromWindow();
     }
 
     @Override
     public void setPrivateMode(boolean isPrivate) {
         super.setPrivateMode(isPrivate);
         for (int i = 0; i < getChildCount(); i++) {
@@ -118,27 +120,27 @@ public class PageActionLayout extends Th
         if ("PageActions:Add".equals(event)) {
             final String id = message.getString("id");
 
             boolean alreadyAdded = isPwaAdded(id);
             if (alreadyAdded) {
                 return;
             }
 
-            maybeShowOnboarding();
+            maybeShowPwaOnboarding(id);
 
             final String title = message.getString("title");
             final String imageURL = message.getString("icon");
             final boolean important = message.getBoolean("important");
             final boolean useTint = message.getBoolean("useTint");
 
             addPageAction(id, title, imageURL, useTint, new OnPageActionClickListeners() {
                 @Override
                 public void onClick(final String id) {
-                    if (id != null && id.equals(PageAction.UUID_PAGE_ACTION_PWA)) {
+                    if (id != null && id.equals(UUID_PAGE_ACTION_PWA)) {
                         mPwaConfirm = PwaConfirm.show(getContext());
                         return;
                     }
                     final GeckoBundle data = new GeckoBundle(1);
                     data.putString("id", id);
                     EventDispatcher.getInstance().dispatch("PageActions:Clicked", data);
                 }
 
@@ -151,36 +153,39 @@ public class PageActionLayout extends Th
                 }
             }, important);
 
         } else if ("PageActions:Remove".equals(event)) {
             removePageAction(message.getString("id"));
         }
     }
 
-    private void maybeShowOnboarding() {
-        SharedPreferences prefs = GeckoSharedPrefs.forApp(getContext());
-        final boolean show = prefs.getBoolean(PREF_PWA_ONBOARDING, true);
-        if (!show) {
-            PwaOnboarding.show(getContext());
-            prefs.edit().putBoolean(PREF_PWA_ONBOARDING, false).apply();
+    private void maybeShowPwaOnboarding(String id) {
+        // only show pwa at normal mode
+        if (id.equals(UUID_PAGE_ACTION_PWA) && Tabs.getInstance().getSelectedTab().isPrivate() == false) {
+            SharedPreferences prefs = GeckoSharedPrefs.forApp(getContext());
+            final boolean show = prefs.getBoolean(PREF_PWA_ONBOARDING, true);
+            if (show) {
+                PwaOnboarding.show(getContext());
+                prefs.edit().putBoolean(PREF_PWA_ONBOARDING, false).apply();
+            }
         }
     }
 
     private boolean isPwaAdded(String id) {
         for (PageAction pageAction : mPageActionList) {
             if (pageAction.getID() != null && pageAction.getID().equals(id)) {
                 return true;
             }
         }
         return false;
     }
 
     private void addPageAction(final String id, final String title, final String imageData, final boolean useTint,
-            final OnPageActionClickListeners onPageActionClickListeners, boolean important) {
+                               final OnPageActionClickListeners onPageActionClickListeners, boolean important) {
         ThreadUtils.assertOnUiThread();
 
         final PageAction pageAction = new PageAction(id, title, null, onPageActionClickListeners, important);
 
         int insertAt = mPageActionList.size();
         while (insertAt > 0 && mPageActionList.get(insertAt - 1).isImportant()) {
             insertAt--;
         }
@@ -228,29 +233,29 @@ public class PageActionLayout extends Th
         imageButton.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
         imageButton.setOnClickListener(this);
         imageButton.setOnLongClickListener(this);
         return imageButton;
     }
 
     @Override
     public void onClick(View v) {
-        String buttonClickedId = (String)v.getTag();
+        String buttonClickedId = (String) v.getTag();
         if (buttonClickedId != null) {
             if (buttonClickedId.equals(MENU_BUTTON_KEY)) {
                 showMenu(v, mPageActionList.size() - mMaxVisiblePageActions + 1);
             } else {
                 getPageActionWithId(buttonClickedId).onClick();
             }
         }
     }
 
     @Override
     public boolean onLongClick(View v) {
-        String buttonClickedId = (String)v.getTag();
+        String buttonClickedId = (String) v.getTag();
         if (buttonClickedId.equals(MENU_BUTTON_KEY)) {
             showMenu(v, mPageActionList.size() - mMaxVisiblePageActions + 1);
             return true;
         } else {
             return getPageActionWithId(buttonClickedId).onLongClick();
         }
     }
 
@@ -359,23 +364,24 @@ public class PageActionLayout extends Th
             MenuItem item = menu.add(Menu.NONE, pageAction.key(), Menu.NONE, pageAction.getTitle());
             item.setIcon(pageAction.getDrawable());
         }
         mPageActionsMenu.show();
     }
 
     private static interface OnPageActionClickListeners {
         public void onClick(String id);
+
         public boolean onLongClick(String id);
     }
 
     private void hidePreviousConfirmPrompt() {
         if (mPwaConfirm != null) {
             if (mPwaConfirm.isAttachedToWindow() || mPwaConfirm.getParent() != null) {
-                mPwaConfirm.dismiss();
+                mPwaConfirm.disappear();
             }
             mPwaConfirm = null;
         }
     }
 
     public static class PageAction {
         public static final String UUID_PAGE_ACTION_PWA = "279c269d-6397-4f86-a6d2-452e26456d4a";
 
@@ -395,25 +401,16 @@ public class PageActionLayout extends Th
             mTitle = title;
             mDrawable = image;
             mOnPageActionClickListeners = onPageActionClickListeners;
             mImportant = important;
 
             key = UUID.fromString(mId.subSequence(1, mId.length() - 2).toString()).hashCode();
         }
 
-        public static void showPwaPageAction() {
-            GeckoBundle bundle = new GeckoBundle();
-            bundle.putString("id", UUID_PAGE_ACTION_PWA);
-            bundle.putString("title", "Add PWA Shortcut");
-            bundle.putString("icon", "drawable://icon_openinapp");
-            bundle.putBoolean("important", true);
-            EventDispatcher.getInstance().dispatch("PageActions:Add", bundle);
-        }
-
         public Drawable getDrawable() {
             return mDrawable;
         }
 
         public void setDrawable(Drawable d) {
             mDrawable = d;
         }
 
@@ -441,15 +438,11 @@ public class PageActionLayout extends Th
 
         public boolean onLongClick() {
             if (mOnPageActionClickListeners != null) {
                 return mOnPageActionClickListeners.onLongClick(mId);
             }
             return false;
         }
 
-        public static void clearPwaPageAction() {
-            GeckoBundle bundle = new GeckoBundle();
-            bundle.putString("id", UUID_PAGE_ACTION_PWA);
-            EventDispatcher.getInstance().dispatch("PageActions:Remove", bundle);
-        }
+
     }
 }
--- a/mobile/android/base/java/org/mozilla/gecko/toolbar/PwaConfirm.java
+++ b/mobile/android/base/java/org/mozilla/gecko/toolbar/PwaConfirm.java
@@ -1,14 +1,16 @@
 /* -*- Mode: Java; c-basic-offset: 4; tab-width: 20; indent-tabs-mode: nil; -*-
  * This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 package org.mozilla.gecko.toolbar;
 
+import android.animation.Animator;
+import android.animation.ObjectAnimator;
 import android.app.Activity;
 import android.content.Context;
 import android.support.annotation.Nullable;
 import android.util.AttributeSet;
 import android.view.KeyEvent;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
@@ -18,25 +20,63 @@ import android.widget.TextView;
 
 import org.mozilla.gecko.GeckoApplication;
 import org.mozilla.gecko.R;
 import org.mozilla.gecko.Tab;
 import org.mozilla.gecko.Tabs;
 
 public class PwaConfirm extends RelativeLayout {
 
+    boolean isAnimating = false;
+
+
     public static PwaConfirm show(Context context) {
         if (context instanceof Activity) {
-            final ViewGroup contetView = (ViewGroup) ((Activity) context).findViewById(R.id.main_layout);
+            final ViewGroup contetView = (ViewGroup) ((Activity) context).findViewById(R.id.gecko_layout);
+            final View oldPwaConfirm = contetView.findViewById(R.id.pwa_confirm_root);
+            if ((oldPwaConfirm != null)) {
+                // prevent this view to be added twice.
+                return (PwaConfirm) oldPwaConfirm;
+            }
             View parent = LayoutInflater.from(context).inflate(R.layout.pwa_confirm, contetView);
-            return (PwaConfirm) parent.findViewById(R.id.pwa_confirm_root);
+            final PwaConfirm pwaConfirm = (PwaConfirm) parent.findViewById(R.id.pwa_confirm_root);
+            pwaConfirm.appear();
+            return pwaConfirm;
         }
         return null;
     }
 
+    private void appear() {
+
+        setAlpha(0);
+
+        final Animator alphaAnimator = ObjectAnimator.ofFloat(this, "alpha", 1);
+        alphaAnimator.setStartDelay(200);
+        alphaAnimator.setDuration(300);
+
+
+        alphaAnimator.start();
+    }
+
+    public void disappear() {
+        if (isAnimating) {
+            return;
+        }
+
+        isAnimating = true;
+
+        setAlpha(1);
+
+        final Animator alphaAnimator = ObjectAnimator.ofFloat(this, "alpha", 0);
+        alphaAnimator.setDuration(300);
+
+        alphaAnimator.start();
+        dismiss();
+    }
+
     public PwaConfirm(Context context) {
         super(context);
     }
 
     public PwaConfirm(Context context, @Nullable AttributeSet attrs) {
         super(context, attrs);
     }
 
@@ -53,38 +93,39 @@ public class PwaConfirm extends Relative
         init();
         setupBackpress();
     }
 
     private void init() {
         final OnClickListener dismiss = new OnClickListener() {
             @Override
             public void onClick(View v) {
-                dismiss();
+                disappear();
             }
         };
         final OnClickListener createShortcut = new OnClickListener() {
 
             @Override
             public void onClick(View v) {
                 GeckoApplication.createShortcut();
-                dismiss();
+                disappear();
             }
         };
         findViewById(R.id.pwa_confirm_root).setOnClickListener(dismiss);
         findViewById(R.id.pwa_confirm_cancel).setOnClickListener(dismiss);
         findViewById(R.id.pwa_confirm_action).setOnClickListener(createShortcut);
 
 
         final Tab selectedTab = Tabs.getInstance().getSelectedTab();
 
-        ((TextView) findViewById(R.id.pwa_confirm_title)).setText(selectedTab.getTitle());
-        ((TextView) findViewById(R.id.pwa_confirm_url)).setText(selectedTab.getURL());
-        ((ImageView) findViewById(R.id.pwa_confirm_icon)).setImageBitmap(selectedTab.getFavicon());
-
+        if (selectedTab != null) {
+            ((TextView) findViewById(R.id.pwa_confirm_title)).setText(selectedTab.getTitle());
+            ((TextView) findViewById(R.id.pwa_confirm_url)).setText(selectedTab.getURL());
+            ((ImageView) findViewById(R.id.pwa_confirm_icon)).setImageBitmap(selectedTab.getFavicon());
+        }
     }
 
     private void setupBackpress() {
         setFocusableInTouchMode(true);
         requestFocus();
         setOnKeyListener(new OnKeyListener() {
             @Override
             public boolean onKey(View v, int keyCode, KeyEvent event) {
@@ -92,11 +133,11 @@ public class PwaConfirm extends Relative
                     dismiss();
                 }
                 return true;
             }
         });
     }
 
     public void dismiss() {
-        ((ViewGroup) this.getParent()).removeView(this);
+        ((ViewGroup) PwaConfirm.this.getParent()).removeView(PwaConfirm.this);
     }
 }
--- a/mobile/android/base/java/org/mozilla/gecko/toolbar/PwaOnboarding.java
+++ b/mobile/android/base/java/org/mozilla/gecko/toolbar/PwaOnboarding.java
@@ -8,23 +8,24 @@ import android.app.Activity;
 import android.content.Context;
 import android.support.annotation.Nullable;
 import android.util.AttributeSet;
 import android.view.KeyEvent;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.LinearLayout;
+import android.widget.RelativeLayout;
 
 import org.mozilla.gecko.R;
 import org.mozilla.gecko.Tabs;
 
-public class PwaOnboarding extends LinearLayout {
+public class PwaOnboarding extends RelativeLayout {
 
-    static final String LINK_PWA_SUMO = "http://www.mozilla.org";
+    static final String LINK_PWA_SUMO = "https://developer.mozilla.org/en-US/Apps/Progressive";
 
     public static void show(Context context) {
         if (context instanceof Activity) {
             final ViewGroup contetView = (ViewGroup) ((Activity) context).findViewById(android.R.id.content);
             LayoutInflater.from(context).inflate(R.layout.pwa_onboarding, contetView);
         }
     }
 
@@ -53,18 +54,18 @@ public class PwaOnboarding extends Linea
             public void onClick(View v) {
                 dismiss();
             }
         };
         final OnClickListener loadSumo = new OnClickListener() {
 
             @Override
             public void onClick(View v) {
+                dismiss();
                 Tabs.getInstance().loadUrlInTab(LINK_PWA_SUMO);
-                dismiss();
             }
         };
         findViewById(R.id.pwa_onboarding_root).setOnClickListener(dismiss);
         findViewById(R.id.pwa_onboarding_dismiss).setOnClickListener(dismiss);
         findViewById(R.id.pwa_onboarding_sumo).setOnClickListener(loadSumo);
     }
 
 
--- a/mobile/android/base/locales/en-US/android_strings.dtd
+++ b/mobile/android/base/locales/en-US/android_strings.dtd
@@ -848,8 +848,14 @@ is simply hidden from the Activity Strea
 <!ENTITY activity_stream_delete_history "Delete from History">
 
 <!ENTITY private_tab_panel_title "Private Browsing + Tracking Protection">
 <!ENTITY private_tab_panel_description "&brandShortName; blocks parts of the pages that may track your browsing activity.">
 <!ENTITY private_tab_panel_description2 "We won\'t remember any history, but downloaded files and new bookmarks will still be saved to your device.">
 <!ENTITY private_tab_learn_more "Want to learn more?">
 
 <!ENTITY fullscreen_warning "Entered full screen">
+
+
+<!ENTITY pwa_add_to_launcher_confirm "+ Add to Home Screen">
+<!ENTITY pwa_add_to_launcher_badge "Add PWA to Home Screen">
+<!ENTITY pwa_continue_to_website "Continue to Website">
+<!ENTITY pwa_onboarding_sumo "You can easily add this website to your Home screen to have instant access and browse faster with an app-like experience.">
\ No newline at end of file
--- a/mobile/android/base/moz.build
+++ b/mobile/android/base/moz.build
@@ -924,16 +924,17 @@ gbjar.sources += ['java/org/mozilla/geck
     'toolbar/BackButton.java',
     'toolbar/BrowserToolbar.java',
     'toolbar/BrowserToolbarPhone.java',
     'toolbar/BrowserToolbarPhoneBase.java',
     'toolbar/CanvasDelegate.java',
     'toolbar/NavButton.java',
     'toolbar/PageActionLayout.java',
     'toolbar/PhoneTabsButton.java',
+    'toolbar/PwaConfirm.java',
     'toolbar/PwaOnboarding.java',
     'toolbar/SecurityModeUtil.java',
     'toolbar/ShapedButton.java',
     'toolbar/ShapedButtonFrameLayout.java',
     'toolbar/SiteIdentityPopup.java',
     'toolbar/ToolbarEditLayout.java',
     'toolbar/ToolbarEditText.java',
     'toolbar/ToolbarPrefs.java',
--- a/mobile/android/base/strings.xml.in
+++ b/mobile/android/base/strings.xml.in
@@ -634,9 +634,14 @@
   <string name="activity_stream_highlights_empty">&activity_stream_highlights_empty;</string>
 
   <string name="private_tab_panel_title">&private_tab_panel_title;</string>
   <string name="private_tab_panel_description">&private_tab_panel_description;</string>
   <string name="private_tab_panel_description2">&private_tab_panel_description2;</string>
   <string name="private_tab_learn_more">&private_tab_learn_more;</string>
 
   <string name="fullscreen_warning">&fullscreen_warning;</string>
+
+  <string name="pwa_add_to_launcher_confirm">&pwa_add_to_launcher_confirm;</string>
+  <string name="pwa_add_to_launcher_badge">&pwa_add_to_launcher_badge;</string>
+  <string name="pwa_onboarding_sumo">&pwa_onboarding_sumo;</string>
+  <string name="pwa_continue_to_website">&pwa_continue_to_website;</string>
 </resources>