├── .gitignore ├── .idea ├── WanAndroid.iml ├── encodings.xml ├── gradle.xml ├── inspectionProfiles │ └── Project_Default.xml ├── misc.xml ├── modules.xml ├── runConfigurations.xml └── vcs.xml ├── README.md ├── app ├── .gitignore ├── build.gradle ├── libs │ ├── LZQlxy.jks │ ├── commons-lang3-3.8.1.jar │ └── tbs_sdk_thirdapp_v4.3.0.1072_43646_sharewithdownloadwithfile_withoutGame_obfs_20190429_175122.jar ├── proguard-rules.pro ├── release │ ├── 10109.png │ ├── 10114.png │ ├── WanAndroid_1.0.18030_release.apk │ ├── WanAndroid_1.0.18033_release.apk │ ├── WanAndroid_1.0.18034_release.apk │ ├── WanAndroid_1.0.18101_10114_release.apk │ └── output.json ├── src │ ├── androidTest │ │ └── java │ │ │ └── com │ │ │ └── lzq │ │ │ └── wanandroid │ │ │ └── ExampleInstrumentedTest.java │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── assets │ │ │ └── litepal.xml │ │ ├── java │ │ │ └── com │ │ │ │ └── lzq │ │ │ │ └── wanandroid │ │ │ │ ├── MainActivity.java │ │ │ │ ├── SplashActivity.java │ │ │ │ ├── WanAndroid.java │ │ │ │ ├── api │ │ │ │ ├── Contract.java │ │ │ │ ├── FlowTagCallBack.java │ │ │ │ ├── LoadTasksCallBack.java │ │ │ │ ├── LoginContract.java │ │ │ │ ├── NetTask.java │ │ │ │ ├── OffAccountContract.java │ │ │ │ ├── WebContract.java │ │ │ │ └── WebTask.java │ │ │ │ ├── base │ │ │ │ ├── BaseActivity.java │ │ │ │ ├── BaseFragment.java │ │ │ │ ├── BasePresenter.java │ │ │ │ ├── BaseView.java │ │ │ │ └── NetChangeActivity.java │ │ │ │ ├── db │ │ │ │ └── Tree.java │ │ │ │ ├── model │ │ │ │ ├── Articles.java │ │ │ │ ├── Children.java │ │ │ │ ├── Data.java │ │ │ │ ├── Datas.java │ │ │ │ ├── Event.java │ │ │ │ ├── ProjectItem.java │ │ │ │ ├── ProjectTree.java │ │ │ │ ├── SearchResult.java │ │ │ │ ├── Tags.java │ │ │ │ ├── WanAndroid.java │ │ │ │ └── WanAndroid_Content.java │ │ │ │ ├── presenter │ │ │ │ ├── ArticlesPresenter.java │ │ │ │ ├── CollectPresenter.java │ │ │ │ ├── HomePresenter.java │ │ │ │ ├── LoginPresenter.java │ │ │ │ ├── MainPresenter.java │ │ │ │ ├── ProjectItemPresenter.java │ │ │ │ ├── ProjectPresenter.java │ │ │ │ ├── SearchPresenter.java │ │ │ │ ├── SettingPresenter.java │ │ │ │ ├── SystemPresenter.java │ │ │ │ ├── TitlePresenter.java │ │ │ │ ├── TreePresenter.java │ │ │ │ ├── UserPresenter.java │ │ │ │ └── WebPresenter.java │ │ │ │ ├── service │ │ │ │ └── InitService.java │ │ │ │ ├── utils │ │ │ │ ├── ActivityUtils.java │ │ │ │ ├── AnimationUtil.java │ │ │ │ ├── FitUtil.java │ │ │ │ ├── GlideImageLoader.java │ │ │ │ └── StringUtils.java │ │ │ │ └── view │ │ │ │ ├── ArticlesActivity.java │ │ │ │ ├── LoginActivity.java │ │ │ │ ├── SearchActivity.java │ │ │ │ ├── SearchResultActivity.java │ │ │ │ ├── SettingsActivity.java │ │ │ │ ├── VersionActivity.java │ │ │ │ ├── WebActivity.java │ │ │ │ ├── adapter │ │ │ │ ├── ArticleAdapter.java │ │ │ │ ├── ContentAdapter.java │ │ │ │ ├── FragmentAdapter.java │ │ │ │ ├── NaviAdapter.java │ │ │ │ ├── ProjectItemAdapter.java │ │ │ │ ├── SearchResultAdapter.java │ │ │ │ └── TreeAdapter.java │ │ │ │ ├── animation │ │ │ │ ├── CollectAnim.java │ │ │ │ ├── LaunchAnim.java │ │ │ │ └── TitleAnim.java │ │ │ │ ├── custom │ │ │ │ ├── ClearEditText.java │ │ │ │ ├── OnlyIconView.java │ │ │ │ └── ProgressWebview.java │ │ │ │ └── fragment │ │ │ │ ├── CollectFragment.java │ │ │ │ ├── ContentFragment.java │ │ │ │ ├── HomeFragment.java │ │ │ │ ├── NaviFragment.java │ │ │ │ ├── ProjectFragment.java │ │ │ │ ├── ProjectItemFragment.java │ │ │ │ ├── SystemFragment.java │ │ │ │ ├── ToDoFragment.java │ │ │ │ ├── TreeFragment.java │ │ │ │ └── UserFragment.java │ │ ├── jniLibs │ │ │ ├── armeabi-v7a │ │ │ │ └── liblbs.so │ │ │ ├── armeabi-v8a │ │ │ │ └── liblbs.so │ │ │ ├── armeabi │ │ │ │ └── liblbs.so │ │ │ ├── mips │ │ │ │ └── liblbs.so │ │ │ ├── x86 │ │ │ │ └── liblbs.so │ │ │ └── x86_64 │ │ │ │ └── liblbs.so │ │ └── res │ │ │ ├── anim │ │ │ ├── enter_fade_in.xml │ │ │ ├── enter_fade_out.xml │ │ │ ├── exit_fade_in.xml │ │ │ └── exit_fade_out.xml │ │ │ ├── drawable-v24 │ │ │ └── ic_launcher_foreground.xml │ │ │ ├── drawable │ │ │ ├── launch_splash.xml │ │ │ ├── progress_bar_states.xml │ │ │ ├── shape_corner_search_edt.xml │ │ │ ├── shape_corner_white.xml │ │ │ ├── shape_user_btn_login.xml │ │ │ └── tab_divider.xml │ │ │ ├── layout │ │ │ ├── activity_articles.xml │ │ │ ├── activity_login.xml │ │ │ ├── activity_main.xml │ │ │ ├── activity_search.xml │ │ │ ├── activity_search_result.xml │ │ │ ├── activity_settings.xml │ │ │ ├── activity_splash.xml │ │ │ ├── activity_version.xml │ │ │ ├── activity_web.xml │ │ │ ├── bottom_bar_item_only_icon.xml │ │ │ ├── empty_view.xml │ │ │ ├── flow_tv_item.xml │ │ │ ├── fragment_a.xml │ │ │ ├── fragment_account.xml │ │ │ ├── fragment_b.xml │ │ │ ├── fragment_c.xml │ │ │ ├── fragment_collect.xml │ │ │ ├── fragment_content.xml │ │ │ ├── fragment_project_item.xml │ │ │ ├── fragment_todo.xml │ │ │ ├── fragment_tree.xml │ │ │ ├── fragment_user.xml │ │ │ ├── rv_article_img.xml │ │ │ ├── rv_article_normal.xml │ │ │ ├── rv_home_img_item.xml │ │ │ ├── rv_tree_item.xml │ │ │ └── rv_ver_item.xml │ │ │ ├── mipmap-hdpi │ │ │ ├── icon_launcher.png │ │ │ ├── icon_launcher_round.png │ │ │ ├── input_del.png │ │ │ └── logo.png │ │ │ ├── mipmap-night-xxhdpi │ │ │ ├── article.png │ │ │ ├── chat.png │ │ │ ├── chat_no.png │ │ │ ├── collect.png │ │ │ ├── collect_normal.png │ │ │ ├── collect_yes.png │ │ │ ├── confirm.png │ │ │ ├── home.png │ │ │ ├── home_no.png │ │ │ ├── icon_launcher.png │ │ │ ├── icon_launcher_round.png │ │ │ ├── id.png │ │ │ ├── input_del.png │ │ │ ├── my.png │ │ │ ├── navi.png │ │ │ ├── navigation.png │ │ │ ├── official_account.png │ │ │ ├── project.png │ │ │ ├── project_no.png │ │ │ ├── project_yes.png │ │ │ ├── pwd.png │ │ │ ├── search.png │ │ │ ├── search_btn.png │ │ │ ├── setting.png │ │ │ ├── todo.png │ │ │ ├── top_article.png │ │ │ ├── tree.png │ │ │ ├── tree_knowledge.png │ │ │ ├── tree_no.png │ │ │ ├── user.png │ │ │ └── user_no.png │ │ │ ├── mipmap-xhdpi │ │ │ ├── icon_launcher.png │ │ │ ├── icon_launcher_round.png │ │ │ ├── input_del.png │ │ │ └── logo.png │ │ │ ├── mipmap-xxhdpi │ │ │ ├── article.png │ │ │ ├── chat.png │ │ │ ├── chat_no.png │ │ │ ├── collect.png │ │ │ ├── collect_normal.png │ │ │ ├── collect_yes.png │ │ │ ├── confirm.png │ │ │ ├── empty.png │ │ │ ├── home.png │ │ │ ├── home_no.png │ │ │ ├── icon_launcher.png │ │ │ ├── icon_launcher_round.png │ │ │ ├── id.png │ │ │ ├── input_del.png │ │ │ ├── logo.png │ │ │ ├── my.png │ │ │ ├── navi.png │ │ │ ├── navigation.png │ │ │ ├── official_account.png │ │ │ ├── project.png │ │ │ ├── project_no.png │ │ │ ├── project_yes.png │ │ │ ├── pwd.png │ │ │ ├── search.png │ │ │ ├── search_btn.png │ │ │ ├── setting.png │ │ │ ├── todo.png │ │ │ ├── top_article.png │ │ │ ├── tree.png │ │ │ ├── tree_knowledge.png │ │ │ ├── tree_no.png │ │ │ ├── user.png │ │ │ └── user_no.png │ │ │ ├── mipmap-xxxhdpi │ │ │ └── input_del.png │ │ │ ├── values-night │ │ │ └── colors.xml │ │ │ ├── values │ │ │ ├── colors.xml │ │ │ ├── dimens.xml │ │ │ ├── strings.xml │ │ │ └── styles.xml │ │ │ └── xml │ │ │ └── provider_paths.xml │ └── test │ │ └── java │ │ └── com │ │ └── lzq │ │ └── wanandroid │ │ └── ExampleUnitTest.java └── version.properties ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── introduce ├── WanAndroid_1.0.18075_10089_release.apk ├── 微信图片_20190629112228.png ├── 微信图片_20190629112245.jpg ├── 微信图片_20190629112248.jpg ├── 微信图片_20190629112253.jpg ├── 微信图片_20190629112257.jpg ├── 微信图片_20190629112303.png ├── 微信图片_20190629112314.jpg ├── 微信图片_20190629112320.jpg └── 微信图片_20190629112322.jpg └── 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 | .DS_Store 11 | /build 12 | /captures 13 | .externalNativeBuild 14 | -------------------------------------------------------------------------------- /.idea/WanAndroid.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 17 | 18 | -------------------------------------------------------------------------------- /.idea/inspectionProfiles/Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 36 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # WanAndroid 2 | 3 | 项目介绍: 4 | ---- 5 | ![logo](https://github.com/TzuChiangLi/WanAndroid/blob/master/app/src/main/res/mipmap-xhdpi/icon_launcher_round.png?raw=true "") 6 | 7 | 本项目启动LOGO设计来自越来越美丽的杨设计@Designer Yang 8 | 项目作者:TzuChiangLi 9 | Please star before forking,3ku. 10 | 请在fork前star,谢谢! 11 | 开源项目,如果喜欢请star。 12 | 13 | 14 | 15 | 下载地址: 16 | ---- 17 | [点击下载](https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/dev-1.1/app/release/WanAndroid_1.0.18422_10134_release.apk) 18 | 19 | 更新记录: 20 | ---- 21 | 2020-06-09: 22 | * 1.移除版本更新以及相关权限 23 | * 2.修复文章列表展示异常的问题 24 | * 3.新增关于界面 25 | 26 | 界面截图: 27 | ---- 28 | ![screencut](https://github.com/TzuChiangLi/WanAndroid/blob/master/introduce/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20190629112248.jpg?raw=true "截图") 29 | ![screencut](https://github.com/TzuChiangLi/WanAndroid/blob/master/introduce/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20190629112320.jpg?raw=true "截图") 30 | 31 | 32 | 33 | 本项目主要用到了一下三方库: 34 | ---- 35 | * 1.Glide 36 | * 2.黄油刀 37 | * 3.LitePal 38 | * 4.OkGo 39 | * 5.轮子哥:TitleBar、ToastUtil 40 | * 6.BRAVH适配器 41 | * 7.immersionbar沉浸式顶栏 42 | * 8.GSON 43 | * 9.Banner 44 | * 10.SmartRefreshLayout 45 | * 11.EventBus 46 | * 12.FlowLayout 47 | * 13.空祖Dialog 48 | * 14.BGA-滑动返回 49 | * 15.腾讯系:Bugly全量更新,X5浏览内核 50 | * 16.iconfont阿里图标开源分享库 51 | 52 | 53 | 总结 54 | ---- 55 | 56 | 因为当时开始做的时候Gson解析不是特别熟练,所以实体类创建的特别潦草,目前没时间修改,只能完成基本功能。 57 | 最后感谢项目中用到的所有开源库、API的大佬,尤其是玩安卓的开源API,我会继续学习的。谢谢大家支持,希望大家能下载体验,多多提出反馈意见。 58 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/libs/LZQlxy.jks: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/libs/LZQlxy.jks -------------------------------------------------------------------------------- /app/libs/commons-lang3-3.8.1.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/libs/commons-lang3-3.8.1.jar -------------------------------------------------------------------------------- /app/libs/tbs_sdk_thirdapp_v4.3.0.1072_43646_sharewithdownloadwithfile_withoutGame_obfs_20190429_175122.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/libs/tbs_sdk_thirdapp_v4.3.0.1072_43646_sharewithdownloadwithfile_withoutGame_obfs_20190429_175122.jar -------------------------------------------------------------------------------- /app/release/10109.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/release/10109.png -------------------------------------------------------------------------------- /app/release/10114.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/release/10114.png -------------------------------------------------------------------------------- /app/release/WanAndroid_1.0.18030_release.apk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/release/WanAndroid_1.0.18030_release.apk -------------------------------------------------------------------------------- /app/release/WanAndroid_1.0.18033_release.apk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/release/WanAndroid_1.0.18033_release.apk -------------------------------------------------------------------------------- /app/release/WanAndroid_1.0.18034_release.apk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/release/WanAndroid_1.0.18034_release.apk -------------------------------------------------------------------------------- /app/release/WanAndroid_1.0.18101_10114_release.apk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/release/WanAndroid_1.0.18101_10114_release.apk -------------------------------------------------------------------------------- /app/release/output.json: -------------------------------------------------------------------------------- 1 | [{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":10115,"versionName":"1.0.18101","enabled":true,"outputFile":"WanAndroid_1.0.18101_10115_release.apk","fullName":"release","baseName":"release"},"path":"WanAndroid_1.0.18101_10115_release.apk","properties":{}}] -------------------------------------------------------------------------------- /app/src/androidTest/java/com/lzq/wanandroid/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.lzq.wanandroid; 2 | 3 | import android.content.Context; 4 | import android.support.test.InstrumentationRegistry; 5 | import android.support.test.runner.AndroidJUnit4; 6 | 7 | import org.junit.Test; 8 | import org.junit.runner.RunWith; 9 | 10 | import static org.junit.Assert.*; 11 | 12 | /** 13 | * Instrumented test, which will execute on an Android device. 14 | * 15 | * @see Testing documentation 16 | */ 17 | @RunWith(AndroidJUnit4.class) 18 | public class ExampleInstrumentedTest { 19 | @Test 20 | public void useAppContext() { 21 | // Context of the app under test. 22 | Context appContext = InstrumentationRegistry.getTargetContext(); 23 | 24 | assertEquals("com.lzq.wanandroid", appContext.getPackageName()); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 26 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 40 | 41 | 44 | 45 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 71 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | -------------------------------------------------------------------------------- /app/src/main/assets/litepal.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/java/com/lzq/wanandroid/SplashActivity.java: -------------------------------------------------------------------------------- 1 | package com.lzq.wanandroid; 2 | 3 | import android.content.Intent; 4 | import android.os.Bundle; 5 | 6 | import com.lzq.wanandroid.base.BaseActivity; 7 | 8 | public class SplashActivity extends BaseActivity { 9 | private static final String TAG="SplashActivity"; 10 | @Override 11 | protected void onCreate(Bundle savedInstanceState) { 12 | super.onCreate(savedInstanceState); 13 | //跳转页面 14 | Intent intent = new Intent(SplashActivity.this,MainActivity.class); 15 | startActivity(intent); 16 | finish(); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/java/com/lzq/wanandroid/WanAndroid.java: -------------------------------------------------------------------------------- 1 | package com.lzq.wanandroid; 2 | 3 | import android.app.Application; 4 | import android.support.v7.app.AppCompatDelegate; 5 | 6 | import com.blankj.utilcode.util.SPUtils; 7 | import com.hjq.toast.ToastUtils; 8 | import com.lzq.wanandroid.service.InitService; 9 | import com.lzq.wanandroid.utils.StringUtils; 10 | import com.lzy.okgo.OkGo; 11 | import com.lzy.okgo.cookie.CookieJarImpl; 12 | import com.lzy.okgo.cookie.store.SPCookieStore; 13 | import com.qw.soul.permission.SoulPermission; 14 | 15 | import org.litepal.LitePal; 16 | 17 | import cn.bingoogolapple.swipebacklayout.BGASwipeBackHelper; 18 | import okhttp3.OkHttpClient; 19 | 20 | public class WanAndroid extends Application { 21 | private static final String TAG="WanAndroid"; 22 | @Override 23 | public void onCreate() { 24 | super.onCreate(); 25 | boolean nightMode = SPUtils.getInstance(StringUtils.CONFIG_SETTINGS).getBoolean 26 | (StringUtils.KEY_NIGHT_MODE, false); 27 | AppCompatDelegate.setDefaultNightMode(nightMode ? AppCompatDelegate.MODE_NIGHT_YES : 28 | AppCompatDelegate.MODE_NIGHT_NO); 29 | ToastUtils.init(this); 30 | OkHttpClient.Builder builder = new OkHttpClient.Builder(); 31 | //使用sp保持cookie,如果cookie不过期,则一直有效 32 | builder.cookieJar(new CookieJarImpl(new SPCookieStore(this))); 33 | OkGo.getInstance().setOkHttpClient(builder.build()).init(this); 34 | LitePal.initialize(this); 35 | LitePal.getDatabase(); 36 | SoulPermission.skipOldRom(true); 37 | /** 38 | * 必须在 Application 的 onCreate 方法中执行 BGASwipeBackHelper.init 来初始化滑动返回 39 | * 第一个参数:应用程序上下文 40 | * 第二个参数:如果发现滑动返回后立即触摸界面时应用崩溃,请把该界面里比较特殊的 View 的 class 添加到该集合中,目前在库中已经添加了 WebView 和 SurfaceView 41 | */ 42 | BGASwipeBackHelper.init(this, null); 43 | InitService.start(this); 44 | } 45 | 46 | } -------------------------------------------------------------------------------- /app/src/main/java/com/lzq/wanandroid/api/FlowTagCallBack.java: -------------------------------------------------------------------------------- 1 | package com.lzq.wanandroid.api; 2 | 3 | 4 | import com.lzq.wanandroid.model.Children; 5 | 6 | import java.util.List; 7 | 8 | public interface FlowTagCallBack { 9 | void getTreeLink(String URL); 10 | void getTreeArticles(int ID, int position, String title, List children); 11 | } 12 | -------------------------------------------------------------------------------- /app/src/main/java/com/lzq/wanandroid/api/LoadTasksCallBack.java: -------------------------------------------------------------------------------- 1 | package com.lzq.wanandroid.api; 2 | 3 | public interface LoadTasksCallBack { 4 | void onSuccess(T t,int...params); 5 | void onStart(); 6 | void onFailed(); 7 | void onError(int code,String msg); 8 | void onFinish(); 9 | } 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/lzq/wanandroid/api/LoginContract.java: -------------------------------------------------------------------------------- 1 | package com.lzq.wanandroid.api; 2 | 3 | import android.app.Activity; 4 | 5 | import com.lzq.wanandroid.base.BaseView; 6 | import com.lzq.wanandroid.model.Data; 7 | import com.lzq.wanandroid.model.Datas; 8 | 9 | import java.util.List; 10 | 11 | public interface LoginContract { 12 | //与M层交互 13 | interface LoginPresenter { 14 | void doLogin(String username, String password); 15 | 16 | void doRegister(String username, String password); 17 | 18 | void getUserInfo(); 19 | 20 | void resetLoginLocation(Activity activity); 21 | 22 | } 23 | 24 | //与M层交互 25 | interface LogoutPresenter { 26 | void initView(); 27 | 28 | void setUserInfo(); 29 | 30 | 31 | } 32 | 33 | //与V层交互,需要将获取的信息展示出来 34 | interface LoginView extends BaseView { 35 | 36 | void LoginSuccess(Data data); 37 | 38 | void RegisterResult(String... infos); 39 | 40 | void setLoginLocation(int height); 41 | 42 | void refreshLocation(int height); 43 | } 44 | 45 | 46 | //与V层交互,需要将获取的信息展示出来 47 | interface LogoutView extends BaseView { 48 | 49 | void setEmptyContent(List mList); 50 | 51 | void setContent(List mList, int flag); 52 | } 53 | 54 | } 55 | -------------------------------------------------------------------------------- /app/src/main/java/com/lzq/wanandroid/api/NetTask.java: -------------------------------------------------------------------------------- 1 | package com.lzq.wanandroid.api; 2 | 3 | public interface NetTask { 4 | void execute(LoadTasksCallBack callBack, int... params); 5 | 6 | void execute(LoadTasksCallBack callBack,String...infos); 7 | 8 | } 9 | -------------------------------------------------------------------------------- /app/src/main/java/com/lzq/wanandroid/api/OffAccountContract.java: -------------------------------------------------------------------------------- 1 | package com.lzq.wanandroid.api; 2 | 3 | import com.lzq.wanandroid.base.BaseView; 4 | import com.lzq.wanandroid.model.Children; 5 | import com.lzq.wanandroid.model.Data; 6 | import com.lzq.wanandroid.model.Datas; 7 | 8 | import java.util.List; 9 | 10 | public interface OffAccountContract { 11 | //与M层交互 12 | interface AccountTitlePresenter { 13 | //获取文章前先使用占位符填充 14 | void initView(String[] tabName); 15 | 16 | void initView(int position,String[] tabName, int[] tabID); 17 | 18 | void getTitleText(int type); 19 | 20 | void getContent(int ID, int page); 21 | 22 | } 23 | 24 | //与M层交互 25 | interface AccountContentPresenter { 26 | //获取文章前先使用占位符填充 27 | void initView(); 28 | 29 | void getTitleText(int type); 30 | 31 | void addContent(int ID, int page); 32 | 33 | void getContent(int ID, int page); 34 | 35 | void getSelectedURL(String URL); 36 | 37 | int showID(); 38 | 39 | void collectArticle(int ID, boolean isCollect, int position); 40 | 41 | } 42 | 43 | //与V层交互,需要将获取的信息展示出来 44 | interface AccountTitleView extends BaseView { 45 | 46 | void setAccountEmptyTitle(List mList); 47 | 48 | void setArticlesContent(int position,List mList); 49 | 50 | void setTitleText(List mList); 51 | 52 | void setContent(List mList); 53 | } 54 | 55 | 56 | //与V层交互,需要将获取的信息展示出来 57 | interface AccountContentView extends BaseView { 58 | 59 | void setEmptyContent(List mList); 60 | 61 | void setContent(List mList, int flag); 62 | 63 | void goWebActivity(String URL); 64 | 65 | void collectedArticle(int position, boolean isCollect); 66 | } 67 | 68 | } 69 | -------------------------------------------------------------------------------- /app/src/main/java/com/lzq/wanandroid/api/WebContract.java: -------------------------------------------------------------------------------- 1 | package com.lzq.wanandroid.api; 2 | 3 | import com.lzq.wanandroid.base.BaseView; 4 | 5 | public interface WebContract { 6 | 7 | interface Presenter{ 8 | //与M层交互 9 | void getContent(String URL); 10 | } 11 | 12 | 13 | interface View extends BaseView{ 14 | //与V层交互,需要将获取的信息展示出来 15 | void setContent(String URL); 16 | } 17 | 18 | 19 | } 20 | -------------------------------------------------------------------------------- /app/src/main/java/com/lzq/wanandroid/base/BaseFragment.java: -------------------------------------------------------------------------------- 1 | package com.lzq.wanandroid.base; 2 | 3 | import android.content.Context; 4 | import android.content.Intent; 5 | import android.support.v4.app.Fragment; 6 | import android.view.View; 7 | import android.view.inputmethod.InputMethodManager; 8 | import android.widget.EditText; 9 | 10 | import com.blankj.utilcode.util.ActivityUtils; 11 | import com.lzq.wanandroid.R; 12 | 13 | public abstract class BaseFragment extends Fragment { 14 | 15 | public void startActivity(View view, Class className) { 16 | ActivityUtils.getActivityByView(view).startActivity(new Intent(ActivityUtils.getActivityByView(view), className)); 17 | //参数(进入动画,退出动画) 18 | ActivityUtils.getActivityByView(view).overridePendingTransition(R.anim.enter_fade_out,R.anim.enter_fade_in); 19 | } 20 | 21 | public void startActivity(View view,Intent intent){ 22 | ActivityUtils.getActivityByView(view).startActivity(intent); 23 | //参数(进入动画,退出动画) 24 | ActivityUtils.getActivityByView(view).overridePendingTransition(R.anim.enter_fade_out,R.anim.enter_fade_in); 25 | } 26 | 27 | //获取焦点并且显示输入法 28 | public static void showSoftInputUtil(EditText editText) { 29 | editText.setFocusable(true); 30 | editText.setFocusableInTouchMode(true); 31 | editText.requestFocus(); 32 | InputMethodManager inputManager = 33 | (InputMethodManager) editText.getContext().getSystemService(Context.INPUT_METHOD_SERVICE); 34 | inputManager.showSoftInput(editText, 0); 35 | } 36 | 37 | } 38 | -------------------------------------------------------------------------------- /app/src/main/java/com/lzq/wanandroid/base/BasePresenter.java: -------------------------------------------------------------------------------- 1 | package com.lzq.wanandroid.base; 2 | 3 | public abstract class BasePresenter { 4 | public void sendEvent(int... params) { 5 | 6 | } 7 | 8 | 9 | } 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/lzq/wanandroid/base/BaseView.java: -------------------------------------------------------------------------------- 1 | package com.lzq.wanandroid.base; 2 | 3 | public interface BaseView { 4 | void setPresenter(T presenter); 5 | } 6 | -------------------------------------------------------------------------------- /app/src/main/java/com/lzq/wanandroid/base/NetChangeActivity.java: -------------------------------------------------------------------------------- 1 | package com.lzq.wanandroid.base; 2 | 3 | import android.content.BroadcastReceiver; 4 | import android.content.Context; 5 | import android.content.Intent; 6 | import android.content.IntentFilter; 7 | import android.net.ConnectivityManager; 8 | import android.net.NetworkInfo; 9 | import android.os.Bundle; 10 | 11 | import com.blankj.utilcode.util.NetworkUtils; 12 | 13 | 14 | /* 15 | * 需要网络状态监听的集成此基类 16 | * */ 17 | public abstract class NetChangeActivity extends BaseActivity { 18 | //监听网络变化 19 | private IntentFilter intentFilter; 20 | private NetworkChangeReceiver networkChangeReceiver; 21 | //默认禁止屏幕旋转 22 | private boolean isAllowScrRoate = false; 23 | //采用ButterKnife绑定,每一个Acitivity都需要重新绑定,对标题的设置才能生效 24 | 25 | @Override 26 | protected void onCreate(Bundle savedInstanceState) { 27 | super.onCreate(savedInstanceState); 28 | setScreenRoate(isAllowScrRoate); 29 | intentFilter = new IntentFilter(); 30 | intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); 31 | networkChangeReceiver = new NetworkChangeReceiver(); 32 | registerReceiver(networkChangeReceiver, intentFilter); 33 | } 34 | 35 | @Override 36 | protected void onDestroy() { 37 | super.onDestroy(); 38 | unregisterReceiver(networkChangeReceiver); 39 | } 40 | 41 | 42 | class NetworkChangeReceiver extends BroadcastReceiver { 43 | 44 | @Override 45 | public void onReceive(Context context, Intent intent) { 46 | ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 47 | NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); 48 | if (networkInfo != null && networkInfo.isConnected()&& NetworkUtils.isAvailableByPing()) { 49 | doNetWork(); 50 | } else { 51 | // ToastUtils.show("您当前网络有问题,请检查设置!"); 52 | } 53 | } 54 | } 55 | 56 | public abstract void doNetWork(); 57 | 58 | public void setScreenRoate(boolean isAllowScrRoate) { 59 | this.isAllowScrRoate = isAllowScrRoate; 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /app/src/main/java/com/lzq/wanandroid/db/Tree.java: -------------------------------------------------------------------------------- 1 | package com.lzq.wanandroid.db; 2 | 3 | import org.litepal.crud.LitePalSupport; 4 | 5 | public class Tree extends LitePalSupport { 6 | //只保存一级标题 7 | private int parentID; 8 | private String name; 9 | private int type;//体系还是导航 10 | 11 | 12 | public Tree() { 13 | } 14 | 15 | public Tree(int parentID, String name, int type) { 16 | this.parentID = parentID; 17 | this.name = name; 18 | this.type = type; 19 | } 20 | 21 | public int getParentID() { 22 | return parentID; 23 | } 24 | 25 | public void setParentID(int parentID) { 26 | this.parentID = parentID; 27 | } 28 | 29 | public String getName() { 30 | return name; 31 | } 32 | 33 | public void setName(String name) { 34 | this.name = name; 35 | } 36 | 37 | public int getType() { 38 | return type; 39 | } 40 | 41 | public void setType(int type) { 42 | this.type = type; 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /app/src/main/java/com/lzq/wanandroid/model/Children.java: -------------------------------------------------------------------------------- 1 | package com.lzq.wanandroid.model; 2 | 3 | import java.util.List; 4 | 5 | public class Children { 6 | private List children; 7 | private int courseId; 8 | private int id; 9 | private String name; 10 | private int order; 11 | private int parentChapterId; 12 | private boolean userControlSetTop; 13 | private int visible; 14 | 15 | public Children() { 16 | } 17 | 18 | public Children(int id, String name) { 19 | this.id = id; 20 | this.name = name; 21 | } 22 | 23 | public Children(List children, int courseId, int id, String name, int order, int parentChapterId, boolean userControlSetTop, int visible) { 24 | this.children = children; 25 | this.courseId = courseId; 26 | this.id = id; 27 | this.name = name; 28 | this.order = order; 29 | this.parentChapterId = parentChapterId; 30 | this.userControlSetTop = userControlSetTop; 31 | this.visible = visible; 32 | } 33 | 34 | public List getChildren() { 35 | return children; 36 | } 37 | 38 | public void setChildren(List children) { 39 | this.children = children; 40 | } 41 | 42 | public int getCourseId() { 43 | return courseId; 44 | } 45 | 46 | public void setCourseId(int courseId) { 47 | this.courseId = courseId; 48 | } 49 | 50 | public int getId() { 51 | return id; 52 | } 53 | 54 | public void setId(int id) { 55 | this.id = id; 56 | } 57 | 58 | public String getName() { 59 | return name; 60 | } 61 | 62 | public void setName(String name) { 63 | this.name = name; 64 | } 65 | 66 | public int getOrder() { 67 | return order; 68 | } 69 | 70 | public void setOrder(int order) { 71 | this.order = order; 72 | } 73 | 74 | public int getParentChapterId() { 75 | return parentChapterId; 76 | } 77 | 78 | public void setParentChapterId(int parentChapterId) { 79 | this.parentChapterId = parentChapterId; 80 | } 81 | 82 | public boolean isUserControlSetTop() { 83 | return userControlSetTop; 84 | } 85 | 86 | public void setUserControlSetTop(boolean userControlSetTop) { 87 | this.userControlSetTop = userControlSetTop; 88 | } 89 | 90 | public int getVisible() { 91 | return visible; 92 | } 93 | 94 | public void setVisible(int visible) { 95 | this.visible = visible; 96 | } 97 | } 98 | -------------------------------------------------------------------------------- /app/src/main/java/com/lzq/wanandroid/model/Event.java: -------------------------------------------------------------------------------- 1 | package com.lzq.wanandroid.model; 2 | 3 | /** 4 | * @author TzuchiangLi 5 | * @time 2019年7月5日10:55:25 6 | * @description Event 7 | */ 8 | public class Event { 9 | 10 | /** 11 | * 登录界面监听 12 | */ 13 | public static final int TYPE_USER_LOGIN = 1; 14 | /** 15 | * 登录成功 16 | */ 17 | public static final int TYPE_LOGIN = 2; 18 | 19 | /** 20 | * 退出登录 21 | */ 22 | public static final int TYPE_LOGOUT = 3; 23 | 24 | /** 25 | * 收藏 26 | */ 27 | public static final int TYPE_COLLECT = 4; 28 | 29 | /** 30 | * 取消收藏 31 | */ 32 | public static final int TYPE_UNCOLLECT = 5; 33 | 34 | /** 35 | * 切换夜间模式 36 | */ 37 | public static final int TYPE_CHANGE_DAY_NIGHT_MODE = 6; 38 | 39 | /** 40 | * 开始动画 41 | */ 42 | public static final int TYPE_START_ANIMATION = 7; 43 | 44 | /** 45 | * 停止动画 46 | */ 47 | public static final int TYPE_STOP_ANIMATION = 8; 48 | 49 | /** 50 | * 登录界面动画 51 | */ 52 | public static final int TYPE_LOGIN_ANIMATION=9; 53 | /** 54 | * 登录界面渐隐顶部标题 55 | */ 56 | public static final int TYPE_LOGIN_SUCCESS=10; 57 | /** 58 | * 退出当前用户刷新UserFragment界面 59 | */ 60 | public static final int TYPE_LOGOUT_SUCCESS=11; 61 | /** 62 | * 需要登录 63 | */ 64 | public static final int TYPE_NEED_LOGIN=12; 65 | /** 66 | * 收藏刷新 67 | */ 68 | public static final int TYPE_COLLECT_REFRESH = 13; 69 | /** 70 | * 收藏注销 71 | */ 72 | public static final int TYPE_COLLECT_LOGOUT = 14; 73 | /** 74 | * 收藏注销 75 | */ 76 | public static final int TYPE_CHANGE_MAIN_TITLE = 14; 77 | /** 78 | * 跳转到体系界面 79 | */ 80 | public static final int TYPE_CHANGE_SYS = 15; 81 | /** 82 | * 跳转到导航界面 83 | */ 84 | public static final int TYPE_CHANGE_NAVI = 16; 85 | /** 86 | * 跳转到项目界面 87 | */ 88 | public static final int TYPE_CHANGE_PROJECT = 17; 89 | /** 90 | * 跳转到项目界面 91 | */ 92 | public static final int TYPE_HOME_BACKTOTOP = 18; 93 | /** 94 | * 跳转到项目界面 95 | */ 96 | public static final int TYPE_PROJECT_REFRESH = 19; 97 | /** 98 | * 刷新时是否已登录 99 | */ 100 | public static final int TYPE_REFRESH_ISLOGIN = 20; 101 | /** 102 | * 刷新时是否已登录 103 | */ 104 | public static final int TYPE_REFRESH_NOTLOGIN = 21; 105 | /** 106 | * 全局加载 107 | */ 108 | public static final int TYPE_SYS_LOAD = 22; 109 | 110 | 111 | 112 | 113 | /** 114 | * 目标界面-MainActivity 115 | */ 116 | public static final int TARGET_MAIN = 1; 117 | 118 | /** 119 | * 目标界面-目录 120 | */ 121 | public static final int TARGET_MENU = 2; 122 | 123 | /** 124 | * 目标界面-首页 125 | */ 126 | public static final int TARGET_HOME = 3; 127 | 128 | /** 129 | * 目标界面-体系 130 | */ 131 | public static final int TARGET_TREE = 4; 132 | 133 | /** 134 | * 目标界面-项目 135 | */ 136 | public static final int TARGET_PROJECT = 5; 137 | 138 | /** 139 | * 目标界面-公众号 140 | */ 141 | public static final int TARGET_WX = 6; 142 | 143 | /** 144 | * 目标界面-收藏列表 145 | */ 146 | public static final int TARGET_COLLECT = 7; 147 | 148 | /** 149 | * 目标界面-搜索结果 150 | */ 151 | public static final int TARGET_SEARCH_RESULT = 8; 152 | /** 153 | * 目标界面-我的信息 154 | */ 155 | public static final int TARGET_USER = 9; 156 | /** 157 | * 目标界面-导航体系 158 | */ 159 | public static final int TARGET_SYSTEM = 10; 160 | /** 161 | * 目标界面-全局刷新 162 | */ 163 | public static final int TARGET_RESFRESH = 11; 164 | 165 | 166 | 167 | public int target; 168 | 169 | public int type; 170 | 171 | public String data; 172 | 173 | public int position; 174 | 175 | } 176 | -------------------------------------------------------------------------------- /app/src/main/java/com/lzq/wanandroid/model/ProjectTree.java: -------------------------------------------------------------------------------- 1 | package com.lzq.wanandroid.model; 2 | 3 | import java.util.List; 4 | 5 | public class ProjectTree { 6 | private List data; 7 | private int errorCode; 8 | private String errorMsg; 9 | 10 | public ProjectTree() { 11 | } 12 | 13 | public ProjectTree(List data, int errorCode, String errorMsg) { 14 | this.data = data; 15 | this.errorCode = errorCode; 16 | this.errorMsg = errorMsg; 17 | } 18 | 19 | public List getData() { 20 | return data; 21 | } 22 | 23 | public void setData(List data) { 24 | this.data = data; 25 | } 26 | 27 | public int getErrorCode() { 28 | return errorCode; 29 | } 30 | 31 | public void setErrorCode(int errorCode) { 32 | this.errorCode = errorCode; 33 | } 34 | 35 | public String getErrorMsg() { 36 | return errorMsg; 37 | } 38 | 39 | public void setErrorMsg(String errorMsg) { 40 | this.errorMsg = errorMsg; 41 | } 42 | 43 | public static class DataBean { 44 | private List children; 45 | private int courseId; 46 | private int id; 47 | private String name; 48 | private int order; 49 | private int parentChapterId; 50 | private boolean userControlSetTop; 51 | private int visible; 52 | 53 | public DataBean() { 54 | } 55 | 56 | public DataBean(List children, int courseId, int id, String name, int order, int parentChapterId, boolean userControlSetTop, int visible) { 57 | this.children = children; 58 | this.courseId = courseId; 59 | this.id = id; 60 | this.name = name; 61 | this.order = order; 62 | this.parentChapterId = parentChapterId; 63 | this.userControlSetTop = userControlSetTop; 64 | this.visible = visible; 65 | } 66 | 67 | public List getChildren() { 68 | return children; 69 | } 70 | 71 | public void setChildren(List children) { 72 | this.children = children; 73 | } 74 | 75 | public int getCourseId() { 76 | return courseId; 77 | } 78 | 79 | public void setCourseId(int courseId) { 80 | this.courseId = courseId; 81 | } 82 | 83 | public int getId() { 84 | return id; 85 | } 86 | 87 | public void setId(int id) { 88 | this.id = id; 89 | } 90 | 91 | public String getName() { 92 | return name; 93 | } 94 | 95 | public void setName(String name) { 96 | this.name = name; 97 | } 98 | 99 | public int getOrder() { 100 | return order; 101 | } 102 | 103 | public void setOrder(int order) { 104 | this.order = order; 105 | } 106 | 107 | public int getParentChapterId() { 108 | return parentChapterId; 109 | } 110 | 111 | public void setParentChapterId(int parentChapterId) { 112 | this.parentChapterId = parentChapterId; 113 | } 114 | 115 | public boolean isUserControlSetTop() { 116 | return userControlSetTop; 117 | } 118 | 119 | public void setUserControlSetTop(boolean userControlSetTop) { 120 | this.userControlSetTop = userControlSetTop; 121 | } 122 | 123 | public int getVisible() { 124 | return visible; 125 | } 126 | 127 | public void setVisible(int visible) { 128 | this.visible = visible; 129 | } 130 | } 131 | 132 | } 133 | -------------------------------------------------------------------------------- /app/src/main/java/com/lzq/wanandroid/model/Tags.java: -------------------------------------------------------------------------------- 1 | package com.lzq.wanandroid.model; 2 | 3 | public class Tags { 4 | private String name; 5 | private String url; 6 | 7 | 8 | public void setName(String name) { 9 | this.name = name; 10 | } 11 | public String getName() { 12 | return name; 13 | } 14 | 15 | 16 | public void setUrl(String url) { 17 | this.url = url; 18 | } 19 | public String getUrl() { 20 | return url; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/src/main/java/com/lzq/wanandroid/model/WanAndroid.java: -------------------------------------------------------------------------------- 1 | package com.lzq.wanandroid.model; 2 | 3 | 4 | import java.util.List; 5 | 6 | public class WanAndroid { 7 | private List data; 8 | private int errorCode; 9 | private String errorMsg; 10 | 11 | 12 | public List getData() { 13 | return data; 14 | } 15 | 16 | public void setData(List data) { 17 | this.data = data; 18 | } 19 | 20 | public int getErrorCode() { 21 | return errorCode; 22 | } 23 | 24 | public void setErrorCode(int errorCode) { 25 | this.errorCode = errorCode; 26 | } 27 | 28 | public String getErrorMsg() { 29 | return errorMsg; 30 | } 31 | 32 | public void setErrorMsg(String errorMsg) { 33 | this.errorMsg = errorMsg; 34 | } 35 | } -------------------------------------------------------------------------------- /app/src/main/java/com/lzq/wanandroid/model/WanAndroid_Content.java: -------------------------------------------------------------------------------- 1 | package com.lzq.wanandroid.model; 2 | 3 | 4 | public class WanAndroid_Content { 5 | private int errorCode; 6 | private String errorMsg; 7 | private Data data; 8 | 9 | 10 | public Data getData() { 11 | return data; 12 | } 13 | 14 | public void setData(Data data) { 15 | this.data = data; 16 | } 17 | 18 | public int getErrorCode() { 19 | return errorCode; 20 | } 21 | 22 | public void setErrorCode(int errorCode) { 23 | this.errorCode = errorCode; 24 | } 25 | 26 | public String getErrorMsg() { 27 | return errorMsg; 28 | } 29 | 30 | public void setErrorMsg(String errorMsg) { 31 | this.errorMsg = errorMsg; 32 | } 33 | } -------------------------------------------------------------------------------- /app/src/main/java/com/lzq/wanandroid/presenter/CollectPresenter.java: -------------------------------------------------------------------------------- 1 | package com.lzq.wanandroid.presenter; 2 | 3 | import android.util.Log; 4 | 5 | import com.lzq.wanandroid.api.Contract; 6 | import com.lzq.wanandroid.api.LoadTasksCallBack; 7 | import com.lzq.wanandroid.api.WebTask; 8 | import com.lzq.wanandroid.base.BasePresenter; 9 | import com.lzq.wanandroid.model.Datas; 10 | import com.lzq.wanandroid.utils.StringUtils; 11 | 12 | import java.util.ArrayList; 13 | import java.util.List; 14 | 15 | public class CollectPresenter extends BasePresenter implements Contract.CollectPresenter, LoadTasksCallBack { 16 | private Contract.CollectView mView; 17 | private WebTask mTask; 18 | 19 | public CollectPresenter(Contract.CollectView mView, WebTask mTask) { 20 | this.mView = mView; 21 | this.mTask = mTask; 22 | } 23 | 24 | public static CollectPresenter createPresenter(Contract.CollectView mView, WebTask mTask) { 25 | return new CollectPresenter(mView, mTask); 26 | } 27 | 28 | @Override 29 | public void initView() { 30 | List mList = new ArrayList<>(); 31 | for (int i = 0; i < 5; i++) { 32 | mList.add(new Datas("", "", "", "", "")); 33 | } 34 | mView.setEmptyList(mList); 35 | } 36 | 37 | @Override 38 | public void getCollectList() { 39 | mTask.execute(this, StringUtils.TYPE_COLLECT_CONTENT_LOAD, 0); 40 | } 41 | 42 | @Override 43 | public void getSelectedURL(String URL) { 44 | mView.goWebActivity(URL); 45 | } 46 | 47 | @Override 48 | public void cancelCollect(int ID, int position, int orginID) { 49 | mTask.execute(this, StringUtils.TYPE_COLLECT_NO_USER, ID, position, orginID); 50 | } 51 | 52 | 53 | @Override 54 | public void onSuccess(Object o, int... params) { 55 | switch (params[0]) { 56 | case StringUtils.TYPE_COLLECT_CONTENT_LOAD: 57 | List mList = (List) o; 58 | Log.d("data", "----onSuccess: 收藏" + mList.size()); 59 | if (mList.size() != 0 || mList != null) { 60 | 61 | for (int i = 0; i < mList.size(); i++) { 62 | mList.get(i).setCollect(true); 63 | } 64 | mView.setCollectList(mList); 65 | } else { 66 | mView.setCollectList(null); 67 | } 68 | break; 69 | case StringUtils.TYPE_COLLECT_NO: 70 | mView.removeItem((Integer) o); 71 | break; 72 | default: 73 | break; 74 | } 75 | } 76 | 77 | @Override 78 | public void onStart() { 79 | 80 | } 81 | 82 | @Override 83 | public void onFailed() { 84 | 85 | } 86 | 87 | @Override 88 | public void onError(int code, String msg) { 89 | 90 | } 91 | 92 | @Override 93 | public void onFinish() { 94 | mView.onFinishLoad(); 95 | } 96 | 97 | 98 | } 99 | -------------------------------------------------------------------------------- /app/src/main/java/com/lzq/wanandroid/presenter/LoginPresenter.java: -------------------------------------------------------------------------------- 1 | package com.lzq.wanandroid.presenter; 2 | 3 | import android.app.Activity; 4 | 5 | import com.lzq.wanandroid.api.LoginContract; 6 | import com.lzq.wanandroid.api.LoadTasksCallBack; 7 | import com.lzq.wanandroid.base.BasePresenter; 8 | import com.lzq.wanandroid.model.Data; 9 | import com.lzq.wanandroid.api.WebTask; 10 | import com.lzq.wanandroid.utils.AnimationUtil; 11 | import com.lzq.wanandroid.utils.StringUtils; 12 | 13 | public class LoginPresenter extends BasePresenter 14 | implements LoginContract.LoginPresenter, LoadTasksCallBack { 15 | private static final String TAG = "LoginPresenter"; 16 | private WebTask mTask; 17 | private LoginContract.LoginView mView; 18 | private int oldHeight = 0; 19 | 20 | 21 | public LoginPresenter(LoginContract.LoginView mView, WebTask mTask) { 22 | this.mView = mView; 23 | this.mTask = mTask; 24 | } 25 | 26 | public static LoginPresenter createPresenter(LoginContract.LoginView mView, WebTask mTask) { 27 | return new LoginPresenter(mView, mTask); 28 | } 29 | 30 | 31 | @Override 32 | public void doLogin(String username, String password) { 33 | mTask.execute(this, StringUtils.TYPE_LOGIN, username, password); 34 | } 35 | 36 | @Override 37 | public void doRegister(String username, String password) { 38 | mTask.execute(this, StringUtils.TYPE_REGISTER, username, password); 39 | } 40 | 41 | @Override 42 | public void getUserInfo() { 43 | 44 | } 45 | 46 | 47 | @Override 48 | public void resetLoginLocation(Activity activity) { 49 | int heightDifference = AnimationUtil.getInputHeight(activity); 50 | if (oldHeight != heightDifference) { 51 | oldHeight = heightDifference; 52 | boolean isExistBottomBar = AnimationUtil.checkDeviceHasNavigationBar(activity); 53 | if (isExistBottomBar) { 54 | heightDifference = heightDifference - AnimationUtil.getBottomBarHeight(activity); 55 | } 56 | if (heightDifference > 0) { 57 | mView.setLoginLocation(heightDifference); 58 | } else { 59 | mView.refreshLocation(heightDifference); 60 | } 61 | 62 | } 63 | } 64 | 65 | 66 | @Override 67 | public void onSuccess(Data data, int...params) { 68 | mView.LoginSuccess(data); 69 | } 70 | 71 | @Override 72 | public void onStart() { 73 | 74 | } 75 | 76 | @Override 77 | public void onFailed() { 78 | 79 | } 80 | 81 | @Override 82 | public void onError(int code, String msg) { 83 | mView.RegisterResult(msg); 84 | } 85 | 86 | @Override 87 | public void onFinish() { 88 | 89 | } 90 | } 91 | -------------------------------------------------------------------------------- /app/src/main/java/com/lzq/wanandroid/presenter/MainPresenter.java: -------------------------------------------------------------------------------- 1 | package com.lzq.wanandroid.presenter; 2 | 3 | import com.blankj.utilcode.util.SPUtils; 4 | import com.lzq.wanandroid.api.Contract; 5 | import com.lzq.wanandroid.base.BasePresenter; 6 | 7 | public class MainPresenter extends BasePresenter implements Contract.MainPresenter { 8 | private static final String TAG = "MainPresenter"; 9 | private Contract.MainView mView; 10 | 11 | public MainPresenter(Contract.MainView mView) { 12 | this.mView = mView; 13 | } 14 | 15 | public static MainPresenter createMainPresenter(Contract.MainView mView) { 16 | return new MainPresenter(mView); 17 | } 18 | 19 | @Override 20 | public void isLogin() { 21 | mView.afterCheckLogin(SPUtils.getInstance("userinfo").getBoolean("isLogin",false)); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main/java/com/lzq/wanandroid/presenter/ProjectItemPresenter.java: -------------------------------------------------------------------------------- 1 | package com.lzq.wanandroid.presenter; 2 | 3 | import com.blankj.utilcode.util.SPUtils; 4 | import com.lzq.wanandroid.api.Contract; 5 | import com.lzq.wanandroid.api.LoadTasksCallBack; 6 | import com.lzq.wanandroid.api.WebTask; 7 | import com.lzq.wanandroid.base.BasePresenter; 8 | import com.lzq.wanandroid.model.Event; 9 | import com.lzq.wanandroid.model.ProjectItem; 10 | import com.lzq.wanandroid.utils.StringUtils; 11 | 12 | import org.greenrobot.eventbus.EventBus; 13 | 14 | import java.util.ArrayList; 15 | import java.util.List; 16 | 17 | public class ProjectItemPresenter extends BasePresenter implements Contract.ProjectItemPresenter, LoadTasksCallBack { 18 | private static final String TAG = "WebPresenter"; 19 | private Contract.ProjectItemView mView; 20 | private WebTask mTask; 21 | private List mList = new ArrayList<>(); 22 | 23 | public int getID() { 24 | return ID; 25 | } 26 | 27 | public void setID(int ID) { 28 | this.ID = ID; 29 | } 30 | 31 | private int ID = 0; 32 | 33 | public static ProjectItemPresenter createPresenter(Contract.ProjectItemView mView, WebTask mTask, int ID) { 34 | return new ProjectItemPresenter(mView, mTask, ID); 35 | } 36 | 37 | public ProjectItemPresenter(Contract.ProjectItemView mView, WebTask mTask, int ID) { 38 | this.mView = mView; 39 | this.mTask = mTask; 40 | this.ID = ID; 41 | } 42 | 43 | 44 | @Override 45 | public void initView() { 46 | if (mList == null || mList.size() == 0) { 47 | mList.clear(); 48 | } 49 | for (int i = 0; i < 7; i++) { 50 | mList.add(new ProjectItem.DataBean.Datas("", "", "", "")); 51 | } 52 | mView.setEmptyContent(mList, StringUtils.TYPE_PROJECT_ITEM_LOAD); 53 | } 54 | 55 | @Override 56 | public void initProjectData(int flag, int page) { 57 | mTask.execute(this, flag, page, ID); 58 | } 59 | 60 | @Override 61 | public void collectArticle(int ID, boolean isCollect, int position) { 62 | if (SPUtils.getInstance("userinfo").getBoolean("isLogin")) { 63 | if (isCollect) { 64 | mTask.execute(this, StringUtils.TYPE_COLLECT_NO, ID, position); 65 | } else { 66 | mTask.execute(this, StringUtils.TYPE_COLLECT_YES, ID, position); 67 | } 68 | } else { 69 | Event event = new Event(); 70 | event.target = Event.TARGET_MAIN; 71 | event.type = Event.TYPE_NEED_LOGIN; 72 | EventBus.getDefault().post(event); 73 | } 74 | } 75 | 76 | @Override 77 | public void getSelectedURL(String URL) { 78 | mView.goWebActivity(URL); 79 | } 80 | 81 | @Override 82 | public void onSuccess(Object data, int...params) { 83 | int position; 84 | switch (params[0]) { 85 | case StringUtils.TYPE_COLLECT_YES: 86 | position = (int) data; 87 | mView.collectedArticle(position, true); 88 | break; 89 | case StringUtils.TYPE_COLLECT_NO: 90 | position = (int) data; 91 | mView.collectedArticle(position, false); 92 | break; 93 | case StringUtils.TYPE_PROJECT_ITEM_LOAD: 94 | case StringUtils.TYPE_PROJECT_ITEM_ADD: 95 | mView.setProjectContent((List)data, params[0]); 96 | break; 97 | } 98 | } 99 | 100 | @Override 101 | public void onStart() { 102 | 103 | } 104 | 105 | @Override 106 | public void onFailed() { 107 | 108 | } 109 | 110 | @Override 111 | public void onError(int code, String msg) { 112 | 113 | } 114 | 115 | @Override 116 | public void onFinish() { 117 | 118 | } 119 | } 120 | -------------------------------------------------------------------------------- /app/src/main/java/com/lzq/wanandroid/presenter/ProjectPresenter.java: -------------------------------------------------------------------------------- 1 | package com.lzq.wanandroid.presenter; 2 | 3 | import com.lzq.wanandroid.api.Contract; 4 | import com.lzq.wanandroid.api.LoadTasksCallBack; 5 | import com.lzq.wanandroid.api.WebTask; 6 | import com.lzq.wanandroid.base.BasePresenter; 7 | import com.lzq.wanandroid.model.ProjectTree; 8 | import com.lzq.wanandroid.utils.StringUtils; 9 | 10 | import java.util.List; 11 | 12 | public class ProjectPresenter extends BasePresenter implements Contract.ProjectPresenter, LoadTasksCallBack> { 13 | private static final String TAG = "WebPresenter"; 14 | private Contract.ProjectView mView; 15 | private WebTask mTask; 16 | 17 | public static ProjectPresenter createPresenter(Contract.ProjectView mView, WebTask mTask) { 18 | return new ProjectPresenter(mView, mTask); 19 | } 20 | 21 | public ProjectPresenter(Contract.ProjectView mView, WebTask mTask) { 22 | this.mView = mView; 23 | this.mTask = mTask; 24 | } 25 | 26 | 27 | @Override 28 | public void initView() { 29 | String[] title = new String[]{"完整项目", "跨平台应用", "资源聚合类", "动画","RV列表动效","项目基础功能"}; 30 | mView.setEmptyTabView(title); 31 | } 32 | 33 | @Override 34 | public void initTabView() { 35 | mTask.execute(this, StringUtils.TYPE_PROJECT_TREE); 36 | } 37 | 38 | @Override 39 | public void initProjectData() { 40 | 41 | } 42 | 43 | @Override 44 | public void onSuccess(List data,int...params) { 45 | switch (params[0]) { 46 | case StringUtils.TYPE_PROJECT_TREE: 47 | mView.setTabView(data); 48 | break; 49 | } 50 | } 51 | 52 | @Override 53 | public void onStart() { 54 | 55 | } 56 | 57 | @Override 58 | public void onFailed() { 59 | 60 | } 61 | 62 | @Override 63 | public void onError(int code, String msg) { 64 | 65 | } 66 | 67 | @Override 68 | public void onFinish() { 69 | 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /app/src/main/java/com/lzq/wanandroid/presenter/SearchPresenter.java: -------------------------------------------------------------------------------- 1 | package com.lzq.wanandroid.presenter; 2 | 3 | import com.blankj.utilcode.util.SPUtils; 4 | import com.lzq.wanandroid.api.Contract; 5 | import com.lzq.wanandroid.api.LoadTasksCallBack; 6 | import com.lzq.wanandroid.base.BasePresenter; 7 | import com.lzq.wanandroid.model.Data; 8 | import com.lzq.wanandroid.api.WebTask; 9 | import com.lzq.wanandroid.model.Event; 10 | import com.lzq.wanandroid.model.SearchResult; 11 | import com.lzq.wanandroid.utils.StringUtils; 12 | 13 | import org.greenrobot.eventbus.EventBus; 14 | 15 | import java.util.ArrayList; 16 | import java.util.List; 17 | 18 | public class SearchPresenter extends BasePresenter implements Contract.SearchPresenter, LoadTasksCallBack { 19 | private Contract.SearchView mView; 20 | private WebTask mTask; 21 | 22 | public SearchPresenter(Contract.SearchView mView, WebTask mTask) { 23 | this.mView = mView; 24 | this.mTask = mTask; 25 | } 26 | 27 | public static SearchPresenter createPresenter(Contract.SearchView mView, WebTask mTask) { 28 | return new SearchPresenter(mView, mTask); 29 | } 30 | 31 | 32 | @Override 33 | public void getHotKey() { 34 | mTask.execute(this, StringUtils.TYPE_HOT_KEY); 35 | } 36 | 37 | @Override 38 | public void initView() { 39 | List mList=new ArrayList(); 40 | for (int i = 0; i < 7; i++) { 41 | mList.add(new SearchResult.DataBean.Datas()); 42 | } 43 | mView.initView(mList); 44 | } 45 | 46 | @Override 47 | public void getHotKeyContent(String hotkeys,int page) { 48 | mTask.execute(this,StringUtils.TYPE_HOTKEY_CONTENT_LOAD,hotkeys,String.valueOf(page)); 49 | } 50 | @Override 51 | public void addHotKeyContent(String hotkeys,int page) { 52 | mTask.execute(this,StringUtils.TYPE_HOTKEY_CONTENT_ADD,hotkeys,String.valueOf(page)); 53 | } 54 | 55 | @Override 56 | public void collectArticle(int ID, boolean isCollect, int position) { 57 | if (SPUtils.getInstance("userinfo").getBoolean("isLogin")) { 58 | if (isCollect) { 59 | mTask.execute(this, StringUtils.TYPE_COLLECT_NO, ID, position); 60 | } else { 61 | mTask.execute(this, StringUtils.TYPE_COLLECT_YES, ID, position); 62 | } 63 | } else { 64 | Event event = new Event(); 65 | event.target = Event.TARGET_MAIN; 66 | event.type = Event.TYPE_NEED_LOGIN; 67 | EventBus.getDefault().post(event); 68 | } 69 | } 70 | 71 | @Override 72 | public void getSelectedURL(String URL) { 73 | mView.goWebActivity(URL); 74 | } 75 | 76 | @Override 77 | public void onSuccess(Object o,int...params) { 78 | switch (params[0]) { 79 | case StringUtils.TYPE_COLLECT_NO: 80 | int position = (int) o; 81 | mView.collectedArticle(position, false); 82 | break; 83 | case StringUtils.TYPE_COLLECT_YES: 84 | position = (int) o; 85 | mView.collectedArticle(position, true); 86 | break; 87 | case StringUtils.TYPE_HOT_KEY_CONTENT_ADD: 88 | case StringUtils.TYPE_HOT_KEY_CONTENT_LOAD: 89 | SearchResult.DataBean dataBean= (SearchResult.DataBean) o; 90 | if (dataBean.getCurPage()!=0&&dataBean.getDatas()!=null){ 91 | mView.setHotKeyContent(params[0],dataBean.getDatas()); 92 | } 93 | break; 94 | case StringUtils.TYPE_HOT_KEY: 95 | List mList = (List) o; 96 | if (mList.size() != 0 || mList != null) { 97 | String[] keys = new String[mList.size()]; 98 | for (int i = 0; i < mList.size(); i++) { 99 | keys[i] = mList.get(i).getName(); 100 | } 101 | mView.setHotKey(keys); 102 | } 103 | break; 104 | } 105 | } 106 | 107 | @Override 108 | public void onStart() { 109 | 110 | } 111 | 112 | @Override 113 | public void onFailed() { 114 | 115 | } 116 | 117 | @Override 118 | public void onError(int code, String msg) { 119 | 120 | } 121 | 122 | @Override 123 | public void onFinish() { 124 | 125 | } 126 | } 127 | -------------------------------------------------------------------------------- /app/src/main/java/com/lzq/wanandroid/presenter/SettingPresenter.java: -------------------------------------------------------------------------------- 1 | package com.lzq.wanandroid.presenter; 2 | 3 | import android.content.Context; 4 | import android.content.pm.PackageInfo; 5 | import android.content.pm.PackageManager; 6 | 7 | import com.blankj.utilcode.util.SPUtils; 8 | import com.lzq.wanandroid.api.Contract; 9 | import com.lzq.wanandroid.base.BasePresenter; 10 | import com.lzq.wanandroid.utils.StringUtils; 11 | import com.lzy.okgo.OkGo; 12 | import com.lzy.okgo.cookie.store.CookieStore; 13 | 14 | import okhttp3.HttpUrl; 15 | 16 | public class SettingPresenter extends BasePresenter implements Contract.SettingPresenter { 17 | private static final String TAG = "SettingPresenter"; 18 | private Contract.SettingView mView; 19 | private Context mContext; 20 | 21 | public SettingPresenter(Contract.SettingView mView, Context mContext) { 22 | this.mView = mView; 23 | this.mContext=mContext; 24 | } 25 | 26 | public static SettingPresenter createPresenter(Contract.SettingView mView, Context mContext) { 27 | return new SettingPresenter(mView,mContext); 28 | } 29 | 30 | 31 | @Override 32 | public void getVersion() { 33 | try { 34 | // 获取packagemanager的实例 35 | PackageManager packageManager = mContext.getPackageManager(); 36 | // getPackageName()是你当前类的包名,0代表是获取版本信息 37 | PackageInfo packInfo = packageManager.getPackageInfo(mContext.getPackageName(), 0); 38 | String version = packInfo.versionName; 39 | mView.setVersion(version); 40 | } catch (Exception e) { 41 | } 42 | } 43 | 44 | @Override 45 | public void changeDisplayMode(boolean flag) { 46 | SPUtils.getInstance(StringUtils.CONFIG_SETTINGS).put(StringUtils.KEY_NIGHT_MODE, flag); 47 | mView.afterChangeMode(); 48 | } 49 | 50 | @Override 51 | public void Logout() { 52 | SPUtils.getInstance("userinfo").put("isLogin",false); 53 | SPUtils.getInstance("userinfo").put("username","游客"); 54 | SPUtils.getInstance("userinfo").put("id","******"); 55 | 56 | HttpUrl httpUrl = HttpUrl.parse(StringUtils.URL); 57 | CookieStore cookieStore = OkGo.getInstance().getCookieJar().getCookieStore(); 58 | cookieStore.removeCookie(httpUrl); 59 | mView.afterLogout(); 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /app/src/main/java/com/lzq/wanandroid/presenter/SystemPresenter.java: -------------------------------------------------------------------------------- 1 | package com.lzq.wanandroid.presenter; 2 | 3 | import com.lzq.wanandroid.api.Contract; 4 | import com.lzq.wanandroid.base.BasePresenter; 5 | import com.lzq.wanandroid.R; 6 | 7 | public class SystemPresenter extends BasePresenter implements Contract.SystemPresenter { 8 | private Contract.SystemView mView; 9 | 10 | 11 | public SystemPresenter(Contract.SystemView mView) { 12 | this.mView = mView; 13 | } 14 | 15 | public static SystemPresenter createPresenter(Contract.SystemView mView) { 16 | return new SystemPresenter(mView); 17 | } 18 | 19 | 20 | @Override 21 | public void initTabView() { 22 | String[] titleName = {"导航", "知识体系"}; 23 | int[] imgTab = {R.mipmap.navi, R.mipmap.tree_knowledge}; 24 | mView.setTabView(titleName, imgTab); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/java/com/lzq/wanandroid/presenter/TitlePresenter.java: -------------------------------------------------------------------------------- 1 | package com.lzq.wanandroid.presenter; 2 | 3 | import com.lzq.wanandroid.api.WebTask; 4 | import com.lzq.wanandroid.base.BasePresenter; 5 | import com.lzq.wanandroid.model.Children; 6 | import com.lzq.wanandroid.utils.StringUtils; 7 | import com.lzq.wanandroid.api.OffAccountContract; 8 | import com.lzq.wanandroid.api.LoadTasksCallBack; 9 | import com.lzq.wanandroid.model.Data; 10 | 11 | import java.util.ArrayList; 12 | import java.util.List; 13 | 14 | public class TitlePresenter extends BasePresenter implements OffAccountContract.AccountTitlePresenter, LoadTasksCallBack> { 15 | private static final String TAG = "TitlePresenter"; 16 | private WebTask mTask; 17 | private OffAccountContract.AccountTitleView mView; 18 | private List mList = new ArrayList<>(); 19 | 20 | public TitlePresenter(OffAccountContract.AccountTitleView mView, WebTask mTask) { 21 | this.mView = mView; 22 | this.mTask = mTask; 23 | } 24 | 25 | @Override 26 | public void onSuccess(List mList, int...params) { 27 | switch (params[0]) { 28 | case StringUtils.TYPE_ACCOUNT_TITLE: 29 | mView.setTitleText(mList); 30 | break; 31 | } 32 | } 33 | 34 | @Override 35 | public void onStart() { 36 | 37 | } 38 | 39 | @Override 40 | public void onFailed() { 41 | 42 | } 43 | 44 | @Override 45 | public void onError(int code, String msg) { 46 | 47 | } 48 | 49 | @Override 50 | public void onFinish() { 51 | 52 | } 53 | 54 | 55 | @Override 56 | public void initView(String[] tabName) { 57 | if (mList == null || mList.size() == 0) { 58 | mList.clear(); 59 | } 60 | for (int i = 0; i < tabName.length; i++) { 61 | mList.add(new Data("", "", "", "", tabName[i])); 62 | } 63 | mView.setAccountEmptyTitle(mList); 64 | } 65 | 66 | @Override 67 | public void initView(int position, String[] tabName, int[] tabID) { 68 | List mList=new ArrayList<>(); 69 | for (int i = 0; i < tabID.length; i++) { 70 | mList.add(new Children(tabID[i],tabName[i])); 71 | } 72 | mView.setArticlesContent(position,mList); 73 | } 74 | 75 | @Override 76 | public void getTitleText(int type) { 77 | mTask.execute(this,type); 78 | } 79 | 80 | @Override 81 | public void getContent(int ID, int page) { 82 | } 83 | 84 | } 85 | -------------------------------------------------------------------------------- /app/src/main/java/com/lzq/wanandroid/presenter/TreePresenter.java: -------------------------------------------------------------------------------- 1 | package com.lzq.wanandroid.presenter; 2 | 3 | import com.lzq.wanandroid.api.Contract; 4 | import com.lzq.wanandroid.base.BasePresenter; 5 | import com.lzq.wanandroid.db.Tree; 6 | import com.lzq.wanandroid.api.LoadTasksCallBack; 7 | import com.lzq.wanandroid.model.Data; 8 | import com.lzq.wanandroid.api.WebTask; 9 | import com.lzq.wanandroid.utils.StringUtils; 10 | 11 | import org.litepal.LitePal; 12 | 13 | import java.util.ArrayList; 14 | import java.util.List; 15 | 16 | public class TreePresenter extends BasePresenter implements Contract.TreePresenter, LoadTasksCallBack { 17 | private static final String TAG = "TreePresenter"; 18 | private Contract.TreeView mView; 19 | private WebTask mTask; 20 | 21 | public static TreePresenter createPresenter(Contract.TreeView mView, WebTask mTask) { 22 | return new TreePresenter(mView, mTask); 23 | } 24 | 25 | public TreePresenter(Contract.TreeView mView, WebTask mTask) { 26 | this.mView = mView; 27 | this.mTask = mTask; 28 | } 29 | 30 | @Override 31 | public void initView(int type) { 32 | //先搜索数据库,没数据再联网 33 | int count = LitePal.where("type=?", String.valueOf(type)).count("Tree"); 34 | if (count != 0) { 35 | //有数据 36 | List data = LitePal.where("type=?", String.valueOf(type)).find(Tree.class); 37 | List mList = new ArrayList<>(); 38 | for (int i = 0; i < data.size(); i++) { 39 | mList.add(new Data(data.get(i).getParentID(), data.get(i).getName())); 40 | } 41 | mView.initDataList(type, mList); 42 | } 43 | //无数据 44 | mView.onlineLoad(type); 45 | } 46 | 47 | @Override 48 | public void loadOnline(int type) { 49 | mTask.execute(this, type); 50 | } 51 | 52 | @Override 53 | public void getSelectedURL(String URL) { 54 | mView.goWebActivity(URL); 55 | } 56 | 57 | @Override 58 | public void onSuccess(Object o, final int...params) { 59 | final List data = (List) o; 60 | new Thread(new Runnable() { 61 | @Override 62 | public void run() { 63 | Tree tree = null; 64 | LitePal.deleteAll(Tree.class, "type=?", String.valueOf(params[0])); 65 | switch (params[0]) { 66 | case StringUtils.TYPE_TREE_NAVI: 67 | for (int i = 0; i < data.size(); i++) { 68 | tree = new Tree(data.get(i).getCid(), data.get(i).getName(), params[0]); 69 | tree.save(); 70 | } 71 | break; 72 | case StringUtils.TYPE_TREE_KNOW: 73 | for (int i = 0; i < data.size(); i++) { 74 | tree = new Tree(data.get(i).getId(), data.get(i).getName(), params[0]); 75 | tree.save(); 76 | } 77 | break; 78 | } 79 | } 80 | }).start(); 81 | mView.onLoadTreeData(params[0], data); 82 | mView.onFinishLoad(); 83 | } 84 | 85 | @Override 86 | public void onStart() { 87 | 88 | } 89 | 90 | @Override 91 | public void onFailed() { 92 | 93 | } 94 | 95 | @Override 96 | public void onError(int code, String msg) { 97 | 98 | } 99 | 100 | @Override 101 | public void onFinish() { 102 | 103 | } 104 | 105 | } 106 | -------------------------------------------------------------------------------- /app/src/main/java/com/lzq/wanandroid/presenter/UserPresenter.java: -------------------------------------------------------------------------------- 1 | package com.lzq.wanandroid.presenter; 2 | 3 | import com.blankj.utilcode.util.SPUtils; 4 | import com.lzq.wanandroid.api.Contract; 5 | import com.lzq.wanandroid.base.BasePresenter; 6 | import com.lzq.wanandroid.R; 7 | 8 | public class UserPresenter extends BasePresenter implements Contract.UserPresenter { 9 | private static final String TAG = "UserPresenter"; 10 | private Contract.UserView mView; 11 | 12 | public UserPresenter(Contract.UserView mView) { 13 | this.mView = mView; 14 | } 15 | 16 | public static UserPresenter createPresenter(Contract.UserView mView) { 17 | return new UserPresenter(mView); 18 | } 19 | 20 | @Override 21 | public void initView() { 22 | if (SPUtils.getInstance("userinfo").getBoolean("isLogin")){ 23 | mView.setUserInfo(SPUtils.getInstance("userinfo").getString("id"),SPUtils.getInstance("userinfo").getString("username")); 24 | }else { 25 | mView.setUserInfo("******","游客"); 26 | } 27 | } 28 | 29 | @Override 30 | public void initTabView() { 31 | String[] tabName={"收藏","ToDo"}; 32 | int[] imgTab={R.mipmap.collect,R.mipmap.todo}; 33 | mView.setTabView(tabName,imgTab); 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /app/src/main/java/com/lzq/wanandroid/presenter/WebPresenter.java: -------------------------------------------------------------------------------- 1 | package com.lzq.wanandroid.presenter; 2 | 3 | import com.lzq.wanandroid.api.WebContract; 4 | import com.lzq.wanandroid.base.BasePresenter; 5 | 6 | public class WebPresenter extends BasePresenter implements WebContract.Presenter { 7 | private static final String TAG = "WebPresenter"; 8 | private WebContract.View mView; 9 | 10 | public static WebPresenter createPresenter(WebContract.View mView) { 11 | return new WebPresenter(mView); 12 | } 13 | 14 | public WebPresenter(WebContract.View mView) { 15 | this.mView = mView; 16 | } 17 | 18 | 19 | @Override 20 | public void getContent(String URL) { 21 | mView.setContent(URL); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main/java/com/lzq/wanandroid/service/InitService.java: -------------------------------------------------------------------------------- 1 | package com.lzq.wanandroid.service; 2 | 3 | import android.Manifest; 4 | import android.app.IntentService; 5 | import android.content.Context; 6 | import android.content.Intent; 7 | import android.support.annotation.Nullable; 8 | 9 | import com.lzq.wanandroid.R; 10 | import com.qw.soul.permission.SoulPermission; 11 | import com.qw.soul.permission.bean.Permission; 12 | import com.tencent.bugly.Bugly; 13 | import com.tencent.bugly.beta.Beta; 14 | import com.tencent.smtt.sdk.QbSdk; 15 | 16 | public class InitService extends IntentService { 17 | private static final String TAG = "INIT"; 18 | /** 19 | * Creates an IntentService. Invoked by your subclass's constructor. 20 | * 21 | * @param name Used to name the worker thread, important only for debugging. 22 | */ 23 | 24 | private static final String ACTION_INIT_WHEN_APP_CREATE = "com.lzq.wanandroid.Service.action.INIT"; 25 | 26 | public InitService() { 27 | super(ACTION_INIT_WHEN_APP_CREATE); 28 | } 29 | 30 | public static void start(Context context) { 31 | Intent intent = new Intent(context, InitService.class); 32 | intent.setAction(ACTION_INIT_WHEN_APP_CREATE); 33 | context.startService(intent); 34 | } 35 | 36 | private void performInit() { 37 | initPermission(); 38 | //SDK初始化的操作 39 | QbSdk.initX5Environment(this, null); 40 | Bugly.init(this, "2aa3615a5e", false); 41 | Beta.autoInit = true; 42 | Beta.initDelay = 3000; 43 | Beta.largeIconId = R.mipmap.icon_launcher; 44 | } 45 | 46 | private boolean checkPermission() { 47 | Permission checkResult = SoulPermission.getInstance().checkSinglePermission(Manifest.permission.WRITE_EXTERNAL_STORAGE); 48 | return checkResult.isGranted() ? true : false; 49 | } 50 | 51 | private void initPermission() { 52 | 53 | 54 | 55 | } 56 | 57 | 58 | @Override 59 | protected void onHandleIntent(@Nullable Intent intent) { 60 | if (intent != null) { 61 | final String action = intent.getAction(); 62 | if (ACTION_INIT_WHEN_APP_CREATE.equals(action)) { 63 | performInit(); 64 | } 65 | } 66 | } 67 | 68 | 69 | } 70 | -------------------------------------------------------------------------------- /app/src/main/java/com/lzq/wanandroid/utils/ActivityUtils.java: -------------------------------------------------------------------------------- 1 | package com.lzq.wanandroid.utils; 2 | 3 | import android.support.v4.app.Fragment; 4 | import android.support.v4.app.FragmentManager; 5 | import android.support.v4.app.FragmentTransaction; 6 | 7 | public class ActivityUtils { 8 | private static FragmentManager fm; 9 | private static ActivityUtils INSTANCE; 10 | 11 | private ActivityUtils() { 12 | } 13 | 14 | public static ActivityUtils getInstance() { 15 | if (INSTANCE == null) { 16 | INSTANCE = new ActivityUtils(); 17 | } 18 | return INSTANCE; 19 | } 20 | 21 | public static void addFragmentToActivity(FragmentManager fm, Fragment fragment, int id) { 22 | FragmentTransaction transaction = fm.beginTransaction(); 23 | if (fragment.isAdded()) { 24 | transaction.show(fragment).commitAllowingStateLoss(); 25 | } else { 26 | transaction.add(id, fragment); 27 | transaction.commitAllowingStateLoss(); 28 | } 29 | } 30 | 31 | public static FragmentManager getFragmentManager() { 32 | return fm; 33 | } 34 | 35 | } 36 | -------------------------------------------------------------------------------- /app/src/main/java/com/lzq/wanandroid/utils/FitUtil.java: -------------------------------------------------------------------------------- 1 | package com.lzq.wanandroid.utils; 2 | 3 | import android.app.Activity; 4 | import android.content.Context; 5 | import android.util.DisplayMetrics; 6 | import android.util.Log; 7 | import android.view.WindowManager; 8 | 9 | public class FitUtil { 10 | private static final String TAG = "FitUtil"; 11 | 12 | /** 13 | * 创 建: lt 2018/8/15--14:45 14 | * 作 用: 使用并优化今日头条的适配方案的工具类 15 | * 注意事项: 在Activity的onCreate里,并在setContextView之上调用,可以直接放在Base里 16 | */ 17 | 18 | private static float width = 720;//todo 手动设置为设计图的宽(px),适配将根据宽为基准,也可以设置高,但是推荐设置宽,如果不需要px=dp则不设置也行 19 | private static int dpi = 420;//todo 手动设置设计图的dpi,一般 xhdpi是宽/2 xxhdpi 是宽/3 20 | private static float nativeWidth = 0;//真实屏幕的宽,不需要手动改 21 | private Activity activity; 22 | /** 23 | * 在Activity的onCreate中调用,修改该Activity的density,即可完成适配,使用宽高直接使用设计图上px相等的dp值 24 | * 25 | * @param activity 需要改变的Activity 26 | * @param isPxEqualsDp 是否需要设置为设计图上的px直接在xml上写dp值(意思就是不需要自己计算dp值,直接写设计图上的px值,并改单位为dp),但开启后可能需要手动去设置ToolBar的大小,如果不用可以忽略 27 | */ 28 | public static void autoFit(Activity activity, boolean isPxEqualsDp) { 29 | if (nativeWidth == 0) { 30 | nativeWidth = activity.getWindowManager().getDefaultDisplay().getWidth(); 31 | } 32 | DisplayMetrics displayMetrics = activity.getResources().getDisplayMetrics(); 33 | dpi= displayMetrics.densityDpi; 34 | displayMetrics.density = isPxEqualsDp ? nativeWidth / dpi / (width / dpi) : nativeWidth / dpi; 35 | displayMetrics.densityDpi = (int) (displayMetrics.density * 160); 36 | } 37 | 38 | public static void getAndroiodScreenProperty(Activity activity) { 39 | 40 | WindowManager wm = (WindowManager)activity.getSystemService(Context.WINDOW_SERVICE); 41 | DisplayMetrics dm = new DisplayMetrics(); 42 | wm.getDefaultDisplay().getMetrics(dm); 43 | int width = dm.widthPixels; // 屏幕宽度(像素) 44 | int height = dm.heightPixels; // 屏幕高度(像素) 45 | float density = dm.density; // 屏幕密度(0.75 / 1.0 / 1.5) 46 | int densityDpi = dm.densityDpi; // 屏幕密度dpi(120 / 160 / 240) 47 | // 屏幕宽度算法:屏幕宽度(像素)/屏幕密度 48 | int screenWidth = (int) (width / density); // 屏幕宽度(dp) 49 | int screenHeight = (int) (height / density);// 屏幕高度(dp) 50 | 51 | 52 | Log.d(TAG, "----屏幕宽度(像素):" + width); 53 | Log.d(TAG, "----屏幕高度(像素):" + height); 54 | Log.d(TAG, "----屏幕密度(0.75 / 1.0 / 1.5):" + density); 55 | Log.d(TAG, "----屏幕密度dpi(120 / 160 / 240):" + densityDpi); 56 | Log.d(TAG, "----屏幕宽度(dp):" + screenWidth); 57 | Log.d(TAG, "----屏幕高度(dp):" + screenHeight); 58 | } 59 | 60 | } -------------------------------------------------------------------------------- /app/src/main/java/com/lzq/wanandroid/utils/GlideImageLoader.java: -------------------------------------------------------------------------------- 1 | package com.lzq.wanandroid.utils; 2 | 3 | import android.content.Context; 4 | import android.view.LayoutInflater; 5 | import android.view.View; 6 | import android.widget.ImageView; 7 | 8 | import com.bumptech.glide.Glide; 9 | import com.lzq.wanandroid.model.Data; 10 | import com.lzq.wanandroid.R; 11 | import com.ms.banner.holder.BannerViewHolder; 12 | 13 | import butterknife.BindView; 14 | import butterknife.ButterKnife; 15 | 16 | public class GlideImageLoader implements BannerViewHolder { 17 | private static final String TAG = "GlideImageLoader"; 18 | @BindView(R.id.rv_home_img) 19 | ImageView mImgView; 20 | 21 | 22 | @Override 23 | public View createView(Context context) { 24 | View view = LayoutInflater.from(context).inflate(R.layout.rv_home_img_item, null); 25 | ButterKnife.bind(this, view); 26 | return view; 27 | } 28 | 29 | @Override 30 | public void onBind(Context context, int position, Data data) { 31 | //Glide 加载图片简单用法 32 | Glide.with(context).load(data.getImagePath()).into(mImgView); 33 | } 34 | 35 | } 36 | -------------------------------------------------------------------------------- /app/src/main/java/com/lzq/wanandroid/utils/StringUtils.java: -------------------------------------------------------------------------------- 1 | package com.lzq.wanandroid.utils; 2 | 3 | public class StringUtils { 4 | 5 | public static final int RV_ITEM_NORMAL=0; 6 | public static final int RV_ITEM_IMG=1; 7 | 8 | public static final String URL = "https://www.wanandroid.com/"; 9 | public static final String PROJECT_LOAD="project/list/";//1/json?cid=294 10 | public static final String PROJECT_TREE="project/tree/json"; 11 | public static final String TREE_ARTICLES="article/list/";///+ID/json?cid=60"; 12 | public static final String NAVI = "navi/json"; 13 | public static final String TREE = "tree/json"; 14 | public static final String HOT_KEY = "/hotkey/json"; 15 | public static final String HOT_KEY_CONTENT = "article/query/"; //0/json 16 | public static final String COLLECT_LIST = "lg/collect/list/"; 17 | public static final String COLLECT_ARTICCLE = "lg/collect/"; 18 | public static final String CANCEL_COLLECT = "lg/uncollect_originId/"; 19 | public static final String CANCEL_COLLECT_USER = "lg/uncollect/"; 20 | public static final String HOME_MORE_ARTICLE = "article/list/";//article/list/0/json 21 | public static final String HOME_TOP_ARTICLE = "article/top/json"; 22 | public static final String HOME_IMG_BANNER = "banner/json"; 23 | public static final String OFFICIAL_ACCOUNT = "wxarticle/chapters/json"; 24 | public static final String OFFICIAL_CONTENT = "/wxarticle/list/"; 25 | public static final String USER_LOGIN = "/user/login"; 26 | public static final String USER_REGISTER = "/user/register"; 27 | public static final String USER_LOGOUT = "/user/logout/json"; 28 | 29 | 30 | public static final int TYPE_HOME_TOP_ARTICLE = 0; 31 | public static final int TYPE_HOME_IMG_BANNER = 1; 32 | public static final int TYPE_HOME_MORE_ARTICLE_LOAD = 2; 33 | public static final int TYPE_COLLECT_YES = 3; 34 | public static final int TYPE_COLLECT_NO = 4; 35 | public static final int TYPE_ACCOUNT_TITLE = 5; 36 | public static final int TYPE_ACCOUNT_CONTENT_LOAD = 6; 37 | public static final int TYPE_ACCOUNT_CONTENT_ADD = 7; 38 | public static final int TYPE_COLLECT_CONTENT_LOAD = 8; 39 | public static final int TYPE_COLLECT_CONTENT_ADD = 9; 40 | public static final int TYPE_COLLECT_NO_USER = 10; 41 | public static final int TYPE_HOT_KEY = 11; 42 | public static final int TYPE_TREE = 12; 43 | public static final int TYPE_TREE_NAVI = 13; 44 | public static final int TYPE_TREE_KNOW = 14; 45 | public static final int TYPE_TREE_KNOW_ARTICLES = 15; 46 | public static final int TYPE_TREE_KNOW_ARTICLES_TITLE = 16; 47 | public static final int TYPE_TREE_KNOW_ARTICLES_CONTENT = 17; 48 | public static final int TYPE_HOT_KEY_CONTENT_LOAD = 18; 49 | public static final int TYPE_HOT_KEY_CONTENT_ADD = 19; 50 | public static final int TYPE_PROJECT_ITEM_LOAD = 20; 51 | public static final int TYPE_PROJECT_ITEM_ADD = 21; 52 | public static final int TYPE_PROJECT_TREE = 22; 53 | public static final int TYPE_HOME_MORE_ARTICLE_ADD = 23; 54 | public static final int TYPE_HOME_TOP_COLLECT = 23; 55 | public static final int TYPE_HOME_MORE_COLLECT = 24; 56 | 57 | public static final String TYPE_HOTKEY_CONTENT_LOAD = "HOTKEY_CONTENT_LOAD"; 58 | public static final String TYPE_HOTKEY_CONTENT_ADD = "HOTKEY_CONTENT_ADD"; 59 | public static final String TYPE_IMG_BANNER = "IMGBANNER"; 60 | public static final String TYPE_TOP_ARTICLE = "TOPARTICLE"; 61 | public static final String TYPE_MORE_ARTICLE = "MOREARTICLE"; 62 | public static final String TYPE_LOGIN = "LOGIN"; 63 | public static final String TYPE_REGISTER = "REGISTER"; 64 | public static final String CONFIG_SETTINGS = "settings"; 65 | public static final String KEY_NIGHT_MODE = "night_mode"; 66 | 67 | } 68 | -------------------------------------------------------------------------------- /app/src/main/java/com/lzq/wanandroid/view/SearchActivity.java: -------------------------------------------------------------------------------- 1 | package com.lzq.wanandroid.view; 2 | 3 | import android.content.Intent; 4 | import android.os.Bundle; 5 | import android.text.TextUtils; 6 | import android.view.LayoutInflater; 7 | import android.view.View; 8 | import android.widget.ImageButton; 9 | import android.widget.TextView; 10 | 11 | import com.gyf.immersionbar.ImmersionBar; 12 | import com.lzq.wanandroid.base.BaseActivity; 13 | import com.lzq.wanandroid.api.Contract; 14 | import com.lzq.wanandroid.api.WebTask; 15 | import com.lzq.wanandroid.model.SearchResult; 16 | import com.lzq.wanandroid.presenter.SearchPresenter; 17 | import com.lzq.wanandroid.R; 18 | import com.lzq.wanandroid.view.custom.ClearEditText; 19 | import com.zhy.view.flowlayout.FlowLayout; 20 | import com.zhy.view.flowlayout.TagAdapter; 21 | import com.zhy.view.flowlayout.TagFlowLayout; 22 | 23 | import java.util.List; 24 | 25 | import butterknife.BindView; 26 | import butterknife.ButterKnife; 27 | import butterknife.OnClick; 28 | 29 | public class SearchActivity extends BaseActivity implements Contract.SearchView { 30 | private static final String TAG = "SearchActivity"; 31 | @BindView(R.id.search_edt) 32 | ClearEditText mSearchEdt; 33 | @BindView(R.id.search_flowlayout) 34 | TagFlowLayout mFlowLayout; 35 | @BindView(R.id.search_imgbtn) 36 | ImageButton mSearchBtn; 37 | private Contract.SearchPresenter mPresenter; 38 | 39 | @Override 40 | protected void onCreate(Bundle savedInstanceState) { 41 | super.onCreate(savedInstanceState); 42 | setContentView(R.layout.activity_search); 43 | ButterKnife.bind(this); 44 | ImmersionBar.with(this).statusBarColor(R.color.bg_daily_mode).autoDarkModeEnable(true).fitsSystemWindows(true).keyboardEnable(true).init(); 45 | if (mPresenter == null) { 46 | mPresenter = SearchPresenter.createPresenter(this, WebTask.getInstance()); 47 | } 48 | mPresenter.getHotKey(); 49 | } 50 | 51 | @OnClick(R.id.search_imgbtn) 52 | public void doSearch() { 53 | if (!TextUtils.isEmpty(mSearchEdt.getText().toString())) { 54 | Intent intent = new Intent(this, SearchResultActivity.class); 55 | intent.putExtra("HOT_KEY", mSearchEdt.getText().toString()); 56 | startActivity(intent); 57 | finish(); 58 | } 59 | } 60 | 61 | @Override 62 | public void setHotKey(final String[] keys) { 63 | showSoftInputUtil(mSearchEdt); 64 | final LayoutInflater mInflater = LayoutInflater.from(this); 65 | mFlowLayout.setAdapter(new TagAdapter(keys) { 66 | @Override 67 | public View getView(FlowLayout parent, int position, String s) { 68 | 69 | TextView tv = (TextView) mInflater.inflate(R.layout.flow_tv_item, 70 | mFlowLayout, false); 71 | tv.setText(s); 72 | return tv; 73 | } 74 | }); 75 | mFlowLayout.setOnTagClickListener(new TagFlowLayout.OnTagClickListener() { 76 | @Override 77 | public boolean onTagClick(View view, int position, FlowLayout parent) { 78 | if (TextUtils.isEmpty(mSearchEdt.getText().toString())) { 79 | mSearchEdt.setText(keys[position]); 80 | } else { 81 | mSearchEdt.setText(mSearchEdt.getText().append(" " + keys[position])); 82 | } 83 | return true; 84 | } 85 | }); 86 | } 87 | 88 | @Override 89 | public void initView(List data) { 90 | 91 | } 92 | 93 | 94 | @Override 95 | public void setHotKeyContent(int flag,List datas) { 96 | 97 | } 98 | 99 | @Override 100 | public void collectedArticle(int position, boolean isCollect) { 101 | 102 | } 103 | 104 | @Override 105 | public void goWebActivity(String URL) { 106 | 107 | } 108 | 109 | 110 | @Override 111 | public void setPresenter(Contract.SearchPresenter presenter) { 112 | mPresenter = presenter; 113 | } 114 | 115 | @Override 116 | protected void onDestroy() { 117 | super.onDestroy(); 118 | hideSoftInputUtil(); 119 | } 120 | } 121 | -------------------------------------------------------------------------------- /app/src/main/java/com/lzq/wanandroid/view/VersionActivity.java: -------------------------------------------------------------------------------- 1 | package com.lzq.wanandroid.view; 2 | 3 | import android.os.Bundle; 4 | import android.view.View; 5 | 6 | import com.hjq.bar.OnTitleBarListener; 7 | import com.hjq.bar.TitleBar; 8 | import com.lzq.wanandroid.base.BaseActivity; 9 | import com.lzq.wanandroid.R; 10 | 11 | import butterknife.BindView; 12 | import butterknife.ButterKnife; 13 | 14 | public class VersionActivity extends BaseActivity { 15 | @BindView(R.id.ver_titlebar) 16 | TitleBar mTitleBar; 17 | @Override 18 | protected void onCreate(Bundle savedInstanceState) { 19 | super.onCreate(savedInstanceState); 20 | setContentView(R.layout.activity_version); 21 | ButterKnife.bind(this); 22 | mTitleBar.setOnTitleBarListener(new OnTitleBarListener() { 23 | @Override 24 | public void onLeftClick(View v) { 25 | finishActivity(); 26 | } 27 | 28 | @Override 29 | public void onTitleClick(View v) { 30 | 31 | } 32 | 33 | @Override 34 | public void onRightClick(View v) { 35 | 36 | } 37 | }); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /app/src/main/java/com/lzq/wanandroid/view/WebActivity.java: -------------------------------------------------------------------------------- 1 | package com.lzq.wanandroid.view; 2 | 3 | import android.content.Intent; 4 | import android.os.Bundle; 5 | import android.text.TextUtils; 6 | import android.view.View; 7 | import android.view.WindowManager; 8 | 9 | import com.gyf.immersionbar.ImmersionBar; 10 | import com.hjq.bar.OnTitleBarListener; 11 | import com.hjq.bar.TitleBar; 12 | import com.lzq.wanandroid.base.BaseActivity; 13 | import com.lzq.wanandroid.api.WebContract; 14 | import com.lzq.wanandroid.presenter.WebPresenter; 15 | import com.lzq.wanandroid.R; 16 | import com.lzq.wanandroid.view.custom.ProgressWebview; 17 | import com.tencent.smtt.sdk.WebView; 18 | import com.tencent.smtt.sdk.WebViewClient; 19 | 20 | import java.util.ArrayList; 21 | 22 | import butterknife.BindView; 23 | import butterknife.ButterKnife; 24 | 25 | public class WebActivity extends BaseActivity implements WebContract.View { 26 | @BindView(R.id.web_titlebar) 27 | TitleBar mTitleBar; 28 | @BindView(R.id.web_x5_view) 29 | ProgressWebview mWebView; 30 | private WebContract.Presenter mPresenter; 31 | 32 | @Override 33 | protected void onCreate(Bundle savedInstanceState) { 34 | super.onCreate(savedInstanceState); 35 | setContentView(R.layout.activity_web); 36 | ButterKnife.bind(this); 37 | if (mPresenter == null) { 38 | mPresenter = WebPresenter.createPresenter(this); 39 | } 40 | initData(); 41 | initView(); 42 | 43 | } 44 | 45 | private void initData() { 46 | Intent intent = getIntent(); 47 | String URL = intent.getStringExtra("URL"); 48 | if (TextUtils.isEmpty(URL)) { 49 | URL = "http://www.baidu.com"; 50 | } 51 | mPresenter.getContent(URL); 52 | } 53 | 54 | 55 | private void initView() { 56 | mTitleBar.setOnTitleBarListener(new OnTitleBarListener() { 57 | @Override 58 | public void onLeftClick(View v) { 59 | if (mWebView.canGoBack()) { 60 | mWebView.goBack(); 61 | } else { 62 | finishActivity(); 63 | } 64 | } 65 | 66 | @Override 67 | public void onTitleClick(View v) { 68 | 69 | } 70 | 71 | @Override 72 | public void onRightClick(View v) { 73 | finishActivity(); 74 | } 75 | }); 76 | ImmersionBar.with(this).statusBarColor(R.color.bg_daily_mode).autoDarkModeEnable(true).fitsSystemWindows(true).keyboardEnable(true).init(); 77 | getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE | WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN); 78 | getWindow().getDecorView().addOnLayoutChangeListener(new View.OnLayoutChangeListener() { 79 | @Override 80 | public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { 81 | ArrayList outView = new ArrayList(); 82 | getWindow().getDecorView().findViewsWithText(outView, "QQ浏览器", View.FIND_VIEWS_WITH_TEXT); 83 | int size = outView.size(); 84 | if (outView != null && outView.size() > 0) { 85 | outView.get(0).setVisibility(View.GONE); 86 | } 87 | } 88 | }); 89 | mWebView.setWebViewClient(new WebViewClient() { 90 | @Override 91 | public boolean shouldOverrideUrlLoading(WebView webView, String s) { 92 | webView.loadUrl(s); 93 | return true; 94 | } 95 | }); 96 | } 97 | 98 | 99 | @Override 100 | public void setPresenter(WebContract.Presenter presenter) { 101 | mPresenter = presenter; 102 | } 103 | 104 | @Override 105 | public void setContent(String URL) { 106 | mWebView.getSettings().setJavaScriptEnabled(true); //设置WebView属性,运行执行js脚本 107 | mWebView.loadUrl(URL); //调用loadUrl方法为WebView加入链接 108 | } 109 | 110 | 111 | @Override 112 | public void onBackPressed() { 113 | if (mWebView.canGoBack()) { 114 | mWebView.goBack(); 115 | } else { 116 | finishActivity(); 117 | } 118 | } 119 | } 120 | -------------------------------------------------------------------------------- /app/src/main/java/com/lzq/wanandroid/view/adapter/ArticleAdapter.java: -------------------------------------------------------------------------------- 1 | package com.lzq.wanandroid.view.adapter; 2 | 3 | import android.support.annotation.Nullable; 4 | import android.text.TextUtils; 5 | import android.view.View; 6 | 7 | import com.chad.library.adapter.base.BaseQuickAdapter; 8 | import com.chad.library.adapter.base.BaseViewHolder; 9 | import com.lzq.wanandroid.model.Data; 10 | import com.lzq.wanandroid.R; 11 | import com.lzq.wanandroid.utils.StringUtils; 12 | 13 | import java.util.List; 14 | 15 | import butterknife.BindColor; 16 | import butterknife.ButterKnife; 17 | 18 | public class ArticleAdapter extends BaseQuickAdapter { 19 | @BindColor(R.color.bg_rv_item_tv) 20 | int bg_rv_item_tv; 21 | private int type; 22 | 23 | public ArticleAdapter(View view, int type, @Nullable List data) { 24 | super(data); 25 | this.type = type; 26 | } 27 | 28 | public ArticleAdapter(View view, int type, int layoutResId, @Nullable List data) { 29 | super(layoutResId, data); 30 | this.type = type; 31 | ButterKnife.bind(view); 32 | } 33 | 34 | @Override 35 | protected void convert(BaseViewHolder helper, Data item) { 36 | switch (type) { 37 | case StringUtils.RV_ITEM_NORMAL: 38 | if (TextUtils.isEmpty(item.getAuthor())) { 39 | return; 40 | } else { 41 | helper.setText(R.id.rv_article_title, item.getTitle().replace("—","——").replace(""","\"")); 42 | helper.setText(R.id.rv_article_author, item.getAuthor()); 43 | helper.setText(R.id.rv_article_super_chapter, item.getSuperChapterName()); 44 | helper.setText(R.id.rv_article_chapter, "/" + item.getChapterName()); 45 | helper.setText(R.id.rv_article_date, item.getNiceDate()); 46 | helper.setText(R.id.rv_article_chapter_title, "分类:"); 47 | helper.setText(R.id.rv_article_author_title, "作者:"); 48 | 49 | helper.setBackgroundColor(R.id.rv_article_title, bg_rv_item_tv); 50 | helper.setBackgroundColor(R.id.rv_article_author, bg_rv_item_tv); 51 | helper.setBackgroundColor(R.id.rv_article_super_chapter, bg_rv_item_tv); 52 | helper.setBackgroundColor(R.id.rv_article_chapter, bg_rv_item_tv); 53 | helper.setBackgroundColor(R.id.rv_article_date, bg_rv_item_tv); 54 | helper.setBackgroundColor(R.id.rv_article_author_title, bg_rv_item_tv); 55 | helper.setBackgroundColor(R.id.rv_article_chapter_title, bg_rv_item_tv); 56 | helper.addOnClickListener(R.id.rv_article_imgbtn_save); 57 | if (item.isCollect()) { 58 | helper.setImageResource(R.id.rv_article_imgbtn_save, R.mipmap.collect_yes); 59 | } else { 60 | helper.setImageResource(R.id.rv_article_imgbtn_save, R.mipmap.collect_normal); 61 | } 62 | } 63 | break; 64 | case StringUtils.RV_ITEM_IMG: 65 | if (TextUtils.isEmpty(item.getTitle())) { 66 | return; 67 | } else { 68 | helper.setText(R.id.rv_article_img_title, item.getTitle()); 69 | helper.setText(R.id.rv_article_img_desc, item.getDesc()); 70 | helper.setText(R.id.rv_article_img_date, item.getNiceDate()); 71 | 72 | helper.setBackgroundColor(R.id.rv_article_img_title, bg_rv_item_tv); 73 | helper.setBackgroundColor(R.id.rv_article_img_desc, bg_rv_item_tv); 74 | helper.setBackgroundColor(R.id.rv_article_img_date, bg_rv_item_tv); 75 | 76 | } 77 | break; 78 | } 79 | 80 | } 81 | 82 | } -------------------------------------------------------------------------------- /app/src/main/java/com/lzq/wanandroid/view/adapter/ContentAdapter.java: -------------------------------------------------------------------------------- 1 | package com.lzq.wanandroid.view.adapter; 2 | 3 | import android.support.annotation.Nullable; 4 | import android.text.TextUtils; 5 | import android.view.View; 6 | 7 | import com.chad.library.adapter.base.BaseQuickAdapter; 8 | import com.chad.library.adapter.base.BaseViewHolder; 9 | import com.lzq.wanandroid.model.Datas; 10 | import com.lzq.wanandroid.R; 11 | 12 | import java.util.ArrayList; 13 | import java.util.List; 14 | 15 | import butterknife.BindColor; 16 | import butterknife.ButterKnife; 17 | 18 | public class ContentAdapter extends BaseQuickAdapter { 19 | @BindColor(R.color.bg_rv_item_tv) 20 | int bg_rv_item_tv; 21 | private List mList = new ArrayList<>(); 22 | 23 | public ContentAdapter(View view, @Nullable List data) { 24 | super(data); 25 | ButterKnife.bind(view); 26 | } 27 | 28 | public ContentAdapter(View view, int layoutResId, @Nullable List data) { 29 | super(layoutResId, data); 30 | ButterKnife.bind(view); 31 | mList = data; 32 | } 33 | 34 | @Override 35 | protected void convert(BaseViewHolder helper, Datas item) { 36 | if (TextUtils.isEmpty(item.getAuthor())) { 37 | return; 38 | } else { 39 | helper.setText(R.id.rv_article_title, item.getTitle().replace("—","——").replace(""","\"").replace("“","\"").replace("”","\"")); 40 | helper.setText(R.id.rv_article_author, item.getAuthor()); 41 | helper.setText(R.id.rv_article_super_chapter, item.getSuperChapterName()); 42 | helper.setText(R.id.rv_article_chapter, "/" + item.getChapterName()); 43 | helper.setText(R.id.rv_article_date, item.getNiceDate()); 44 | helper.setText(R.id.rv_article_chapter_title, "分类:"); 45 | helper.setText(R.id.rv_article_author_title, "作者:"); 46 | 47 | helper.setBackgroundColor(R.id.rv_article_title, bg_rv_item_tv); 48 | helper.setBackgroundColor(R.id.rv_article_author, bg_rv_item_tv); 49 | helper.setBackgroundColor(R.id.rv_article_super_chapter, bg_rv_item_tv); 50 | helper.setBackgroundColor(R.id.rv_article_chapter, bg_rv_item_tv); 51 | helper.setBackgroundColor(R.id.rv_article_date, bg_rv_item_tv); 52 | helper.setBackgroundColor(R.id.rv_article_author_title, bg_rv_item_tv); 53 | helper.setBackgroundColor(R.id.rv_article_chapter_title, bg_rv_item_tv); 54 | helper.addOnClickListener(R.id.rv_article_imgbtn_save); 55 | if (item.isCollect()){ 56 | helper.setImageResource(R.id.rv_article_imgbtn_save,R.mipmap.collect_yes); 57 | }else { 58 | helper.setImageResource(R.id.rv_article_imgbtn_save,R.mipmap.collect_normal); 59 | } 60 | } 61 | } 62 | 63 | public void addData(List data) { 64 | if (data.size() != 0 || data != null) { 65 | for (int i = 0; i < data.size(); i++) { 66 | mList.add(data.get(i)); 67 | } 68 | } 69 | notifyDataSetChanged(); 70 | } 71 | 72 | 73 | @Override 74 | public List getData(){ 75 | return mList; 76 | } 77 | } -------------------------------------------------------------------------------- /app/src/main/java/com/lzq/wanandroid/view/adapter/FragmentAdapter.java: -------------------------------------------------------------------------------- 1 | package com.lzq.wanandroid.view.adapter; 2 | 3 | import android.support.v4.app.Fragment; 4 | import android.support.v4.app.FragmentManager; 5 | import android.support.v4.app.FragmentPagerAdapter; 6 | import android.support.v4.app.FragmentTransaction; 7 | 8 | import java.util.ArrayList; 9 | import java.util.List; 10 | 11 | public class FragmentAdapter extends FragmentPagerAdapter { 12 | private List mList = new ArrayList<>(); 13 | private FragmentManager fm; 14 | 15 | public FragmentAdapter(FragmentManager fm, List mList) { 16 | super(fm); 17 | this.fm = fm; 18 | this.mList = mList; 19 | 20 | } 21 | 22 | public FragmentTransaction getTransaction() { 23 | return fm.beginTransaction(); 24 | } 25 | 26 | 27 | @Override 28 | public Fragment getItem(int i) { 29 | return mList.get(i); 30 | } 31 | 32 | 33 | @Override 34 | public int getCount() { 35 | return mList.size(); 36 | } 37 | 38 | 39 | public void notifyDataSetChanged(List mList) { 40 | this.mList = mList; 41 | notifyDataSetChanged(); 42 | } 43 | 44 | // @NonNull 45 | // @Override 46 | // public Object instantiateItem(@NonNull ViewGroup container, int position) { 47 | // //ViewPager对于重新传进来的Adapter不会直接重新加载List内容 48 | // //只是根据Tag判断是否存在 49 | // if (position == 3) 50 | // updateFragment(container, position); 51 | // return super.instantiateItem(container, position); 52 | // } 53 | //// 54 | // private void updateFragment(ViewGroup container, int position) { 55 | // String tag = getFragmentTag(container.getId(), position); 56 | // Fragment fragment = fm.findFragmentByTag(tag); 57 | // if (fragment == null) 58 | // return; 59 | // FragmentTransaction ft = fm.beginTransaction(); 60 | // ft.remove(fragment); 61 | // ft.commit(); 62 | // ft = null; 63 | // fm.executePendingTransactions(); 64 | // } 65 | 66 | // private String getFragmentTag(int id, int position) { 67 | // try { 68 | // Class cls = FragmentPagerAdapter.class; 69 | // Class[] parameterTypes = {int.class, long.class}; 70 | // Method method = cls.getDeclaredMethod("makeFragmentName", 71 | // parameterTypes); 72 | // method.setAccessible(true); 73 | // String tag = (String) method.invoke(this, id, position); 74 | // return tag; 75 | // } catch (Exception e) { 76 | // e.printStackTrace(); 77 | // return ""; 78 | // } 79 | // } 80 | // 81 | // 82 | // //若要更新Fragment必须重写此方法 83 | // @Override 84 | // public int getItemPosition(@NonNull Object object) { 85 | //// if (mList.contains((View) object)) { 86 | //// // 如果当前 item 未被 remove,则返回 item 的真实 position 87 | //// return mList.indexOf((View) object); 88 | //// } else { 89 | //// // 否则返回状态值 POSITION_NONE 90 | // return POSITION_NONE; 91 | //// }? 92 | // } 93 | } 94 | -------------------------------------------------------------------------------- /app/src/main/java/com/lzq/wanandroid/view/adapter/NaviAdapter.java: -------------------------------------------------------------------------------- 1 | package com.lzq.wanandroid.view.adapter; 2 | 3 | import android.support.annotation.Nullable; 4 | import android.view.LayoutInflater; 5 | import android.view.View; 6 | import android.widget.TextView; 7 | 8 | import com.chad.library.adapter.base.BaseQuickAdapter; 9 | import com.chad.library.adapter.base.BaseViewHolder; 10 | import com.lzq.wanandroid.api.FlowTagCallBack; 11 | import com.lzq.wanandroid.model.Data; 12 | import com.lzq.wanandroid.R; 13 | import com.zhy.view.flowlayout.FlowLayout; 14 | import com.zhy.view.flowlayout.TagAdapter; 15 | import com.zhy.view.flowlayout.TagFlowLayout; 16 | 17 | import java.util.List; 18 | 19 | import butterknife.BindView; 20 | import butterknife.ButterKnife; 21 | 22 | public class NaviAdapter extends BaseQuickAdapter{ 23 | @BindView(R.id.rv_tree_flow) 24 | TagFlowLayout mFlowLayout; 25 | private FlowTagCallBack flowTagCallBack; 26 | 27 | public NaviAdapter(int layoutResId, @Nullable List data, FlowTagCallBack flowTagCallBack) { 28 | super(layoutResId, data); 29 | this.flowTagCallBack = flowTagCallBack; 30 | } 31 | 32 | @Override 33 | protected void convert(final BaseViewHolder helper, final Data item) { 34 | ButterKnife.bind(this, helper.itemView); 35 | if (item.getName() != null) { 36 | helper.setText(R.id.rv_tree_tv_title, item.getName()); 37 | } 38 | if (item.getArticles() != null) { 39 | String[] titleName = new String[item.getArticles().size()]; 40 | for (int i = 0; i < item.getArticles().size(); i++) { 41 | titleName[i] = item.getArticles().get(i).getTitle(); 42 | } 43 | final LayoutInflater mInflater = LayoutInflater.from(helper.itemView.getContext()); 44 | mFlowLayout.setAdapter(new TagAdapter(titleName) { 45 | @Override 46 | public View getView(FlowLayout parent, int position, String s) { 47 | TextView tv = (TextView) mInflater.inflate(R.layout.flow_tv_item, 48 | mFlowLayout, false); 49 | tv.setText(s); 50 | return tv; 51 | } 52 | }); 53 | mFlowLayout.setOnTagClickListener(new TagFlowLayout.OnTagClickListener() { 54 | @Override 55 | public boolean onTagClick(View view, int position, FlowLayout parent) { 56 | flowTagCallBack.getTreeLink(item.getArticles().get(position).getLink()); 57 | return true; 58 | } 59 | }); 60 | } 61 | 62 | 63 | } 64 | 65 | } 66 | -------------------------------------------------------------------------------- /app/src/main/java/com/lzq/wanandroid/view/adapter/ProjectItemAdapter.java: -------------------------------------------------------------------------------- 1 | package com.lzq.wanandroid.view.adapter; 2 | 3 | import android.support.annotation.Nullable; 4 | import android.text.TextUtils; 5 | import android.view.View; 6 | import android.widget.ImageView; 7 | 8 | import com.bumptech.glide.Glide; 9 | import com.chad.library.adapter.base.BaseQuickAdapter; 10 | import com.chad.library.adapter.base.BaseViewHolder; 11 | import com.lzq.wanandroid.model.ProjectItem; 12 | import com.lzq.wanandroid.R; 13 | 14 | import org.apache.commons.lang3.StringEscapeUtils; 15 | 16 | import java.util.ArrayList; 17 | import java.util.List; 18 | 19 | import butterknife.BindColor; 20 | import butterknife.ButterKnife; 21 | 22 | public class ProjectItemAdapter extends BaseQuickAdapter { 23 | @BindColor(R.color.bg_rv_item_tv) 24 | int bg_rv_item_tv; 25 | private View mView; 26 | private List mList = new ArrayList<>(); 27 | 28 | public ProjectItemAdapter(View view, @Nullable List data) { 29 | super(data); 30 | mView = view; 31 | ButterKnife.bind(view); 32 | } 33 | 34 | public ProjectItemAdapter(View view, int layoutResId, @Nullable List data) { 35 | super(layoutResId, data); 36 | mView = view; 37 | ButterKnife.bind(view); 38 | mList = data; 39 | } 40 | 41 | @Override 42 | protected void convert(BaseViewHolder helper, ProjectItem.DataBean.Datas item) { 43 | if (TextUtils.isEmpty(item.getAuthor())) { 44 | return; 45 | } else { 46 | helper.setText(R.id.rv_article_img_title, item.getTitle().replace("—","——").replace(""", "\"").replace("“", "\"").replace("”", "\"")); 47 | helper.setText(R.id.rv_article_img_date, item.getNiceDate()); 48 | helper.setText(R.id.rv_article_img_desc, StringEscapeUtils.unescapeHtml4(item.getDesc())); 49 | Glide.with(mView.getContext()) 50 | .load(item.getEnvelopePic()) 51 | .into((ImageView) helper.getView(R.id.rv_article_img)); 52 | helper.setBackgroundColor(R.id.rv_article_img_title, bg_rv_item_tv); 53 | helper.setBackgroundColor(R.id.rv_article_img_date, bg_rv_item_tv); 54 | helper.setBackgroundColor(R.id.rv_article_img_desc, bg_rv_item_tv); 55 | helper.setBackgroundColor(R.id.rv_article_img, bg_rv_item_tv); 56 | helper.addOnClickListener(R.id.rv_article_imgbtn_save); 57 | if (item.isCollect()) { 58 | helper.setImageResource(R.id.rv_article_imgbtn_save, R.mipmap.collect_yes); 59 | } else { 60 | helper.setImageResource(R.id.rv_article_imgbtn_save, R.mipmap.collect_normal); 61 | } 62 | } 63 | } 64 | 65 | public void addData(List data) { 66 | if (data.size() != 0 || data != null) { 67 | for (int i = 0; i < data.size(); i++) { 68 | mList.add(data.get(i)); 69 | } 70 | } 71 | notifyDataSetChanged(); 72 | } 73 | 74 | 75 | @Override 76 | public List getData() { 77 | return mList; 78 | } 79 | } -------------------------------------------------------------------------------- /app/src/main/java/com/lzq/wanandroid/view/adapter/SearchResultAdapter.java: -------------------------------------------------------------------------------- 1 | package com.lzq.wanandroid.view.adapter; 2 | 3 | import android.support.annotation.Nullable; 4 | import android.text.TextUtils; 5 | 6 | import com.chad.library.adapter.base.BaseQuickAdapter; 7 | import com.chad.library.adapter.base.BaseViewHolder; 8 | import com.lzq.wanandroid.model.SearchResult; 9 | import com.lzq.wanandroid.R; 10 | import com.lzq.wanandroid.utils.StringUtils; 11 | 12 | import java.util.List; 13 | 14 | import butterknife.BindColor; 15 | 16 | public class SearchResultAdapter extends BaseQuickAdapter { 17 | @BindColor(R.color.bg_rv_item_tv) 18 | int bg_rv_item_tv; 19 | private int type; 20 | 21 | public SearchResultAdapter(int type, @Nullable List data) { 22 | super(data); 23 | this.type = type; 24 | } 25 | 26 | public SearchResultAdapter(int type, int layoutResId, @Nullable List data) { 27 | super(layoutResId, data); 28 | this.type = type; 29 | } 30 | 31 | @Override 32 | protected void convert(BaseViewHolder helper, SearchResult.DataBean.Datas item) { 33 | switch (type) { 34 | case StringUtils.RV_ITEM_IMG: 35 | if (TextUtils.isEmpty(item.getTitle())) { 36 | return; 37 | } else { 38 | if (TextUtils.isEmpty(item.getAuthor())) { 39 | return; 40 | } else { 41 | helper.setText(R.id.rv_article_title, item.getTitle().replace("“","\"").replace("”","\"").replace("—","——").replace("", "").replace("","")); 42 | helper.setText(R.id.rv_article_author, item.getAuthor()); 43 | helper.setText(R.id.rv_article_super_chapter, item.getSuperChapterName()); 44 | helper.setText(R.id.rv_article_chapter, "/" + item.getChapterName()); 45 | helper.setText(R.id.rv_article_date, item.getNiceDate()); 46 | helper.setText(R.id.rv_article_chapter_title, "分类:"); 47 | helper.setText(R.id.rv_article_author_title, "作者:"); 48 | 49 | helper.setBackgroundColor(R.id.rv_article_title, bg_rv_item_tv); 50 | helper.setBackgroundColor(R.id.rv_article_author, bg_rv_item_tv); 51 | helper.setBackgroundColor(R.id.rv_article_super_chapter, bg_rv_item_tv); 52 | helper.setBackgroundColor(R.id.rv_article_chapter, bg_rv_item_tv); 53 | helper.setBackgroundColor(R.id.rv_article_date, bg_rv_item_tv); 54 | helper.setBackgroundColor(R.id.rv_article_author_title, bg_rv_item_tv); 55 | helper.setBackgroundColor(R.id.rv_article_chapter_title, bg_rv_item_tv); 56 | helper.addOnClickListener(R.id.rv_article_imgbtn_save); 57 | if (item.isCollect()) { 58 | helper.setImageResource(R.id.rv_article_imgbtn_save, R.mipmap.collect_yes); 59 | } else { 60 | helper.setImageResource(R.id.rv_article_imgbtn_save, R.mipmap.collect_normal); 61 | } 62 | } 63 | } 64 | // helper.setText(R.id.rv_article_img_title, item.getTitle()); 65 | // helper.setText(R.id.rv_article_img_desc, item.getDesc()); 66 | // helper.setText(R.id.rv_article_img_date, item.getNiceDate()); 67 | // Log.d(TAG, "----convert: "+item.getDesc()); 68 | // helper.setBackgroundColor(R.id.rv_article_img_title, bg_rv_item_tv); 69 | // helper.setBackgroundColor(R.id.rv_article_img_desc, bg_rv_item_tv); 70 | // helper.setBackgroundColor(R.id.rv_article_img_date, bg_rv_item_tv); 71 | // if (item.isCollect()) { 72 | // helper.setImageResource(R.id.rv_article_imgbtn_save, R.mipmap.collect_yes); 73 | // } else { 74 | // helper.setImageResource(R.id.rv_article_imgbtn_save, R.mipmap.collect_normal); 75 | // } 76 | // } 77 | break; 78 | } 79 | 80 | } 81 | 82 | } -------------------------------------------------------------------------------- /app/src/main/java/com/lzq/wanandroid/view/adapter/TreeAdapter.java: -------------------------------------------------------------------------------- 1 | package com.lzq.wanandroid.view.adapter; 2 | 3 | import android.support.annotation.Nullable; 4 | import android.view.LayoutInflater; 5 | import android.view.View; 6 | import android.widget.TextView; 7 | 8 | import com.chad.library.adapter.base.BaseQuickAdapter; 9 | import com.chad.library.adapter.base.BaseViewHolder; 10 | import com.lzq.wanandroid.api.FlowTagCallBack; 11 | import com.lzq.wanandroid.model.Children; 12 | import com.lzq.wanandroid.model.Data; 13 | import com.lzq.wanandroid.R; 14 | import com.zhy.view.flowlayout.FlowLayout; 15 | import com.zhy.view.flowlayout.TagAdapter; 16 | import com.zhy.view.flowlayout.TagFlowLayout; 17 | 18 | import java.util.ArrayList; 19 | import java.util.List; 20 | 21 | import butterknife.BindView; 22 | import butterknife.ButterKnife; 23 | 24 | public class TreeAdapter extends BaseQuickAdapter { 25 | @BindView(R.id.rv_tree_flow) 26 | TagFlowLayout mFlowLayout; 27 | private FlowTagCallBack callBack; 28 | 29 | public TreeAdapter(int layoutResId, @Nullable List data, FlowTagCallBack callBack) { 30 | super(layoutResId, data); 31 | this.callBack = callBack; 32 | } 33 | 34 | @Override 35 | protected void convert(BaseViewHolder helper, final Data item) { 36 | ButterKnife.bind(this, helper.itemView); 37 | helper.addOnClickListener(R.id.rv_tree_flow); 38 | if (item.getName() != null) { 39 | helper.setText(R.id.rv_tree_tv_title, item.getName()); 40 | } 41 | if (item.getChildren() != null) { 42 | final String[] childName = new String[item.getChildren().size()]; 43 | final List mList = new ArrayList<>(); 44 | for (int i = 0; i < item.getChildren().size(); i++) { 45 | childName[i] = item.getChildren().get(i).getName(); 46 | mList.add(new Children(item.getChildren().get(i).getId(), item.getChildren().get(i).getName())); 47 | } 48 | final LayoutInflater mInflater = LayoutInflater.from(helper.itemView.getContext()); 49 | mFlowLayout.setAdapter(new TagAdapter(childName) { 50 | @Override 51 | public View getView(FlowLayout parent, int position, String s) { 52 | 53 | TextView tv = (TextView) mInflater.inflate(R.layout.flow_tv_item, 54 | mFlowLayout, false); 55 | tv.setText(s); 56 | return tv; 57 | } 58 | }); 59 | mFlowLayout.setOnTagClickListener(new TagFlowLayout.OnTagClickListener() { 60 | @Override 61 | public boolean onTagClick(View view, int position, FlowLayout parent) { 62 | callBack.getTreeArticles(item.getChildren().get(position).getId(), position, item.getName(), mList); 63 | return true; 64 | } 65 | }); 66 | } 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /app/src/main/java/com/lzq/wanandroid/view/animation/CollectAnim.java: -------------------------------------------------------------------------------- 1 | package com.lzq.wanandroid.view.animation; 2 | 3 | import android.animation.AnimatorSet; 4 | import android.animation.ObjectAnimator; 5 | import android.view.View; 6 | 7 | /** 8 | * @author LZQ 9 | * @content 本类负责item收藏按钮的闪烁效果 10 | */ 11 | public class CollectAnim { 12 | private static CollectAnim INSTANCE; 13 | 14 | public CollectAnim() { 15 | } 16 | 17 | public static CollectAnim getInstance() { 18 | if (INSTANCE == null) { 19 | INSTANCE = new CollectAnim(); 20 | } 21 | return INSTANCE; 22 | } 23 | 24 | 25 | public static void show(View view) { 26 | ObjectAnimator scaleCollectX = ObjectAnimator.ofFloat(view, "scaleX", 1f,1.4f, 1f); 27 | ObjectAnimator scaleCollectY = ObjectAnimator.ofFloat(view, "scaleY", 1f,1.4f, 1f); 28 | AnimatorSet scaleSet=new AnimatorSet(); 29 | scaleSet.playTogether(scaleCollectX,scaleCollectY); 30 | scaleSet.setDuration(200).start(); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /app/src/main/java/com/lzq/wanandroid/view/animation/LaunchAnim.java: -------------------------------------------------------------------------------- 1 | package com.lzq.wanandroid.view.animation; 2 | 3 | import android.animation.Animator; 4 | import android.animation.AnimatorListenerAdapter; 5 | import android.animation.AnimatorSet; 6 | import android.animation.ObjectAnimator; 7 | import android.app.Activity; 8 | import android.view.View; 9 | 10 | import com.gyf.immersionbar.ImmersionBar; 11 | import com.lzq.wanandroid.R; 12 | 13 | public class LaunchAnim { 14 | private static LaunchAnim INSTANCE; 15 | 16 | public LaunchAnim() { 17 | } 18 | 19 | public static LaunchAnim getInstance() { 20 | if (INSTANCE == null) { 21 | INSTANCE = new LaunchAnim(); 22 | } 23 | return INSTANCE; 24 | } 25 | 26 | public static void showLogo(final Activity activity, final View... views) { 27 | if (views.length != 0) { 28 | final ObjectAnimator hide = ObjectAnimator.ofFloat(views[0], "alpha", 1, 0); 29 | final ObjectAnimator translationY = ObjectAnimator.ofFloat(views[0], "translationY", views[0].getY(), -80f); 30 | final AnimatorSet animatorSet = new AnimatorSet(); 31 | animatorSet.setDuration(1000).playTogether(hide, translationY); 32 | animatorSet.addListener(new AnimatorListenerAdapter() { 33 | @Override 34 | public void onAnimationEnd(Animator animation) { 35 | views[0].setVisibility(View.GONE); 36 | views[4].setVisibility(View.GONE); 37 | showMain(activity,views[1], views[2], views[3]); 38 | } 39 | }); 40 | animatorSet.start(); 41 | } 42 | } 43 | 44 | public static void showMain(Activity activity,View... views) { 45 | for (int i = 0; i < views.length; i++) { 46 | views[i].setVisibility(View.VISIBLE); 47 | } 48 | ImmersionBar.with(activity).statusBarColor(R.color.bg_daily_mode).autoDarkModeEnable(true).fitsSystemWindows(true).keyboardEnable(true).init(); 49 | } 50 | 51 | } 52 | -------------------------------------------------------------------------------- /app/src/main/java/com/lzq/wanandroid/view/animation/TitleAnim.java: -------------------------------------------------------------------------------- 1 | package com.lzq.wanandroid.view.animation; 2 | 3 | import android.animation.Animator; 4 | import android.animation.AnimatorListenerAdapter; 5 | import android.animation.AnimatorSet; 6 | import android.animation.ObjectAnimator; 7 | import android.view.View; 8 | import android.widget.ImageButton; 9 | import android.widget.TextView; 10 | 11 | import com.lzq.wanandroid.R; 12 | 13 | /** 14 | * @author LZQ 15 | * @content 本类负责Activity标题部分的渐变效果 16 | */ 17 | public class TitleAnim { 18 | private static TitleAnim INSTANCE; 19 | 20 | public TitleAnim() { 21 | } 22 | 23 | public static TitleAnim getInstance() { 24 | if (INSTANCE == null) { 25 | INSTANCE = new TitleAnim(); 26 | } 27 | return INSTANCE; 28 | } 29 | 30 | private ObjectAnimator alpha_tv,alpha_imgBtn; 31 | //title文字及右部图标的渐现 32 | public static void show(View tv, final View imgBtn, String text, final int page) { 33 | TextView mTextView = (TextView) tv; 34 | ImageButton mImgBtn = (ImageButton) imgBtn; 35 | ObjectAnimator alpha_tv = ObjectAnimator.ofFloat(tv, "alpha", 0, 1); 36 | ObjectAnimator alpha_imgBtn = ObjectAnimator.ofFloat(imgBtn, "alpha", 0, 1); 37 | mTextView.setText(text); 38 | switch (page) { 39 | case 0: 40 | mImgBtn.setVisibility(View.VISIBLE); 41 | mImgBtn.setImageResource(R.mipmap.search); 42 | break; 43 | case 1: 44 | case 2: 45 | if (imgBtn.getAlpha()!=0||mImgBtn.getVisibility()==View.VISIBLE){ 46 | alpha_imgBtn = ObjectAnimator.ofFloat(imgBtn, "alpha", 1, 0); 47 | } 48 | break; 49 | case 3: 50 | mImgBtn.setVisibility(View.VISIBLE); 51 | mImgBtn.setImageResource(R.mipmap.setting); 52 | break; 53 | } 54 | AnimatorSet alphaSet = new AnimatorSet(); 55 | alphaSet.playTogether(alpha_imgBtn, alpha_tv); 56 | alphaSet.setDuration(500).start(); 57 | alphaSet.addListener(new AnimatorListenerAdapter() { 58 | @Override 59 | public void onAnimationEnd(Animator animation) { 60 | if (page==1||page==2){ 61 | if (imgBtn.getVisibility()!=View.GONE) imgBtn.setVisibility(View.GONE); 62 | } 63 | if (page==0||page==3){ 64 | if (imgBtn.getVisibility()!=View.VISIBLE) imgBtn.setVisibility(View.VISIBLE); 65 | } 66 | } 67 | }); 68 | } 69 | 70 | //title文字及右部图标的渐隐 71 | public static void hide(View... views) { 72 | ObjectAnimator alpha_Title = ObjectAnimator.ofFloat(views, "alpha", 1, 0); 73 | alpha_Title.setDuration(500) 74 | .start(); 75 | } 76 | 77 | //title文字的渐隐 78 | public static void hide(View view) { 79 | ObjectAnimator alpha_Title = ObjectAnimator.ofFloat(view, "alpha", 1, 0); 80 | alpha_Title.setDuration(500) 81 | .start(); 82 | } 83 | 84 | } 85 | -------------------------------------------------------------------------------- /app/src/main/java/com/lzq/wanandroid/view/custom/OnlyIconView.java: -------------------------------------------------------------------------------- 1 | package com.lzq.wanandroid.view.custom; 2 | 3 | import android.content.Context; 4 | import android.support.annotation.DrawableRes; 5 | import android.util.AttributeSet; 6 | import android.view.LayoutInflater; 7 | import android.widget.ImageView; 8 | 9 | import com.bottom.item.BaseTabItem; 10 | import com.lzq.wanandroid.R; 11 | 12 | public class OnlyIconView extends BaseTabItem { 13 | 14 | private ImageView mIcon; 15 | 16 | private int mDefaultDrawable; 17 | private int mCheckedDrawable; 18 | 19 | public OnlyIconView(Context context) { 20 | this(context, null); 21 | } 22 | 23 | public OnlyIconView(Context context, AttributeSet attrs) { 24 | this(context, attrs, 0); 25 | } 26 | 27 | public OnlyIconView(Context context, AttributeSet attrs, int defStyleAttr) { 28 | super(context, attrs, defStyleAttr); 29 | 30 | LayoutInflater.from(context).inflate(R.layout.bottom_bar_item_only_icon, this, true); 31 | 32 | mIcon = (ImageView) findViewById(R.id.icon); 33 | } 34 | 35 | public void initialize(@DrawableRes int drawableRes, @DrawableRes int checkedDrawableRes) { 36 | mDefaultDrawable = drawableRes; 37 | mCheckedDrawable = checkedDrawableRes; 38 | } 39 | 40 | @Override 41 | public void setChecked(boolean checked) { 42 | mIcon.setImageResource(checked ? mCheckedDrawable : mDefaultDrawable); 43 | } 44 | 45 | @Override 46 | public void setMessageNumber(int number) { 47 | //不需要就不用管 48 | } 49 | 50 | @Override 51 | public void setHasMessage(boolean hasMessage) { 52 | //不需要就不用管 53 | } 54 | 55 | @Override 56 | public String getTitle() { 57 | return "no title"; 58 | } 59 | } 60 | 61 | -------------------------------------------------------------------------------- /app/src/main/java/com/lzq/wanandroid/view/custom/ProgressWebview.java: -------------------------------------------------------------------------------- 1 | package com.lzq.wanandroid.view.custom; 2 | 3 | import android.content.Context; 4 | import android.graphics.drawable.Drawable; 5 | import android.util.AttributeSet; 6 | import android.widget.AbsoluteLayout; 7 | import android.widget.FrameLayout; 8 | import android.widget.ProgressBar; 9 | 10 | import com.lzq.wanandroid.R; 11 | import com.tencent.smtt.export.external.interfaces.SslError; 12 | import com.tencent.smtt.export.external.interfaces.SslErrorHandler; 13 | import com.tencent.smtt.sdk.WebChromeClient; 14 | import com.tencent.smtt.sdk.WebSettings; 15 | import com.tencent.smtt.sdk.WebView; 16 | import com.tencent.smtt.sdk.WebViewClient; 17 | 18 | public class ProgressWebview extends WebView { 19 | private ProgressBar progressbar; //进度条 20 | 21 | private int progressHeight = 5; //进度条的高度,默认10px 22 | 23 | public ProgressWebview(Context context) { 24 | super(context); 25 | initView(context); 26 | } 27 | 28 | public ProgressWebview(Context context, AttributeSet attributeSet) { 29 | super(context, attributeSet); 30 | initView(context); 31 | 32 | } 33 | 34 | 35 | private void initView(Context context) { 36 | 37 | //开启js脚本支持 38 | getSettings().setJavaScriptEnabled(true); 39 | 40 | //创建进度条 41 | progressbar = new ProgressBar(context, null, 42 | android.R.attr.progressBarStyleHorizontal); 43 | //设置加载进度条的高度 44 | progressbar.setLayoutParams(new AbsoluteLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, progressHeight, 0, 0)); 45 | 46 | Drawable drawable = context.getResources().getDrawable(R.drawable.progress_bar_states); 47 | progressbar.setProgressDrawable(drawable); 48 | 49 | //添加进度到WebView 50 | addView(progressbar); 51 | 52 | //适配手机大小 53 | getSettings().setUseWideViewPort(true); 54 | getSettings().setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS); 55 | getSettings().setLoadWithOverviewMode(true); 56 | getSettings().setSupportZoom(true); 57 | getSettings().setBuiltInZoomControls(true); 58 | getSettings().setDisplayZoomControls(false); 59 | 60 | 61 | setWebChromeClient(new WVChromeClient()); 62 | setWebViewClient(new WVClient()); 63 | } 64 | 65 | private class WVChromeClient extends WebChromeClient { 66 | @Override 67 | public void onProgressChanged(WebView view, int newProgress) { 68 | 69 | 70 | if (newProgress == 100) { 71 | progressbar.setVisibility(GONE); 72 | } else { 73 | if (progressbar.getVisibility() == GONE) 74 | progressbar.setVisibility(VISIBLE); 75 | progressbar.setProgress(newProgress); 76 | } 77 | 78 | if (mListener != null) { 79 | mListener.onProgressChange(view, newProgress); 80 | } 81 | 82 | super.onProgressChanged(view, newProgress); 83 | } 84 | 85 | } 86 | 87 | private class WVClient extends WebViewClient { 88 | @Override 89 | public boolean shouldOverrideUrlLoading(WebView view, String url) { 90 | 91 | //在当前Activity打开 92 | view.loadUrl(url); 93 | return true; 94 | } 95 | 96 | @Override 97 | public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { 98 | //https忽略证书问题 99 | handler.proceed(); 100 | } 101 | 102 | @Override 103 | public void onPageFinished(WebView view, String url) { 104 | 105 | progressbar.setVisibility(GONE); 106 | if (mListener != null) { 107 | mListener.onPageFinish(view); 108 | } 109 | 110 | super.onPageFinished(view, url); 111 | 112 | } 113 | 114 | } 115 | private onWebViewListener mListener; 116 | 117 | public void setOnWebViewListener(onWebViewListener listener) { 118 | this.mListener = listener; 119 | } 120 | 121 | //进度回调接口 122 | public interface onWebViewListener { 123 | void onProgressChange(WebView view, int newProgress); 124 | 125 | void onPageFinish(WebView view); 126 | } 127 | 128 | } 129 | -------------------------------------------------------------------------------- /app/src/main/java/com/lzq/wanandroid/view/fragment/ToDoFragment.java: -------------------------------------------------------------------------------- 1 | package com.lzq.wanandroid.view.fragment; 2 | 3 | import android.os.Bundle; 4 | import android.support.annotation.NonNull; 5 | import android.support.annotation.Nullable; 6 | import android.view.LayoutInflater; 7 | import android.view.View; 8 | import android.view.ViewGroup; 9 | 10 | import com.lzq.wanandroid.base.BaseFragment; 11 | import com.lzq.wanandroid.api.Contract; 12 | import com.lzq.wanandroid.model.Datas; 13 | import com.lzq.wanandroid.model.Event; 14 | import com.lzq.wanandroid.R; 15 | import com.lzq.wanandroid.view.adapter.ContentAdapter; 16 | 17 | import org.greenrobot.eventbus.EventBus; 18 | import org.greenrobot.eventbus.Subscribe; 19 | import org.greenrobot.eventbus.ThreadMode; 20 | 21 | import java.util.ArrayList; 22 | import java.util.List; 23 | 24 | import butterknife.ButterKnife; 25 | 26 | public class ToDoFragment extends BaseFragment implements Contract.ToDoView { 27 | private static final String TAG = "todoFragment"; 28 | // @BindView(R.id.rv_todo_list) 29 | // RecyclerView mRecyclerView; 30 | // @BindView(R.id.refresh_todo_content) 31 | // SmartRefreshLayout mRefreshView; 32 | private Contract.ToDoPresenter mPresenter; 33 | private View mView; 34 | private ContentAdapter mAdapter; 35 | private List mList = new ArrayList<>(); 36 | 37 | public ToDoFragment() { 38 | } 39 | 40 | public static ToDoFragment newInstance() { 41 | return new ToDoFragment(); 42 | } 43 | 44 | @Nullable 45 | @Override 46 | public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 47 | View view = inflater.inflate(R.layout.fragment_todo, container, false); 48 | ButterKnife.bind(this, view); 49 | if (!EventBus.getDefault().isRegistered(this)){ 50 | EventBus.getDefault().register(this);} 51 | mView = view; 52 | return view; 53 | } 54 | 55 | 56 | 57 | 58 | @Subscribe(threadMode = ThreadMode.MAIN) 59 | public void onEvent(Event event) { 60 | } 61 | 62 | @Override 63 | public void onDestroy() { 64 | super.onDestroy(); 65 | EventBus.getDefault().unregister(this); 66 | } 67 | 68 | @Override 69 | public void setPresenter(Contract.ToDoPresenter presenter) { 70 | mPresenter=presenter; 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /app/src/main/jniLibs/armeabi-v7a/liblbs.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/jniLibs/armeabi-v7a/liblbs.so -------------------------------------------------------------------------------- /app/src/main/jniLibs/armeabi-v8a/liblbs.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/jniLibs/armeabi-v8a/liblbs.so -------------------------------------------------------------------------------- /app/src/main/jniLibs/armeabi/liblbs.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/jniLibs/armeabi/liblbs.so -------------------------------------------------------------------------------- /app/src/main/jniLibs/mips/liblbs.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/jniLibs/mips/liblbs.so -------------------------------------------------------------------------------- /app/src/main/jniLibs/x86/liblbs.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/jniLibs/x86/liblbs.so -------------------------------------------------------------------------------- /app/src/main/jniLibs/x86_64/liblbs.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/jniLibs/x86_64/liblbs.so -------------------------------------------------------------------------------- /app/src/main/res/anim/enter_fade_in.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/anim/enter_fade_out.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/anim/exit_fade_in.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/anim/exit_fade_out.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 12 | 13 | 19 | 22 | 25 | 26 | 27 | 28 | 34 | 35 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/launch_splash.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/progress_bar_states.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/shape_corner_search_edt.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/shape_corner_white.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/shape_user_btn_login.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 | 31 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/tab_divider.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_articles.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 22 | 23 | 30 | 31 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 14 | 15 | 23 | 24 | 32 | 33 | 42 | 43 | 54 | 55 | 56 | 57 | 64 | 65 | 72 | 73 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_search.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 18 | 19 | 28 | 29 | 40 | 41 | 42 | 43 | 52 | 53 | 54 | 55 | 63 | 64 | 65 | 72 | 73 | 74 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_search_result.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 22 | 23 | 30 | 31 | 37 | 38 | 46 | 47 | 48 | 49 | 50 | 55 | 56 | 57 | 61 | 62 | 69 | 70 | 74 | 75 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_splash.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_version.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 21 | 22 | 25 | 26 | 30 | 31 | 39 | 40 | 49 | 50 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_web.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 19 | 20 | 25 | 26 | -------------------------------------------------------------------------------- /app/src/main/res/layout/bottom_bar_item_only_icon.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/layout/empty_view.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 31 | -------------------------------------------------------------------------------- /app/src/main/res/layout/flow_tv_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_account.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 17 | 18 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_b.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 12 | 13 | 17 | 18 | 25 | 26 | 27 | 28 | 29 | 30 | 37 | 38 | 39 | 44 | 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_c.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 11 | 18 | 19 | 20 | 26 | 27 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_collect.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 15 | 16 | 17 | 22 | 23 | 30 | 31 | 32 | 33 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_content.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 10 | 15 | 16 | 17 | 21 | 22 | 29 | 30 | 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_project_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 11 | 16 | 17 | 18 | 22 | 23 | 30 | 31 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_todo.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_tree.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 12 | 15 | 16 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_user.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 14 | 15 | 19 | 20 | 23 | 24 | 35 | 36 | 47 | 48 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 72 | 73 | 74 | 81 | 82 | 87 | 88 | 89 | 90 | 91 | -------------------------------------------------------------------------------- /app/src/main/res/layout/rv_home_img_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/layout/rv_tree_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 12 | 13 | 19 | 20 | 30 | 31 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /app/src/main/res/layout/rv_ver_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/icon_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-hdpi/icon_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/icon_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-hdpi/icon_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/input_del.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-hdpi/input_del.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-hdpi/logo.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-night-xxhdpi/article.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-night-xxhdpi/article.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-night-xxhdpi/chat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-night-xxhdpi/chat.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-night-xxhdpi/chat_no.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-night-xxhdpi/chat_no.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-night-xxhdpi/collect.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-night-xxhdpi/collect.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-night-xxhdpi/collect_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-night-xxhdpi/collect_normal.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-night-xxhdpi/collect_yes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-night-xxhdpi/collect_yes.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-night-xxhdpi/confirm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-night-xxhdpi/confirm.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-night-xxhdpi/home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-night-xxhdpi/home.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-night-xxhdpi/home_no.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-night-xxhdpi/home_no.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-night-xxhdpi/icon_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-night-xxhdpi/icon_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-night-xxhdpi/icon_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-night-xxhdpi/icon_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-night-xxhdpi/id.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-night-xxhdpi/id.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-night-xxhdpi/input_del.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-night-xxhdpi/input_del.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-night-xxhdpi/my.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-night-xxhdpi/my.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-night-xxhdpi/navi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-night-xxhdpi/navi.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-night-xxhdpi/navigation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-night-xxhdpi/navigation.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-night-xxhdpi/official_account.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-night-xxhdpi/official_account.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-night-xxhdpi/project.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-night-xxhdpi/project.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-night-xxhdpi/project_no.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-night-xxhdpi/project_no.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-night-xxhdpi/project_yes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-night-xxhdpi/project_yes.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-night-xxhdpi/pwd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-night-xxhdpi/pwd.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-night-xxhdpi/search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-night-xxhdpi/search.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-night-xxhdpi/search_btn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-night-xxhdpi/search_btn.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-night-xxhdpi/setting.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-night-xxhdpi/setting.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-night-xxhdpi/todo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-night-xxhdpi/todo.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-night-xxhdpi/top_article.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-night-xxhdpi/top_article.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-night-xxhdpi/tree.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-night-xxhdpi/tree.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-night-xxhdpi/tree_knowledge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-night-xxhdpi/tree_knowledge.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-night-xxhdpi/tree_no.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-night-xxhdpi/tree_no.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-night-xxhdpi/user.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-night-xxhdpi/user.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-night-xxhdpi/user_no.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-night-xxhdpi/user_no.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/icon_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-xhdpi/icon_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/icon_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-xhdpi/icon_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/input_del.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-xhdpi/input_del.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-xhdpi/logo.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/article.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-xxhdpi/article.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/chat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-xxhdpi/chat.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/chat_no.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-xxhdpi/chat_no.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/collect.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-xxhdpi/collect.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/collect_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-xxhdpi/collect_normal.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/collect_yes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-xxhdpi/collect_yes.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/confirm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-xxhdpi/confirm.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/empty.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-xxhdpi/empty.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-xxhdpi/home.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/home_no.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-xxhdpi/home_no.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/icon_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-xxhdpi/icon_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/icon_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-xxhdpi/icon_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/id.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-xxhdpi/id.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/input_del.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-xxhdpi/input_del.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-xxhdpi/logo.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/my.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-xxhdpi/my.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/navi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-xxhdpi/navi.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/navigation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-xxhdpi/navigation.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/official_account.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-xxhdpi/official_account.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/project.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-xxhdpi/project.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/project_no.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-xxhdpi/project_no.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/project_yes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-xxhdpi/project_yes.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/pwd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-xxhdpi/pwd.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-xxhdpi/search.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/search_btn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-xxhdpi/search_btn.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/setting.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-xxhdpi/setting.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/todo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-xxhdpi/todo.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/top_article.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-xxhdpi/top_article.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/tree.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-xxhdpi/tree.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/tree_knowledge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-xxhdpi/tree_knowledge.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/tree_no.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-xxhdpi/tree_no.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/user.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-xxhdpi/user.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/user_no.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-xxhdpi/user_no.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/input_del.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/app/src/main/res/mipmap-xxxhdpi/input_del.png -------------------------------------------------------------------------------- /app/src/main/res/values-night/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #59AAFF 4 | #303030 5 | #1697fd 6 | #F0F5F5 7 | #D5CBCB 8 | #80FFFFFF 9 | #99000000 10 | #243037 11 | #000 12 | #FFF 13 | #59AAFF 14 | #25647c 15 | #006678 16 | #2C7DE3 17 | #1C6AC9 18 | #00faf6 19 | #007cd1 20 | #1697fd 21 | #f44336 22 | #0ab1e2 23 | #1C6AC9 24 | #00bce5 25 | #37C000 26 | #4fc384 27 | #7ce6eb 28 | #10eade 29 | #d2d2d2 30 | #f8f8f8 31 | #e6e7ed 32 | #00a9ff 33 | #B3B3B3 34 | #555555 35 | 36 | #00a9ff 37 | #00a9ff 38 | #00a9ff 39 | 40 | #303030 41 | #4D4D4D 42 | #4D4D4D 43 | #555555 44 | #555555 45 | #555555 46 | #C0C0C0 47 | #C0C0C0 48 | #FAFAFA 49 | #f44336 50 | #4D4D4D 51 | 52 | #4D4D4D 53 | 54 | -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #59AAFF 4 | #FFF 5 | #1697fd 6 | #F0F5F5 7 | #D5CBCB 8 | #32a079 9 | #80FFFFFF 10 | #99000000 11 | #243037 12 | #000 13 | #FFF 14 | #59AAFF 15 | #25647c 16 | #006678 17 | #2C7DE3 18 | #1C6AC9 19 | #00faf6 20 | #007cd1 21 | #1697fd 22 | #f44336 23 | #0ab1e2 24 | #1C6AC9 25 | #00bce5 26 | #37C000 27 | #4fc384 28 | #7ce6eb 29 | #10eade 30 | #d2d2d2 31 | #f8f8f8 32 | #e6e7ed 33 | #00a9ff 34 | #B3B3B3 35 | #555555 36 | 37 | #37b537 38 | #37b537 39 | #37b537 40 | #fafafa 41 | #303030 42 | 43 | 44 | #FFF 45 | #e6e7ed 46 | #fafafa 47 | #FFF 48 | #FFF 49 | #e6e7ed 50 | #e6e7ed 51 | #000 52 | #393B4D 53 | #FFF 54 | #f44336 55 | #FFB7B2B2 56 | 57 | #ECECEC 58 | 59 | -------------------------------------------------------------------------------- /app/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 200dp 4 | 100dp 5 | 90dp 6 | 80dp 7 | 70dp 8 | 60dp 9 | 50dp 10 | 40dp 11 | 30dp 12 | 20dp 13 | 10dp 14 | 9dp 15 | 8dp 16 | 7dp 17 | 6dp 18 | 5dp 19 | 4dp 20 | 3dp 21 | 2dp 22 | 1dp 23 | 24 | 80dp 25 | 26 | 13sp 27 | 16sp 28 | 17sp 29 | #4c99d9 30 | #ffffff 31 | 3.5dp 32 | 10dp 33 | 50sp 34 | 35 | 16dp 36 | 16dp 37 | 8dp 38 | 176dp 39 | 16dp 40 | 41 | -------------------------------------------------------------------------------- /app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 玩安卓 3 | 登录 4 | 注册 5 | 已有账户 6 | 设置 7 | 夜间模式 8 | 切换用户 9 | 介绍 10 | 关于 11 | 版本 12 | 文章浏览 13 | 热门搜索 14 | 置顶 15 | 文章 16 | 回到顶部 17 | 项目名:玩安卓 18 | 特别感谢鸿洋大神开源学习安卓的社区API:\nhttps://www.wanandroid.com\n设计及开发:\n@TzuChiangLi\n启动图标(制作中):\n杨设计@Designer.Yang\n图标素材(感谢阿里对于开源项目的贡献):\nhttps://www.iconfont.cn\n项目地址(暂时闭源):\nhttps://github.com/TzuChiangLi/WanAndroid 19 | 本项目开发目标:整合Android领域大神们的技术文章,为有志于、已跻身于移动领域开发的同学、同行们提供快捷舒适的浏览体验。\n由于手中没有较新的Android设备,因此可能在小米、魅族以及华为等深度定制的ROM上有不足之处。目前已知问题有:\n1.全面屏的适配可能还存在问题,在魅族Flyme系统上已通过测试,其他厂商尚未测试。\n2.启动速度已经得到优化,在华为EMUI\魅族Flyme系统上已测试通过。但是在小米MIUI(仅在小米Note3的MIUI10开发版上测试)上很不理想,暂时无法查出原因。\n下步计划是响应式编程或微信小程序方向。\n再次感谢各位大神对于开源社区的贡献。 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 16 | 17 | 22 | 23 | 27 | 28 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /app/src/main/res/xml/provider_paths.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/test/java/com/lzq/wanandroid/ExampleUnitTest.java: -------------------------------------------------------------------------------- 1 | package com.lzq.wanandroid; 2 | 3 | import org.junit.Test; 4 | 5 | import static org.junit.Assert.*; 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * @see Testing documentation 11 | */ 12 | public class ExampleUnitTest { 13 | @Test 14 | public void addition_isCorrect() { 15 | assertEquals(4, 2 + 2); 16 | } 17 | } -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | 3 | buildscript { 4 | repositories { 5 | google() 6 | jcenter() 7 | mavenCentral() 8 | maven { url 'https://maven.google.com' } 9 | } 10 | dependencies { 11 | classpath 'com.android.tools.build:gradle:3.4.2' 12 | 13 | // NOTE: Do not place your application dependencies here; they belong 14 | // in the individual module build.gradle files 15 | } 16 | } 17 | 18 | allprojects { 19 | repositories { 20 | google() 21 | jcenter() 22 | maven { url 'https://jitpack.io' } 23 | } 24 | } 25 | 26 | task clean(type: Delete) { 27 | delete rootProject.buildDir 28 | } 29 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | # IDE (e.g. Android Studio) users: 3 | # Gradle settings configured through the IDE *will override* 4 | # any settings specified in this file. 5 | # For more details on how to configure your build environment visit 6 | # http://www.gradle.org/docs/current/userguide/build_environment.html 7 | # Specifies the JVM arguments used for the daemon process. 8 | # The setting is particularly useful for tweaking memory settings. 9 | org.gradle.jvmargs=-Xmx1536m 10 | # When configured, Gradle will run in incubating parallel mode. 11 | # This option should only be used with decoupled projects. More details, visit 12 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 13 | # org.gradle.parallel=true 14 | 15 | 16 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri May 24 09:15:28 CST 2019 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip 7 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | set DIRNAME=%~dp0 12 | if "%DIRNAME%" == "" set DIRNAME=. 13 | set APP_BASE_NAME=%~n0 14 | set APP_HOME=%DIRNAME% 15 | 16 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 17 | set DEFAULT_JVM_OPTS= 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windows variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | 53 | :win9xME_args 54 | @rem Slurp the command line arguments. 55 | set CMD_LINE_ARGS= 56 | set _SKIP=2 57 | 58 | :win9xME_args_slurp 59 | if "x%~1" == "x" goto execute 60 | 61 | set CMD_LINE_ARGS=%* 62 | 63 | :execute 64 | @rem Setup the command line 65 | 66 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 67 | 68 | @rem Execute Gradle 69 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 70 | 71 | :end 72 | @rem End local scope for the variables with windows NT shell 73 | if "%ERRORLEVEL%"=="0" goto mainEnd 74 | 75 | :fail 76 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 77 | rem the _cmd.exe /c_ return code! 78 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 79 | exit /b 1 80 | 81 | :mainEnd 82 | if "%OS%"=="Windows_NT" endlocal 83 | 84 | :omega 85 | -------------------------------------------------------------------------------- /introduce/WanAndroid_1.0.18075_10089_release.apk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/introduce/WanAndroid_1.0.18075_10089_release.apk -------------------------------------------------------------------------------- /introduce/微信图片_20190629112228.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/introduce/微信图片_20190629112228.png -------------------------------------------------------------------------------- /introduce/微信图片_20190629112245.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/introduce/微信图片_20190629112245.jpg -------------------------------------------------------------------------------- /introduce/微信图片_20190629112248.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/introduce/微信图片_20190629112248.jpg -------------------------------------------------------------------------------- /introduce/微信图片_20190629112253.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/introduce/微信图片_20190629112253.jpg -------------------------------------------------------------------------------- /introduce/微信图片_20190629112257.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/introduce/微信图片_20190629112257.jpg -------------------------------------------------------------------------------- /introduce/微信图片_20190629112303.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/introduce/微信图片_20190629112303.png -------------------------------------------------------------------------------- /introduce/微信图片_20190629112314.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/introduce/微信图片_20190629112314.jpg -------------------------------------------------------------------------------- /introduce/微信图片_20190629112320.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/introduce/微信图片_20190629112320.jpg -------------------------------------------------------------------------------- /introduce/微信图片_20190629112322.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TzuChiangLi/WanAndroid/c6f3cd72de3dd0b057fe873e446eeac452168c3f/introduce/微信图片_20190629112322.jpg -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | --------------------------------------------------------------------------------