/** * Copyright 2016 JustWayward Team * <p> * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * <p> * http://www.apache.org/licenses/LICENSE-2.0 * <p> * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.justwayward.reader.ui.fragment; import android.app.ActivityManager; import android.content.ComponentName; import android.content.Context; import android.content.DialogInterface; import android.os.AsyncTask; import android.support.v7.app.AlertDialog; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.LinearLayout; import android.widget.TextView; import com.justwayward.reader.R; import com.justwayward.reader.base.BaseRVFragment; import com.justwayward.reader.bean.BookMixAToc; import com.justwayward.reader.bean.Recommend; import com.justwayward.reader.bean.support.DownloadMessage; import com.justwayward.reader.bean.support.DownloadProgress; import com.justwayward.reader.bean.support.DownloadQueue; import com.justwayward.reader.bean.support.RefreshCollectionListEvent; import com.justwayward.reader.bean.support.UserSexChooseFinishedEvent; import com.justwayward.reader.component.AppComponent; import com.justwayward.reader.component.DaggerMainComponent; import com.justwayward.reader.manager.CollectionsManager; import com.justwayward.reader.service.DownloadBookService; import com.justwayward.reader.ui.activity.BookDetailActivity; import com.justwayward.reader.ui.activity.MainActivity; import com.justwayward.reader.ui.activity.ReadActivity; import com.justwayward.reader.ui.contract.RecommendContract; import com.justwayward.reader.ui.easyadapter.RecommendAdapter; import com.justwayward.reader.ui.presenter.RecommendPresenter; import com.justwayward.reader.view.recyclerview.adapter.RecyclerArrayAdapter; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; import java.util.ArrayList; import java.util.List; import butterknife.Bind; import butterknife.OnClick; public class RecommendFragment extends BaseRVFragment<RecommendPresenter, Recommend.RecommendBooks> implements RecommendContract.View, RecyclerArrayAdapter.OnItemLongClickListener { @Bind(R.id.llBatchManagement) LinearLayout llBatchManagement; @Bind(R.id.tvSelectAll) TextView tvSelectAll; @Bind(R.id.tvDelete) TextView tvDelete; private boolean isSelectAll = false; private List<BookMixAToc.mixToc.Chapters> chaptersList = new ArrayList<>(); @Override public int getLayoutResId() { return R.layout.fragment_recommend; } @Override public void initDatas() { EventBus.getDefault().register(this); } @Override public void configViews() { initAdapter(RecommendAdapter.class, true, false); mAdapter.setOnItemLongClickListener(this); mAdapter.addFooter(new RecyclerArrayAdapter.ItemView() { @Override public View onCreateView(ViewGroup parent) { View headerView = LayoutInflater.from(activity).inflate(R.layout.foot_view_shelf, parent, false); return headerView; } @Override public void onBindView(View headerView) { headerView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ((MainActivity) activity).setCurrentItem(2); } }); } }); mRecyclerView.getEmptyView().findViewById(R.id.btnToAdd).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ((MainActivity) activity).setCurrentItem(2); } }); onRefresh(); } @Override protected void setupActivityComponent(AppComponent appComponent) { DaggerMainComponent.builder() .appComponent(appComponent) .build() .inject(this); } @Override public void showRecommendList(List<Recommend.RecommendBooks> list) { mAdapter.clear(); mAdapter.addAll(list); //推荐列表默认加入收藏 for (Recommend.RecommendBooks bean : list) { //TODO 此处可优化:批量加入收藏->加入前需先判断是否收藏过 CollectionsManager.getInstance().add(bean); } } @Override public void showBookToc(String bookId, List<BookMixAToc.mixToc.Chapters> list) { chaptersList.clear(); chaptersList.addAll(list); DownloadBookService.post(new DownloadQueue(bookId, list, 1, list.size())); dismissDialog(); } @Subscribe(threadMode = ThreadMode.MAIN) public void downloadMessage(final DownloadMessage msg) { mRecyclerView.setTipViewText(msg.message); if (msg.isComplete) { mRecyclerView.hideTipView(2200); } } @Subscribe(threadMode = ThreadMode.MAIN) public void showDownProgress(DownloadProgress progress) { mRecyclerView.setTipViewText(progress.message); } @Override public void onItemClick(int position) { if (isVisible(llBatchManagement)) //批量管理时,屏蔽点击事件 return; ReadActivity.startActivity(activity, mAdapter.getItem(position), mAdapter.getItem(position).isFromSD); } @Override public boolean onItemLongClick(int position) { //批量管理时,屏蔽长按事件 if (isVisible(llBatchManagement)) return false; showLongClickDialog(position); return false; } /** * 显示长按对话框 * * @param position */ private void showLongClickDialog(final int position) { final boolean isTop = CollectionsManager.getInstance().isTop(mAdapter.getItem(position)._id); String[] items; DialogInterface.OnClickListener listener; if (mAdapter.getItem(position).isFromSD) { items = getResources().getStringArray(R.array.recommend_item_long_click_choice_local); listener = new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { switch (which) { case 0: //置顶、取消置顶 CollectionsManager.getInstance().top(mAdapter.getItem(position)._id, !isTop); break; case 1: //删除 List<Recommend.RecommendBooks> removeList = new ArrayList<>(); removeList.add(mAdapter.getItem(position)); showDeleteCacheDialog(removeList); break; case 2: //批量管理 showBatchManagementLayout(); break; default: break; } dialog.dismiss(); } }; } else { items = getResources().getStringArray(R.array.recommend_item_long_click_choice); listener = new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { switch (which) { case 0: //置顶、取消置顶 CollectionsManager.getInstance().top(mAdapter.getItem(position)._id, !isTop); break; case 1: //书籍详情 BookDetailActivity.startActivity(activity, mAdapter.getItem(position)._id); break; case 2: //移入养肥区 mRecyclerView.showTipViewAndDelayClose("正在拼命开发中..."); break; case 3: //缓存全本 if (mAdapter.getItem(position).isFromSD) { mRecyclerView.showTipViewAndDelayClose("本地文件不支持该选项哦"); } else { showDialog(); mPresenter.getTocList(mAdapter.getItem(position)._id); } break; case 4: //删除 List<Recommend.RecommendBooks> removeList = new ArrayList<>(); removeList.add(mAdapter.getItem(position)); showDeleteCacheDialog(removeList); break; case 5: //批量管理 showBatchManagementLayout(); break; default: break; } dialog.dismiss(); } }; } if (isTop) items[0] = getString(R.string.cancle_top); new AlertDialog.Builder(activity) .setTitle(mAdapter.getItem(position).title) .setItems(items, listener) .setNegativeButton(null, null) .create().show(); } /** * 显示删除本地缓存对话框 * * @param removeList */ private void showDeleteCacheDialog(final List<Recommend.RecommendBooks> removeList) { final boolean selected[] = {true}; new AlertDialog.Builder(activity) .setTitle(activity.getString(R.string.remove_selected_book)) .setMultiChoiceItems(new String[]{activity.getString(R.string.delete_local_cache)}, selected, new DialogInterface.OnMultiChoiceClickListener() { @Override public void onClick(DialogInterface dialog, int which, boolean isChecked) { selected[0] = isChecked; } }) .setPositiveButton(activity.getString(R.string.confirm), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); new AsyncTask<String, String, String>() { @Override protected void onPreExecute() { super.onPreExecute(); showDialog(); } @Override protected String doInBackground(String... params) { CollectionsManager.getInstance().removeSome(removeList, selected[0]); return null; } @Override protected void onPostExecute(String s) { super.onPostExecute(s); mRecyclerView.showTipViewAndDelayClose("成功移除书籍"); for (Recommend.RecommendBooks bean : removeList) { mAdapter.remove(bean); } if (isVisible(llBatchManagement)) { //批量管理完成后,隐藏批量管理布局并刷新页面 goneBatchManagementAndRefreshUI(); } hideDialog(); } }.execute(); } }) .setNegativeButton(activity.getString(R.string.cancel), null) .create().show(); } /** * 隐藏批量管理布局并刷新页面 */ public void goneBatchManagementAndRefreshUI() { if (mAdapter == null) return; gone(llBatchManagement); for (Recommend.RecommendBooks bean : mAdapter.getAllData()) { bean.showCheckBox = false; } mAdapter.notifyDataSetChanged(); } /** * 显示批量管理布局 */ private void showBatchManagementLayout() { visible(llBatchManagement); for (Recommend.RecommendBooks bean : mAdapter.getAllData()) { bean.showCheckBox = true; } mAdapter.notifyDataSetChanged(); } @OnClick(R.id.tvSelectAll) public void selectAll() { isSelectAll = !isSelectAll; tvSelectAll.setText(isSelectAll ? activity.getString(R.string.cancel_selected_all) : activity.getString(R.string.selected_all)); for (Recommend.RecommendBooks bean : mAdapter.getAllData()) { bean.isSeleted = isSelectAll; } mAdapter.notifyDataSetChanged(); } @OnClick(R.id.tvDelete) public void delete() { List<Recommend.RecommendBooks> removeList = new ArrayList<>(); for (Recommend.RecommendBooks bean : mAdapter.getAllData()) { if (bean.isSeleted) removeList.add(bean); } if (removeList.isEmpty()) { mRecyclerView.showTipViewAndDelayClose(activity.getString(R.string.has_not_selected_delete_book)); } else { showDeleteCacheDialog(removeList); } } @Override public void onRefresh() { super.onRefresh(); gone(llBatchManagement); List<Recommend.RecommendBooks> data = CollectionsManager.getInstance().getCollectionListBySort(); mAdapter.clear(); mAdapter.addAll(data); //不加下面这句代码会导致,添加本地书籍的时候,部分书籍添加后直接崩溃 //报错:Scrapped or attached views may not be recycled. isScrap:false isAttached:true mAdapter.notifyDataSetChanged(); mRecyclerView.setRefreshing(false); } @Subscribe(threadMode = ThreadMode.MAIN) public void RefreshCollectionList(RefreshCollectionListEvent event) { mRecyclerView.setRefreshing(true); onRefresh(); } @Subscribe(threadMode = ThreadMode.MAIN) public void UserSexChooseFinished(UserSexChooseFinishedEvent event) { //首次进入APP,选择性别后,获取推荐列表 mPresenter.getRecommendList(); } @Override public void showError() { loaddingError(); dismissDialog(); } @Override public void complete() { mRecyclerView.setRefreshing(false); } @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if (!getUserVisibleHint()) { goneBatchManagementAndRefreshUI(); } } @Override public void onResume() { super.onResume(); //这样监听返回键有个缺点就是没有拦截Activity的返回监听,如果有更优方案可以改掉 getView().setFocusableInTouchMode(true); getView().requestFocus(); getView().setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) { if (isVisible(llBatchManagement)) { goneBatchManagementAndRefreshUI(); return true; } } return false; } }); } @Override public void onDestroyView() { super.onDestroyView(); EventBus.getDefault().unregister(this); } private boolean isForeground() { ActivityManager am = (ActivityManager) activity.getSystemService(Context.ACTIVITY_SERVICE); List<ActivityManager.RunningTaskInfo> list = am.getRunningTasks(1); if (list != null && list.size() > 0) { ComponentName cpn = list.get(0).topActivity; if (MainActivity.class.getName().contains(cpn.getClassName())) { return true; } } return false; } }