diff --git a/app/src/main/java/json/chao/com/wanandroid/contract/main/SearchContract.java b/app/src/main/java/json/chao/com/wanandroid/contract/main/SearchContract.java index defb3ce..c246782 100644 --- a/app/src/main/java/json/chao/com/wanandroid/contract/main/SearchContract.java +++ b/app/src/main/java/json/chao/com/wanandroid/contract/main/SearchContract.java @@ -32,23 +32,11 @@ interface View extends BaseView { */ void showTopSearchData(BaseResponse> topSearchDataResponse); - /** - * Show useful sites - * - * @param usefulSitesResponse BaseResponse> - */ - void showUsefulSites(BaseResponse> usefulSitesResponse); - /** * Show top search data fail */ void showTopSearchDataFail(); - /** - * Show useful sites data fail - */ - void showUsefulSitesDataFail(); - /** * Judge to the search list activity */ @@ -70,11 +58,6 @@ interface Presenter extends AbstractPresenter { */ void getTopSearchData(); - /** - * 常用网站 - */ - void getUsefulSites(); - /** * Clear history data */ diff --git a/app/src/main/java/json/chao/com/wanandroid/contract/main/UsageDialogContract.java b/app/src/main/java/json/chao/com/wanandroid/contract/main/UsageDialogContract.java new file mode 100644 index 0000000..4163bd7 --- /dev/null +++ b/app/src/main/java/json/chao/com/wanandroid/contract/main/UsageDialogContract.java @@ -0,0 +1,41 @@ +package json.chao.com.wanandroid.contract.main; + +import java.util.List; + +import json.chao.com.wanandroid.base.presenter.AbstractPresenter; +import json.chao.com.wanandroid.base.view.BaseView; +import json.chao.com.wanandroid.core.bean.BaseResponse; +import json.chao.com.wanandroid.core.bean.main.search.UsefulSiteData; + + +/** + * @author quchao + * @date 2018/4/2 + */ + +public interface UsageDialogContract { + + interface View extends BaseView { + + /** + * Show useful sites + * + * @param usefulSitesResponse BaseResponse> + */ + void showUsefulSites(BaseResponse> usefulSitesResponse); + + /** + * Show useful sites data fail + */ + void showUsefulSitesDataFail(); + } + + interface Presenter extends AbstractPresenter { + + /** + * 常用网站 + */ + void getUsefulSites(); + } + +} diff --git a/app/src/main/java/json/chao/com/wanandroid/di/component/FragmentComponent.java b/app/src/main/java/json/chao/com/wanandroid/di/component/FragmentComponent.java index 7bc13bf..d07e4e6 100644 --- a/app/src/main/java/json/chao/com/wanandroid/di/component/FragmentComponent.java +++ b/app/src/main/java/json/chao/com/wanandroid/di/component/FragmentComponent.java @@ -8,6 +8,7 @@ import json.chao.com.wanandroid.di.scope.FragmentScope; import json.chao.com.wanandroid.ui.hierarchy.fragment.KnowledgeHierarchyFragment; import json.chao.com.wanandroid.ui.hierarchy.fragment.KnowledgeHierarchyListFragment; +import json.chao.com.wanandroid.ui.main.fragment.UsageDialogFragment; import json.chao.com.wanandroid.ui.mainpager.fragment.MainPagerFragment; import json.chao.com.wanandroid.ui.navigation.fragment.NavigationFragment; import json.chao.com.wanandroid.ui.project.fragment.ProjectFragment; @@ -79,5 +80,12 @@ public interface FragmentComponent { */ void inject(SearchDialogFragment searchDialogFragment); + /** + * 注入UsageDialogFragment所需的依赖 + * + * @param usageDialogFragment UsageDialogFragment + */ + void inject(UsageDialogFragment usageDialogFragment); + } diff --git a/app/src/main/java/json/chao/com/wanandroid/presenter/main/SearchPresenter.java b/app/src/main/java/json/chao/com/wanandroid/presenter/main/SearchPresenter.java index 97f6b2d..e31acff 100644 --- a/app/src/main/java/json/chao/com/wanandroid/presenter/main/SearchPresenter.java +++ b/app/src/main/java/json/chao/com/wanandroid/presenter/main/SearchPresenter.java @@ -65,20 +65,4 @@ public void onNext(BaseResponse> topSearchDataResponse) { })); } - @Override - public void getUsefulSites() { - addSubscribe(mDataManager.getUsefulSites() - .compose(RxUtils.rxSchedulerHelper()) - .subscribeWith(new BaseObserver>>(mView) { - @Override - public void onNext(BaseResponse> usefulSitesResponse) { - if (usefulSitesResponse.getErrorCode() == BaseResponse.SUCCESS) { - mView.showUsefulSites(usefulSitesResponse); - } else { - mView.showUsefulSitesDataFail(); - } - } - })); - } - } diff --git a/app/src/main/java/json/chao/com/wanandroid/presenter/main/UsageDialogPresenter.java b/app/src/main/java/json/chao/com/wanandroid/presenter/main/UsageDialogPresenter.java new file mode 100644 index 0000000..c43d1a1 --- /dev/null +++ b/app/src/main/java/json/chao/com/wanandroid/presenter/main/UsageDialogPresenter.java @@ -0,0 +1,45 @@ +package json.chao.com.wanandroid.presenter.main; + +import java.util.List; + +import javax.inject.Inject; + +import json.chao.com.wanandroid.base.presenter.BasePresenter; +import json.chao.com.wanandroid.contract.main.UsageDialogContract; +import json.chao.com.wanandroid.core.DataManager; +import json.chao.com.wanandroid.core.bean.BaseResponse; +import json.chao.com.wanandroid.core.bean.main.search.UsefulSiteData; +import json.chao.com.wanandroid.utils.RxUtils; +import json.chao.com.wanandroid.widget.BaseObserver; + +/** + * @author quchao + * @date 2018/4/2 + */ + +public class UsageDialogPresenter extends BasePresenter implements UsageDialogContract.Presenter { + + DataManager mDataManager; + + @Inject + UsageDialogPresenter(DataManager dataManager) { + mDataManager = dataManager; + } + + @Override + public void getUsefulSites() { + addSubscribe(mDataManager.getUsefulSites() + .compose(RxUtils.rxSchedulerHelper()) + .subscribeWith(new BaseObserver>>(mView) { + @Override + public void onNext(BaseResponse> usefulSitesResponse) { + if (usefulSitesResponse.getErrorCode() == BaseResponse.SUCCESS) { + mView.showUsefulSites(usefulSitesResponse); + } else { + mView.showUsefulSitesDataFail(); + } + } + })); + } + +} diff --git a/app/src/main/java/json/chao/com/wanandroid/ui/main/activity/MainActivity.java b/app/src/main/java/json/chao/com/wanandroid/ui/main/activity/MainActivity.java index 350a3e7..3fe7efb 100644 --- a/app/src/main/java/json/chao/com/wanandroid/ui/main/activity/MainActivity.java +++ b/app/src/main/java/json/chao/com/wanandroid/ui/main/activity/MainActivity.java @@ -35,6 +35,7 @@ import json.chao.com.wanandroid.core.http.cookies.CookiesManager; import json.chao.com.wanandroid.presenter.main.MainPresenter; import json.chao.com.wanandroid.ui.hierarchy.fragment.KnowledgeHierarchyFragment; +import json.chao.com.wanandroid.ui.main.fragment.UsageDialogFragment; import json.chao.com.wanandroid.ui.mainpager.fragment.MainPagerFragment; import json.chao.com.wanandroid.ui.navigation.fragment.NavigationFragment; import json.chao.com.wanandroid.ui.project.fragment.ProjectFragment; @@ -179,9 +180,17 @@ public boolean onCreateOptionsMenu(Menu menu) { @Override public boolean onOptionsItemSelected(MenuItem item) { - if (item.getItemId() == R.id.action_search) { - SearchDialogFragment searchDialogFragment = new SearchDialogFragment(); - searchDialogFragment.show(getFragmentManager(), "SearchDialogFragment"); + switch (item.getItemId()) { + case R.id.action_usage: + UsageDialogFragment usageDialogFragment = new UsageDialogFragment(); + usageDialogFragment.show(getFragmentManager(), "UsageDialogFragment"); + break; + case R.id.action_search: + SearchDialogFragment searchDialogFragment = new SearchDialogFragment(); + searchDialogFragment.show(getFragmentManager(), "SearchDialogFragment"); + break; + default: + break; } return super.onOptionsItemSelected(item); } diff --git a/app/src/main/java/json/chao/com/wanandroid/ui/main/fragment/SearchDialogFragment.java b/app/src/main/java/json/chao/com/wanandroid/ui/main/fragment/SearchDialogFragment.java index f79b83e..417998f 100644 --- a/app/src/main/java/json/chao/com/wanandroid/ui/main/fragment/SearchDialogFragment.java +++ b/app/src/main/java/json/chao/com/wanandroid/ui/main/fragment/SearchDialogFragment.java @@ -43,7 +43,6 @@ import json.chao.com.wanandroid.core.DataManager; import json.chao.com.wanandroid.core.bean.BaseResponse; import json.chao.com.wanandroid.core.bean.main.search.TopSearchData; -import json.chao.com.wanandroid.core.bean.main.search.UsefulSiteData; import json.chao.com.wanandroid.core.dao.HistoryData; import json.chao.com.wanandroid.presenter.main.SearchPresenter; import json.chao.com.wanandroid.ui.main.adapter.HistorySearchAdapter; @@ -82,13 +81,10 @@ public class SearchDialogFragment extends BaseDialogFragment im RecyclerView mRecyclerView; @BindView(R.id.top_search_flow_layout) TagFlowLayout mTopSearchFlowLayout; - @BindView(R.id.useful_sites_flow_layout) - TagFlowLayout mUsefulSitesFlowLayout; @BindView(R.id.search_floating_action_btn) FloatingActionButton mFloatingActionButton; private List mTopSearchDataList; - private List mUsefulSiteDataList; @Inject DataManager mDataManager; @@ -122,7 +118,6 @@ protected void initEventAndData() { StatusBarUtil.immersive(getActivity().getWindow(), ContextCompat.getColor(getActivity(), R.color.transparent), 0.3f); initCircleAnimation(); mTopSearchDataList = new ArrayList<>(); - mUsefulSiteDataList = new ArrayList<>(); mSearchEdit.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { @@ -153,7 +148,6 @@ public void afterTextChanged(Editable s) { showHistoryData(mDataManager.loadAllHistoryData()); mPresenter.getTopSearchData(); - mPresenter.getUsefulSites(); } @Override @@ -185,38 +179,6 @@ public View getView(FlowLayout parent, int position, TopSearchData topSearchData }); } - @Override - public void showUsefulSites(BaseResponse> usefulSitesResponse) { - if (usefulSitesResponse == null) { - showUsefulSitesDataFail(); - return; - } - mUsefulSiteDataList = usefulSitesResponse.getData(); - mUsefulSitesFlowLayout.setAdapter(new TagAdapter(mUsefulSiteDataList) { - @Override - public View getView(FlowLayout parent, int position, UsefulSiteData usefulSiteData) { - assert getActivity() != null; - TextView tv = (TextView) LayoutInflater.from(getActivity()).inflate(R.layout.flow_layout_tv, - parent, false); - assert usefulSiteData != null; - String name = usefulSiteData.getName(); - tv.setText(name); - setItemBackground(tv); - mUsefulSitesFlowLayout.setOnTagClickListener((view, position1, parent1) -> { - JudgeUtils.startArticleDetailActivity(getActivity(), - mUsefulSiteDataList.get(position1).getId(), - mUsefulSiteDataList.get(position1).getName().trim(), - mUsefulSiteDataList.get(position1).getLink().trim(), - false, - false, - true); - return true; - }); - return tv; - } - }); - } - @Override public void showHistoryData(List historyDataList) { if (historyDataList == null || historyDataList.size() <= 0) { @@ -242,11 +204,6 @@ public void showTopSearchDataFail() { CommonUtils.showSnackMessage(getActivity(), getString(R.string.failed_to_obtain_top_data)); } - @Override - public void showUsefulSitesDataFail() { - CommonUtils.showSnackMessage(getActivity(), getString(R.string.failed_to_obtain_useful_sites_data)); - } - @Override public void judgeToTheSearchListActivity() { backEvent(); diff --git a/app/src/main/java/json/chao/com/wanandroid/ui/main/fragment/UsageDialogFragment.java b/app/src/main/java/json/chao/com/wanandroid/ui/main/fragment/UsageDialogFragment.java new file mode 100644 index 0000000..34332ce --- /dev/null +++ b/app/src/main/java/json/chao/com/wanandroid/ui/main/fragment/UsageDialogFragment.java @@ -0,0 +1,176 @@ +package json.chao.com.wanandroid.ui.main.fragment; + +import android.os.Bundle; +import android.support.v4.app.DialogFragment; +import android.support.v4.content.ContextCompat; +import android.support.v7.widget.Toolbar; +import android.util.DisplayMetrics; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewTreeObserver; +import android.view.Window; +import android.view.WindowManager; +import android.widget.TextView; + +import com.zhy.view.flowlayout.FlowLayout; +import com.zhy.view.flowlayout.TagAdapter; +import com.zhy.view.flowlayout.TagFlowLayout; + +import java.util.ArrayList; +import java.util.List; + +import javax.inject.Inject; + +import butterknife.BindView; +import json.chao.com.wanandroid.R; +import json.chao.com.wanandroid.base.fragment.BaseDialogFragment; +import json.chao.com.wanandroid.contract.main.UsageDialogContract; +import json.chao.com.wanandroid.core.DataManager; +import json.chao.com.wanandroid.core.bean.BaseResponse; +import json.chao.com.wanandroid.core.bean.main.search.UsefulSiteData; +import json.chao.com.wanandroid.presenter.main.UsageDialogPresenter; +import json.chao.com.wanandroid.utils.CommonUtils; +import json.chao.com.wanandroid.utils.JudgeUtils; +import json.chao.com.wanandroid.utils.StatusBarUtil; +import json.chao.com.wanandroid.widget.CircularRevealAnim; + +/** + * @author quchao + * @date 2018/4/2 + */ + +public class UsageDialogFragment extends BaseDialogFragment implements + UsageDialogContract.View, + CircularRevealAnim.AnimListener, + ViewTreeObserver.OnPreDrawListener { + + @BindView(R.id.common_toolbar) + Toolbar mToolbar; + @BindView(R.id.common_toolbar_title_tv) + TextView mTitleTv; + @BindView(R.id.useful_sites_flow_layout) + TagFlowLayout mUsefulSitesFlowLayout; + + private List mUsefulSiteDataList; + + @Inject + DataManager mDataManager; + private CircularRevealAnim mCircularRevealAnim; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setStyle(DialogFragment.STYLE_NO_FRAME, R.style.DialogStyle); + } + + @Override + public void onStart() { + super.onStart(); + initDialog(); + } + + @Override + protected void initInject() { + getFragmentComponent().inject(this); + } + + @Override + protected int getLayout() { + return R.layout.fragment_usage; + } + + @Override + protected void initEventAndData() { + initCircleAnimation(); + initToolbar(); + mUsefulSiteDataList = new ArrayList<>(); + mPresenter.getUsefulSites(); + } + + @Override + public void showUsefulSites(BaseResponse> usefulSitesResponse) { + if (usefulSitesResponse == null) { + showUsefulSitesDataFail(); + return; + } + mUsefulSiteDataList = usefulSitesResponse.getData(); + mUsefulSitesFlowLayout.setAdapter(new TagAdapter(mUsefulSiteDataList) { + @Override + public View getView(FlowLayout parent, int position, UsefulSiteData usefulSiteData) { + assert getActivity() != null; + TextView tv = (TextView) LayoutInflater.from(getActivity()).inflate(R.layout.flow_layout_tv, + parent, false); + assert usefulSiteData != null; + String name = usefulSiteData.getName(); + tv.setText(name); + setItemBackground(tv); + mUsefulSitesFlowLayout.setOnTagClickListener((view, position1, parent1) -> { + JudgeUtils.startArticleDetailActivity(getActivity(), + mUsefulSiteDataList.get(position1).getId(), + mUsefulSiteDataList.get(position1).getName().trim(), + mUsefulSiteDataList.get(position1).getLink().trim(), + false, + false, + true); + return true; + }); + return tv; + } + }); + } + + @Override + public void showUsefulSitesDataFail() { + CommonUtils.showSnackMessage(getActivity(), getString(R.string.failed_to_obtain_useful_sites_data)); + } + + @Override + public void onHideAnimationEnd() { + dismiss(); + } + + @Override + public void onShowAnimationEnd() { + } + + @Override + public boolean onPreDraw() { + mTitleTv.getViewTreeObserver().removeOnPreDrawListener(this); + mCircularRevealAnim.show(mTitleTv, mRootView); + return true; + } + + private void setItemBackground(TextView tv) { + tv.setBackgroundColor(CommonUtils.randomTagColor()); + tv.setTextColor(ContextCompat.getColor(getActivity(), R.color.white)); + } + + private void initCircleAnimation() { + mCircularRevealAnim = new CircularRevealAnim(); + mCircularRevealAnim.setAnimListener(this); + mTitleTv.getViewTreeObserver().addOnPreDrawListener(this); + } + + private void initDialog() { + Window window = getDialog().getWindow(); + DisplayMetrics metrics = getResources().getDisplayMetrics(); + //DialogSearch的宽 + int width = (int) (metrics.widthPixels * 0.98); + assert window != null; + window.setLayout(width, WindowManager.LayoutParams.MATCH_PARENT); + window.setGravity(Gravity.TOP); + //取消过渡动画 , 使DialogSearch的出现更加平滑 + window.setWindowAnimations(R.style.DialogEmptyAnimation); + } + + private void initToolbar() { + mTitleTv.setText(R.string.useful_sites); + mTitleTv.setTextColor(ContextCompat.getColor(getActivity(), R.color.title_black)); + StatusBarUtil.immersive(getActivity().getWindow(), ContextCompat.getColor(getActivity(), R.color.transparent), 0.3f); + mToolbar.setBackgroundColor(ContextCompat.getColor(getActivity(), R.color.white)); + mToolbar.setNavigationIcon(ContextCompat.getDrawable(getActivity(), R.drawable.ic_arrow_back_grey_24dp)); + mToolbar.setNavigationOnClickListener(v -> mCircularRevealAnim.hide(mTitleTv, mRootView)); + } + +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_usage.xml b/app/src/main/res/drawable/ic_usage.xml new file mode 100644 index 0000000..4cbba14 --- /dev/null +++ b/app/src/main/res/drawable/ic_usage.xml @@ -0,0 +1,6 @@ + + + + + diff --git a/app/src/main/res/layout/fragment_search.xml b/app/src/main/res/layout/fragment_search.xml index c51aa75..fa013c4 100644 --- a/app/src/main/res/layout/fragment_search.xml +++ b/app/src/main/res/layout/fragment_search.xml @@ -92,21 +92,6 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/dp_3" android:background="@color/colorBackground" /> - - - - diff --git a/app/src/main/res/layout/fragment_usage.xml b/app/src/main/res/layout/fragment_usage.xml new file mode 100644 index 0000000..99c708c --- /dev/null +++ b/app/src/main/res/layout/fragment_usage.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/menu/menu_activity_main.xml b/app/src/main/res/menu/menu_activity_main.xml index 75f3098..ac8e4ce 100644 --- a/app/src/main/res/menu/menu_activity_main.xml +++ b/app/src/main/res/menu/menu_activity_main.xml @@ -2,9 +2,15 @@ + + + app:showAsAction="ifRoom" /> \ No newline at end of file