package io.hefuyi.zhihudaily.ui.fragment;
import android.content.Context;
import android.content.res.Resources;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;
import java.util.List;
import javax.inject.Inject;
import butterknife.Bind;
import butterknife.ButterKnife;
import io.hefuyi.zhihudaily.DailyApplication;
import io.hefuyi.zhihudaily.R;
import io.hefuyi.zhihudaily.injector.component.ApplicationComponent;
import io.hefuyi.zhihudaily.injector.component.DaggerNavigationComponent;
import io.hefuyi.zhihudaily.injector.component.NavigationComponent;
import io.hefuyi.zhihudaily.injector.module.ActivityModule;
import io.hefuyi.zhihudaily.injector.module.NavigationModule;
import io.hefuyi.zhihudaily.interfaces.NavigationDrawerCallbacks;
import io.hefuyi.zhihudaily.mvp.contract.NavigationContract;
import io.hefuyi.zhihudaily.mvp.model.Theme;
import io.hefuyi.zhihudaily.mvp.model.Themes;
import io.hefuyi.zhihudaily.ui.activity.NavigationDrawerActivity;
import io.hefuyi.zhihudaily.ui.adapter.NavigationDrawerAdapter;
import io.hefuyi.zhihudaily.util.L;
import io.hefuyi.zhihudaily.util.UIUtils;
/**
* A simple {@link Fragment} subclass.
*/
public class NavigationFragment extends Fragment implements NavigationDrawerCallbacks,NavigationContract.View{
private static final String STATE_SELECTED_POSITION = "selected_navigation_drawer_position";
public static final String TAG = NavigationFragment.class.getSimpleName();
@Inject
NavigationContract.Presenter navigationPresenter;
@Bind(R.id.recyclerView)
RecyclerView recyclerView;
private NavigationDrawerCallbacks mCallbacks;
private int mCurrentSelectedPosition = -1;
private NavigationDrawerAdapter mAdapter;
private List<Theme> mThemes;
/*初始化相关*/
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
L.i(TAG, "onCreate " + this);
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
mCurrentSelectedPosition = savedInstanceState.getInt(STATE_SELECTED_POSITION);
}
//init adapter
boolean isKitKatWithNavigation = Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT
&& UIUtils.hasNavigationBar(getActivity());
mAdapter = new NavigationDrawerAdapter(isKitKatWithNavigation);
//set callback for adapter
mAdapter.setNavigationDrawerCallbacks(this);
}
public void injectDependences() {
ApplicationComponent applicationComponent = ((DailyApplication) getActivity().getApplication())
.getApplicationComponent();
NavigationComponent navigationComponent = DaggerNavigationComponent.builder()
.applicationComponent(applicationComponent)
.activityModule(new ActivityModule(getActivity()))
.navigationModule(new NavigationModule())
.build();
navigationComponent.inject(this);
}
/*初始化相关*/
/*view接口方法*/
@Override
public void showThemes(final Themes themes) {
Runnable runnable = new Runnable() {
@Override
public void run() {
mThemes = themes.getOthers();
mAdapter.setThemes(mThemes);
}
};
getActivity().runOnUiThread(runnable);
}
@Override
public void showError() {
Runnable runnable = new Runnable() {
@Override
public void run() {
Toast.makeText(getActivity(), "get themes error", Toast.LENGTH_SHORT).show();
}
};
getActivity().runOnUiThread(runnable);
}
/*view接口方法*/
/*普通逻辑*/
@Override
public void onNavigationDrawerItemSelected(int position) {
if (mCurrentSelectedPosition == position) {
((NavigationDrawerActivity)getActivity()).closeDrawer();
return;
}
((NavigationDrawerActivity)getActivity()).closeDrawer();
mCurrentSelectedPosition = position;
if (mCallbacks != null) {
mCallbacks.onNavigationDrawerItemSelected(position);
}
}
public void refreshUI() {
TypedValue headerBackground = new TypedValue();
TypedValue navdrawerBackground = new TypedValue();
TypedValue navdrawerTextColor = new TypedValue();
Resources.Theme theme = getActivity().getTheme();
theme.resolveAttribute(R.attr.colorPrimaryDark, headerBackground, true);
theme.resolveAttribute(R.attr.navdrawer_background, navdrawerBackground,true);
theme.resolveAttribute(R.attr.navdrawer_text_color, navdrawerTextColor, true);
recyclerView.setBackgroundResource(navdrawerBackground.resourceId);
int childCount = recyclerView.getChildCount();
for (int childIndex = 0; childIndex < childCount; childIndex++) {
int viewType = mAdapter.getItemViewType(childIndex);
switch (viewType) {
case NavigationDrawerAdapter.Type.TYPE_HEADER:
ViewGroup header = (ViewGroup) recyclerView.getChildAt(childIndex);
header.setBackgroundResource(headerBackground.resourceId);
break;
case NavigationDrawerAdapter.Type.TYPE_ITEM:
ViewGroup item = (ViewGroup) recyclerView.getChildAt(childIndex);
TextView textView = (TextView) item.findViewById(R.id.tvItemName);
textView.setTextColor(navdrawerTextColor.resourceId);
break;
case NavigationDrawerAdapter.Type.TYPE_BOTTOM_SPACE:
View childView = recyclerView.getChildAt(childIndex);
childView.setBackgroundResource(navdrawerBackground.resourceId);
break;
}
}
mAdapter.notifyDataSetChanged();
}
public static int getDefaultNavDrawerItem() {
return 0;
}
public String getSectionId(int position){
return position == 0 ? null : mThemes.get(position - 1).getId();
}
public String getTitle(int position){
return position == 0 ? getString(R.string.title_activity_main) : mThemes.get(position - 1).getName();
}
public void selectItem(int position) {
if (position == mCurrentSelectedPosition) {
((NavigationDrawerActivity)getActivity()).closeDrawer();
return;
}
mAdapter.selectPosition(position);
}
/*普通逻辑*/
/*生命周期回调*/
@Override
public void onAttach(Context context) {
L.i(TAG, "onAttach " + this);
super.onAttach(context);
injectDependences();
navigationPresenter.attachView(this);
try {
mCallbacks = (NavigationDrawerCallbacks) getActivity();
} catch (ClassCastException e) {
throw new ClassCastException("Activity must implement NavigationDrawerCallbacks!");
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_navigation, container, false);
ButterKnife.bind(this, rootView);
return rootView;
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
recyclerView.setAdapter(mAdapter);
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
navigationPresenter.refresh();
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(STATE_SELECTED_POSITION, mCurrentSelectedPosition);
}
/*生命周期回调*/
}