Bug 1372572 - Port MozillaOnline code for a homepage page action. r?maliu draft
authorMichael Kaply <mozilla@kaply.com>
Mon, 19 Jun 2017 13:12:46 -0500
changeset 596731 333ae1ead975a58d15f7c650d6a4549087c70ad2
parent 595682 58c5151bfd62de934b2286dbd664e69886270e28
child 634055 af5fb70999de8635e83a0618ab47fe30df076a12
push id64741
push usermozilla@kaply.com
push dateMon, 19 Jun 2017 18:13:19 +0000
reviewersmaliu
bugs1372572
milestone56.0a1
Bug 1372572 - Port MozillaOnline code for a homepage page action. r?maliu MozReview-Commit-ID: GwADhgjzAuK
mobile/android/base/java/org/mozilla/gecko/Tabs.java
mobile/android/base/resources/drawable-hdpi/home.png
mobile/android/base/resources/drawable-xhdpi/home.png
mobile/android/chrome/content/browser.js
mobile/android/locales/en-US/chrome/browser.properties
--- a/mobile/android/base/java/org/mozilla/gecko/Tabs.java
+++ b/mobile/android/base/java/org/mozilla/gecko/Tabs.java
@@ -151,16 +151,17 @@ public class Tabs implements BundleEvent
             "Link:Touchicon",
             "Tab:Added",
             "Tab:AudioPlayingChange",
             "Tab:Close",
             "Tab:MediaPlaybackChange",
             "Tab:RecordingChange",
             "Tab:Select",
             "Tab:SetParentId",
+            "Tab:LoadHomepage",
             null);
 
         EventDispatcher.getInstance().registerBackgroundThreadListener(this,
             // BrowserApp already wants this on the background thread.
             "Sanitize:ClearHistory",
             null);
 
         mPrivateClearColor = Color.RED;
@@ -571,16 +572,21 @@ public class Tabs implements BundleEvent
                         tab.handleButtonStateChange(false, false);
                         notifyListeners(tab, TabEvents.LOCATION_CHANGE, tab.getURL());
                     }
                 }
             });
             return;
         }
 
+        if ("Tab:LoadHomepage".equals(event)) {
+            loadUrl(getHomepage(mAppContext), null, INVALID_TAB_ID, null, LOADURL_NONE);
+            return;
+        }
+
         // All other events handled below should contain a tabID property
         final int id = message.getInt("tabID", INVALID_TAB_ID);
         Tab tab = getTab(id);
 
         // "Tab:Added" is a special case because tab will be null if the tab was just added
         if ("Tab:Added".equals(event)) {
             String url = message.getString("uri");
 
new file mode 100644
index 0000000000000000000000000000000000000000..6eca70c9f5b23a98873f4b3a5b915b0bf321d43c
GIT binary patch
literal 1611
zc%17D@N?(olHy`uVBq!ia0vp^Dj>|k1|%Oc%$NbBBuiW)N`mv#O3D+9QW+dm@{>{(
zJaZG%Q-e|yQz{EjrrIztFe_z-M3hAM`dB6B=jtVb)aX^@7BGN-jeSKyVsdtBi9%9p
zdS;%j()-=}l@u~lY?Z=IeGPmIoKrJ0J*tXQgRA^PlB=?lEmM^2?G$V(tbhjOrj{fs
zROII56<bx<DuK<l0<uBE`br95B_-LmN)Sgy_y#CA=NF|anCcnpCL0(UDwvt+8Jd`y
znHlOR7#SEE=^Fr%nXaLUm8qGPk+}jCC;@FNN=dT{a&d#&1?1T(Wt5Z@Sn2DRmzV36
z8|&p4rRy77T3Uk4Ff!5ws?aU2%qvN((9J7WhMC}!TAW;zSx}OhpQixgCnn{Wme?vO
z!Mu=L05>+T7#d8#0MoBXEYLU9Gtfs;=<ADLX>KlDb#X~hY8rmk#UYgisro^w#rdU0
z$-sz9QwC`+uyQU+O)SYT3dzsUfrVl~Mt(_taYlZDf^)E$f<|~|UP^v>u_jo(udkJ7
zUU5lcUUI6Zi>(q+L@zTl#md~&+||*^+`_=c$lTD-)y%@!*~Hn|+1%L3!pOkX(F~^7
zB|o_|H#M&WrZ)wl*Ak~*P*Q;CPA$qTOHFYr%Fk5*d)X=zw_D6`y9J^*1-Dzwaq86v
zIz}HYqG3Y7)B|F|lP!<~Pxz^Mz|>v@OxD-a-o9gCVA}8L;uunK>&=YZ4BtYT<K;)U
zW#<H*3iev$G0#a`e~S3C#Agp#C#CFMpL5pc`B~HLyxN*V+N%7jJ}O%S<lJ<815a^>
zZF<70zjUqW@#pdPukOEW`TgCz>T_ku%kBQY`)ObI|NsB@|E>4yKC|$1w6j&_`t;_c
zwWD&etintmsbZE#&rEOsTN$GDMRpcrXaMKu_Ae)H%=Mii9>B-_Q1gw1kYh*Yfh~tr
zR#(WxG+s8y3aH^woNTDOLC<&d-VGc=7esIJDW>s0o7p~N`h|B|(d!=H5$aSpawYlQ
z0iW=zx)Ge(4<@b7Q@Yd8cA<|)QP^O)&77^`vld*`y3Lv&8kROyzLhnA{cdA9hv8`h
zf14vUO}$4Z)ETBNa{g7z7k1b>eEwId)k+f-j=VW?r*-GLRqh+a4EZyHkG$tDV4L-D
zR$f&5pEXyN)9zklVk=AW30ib8+vb*hdveFi#dm|=9urz!xBJmWxeA`yTZ?<cBqSEI
zPFa1Izq)D0->vDBDraoorTFc$D4)WUWw)*-`8jo-cl!P0g!-4bg@x%mZ|!Z2I#&C3
zyK}hhq5Ylv+FxGjoUoCrs*|UDVZiQ8u^sYqQu8k>y_v94Lho>nz5J|qRrdPzFQ+u`
zmuisseUs~aqG(M6uh3II-hFmoguP1FdA4kM(ecV8z~;g6@B8{Tc+NanE&JT$g{OK(
zms2g1;ad*P%X+!oif0Y`a`g`7?ckGtxaiU3^$NwUvjso18U~ksD|R}wf0c-v*3%2e
zZhrrH&*=JB^SSR`r$~gIp1IlULY4BFkb2giC4V{tCJ2}Ly*+W$w?}K6*t3kUYWrk(
zCM|iYw4(QOe(<FCb#~6R0**VMTv?j=>ey^<;~SoJIth3Gf1IAJv&1ZtQ|p|;%@-zL
zT_t}VZ@#nXy_a)+_rKerE55(uskNS>|21N_Xz)$*`&0S;Tc<@_*su0tJp(gC=C`fy
SJ~eCym+zjgelF{r5}E*0ZE?B)
new file mode 100644
index 0000000000000000000000000000000000000000..0400ab5aa0c781c486b29716a9b6697da8320592
GIT binary patch
literal 1921
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
TfFOn*%TF;fESi5PM6CY@A-48k
--- a/mobile/android/chrome/content/browser.js
+++ b/mobile/android/chrome/content/browser.js
@@ -3782,16 +3782,19 @@ Tab.prototype = {
       return;
 
     this.lastTouchedAt = Date.now();
 
     if (aActive) {
       this.browser.setAttribute("primary", "true");
       this.browser.focus();
       this.browser.docShellIsActive = true;
+      if (AppConstants.MOZ_ANDROID_MOZILLA_ONLINE) {
+        Homepage.updatePageAction();
+      }
       Reader.updatePageAction(this);
       ExternalApps.updatePageAction(this.browser.currentURI, this.browser.contentDocument);
     } else {
       this.browser.removeAttribute("primary");
       this.browser.docShellIsActive = false;
       this.browser.blur();
     }
   },
@@ -6662,16 +6665,44 @@ var ExternalApps = {
     if(!this._pageActionId)
       return;
 
     PageActions.remove(this._pageActionId);
     delete this._pageActionId;
   },
 };
 
+var Homepage = {
+  updatePageAction: function updatePageAction() {
+    // If the pageaction is already added, just return
+    if (this._pageActionId != undefined) {
+      return;
+    }
+    this._pageActionId = PageActions.add({
+      title: Strings.browser.GetStringFromName("home.pageAction"),
+      icon: "drawable://home",
+      important: true,
+
+      clickCallback: () => {
+        let message = {
+          type: "Tab:LoadHomepage"
+        };
+        GlobalEventDispatcher.sendRequest(message);
+      },
+    });
+  },
+  clearPageAction: function clearPageAction() {
+    if(!this._pageActionId)
+      return;
+
+    PageActions.remove(this._pageActionId);
+    delete this._pageActionId;
+  },
+};
+
 var Distribution = {
   // File used to store campaign data
   _file: null,
 
   _preferencesJSON: null,
 
   init: function dc_init() {
     GlobalEventDispatcher.registerListener(this, [
--- a/mobile/android/locales/en-US/chrome/browser.properties
+++ b/mobile/android/locales/en-US/chrome/browser.properties
@@ -432,8 +432,13 @@ feedHandler.subscribeWith=Subscribe with
 # %1$S=name of the api that's deprecated, %2$S=New API to use. This may be a url to
 # a file they should import or the name of an api.
 nativeWindow.deprecated=%1$S is deprecated. Please use %2$S instead
 
 # Vibration API permission prompt
 vibrationRequest.message = Allow this site to vibrate your device?
 vibrationRequest.denyButton = Don't allow
 vibrationRequest.allowButton = Allow
+
+# LOCALIZATION NOTE (home.pageAction):
+# This string is not shown in the UI, but it is read when TalkBack is activated.
+# It is only used in the Mozilla China version of Fennec at this time.
+home.pageAction = Open Homepage