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
--- 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',