package com.wangdaye.mysplash.main.view.fragment;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.design.widget.CoordinatorLayout;
import android.support.design.widget.TabLayout;
import android.support.v4.view.ViewPager;
import android.support.v7.widget.Toolbar;
import android.text.TextPaint;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;
import com.wangdaye.mysplash.Mysplash;
import com.wangdaye.mysplash.R;
import com.wangdaye.mysplash.collection.view.activity.CollectionActivity;
import com.wangdaye.mysplash.common.data.entity.unsplash.Collection;
import com.wangdaye.mysplash.common.data.entity.unsplash.NotificationResult;
import com.wangdaye.mysplash.common.data.entity.unsplash.Photo;
import com.wangdaye.mysplash.common.i.model.PagerManageModel;
import com.wangdaye.mysplash.common.i.presenter.NotificationBarPresenter;
import com.wangdaye.mysplash.common.i.presenter.PagerManagePresenter;
import com.wangdaye.mysplash.common.i.presenter.ToolbarPresenter;
import com.wangdaye.mysplash.common._basic.MysplashActivity;
import com.wangdaye.mysplash.common._basic.MysplashFragment;
import com.wangdaye.mysplash.common.ui.widget.AutoHideInkPageIndicator;
import com.wangdaye.mysplash.common.ui.widget.nestedScrollView.NestedScrollAppBarLayout;
import com.wangdaye.mysplash.common.utils.BackToTopUtils;
import com.wangdaye.mysplash.common.i.view.PagerManageView;
import com.wangdaye.mysplash.common.i.view.PagerView;
import com.wangdaye.mysplash.common.i.view.PopupManageView;
import com.wangdaye.mysplash.common.utils.helper.IntentHelper;
import com.wangdaye.mysplash.common.utils.manager.AuthManager;
import com.wangdaye.mysplash.common.utils.manager.ThemeManager;
import com.wangdaye.mysplash.common.utils.manager.UserNotificationManager;
import com.wangdaye.mysplash.main.model.fragment.PagerManageObject;
import com.wangdaye.mysplash.main.presenter.fragment.HomeFragmentNotificationBarImplementor;
import com.wangdaye.mysplash.main.presenter.fragment.HomeFragmentPopupManageImplementor;
import com.wangdaye.mysplash.main.presenter.fragment.PagerManageImplementor;
import com.wangdaye.mysplash.main.presenter.fragment.ToolbarImplementor;
import com.wangdaye.mysplash.common.ui.adapter.MyPagerAdapter;
import com.wangdaye.mysplash.common.ui.widget.coordinatorView.StatusBarView;
import com.wangdaye.mysplash.main.view.activity.MainActivity;
import com.wangdaye.mysplash.main.view.widget.HomeCollectionsView;
import com.wangdaye.mysplash.main.view.widget.HomePhotosView;
import com.wangdaye.mysplash.photo.view.activity.PhotoActivity;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
/**
* Home fragment.
*
* This fragment is used to show the home page of Mysplash.
*
* */
public class HomeFragment extends MysplashFragment
implements PopupManageView, PagerManageView,
View.OnClickListener, Toolbar.OnMenuItemClickListener, ViewPager.OnPageChangeListener,
NestedScrollAppBarLayout.OnNestedScrollingListener,
UserNotificationManager.OnUpdateNotificationListener {
@BindView(R.id.fragment_home_statusBar)
StatusBarView statusBar;
@BindView(R.id.fragment_home_container)
CoordinatorLayout container;
@BindView(R.id.fragment_home_appBar)
NestedScrollAppBarLayout appBar;
@BindView(R.id.fragment_home_toolbar)
Toolbar toolbar;
@BindView(R.id.container_notification_bar_button)
ImageButton bellBtn;
@BindView(R.id.container_notification_bar_unreadFlag)
ImageView redDot;
@BindView(R.id.fragment_home_viewPager)
ViewPager viewPager;
@BindView(R.id.fragment_home_indicator)
AutoHideInkPageIndicator indicator;
private PagerView[] pagers = new PagerView[3];
private ToolbarPresenter toolbarPresenter;
private HomeFragmentPopupManageImplementor popupManageImplementor;
private PagerManageModel pagerManageModel;
private PagerManagePresenter pagerManagePresenter;
private NotificationBarPresenter notificationBarPresenter;
private final String KEY_HOME_FRAGMENT_PAGE_POSITION = "home_fragment_page_position";
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
AuthManager.getInstance()
.getNotificationManager()
.addOnUpdateNotificationListener(this);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_home, container, false);
ButterKnife.bind(this, view);
initModel(savedInstanceState);
initPresenter();
initView(view, savedInstanceState);
return view;
}
@Override
public void onDestroy() {
super.onDestroy();
AuthManager.getInstance()
.getNotificationManager()
.removeOnUpdateNotificationListener(this);
for (PagerView p : pagers) {
if (p != null) {
p.cancelRequest();
}
}
}
@Override
public boolean needSetOnlyWhiteStatusBarText() {
return appBar.getY() <= -appBar.getMeasuredHeight();
}
@Override
public void onHiddenChanged(boolean hidden) {
if (!hidden) {
notificationBarPresenter.setVisible(bellBtn, redDot);
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(KEY_HOME_FRAGMENT_PAGE_POSITION, pagerManagePresenter.getPagerPosition());
for (PagerView p : pagers) {
p.onSaveInstanceState(outState);
}
}
@Override
public void writeLargeData(MysplashActivity.BaseSavedStateFragment outState) {
if (pagers[0] != null) {
((MainActivity.SavedStateFragment) outState).setHomeNewList(
((HomePhotosView) pagers[0]).getPhotos());
}
if (pagers[1] != null) {
((MainActivity.SavedStateFragment) outState).setHomeFeaturedList(
((HomePhotosView) pagers[1]).getPhotos());
}
if (pagers[2] != null) {
((MainActivity.SavedStateFragment) outState).setHomeCollectionList(
((HomeCollectionsView) pagers[2]).getCollections());
}
}
@Override
public void readLargeData(MysplashActivity.BaseSavedStateFragment savedInstanceState) {
if (pagers[0] != null) {
((HomePhotosView) pagers[0]).setPhotos(
((MainActivity.SavedStateFragment) savedInstanceState).getHomeNewList());
}
if (pagers[1] != null) {
((HomePhotosView) pagers[1]).setPhotos(
((MainActivity.SavedStateFragment) savedInstanceState).getHomeFeaturedList());
}
if (pagers[2] != null) {
((HomeCollectionsView) pagers[2]).setCollections(
((MainActivity.SavedStateFragment) savedInstanceState).getHomeCollectionList());
}
}
@Override
public boolean needBackToTop() {
return pagerManagePresenter.needPagerBackToTop();
}
@Override
public void backToTop() {
statusBar.animToInitAlpha();
setStatusBarStyle(false);
BackToTopUtils.showTopBar(appBar, viewPager);
pagerManagePresenter.pagerScrollToTop();
}
@Override
public void handleActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case Mysplash.PHOTO_ACTIVITY:
Photo photo = data.getParcelableExtra(PhotoActivity.KEY_PHOTO_ACTIVITY_PHOTO);
if (photo != null) {
((HomePhotosView) pagers[0]).updatePhoto(photo);
((HomePhotosView) pagers[1]).updatePhoto(photo);
}
break;
case Mysplash.COLLECTION_ACTIVITY:
Collection collection = data.getParcelableExtra(
CollectionActivity.KEY_COLLECTION_ACTIVITY_COLLECTION);
if (collection != null) {
((HomeCollectionsView) pagers[2]).updateCollection(collection);
}
break;
}
}
@Override
public CoordinatorLayout getSnackbarContainer() {
return container;
}
// init.
private void initModel(Bundle savedInstanceState) {
this.pagerManageModel = new PagerManageObject(
savedInstanceState == null ?
0 : savedInstanceState.getInt(KEY_HOME_FRAGMENT_PAGE_POSITION, 0));
}
private void initView(View v, Bundle savedInstanceState) {
appBar.setOnNestedScrollingListener(this);
ThemeManager.inflateMenu(
toolbar, R.menu.fragment_home_toolbar_light, R.menu.fragment_home_toolbar_dark);
ThemeManager.setNavigationIcon(
toolbar, R.drawable.ic_toolbar_menu_light, R.drawable.ic_toolbar_menu_dark);
toolbar.setOnMenuItemClickListener(this);
toolbar.setNavigationOnClickListener(this);
TextView title = ButterKnife.findById(v, R.id.container_notification_bar_title);
if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
title.setTextSize(
TypedValue.COMPLEX_UNIT_PX,
getContext().getResources().getDimension(R.dimen.subtitle_text_size));
} else {
title.setTextSize(
TypedValue.COMPLEX_UNIT_PX,
getContext().getResources().getDimension(R.dimen.large_title_text_size));
}
TextPaint paint = title.getPaint();
paint.setFakeBoldText(true);
notificationBarPresenter.setVisible(bellBtn, redDot);
if (AuthManager.getInstance().isAuthorized()
&& AuthManager.getInstance().getNumericId() > 0) {
AuthManager.getInstance().getNotificationManager().requestPersonalNotifications();
}
initPages(v, savedInstanceState);
}
private void initPages(View v, Bundle savedInstanceState) {
List<View> pageList = new ArrayList<>();
pageList.add(
new HomePhotosView(
(MainActivity) getActivity(),
Mysplash.CATEGORY_TOTAL_NEW,
R.id.fragment_home_page_new));
pageList.add(
new HomePhotosView(
(MainActivity) getActivity(),
Mysplash.CATEGORY_TOTAL_FEATURED,
R.id.fragment_home_page_featured));
pageList.add(
new HomeCollectionsView(
(MysplashActivity) getActivity(),
R.id.fragment_home_page_collection));
for (int i = 0; i < pageList.size(); i ++) {
pagers[i] = (PagerView) pageList.get(i);
}
String[] homeTabs = getResources().getStringArray(R.array.home_tabs);
List<String> tabList = new ArrayList<>();
Collections.addAll(tabList, homeTabs);
MyPagerAdapter adapter = new MyPagerAdapter(pageList, tabList);
viewPager.setAdapter(adapter);
viewPager.setCurrentItem(pagerManagePresenter.getPagerPosition(), false);
viewPager.addOnPageChangeListener(this);
TabLayout tabLayout = ButterKnife.findById(v, R.id.fragment_home_tabLayout);
tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
tabLayout.setupWithViewPager(viewPager);
indicator.setViewPager(viewPager);
indicator.setAlpha(0f);
if (savedInstanceState == null) {
for (PagerView pager : pagers) {
pager.refreshPager();
}
} else {
for (PagerView pager : pagers) {
pager.onRestoreInstanceState(savedInstanceState);
}
}
}
private void initPresenter() {
this.toolbarPresenter = new ToolbarImplementor();
this.popupManageImplementor = new HomeFragmentPopupManageImplementor(this);
this.pagerManagePresenter = new PagerManageImplementor(pagerManageModel, this);
this.notificationBarPresenter = new HomeFragmentNotificationBarImplementor();
}
// control.
public void showPopup() {
int page = pagerManagePresenter.getPagerPosition();
popupManageImplementor.showPopup(
getActivity(),
toolbar,
pagerManagePresenter.getPagerKey(page),
page);
}
// interface.
// on click listener.
@Override
public void onClick(View view) {
switch (view.getId()) {
case -1:
toolbarPresenter.touchNavigatorIcon((MysplashActivity) getActivity());
break;
}
}
@OnClick(R.id.fragment_home_toolbar) void clickToolbar() {
toolbarPresenter.touchToolbar((MysplashActivity) getActivity());
}
@OnClick(R.id.container_notification_bar_button) void clickBellBtn() {
IntentHelper.startNotificationActivity((MysplashActivity) getActivity());
}
// on menu item click listener.
@Override
public boolean onMenuItemClick(MenuItem item) {
return toolbarPresenter.touchMenuItem((MysplashActivity) getActivity(), item.getItemId());
}
// on page changed listener.
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
// do nothing.
}
@Override
public void onPageSelected(int position) {
pagerManagePresenter.setPagerPosition(position);
pagerManagePresenter.checkToRefresh(position);
}
@Override
public void onPageScrollStateChanged(int state) {
if (appBar.getY() <= -appBar.getMeasuredHeight()) {
switch (state) {
case ViewPager.SCROLL_STATE_DRAGGING:
indicator.setDisplayState(true);
break;
case ViewPager.SCROLL_STATE_IDLE:
indicator.setDisplayState(false);
break;
}
}
}
// on nested scrolling listener.
@Override
public void onStartNestedScroll() {
// do nothing.
}
@Override
public void onNestedScrolling() {
if (needSetOnlyWhiteStatusBarText()) {
if (statusBar.isInitState()) {
statusBar.animToDarkerAlpha();
setStatusBarStyle(true);
}
} else {
if (!statusBar.isInitState()) {
statusBar.animToInitAlpha();
setStatusBarStyle(false);
}
}
}
@Override
public void onStopNestedScroll() {
// do nothing.
}
// on update notification listener.
@Override
public void onRequestNotificationSucceed(List<NotificationResult> resultList) {
notificationBarPresenter.setImage(bellBtn, redDot);
}
@Override
public void onRequestNotificationFailed() {
// do nothing.
}
@Override
public void onAddNotification(NotificationResult result, int position) {
// do nothing.
}
@Override
public void onClearNotification() {
notificationBarPresenter.setVisible(bellBtn, redDot);
}
@Override
public void onSetLatestTime() {
notificationBarPresenter.setVisible(bellBtn, redDot);
}
// view.
// pager manage view.
@Override
public PagerView getPagerView(int position) {
return pagers[position];
}
@Override
public boolean canPagerSwipeBack(int position, int dir) {
return false;
}
@Override
public int getPagerItemCount(int position) {
return pagers[position].getItemCount();
}
// popup manage view.
@Override
public void responsePopup(String value, int position) {
pagers[position].setKey(value);
pagers[position].refreshPager();
}
}