Bug 1288256 - Part 2: extract HomePager interface into HomeScreen r?sebastian draft
authorAndrzej Hunt <ahunt@mozilla.com>
Thu, 21 Jul 2016 08:48:23 -0700
changeset 390722 1d3fef37fcd9b7b1de2667d389d49284b3381df7
parent 390717 ac54f91ae6492bd8bfc972e4d49c5063e3c04435
child 390723 9781099b5820b472dd2e184f8f2b41ddd97753e6
push id23728
push userahunt@mozilla.com
push dateThu, 21 Jul 2016 15:54:40 +0000
reviewerssebastian
bugs1288256
milestone50.0a1
Bug 1288256 - Part 2: extract HomePager interface into HomeScreen r?sebastian This will permit us to plug in other HomeScreen implementations as needed. MozReview-Commit-ID: Dvmyk1sdBT6
mobile/android/base/java/org/mozilla/gecko/home/HomePager.java
mobile/android/base/java/org/mozilla/gecko/home/HomeScreen.java
mobile/android/base/moz.build
--- a/mobile/android/base/java/org/mozilla/gecko/home/HomePager.java
+++ b/mobile/android/base/java/org/mozilla/gecko/home/HomePager.java
@@ -16,29 +16,36 @@ import org.mozilla.gecko.TelemetryContra
 import org.mozilla.gecko.animation.PropertyAnimator;
 import org.mozilla.gecko.animation.ViewHelper;
 import org.mozilla.gecko.home.HomeAdapter.OnAddPanelListener;
 import org.mozilla.gecko.home.HomeConfig.PanelConfig;
 import org.mozilla.gecko.util.Experiments;
 import org.mozilla.gecko.util.ThreadUtils;
 
 import android.content.Context;
+import android.graphics.Rect;
 import android.graphics.drawable.Drawable;
 import android.os.Bundle;
 import android.support.v4.app.FragmentManager;
 import android.support.v4.app.LoaderManager;
 import android.support.v4.app.LoaderManager.LoaderCallbacks;
 import android.support.v4.content.Loader;
 import android.support.v4.view.ViewPager;
 import android.util.AttributeSet;
 import android.view.MotionEvent;
 import android.view.View;
 import android.view.ViewGroup;
 
-public class HomePager extends ViewPager {
+public class HomePager extends ViewPager implements HomeScreen {
+
+    @Override
+    public boolean requestFocus(int direction, Rect previouslyFocusedRect) {
+        return super.requestFocus(direction, previouslyFocusedRect);
+    }
+
     private static final int LOADER_ID_CONFIG = 0;
 
     private final Context mContext;
     private volatile boolean mVisible;
     private Decor mDecor;
     private View mTabStrip;
     private HomeBanner mHomeBanner;
     private int mDefaultPageIndex = -1;
@@ -106,28 +113,16 @@ public class HomePager extends ViewPager
          *
          * @param url to open.
          * @param flags to open new tab with.
          */
         public void onUrlOpenInBackground(String url, EnumSet<Flags> flags);
     }
 
     /**
-     * Interface for listening into ViewPager panel changes
-     */
-    public interface OnPanelChangeListener {
-        /**
-         * Called when a new panel is selected.
-         *
-         * @param panelId of the newly selected panel
-         */
-        public void onPanelSelected(String panelId);
-    }
-
-    /**
      * Special type of child views that could be added as pager decorations by default.
      */
     public interface Decor {
         void onAddPagerView(String title);
         void removeAllPagerViews();
         void onPageSelected(int position);
         void onPageScrolled(int position, float positionOffset, int positionOffsetPixels);
         void setOnTitleClickListener(TabMenuStrip.OnTitleClickListener onTitleClickListener);
@@ -200,16 +195,17 @@ public class HomePager extends ViewPager
         super.addView(child, index, params);
     }
 
     /**
      * Loads and initializes the pager.
      *
      * @param fm FragmentManager for the adapter
      */
+     @Override
     public void load(LoaderManager lm, FragmentManager fm, String panelId, Bundle restoreData, PropertyAnimator animator) {
         mLoadState = LoadState.LOADING;
 
         mVisible = true;
         mInitialPanelId = panelId;
         mRestoreData = restoreData;
 
         // Update the home banner message each time the HomePager is loaded.
@@ -252,16 +248,17 @@ public class HomePager extends ViewPager
                             PropertyAnimator.Property.ALPHA,
                             1.0f);
         }
     }
 
     /**
      * Removes all child fragments to free memory.
      */
+     @Override
     public void unload() {
         mVisible = false;
         setAdapter(null);
         mLoadState = LoadState.UNLOADED;
 
         // Stop UI Telemetry sessions.
         stopCurrentPanelTelemetrySession();
     }
@@ -301,16 +298,17 @@ public class HomePager extends ViewPager
      *  * HomePager has not loaded yet
      *  * Panel with the given panelId cannot be found
      *
      * If you're trying to open a built-in panel, consider loading the panel url directly with
      * {@link org.mozilla.gecko.AboutPages#getURLForBuiltinPanelType(HomeConfig.PanelType)}.
      *
      * @param panelId of the home panel to be shown.
      */
+     @Override
     public void showPanel(String panelId, Bundle restoreData) {
         if (!mVisible) {
             return;
         }
 
         switch (mLoadState) {
             case LOADING:
                 mInitialPanelId = panelId;
@@ -354,16 +352,17 @@ public class HomePager extends ViewPager
     public boolean dispatchTouchEvent(MotionEvent event) {
         if (mHomeBanner != null) {
             mHomeBanner.handleHomeTouch(event);
         }
 
         return super.dispatchTouchEvent(event);
     }
 
+    @Override
     public void onToolbarFocusChange(boolean hasFocus) {
         if (mHomeBanner == null) {
             return;
         }
 
         // We should only make the banner active if the toolbar is not focused and we are on the default page
         final boolean active = !hasFocus && getCurrentItem() == mDefaultPageIndex;
         mHomeBanner.setActive(active);
@@ -454,20 +453,22 @@ public class HomePager extends ViewPager
         ThreadUtils.getUiHandler().post(new Runnable() {
             @Override
             public void run() {
                 adapter.setCanLoadHint(true);
             }
         });
     }
 
+    @Override
     public void setOnPanelChangeListener(OnPanelChangeListener listener) {
        mPanelChangedListener = listener;
     }
 
+    @Override
     public void setPanelStateChangeListener(HomeFragment.PanelStateChangeListener listener) {
         mPanelStateChangeListener = listener;
 
         HomeAdapter adapter = (HomeAdapter) getAdapter();
         if (adapter != null) {
             adapter.setPanelStateChangeListener(listener);
         }
     }
new file mode 100644
--- /dev/null
+++ b/mobile/android/base/java/org/mozilla/gecko/home/HomeScreen.java
@@ -0,0 +1,52 @@
+package org.mozilla.gecko.home;
+
+import android.os.Bundle;
+import android.support.v4.app.FragmentManager;
+import android.support.v4.app.LoaderManager;
+import android.view.View;
+
+import org.mozilla.gecko.animation.PropertyAnimator;
+
+/**
+ * Generic interface for any View that can be used as the homescreen.
+ *
+ * In the past we had the HomePager, which contained the usual homepanels (multiple panels: TopSites,
+ * bookmarks, history, etc.), which could be swiped between.
+ *
+ * This interface allows easily switching between different homepanel implementations. For example
+ * the prototype activity-stream panel (which will be a single panel combining the functionality
+ * of the previous panels).
+ */
+public interface HomeScreen {
+    /**
+     * Interface for listening into ViewPager panel changes
+     */
+    public interface OnPanelChangeListener {
+        /**
+         * Called when a new panel is selected.
+         *
+         * @param panelId of the newly selected panel
+         */
+        public void onPanelSelected(String panelId);
+    }
+
+    // The following two methods are actually methods of View. Since there is no View interface
+    // we're forced to do this instead of "extending" View. Any class implementing HomeScreen
+    // will have to implement these and pass them through to the underlying View.
+    boolean isVisible();
+    boolean requestFocus();
+
+    void onToolbarFocusChange(boolean hasFocus);
+
+    void showPanel(String panelId, Bundle restoreData);
+
+    void setOnPanelChangeListener(OnPanelChangeListener listener);
+
+    void setPanelStateChangeListener(HomeFragment.PanelStateChangeListener listener);
+
+    void setBanner(HomeBanner banner);
+
+    void load(LoaderManager lm, FragmentManager fm, String panelId, Bundle restoreData, PropertyAnimator animator);
+
+    void unload();
+}
--- a/mobile/android/base/moz.build
+++ b/mobile/android/base/moz.build
@@ -421,16 +421,17 @@ gbjar.sources += ['java/org/mozilla/geck
     'home/HomeConfigLoader.java',
     'home/HomeConfigPrefsBackend.java',
     'home/HomeContextMenuInfo.java',
     'home/HomeExpandableListView.java',
     'home/HomeFragment.java',
     'home/HomeListView.java',
     'home/HomePager.java',
     'home/HomePanelsManager.java',
+    'home/HomeScreen.java',
     'home/ImageLoader.java',
     'home/MultiTypeCursorAdapter.java',
     'home/PanelAuthCache.java',
     'home/PanelAuthLayout.java',
     'home/PanelBackItemView.java',
     'home/PanelHeaderView.java',
     'home/PanelInfoManager.java',
     'home/PanelItemView.java',