├── .gitignore
├── .idea
├── .name
├── codeStyles
│ └── Project.xml
├── compiler.xml
├── gradle.xml
├── inspectionProfiles
│ └── Project_Default.xml
├── jarRepositories.xml
├── misc.xml
├── runConfigurations.xml
├── smartfox_info.xml
└── vcs.xml
├── README.md
├── app
├── .gitignore
├── build.gradle
├── proguard-rules.pro
└── src
│ ├── androidTest
│ └── java
│ │ └── com
│ │ └── example
│ │ └── myapplication
│ │ └── ExampleInstrumentedTest.java
│ ├── main
│ ├── AndroidManifest.xml
│ ├── assets
│ │ └── address.json
│ ├── java
│ │ └── com
│ │ │ └── example
│ │ │ └── myapplication
│ │ │ ├── base
│ │ │ ├── BaseActivity.java
│ │ │ ├── BaseFragment.java
│ │ │ ├── BindingAdapterUtil.java
│ │ │ ├── adapter
│ │ │ │ └── BasePagerAdapter.java
│ │ │ └── viewmodel
│ │ │ │ └── BaseViewModel.java
│ │ │ ├── bean
│ │ │ ├── ActivitySkip.java
│ │ │ ├── GitHubProject.java
│ │ │ ├── UpdatePlan.java
│ │ │ └── responsebean
│ │ │ │ ├── ArticleBean.java
│ │ │ │ ├── ArticleListBean.java
│ │ │ │ ├── Coin.java
│ │ │ │ ├── CoinBean.java
│ │ │ │ ├── CoinRankBean.java
│ │ │ │ ├── CollectArticleBean.java
│ │ │ │ ├── HomeBanner.java
│ │ │ │ ├── ImageBean.java
│ │ │ │ ├── LoginBean.java
│ │ │ │ ├── NavigationBean.java
│ │ │ │ ├── ToDoListBean.java
│ │ │ │ ├── UserShareArticleBean.java
│ │ │ │ ├── WeChatBean.java
│ │ │ │ └── home
│ │ │ │ ├── BannerData.java
│ │ │ │ └── HomeData.java
│ │ │ ├── behavior
│ │ │ ├── BottomNavigationBehavior.java
│ │ │ └── FloatingActionButtonBehavior.java
│ │ │ ├── config
│ │ │ ├── App.java
│ │ │ ├── Constants.java
│ │ │ └── LoadState.java
│ │ │ ├── http
│ │ │ ├── data
│ │ │ │ ├── HttpBaseResponse.java
│ │ │ │ ├── HttpDisposable.java
│ │ │ │ └── HttpResponseInterface.java
│ │ │ ├── httptool
│ │ │ │ ├── AddCookiesInterceptor.java
│ │ │ │ ├── HttpException.java
│ │ │ │ ├── HttpInterceptor.java
│ │ │ │ ├── ResponseConverterFactory.java
│ │ │ │ └── UploadUtils.java
│ │ │ └── request
│ │ │ │ ├── APIConstants.java
│ │ │ │ ├── ApiAddress.java
│ │ │ │ ├── HttpFactory.java
│ │ │ │ ├── HttpRequest.java
│ │ │ │ └── ServerAddress.java
│ │ │ ├── manager
│ │ │ ├── MyActivityManager.java
│ │ │ └── ThreadManager.java
│ │ │ ├── navinterface
│ │ │ └── ScrollToTop.java
│ │ │ ├── room
│ │ │ └── AppDataBase.java
│ │ │ ├── ui
│ │ │ ├── activity
│ │ │ │ ├── login
│ │ │ │ │ ├── FragmentLogin.java
│ │ │ │ │ ├── FragmentRegister.java
│ │ │ │ │ ├── LoginActivity.java
│ │ │ │ │ └── LoginViewModel.java
│ │ │ │ ├── main
│ │ │ │ │ ├── MainActivity.java
│ │ │ │ │ └── MainViewModel.java
│ │ │ │ ├── splash
│ │ │ │ │ ├── SplashActivity.java
│ │ │ │ │ └── SplashViewModel.java
│ │ │ │ └── web
│ │ │ │ │ ├── DetailsActivity.java
│ │ │ │ │ └── DetailsViewModel.java
│ │ │ ├── adapter
│ │ │ │ ├── ArticleListPagerAdapter.java
│ │ │ │ ├── BannerViewHolder.java
│ │ │ │ ├── CommonAdapter.java
│ │ │ │ ├── CommonViewHolder.java
│ │ │ │ ├── FmPagerAdapter.java
│ │ │ │ ├── HomeAdapter.java
│ │ │ │ ├── NavigationAdapter.java
│ │ │ │ └── SystemAdapter.java
│ │ │ ├── articlelist
│ │ │ │ ├── ArticleListFragment.java
│ │ │ │ └── ArticleListViewModel.java
│ │ │ ├── bottom
│ │ │ │ ├── navi
│ │ │ │ │ ├── NaviViewModel.java
│ │ │ │ │ └── NavigationFragment.java
│ │ │ │ ├── project
│ │ │ │ │ ├── ProjectFragment.java
│ │ │ │ │ └── ProjectViewModel.java
│ │ │ │ ├── system
│ │ │ │ │ ├── SystemFragment.java
│ │ │ │ │ ├── SystemViewModel.java
│ │ │ │ │ └── systemchildren
│ │ │ │ │ │ ├── SystemChildrenFragment.java
│ │ │ │ │ │ └── SystemChildrenViewModel.java
│ │ │ │ └── wechat
│ │ │ │ │ ├── WeChatFragment.java
│ │ │ │ │ └── WeChatViewModel.java
│ │ │ ├── home
│ │ │ │ ├── HomeFragment.java
│ │ │ │ └── HomeViewModel.java
│ │ │ ├── nav
│ │ │ │ ├── about
│ │ │ │ │ ├── AboutFragment.java
│ │ │ │ │ └── AboutViewModel.java
│ │ │ │ ├── collect
│ │ │ │ │ ├── CollectFragment.java
│ │ │ │ │ └── CollectViewModel.java
│ │ │ │ ├── mine
│ │ │ │ │ ├── MineFragment.java
│ │ │ │ │ ├── coin
│ │ │ │ │ │ ├── CoinListFragment.java
│ │ │ │ │ │ └── CoinViewModel.java
│ │ │ │ │ ├── coinrank
│ │ │ │ │ │ ├── CoinRankListFragment.java
│ │ │ │ │ │ └── CoinRankViewModel.java
│ │ │ │ │ └── share
│ │ │ │ │ │ ├── ShareFragment.java
│ │ │ │ │ │ └── ShareViewModel.java
│ │ │ │ ├── qa
│ │ │ │ │ ├── QaFragment.java
│ │ │ │ │ └── QaViewModel.java
│ │ │ │ ├── square
│ │ │ │ │ ├── SquareFragment.java
│ │ │ │ │ └── SquareViewModel.java
│ │ │ │ ├── todo
│ │ │ │ │ ├── ToDoFragment.java
│ │ │ │ │ ├── ToDoViewModel.java
│ │ │ │ │ ├── addtodo
│ │ │ │ │ │ ├── AddToDoFragment.java
│ │ │ │ │ │ └── AddToDoViewModel.java
│ │ │ │ │ └── todocontent
│ │ │ │ │ │ ├── ToDoContentFragment.java
│ │ │ │ │ │ └── ToDoContentViewModel.java
│ │ │ │ └── update
│ │ │ │ │ ├── UpdateFragment.java
│ │ │ │ │ └── UpdateViewModel.java
│ │ │ └── view
│ │ │ │ ├── CircleImageView.java
│ │ │ │ ├── EditTextWithTitle.java
│ │ │ │ ├── MultiRadioGroup.java
│ │ │ │ └── SlideRecyclerView.java
│ │ │ └── util
│ │ │ ├── CommonUtils.java
│ │ │ ├── GlideUtil.java
│ │ │ ├── ImageSelectUtil.java
│ │ │ ├── NetworkUtils.java
│ │ │ ├── ShellUtils.java
│ │ │ ├── TimeUtils.java
│ │ │ └── ToastUtils.java
│ └── res
│ │ ├── color
│ │ └── qmui_btn_bg.xml
│ │ ├── drawable-v21
│ │ ├── ic_menu_camera.xml
│ │ ├── ic_menu_gallery.xml
│ │ ├── ic_menu_manage.xml
│ │ ├── ic_menu_send.xml
│ │ ├── ic_menu_share.xml
│ │ └── ic_menu_slideshow.xml
│ │ ├── drawable-v24
│ │ └── ic_launcher_foreground.xml
│ │ ├── drawable
│ │ ├── animated_rotate_loading.xml
│ │ ├── bg_pop_view.xml
│ │ ├── edit_text_bg.xml
│ │ ├── ic_arrow_upward_black_24dp.xml
│ │ ├── ic_dashboard_black_24dp.xml
│ │ ├── ic_home_black_24dp.xml
│ │ ├── ic_launcher_background.xml
│ │ ├── ic_notifications_black_24dp.xml
│ │ ├── radiobutton_background.xml
│ │ ├── radiobutton_background_checked.xml
│ │ ├── radiobutton_background_unchecked.xml
│ │ ├── radiobutton_textcolor.xml
│ │ ├── shape_label_blue.xml
│ │ ├── shape_label_green.xml
│ │ ├── shape_label_red.xml
│ │ ├── side_nav_bar.xml
│ │ └── skip_btn_bg.xml
│ │ ├── layout
│ │ ├── activity_base.xml
│ │ ├── activity_details.xml
│ │ ├── activity_login.xml
│ │ ├── activity_main.xml
│ │ ├── activity_splash.xml
│ │ ├── app_bar_main.xml
│ │ ├── edit_text_with_title.xml
│ │ ├── fragment_about.xml
│ │ ├── fragment_base.xml
│ │ ├── fragment_list.xml
│ │ ├── fragment_mine.xml
│ │ ├── fragment_notifications.xml
│ │ ├── fragment_project_view_pager.xml
│ │ ├── fragment_share.xml
│ │ ├── fragment_slideshow.xml
│ │ ├── fragment_to_do_add.xml
│ │ ├── fragment_to_do_content.xml
│ │ ├── fragment_todo_list.xml
│ │ ├── fragment_tools.xml
│ │ ├── fragment_view_pager.xml
│ │ ├── item_article.xml
│ │ ├── item_coin_layout.xml
│ │ ├── item_coin_rank.xml
│ │ ├── item_collect_article.xml
│ │ ├── item_home_banner.xml
│ │ ├── item_home_top.xml
│ │ ├── item_navigation_layout.xml
│ │ ├── item_navigation_tag_layout.xml
│ │ ├── item_open_source_project.xml
│ │ ├── item_system_layout.xml
│ │ ├── item_system_tag_layout.xml
│ │ ├── item_todo_data.xml
│ │ ├── item_top_article.xml
│ │ ├── item_update_plan.xml
│ │ ├── layout_no_more_data.xml
│ │ ├── login_fragment.xml
│ │ ├── nav_header_main.xml
│ │ ├── navi_fragment.xml
│ │ ├── register_fragment.xml
│ │ ├── remote_banner_item.xml
│ │ ├── text_view_with_title.xml
│ │ ├── update_fragment.xml
│ │ ├── view_load_error.xml
│ │ ├── view_loading.xml
│ │ ├── view_no_data.xml
│ │ └── view_no_network.xml
│ │ ├── menu
│ │ ├── activity_main_drawer.xml
│ │ ├── bottom_nav_menu.xml
│ │ └── main.xml
│ │ ├── mipmap-anydpi-v26
│ │ ├── ic_launcher.xml
│ │ └── ic_launcher_round.xml
│ │ ├── mipmap-hdpi
│ │ ├── ic_launcher.png
│ │ └── ic_launcher_round.png
│ │ ├── mipmap-mdpi
│ │ ├── ic_launcher.png
│ │ └── ic_launcher_round.png
│ │ ├── mipmap-xhdpi
│ │ ├── ic_launcher.png
│ │ └── ic_launcher_round.png
│ │ ├── mipmap-xxhdpi
│ │ ├── ic_add.png
│ │ ├── ic_bookmark.png
│ │ ├── ic_checkbox_check.png
│ │ ├── ic_checkbox_uncheck.png
│ │ ├── ic_chevron_down.png
│ │ ├── ic_chevron_right.png
│ │ ├── ic_chevron_up.png
│ │ ├── ic_collect_no.png
│ │ ├── ic_collect_yes.png
│ │ ├── ic_collectbroken.png
│ │ ├── ic_copy.png
│ │ ├── ic_github.png
│ │ ├── ic_hot.png
│ │ ├── ic_launcher.png
│ │ ├── ic_launcher_round.png
│ │ ├── ic_link.png
│ │ ├── ic_link_grey.png
│ │ ├── ic_load_error.png
│ │ ├── ic_logo.png
│ │ ├── ic_mine_coin.png
│ │ ├── ic_mine_collect.png
│ │ ├── ic_mine_setting.png
│ │ ├── ic_mine_share.png
│ │ ├── ic_nav_about.png
│ │ ├── ic_nav_collect.png
│ │ ├── ic_nav_qa.png
│ │ ├── ic_nav_square.png
│ │ ├── ic_nav_todo.png
│ │ ├── ic_nav_update.png
│ │ ├── ic_navigation.png
│ │ ├── ic_no_net.png
│ │ ├── ic_nodata.png
│ │ ├── ic_project.png
│ │ ├── ic_rank.png
│ │ ├── ic_rank_first.png
│ │ ├── ic_rank_second.png
│ │ ├── ic_rank_thred.png
│ │ ├── ic_star.png
│ │ ├── ic_star_outline.png
│ │ ├── ic_system.png
│ │ ├── ic_todo.png
│ │ ├── ic_top.png
│ │ ├── ic_update.png
│ │ ├── ic_wechat.png
│ │ ├── nodata.png
│ │ └── splash_bg.jpg
│ │ ├── mipmap-xxxhdpi
│ │ ├── ic_launcher.png
│ │ └── ic_launcher_round.png
│ │ ├── navigation
│ │ └── mobile_navigation.xml
│ │ ├── values-v21
│ │ └── styles.xml
│ │ └── values
│ │ ├── arrays.xml
│ │ ├── colors.xml
│ │ ├── dimens.xml
│ │ ├── drawables.xml
│ │ ├── strings.xml
│ │ ├── strings_behavior.xml
│ │ └── styles.xml
│ └── test
│ └── java
│ └── com
│ └── example
│ └── myapplication
│ └── ExampleUnitTest.java
├── build.gradle
├── gradle.properties
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── image
├── wanandroid_about.png
├── wanandroid_collect.png
├── wanandroid_home.png
├── wanandroid_login.png
├── wanandroid_mine.png
├── wanandroid_nav.png
├── wanandroid_navagation.png
├── wanandroid_project.png
├── wanandroid_qa.png
├── wanandroid_splash.webp
├── wanandroid_sys.png
├── wanandroid_todo.png
├── wanandroid_update.png
└── wanandroid_wechat.png
└── settings.gradle
/.gitignore:
--------------------------------------------------------------------------------
1 | *.iml
2 | .gradle
3 | /local.properties
4 | /.idea/caches
5 | /.idea/libraries
6 | /.idea/modules.xml
7 | /.idea/workspace.xml
8 | /.idea/navEditor.xml
9 | /.idea/assetWizardSettings.xml
10 | /.idea/vcs.xml
11 | .DS_Store
12 | /build
13 | /captures
14 | .externalNativeBuild
15 | .cxx
16 |
--------------------------------------------------------------------------------
/.idea/.name:
--------------------------------------------------------------------------------
1 | My Application
--------------------------------------------------------------------------------
/.idea/compiler.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/.idea/gradle.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
21 |
22 |
--------------------------------------------------------------------------------
/.idea/jarRepositories.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
--------------------------------------------------------------------------------
/.idea/misc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/.idea/runConfigurations.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/.idea/smartfox_info.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/.idea/vcs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/app/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/app/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # You can control the set of applied configuration files using the
3 | # proguardFiles setting in build.gradle.
4 | #
5 | # For more details, see
6 | # http://developer.android.com/guide/developing/tools/proguard.html
7 |
8 | # If your project uses WebView with JS, uncomment the following
9 | # and specify the fully qualified class name to the JavaScript interface
10 | # class:
11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
12 | # public *;
13 | #}
14 |
15 | # Uncomment this to preserve the line number information for
16 | # debugging stack traces.
17 | #-keepattributes SourceFile,LineNumberTable
18 |
19 | # If you keep the line number information, uncomment this to
20 | # hide the original source file name.
21 | #-renamesourcefileattribute SourceFile
22 |
23 |
24 | -keep class **_FragmentFinder { *; }
25 | -keep class com.qmuiteam.qmui.arch.record.** { *; }
26 | -keep class androidx.fragment.app.* { *; }
27 |
28 | -dontwarn com.ccj.poptabview.**
29 | -keep class com.ccj.poptabview.**{*;}
30 |
--------------------------------------------------------------------------------
/app/src/androidTest/java/com/example/myapplication/ExampleInstrumentedTest.java:
--------------------------------------------------------------------------------
1 | package com.example.myapplication;
2 |
3 | import android.content.Context;
4 |
5 | import androidx.test.platform.app.InstrumentationRegistry;
6 | import androidx.test.ext.junit.runners.AndroidJUnit4;
7 |
8 | import org.junit.Test;
9 | import org.junit.runner.RunWith;
10 |
11 | import static org.junit.Assert.*;
12 |
13 | /**
14 | * Instrumented test, which will execute on an Android device.
15 | *
16 | * @see Testing documentation
17 | */
18 | @RunWith(AndroidJUnit4.class)
19 | public class ExampleInstrumentedTest {
20 | @Test
21 | public void useAppContext() {
22 | // Context of the app under test.
23 | Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
24 |
25 | assertEquals("com.example.myapplication", appContext.getPackageName());
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
21 |
26 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
--------------------------------------------------------------------------------
/app/src/main/java/com/example/myapplication/base/adapter/BasePagerAdapter.java:
--------------------------------------------------------------------------------
1 | package com.example.myapplication.base.adapter;
2 |
3 |
4 | import android.util.SparseArray;
5 |
6 | import java.util.List;
7 |
8 | import androidx.fragment.app.Fragment;
9 | import androidx.fragment.app.FragmentManager;
10 | import androidx.fragment.app.FragmentPagerAdapter;
11 |
12 | /**
13 | * PagerAdapter的基类
14 | * @author devel
15 | */
16 | public abstract class BasePagerAdapter extends FragmentPagerAdapter {
17 |
18 | protected SparseArray mFragmentMap = new SparseArray<>();
19 |
20 | protected List mDataList;
21 |
22 | public BasePagerAdapter(FragmentManager fragmentManager) {
23 | super(fragmentManager);
24 | }
25 |
26 | @Override
27 | public int getCount() {
28 | return mDataList != null ? mDataList.size() : 0;
29 | }
30 |
31 | /**
32 | * 设置数据列表
33 | *
34 | * @param dataList 数据列表
35 | */
36 | public void setDataList(List dataList) {
37 | mDataList = dataList;
38 | notifyDataSetChanged();
39 | }
40 |
41 | /**
42 | * 释放缓存的Fragment
43 | */
44 | public void release() {
45 | mFragmentMap.clear();
46 | }
47 | }
48 |
--------------------------------------------------------------------------------
/app/src/main/java/com/example/myapplication/base/viewmodel/BaseViewModel.java:
--------------------------------------------------------------------------------
1 | package com.example.myapplication.base.viewmodel;
2 |
3 |
4 | import android.content.res.Resources;
5 |
6 | import com.example.myapplication.config.App;
7 | import com.example.myapplication.R;
8 | import com.example.myapplication.config.LoadState;
9 | import com.example.myapplication.http.data.HttpDisposable;
10 | import com.example.myapplication.http.request.HttpFactory;
11 | import com.example.myapplication.http.request.HttpRequest;
12 |
13 | import androidx.lifecycle.DefaultLifecycleObserver;
14 | import androidx.lifecycle.LiveData;
15 | import androidx.lifecycle.MutableLiveData;
16 | import androidx.lifecycle.ViewModel;
17 |
18 | /**
19 | * ViewModel的基类
20 | *
21 | * @author devel
22 | */
23 | public abstract class BaseViewModel extends ViewModel implements DefaultLifecycleObserver {
24 |
25 | public Resources resources;
26 |
27 | /**
28 | * 收藏文章
29 | */
30 | public MutableLiveData