Browse Source

1.添加广场功能
2.自己的文章-删除、查询、添加
3.可以查看他人的信息
4.个人中心界面改版

hegj 5 years ago
parent
commit
49cf44052e
100 changed files with 2450 additions and 225 deletions
  1. 24 13
      app/src/main/AndroidManifest.xml
  2. 20 0
      app/src/main/java/me/hegj/wandroid/app/event/AddEvent.kt
  3. 0 4
      app/src/main/java/me/hegj/wandroid/app/event/AddTodoEvent.kt
  4. 1 2
      app/src/main/java/me/hegj/wandroid/app/utils/CacheUtil.kt
  5. 1 1
      app/src/main/java/me/hegj/wandroid/app/utils/ColorUtil.kt
  6. 8 9
      app/src/main/java/me/hegj/wandroid/app/utils/SettingUtil.kt
  7. 28 0
      app/src/main/java/me/hegj/wandroid/di/component/main/tree/SquareComponent.kt
  8. 28 0
      app/src/main/java/me/hegj/wandroid/di/component/share/ShareAriticleComponent.kt
  9. 28 0
      app/src/main/java/me/hegj/wandroid/di/component/share/ShareByIdComponent.kt
  10. 28 0
      app/src/main/java/me/hegj/wandroid/di/component/share/ShareListComponent.kt
  11. 3 3
      app/src/main/java/me/hegj/wandroid/di/module/main/home/HomeModule.kt
  12. 38 0
      app/src/main/java/me/hegj/wandroid/di/module/main/tree/SquareModule.kt
  13. 38 0
      app/src/main/java/me/hegj/wandroid/di/module/share/ShareAriticleModule.kt
  14. 38 0
      app/src/main/java/me/hegj/wandroid/di/module/share/ShareByIdModule.kt
  15. 38 0
      app/src/main/java/me/hegj/wandroid/di/module/share/ShareListModule.kt
  16. 2 2
      app/src/main/java/me/hegj/wandroid/mvp/contract/MainContract.kt
  17. 2 2
      app/src/main/java/me/hegj/wandroid/mvp/contract/collect/CollectContract.kt
  18. 2 2
      app/src/main/java/me/hegj/wandroid/mvp/contract/collect/CollectUrlContract.kt
  19. 2 2
      app/src/main/java/me/hegj/wandroid/mvp/contract/integral/IntegralContract.kt
  20. 1 2
      app/src/main/java/me/hegj/wandroid/mvp/contract/main/home/HomeContract.kt
  21. 2 2
      app/src/main/java/me/hegj/wandroid/mvp/contract/main/home/search/SearchContract.kt
  22. 2 2
      app/src/main/java/me/hegj/wandroid/mvp/contract/main/home/search/SearchResultContract.kt
  23. 2 2
      app/src/main/java/me/hegj/wandroid/mvp/contract/main/me/MeContract.kt
  24. 2 2
      app/src/main/java/me/hegj/wandroid/mvp/contract/main/project/ProjectChildContract.kt
  25. 2 2
      app/src/main/java/me/hegj/wandroid/mvp/contract/main/project/ProjectContract.kt
  26. 2 2
      app/src/main/java/me/hegj/wandroid/mvp/contract/main/publicNumber/PublicChildContract.kt
  27. 2 2
      app/src/main/java/me/hegj/wandroid/mvp/contract/main/publicNumber/PublicContract.kt
  28. 2 2
      app/src/main/java/me/hegj/wandroid/mvp/contract/main/tree/NavigationContract.kt
  29. 38 0
      app/src/main/java/me/hegj/wandroid/mvp/contract/main/tree/SquareContract.kt
  30. 2 2
      app/src/main/java/me/hegj/wandroid/mvp/contract/main/tree/SystemContract.kt
  31. 2 2
      app/src/main/java/me/hegj/wandroid/mvp/contract/main/tree/treeinfo/TreeinfoContract.kt
  32. 33 0
      app/src/main/java/me/hegj/wandroid/mvp/contract/share/ShareAriticleContract.kt
  33. 37 0
      app/src/main/java/me/hegj/wandroid/mvp/contract/share/ShareByIdContract.kt
  34. 38 0
      app/src/main/java/me/hegj/wandroid/mvp/contract/share/ShareListContract.kt
  35. 2 2
      app/src/main/java/me/hegj/wandroid/mvp/contract/start/LoginContract.kt
  36. 2 2
      app/src/main/java/me/hegj/wandroid/mvp/contract/todo/AddTodoContract.kt
  37. 2 2
      app/src/main/java/me/hegj/wandroid/mvp/contract/todo/TodoContract.kt
  38. 2 2
      app/src/main/java/me/hegj/wandroid/mvp/contract/web/WebviewContract.kt
  39. 33 0
      app/src/main/java/me/hegj/wandroid/mvp/model/api/Api.kt
  40. 8 0
      app/src/main/java/me/hegj/wandroid/mvp/model/entity/CoinInfo.kt
  41. 6 0
      app/src/main/java/me/hegj/wandroid/mvp/model/entity/ShareResponse.kt
  42. 73 0
      app/src/main/java/me/hegj/wandroid/mvp/model/main/tree/SquareModel.kt
  43. 52 0
      app/src/main/java/me/hegj/wandroid/mvp/model/share/ShareAriticleModel.kt
  44. 70 0
      app/src/main/java/me/hegj/wandroid/mvp/model/share/ShareByIdModel.kt
  45. 57 0
      app/src/main/java/me/hegj/wandroid/mvp/model/share/ShareListModel.kt
  46. 141 0
      app/src/main/java/me/hegj/wandroid/mvp/presenter/main/tree/SquarePresenter.kt
  47. 80 0
      app/src/main/java/me/hegj/wandroid/mvp/presenter/share/ShareAriticlePresenter.kt
  48. 137 0
      app/src/main/java/me/hegj/wandroid/mvp/presenter/share/ShareByIdPresenter.kt
  49. 109 0
      app/src/main/java/me/hegj/wandroid/mvp/presenter/share/ShareListPresenter.kt
  50. 1 5
      app/src/main/java/me/hegj/wandroid/mvp/ui/BaseActivity.kt
  51. 1 9
      app/src/main/java/me/hegj/wandroid/mvp/ui/BaseFragment.kt
  52. 1 1
      app/src/main/java/me/hegj/wandroid/mvp/ui/activity/MainActivity.kt
  53. 4 1
      app/src/main/java/me/hegj/wandroid/mvp/ui/activity/collect/CollectActivity.kt
  54. 1 7
      app/src/main/java/me/hegj/wandroid/mvp/ui/activity/main/home/HomeFragment.kt
  55. 67 9
      app/src/main/java/me/hegj/wandroid/mvp/ui/activity/main/me/MeFragment.kt
  56. 294 0
      app/src/main/java/me/hegj/wandroid/mvp/ui/activity/main/tree/SquareFragment.kt
  57. 1 2
      app/src/main/java/me/hegj/wandroid/mvp/ui/activity/main/tree/SystemFragment.kt
  58. 49 10
      app/src/main/java/me/hegj/wandroid/mvp/ui/activity/main/tree/TreeFragment.kt
  59. 0 1
      app/src/main/java/me/hegj/wandroid/mvp/ui/activity/main/tree/treeinfo/TreeinfoFragment.kt
  60. 1 4
      app/src/main/java/me/hegj/wandroid/mvp/ui/activity/setting/GeneralPreferenceFragment.kt
  61. 0 1
      app/src/main/java/me/hegj/wandroid/mvp/ui/activity/setting/OpenProjectActivity.kt
  62. 84 0
      app/src/main/java/me/hegj/wandroid/mvp/ui/activity/share/ShareAriticleActivity.kt
  63. 272 0
      app/src/main/java/me/hegj/wandroid/mvp/ui/activity/share/ShareByIdActivity.kt
  64. 270 0
      app/src/main/java/me/hegj/wandroid/mvp/ui/activity/share/ShareListActivity.kt
  65. 3 2
      app/src/main/java/me/hegj/wandroid/mvp/ui/activity/todo/AddTodoActivity.kt
  66. 12 22
      app/src/main/java/me/hegj/wandroid/mvp/ui/activity/todo/TodoActivity.kt
  67. 4 2
      app/src/main/java/me/hegj/wandroid/mvp/ui/activity/web/WebviewActivity.kt
  68. 87 68
      app/src/main/java/me/hegj/wandroid/mvp/ui/adapter/AriticleAdapter.kt
  69. 2 2
      app/src/main/java/me/hegj/wandroid/mvp/ui/adapter/CollectAdapter.kt
  70. 26 0
      app/src/main/java/me/hegj/wandroid/mvp/ui/adapter/ShareAdapter.kt
  71. 0 9
      app/src/main/java/me/hegj/wandroid/mvp/ui/base/BaseIView.java
  72. BIN
      app/src/main/res/drawable-xxxhdpi/china_day.png
  73. BIN
      app/src/main/res/drawable-xxxhdpi/collect.png
  74. BIN
      app/src/main/res/drawable-xxxhdpi/cxk.jpg
  75. BIN
      app/src/main/res/drawable-xxxhdpi/default_project_img.jpg
  76. BIN
      app/src/main/res/drawable-xxxhdpi/ic_account.png
  77. BIN
      app/src/main/res/drawable-xxxhdpi/ic_add.png
  78. BIN
      app/src/main/res/drawable-xxxhdpi/ic_back.png
  79. BIN
      app/src/main/res/drawable-xxxhdpi/ic_clear.png
  80. BIN
      app/src/main/res/drawable-xxxhdpi/ic_close.png
  81. BIN
      app/src/main/res/drawable-xxxhdpi/ic_collect.png
  82. BIN
      app/src/main/res/drawable-xxxhdpi/ic_collected.png
  83. BIN
      app/src/main/res/drawable-xxxhdpi/ic_delete.png
  84. BIN
      app/src/main/res/drawable-xxxhdpi/ic_done.png
  85. BIN
      app/src/main/res/drawable-xxxhdpi/ic_favorite.png
  86. BIN
      app/src/main/res/drawable-xxxhdpi/ic_history.png
  87. BIN
      app/src/main/res/drawable-xxxhdpi/ic_more.png
  88. BIN
      app/src/main/res/drawable-xxxhdpi/ic_password_see.png
  89. BIN
      app/src/main/res/drawable-xxxhdpi/ic_password_see_on.png
  90. BIN
      app/src/main/res/drawable-xxxhdpi/ic_right.png
  91. BIN
      app/src/main/res/drawable-xxxhdpi/ic_search.png
  92. BIN
      app/src/main/res/drawable-xxxhdpi/ic_tag.png
  93. BIN
      app/src/main/res/drawable-xxxhdpi/ic_wandroid.png
  94. BIN
      app/src/main/res/drawable-xxxhdpi/ic_yiguoqi.png
  95. BIN
      app/src/main/res/drawable-xxxhdpi/jairu.png
  96. BIN
      app/src/main/res/drawable-xxxhdpi/jifen.png
  97. BIN
      app/src/main/res/drawable-xxxhdpi/load_empty.png
  98. BIN
      app/src/main/res/drawable-xxxhdpi/load_error.png
  99. BIN
      app/src/main/res/drawable-xxxhdpi/menu_main.png
  100. BIN
      app/src/main/res/drawable-xxxhdpi/menu_me.png

+ 24 - 13
app/src/main/AndroidManifest.xml

@@ -2,12 +2,7 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:tools="http://schemas.android.com/tools"
     package="me.hegj.wandroid">
-
-    <uses-permission android:name="android.permission.INTERNET" /> <!-- 联网权限 -->
-    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- SD 卡读权限 -->
-    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <!-- SD 卡写权限 -->
-    <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
-
+    <!-- SD 卡读权限 -->
     <application
         android:name="com.jess.arms.base.BaseApplication"
         android:allowBackup="true"
@@ -19,7 +14,6 @@
         android:supportsRtl="true"
         android:theme="@style/AppTheme"
         tools:ignore="GoogleAppIndexingWarning">
-
         <activity
             android:name=".mvp.ui.activity.start.SplashActivity"
             android:launchMode="singleTask"
@@ -93,24 +87,36 @@
             android:label="待办清单"
             android:launchMode="singleTask"
             android:screenOrientation="portrait" />
-
         <activity
             android:name=".mvp.ui.activity.setting.OpenProjectActivity"
             android:label="开源项目"
             android:launchMode="singleTask"
             android:screenOrientation="portrait" />
+        <activity
+            android:name=".mvp.ui.activity.share.ShareAriticleActivity"
+            android:label="分享文章"
+            android:launchMode="singleTask"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".mvp.ui.activity.share.ShareListActivity"
+            android:label="自己分享的文章列表"
+            android:launchMode="singleTask"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".mvp.ui.activity.share.ShareByIdActivity"
+            android:label="查看别人的信息"
+            android:launchMode="singleTask"
+            android:screenOrientation="portrait" />
         <activity
             android:name=".mvp.ui.activity.error.ErrorActivity"
             android:label="错误界面"
-            android:process =":error_activity"
             android:launchMode="singleTask"
+            android:process=":error_activity"
             android:screenOrientation="portrait" />
         <activity
             android:name="com.tencent.bugly.beta.ui.BetaActivity"
             android:configChanges="keyboardHidden|orientation|screenSize|locale"
-            android:theme="@android:style/Theme.Translucent" />
-
-        <!-- Arms 配置 -->
+            android:theme="@android:style/Theme.Translucent" /> <!-- Arms 配置 -->
         <meta-data
             android:name="design_width_in_dp"
             android:value="375" />
@@ -130,6 +136,11 @@
                 android:name="android.support.FILE_PROVIDER_PATHS"
                 android:resource="@xml/provider_paths" />
         </provider>
-    </application>
+    </application> <!-- SD 卡写权限 -->
+    <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
+    <uses-permission android:name="android.permission.INTERNET" />
+    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+
+    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
 
 </manifest>

+ 20 - 0
app/src/main/java/me/hegj/wandroid/app/event/AddEvent.kt

@@ -0,0 +1,20 @@
+package me.hegj.wandroid.app.event
+
+class AddEvent() : BaseEvent(){
+    var code = TODO_CODE
+
+    constructor(code: Int) : this() {
+        this.code = code
+    }
+
+    companion object{
+        //添加清单
+        val TODO_CODE = 1
+        //分享文章
+        val SHARE_CODE = 2
+        //删除文章
+        val DELETE_CODE = 3
+    }
+
+}
+

+ 0 - 4
app/src/main/java/me/hegj/wandroid/app/event/AddTodoEvent.kt

@@ -1,4 +0,0 @@
-package me.hegj.wandroid.app.event
-
-class AddTodoEvent : BaseEvent()
-

+ 1 - 2
app/src/main/java/me/hegj/wandroid/app/utils/CacheUtil.kt

@@ -7,7 +7,6 @@ import com.tencent.mmkv.MMKV
 import me.hegj.wandroid.mvp.model.entity.*
 
 object CacheUtil {
-
     /**
      * 获取保存的账户信息
      */
@@ -76,7 +75,7 @@ object CacheUtil {
         val kv = MMKV.mmkvWithID("cache")
         val projCacheStr =  kv.decodeString("proj")
         if (!TextUtils.isEmpty(projCacheStr)) {
-            return Gson().fromJson<MutableList<ClassifyResponse>>(projCacheStr
+            return Gson().fromJson(projCacheStr
                     , object : TypeToken<MutableList<ClassifyResponse>>() {}.type)
         }
         return mutableListOf()

+ 1 - 1
app/src/main/java/me/hegj/wandroid/app/utils/ColorUtil.kt

@@ -27,7 +27,7 @@ object ColorUtil {
             Color.parseColor("#78909C"))
 
     val PRIMARY_COLORS_SUB = arrayOf(
-            intArrayOf(Color.parseColor("#EF5350"), Color.parseColor("#F44336"), Color.parseColor("#E53935"),Color.parseColor("#e10015"), Color.parseColor("#D32F2F"), Color.parseColor("#C62828"), Color.parseColor("#B71C1C")),
+            intArrayOf(Color.parseColor("#EF5350"), Color.parseColor("#F44336"), Color.parseColor("#E53935"), Color.parseColor("#D32F2F"), Color.parseColor("#C62828"), Color.parseColor("#B71C1C")),
             intArrayOf(Color.parseColor("#EC407A"), Color.parseColor("#E91E63"), Color.parseColor("#D81B60"), Color.parseColor("#C2185B"), Color.parseColor("#AD1457"), Color.parseColor("#880E4F")),
             intArrayOf(Color.parseColor("#AB47BC"), Color.parseColor("#9C27B0"), Color.parseColor("#8E24AA"), Color.parseColor("#7B1FA2"), Color.parseColor("#6A1B9A"), Color.parseColor("#4A148C")),
             intArrayOf(Color.parseColor("#7E57C2"), Color.parseColor("#673AB7"), Color.parseColor("#5E35B1"), Color.parseColor("#512DA8"), Color.parseColor("#4527A0"), Color.parseColor("#311B92")),

+ 8 - 9
app/src/main/java/me/hegj/wandroid/app/utils/SettingUtil.kt

@@ -24,16 +24,15 @@ object SettingUtil {
      * 获取主题颜色
      */
     fun getColor(context: Context): Int {
-        return if(isHoliDay()){
-            ArmsUtils.getColor(context, R.color.chinaHoliDay)
-        }else{
-            val setting = PreferenceManager.getDefaultSharedPreferences(context)
-            val defaultColor = ArmsUtils.getColor(context, R.color.colorPrimary)
-            val color = setting.getInt("color", defaultColor)
-            if (color != 0 && Color.alpha(color) != 255) {
-                defaultColor
-            } else color
+        val setting = PreferenceManager.getDefaultSharedPreferences(context)
+        val defaultColor = ArmsUtils.getColor(context, R.color.colorPrimary)
+        val color = setting.getInt("color", defaultColor)
+        return if (color != 0 && Color.alpha(color) != 255) {
+            defaultColor
+        } else {
+            color
         }
+
     }
 
     /**

+ 28 - 0
app/src/main/java/me/hegj/wandroid/di/component/main/tree/SquareComponent.kt

@@ -0,0 +1,28 @@
+package me.hegj.wandroid.di.component.main.tree
+
+import dagger.Component
+import com.jess.arms.di.component.AppComponent
+
+import me.hegj.wandroid.di.module.main.tree.SquareModule
+
+import com.jess.arms.di.scope.FragmentScope
+import me.hegj.wandroid.mvp.ui.activity.main.tree.SquareFragment
+
+
+/**
+ * ================================================
+ * Description:
+ * <p>
+ * Created by MVPArmsTemplate on 10/08/2019 09:49
+ * <a href="mailto:jess.yan.effort@gmail.com">Contact me</a>
+ * <a href="https://github.com/JessYanCoding">Follow me</a>
+ * <a href="https://github.com/JessYanCoding/MVPArms">Star me</a>
+ * <a href="https://github.com/JessYanCoding/MVPArms/wiki">See me</a>
+ * <a href="https://github.com/JessYanCoding/MVPArmsTemplate">模版请保持更新</a>
+ * ================================================
+ */
+@FragmentScope
+@Component(modules = arrayOf(SquareModule::class), dependencies = arrayOf(AppComponent::class))
+interface SquareComponent {
+    fun inject(fragment: SquareFragment)
+}

+ 28 - 0
app/src/main/java/me/hegj/wandroid/di/component/share/ShareAriticleComponent.kt

@@ -0,0 +1,28 @@
+package me.hegj.wandroid.di.component.share
+
+import dagger.Component
+import com.jess.arms.di.component.AppComponent
+
+import me.hegj.wandroid.di.module.share.ShareAriticleModule
+
+import com.jess.arms.di.scope.ActivityScope
+import me.hegj.wandroid.mvp.ui.activity.share.ShareAriticleActivity
+
+
+/**
+ * ================================================
+ * Description:
+ * <p>
+ * Created by MVPArmsTemplate on 10/08/2019 13:27
+ * <a href="mailto:jess.yan.effort@gmail.com">Contact me</a>
+ * <a href="https://github.com/JessYanCoding">Follow me</a>
+ * <a href="https://github.com/JessYanCoding/MVPArms">Star me</a>
+ * <a href="https://github.com/JessYanCoding/MVPArms/wiki">See me</a>
+ * <a href="https://github.com/JessYanCoding/MVPArmsTemplate">模版请保持更新</a>
+ * ================================================
+ */
+@ActivityScope
+@Component(modules = arrayOf(ShareAriticleModule::class), dependencies = arrayOf(AppComponent::class))
+interface ShareAriticleComponent {
+    fun inject(activity: ShareAriticleActivity)
+}

+ 28 - 0
app/src/main/java/me/hegj/wandroid/di/component/share/ShareByIdComponent.kt

@@ -0,0 +1,28 @@
+package me.hegj.wandroid.di.component.share
+
+import dagger.Component
+import com.jess.arms.di.component.AppComponent
+
+import me.hegj.wandroid.di.module.share.ShareByIdModule
+
+import com.jess.arms.di.scope.ActivityScope
+import me.hegj.wandroid.mvp.ui.activity.share.ShareByIdActivity
+
+
+/**
+ * ================================================
+ * Description:
+ * <p>
+ * Created by MVPArmsTemplate on 10/09/2019 13:20
+ * <a href="mailto:jess.yan.effort@gmail.com">Contact me</a>
+ * <a href="https://github.com/JessYanCoding">Follow me</a>
+ * <a href="https://github.com/JessYanCoding/MVPArms">Star me</a>
+ * <a href="https://github.com/JessYanCoding/MVPArms/wiki">See me</a>
+ * <a href="https://github.com/JessYanCoding/MVPArmsTemplate">模版请保持更新</a>
+ * ================================================
+ */
+@ActivityScope
+@Component(modules = arrayOf(ShareByIdModule::class), dependencies = arrayOf(AppComponent::class))
+interface ShareByIdComponent {
+    fun inject(activity: ShareByIdActivity)
+}

+ 28 - 0
app/src/main/java/me/hegj/wandroid/di/component/share/ShareListComponent.kt

@@ -0,0 +1,28 @@
+package me.hegj.wandroid.di.component.share
+
+import dagger.Component
+import com.jess.arms.di.component.AppComponent
+
+import me.hegj.wandroid.di.module.share.ShareListModule
+
+import com.jess.arms.di.scope.ActivityScope
+import me.hegj.wandroid.mvp.ui.activity.share.ShareListActivity
+
+
+/**
+ * ================================================
+ * Description:
+ * <p>
+ * Created by MVPArmsTemplate on 10/08/2019 13:26
+ * <a href="mailto:jess.yan.effort@gmail.com">Contact me</a>
+ * <a href="https://github.com/JessYanCoding">Follow me</a>
+ * <a href="https://github.com/JessYanCoding/MVPArms">Star me</a>
+ * <a href="https://github.com/JessYanCoding/MVPArms/wiki">See me</a>
+ * <a href="https://github.com/JessYanCoding/MVPArmsTemplate">模版请保持更新</a>
+ * ================================================
+ */
+@ActivityScope
+@Component(modules = arrayOf(ShareListModule::class), dependencies = arrayOf(AppComponent::class))
+interface ShareListComponent {
+    fun inject(activity: ShareListActivity)
+}

+ 3 - 3
app/src/main/java/me/hegj/wandroid/di/module/main/home/HomeModule.kt

@@ -40,13 +40,13 @@ class HomeModule(private val view: HomeContract.View) {
 
     @FragmentScope
     @Provides
-    fun getData():ArrayList<AriticleResponse>{
-        return arrayListOf()
+    fun getData():MutableList<AriticleResponse>{
+        return mutableListOf()
     }
 
     @FragmentScope
     @Provides
-    fun getAdapter(data:ArrayList<AriticleResponse>):AriticleAdapter{
+    fun getAdapter(data:MutableList<AriticleResponse>):AriticleAdapter{
         return AriticleAdapter(data,true)
     }
 }

+ 38 - 0
app/src/main/java/me/hegj/wandroid/di/module/main/tree/SquareModule.kt

@@ -0,0 +1,38 @@
+package me.hegj.wandroid.di.module.main.tree
+
+import com.jess.arms.di.scope.FragmentScope
+
+import dagger.Module
+import dagger.Provides
+
+import me.hegj.wandroid.mvp.contract.main.tree.SquareContract
+import me.hegj.wandroid.mvp.model.main.tree.SquareModel
+
+
+/**
+ * ================================================
+ * Description:
+ * <p>
+ * Created by MVPArmsTemplate on 10/08/2019 09:49
+ * <a href="mailto:jess.yan.effort@gmail.com">Contact me</a>
+ * <a href="https://github.com/JessYanCoding">Follow me</a>
+ * <a href="https://github.com/JessYanCoding/MVPArms">Star me</a>
+ * <a href="https://github.com/JessYanCoding/MVPArms/wiki">See me</a>
+ * <a href="https://github.com/JessYanCoding/MVPArmsTemplate">模版请保持更新</a>
+ * ================================================
+ */
+@Module
+//构建SquareModule时,将View的实现类传进来,这样就可以提供View的实现类给presenter
+class SquareModule(private val view: SquareContract.View) {
+    @FragmentScope
+    @Provides
+    fun provideSquareView(): SquareContract.View {
+        return this.view
+    }
+
+    @FragmentScope
+    @Provides
+    fun provideSquareModel(model: SquareModel): SquareContract.Model {
+        return model
+    }
+}

+ 38 - 0
app/src/main/java/me/hegj/wandroid/di/module/share/ShareAriticleModule.kt

@@ -0,0 +1,38 @@
+package me.hegj.wandroid.di.module.share
+
+import com.jess.arms.di.scope.ActivityScope
+
+import dagger.Module
+import dagger.Provides
+
+import me.hegj.wandroid.mvp.contract.share.ShareAriticleContract
+import me.hegj.wandroid.mvp.model.share.ShareAriticleModel
+
+
+/**
+ * ================================================
+ * Description:
+ * <p>
+ * Created by MVPArmsTemplate on 10/08/2019 13:27
+ * <a href="mailto:jess.yan.effort@gmail.com">Contact me</a>
+ * <a href="https://github.com/JessYanCoding">Follow me</a>
+ * <a href="https://github.com/JessYanCoding/MVPArms">Star me</a>
+ * <a href="https://github.com/JessYanCoding/MVPArms/wiki">See me</a>
+ * <a href="https://github.com/JessYanCoding/MVPArmsTemplate">模版请保持更新</a>
+ * ================================================
+ */
+@Module
+//构建ShareAriticleModule时,将View的实现类传进来,这样就可以提供View的实现类给presenter
+class ShareAriticleModule(private val view: ShareAriticleContract.View) {
+    @ActivityScope
+    @Provides
+    fun provideShareAriticleView(): ShareAriticleContract.View {
+        return this.view
+    }
+
+    @ActivityScope
+    @Provides
+    fun provideShareAriticleModel(model: ShareAriticleModel): ShareAriticleContract.Model {
+        return model
+    }
+}

+ 38 - 0
app/src/main/java/me/hegj/wandroid/di/module/share/ShareByIdModule.kt

@@ -0,0 +1,38 @@
+package me.hegj.wandroid.di.module.share
+
+import com.jess.arms.di.scope.ActivityScope
+
+import dagger.Module
+import dagger.Provides
+
+import me.hegj.wandroid.mvp.contract.share.ShareByIdContract
+import me.hegj.wandroid.mvp.model.share.ShareByIdModel
+
+
+/**
+ * ================================================
+ * Description:
+ * <p>
+ * Created by MVPArmsTemplate on 10/09/2019 13:20
+ * <a href="mailto:jess.yan.effort@gmail.com">Contact me</a>
+ * <a href="https://github.com/JessYanCoding">Follow me</a>
+ * <a href="https://github.com/JessYanCoding/MVPArms">Star me</a>
+ * <a href="https://github.com/JessYanCoding/MVPArms/wiki">See me</a>
+ * <a href="https://github.com/JessYanCoding/MVPArmsTemplate">模版请保持更新</a>
+ * ================================================
+ */
+@Module
+//构建ShareByIdModule时,将View的实现类传进来,这样就可以提供View的实现类给presenter
+class ShareByIdModule(private val view: ShareByIdContract.View) {
+    @ActivityScope
+    @Provides
+    fun provideShareByIdView(): ShareByIdContract.View {
+        return this.view
+    }
+
+    @ActivityScope
+    @Provides
+    fun provideShareByIdModel(model: ShareByIdModel): ShareByIdContract.Model {
+        return model
+    }
+}

+ 38 - 0
app/src/main/java/me/hegj/wandroid/di/module/share/ShareListModule.kt

@@ -0,0 +1,38 @@
+package me.hegj.wandroid.di.module.share
+
+import com.jess.arms.di.scope.ActivityScope
+
+import dagger.Module
+import dagger.Provides
+
+import me.hegj.wandroid.mvp.contract.share.ShareListContract
+import me.hegj.wandroid.mvp.model.share.ShareListModel
+
+
+/**
+ * ================================================
+ * Description:
+ * <p>
+ * Created by MVPArmsTemplate on 10/08/2019 13:26
+ * <a href="mailto:jess.yan.effort@gmail.com">Contact me</a>
+ * <a href="https://github.com/JessYanCoding">Follow me</a>
+ * <a href="https://github.com/JessYanCoding/MVPArms">Star me</a>
+ * <a href="https://github.com/JessYanCoding/MVPArms/wiki">See me</a>
+ * <a href="https://github.com/JessYanCoding/MVPArmsTemplate">模版请保持更新</a>
+ * ================================================
+ */
+@Module
+//构建ShareListModule时,将View的实现类传进来,这样就可以提供View的实现类给presenter
+class ShareListModule(private val view: ShareListContract.View) {
+    @ActivityScope
+    @Provides
+    fun provideShareListView(): ShareListContract.View {
+        return this.view
+    }
+
+    @ActivityScope
+    @Provides
+    fun provideShareListModel(model: ShareListModel): ShareListContract.Model {
+        return model
+    }
+}

+ 2 - 2
app/src/main/java/me/hegj/wandroid/mvp/contract/MainContract.kt

@@ -1,7 +1,7 @@
 package me.hegj.wandroid.mvp.contract
 
 import com.jess.arms.mvp.IModel
-import me.hegj.wandroid.mvp.ui.base.BaseIView
+import com.jess.arms.mvp.IView
 
 
 /**
@@ -18,7 +18,7 @@ import me.hegj.wandroid.mvp.ui.base.BaseIView
  */
 interface MainContract {
     //对于经常使用的关于UI的方法可以定义到IView中,如显示隐藏进度条,和显示文字消息
-    interface View : BaseIView
+    interface View : IView
 
     //Model层定义接口,外部只需关心Model返回的数据,无需关心内部细节,即是否使用缓存
     interface Model : IModel

+ 2 - 2
app/src/main/java/me/hegj/wandroid/mvp/contract/collect/CollectContract.kt

@@ -1,11 +1,11 @@
 package me.hegj.wandroid.mvp.contract.collect
 
 import com.jess.arms.mvp.IModel
+import com.jess.arms.mvp.IView
 import io.reactivex.Observable
 import me.hegj.wandroid.mvp.model.entity.ApiPagerResponse
 import me.hegj.wandroid.mvp.model.entity.ApiResponse
 import me.hegj.wandroid.mvp.model.entity.CollectResponse
-import me.hegj.wandroid.mvp.ui.base.BaseIView
 
 
 /**
@@ -22,7 +22,7 @@ import me.hegj.wandroid.mvp.ui.base.BaseIView
  */
 interface CollectContract {
     //对于经常使用的关于UI的方法可以定义到IView中,如显示隐藏进度条,和显示文字消息
-    interface View : BaseIView {
+    interface View : IView {
         fun requestDataSucc(apiPagerResponse: ApiPagerResponse<MutableList<CollectResponse>>)
         fun requestDataFaild(errorMsg: String)
         fun uncollect(position:Int)

+ 2 - 2
app/src/main/java/me/hegj/wandroid/mvp/contract/collect/CollectUrlContract.kt

@@ -1,10 +1,10 @@
 package me.hegj.wandroid.mvp.contract.collect
 
 import com.jess.arms.mvp.IModel
+import com.jess.arms.mvp.IView
 import io.reactivex.Observable
 import me.hegj.wandroid.mvp.model.entity.ApiResponse
 import me.hegj.wandroid.mvp.model.entity.CollectUrlResponse
-import me.hegj.wandroid.mvp.ui.base.BaseIView
 
 
 /**
@@ -21,7 +21,7 @@ import me.hegj.wandroid.mvp.ui.base.BaseIView
  */
 interface CollectUrlContract {
     //对于经常使用的关于UI的方法可以定义到IView中,如显示隐藏进度条,和显示文字消息
-    interface View : BaseIView {
+    interface View : IView {
         fun requestDataUrlSucc(apiPagerResponse: MutableList<CollectUrlResponse>)
         fun requestDataFaild(errorMsg: String)
         fun uncollect(position:Int)

+ 2 - 2
app/src/main/java/me/hegj/wandroid/mvp/contract/integral/IntegralContract.kt

@@ -1,12 +1,12 @@
 package me.hegj.wandroid.mvp.contract.integral
 
 import com.jess.arms.mvp.IModel
+import com.jess.arms.mvp.IView
 import io.reactivex.Observable
 import me.hegj.wandroid.mvp.model.entity.ApiPagerResponse
 import me.hegj.wandroid.mvp.model.entity.ApiResponse
 import me.hegj.wandroid.mvp.model.entity.IntegralHistoryResponse
 import me.hegj.wandroid.mvp.model.entity.IntegralResponse
-import me.hegj.wandroid.mvp.ui.base.BaseIView
 
 
 /**
@@ -23,7 +23,7 @@ import me.hegj.wandroid.mvp.ui.base.BaseIView
  */
 interface IntegralContract {
     //对于经常使用的关于UI的方法可以定义到IView中,如显示隐藏进度条,和显示文字消息
-    interface View : BaseIView {
+    interface View : IView {
         fun requestDataSucces(ariticles: ApiPagerResponse<MutableList<IntegralResponse>>)
         fun requestHistoryDataSucces(ariticles: ApiPagerResponse<MutableList<IntegralHistoryResponse>>)
         fun requestDataFaild(errorMsg: String)

+ 1 - 2
app/src/main/java/me/hegj/wandroid/mvp/contract/main/home/HomeContract.kt

@@ -4,7 +4,6 @@ import com.jess.arms.mvp.IView
 import com.jess.arms.mvp.IModel
 import io.reactivex.Observable
 import me.hegj.wandroid.mvp.model.entity.*
-import me.hegj.wandroid.mvp.ui.base.BaseIView
 
 
 /**
@@ -21,7 +20,7 @@ import me.hegj.wandroid.mvp.ui.base.BaseIView
  */
 interface HomeContract {
     //对于经常使用的关于UI的方法可以定义到IView中,如显示隐藏进度条,和显示文字消息
-    interface View : BaseIView {
+    interface View : IView {
         fun  requestBannerSucces(banners : MutableList<BannerResponse>)
         fun  requestAritilSucces(ariticles : ApiPagerResponse<MutableList<AriticleResponse>>)
         fun  requestAritilFaild(errorMsg:String)

+ 2 - 2
app/src/main/java/me/hegj/wandroid/mvp/contract/main/home/search/SearchContract.kt

@@ -1,10 +1,10 @@
 package me.hegj.wandroid.mvp.contract.main.home.search
 
 import com.jess.arms.mvp.IModel
+import com.jess.arms.mvp.IView
 import io.reactivex.Observable
 import me.hegj.wandroid.mvp.model.entity.ApiResponse
 import me.hegj.wandroid.mvp.model.entity.SearchResponse
-import me.hegj.wandroid.mvp.ui.base.BaseIView
 
 
 /**
@@ -21,7 +21,7 @@ import me.hegj.wandroid.mvp.ui.base.BaseIView
  */
 interface SearchContract {
     //对于经常使用的关于UI的方法可以定义到IView中,如显示隐藏进度条,和显示文字消息
-    interface View : BaseIView {
+    interface View : IView {
         fun  requestSearchSucc(tagData:MutableList<SearchResponse>)
     }
 

+ 2 - 2
app/src/main/java/me/hegj/wandroid/mvp/contract/main/home/search/SearchResultContract.kt

@@ -1,11 +1,11 @@
 package me.hegj.wandroid.mvp.contract.main.home.search
 
 import com.jess.arms.mvp.IModel
+import com.jess.arms.mvp.IView
 import io.reactivex.Observable
 import me.hegj.wandroid.mvp.model.entity.ApiPagerResponse
 import me.hegj.wandroid.mvp.model.entity.ApiResponse
 import me.hegj.wandroid.mvp.model.entity.AriticleResponse
-import me.hegj.wandroid.mvp.ui.base.BaseIView
 
 
 /**
@@ -22,7 +22,7 @@ import me.hegj.wandroid.mvp.ui.base.BaseIView
  */
 interface SearchResultContract {
     //对于经常使用的关于UI的方法可以定义到IView中,如显示隐藏进度条,和显示文字消息
-    interface View : BaseIView {
+    interface View : IView {
         fun  requestAritilSucces(ariticles : ApiPagerResponse<MutableList<AriticleResponse>>)
         fun  requestAritilFaild(errorMsg:String)
         fun  collect(collected:Boolean,position:Int)

+ 2 - 2
app/src/main/java/me/hegj/wandroid/mvp/contract/main/me/MeContract.kt

@@ -1,10 +1,10 @@
 package me.hegj.wandroid.mvp.contract.main.me
 
 import com.jess.arms.mvp.IModel
+import com.jess.arms.mvp.IView
 import io.reactivex.Observable
 import me.hegj.wandroid.mvp.model.entity.ApiResponse
 import me.hegj.wandroid.mvp.model.entity.IntegralResponse
-import me.hegj.wandroid.mvp.ui.base.BaseIView
 
 
 /**
@@ -21,7 +21,7 @@ import me.hegj.wandroid.mvp.ui.base.BaseIView
  */
 interface MeContract {
     //对于经常使用的关于UI的方法可以定义到IView中,如显示隐藏进度条,和显示文字消息
-    interface View : BaseIView {
+    interface View : IView {
         //获取积分回调
         fun getIntegralSucc(integral: IntegralResponse)
         fun getIntegralFaild(errorMsg: String)

+ 2 - 2
app/src/main/java/me/hegj/wandroid/mvp/contract/main/project/ProjectChildContract.kt

@@ -1,11 +1,11 @@
 package me.hegj.wandroid.mvp.contract.main.project
 
 import com.jess.arms.mvp.IModel
+import com.jess.arms.mvp.IView
 import io.reactivex.Observable
 import me.hegj.wandroid.mvp.model.entity.ApiPagerResponse
 import me.hegj.wandroid.mvp.model.entity.ApiResponse
 import me.hegj.wandroid.mvp.model.entity.AriticleResponse
-import me.hegj.wandroid.mvp.ui.base.BaseIView
 
 
 /**
@@ -22,7 +22,7 @@ import me.hegj.wandroid.mvp.ui.base.BaseIView
  */
 interface ProjectChildContract {
     //对于经常使用的关于UI的方法可以定义到IView中,如显示隐藏进度条,和显示文字消息
-    interface View : BaseIView {
+    interface View : IView {
         fun requestDataSucc(apiPagerResponse: ApiPagerResponse<MutableList<AriticleResponse>>)
         fun requestDataFaild(errorMsg: String)
         fun  collect(collected:Boolean,position:Int)

+ 2 - 2
app/src/main/java/me/hegj/wandroid/mvp/contract/main/project/ProjectContract.kt

@@ -1,10 +1,10 @@
 package me.hegj.wandroid.mvp.contract.main.project
 
 import com.jess.arms.mvp.IModel
+import com.jess.arms.mvp.IView
 import io.reactivex.Observable
 import me.hegj.wandroid.mvp.model.entity.ApiResponse
 import me.hegj.wandroid.mvp.model.entity.ClassifyResponse
-import me.hegj.wandroid.mvp.ui.base.BaseIView
 
 
 /**
@@ -21,7 +21,7 @@ import me.hegj.wandroid.mvp.ui.base.BaseIView
  */
 interface ProjectContract {
     //对于经常使用的关于UI的方法可以定义到IView中,如显示隐藏进度条,和显示文字消息
-    interface View : BaseIView {
+    interface View : IView {
         fun requestTitileSucc(titles:MutableList<ClassifyResponse>)
     }
 

+ 2 - 2
app/src/main/java/me/hegj/wandroid/mvp/contract/main/publicNumber/PublicChildContract.kt

@@ -1,11 +1,11 @@
 package me.hegj.wandroid.mvp.contract.main.publicNumber
 
 import com.jess.arms.mvp.IModel
+import com.jess.arms.mvp.IView
 import io.reactivex.Observable
 import me.hegj.wandroid.mvp.model.entity.ApiPagerResponse
 import me.hegj.wandroid.mvp.model.entity.ApiResponse
 import me.hegj.wandroid.mvp.model.entity.AriticleResponse
-import me.hegj.wandroid.mvp.ui.base.BaseIView
 
 
 /**
@@ -22,7 +22,7 @@ import me.hegj.wandroid.mvp.ui.base.BaseIView
  */
 interface PublicChildContract {
     //对于经常使用的关于UI的方法可以定义到IView中,如显示隐藏进度条,和显示文字消息
-    interface View : BaseIView {
+    interface View : IView {
         fun requestDataSucc(apiPagerResponse: ApiPagerResponse<MutableList<AriticleResponse>>)
         fun requestDataFaild(errorMsg: String)
         fun  collect(collected:Boolean,position:Int)

+ 2 - 2
app/src/main/java/me/hegj/wandroid/mvp/contract/main/publicNumber/PublicContract.kt

@@ -1,10 +1,10 @@
 package me.hegj.wandroid.mvp.contract.main.publicNumber
 
 import com.jess.arms.mvp.IModel
+import com.jess.arms.mvp.IView
 import io.reactivex.Observable
 import me.hegj.wandroid.mvp.model.entity.ApiResponse
 import me.hegj.wandroid.mvp.model.entity.ClassifyResponse
-import me.hegj.wandroid.mvp.ui.base.BaseIView
 
 
 /**
@@ -21,7 +21,7 @@ import me.hegj.wandroid.mvp.ui.base.BaseIView
  */
 interface PublicContract {
     //对于经常使用的关于UI的方法可以定义到IView中,如显示隐藏进度条,和显示文字消息
-    interface View : BaseIView {
+    interface View : IView {
         fun requestTitileSucc(titles:MutableList<ClassifyResponse>)
     }
 

+ 2 - 2
app/src/main/java/me/hegj/wandroid/mvp/contract/main/tree/NavigationContract.kt

@@ -1,10 +1,10 @@
 package me.hegj.wandroid.mvp.contract.main.tree
 
 import com.jess.arms.mvp.IModel
+import com.jess.arms.mvp.IView
 import io.reactivex.Observable
 import me.hegj.wandroid.mvp.model.entity.ApiResponse
 import me.hegj.wandroid.mvp.model.entity.NavigationResponse
-import me.hegj.wandroid.mvp.ui.base.BaseIView
 
 
 /**
@@ -21,7 +21,7 @@ import me.hegj.wandroid.mvp.ui.base.BaseIView
  */
 interface NavigationContract {
     //对于经常使用的关于UI的方法可以定义到IView中,如显示隐藏进度条,和显示文字消息
-    interface View : BaseIView {
+    interface View : IView {
         fun getNavigationDataSucc(data:MutableList<NavigationResponse>)
     }
 

+ 38 - 0
app/src/main/java/me/hegj/wandroid/mvp/contract/main/tree/SquareContract.kt

@@ -0,0 +1,38 @@
+package me.hegj.wandroid.mvp.contract.main.tree
+
+import com.jess.arms.mvp.IView
+import com.jess.arms.mvp.IModel
+import io.reactivex.Observable
+import me.hegj.wandroid.mvp.model.entity.ApiPagerResponse
+import me.hegj.wandroid.mvp.model.entity.ApiResponse
+import me.hegj.wandroid.mvp.model.entity.AriticleResponse
+
+
+/**
+ * ================================================
+ * Description:
+ * <p>
+ * Created by MVPArmsTemplate on 10/08/2019 09:49
+ * <a href="mailto:jess.yan.effort@gmail.com">Contact me</a>
+ * <a href="https://github.com/JessYanCoding">Follow me</a>
+ * <a href="https://github.com/JessYanCoding/MVPArms">Star me</a>
+ * <a href="https://github.com/JessYanCoding/MVPArms/wiki">See me</a>
+ * <a href="https://github.com/JessYanCoding/MVPArmsTemplate">模版请保持更新</a>
+ * ================================================
+ */
+interface SquareContract {
+    //对于经常使用的关于UI的方法可以定义到IView中,如显示隐藏进度条,和显示文字消息
+    interface View : IView{
+        fun requestDataSucc(apiPagerResponse: ApiPagerResponse<MutableList<AriticleResponse>>)
+        fun requestDataFaild(errorMsg: String)
+        fun collect(collected:Boolean,position:Int)
+    }
+
+    //Model层定义接口,外部只需关心Model返回的数据,无需关心内部细节,即是否使用缓存
+    interface Model : IModel{
+        fun getSquareData(pageNo:Int): Observable<ApiResponse<ApiPagerResponse<MutableList<AriticleResponse>>>>
+        fun collect(id:Int): Observable<ApiResponse<Any>>
+        fun uncollect(id:Int): Observable<ApiResponse<Any>>
+    }
+
+}

+ 2 - 2
app/src/main/java/me/hegj/wandroid/mvp/contract/main/tree/SystemContract.kt

@@ -1,10 +1,10 @@
 package me.hegj.wandroid.mvp.contract.main.tree
 
 import com.jess.arms.mvp.IModel
+import com.jess.arms.mvp.IView
 import io.reactivex.Observable
 import me.hegj.wandroid.mvp.model.entity.ApiResponse
 import me.hegj.wandroid.mvp.model.entity.SystemResponse
-import me.hegj.wandroid.mvp.ui.base.BaseIView
 
 
 /**
@@ -21,7 +21,7 @@ import me.hegj.wandroid.mvp.ui.base.BaseIView
  */
 interface SystemContract {
     //对于经常使用的关于UI的方法可以定义到IView中,如显示隐藏进度条,和显示文字消息
-    interface View : BaseIView {
+    interface View : IView {
         fun getSystemDataSucc(data:MutableList<SystemResponse>)
     }
 

+ 2 - 2
app/src/main/java/me/hegj/wandroid/mvp/contract/main/tree/treeinfo/TreeinfoContract.kt

@@ -1,11 +1,11 @@
 package me.hegj.wandroid.mvp.contract.main.tree.treeinfo
 
 import com.jess.arms.mvp.IModel
+import com.jess.arms.mvp.IView
 import io.reactivex.Observable
 import me.hegj.wandroid.mvp.model.entity.ApiPagerResponse
 import me.hegj.wandroid.mvp.model.entity.ApiResponse
 import me.hegj.wandroid.mvp.model.entity.AriticleResponse
-import me.hegj.wandroid.mvp.ui.base.BaseIView
 
 
 /**
@@ -22,7 +22,7 @@ import me.hegj.wandroid.mvp.ui.base.BaseIView
  */
 interface TreeinfoContract {
     //对于经常使用的关于UI的方法可以定义到IView中,如显示隐藏进度条,和显示文字消息
-    interface View : BaseIView {
+    interface View : IView {
         fun requestDataSucc(apiPagerResponse: ApiPagerResponse<MutableList<AriticleResponse>>)
         fun requestDataFaild(errorMsg: String)
         fun  collect(collected:Boolean,position:Int)

+ 33 - 0
app/src/main/java/me/hegj/wandroid/mvp/contract/share/ShareAriticleContract.kt

@@ -0,0 +1,33 @@
+package me.hegj.wandroid.mvp.contract.share
+
+import com.jess.arms.mvp.IView
+import com.jess.arms.mvp.IModel
+import io.reactivex.Observable
+import me.hegj.wandroid.mvp.model.entity.ApiResponse
+
+
+/**
+ * ================================================
+ * Description:
+ * <p>
+ * Created by MVPArmsTemplate on 10/08/2019 13:27
+ * <a href="mailto:jess.yan.effort@gmail.com">Contact me</a>
+ * <a href="https://github.com/JessYanCoding">Follow me</a>
+ * <a href="https://github.com/JessYanCoding/MVPArms">Star me</a>
+ * <a href="https://github.com/JessYanCoding/MVPArms/wiki">See me</a>
+ * <a href="https://github.com/JessYanCoding/MVPArmsTemplate">模版请保持更新</a>
+ * ================================================
+ */
+interface ShareAriticleContract {
+    //对于经常使用的关于UI的方法可以定义到IView中,如显示隐藏进度条,和显示文字消息
+    interface View : IView{
+        fun addSucc()
+    }
+
+    //Model层定义接口,外部只需关心Model返回的数据,无需关心内部细节,即是否使用缓存
+    interface Model : IModel{
+        fun addAriticle(title: String, url: String): Observable<ApiResponse<Any>>
+
+    }
+
+}

+ 37 - 0
app/src/main/java/me/hegj/wandroid/mvp/contract/share/ShareByIdContract.kt

@@ -0,0 +1,37 @@
+package me.hegj.wandroid.mvp.contract.share
+
+import com.jess.arms.mvp.IView
+import com.jess.arms.mvp.IModel
+import io.reactivex.Observable
+import me.hegj.wandroid.mvp.model.entity.ApiResponse
+import me.hegj.wandroid.mvp.model.entity.ShareResponse
+
+
+/**
+ * ================================================
+ * Description:
+ * <p>
+ * Created by MVPArmsTemplate on 10/09/2019 13:20
+ * <a href="mailto:jess.yan.effort@gmail.com">Contact me</a>
+ * <a href="https://github.com/JessYanCoding">Follow me</a>
+ * <a href="https://github.com/JessYanCoding/MVPArms">Star me</a>
+ * <a href="https://github.com/JessYanCoding/MVPArms/wiki">See me</a>
+ * <a href="https://github.com/JessYanCoding/MVPArmsTemplate">模版请保持更新</a>
+ * ================================================
+ */
+interface ShareByIdContract {
+    //对于经常使用的关于UI的方法可以定义到IView中,如显示隐藏进度条,和显示文字消息
+    interface View : IView{
+        fun requestDataSucces(shareResponse: ShareResponse)
+        fun requestDataFaild(errorMsg: String)
+        fun  collect(collected:Boolean,position:Int)
+    }
+
+    //Model层定义接口,外部只需关心Model返回的数据,无需关心内部细节,即是否使用缓存
+    interface Model : IModel{
+        fun getShareData(pageNo: Int,id:Int): Observable<ApiResponse<ShareResponse>>
+        fun collect(id:Int):Observable<ApiResponse<Any>>
+        fun uncollect(id:Int):Observable<ApiResponse<Any>>
+    }
+
+}

+ 38 - 0
app/src/main/java/me/hegj/wandroid/mvp/contract/share/ShareListContract.kt

@@ -0,0 +1,38 @@
+package me.hegj.wandroid.mvp.contract.share
+
+import com.jess.arms.mvp.IView
+import com.jess.arms.mvp.IModel
+import io.reactivex.Observable
+import me.hegj.wandroid.mvp.model.entity.ApiPagerResponse
+import me.hegj.wandroid.mvp.model.entity.ApiResponse
+import me.hegj.wandroid.mvp.model.entity.ShareResponse
+import me.hegj.wandroid.mvp.model.entity.TodoResponse
+
+
+/**
+ * ================================================
+ * Description:
+ * <p>
+ * Created by MVPArmsTemplate on 10/08/2019 13:26
+ * <a href="mailto:jess.yan.effort@gmail.com">Contact me</a>
+ * <a href="https://github.com/JessYanCoding">Follow me</a>
+ * <a href="https://github.com/JessYanCoding/MVPArms">Star me</a>
+ * <a href="https://github.com/JessYanCoding/MVPArms/wiki">See me</a>
+ * <a href="https://github.com/JessYanCoding/MVPArmsTemplate">模版请保持更新</a>
+ * ================================================
+ */
+interface ShareListContract {
+    //对于经常使用的关于UI的方法可以定义到IView中,如显示隐藏进度条,和显示文字消息
+    interface View : IView{
+        fun requestDataSucces(shareResponse: ShareResponse)
+        fun requestDataFaild(errorMsg: String)
+        fun deleteShareDataSucc(position: Int)
+    }
+
+    //Model层定义接口,外部只需关心Model返回的数据,无需关心内部细节,即是否使用缓存
+    interface Model : IModel{
+        fun getShareData(pageNo: Int): Observable<ApiResponse<ShareResponse>>
+        fun deleteShareData(id: Int): Observable<ApiResponse<Any>>
+    }
+
+}

+ 2 - 2
app/src/main/java/me/hegj/wandroid/mvp/contract/start/LoginContract.kt

@@ -1,10 +1,10 @@
 package me.hegj.wandroid.mvp.contract.start
 
 import com.jess.arms.mvp.IModel
+import com.jess.arms.mvp.IView
 import io.reactivex.Observable
 import me.hegj.wandroid.mvp.model.entity.ApiResponse
 import me.hegj.wandroid.mvp.model.entity.UserInfoResponse
-import me.hegj.wandroid.mvp.ui.base.BaseIView
 
 /**
  * ================================================
@@ -20,7 +20,7 @@ import me.hegj.wandroid.mvp.ui.base.BaseIView
  */
 interface LoginContract {
     //对于经常使用的关于UI的方法可以定义到IView中,如显示隐藏进度条,和显示文字消息
-    interface View : BaseIView {
+    interface View : IView {
         fun onSucc(userinfo:UserInfoResponse)
     }
 

+ 2 - 2
app/src/main/java/me/hegj/wandroid/mvp/contract/todo/AddTodoContract.kt

@@ -1,9 +1,9 @@
 package me.hegj.wandroid.mvp.contract.todo
 
 import com.jess.arms.mvp.IModel
+import com.jess.arms.mvp.IView
 import io.reactivex.Observable
 import me.hegj.wandroid.mvp.model.entity.ApiResponse
-import me.hegj.wandroid.mvp.ui.base.BaseIView
 
 /**
  * ================================================
@@ -19,7 +19,7 @@ import me.hegj.wandroid.mvp.ui.base.BaseIView
  */
 interface AddTodoContract {
     //对于经常使用的关于UI的方法可以定义到IView中,如显示隐藏进度条,和显示文字消息
-    interface View : BaseIView {
+    interface View : IView {
         fun addTodoSucc()
         fun addTodoFaild(errorMsg: String)
     }

+ 2 - 2
app/src/main/java/me/hegj/wandroid/mvp/contract/todo/TodoContract.kt

@@ -1,11 +1,11 @@
 package me.hegj.wandroid.mvp.contract.todo
 
 import com.jess.arms.mvp.IModel
+import com.jess.arms.mvp.IView
 import io.reactivex.Observable
 import me.hegj.wandroid.mvp.model.entity.ApiPagerResponse
 import me.hegj.wandroid.mvp.model.entity.ApiResponse
 import me.hegj.wandroid.mvp.model.entity.TodoResponse
-import me.hegj.wandroid.mvp.ui.base.BaseIView
 
 /**
  * ================================================
@@ -21,7 +21,7 @@ import me.hegj.wandroid.mvp.ui.base.BaseIView
  */
 interface TodoContract {
     //对于经常使用的关于UI的方法可以定义到IView中,如显示隐藏进度条,和显示文字消息
-    interface View : BaseIView {
+    interface View : IView {
         fun requestDataSucces(ariticles: ApiPagerResponse<MutableList<TodoResponse>>)
         fun requestDataFaild(errorMsg: String)
         fun updateTodoDataSucc(position: Int)

+ 2 - 2
app/src/main/java/me/hegj/wandroid/mvp/contract/web/WebviewContract.kt

@@ -1,10 +1,10 @@
 package me.hegj.wandroid.mvp.contract.web
 
 import com.jess.arms.mvp.IModel
+import com.jess.arms.mvp.IView
 import io.reactivex.Observable
 import me.hegj.wandroid.mvp.model.entity.ApiResponse
 import me.hegj.wandroid.mvp.model.entity.CollectUrlResponse
-import me.hegj.wandroid.mvp.ui.base.BaseIView
 
 
 /**
@@ -21,7 +21,7 @@ import me.hegj.wandroid.mvp.ui.base.BaseIView
  */
 interface WebviewContract {
     //对于经常使用的关于UI的方法可以定义到IView中,如显示隐藏进度条,和显示文字消息
-    interface View : BaseIView {
+    interface View : IView {
         fun  collect(collected:Boolean)
         fun  collectUrlSucc(collected:Boolean,data:CollectUrlResponse)
     }

+ 33 - 0
app/src/main/java/me/hegj/wandroid/mvp/model/api/Api.kt

@@ -228,5 +228,38 @@ interface Api {
     @FormUrlEncoded
     fun doneTodo(@Path("id") id: Int, @Field("status") status: Int): Observable<ApiResponse<Any>>
 
+    /**
+     * 获取Todo列表数据 根据完成时间排序
+     */
+    @GET("/user_article/list/{page}/json")
+    fun getSquareData(@Path("page") page: Int): Observable<ApiResponse<ApiPagerResponse<MutableList<AriticleResponse>>>>
+
+    /**
+     * 获取分享文章列表数据
+     */
+    @GET("/user/lg/private_articles/{page}/json")
+    fun getShareData(@Path("page") page: Int): Observable<ApiResponse<ShareResponse>>
+
+
+    /**
+     *  删除自己分享的文章
+     */
+    @POST("/lg/user_article/delete/{id}/json")
+    fun deleteShareData(@Path("id") id: Int): Observable<ApiResponse<Any>>
+
+    /**
+     * 添加文章
+     */
+    @POST("/lg/user_article/add/json")
+    @FormUrlEncoded
+    fun addAriticle(@Field("title") title: String,
+                @Field("link") content: String): Observable<ApiResponse<Any>>
+
+    /**
+     * 获取分享文章列表数据
+     */
+    @GET("/user/{id}/share_articles/{page}/json")
+    fun getShareByidData(@Path("page") page: Int,@Path("id") id: Int): Observable<ApiResponse<ShareResponse>>
+
 
 }

+ 8 - 0
app/src/main/java/me/hegj/wandroid/mvp/model/entity/CoinInfo.kt

@@ -0,0 +1,8 @@
+package me.hegj.wandroid.mvp.model.entity
+
+import java.io.Serializable
+
+/**
+ * 分享人信息
+ */
+data class CoinInfo(var coinCount: Int, var rank:Int, var userId: Int,var username:String) : Serializable

+ 6 - 0
app/src/main/java/me/hegj/wandroid/mvp/model/entity/ShareResponse.kt

@@ -0,0 +1,6 @@
+package me.hegj.wandroid.mvp.model.entity
+
+import java.io.Serializable
+
+data class ShareResponse(var coinInfo: CoinInfo,
+                         var shareArticles: ApiPagerResponse<MutableList<AriticleResponse>>):Serializable

+ 73 - 0
app/src/main/java/me/hegj/wandroid/mvp/model/main/tree/SquareModel.kt

@@ -0,0 +1,73 @@
+package me.hegj.wandroid.mvp.model.main.tree
+
+import android.app.Application
+import com.google.gson.Gson
+import com.jess.arms.integration.IRepositoryManager
+import com.jess.arms.mvp.BaseModel
+
+import com.jess.arms.di.scope.FragmentScope
+import io.reactivex.Observable
+import javax.inject.Inject
+
+import me.hegj.wandroid.mvp.contract.main.tree.SquareContract
+import me.hegj.wandroid.mvp.model.api.Api
+import me.hegj.wandroid.mvp.model.entity.ApiPagerResponse
+import me.hegj.wandroid.mvp.model.entity.ApiResponse
+import me.hegj.wandroid.mvp.model.entity.AriticleResponse
+
+
+/**
+ * ================================================
+ * Description:
+ * <p>
+ * Created by MVPArmsTemplate on 10/08/2019 09:49
+ * <a href="mailto:jess.yan.effort@gmail.com">Contact me</a>
+ * <a href="https://github.com/JessYanCoding">Follow me</a>
+ * <a href="https://github.com/JessYanCoding/MVPArms">Star me</a>
+ * <a href="https://github.com/JessYanCoding/MVPArms/wiki">See me</a>
+ * <a href="https://github.com/JessYanCoding/MVPArmsTemplate">模版请保持更新</a>
+ * ================================================
+ */
+@FragmentScope
+class SquareModel
+@Inject
+constructor(repositoryManager: IRepositoryManager) : BaseModel(repositoryManager), SquareContract.Model {
+    @Inject
+    lateinit var mGson: Gson
+    @Inject
+    lateinit var mApplication: Application
+
+    //获取广场数据
+    override fun getSquareData(pageNo: Int): Observable<ApiResponse<ApiPagerResponse<MutableList<AriticleResponse>>>> {
+        return Observable.just(mRepositoryManager
+                .obtainRetrofitService(Api::class.java)
+                .getSquareData(pageNo))
+                .flatMap { apiResponseObservable ->
+                    apiResponseObservable
+                }
+    }
+
+    //取消收藏
+    override fun uncollect(id: Int): Observable<ApiResponse<Any>> {
+        return Observable.just(mRepositoryManager
+                .obtainRetrofitService(Api::class.java)
+                .uncollect(id))
+                .flatMap { apiResponseObservable ->
+                    apiResponseObservable
+                }
+    }
+    //收藏
+    override fun collect(id: Int): Observable<ApiResponse<Any>> {
+        return Observable.just(mRepositoryManager
+                .obtainRetrofitService(Api::class.java)
+                .collect(id))
+                .flatMap { apiResponseObservable ->
+                    apiResponseObservable
+                }
+    }
+
+
+    override fun onDestroy() {
+        super.onDestroy()
+    }
+}

+ 52 - 0
app/src/main/java/me/hegj/wandroid/mvp/model/share/ShareAriticleModel.kt

@@ -0,0 +1,52 @@
+package me.hegj.wandroid.mvp.model.share
+
+import android.app.Application
+import com.google.gson.Gson
+import com.jess.arms.integration.IRepositoryManager
+import com.jess.arms.mvp.BaseModel
+
+import com.jess.arms.di.scope.ActivityScope
+import io.reactivex.Observable
+import javax.inject.Inject
+
+import me.hegj.wandroid.mvp.contract.share.ShareAriticleContract
+import me.hegj.wandroid.mvp.model.api.Api
+import me.hegj.wandroid.mvp.model.entity.ApiResponse
+
+
+/**
+ * ================================================
+ * Description:
+ * <p>
+ * Created by MVPArmsTemplate on 10/08/2019 13:27
+ * <a href="mailto:jess.yan.effort@gmail.com">Contact me</a>
+ * <a href="https://github.com/JessYanCoding">Follow me</a>
+ * <a href="https://github.com/JessYanCoding/MVPArms">Star me</a>
+ * <a href="https://github.com/JessYanCoding/MVPArms/wiki">See me</a>
+ * <a href="https://github.com/JessYanCoding/MVPArmsTemplate">模版请保持更新</a>
+ * ================================================
+ */
+@ActivityScope
+class ShareAriticleModel
+@Inject
+constructor(repositoryManager: IRepositoryManager) : BaseModel(repositoryManager), ShareAriticleContract.Model {
+
+
+    @Inject
+    lateinit var mGson: Gson;
+    @Inject
+    lateinit var mApplication: Application
+
+
+    override fun addAriticle(title: String, url: String): Observable<ApiResponse<Any>> {
+        return Observable.just(mRepositoryManager.obtainRetrofitService(Api::class.java)
+                .addAriticle(title, url))
+                .flatMap { apiResponseObservable ->
+                    apiResponseObservable
+                }
+    }
+
+    override fun onDestroy() {
+        super.onDestroy()
+    }
+}

+ 70 - 0
app/src/main/java/me/hegj/wandroid/mvp/model/share/ShareByIdModel.kt

@@ -0,0 +1,70 @@
+package me.hegj.wandroid.mvp.model.share
+
+import android.app.Application
+import com.google.gson.Gson
+import com.jess.arms.integration.IRepositoryManager
+import com.jess.arms.mvp.BaseModel
+
+import com.jess.arms.di.scope.ActivityScope
+import io.reactivex.Observable
+import javax.inject.Inject
+
+import me.hegj.wandroid.mvp.contract.share.ShareByIdContract
+import me.hegj.wandroid.mvp.model.api.Api
+import me.hegj.wandroid.mvp.model.entity.ApiResponse
+import me.hegj.wandroid.mvp.model.entity.ShareResponse
+
+
+/**
+ * ================================================
+ * Description:
+ * <p>
+ * Created by MVPArmsTemplate on 10/09/2019 13:20
+ * <a href="mailto:jess.yan.effort@gmail.com">Contact me</a>
+ * <a href="https://github.com/JessYanCoding">Follow me</a>
+ * <a href="https://github.com/JessYanCoding/MVPArms">Star me</a>
+ * <a href="https://github.com/JessYanCoding/MVPArms/wiki">See me</a>
+ * <a href="https://github.com/JessYanCoding/MVPArmsTemplate">模版请保持更新</a>
+ * ================================================
+ */
+@ActivityScope
+class ShareByIdModel
+@Inject
+constructor(repositoryManager: IRepositoryManager) : BaseModel(repositoryManager), ShareByIdContract.Model {
+
+    override fun getShareData(pageNo: Int,id:Int): Observable<ApiResponse<ShareResponse>> {
+        return Observable.just(mRepositoryManager.obtainRetrofitService(Api::class.java)
+                .getShareByidData(pageNo,id))
+                .flatMap { apiResponseObservable ->
+                    apiResponseObservable
+                }
+    }
+
+    //取消收藏
+    override fun uncollect(id: Int): Observable<ApiResponse<Any>> {
+        return Observable.just(mRepositoryManager
+                .obtainRetrofitService(Api::class.java)
+                .uncollect(id))
+                .flatMap { apiResponseObservable ->
+                    apiResponseObservable
+                }
+    }
+    //收藏
+    override fun collect(id: Int): Observable<ApiResponse<Any>> {
+        return Observable.just(mRepositoryManager
+                .obtainRetrofitService(Api::class.java)
+                .collect(id))
+                .flatMap { apiResponseObservable ->
+                    apiResponseObservable
+                }
+    }
+
+    @Inject
+    lateinit var mGson: Gson;
+    @Inject
+    lateinit var mApplication: Application;
+
+    override fun onDestroy() {
+        super.onDestroy();
+    }
+}

+ 57 - 0
app/src/main/java/me/hegj/wandroid/mvp/model/share/ShareListModel.kt

@@ -0,0 +1,57 @@
+package me.hegj.wandroid.mvp.model.share
+
+import android.app.Application
+import com.google.gson.Gson
+import com.jess.arms.di.scope.ActivityScope
+import com.jess.arms.integration.IRepositoryManager
+import com.jess.arms.mvp.BaseModel
+import io.reactivex.Observable
+import me.hegj.wandroid.mvp.contract.share.ShareListContract
+import me.hegj.wandroid.mvp.model.api.Api
+import me.hegj.wandroid.mvp.model.entity.ApiResponse
+import me.hegj.wandroid.mvp.model.entity.ShareResponse
+import javax.inject.Inject
+
+
+/**
+ * ================================================
+ * Description:
+ * <p>
+ * Created by MVPArmsTemplate on 10/08/2019 13:26
+ * <a href="mailto:jess.yan.effort@gmail.com">Contact me</a>
+ * <a href="https://github.com/JessYanCoding">Follow me</a>
+ * <a href="https://github.com/JessYanCoding/MVPArms">Star me</a>
+ * <a href="https://github.com/JessYanCoding/MVPArms/wiki">See me</a>
+ * <a href="https://github.com/JessYanCoding/MVPArmsTemplate">模版请保持更新</a>
+ * ================================================
+ */
+@ActivityScope
+class ShareListModel
+@Inject
+constructor(repositoryManager: IRepositoryManager) : BaseModel(repositoryManager), ShareListContract.Model {
+
+    @Inject
+    lateinit var mGson: Gson
+    @Inject
+    lateinit var mApplication: Application
+
+    override fun getShareData(pageNo: Int): Observable<ApiResponse<ShareResponse>> {
+        return Observable.just(mRepositoryManager.obtainRetrofitService(Api::class.java)
+                .getShareData(pageNo))
+                .flatMap { apiResponseObservable ->
+                    apiResponseObservable
+                }
+    }
+
+    override fun deleteShareData(id: Int): Observable<ApiResponse<Any>> {
+        return Observable.just(mRepositoryManager.obtainRetrofitService(Api::class.java)
+                .deleteShareData(id))
+                .flatMap { apiResponseObservable ->
+                    apiResponseObservable
+                }
+    }
+
+    override fun onDestroy() {
+        super.onDestroy()
+    }
+}

+ 141 - 0
app/src/main/java/me/hegj/wandroid/mvp/presenter/main/tree/SquarePresenter.kt

@@ -0,0 +1,141 @@
+package me.hegj.wandroid.mvp.presenter.main.tree
+
+import android.app.Application
+
+import com.jess.arms.integration.AppManager
+import com.jess.arms.di.scope.FragmentScope
+import com.jess.arms.mvp.BasePresenter
+import com.jess.arms.http.imageloader.ImageLoader
+import com.jess.arms.utils.RxLifecycleUtils
+import com.trello.rxlifecycle2.android.FragmentEvent
+import io.reactivex.android.schedulers.AndroidSchedulers
+import io.reactivex.schedulers.Schedulers
+import me.hegj.wandroid.app.utils.HttpUtils
+import me.jessyan.rxerrorhandler.core.RxErrorHandler
+import javax.inject.Inject
+
+import me.hegj.wandroid.mvp.contract.main.tree.SquareContract
+import me.hegj.wandroid.mvp.model.entity.ApiPagerResponse
+import me.hegj.wandroid.mvp.model.entity.ApiResponse
+import me.hegj.wandroid.mvp.model.entity.AriticleResponse
+import me.jessyan.rxerrorhandler.handler.ErrorHandleSubscriber
+import me.jessyan.rxerrorhandler.handler.RetryWithDelay
+
+
+/**
+ * ================================================
+ * Description:
+ * <p>
+ * Created by MVPArmsTemplate on 10/08/2019 09:49
+ * <a href="mailto:jess.yan.effort@gmail.com">Contact me</a>
+ * <a href="https://github.com/JessYanCoding">Follow me</a>
+ * <a href="https://github.com/JessYanCoding/MVPArms">Star me</a>
+ * <a href="https://github.com/JessYanCoding/MVPArms/wiki">See me</a>
+ * <a href="https://github.com/JessYanCoding/MVPArmsTemplate">模版请保持更新</a>
+ * ================================================
+ */
+@FragmentScope
+class SquarePresenter
+@Inject
+constructor(model: SquareContract.Model, rootView: SquareContract.View) :
+        BasePresenter<SquareContract.Model, SquareContract.View>(model, rootView) {
+    @Inject
+    lateinit var mErrorHandler: RxErrorHandler
+    @Inject
+    lateinit var mApplication: Application
+    @Inject
+    lateinit var mImageLoader: ImageLoader
+    @Inject
+    lateinit var mAppManager: AppManager
+
+
+    /**
+     * 获取广场数据
+     */
+    fun getSquareData(pageNo:Int){
+        mModel.getSquareData(pageNo)
+                .subscribeOn(Schedulers.io())
+                .retryWhen(RetryWithDelay(1, 0))//遇到错误时重试,第一个参数为重试几次,第二个参数为重试的间隔
+                .subscribeOn(AndroidSchedulers.mainThread())
+                .observeOn(AndroidSchedulers.mainThread())
+                .compose(RxLifecycleUtils.bindUntilEvent(mRootView, FragmentEvent.DESTROY))//fragment的绑定方式  使用 Rxlifecycle,使 Disposable 和 Activity 一起销毁
+                .subscribe(object : ErrorHandleSubscriber<ApiResponse<ApiPagerResponse<MutableList<AriticleResponse>>>>(mErrorHandler) {
+                    override fun onNext(response: ApiResponse<ApiPagerResponse<MutableList<AriticleResponse>>>) {
+                        if (response.isSucces()) {
+                            mRootView.requestDataSucc(response.data)
+                        } else {
+                            mRootView.requestDataFaild(response.errorMsg)
+                        }
+                    }
+                    override fun onError(t: Throwable) {
+                        super.onError(t)
+                        mRootView.requestDataFaild(HttpUtils.getErrorText(t))
+                    }
+                })
+    }
+
+
+    /**
+     * 收藏
+     */
+    fun collect(id:Int,position:Int) {
+        mModel.collect(id)
+                .subscribeOn(Schedulers.io())
+                .retryWhen(RetryWithDelay(1, 0))//遇到错误时重试,第一个参数为重试几次,第二个参数为重试的间隔
+                .subscribeOn(AndroidSchedulers.mainThread())
+                .observeOn(AndroidSchedulers.mainThread())
+                .compose(RxLifecycleUtils.bindUntilEvent(mRootView, FragmentEvent.DESTROY))//fragment的绑定方式  使用 Rxlifecycle,使 Disposable 和 Activity 一起销毁
+                .subscribe(object : ErrorHandleSubscriber<ApiResponse<Any>>(mErrorHandler) {
+                    override fun onNext(response: ApiResponse<Any>) {
+                        if (response.isSucces()) {
+                            //收藏成功
+                            mRootView.collect(true,position)
+                        }else{
+                            //收藏失败
+                            mRootView.collect(false,position)
+                            mRootView.showMessage(response.errorMsg)
+                        }
+                    }
+                    override fun onError(t: Throwable) {
+                        super.onError(t)
+                        //收藏失败
+                        mRootView.collect(false,position)
+                        mRootView.showMessage(HttpUtils.getErrorText(t))
+                    }
+                })
+    }
+
+    /**
+     * 取消收藏
+     */
+    fun uncollect(id:Int,position:Int) {
+        mModel.uncollect(id)
+                .subscribeOn(Schedulers.io())
+                .retryWhen(RetryWithDelay(1, 0))//遇到错误时重试,第一个参数为重试几次,第二个参数为重试的间隔
+                .subscribeOn(AndroidSchedulers.mainThread())
+                .observeOn(AndroidSchedulers.mainThread())
+                .compose(RxLifecycleUtils.bindUntilEvent(mRootView, FragmentEvent.DESTROY))//fragment的绑定方式  使用 Rxlifecycle,使 Disposable 和 Activity 一起销毁
+                .subscribe(object : ErrorHandleSubscriber<ApiResponse<Any>>(mErrorHandler) {
+                    override fun onNext(response: ApiResponse<Any>) {
+                        if (response.isSucces()) {
+                            //取消收藏成功
+                            mRootView.collect(false,position)
+                        }else{
+                            //取消收藏失败
+                            mRootView.collect(true,position)
+                            mRootView.showMessage(response.errorMsg)
+                        }
+                    }
+                    override fun onError(t: Throwable) {
+                        super.onError(t)
+                        //取消收藏失败
+                        mRootView.collect(true,position)
+                        mRootView.showMessage(HttpUtils.getErrorText(t))
+                    }
+                })
+    }
+
+    override fun onDestroy() {
+        super.onDestroy()
+    }
+}

+ 80 - 0
app/src/main/java/me/hegj/wandroid/mvp/presenter/share/ShareAriticlePresenter.kt

@@ -0,0 +1,80 @@
+package me.hegj.wandroid.mvp.presenter.share
+
+import android.app.Application
+
+import com.jess.arms.integration.AppManager
+import com.jess.arms.di.scope.ActivityScope
+import com.jess.arms.mvp.BasePresenter
+import com.jess.arms.http.imageloader.ImageLoader
+import com.jess.arms.utils.RxLifecycleUtils
+import io.reactivex.android.schedulers.AndroidSchedulers
+import io.reactivex.schedulers.Schedulers
+import me.hegj.wandroid.app.utils.HttpUtils
+import me.jessyan.rxerrorhandler.core.RxErrorHandler
+import javax.inject.Inject
+
+import me.hegj.wandroid.mvp.contract.share.ShareAriticleContract
+import me.hegj.wandroid.mvp.model.entity.ApiResponse
+import me.jessyan.rxerrorhandler.handler.ErrorHandleSubscriber
+import me.jessyan.rxerrorhandler.handler.RetryWithDelay
+
+
+/**
+ * ================================================
+ * Description:
+ * <p>
+ * Created by MVPArmsTemplate on 10/08/2019 13:27
+ * <a href="mailto:jess.yan.effort@gmail.com">Contact me</a>
+ * <a href="https://github.com/JessYanCoding">Follow me</a>
+ * <a href="https://github.com/JessYanCoding/MVPArms">Star me</a>
+ * <a href="https://github.com/JessYanCoding/MVPArms/wiki">See me</a>
+ * <a href="https://github.com/JessYanCoding/MVPArmsTemplate">模版请保持更新</a>
+ * ================================================
+ */
+@ActivityScope
+class ShareAriticlePresenter
+@Inject
+constructor(model: ShareAriticleContract.Model, rootView: ShareAriticleContract.View) :
+        BasePresenter<ShareAriticleContract.Model, ShareAriticleContract.View>(model, rootView) {
+    @Inject
+    lateinit var mErrorHandler: RxErrorHandler
+    @Inject
+    lateinit var mApplication: Application
+    @Inject
+    lateinit var mImageLoader: ImageLoader
+    @Inject
+    lateinit var mAppManager: AppManager
+
+    fun addAriticle(title: String, url: String) {
+        mModel.addAriticle(title, url)
+                .subscribeOn(Schedulers.io())
+                .retryWhen(RetryWithDelay(1, 0))//遇到错误时重试,第一个参数为重试几次,第二个参数为重试的间隔
+                .doOnSubscribe {
+                    mRootView.showLoading()//显示加载框
+                }
+                .subscribeOn(AndroidSchedulers.mainThread())
+                .doFinally {
+                    mRootView.hideLoading()//隐藏加载框
+                }
+                .observeOn(AndroidSchedulers.mainThread())
+                .compose(RxLifecycleUtils.bindToLifecycle(mRootView))//使用 Rxlifecycle,使 Disposable 和 Activity 一起销毁
+                .subscribe(object : ErrorHandleSubscriber<ApiResponse<Any>>(mErrorHandler) {
+                    override fun onNext(response: ApiResponse<Any>) {
+                        if (response.isSucces()) {
+                            mRootView.addSucc()
+                        } else {
+                            mRootView.showMessage(response.errorMsg)
+                        }
+                    }
+                    override fun onError(t: Throwable) {
+                        super.onError(t)
+                        mRootView.showMessage(HttpUtils.getErrorText(t))
+                    }
+                })
+    }
+
+
+    override fun onDestroy() {
+        super.onDestroy()
+    }
+}

+ 137 - 0
app/src/main/java/me/hegj/wandroid/mvp/presenter/share/ShareByIdPresenter.kt

@@ -0,0 +1,137 @@
+package me.hegj.wandroid.mvp.presenter.share
+
+import android.app.Application
+
+import com.jess.arms.integration.AppManager
+import com.jess.arms.di.scope.ActivityScope
+import com.jess.arms.mvp.BasePresenter
+import com.jess.arms.http.imageloader.ImageLoader
+import com.jess.arms.utils.RxLifecycleUtils
+import com.trello.rxlifecycle2.android.FragmentEvent
+import io.reactivex.android.schedulers.AndroidSchedulers
+import io.reactivex.schedulers.Schedulers
+import me.hegj.wandroid.app.utils.HttpUtils
+import me.jessyan.rxerrorhandler.core.RxErrorHandler
+import javax.inject.Inject
+
+import me.hegj.wandroid.mvp.contract.share.ShareByIdContract
+import me.hegj.wandroid.mvp.model.entity.ApiResponse
+import me.hegj.wandroid.mvp.model.entity.ShareResponse
+import me.jessyan.rxerrorhandler.handler.ErrorHandleSubscriber
+import me.jessyan.rxerrorhandler.handler.RetryWithDelay
+
+
+/**
+ * ================================================
+ * Description:
+ * <p>
+ * Created by MVPArmsTemplate on 10/09/2019 13:20
+ * <a href="mailto:jess.yan.effort@gmail.com">Contact me</a>
+ * <a href="https://github.com/JessYanCoding">Follow me</a>
+ * <a href="https://github.com/JessYanCoding/MVPArms">Star me</a>
+ * <a href="https://github.com/JessYanCoding/MVPArms/wiki">See me</a>
+ * <a href="https://github.com/JessYanCoding/MVPArmsTemplate">模版请保持更新</a>
+ * ================================================
+ */
+@ActivityScope
+class ShareByIdPresenter
+@Inject
+constructor(model: ShareByIdContract.Model, rootView: ShareByIdContract.View) :
+        BasePresenter<ShareByIdContract.Model, ShareByIdContract.View>(model, rootView) {
+    @Inject
+    lateinit var mErrorHandler: RxErrorHandler
+    @Inject
+    lateinit var mApplication: Application
+    @Inject
+    lateinit var mImageLoader: ImageLoader
+    @Inject
+    lateinit var mAppManager: AppManager
+
+
+    fun getShareData(pageNo:Int,id:Int){
+        mModel.getShareData(pageNo,id)
+                .subscribeOn(Schedulers.io())
+                .retryWhen(RetryWithDelay(1, 0))//遇到错误时重试,第一个参数为重试几次,第二个参数为重试的间隔
+                .subscribeOn(AndroidSchedulers.mainThread())
+                .observeOn(AndroidSchedulers.mainThread())
+                .compose(RxLifecycleUtils.bindToLifecycle(mRootView))//使用 Rxlifecycle,使 Disposable 和 Activity 一起销毁
+                .subscribe(object : ErrorHandleSubscriber<ApiResponse<ShareResponse>>(mErrorHandler) {
+                    override fun onNext(response: ApiResponse<ShareResponse>) {
+                        if (response.isSucces()) {
+                            mRootView.requestDataSucces(response.data)
+                        } else {
+                            mRootView.requestDataFaild(response.errorMsg)
+                        }
+                    }
+
+                    override fun onError(t: Throwable) {
+                        super.onError(t)
+                        mRootView.requestDataFaild(HttpUtils.getErrorText(t))
+                    }
+                })
+    }
+
+    /**
+     * 收藏
+     */
+    fun collect(id:Int,position:Int) {
+        mModel.collect(id)
+                .subscribeOn(Schedulers.io())
+                .retryWhen(RetryWithDelay(1, 0))//遇到错误时重试,第一个参数为重试几次,第二个参数为重试的间隔
+                .subscribeOn(AndroidSchedulers.mainThread())
+                .observeOn(AndroidSchedulers.mainThread())
+                .compose(RxLifecycleUtils.bindToLifecycle(mRootView))//fragment的绑定方式  使用 Rxlifecycle,使 Disposable 和 Activity 一起销毁
+                .subscribe(object : ErrorHandleSubscriber<ApiResponse<Any>>(mErrorHandler) {
+                    override fun onNext(response: ApiResponse<Any>) {
+                        if (response.isSucces()) {
+                            //收藏成功
+                            mRootView.collect(true,position)
+                        }else{
+                            //收藏失败
+                            mRootView.collect(false,position)
+                            mRootView.showMessage(response.errorMsg)
+                        }
+                    }
+                    override fun onError(t: Throwable) {
+                        super.onError(t)
+                        //收藏失败
+                        mRootView.collect(false,position)
+                        mRootView.showMessage(HttpUtils.getErrorText(t))
+                    }
+                })
+    }
+
+    /**
+     * 取消收藏
+     */
+    fun uncollect(id:Int,position:Int) {
+        mModel.uncollect(id)
+                .subscribeOn(Schedulers.io())
+                .retryWhen(RetryWithDelay(1, 0))//遇到错误时重试,第一个参数为重试几次,第二个参数为重试的间隔
+                .subscribeOn(AndroidSchedulers.mainThread())
+                .observeOn(AndroidSchedulers.mainThread())
+                .compose(RxLifecycleUtils.bindToLifecycle(mRootView))//fragment的绑定方式  使用 Rxlifecycle,使 Disposable 和 Activity 一起销毁
+                .subscribe(object : ErrorHandleSubscriber<ApiResponse<Any>>(mErrorHandler) {
+                    override fun onNext(response: ApiResponse<Any>) {
+                        if (response.isSucces()) {
+                            //取消收藏成功
+                            mRootView.collect(false,position)
+                        }else{
+                            //取消收藏失败
+                            mRootView.collect(true,position)
+                            mRootView.showMessage(response.errorMsg)
+                        }
+                    }
+                    override fun onError(t: Throwable) {
+                        super.onError(t)
+                        //取消收藏失败
+                        mRootView.collect(true,position)
+                        mRootView.showMessage(HttpUtils.getErrorText(t))
+                    }
+                })
+    }
+
+    override fun onDestroy() {
+        super.onDestroy()
+    }
+}

+ 109 - 0
app/src/main/java/me/hegj/wandroid/mvp/presenter/share/ShareListPresenter.kt

@@ -0,0 +1,109 @@
+package me.hegj.wandroid.mvp.presenter.share
+
+import android.app.Application
+
+import com.jess.arms.integration.AppManager
+import com.jess.arms.di.scope.ActivityScope
+import com.jess.arms.mvp.BasePresenter
+import com.jess.arms.http.imageloader.ImageLoader
+import com.jess.arms.utils.RxLifecycleUtils
+import io.reactivex.android.schedulers.AndroidSchedulers
+import io.reactivex.schedulers.Schedulers
+import me.hegj.wandroid.app.utils.HttpUtils
+import me.jessyan.rxerrorhandler.core.RxErrorHandler
+import javax.inject.Inject
+
+import me.hegj.wandroid.mvp.contract.share.ShareListContract
+import me.hegj.wandroid.mvp.model.entity.ApiPagerResponse
+import me.hegj.wandroid.mvp.model.entity.ApiResponse
+import me.hegj.wandroid.mvp.model.entity.ShareResponse
+import me.hegj.wandroid.mvp.model.entity.TodoResponse
+import me.jessyan.rxerrorhandler.handler.ErrorHandleSubscriber
+import me.jessyan.rxerrorhandler.handler.RetryWithDelay
+
+
+/**
+ * ================================================
+ * Description:
+ * <p>
+ * Created by MVPArmsTemplate on 10/08/2019 13:26
+ * <a href="mailto:jess.yan.effort@gmail.com">Contact me</a>
+ * <a href="https://github.com/JessYanCoding">Follow me</a>
+ * <a href="https://github.com/JessYanCoding/MVPArms">Star me</a>
+ * <a href="https://github.com/JessYanCoding/MVPArms/wiki">See me</a>
+ * <a href="https://github.com/JessYanCoding/MVPArmsTemplate">模版请保持更新</a>
+ * ================================================
+ */
+@ActivityScope
+class ShareListPresenter
+@Inject
+constructor(model: ShareListContract.Model, rootView: ShareListContract.View) :
+        BasePresenter<ShareListContract.Model, ShareListContract.View>(model, rootView) {
+    @Inject
+    lateinit var mErrorHandler: RxErrorHandler
+    @Inject
+    lateinit var mApplication: Application
+    @Inject
+    lateinit var mImageLoader: ImageLoader
+    @Inject
+    lateinit var mAppManager: AppManager
+
+
+    /**
+     * 获取分享的文章集合
+     */
+    fun getShareData(pageNo: Int) {
+        mModel.getShareData(pageNo)
+                .subscribeOn(Schedulers.io())
+                .retryWhen(RetryWithDelay(1, 0))//遇到错误时重试,第一个参数为重试几次,第二个参数为重试的间隔
+                .subscribeOn(AndroidSchedulers.mainThread())
+                .observeOn(AndroidSchedulers.mainThread())
+                .compose(RxLifecycleUtils.bindToLifecycle(mRootView))//使用 Rxlifecycle,使 Disposable 和 Activity 一起销毁
+                .subscribe(object : ErrorHandleSubscriber<ApiResponse<ShareResponse>>(mErrorHandler) {
+                    override fun onNext(response: ApiResponse<ShareResponse>) {
+                        if (response.isSucces()) {
+                            mRootView.requestDataSucces(response.data)
+                        } else {
+                            mRootView.requestDataFaild(response.errorMsg)
+                        }
+                    }
+
+                    override fun onError(t: Throwable) {
+                        super.onError(t)
+                        mRootView.requestDataFaild(HttpUtils.getErrorText(t))
+                    }
+                })
+    }
+
+    fun delAriticle(id: Int, position: Int) {
+        mModel.deleteShareData(id)
+                .subscribeOn(Schedulers.io())
+                .retryWhen(RetryWithDelay(1, 0))//遇到错误时重试,第一个参数为重试几次,第二个参数为重试的间隔
+                .doOnSubscribe {
+                    mRootView.showLoading()//显示加载框
+                }
+                .subscribeOn(AndroidSchedulers.mainThread())
+                .doFinally {
+                    mRootView.hideLoading()//隐藏加载框
+                }
+                .observeOn(AndroidSchedulers.mainThread())
+                .compose(RxLifecycleUtils.bindToLifecycle(mRootView))//使用 Rxlifecycle,使 Disposable 和 Activity 一起销毁
+                .subscribe(object : ErrorHandleSubscriber<ApiResponse<Any>>(mErrorHandler) {
+                    override fun onNext(response: ApiResponse<Any>) {
+                        if (response.isSucces()) {
+                            mRootView.deleteShareDataSucc(position)
+                        } else {
+                            mRootView.showMessage(response.errorMsg)
+                        }
+                    }
+
+                    override fun onError(t: Throwable) {
+                        super.onError(t)
+                        mRootView.showMessage(HttpUtils.getErrorText(t))
+                    }
+                })
+    }
+    override fun onDestroy() {
+        super.onDestroy()
+    }
+}

+ 1 - 5
app/src/main/java/me/hegj/wandroid/mvp/ui/BaseActivity.kt

@@ -24,11 +24,10 @@ import io.reactivex.subjects.Subject
 import me.hegj.wandroid.app.utils.SettingUtil
 import me.hegj.wandroid.app.utils.ShowUtils
 import me.hegj.wandroid.app.utils.StatusBarUtil
-import me.hegj.wandroid.mvp.ui.base.BaseIView
 import me.yokeyword.fragmentation.SupportActivity
 import javax.inject.Inject
 
-abstract class BaseActivity<P : IPresenter> : SupportActivity(), IActivity, ActivityLifecycleable, BaseIView {
+abstract class BaseActivity<P : IPresenter> : SupportActivity(), IActivity, ActivityLifecycleable, IView {
     protected val TAG = this.javaClass.simpleName
     private val mLifecycleSubject = BehaviorSubject.create<ActivityEvent>()
     private var mCache: Cache<*, *>? = null
@@ -131,8 +130,5 @@ abstract class BaseActivity<P : IPresenter> : SupportActivity(), IActivity, Acti
         ShowUtils.showDialog(this, message)
     }
 
-    override fun getActivityContext(): AppCompatActivity {
-        return this
-    }
 
 }

+ 1 - 9
app/src/main/java/me/hegj/wandroid/mvp/ui/BaseFragment.kt

@@ -6,10 +6,7 @@ import android.os.Bundle
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
-import androidx.appcompat.app.AppCompatActivity
-import androidx.appcompat.widget.Toolbar
 import androidx.fragment.app.Fragment
-import com.jess.arms.base.BaseFragment
 import com.jess.arms.base.delegate.IFragment
 import com.jess.arms.integration.cache.Cache
 import com.jess.arms.integration.cache.CacheType
@@ -20,9 +17,7 @@ import com.jess.arms.utils.ArmsUtils
 import com.trello.rxlifecycle2.android.FragmentEvent
 import io.reactivex.subjects.BehaviorSubject
 import io.reactivex.subjects.Subject
-import me.hegj.wandroid.R
 import me.hegj.wandroid.app.utils.ShowUtils
-import me.hegj.wandroid.mvp.ui.base.BaseIView
 import me.yokeyword.fragmentation.SupportFragment
 import javax.inject.Inject
 
@@ -43,7 +38,7 @@ import javax.inject.Inject
  * [Follow me](https://github.com/JessYanCoding)
  * ================================================
  */
-abstract class BaseFragment<P : IPresenter> : SupportFragment(), IFragment, FragmentLifecycleable, BaseIView {
+abstract class BaseFragment<P : IPresenter> : SupportFragment(), IFragment, FragmentLifecycleable, IView {
     protected val TAG = this.javaClass.simpleName
     private val mLifecycleSubject = BehaviorSubject.create<FragmentEvent>()
     private var mCache: Cache<*, *>? = null
@@ -120,7 +115,4 @@ abstract class BaseFragment<P : IPresenter> : SupportFragment(), IFragment, Frag
         ArmsUtils.startActivity(intent)
     }
 
-    override fun getActivityContext(): AppCompatActivity {
-        return _mActivity
-    }
 }

+ 1 - 1
app/src/main/java/me/hegj/wandroid/mvp/ui/activity/MainActivity.kt

@@ -30,7 +30,7 @@ class MainActivity : BaseActivity<IPresenter>() {
             loadRootFragment(R.id.main_framelayout, MainFragment.newInstance())
         }
         //进入首页检查更新
-        Beta.checkUpgrade(true, false)
+        Beta.checkUpgrade(false, true)
     }
 
     override fun onCreateFragmentAnimator(): FragmentAnimator {

+ 4 - 1
app/src/main/java/me/hegj/wandroid/mvp/ui/activity/collect/CollectActivity.kt

@@ -7,8 +7,11 @@ import android.view.animation.AccelerateInterpolator
 import android.view.animation.DecelerateInterpolator
 import com.jess.arms.di.component.AppComponent
 import com.jess.arms.mvp.IPresenter
+import kotlinx.android.synthetic.main.activity_collect.*
 import kotlinx.android.synthetic.main.include_toolbar.*
 import kotlinx.android.synthetic.main.include_viewpager.*
+import kotlinx.android.synthetic.main.include_viewpager.magic_indicator
+import kotlinx.android.synthetic.main.include_viewpager.view_pager
 import me.hegj.wandroid.R
 import me.hegj.wandroid.app.utils.SettingUtil
 import me.hegj.wandroid.app.weight.ScaleTransitionPagerTitleView
@@ -52,7 +55,7 @@ class CollectActivity : BaseActivity<IPresenter>() {
             add(CollectAriticleFragment.newInstance())
             add(CollectUrlFragment.newInstance())
         }
-        viewpager_linear.setBackgroundColor(SettingUtil.getColor(this))
+        collect_viewpager_linear.setBackgroundColor(SettingUtil.getColor(this))
         pagerAdapter = ViewPagerAdapter(supportFragmentManager, fragments)
         view_pager.adapter = pagerAdapter
         val commonNavigator = CommonNavigator(this)

+ 1 - 7
app/src/main/java/me/hegj/wandroid/mvp/ui/activity/main/home/HomeFragment.kt

@@ -108,13 +108,7 @@ class HomeFragment : BaseFragment<HomePresenter>(), HomeContract.View {
         toolbar.run {
             setBackgroundColor(SettingUtil.getColor(_mActivity))
             //当前时间时间没有超过10月7号,使用国庆主题
-            if(SettingUtil.isHoliDay()){
-                title = "为祖国母亲庆生"
-                setNavigationIcon(R.drawable.china_day)
-                setNavigationOnClickListener { this@HomeFragment.showMessage("祝老哥国庆节快乐,感谢老哥的支持,没有卸载这个APP,哈哈") }
-            }else{
-                title = "首页"
-            }
+            title = "首页"
             inflateMenu(R.menu.home_menu)
             setOnMenuItemClickListener {
                 when (it.itemId) {

+ 67 - 9
app/src/main/java/me/hegj/wandroid/mvp/ui/activity/main/me/MeFragment.kt

@@ -5,6 +5,7 @@ import android.os.Bundle
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
+import androidx.preference.Preference
 import butterknife.OnClick
 import com.jess.arms.di.component.AppComponent
 import kotlinx.android.synthetic.main.fragment_me.*
@@ -18,6 +19,7 @@ import me.hegj.wandroid.app.utils.ShowUtils
 import me.hegj.wandroid.di.component.main.me.DaggerMeComponent
 import me.hegj.wandroid.di.module.main.me.MeModule
 import me.hegj.wandroid.mvp.contract.main.me.MeContract
+import me.hegj.wandroid.mvp.model.entity.BannerResponse
 import me.hegj.wandroid.mvp.model.entity.IntegralResponse
 import me.hegj.wandroid.mvp.model.entity.UserInfoResponse
 import me.hegj.wandroid.mvp.presenter.main.me.MePresenter
@@ -25,16 +27,21 @@ import me.hegj.wandroid.mvp.ui.BaseFragment
 import me.hegj.wandroid.mvp.ui.activity.collect.CollectActivity
 import me.hegj.wandroid.mvp.ui.activity.integral.IntegralActivity
 import me.hegj.wandroid.mvp.ui.activity.setting.SettingActivity
+import me.hegj.wandroid.mvp.ui.activity.share.ShareListActivity
 import me.hegj.wandroid.mvp.ui.activity.start.LoginActivity
 import me.hegj.wandroid.mvp.ui.activity.todo.TodoActivity
+import me.hegj.wandroid.mvp.ui.activity.web.WebviewActivity
 import org.greenrobot.eventbus.Subscribe
+import android.net.Uri
+import com.jess.arms.http.imageloader.glide.ImageConfigImpl
+import com.jess.arms.utils.ArmsUtils
+
 
 /**
  * 我的
  */
 class MeFragment : BaseFragment<MePresenter>(), MeContract.View {
 
-
     private lateinit var userInfo: UserInfoResponse
     var integral: IntegralResponse? = null
 
@@ -60,7 +67,7 @@ class MeFragment : BaseFragment<MePresenter>(), MeContract.View {
     override fun initData(savedInstanceState: Bundle?) {
         super.initData(savedInstanceState)
         toolbar.run {
-            title = "我的"
+            title = ""
         }
         me_swipe.run {
             setOnRefreshListener {
@@ -72,6 +79,17 @@ class MeFragment : BaseFragment<MePresenter>(), MeContract.View {
         toolbar.setBackgroundColor(SettingUtil.getColor(_mActivity))
         me_linear.setBackgroundColor(SettingUtil.getColor(_mActivity))
         me_integral.setTextColor(SettingUtil.getColor(_mActivity))
+        ArmsUtils.obtainAppComponentFromContext(_mActivity).imageLoader().loadImage(_mActivity.applicationContext,
+                ImageConfigImpl
+                        .builder()
+                        .url("https://avatars2.githubusercontent.com/u/18655288?s=460&v=4")
+                        .imageView(imageView)
+                        .errorPic(R.drawable.ic_account)
+                        .fallback(R.drawable.ic_account)
+                        .placeholder(R.drawable.ic_account)
+                        .isCrossFade(true)
+                        .isCircle(true)
+                        .build())
     }
 
     override fun onLazyInitView(savedInstanceState: Bundle?) {
@@ -79,12 +97,13 @@ class MeFragment : BaseFragment<MePresenter>(), MeContract.View {
         if (CacheUtil.isLogin()) {
             //如果登录了 赋值,并且请求积分接口
             userInfo = CacheUtil.getUser()
-            me_name.text = userInfo.username
+            me_name.text = if(userInfo.nickname.isEmpty()) userInfo.username else userInfo.nickname
             me_swipe.isRefreshing = true
             mPresenter?.getIntegral()
         } else {
             //没登录,就不要去请求积分接口了
-            me_name.text = "去登录"
+            me_name.text = "请先登录~"
+            me_info.text = "id : -- 排名 : --"
             me_integral.text = "0"
         }
     }
@@ -97,14 +116,15 @@ class MeFragment : BaseFragment<MePresenter>(), MeContract.View {
         if (event.login) {
             //接收到登录了,赋值 并去请求积分接口
             userInfo = CacheUtil.getUser()
-            me_name.text = userInfo.username
+            me_name.text = if(userInfo.nickname.isEmpty()) userInfo.username else userInfo.nickname
             //吊起请求 设置触发 下拉 swipe
             me_swipe.isRefreshing = true
             mPresenter?.getIntegral()
         } else {
             //接受到退出登录了,赶紧清空赋值
-            me_name.text = "去登录"
+            me_name.text = "请先登录~"
             me_integral.text = "0"
+            me_info.text = "id : -- 排名 : --"
         }
     }
 
@@ -119,7 +139,8 @@ class MeFragment : BaseFragment<MePresenter>(), MeContract.View {
         me_integral.setTextColor(SettingUtil.getColor(_mActivity))
     }
 
-    @OnClick(R.id.me_setting, R.id.me_collect, R.id.me_linear, R.id.me_todo, R.id.me_integralLinear)
+    @OnClick(R.id.me_setting, R.id.me_collect, R.id.me_linear, R.id.me_todo, R.id.me_integralLinear
+            , R.id.me_article,R.id.me_join,R.id.me_about)
     fun onViewClicked(view: View) {
         when (view.id) {
             R.id.me_linear -> {
@@ -137,7 +158,7 @@ class MeFragment : BaseFragment<MePresenter>(), MeContract.View {
             R.id.me_todo -> {
                 if (!CacheUtil.isLogin()) {
                     launchActivity(Intent(_mActivity, LoginActivity::class.java))
-                }else{
+                } else {
                     launchActivity(Intent(_mActivity, TodoActivity::class.java))
                 }
             }
@@ -148,12 +169,30 @@ class MeFragment : BaseFragment<MePresenter>(), MeContract.View {
                     launchActivity(Intent(_mActivity, IntegralActivity::class.java).apply {
                         integral?.let {
                             putExtras(Bundle().apply {
-                                putSerializable("integral",it)
+                                putSerializable("integral", it)
                             })
                         }
                     })
                 }
             }
+            R.id.me_article -> {
+                if (!CacheUtil.isLogin()) {
+                    launchActivity(Intent(_mActivity, LoginActivity::class.java))
+                } else {
+                    launchActivity(Intent(_mActivity,ShareListActivity::class.java))
+                }
+            }
+            R.id.me_about ->{
+                val data = BannerResponse("", 0, "", 0, 0, "玩Android网站", 0, "https://www.wanandroid.com/")
+                launchActivity(Intent(_mActivity, WebviewActivity::class.java).apply {
+                    putExtras(Bundle().apply {
+                        putSerializable("bannerdata", data)
+                    })
+                })
+            }
+            R.id.me_join -> {
+                joinQQGroup("arD6CZ5Bt8_ReDpb56-5n5cIY6sBqTtl")
+            }
             R.id.me_setting -> {
                 launchActivity(Intent(_mActivity, SettingActivity::class.java))
             }
@@ -166,6 +205,7 @@ class MeFragment : BaseFragment<MePresenter>(), MeContract.View {
     override fun getIntegralSucc(integral: IntegralResponse) {
         this.integral = integral
         me_swipe.isRefreshing = false
+        me_info.text = "id : ${integral.userId} 排名 : ${integral.rank}"
         me_integral.text = integral.coinCount.toString()
     }
 
@@ -176,4 +216,22 @@ class MeFragment : BaseFragment<MePresenter>(), MeContract.View {
         me_swipe.isRefreshing = false
         ShowUtils.showToast(_mActivity, errorMsg)
     }
+
+    /**
+     * 加入qq聊天群
+     */
+    fun joinQQGroup(key: String): Boolean {
+        val intent = Intent()
+        intent.data = Uri.parse("mqqopensdkapi://bizAgent/qm/qr?url=http%3A%2F%2Fqm.qq.com%2Fcgi-bin%2Fqm%2Fqr%3Ffrom%3Dapp%26p%3Dandroid%26k%3D$key")
+        // 此Flag可根据具体产品需要自定义,如设置,则在加群界面按返回,返回手Q主界面,不设置,按返回会返回到呼起产品界面    //intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+        return try {
+            startActivity(intent)
+            true
+        } catch (e: Exception) {
+            // 未安装手Q或安装的版本不支持
+            ShowUtils.showToast(_mActivity,"未安装手机QQ或安装的版本不支持")
+            false
+        }
+
+    }
 }

+ 294 - 0
app/src/main/java/me/hegj/wandroid/mvp/ui/activity/main/tree/SquareFragment.kt

@@ -0,0 +1,294 @@
+package me.hegj.wandroid.mvp.ui.activity.main.tree
+
+import android.annotation.SuppressLint
+import android.content.Intent
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.TextView
+import androidx.recyclerview.widget.LinearLayoutManager
+import androidx.recyclerview.widget.RecyclerView
+import com.jess.arms.di.component.AppComponent
+import com.kingja.loadsir.core.LoadService
+import com.kingja.loadsir.core.LoadSir
+import com.yanzhenjie.recyclerview.SwipeRecyclerView
+import kotlinx.android.synthetic.main.fragment_list.*
+import kotlinx.android.synthetic.main.include_recyclerview.*
+import kotlinx.coroutines.GlobalScope
+import kotlinx.coroutines.async
+import kotlinx.coroutines.launch
+import me.hegj.wandroid.R
+import me.hegj.wandroid.app.event.AddEvent
+import me.hegj.wandroid.app.event.CollectEvent
+import me.hegj.wandroid.app.event.LoginFreshEvent
+import me.hegj.wandroid.app.event.SettingChangeEvent
+import me.hegj.wandroid.app.utils.RecyclerViewUtils
+import me.hegj.wandroid.app.utils.SettingUtil
+import me.hegj.wandroid.app.utils.SpaceItemDecoration
+import me.hegj.wandroid.app.weight.DefineLoadMoreView
+import me.hegj.wandroid.app.weight.loadCallBack.EmptyCallback
+import me.hegj.wandroid.app.weight.loadCallBack.ErrorCallback
+import me.hegj.wandroid.app.weight.loadCallBack.LoadingCallback
+import me.hegj.wandroid.di.component.main.tree.DaggerSquareComponent
+import me.hegj.wandroid.di.module.main.tree.SquareModule
+import me.hegj.wandroid.mvp.contract.main.tree.SquareContract
+import me.hegj.wandroid.mvp.model.entity.ApiPagerResponse
+import me.hegj.wandroid.mvp.model.entity.AriticleResponse
+import me.hegj.wandroid.mvp.presenter.main.tree.SquarePresenter
+import me.hegj.wandroid.mvp.ui.BaseFragment
+import me.hegj.wandroid.mvp.ui.activity.main.tree.treeinfo.TreeInfoActivity
+import me.hegj.wandroid.mvp.ui.activity.web.WebviewActivity
+import me.hegj.wandroid.mvp.ui.adapter.AriticleAdapter
+import net.lucode.hackware.magicindicator.buildins.UIUtil
+import org.greenrobot.eventbus.Subscribe
+
+/**  广场
+  * @Author:         hegaojian
+  * @CreateDate:     2019/10/8 16:52
+ */
+class SquareFragment : BaseFragment<SquarePresenter>(), SquareContract.View {
+    private var initPageNo = 0 //注意,广场的页码是从0开始的!!!!!
+    var pageNo = initPageNo //当前页码
+    lateinit var loadsir: LoadService<Any>
+    lateinit var adapter: AriticleAdapter
+    private var footView: DefineLoadMoreView? = null
+    companion object {
+        fun newInstance(): SquareFragment {
+            return SquareFragment()
+        }
+    }
+
+    override fun setupFragmentComponent(appComponent: AppComponent) {
+        DaggerSquareComponent //如找不到该类,请编译一下项目
+                .builder()
+                .appComponent(appComponent)
+                .squareModule(SquareModule(this))
+                .build()
+                .inject(this)
+    }
+
+    override fun initView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
+        val rootview = inflater.inflate(R.layout.fragment_list, container, false)
+        //绑定loadsir
+        loadsir = LoadSir.getDefault().register(rootview.findViewById(R.id.swipeRefreshLayout)) {
+            loadsir.showCallback(LoadingCallback::class.java)
+            //点击重试时请求
+            mPresenter?.getSquareData(pageNo)
+        }.apply {
+            SettingUtil.setLoadingColor(_mActivity, this)
+        }
+        return rootview
+    }
+
+    override fun initData(savedInstanceState: Bundle?) {
+        //初始化swipeRefreshLayout
+        swipeRefreshLayout.run {
+            //设置颜色
+            setColorSchemeColors(SettingUtil.getColor(_mActivity))
+            //设置刷新监听回调
+            setOnRefreshListener {
+                pageNo = initPageNo
+                mPresenter?.getSquareData(pageNo)
+            }
+        }
+        floatbtn.run {
+            backgroundTintList = SettingUtil.getOneColorStateList(_mActivity)
+            setOnClickListener {
+                val layoutManager = swiperecyclerview.layoutManager as LinearLayoutManager
+                //如果当前recyclerview 最后一个视图位置的索引大于等于40,则迅速返回顶部,否则带有滚动动画效果返回到顶部
+                if (layoutManager.findLastVisibleItemPosition() >= 40) {
+                    //没有动画迅速返回到顶部(极快)
+                    swiperecyclerview.scrollToPosition(0)
+                } else {
+                    //有滚动动画返回到顶部(有点慢)
+                    swiperecyclerview.smoothScrollToPosition(0)
+                }
+            }
+        }
+        //初始化recyclerview
+        footView = RecyclerViewUtils().initRecyclerView(_mActivity, swiperecyclerview, SwipeRecyclerView.LoadMoreListener {
+            //加载更多
+            mPresenter?.getSquareData(pageNo)
+        }).apply {
+            setLoadViewColor(SettingUtil.getOneColorStateList(_mActivity))
+        }
+        //初始化recyclerview
+        swiperecyclerview.run {
+            layoutManager = LinearLayoutManager(_mActivity)
+            setHasFixedSize(true)
+            //监听recyclerview滑动到顶部的时候,需要把向上返回顶部的按钮隐藏
+            addOnScrollListener(object : RecyclerView.OnScrollListener() {
+                @SuppressLint("RestrictedApi")
+                override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
+                    super.onScrolled(recyclerView, dx, dy)
+                    if (!canScrollVertically(-1)) {
+                        floatbtn.visibility = View.INVISIBLE
+                    }
+                }
+            })
+        }
+        //初始化适配器
+        adapter = AriticleAdapter(mutableListOf(),true).apply {
+            if (SettingUtil.getListMode(_mActivity) != 0) {
+                openLoadAnimation(SettingUtil.getListMode(_mActivity))
+            } else {
+                closeLoadAnimation()
+            }
+            setOnItemClickListener { _, view, position ->
+                launchActivity(Intent(_mActivity, WebviewActivity::class.java).apply {
+                    putExtras(Bundle().apply {
+                        putSerializable("data", this@SquareFragment.adapter.data[position])
+                        putString("tag", this@SquareFragment::class.java.simpleName)
+                        putInt("position", position)
+                    })
+                })
+            }
+        }
+    }
+
+    override fun onLazyInitView(savedInstanceState: Bundle?) {
+        super.onLazyInitView(savedInstanceState)
+        //设置适配器
+        swiperecyclerview.adapter = adapter
+        //设置加载中
+        loadsir.showCallback(LoadingCallback::class.java)
+        //请求数据
+        mPresenter?.getSquareData(pageNo)
+    }
+
+
+    @SuppressLint("RestrictedApi")
+    override fun requestDataSucc(apiPagerResponse: ApiPagerResponse<MutableList<AriticleResponse>>) {
+        swipeRefreshLayout.isRefreshing = false
+        if (pageNo == initPageNo && apiPagerResponse.datas.size == 0) {
+            //如果是第一页,并且没有数据,页面提示空布局
+            loadsir.showCallback(EmptyCallback::class.java)
+        } else if (pageNo == initPageNo) {
+            loadsir.showSuccess()
+            //如果是刷新的话,floatbutton就要隐藏了,因为这时候肯定是要在顶部的
+            floatbtn.visibility = View.INVISIBLE
+            adapter.setNewData(apiPagerResponse.datas)
+        } else {
+            //不是第一页 且有数据
+            loadsir.showSuccess()
+            adapter.addData(apiPagerResponse.datas)
+        }
+        pageNo++
+        if (apiPagerResponse.pageCount >= pageNo) {
+            //如果总条数大于等于当前页数时 还有更多数据
+            swiperecyclerview.loadMoreFinish(false, true)
+        } else {
+            //没有更多数据
+            swiperecyclerview.postDelayed({
+                //解释一下为什么这里要延时0.2秒操作。。。
+                //因为上面的adapter.addData(data) 数据刷新了适配器,是需要等待时间的,还没刷新完,这里就已经执行了没有更多数据
+                //所以在界面上会出现一个小bug,刷新最后一页的时候,没有更多数据啦提示先展示出来了,然后才会加载出请求到的数据
+                //暂时还没有找到好的方法,就用这个处理一下,如果觉得没什么影响的可以去掉这个延时操作,或者有更好的解决方式可以告诉我一下
+                swiperecyclerview.loadMoreFinish(false, false)
+            }, 200)
+        }
+    }
+
+    override fun requestDataFaild(errorMsg: String) {
+        swipeRefreshLayout.isRefreshing = false
+        if (pageNo == initPageNo) {
+            //如果页码是 初始页 说明是刷新,界面切换成错误页
+            loadsir.setCallBack(ErrorCallback::class.java) { _, view ->
+                //设置错误页文字错误提示
+                view.findViewById<TextView>(R.id.error_text).text = errorMsg
+            }
+            //设置错误
+            loadsir.showCallback(ErrorCallback::class.java)
+        } else {
+            //页码不是0 说明是加载更多时出现的错误,设置recyclerview加载错误,
+            swiperecyclerview.loadMoreError(0, errorMsg)
+        }
+    }
+
+    /**
+     * 收藏回调
+     */
+    override fun collect(collected: Boolean, position: Int) {
+        CollectEvent(collected,adapter.data[position].id).post()
+    }
+
+    /**
+     * 接收到登录或退出的EventBus 刷新数据
+     */
+    @Subscribe
+    fun freshLogin(event: LoginFreshEvent) {
+        //如果是登录了, 当前界面的数据与账户收藏集合id匹配的值需要设置已经收藏
+        if (event.login) {
+            event.collectIds.forEach {
+                for (item in adapter.data) {
+                    if (item.id == it.toInt()) {
+                        item.collect = true
+                        break
+                    }
+                }
+            }
+        } else {
+            //退出了,把所有的收藏全部变为未收藏
+            for (item in adapter.data) {
+                item.collect = false
+            }
+        }
+        adapter.notifyDataSetChanged()
+    }
+
+    /**
+     * 在详情中收藏时,接收到EventBus
+     */
+    @Subscribe
+    fun collectChange(event: CollectEvent) {
+        //使用协程做耗时操作
+        GlobalScope.launch{
+            async {
+                var indexResult = -1
+                for (index in adapter.data.indices) {
+                    if (adapter.data[index].id == event.id) {
+                        adapter.data[index].collect = event.collect
+                        indexResult = index
+                        break
+                    }
+                }
+                indexResult
+            }.run {
+                if(await()!=-1){
+                    adapter.notifyItemChanged(await())
+                }
+            }
+        }
+    }
+
+    /**
+     * 接收到event时,重新设置当前界面控件的主题颜色和一些其他配置
+     */
+    @Subscribe
+    fun settingEvent(event: SettingChangeEvent) {
+        floatbtn.backgroundTintList = SettingUtil.getOneColorStateList(_mActivity)
+        swipeRefreshLayout.setColorSchemeColors(SettingUtil.getColor(_mActivity))
+        SettingUtil.setLoadingColor(_mActivity, loadsir)
+        footView?.setLoadViewColor(SettingUtil.getOneColorStateList(_mActivity))
+        if (SettingUtil.getListMode(_mActivity) != 0) {
+            adapter.openLoadAnimation(SettingUtil.getListMode(_mActivity))
+        } else {
+            adapter.closeLoadAnimation()
+        }
+    }
+
+    /**
+     * 接收到添加了分享文章的通知
+     */
+    @Subscribe
+    fun addEvent(event: AddEvent){
+        if(event.code== AddEvent.SHARE_CODE ||event.code==AddEvent.DELETE_CODE){
+            //刷新
+            swipeRefreshLayout.isRefreshing = true
+            pageNo = initPageNo
+            mPresenter?.getSquareData(pageNo)
+        }
+    }
+
+}

+ 1 - 2
app/src/main/java/me/hegj/wandroid/mvp/ui/activity/main/tree/SystemFragment.kt

@@ -41,8 +41,7 @@ class SystemFragment : BaseFragment<SystemPresenter>(), SystemContract.View {
 
     companion object {
         fun newInstance(): SystemFragment {
-            val fragment = SystemFragment()
-            return fragment
+            return SystemFragment()
         }
     }
 

+ 49 - 10
app/src/main/java/me/hegj/wandroid/mvp/ui/activity/main/tree/TreeFragment.kt

@@ -1,6 +1,7 @@
 package me.hegj.wandroid.mvp.ui.activity.main.tree
 
 import android.content.Context
+import android.content.Intent
 import android.graphics.Color
 import android.os.Bundle
 import android.view.LayoutInflater
@@ -8,14 +9,18 @@ import android.view.View
 import android.view.ViewGroup
 import android.view.animation.AccelerateInterpolator
 import android.view.animation.DecelerateInterpolator
+import androidx.viewpager.widget.ViewPager
 import com.jess.arms.di.component.AppComponent
 import com.jess.arms.mvp.IPresenter
+import kotlinx.android.synthetic.main.include_toolbar.*
 import kotlinx.android.synthetic.main.include_viewpager.*
 import me.hegj.wandroid.R
 import me.hegj.wandroid.app.event.SettingChangeEvent
 import me.hegj.wandroid.app.utils.SettingUtil
 import me.hegj.wandroid.app.weight.ScaleTransitionPagerTitleView
 import me.hegj.wandroid.mvp.ui.BaseFragment
+import me.hegj.wandroid.mvp.ui.activity.main.home.search.SearchActivity
+import me.hegj.wandroid.mvp.ui.activity.share.ShareAriticleActivity
 import me.hegj.wandroid.mvp.ui.adapter.ViewPagerAdapter
 import me.yokeyword.fragmentation.SupportFragment
 import net.lucode.hackware.magicindicator.ViewPagerHelper
@@ -27,12 +32,14 @@ import net.lucode.hackware.magicindicator.buildins.commonnavigator.abs.IPagerTit
 import net.lucode.hackware.magicindicator.buildins.commonnavigator.indicators.LinePagerIndicator
 import org.greenrobot.eventbus.Subscribe
 
+
+
 /**
  * 体系
  */
 
 class TreeFragment : BaseFragment<IPresenter>() {
-    var mDataList = arrayListOf("体系", "导航")
+    var mDataList = arrayListOf("广场","体系", "导航")
     var fragments: MutableList<SupportFragment> = mutableListOf()
     internal var pagerAdapter: ViewPagerAdapter? = null
 
@@ -51,18 +58,44 @@ class TreeFragment : BaseFragment<IPresenter>() {
     }
 
     override fun initData(savedInstanceState: Bundle?) {
-
+        include_viewpager_toolbar.apply {
+            setBackgroundColor(SettingUtil.getColor(_mActivity))
+            inflateMenu(R.menu.todo_menu)
+            setOnMenuItemClickListener {
+                when (it.itemId) {
+                    R.id.todo_add -> launchActivity(Intent(_mActivity, ShareAriticleActivity::class.java))
+                }
+                true
+            }
+        }
+        viewpager_linear.setBackgroundColor(SettingUtil.getColor(_mActivity))
     }
 
     override fun onLazyInitView(savedInstanceState: Bundle?) {
         super.onLazyInitView(savedInstanceState)
         fragments.run {
+            add(SquareFragment.newInstance())
             add(SystemFragment.newInstance())
             add(NavigationFragment.newInstance())
         }
-        viewpager_linear.setBackgroundColor(SettingUtil.getColor(_mActivity))
         pagerAdapter = ViewPagerAdapter(childFragmentManager, fragments)
-        view_pager.adapter = pagerAdapter
+        view_pager.apply {
+            adapter = pagerAdapter
+            offscreenPageLimit = fragments.size
+            addOnPageChangeListener(object :ViewPager.OnPageChangeListener{
+                override fun onPageScrollStateChanged(state: Int) {}
+                override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {}
+                override fun onPageSelected(position: Int) {
+                    if(position!=0){
+                        this@TreeFragment.include_viewpager_toolbar.menu.clear()
+                    }else{
+                        this@TreeFragment.include_viewpager_toolbar.menu.hasVisibleItems().let {
+                            if(!it)this@TreeFragment.include_viewpager_toolbar.inflateMenu(R.menu.todo_menu)
+                        }
+                    }
+                }
+            })
+        }
         val commonNavigator = CommonNavigator(_mActivity)
         commonNavigator.adapter = object : CommonNavigatorAdapter() {
             override fun getCount(): Int {
@@ -75,7 +108,17 @@ class TreeFragment : BaseFragment<IPresenter>() {
                     textSize = 18f
                     normalColor = Color.WHITE
                     selectedColor = Color.WHITE
-                    setOnClickListener { view_pager.setCurrentItem(index, false) }
+                    setOnClickListener {
+                        view_pager.setCurrentItem(index, false)
+                        if(index!=0){
+                            this@TreeFragment.include_viewpager_toolbar.menu.clear()
+                        }else{
+                            this@TreeFragment.include_viewpager_toolbar.menu.hasVisibleItems().let {
+                                if(!it)this@TreeFragment.include_viewpager_toolbar.inflateMenu(R.menu.todo_menu)
+                            }
+                        }
+
+                    }
                 }
             }
 
@@ -95,16 +138,12 @@ class TreeFragment : BaseFragment<IPresenter>() {
         ViewPagerHelper.bind(magic_indicator, view_pager)
     }
 
-    override fun onResume() {
-        super.onResume()
-        viewpager_linear.setBackgroundColor(SettingUtil.getColor(_mActivity))
-    }
-
     /**
      * 接收到event时,重新设置当前界面控件的主题颜色和一些其他配置
      */
     @Subscribe
     fun settingEvent(event: SettingChangeEvent) {
         viewpager_linear.setBackgroundColor(SettingUtil.getColor(_mActivity))
+        include_viewpager_toolbar.setBackgroundColor(SettingUtil.getColor(_mActivity))
     }
 }

+ 0 - 1
app/src/main/java/me/hegj/wandroid/mvp/ui/activity/main/tree/treeinfo/TreeinfoFragment.kt

@@ -42,7 +42,6 @@ import me.hegj.wandroid.mvp.ui.activity.web.WebviewActivity
 import me.hegj.wandroid.mvp.ui.adapter.AriticleAdapter
 import org.greenrobot.eventbus.Subscribe
 
-
 /**
  * @Author:         hegaojian
  * @CreateDate:     2019/8/23 17:14

+ 1 - 4
app/src/main/java/me/hegj/wandroid/mvp/ui/activity/setting/GeneralPreferenceFragment.kt

@@ -84,9 +84,6 @@ class GeneralPreferenceFragment : PreferenceFragmentCompat(), SharedPreferences.
                     SettingUtil.setColor(parentActivity, color)
                     //通知其他界面立马修改配置
                     SettingChangeEvent().post()
-                    if(SettingUtil.isHoliDay()){
-                        parentActivity.showMessage("大家一起给祖国母亲庆生,固定大红色走起,10月8号自动恢复正常")
-                    }
                 }
                 positiveButton(R.string.done)
                 negativeButton(R.string.cancel)
@@ -107,7 +104,7 @@ class GeneralPreferenceFragment : PreferenceFragmentCompat(), SharedPreferences.
             false
         }
         findPreference<Preference>("project")?.setOnPreferenceClickListener {
-            val data = BannerResponse("", 0, "", 0, 0, "一位练习长两年半的安卓练习生根据鸿神提供的WanAndroid开放Api来制作的产品级App", 0, findPreference<Preference>("project")?.summary.toString())
+            val data = BannerResponse("", 0, "", 0, 0, "一位练习长两年半的安卓练习生根据鸿神提供的WanAndroid开放Api来制作的产品级App", 0, findPreference<Preference>("project")?.summary.toString())
             parentActivity.launchActivity(Intent(parentActivity, WebviewActivity::class.java).apply {
                 putExtras(Bundle().apply {
                     putSerializable("bannerdata", data)

+ 0 - 1
app/src/main/java/me/hegj/wandroid/mvp/ui/activity/setting/OpenProjectActivity.kt

@@ -82,7 +82,6 @@ class OpenProjectActivity : BaseActivity<IPresenter>() {
         openData.add(OpenProject("Agentweb", "AgentWeb is a powerful library based on Android WebView", "https://github.com/Justson/AgentWeb"))
         openData.add(OpenProject("FlowLayout", "Android流式布局,支持单选、多选等,适合用于产品标签等。", "https://github.com/hongyangAndroid/FlowLayout"))
         openData.add(OpenProject("MMKV", "An efficient, small mobile key-value storage framework developed by WeChat. Works on iOS, Android, macOS and Windows.", "https://github.com/Tencent/MMKV"))
-        openData.add(OpenProject("SmartSwipe", "An android library to make swipe more easier and more powerful. 关于侧滑,有这一个就够了", "https://github.com/luckybilly/SmartSwipe"))
         openData.add(OpenProject("CustomActivityOnCrash", "Android库允许在应用崩溃时启动自定义活动,而不是显示讨厌的“不幸的是,X已经停止”对话框。", "https://github.com/Ereza/CustomActivityOnCrash"))
     }
 }

+ 84 - 0
app/src/main/java/me/hegj/wandroid/mvp/ui/activity/share/ShareAriticleActivity.kt

@@ -0,0 +1,84 @@
+package me.hegj.wandroid.mvp.ui.activity.share
+
+import android.os.Bundle
+import android.view.View
+import butterknife.OnClick
+import com.afollestad.materialdialogs.MaterialDialog
+import com.jess.arms.di.component.AppComponent
+import kotlinx.android.synthetic.main.activity_share_ariticle.*
+import kotlinx.android.synthetic.main.include_recyclerview.*
+import kotlinx.android.synthetic.main.include_toolbar.*
+import me.hegj.wandroid.R
+import me.hegj.wandroid.app.event.AddEvent
+import me.hegj.wandroid.app.event.AddEvent.Companion.SHARE_CODE
+import me.hegj.wandroid.app.utils.CacheUtil
+import me.hegj.wandroid.app.utils.SettingUtil
+import me.hegj.wandroid.di.component.share.DaggerShareAriticleComponent
+import me.hegj.wandroid.di.module.share.ShareAriticleModule
+import me.hegj.wandroid.mvp.contract.share.ShareAriticleContract
+import me.hegj.wandroid.mvp.model.entity.UserInfoResponse
+import me.hegj.wandroid.mvp.presenter.share.ShareAriticlePresenter
+import me.hegj.wandroid.mvp.ui.BaseActivity
+import org.greenrobot.eventbus.Subscribe
+
+/**
+ * 分享文章
+ * @Author:         hegaojian
+ * @CreateDate:     2019/10/8 13:28
+ */
+class ShareAriticleActivity : BaseActivity<ShareAriticlePresenter>(), ShareAriticleContract.View {
+    lateinit var user:UserInfoResponse
+    override fun setupActivityComponent(appComponent: AppComponent) {
+        DaggerShareAriticleComponent //如找不到该类,请编译一下项目
+                .builder()
+                .appComponent(appComponent)
+                .shareAriticleModule(ShareAriticleModule(this))
+                .build()
+                .inject(this)
+    }
+
+
+    override fun initView(savedInstanceState: Bundle?): Int {
+        return R.layout.activity_share_ariticle //如果你不需要框架帮你设置 setContentView(id) 需要自行设置,请返回 0
+    }
+
+
+    override fun initData(savedInstanceState: Bundle?) {
+        toolbar.run {
+            setSupportActionBar(this)
+            title = "分享文章"
+            setNavigationIcon(R.drawable.ic_back)
+            setNavigationOnClickListener { finish() }
+        }
+        user = CacheUtil.getUser()
+        SettingUtil.setShapColor(share_submit, SettingUtil.getColor(this))
+        share_username.hint = if (user.nickname.isEmpty()) user.username else user.nickname
+    }
+
+    @OnClick(R.id.share_submit)
+    fun onViewClicked(view: View) {
+        when (view.id) {
+            R.id.share_submit -> {
+                when {
+                    share_title.text.toString().isEmpty() -> showMessage("请填写文章标题")
+                    share_url.text.toString().isEmpty() -> showMessage("请填写文章链接")
+                    else -> MaterialDialog(this).show {
+                        title(R.string.title)
+                        message(text = "确定分享吗?")
+                        positiveButton(text = "确定") {
+                            mPresenter?.addAriticle(this@ShareAriticleActivity.share_title.text.toString(),
+                                    this@ShareAriticleActivity.share_url.text.toString())
+                        }
+                        negativeButton(text = "取消")
+                    }
+                }
+            }
+        }
+    }
+
+    override fun addSucc() {
+        AddEvent(SHARE_CODE).post()
+        finish()
+    }
+
+}

+ 272 - 0
app/src/main/java/me/hegj/wandroid/mvp/ui/activity/share/ShareByIdActivity.kt

@@ -0,0 +1,272 @@
+package me.hegj.wandroid.mvp.ui.activity.share
+
+import android.annotation.SuppressLint
+import android.content.Intent
+import android.os.Bundle
+import android.view.View
+import android.widget.TextView
+import androidx.recyclerview.widget.LinearLayoutManager
+import androidx.recyclerview.widget.RecyclerView
+import com.chad.library.adapter.base.BaseViewHolder
+import com.jess.arms.di.component.AppComponent
+import com.jess.arms.http.imageloader.glide.ImageConfigImpl
+import com.jess.arms.utils.ArmsUtils
+import com.kingja.loadsir.core.LoadService
+import com.kingja.loadsir.core.LoadSir
+import com.yanzhenjie.recyclerview.SwipeRecyclerView
+import kotlinx.android.synthetic.main.activity_share_by_id.*
+import kotlinx.android.synthetic.main.fragment_list.*
+import kotlinx.android.synthetic.main.include_recyclerview.*
+import kotlinx.android.synthetic.main.include_toolbar.*
+import kotlinx.coroutines.GlobalScope
+import kotlinx.coroutines.async
+import kotlinx.coroutines.launch
+import me.hegj.wandroid.R
+import me.hegj.wandroid.app.event.CollectEvent
+import me.hegj.wandroid.app.event.LoginFreshEvent
+import me.hegj.wandroid.app.utils.RecyclerViewUtils
+import me.hegj.wandroid.app.utils.SettingUtil
+import me.hegj.wandroid.app.weight.CollectView
+import me.hegj.wandroid.app.weight.DefineLoadMoreView
+import me.hegj.wandroid.app.weight.loadCallBack.EmptyCallback
+import me.hegj.wandroid.app.weight.loadCallBack.ErrorCallback
+import me.hegj.wandroid.app.weight.loadCallBack.LoadingCallback
+import me.hegj.wandroid.di.component.share.DaggerShareByIdComponent
+import me.hegj.wandroid.di.module.share.ShareByIdModule
+import me.hegj.wandroid.mvp.contract.share.ShareByIdContract
+import me.hegj.wandroid.mvp.model.entity.ShareResponse
+import me.hegj.wandroid.mvp.presenter.share.ShareByIdPresenter
+import me.hegj.wandroid.mvp.ui.BaseActivity
+import me.hegj.wandroid.mvp.ui.activity.web.WebviewActivity
+import me.hegj.wandroid.mvp.ui.adapter.AriticleAdapter
+import org.greenrobot.eventbus.Subscribe
+
+class ShareByIdActivity : BaseActivity<ShareByIdPresenter>(), ShareByIdContract.View {
+    var id:Int = 0
+    lateinit var loadsir: LoadService<Any>
+    lateinit var adapter: AriticleAdapter
+    private var initPageNo = 1
+    private var pageNo: Int = initPageNo //当前页码
+    private var footView: DefineLoadMoreView? = null
+    override fun setupActivityComponent(appComponent: AppComponent) {
+        DaggerShareByIdComponent //如找不到该类,请编译一下项目
+                .builder()
+                .appComponent(appComponent)
+                .shareByIdModule(ShareByIdModule(this))
+                .build()
+                .inject(this)
+    }
+
+
+    override fun initView(savedInstanceState: Bundle?): Int {
+        return R.layout.activity_share_by_id //如果你不需要框架帮你设置 setContentView(id) 需要自行设置,请返回 0
+    }
+
+    override fun initData(savedInstanceState: Bundle?) {
+        toolbar.run {
+            setSupportActionBar(this)
+            title = "他的信息"
+            setNavigationIcon(R.drawable.ic_back)
+            setNavigationOnClickListener { finish() }
+        }
+        share_layout.setBackgroundColor(SettingUtil.getColor(this))
+        ArmsUtils.obtainAppComponentFromContext(this).imageLoader().loadImage(this.applicationContext,
+                ImageConfigImpl
+                        .builder()
+                        .url("https://avatars2.githubusercontent.com/u/18655288?s=460&v=4")
+                        .imageView(share_logo)
+                        .errorPic(R.drawable.ic_account)
+                        .fallback(R.drawable.ic_account)
+                        .placeholder(R.drawable.ic_account)
+                        .isCrossFade(true)
+                        .isCircle(true)
+                        .build())
+        id = intent.getIntExtra("id",0)
+        //绑定loadsir
+        loadsir = LoadSir.getDefault().register(share_linear) {
+            //界面加载失败,或者没有数据时,点击重试的监听
+            loadsir.showCallback(LoadingCallback::class.java)
+            pageNo = initPageNo
+            mPresenter?.getShareData(pageNo,id)
+        }.apply {
+            SettingUtil.setLoadingColor(this@ShareByIdActivity, this)
+            showCallback(LoadingCallback::class.java)
+        }
+        //初始化adapter
+        adapter = AriticleAdapter(arrayListOf(), showTag = true, clickable = false).apply {
+            if (SettingUtil.getListMode(this@ShareByIdActivity) != 0) {
+                openLoadAnimation(SettingUtil.getListMode(this@ShareByIdActivity))
+            } else {
+                closeLoadAnimation()
+            }
+            setOnCollectViewClickListener(object : AriticleAdapter.OnCollectViewClickListener {
+                override fun onClick(helper: BaseViewHolder, v: CollectView, position: Int) {
+                    //点击爱心收藏执行操作
+                    if (v.isChecked) {
+                        mPresenter?.uncollect(data[position].id, position)
+                    } else {
+                        mPresenter?.collect(data[position].id, position)
+                    }
+                }
+            })
+
+            setOnItemClickListener { adapter, view, position ->
+                launchActivity(Intent(this@ShareByIdActivity, WebviewActivity::class.java).apply {
+                    putExtras(Bundle().apply {
+                        putSerializable("data", this@ShareByIdActivity.adapter.data[position])
+                        putString("tag", this@ShareByIdActivity::class.java.simpleName)
+                        putInt("position", position)
+                    })
+                })
+            }
+        }
+        floatbtn.run {
+            backgroundTintList = SettingUtil.getOneColorStateList(this@ShareByIdActivity)
+            setOnClickListener {
+                val layoutManager = swiperecyclerview.layoutManager as LinearLayoutManager
+                //如果当前recyclerview 最后一个视图位置的索引大于等于40,则迅速返回顶部,否则带有滚动动画效果返回到顶部
+                if (layoutManager.findLastVisibleItemPosition() >= 40) {
+                    swiperecyclerview.scrollToPosition(0)//没有动画迅速返回到顶部(马上)
+                } else {
+                    swiperecyclerview.smoothScrollToPosition(0)//有滚动动画返回到顶部(有点慢)
+                }
+            }
+        }
+        //初始化 swipeRefreshLayout
+        swipeRefreshLayout.run {
+            setColorSchemeColors(SettingUtil.getColor(this@ShareByIdActivity))
+            setOnRefreshListener {
+                //刷新
+                pageNo = initPageNo
+                mPresenter?.getShareData(pageNo,this@ShareByIdActivity.id)
+            }
+        }
+        //初始化recyclerview
+        footView = RecyclerViewUtils().initRecyclerView(this, swiperecyclerview, SwipeRecyclerView.LoadMoreListener {
+            //加载更多
+            mPresenter?.getShareData(pageNo,id)
+        }).apply {
+            setLoadViewColor(SettingUtil.getOneColorStateList(this@ShareByIdActivity))
+        }
+
+        //监听recyclerview滑动到顶部的时候,需要把向上返回顶部的按钮隐藏
+        swiperecyclerview.run {
+            adapter = this@ShareByIdActivity.adapter
+            addOnScrollListener(object : RecyclerView.OnScrollListener() {
+                @SuppressLint("RestrictedApi")
+                override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
+                    super.onScrolled(recyclerView, dx, dy)
+                    if (!canScrollVertically(-1)) {
+                        floatbtn.visibility = View.INVISIBLE
+                    }
+                    this@ShareByIdActivity.swipeRefreshLayout.isEnabled = recyclerView.childCount == 0 || recyclerView.getChildAt(0).top >= 0
+                }
+            })
+        }
+        //发起请求
+        mPresenter?.getShareData(pageNo,id)
+    }
+
+    override fun requestDataSucces(shareResponse: ShareResponse) {
+        share_name.text = shareResponse.coinInfo.username
+        share_info.text = "积分 : ${shareResponse.coinInfo.coinCount} 排名 : ${shareResponse.coinInfo.rank}"
+        swipeRefreshLayout.isRefreshing = false
+        if (pageNo == initPageNo && shareResponse.shareArticles.datas.size == 0) {
+            //如果是第一页,并且没有数据,页面提示空布局
+            loadsir.showCallback(EmptyCallback::class.java)
+        } else if (pageNo == initPageNo) {
+            loadsir.showSuccess()
+            //如果是刷新的话,floatbutton就要隐藏了,因为这时候肯定是要在顶部的
+            floatbtn.visibility = View.INVISIBLE
+            adapter.setNewData(shareResponse.shareArticles.datas)
+        } else {
+            //不是第一页
+            loadsir.showSuccess()
+            adapter.addData(shareResponse.shareArticles.datas)
+        }
+        pageNo++
+        if (shareResponse.shareArticles.pageCount >= pageNo) {
+            //如果总条数大于当前页数时 还有更多数据
+            swiperecyclerview.loadMoreFinish(false, true)
+        } else {
+            //没有更多数据
+            swiperecyclerview.postDelayed({
+                //解释一下为什么这里要延时0.2秒操作。。。
+                //因为上面的adapter.addData(data) 数据刷新了适配器,是需要时间的,还没刷新完,这里就已经执行了没有更多数据
+                //所以在界面上会出现一个小bug,刷新最后一页的时候,没有更多数据啦提示先展示出来了,然后才会加载出请求到的数据
+                //暂时还没有找到好的方法,就用这个处理一下,如果觉得没什么影响的可以去掉这个延时操作,或者有更好的解决方式可以告诉我一下
+                swiperecyclerview.loadMoreFinish(false, false)
+            }, 200)
+        }
+    }
+
+    override fun requestDataFaild(errorMsg: String) {
+        swipeRefreshLayout.isRefreshing = false
+        if (pageNo == initPageNo) {
+            //如果页码是 初始页 说明是刷新,界面切换成错误页
+            loadsir.setCallBack(ErrorCallback::class.java) { _, view ->
+                //设置错误页文字错误提示
+                view.findViewById<TextView>(R.id.error_text).text = errorMsg
+            }
+            //设置错误
+            loadsir.showCallback(ErrorCallback::class.java)
+        } else {
+            //页码不是0 说明是加载更多时出现的错误,设置recyclerview加载错误,
+            swiperecyclerview.loadMoreError(0, errorMsg)
+        }
+    }
+
+    override fun collect(collected: Boolean, position: Int) {
+        CollectEvent(collected, adapter.data[position].id).post()
+    }
+
+    /**
+     * 接收到登录或退出的EventBus 刷新数据
+     */
+    @Subscribe
+    fun freshLogin(event: LoginFreshEvent) {
+        //如果是登录了, 当前界面的数据与账户收藏集合id匹配的值需要设置已经收藏
+        if (event.login) {
+            event.collectIds.forEach {
+                for (item in adapter.data) {
+                    if (item.id == it.toInt()) {
+                        item.collect = true
+                        break
+                    }
+                }
+            }
+        } else {
+            //退出了,把所有的收藏全部变为未收藏
+            for (item in adapter.data) {
+                item.collect = false
+            }
+        }
+        adapter.notifyDataSetChanged()
+    }
+
+    /**
+     * 接收到收藏文章的Event
+     */
+    @Subscribe
+    fun collectChange(event: CollectEvent) {
+        //使用协程做耗时操作
+        GlobalScope.launch {
+            async {
+                var indexResult = -1
+                for (index in adapter.data.indices) {
+                    if (adapter.data[index].id == event.id) {
+                        adapter.data[index].collect = event.collect
+                        indexResult = index
+                        break
+                    }
+                }
+                indexResult
+            }.run {
+                if (await() != -1) {
+                    adapter.notifyItemChanged(await())
+                }
+            }
+        }
+    }
+
+}

+ 270 - 0
app/src/main/java/me/hegj/wandroid/mvp/ui/activity/share/ShareListActivity.kt

@@ -0,0 +1,270 @@
+package me.hegj.wandroid.mvp.ui.activity.share
+
+import android.annotation.SuppressLint
+import android.content.Intent
+import android.os.Bundle
+import android.view.Menu
+import android.view.MenuItem
+import android.view.View
+import android.widget.TextView
+import androidx.recyclerview.widget.LinearLayoutManager
+import androidx.recyclerview.widget.RecyclerView
+import com.afollestad.materialdialogs.MaterialDialog
+import com.afollestad.materialdialogs.list.listItems
+
+import com.jess.arms.di.component.AppComponent
+import com.kingja.loadsir.core.LoadService
+import com.kingja.loadsir.core.LoadSir
+import com.yanzhenjie.recyclerview.SwipeRecyclerView
+import kotlinx.android.synthetic.main.activity_integral.*
+import kotlinx.android.synthetic.main.include_recyclerview.*
+import kotlinx.android.synthetic.main.include_toolbar.*
+import kotlinx.coroutines.GlobalScope
+import kotlinx.coroutines.async
+import kotlinx.coroutines.launch
+
+import me.hegj.wandroid.di.component.share.DaggerShareListComponent
+import me.hegj.wandroid.di.module.share.ShareListModule
+import me.hegj.wandroid.mvp.contract.share.ShareListContract
+import me.hegj.wandroid.mvp.presenter.share.ShareListPresenter
+
+import me.hegj.wandroid.R
+import me.hegj.wandroid.app.event.AddEvent
+import me.hegj.wandroid.app.event.AddEvent.Companion.DELETE_CODE
+import me.hegj.wandroid.app.event.CollectEvent
+import me.hegj.wandroid.app.utils.RecyclerViewUtils
+import me.hegj.wandroid.app.utils.SettingUtil
+import me.hegj.wandroid.app.weight.DefineLoadMoreView
+import me.hegj.wandroid.app.weight.loadCallBack.EmptyCallback
+import me.hegj.wandroid.app.weight.loadCallBack.ErrorCallback
+import me.hegj.wandroid.app.weight.loadCallBack.LoadingCallback
+import me.hegj.wandroid.mvp.model.entity.ShareResponse
+import me.hegj.wandroid.mvp.ui.BaseActivity
+import me.hegj.wandroid.mvp.ui.activity.todo.AddTodoActivity
+import me.hegj.wandroid.mvp.ui.activity.web.WebviewActivity
+import me.hegj.wandroid.mvp.ui.adapter.ShareAdapter
+import org.greenrobot.eventbus.Subscribe
+
+/**
+ *  我分享的文章列表
+  * @Author:         hegaojian
+  * @CreateDate:     2019/10/8 13:28
+ */
+class ShareListActivity : BaseActivity<ShareListPresenter>(), ShareListContract.View {
+
+    lateinit var loadsir: LoadService<Any>
+    lateinit var adapter: ShareAdapter
+
+    private var initPageNo = 1
+    private var pageNo: Int = initPageNo //当前页码
+    private var footView: DefineLoadMoreView? = null
+
+    override fun setupActivityComponent(appComponent: AppComponent) {
+        DaggerShareListComponent //如找不到该类,请编译一下项目
+                .builder()
+                .appComponent(appComponent)
+                .shareListModule(ShareListModule(this))
+                .build()
+                .inject(this)
+    }
+
+
+    override fun initView(savedInstanceState: Bundle?): Int {
+        return R.layout.activity_share_list //如果你不需要框架帮你设置 setContentView(id) 需要自行设置,请返回 0
+    }
+
+
+    override fun initData(savedInstanceState: Bundle?) {
+        toolbar.run {
+            setSupportActionBar(this)
+            title = "我分享的文章"
+            setNavigationIcon(R.drawable.ic_back)
+            setNavigationOnClickListener { finish() }
+        }
+        //绑定loadsir
+        loadsir = LoadSir.getDefault().register(swipeRefreshLayout) {
+            //界面加载失败,或者没有数据时,点击重试的监听
+            loadsir.showCallback(LoadingCallback::class.java)
+            pageNo = initPageNo
+            mPresenter?.getShareData(pageNo)
+        }.apply {
+            SettingUtil.setLoadingColor(this@ShareListActivity, this)
+            showCallback(LoadingCallback::class.java)
+        }
+        //初始化adapter
+        adapter = ShareAdapter(arrayListOf()).apply {
+            if (SettingUtil.getListMode(this@ShareListActivity) != 0) {
+                openLoadAnimation(SettingUtil.getListMode(this@ShareListActivity))
+            } else {
+                closeLoadAnimation()
+            }
+            setOnItemClickListener { adapter, view, position ->
+                launchActivity(Intent(this@ShareListActivity, WebviewActivity::class.java).apply {
+                    putExtras(Bundle().apply {
+                        putSerializable("data", this@ShareListActivity.adapter.data[position])
+                        putString("tag", this@ShareListActivity::class.java.simpleName)
+                        putInt("position", position)
+                    })
+                })
+            }
+            setOnItemChildClickListener { adapter, view, position ->
+                when(view.id){
+                    R.id.item_share_del ->{
+                        MaterialDialog(this@ShareListActivity).show {
+                            title(R.string.title)
+                            message(text = "确认删除该文章吗?")
+                            positiveButton(text = "删除"){
+                                mPresenter?.delAriticle(this@ShareListActivity.adapter.data[position].id,position)
+                            }
+                            negativeButton(text = "取消")
+                        }
+                    }
+                }
+            }
+        }
+        floatbtn.run {
+            backgroundTintList = SettingUtil.getOneColorStateList(this@ShareListActivity)
+            setOnClickListener {
+                val layoutManager = swiperecyclerview.layoutManager as LinearLayoutManager
+                //如果当前recyclerview 最后一个视图位置的索引大于等于40,则迅速返回顶部,否则带有滚动动画效果返回到顶部
+                if (layoutManager.findLastVisibleItemPosition() >= 40) {
+                    swiperecyclerview.scrollToPosition(0)//没有动画迅速返回到顶部(马上)
+                } else {
+                    swiperecyclerview.smoothScrollToPosition(0)//有滚动动画返回到顶部(有点慢)
+                }
+            }
+        }
+        //初始化 swipeRefreshLayout
+        swipeRefreshLayout.run {
+            setColorSchemeColors(SettingUtil.getColor(this@ShareListActivity))
+            setOnRefreshListener {
+                //刷新
+                pageNo = initPageNo
+                mPresenter?.getShareData(pageNo)
+            }
+        }
+        //初始化recyclerview
+        footView = RecyclerViewUtils().initRecyclerView(this, swiperecyclerview, SwipeRecyclerView.LoadMoreListener {
+            //加载更多
+            mPresenter?.getShareData(pageNo)
+        }).apply {
+            setLoadViewColor(SettingUtil.getOneColorStateList(this@ShareListActivity))
+        }
+
+        //监听recyclerview滑动到顶部的时候,需要把向上返回顶部的按钮隐藏
+        swiperecyclerview.run {
+            adapter = this@ShareListActivity.adapter
+            addOnScrollListener(object : RecyclerView.OnScrollListener() {
+                @SuppressLint("RestrictedApi")
+                override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
+                    super.onScrolled(recyclerView, dx, dy)
+                    if (!canScrollVertically(-1)) {
+                        floatbtn.visibility = View.INVISIBLE
+                    }
+                }
+            })
+        }
+        //发起请求
+        mPresenter?.getShareData(pageNo)
+
+    }
+
+    override fun requestDataSucces(shareResponse: ShareResponse) {
+         swipeRefreshLayout.isRefreshing = false
+        if (pageNo == initPageNo && shareResponse.shareArticles.datas.size == 0) {
+            //如果是第一页,并且没有数据,页面提示空布局
+            loadsir.showCallback(EmptyCallback::class.java)
+        } else if (pageNo == initPageNo) {
+            loadsir.showSuccess()
+            //如果是刷新的话,floatbutton就要隐藏了,因为这时候肯定是要在顶部的
+            floatbtn.visibility = View.INVISIBLE
+            adapter.setNewData(shareResponse.shareArticles.datas)
+        } else {
+            //不是第一页
+            loadsir.showSuccess()
+            adapter.addData(shareResponse.shareArticles.datas)
+        }
+        pageNo++
+        if (shareResponse.shareArticles.pageCount >= pageNo) {
+            //如果总条数大于当前页数时 还有更多数据
+            swiperecyclerview.loadMoreFinish(false, true)
+        } else {
+            //没有更多数据
+            swiperecyclerview.postDelayed({
+                //解释一下为什么这里要延时0.2秒操作。。。
+                //因为上面的adapter.addData(data) 数据刷新了适配器,是需要时间的,还没刷新完,这里就已经执行了没有更多数据
+                //所以在界面上会出现一个小bug,刷新最后一页的时候,没有更多数据啦提示先展示出来了,然后才会加载出请求到的数据
+                //暂时还没有找到好的方法,就用这个处理一下,如果觉得没什么影响的可以去掉这个延时操作,或者有更好的解决方式可以告诉我一下
+                swiperecyclerview.loadMoreFinish(false, false)
+            }, 200)
+        }
+    }
+
+    override fun requestDataFaild(errorMsg: String) {
+        swipeRefreshLayout.isRefreshing = false
+        if (pageNo == initPageNo) {
+            //如果页码是 初始页 说明是刷新,界面切换成错误页
+            loadsir.setCallBack(ErrorCallback::class.java) { _, view ->
+                //设置错误页文字错误提示
+                view.findViewById<TextView>(R.id.error_text).text = errorMsg
+            }
+            //设置错误
+            loadsir.showCallback(ErrorCallback::class.java)
+        } else {
+            //页码不是0 说明是加载更多时出现的错误,设置recyclerview加载错误,
+            swiperecyclerview.loadMoreError(0, errorMsg)
+        }
+    }
+
+    override fun deleteShareDataSucc(position: Int) {
+        //删除 文章 成功
+        adapter.remove(position)
+        AddEvent(DELETE_CODE).post()
+        if (adapter.data.size == 0) {
+            pageNo = initPageNo
+            mPresenter?.getShareData(pageNo)
+        }
+    }
+
+
+    override fun onCreateOptionsMenu(menu: Menu?): Boolean {
+        menuInflater.inflate(R.menu.todo_menu, menu)
+        return super.onCreateOptionsMenu(menu)
+    }
+
+    override fun onOptionsItemSelected(item: MenuItem?): Boolean {
+        when (item?.itemId) {
+            R.id.todo_add -> {
+                launchActivity(Intent(this, ShareAriticleActivity::class.java))
+            }
+        }
+        return super.onOptionsItemSelected(item)
+    }
+
+    /**
+     * 接收到添加了分享文章的通知
+     */
+    @Subscribe
+    fun addEvent(event: AddEvent){
+        if(event.code== AddEvent.SHARE_CODE){
+            //刷新
+            swipeRefreshLayout.isRefreshing = true
+            pageNo = initPageNo
+            mPresenter?.getShareData(pageNo)
+        }
+    }
+
+    /**
+     * 在详情中收藏时,接收到EventBus
+     */
+    @Subscribe
+    fun collectChange(event: CollectEvent) {
+        for (index in adapter.data.indices) {
+            if (adapter.data[index].id == event.id) {
+                adapter.data[index].collect = event.collect
+                break
+            }
+        }
+    }
+
+}

+ 3 - 2
app/src/main/java/me/hegj/wandroid/mvp/ui/activity/todo/AddTodoActivity.kt

@@ -10,7 +10,8 @@ import com.jess.arms.di.component.AppComponent
 import kotlinx.android.synthetic.main.activity_add_todo.*
 import kotlinx.android.synthetic.main.include_toolbar.*
 import me.hegj.wandroid.R
-import me.hegj.wandroid.app.event.AddTodoEvent
+import me.hegj.wandroid.app.event.AddEvent
+import me.hegj.wandroid.app.event.AddEvent.Companion.TODO_CODE
 import me.hegj.wandroid.app.utils.DatetimeUtil
 import me.hegj.wandroid.app.utils.SettingUtil
 import me.hegj.wandroid.app.weight.PriorityDialog
@@ -133,7 +134,7 @@ class AddTodoActivity : BaseActivity<AddTodoPresenter>(), AddTodoContract.View {
     }
 
     override fun addTodoSucc() {
-        AddTodoEvent().post()
+        AddEvent(TODO_CODE).post()
         finish()
     }
 

+ 12 - 22
app/src/main/java/me/hegj/wandroid/mvp/ui/activity/todo/TodoActivity.kt

@@ -19,7 +19,7 @@ import kotlinx.android.synthetic.main.activity_integral.*
 import kotlinx.android.synthetic.main.include_recyclerview.*
 import kotlinx.android.synthetic.main.include_toolbar.*
 import me.hegj.wandroid.R
-import me.hegj.wandroid.app.event.AddTodoEvent
+import me.hegj.wandroid.app.event.AddEvent
 import me.hegj.wandroid.app.utils.RecyclerViewUtils
 import me.hegj.wandroid.app.utils.SettingUtil
 import me.hegj.wandroid.app.weight.DefineLoadMoreView
@@ -43,7 +43,6 @@ import org.greenrobot.eventbus.Subscribe
  */
 class TodoActivity : BaseActivity<TodoPresenter>(), TodoContract.View {
 
-
     lateinit var loadsir: LoadService<Any>
     lateinit var adapter: TodoAdapter
     private var initPageNo = 1
@@ -95,7 +94,6 @@ class TodoActivity : BaseActivity<TodoPresenter>(), TodoContract.View {
             }
             setOnItemChildClickListener { adapter1, view, position ->
                 MaterialDialog(this@TodoActivity).show {
-                    message(text = "你要弄啥咧???")
                     listItems(items = adapter.data[position].isDone().let {
                         if (it) {
                             listOf("编辑", "删除")
@@ -119,6 +117,7 @@ class TodoActivity : BaseActivity<TodoPresenter>(), TodoContract.View {
             }
         }
         floatbtn.run {
+            backgroundTintList = SettingUtil.getOneColorStateList(this@TodoActivity)
             setOnClickListener {
                 val layoutManager = swiperecyclerview.layoutManager as LinearLayoutManager
                 //如果当前recyclerview 最后一个视图位置的索引大于等于40,则迅速返回顶部,否则带有滚动动画效果返回到顶部
@@ -131,6 +130,7 @@ class TodoActivity : BaseActivity<TodoPresenter>(), TodoContract.View {
         }
         //初始化 swipeRefreshLayout
         swipeRefreshLayout.run {
+            setColorSchemeColors(SettingUtil.getColor(this@TodoActivity))
             setOnRefreshListener {
                 //刷新
                 pageNo = initPageNo
@@ -141,7 +141,9 @@ class TodoActivity : BaseActivity<TodoPresenter>(), TodoContract.View {
         footView = RecyclerViewUtils().initRecyclerView(this, swiperecyclerview, SwipeRecyclerView.LoadMoreListener {
             //加载更多
             mPresenter?.getTodoData(pageNo)
-        })
+        }).apply {
+            setLoadViewColor(SettingUtil.getOneColorStateList(this@TodoActivity))
+        }
 
         //监听recyclerview滑动到顶部的时候,需要把向上返回顶部的按钮隐藏
         swiperecyclerview.run {
@@ -161,11 +163,13 @@ class TodoActivity : BaseActivity<TodoPresenter>(), TodoContract.View {
     }
 
     @Subscribe
-    fun todoChange(event: AddTodoEvent) {
+    fun todoChange(event: AddEvent) {
         //刷新
-        swipeRefreshLayout.isRefreshing = true
-        pageNo = initPageNo
-        mPresenter?.getTodoData(pageNo)
+        if(event.code==AddEvent.TODO_CODE){
+            swipeRefreshLayout.isRefreshing = true
+            pageNo = initPageNo
+            mPresenter?.getTodoData(pageNo)
+        }
     }
 
     override fun requestDataSucces(ariticles: ApiPagerResponse<MutableList<TodoResponse>>) {
@@ -235,20 +239,6 @@ class TodoActivity : BaseActivity<TodoPresenter>(), TodoContract.View {
         showMessage(errorMsg)
     }
 
-    override fun onResume() {
-        super.onResume()
-        floatbtn.backgroundTintList = SettingUtil.getOneColorStateList(this)
-        swipeRefreshLayout.setColorSchemeColors(SettingUtil.getColor(this))
-        SettingUtil.setLoadingColor(this, loadsir)
-        footView?.setLoadViewColor(SettingUtil.getOneColorStateList(this))
-        if (SettingUtil.getListMode(this) != 0) {
-            adapter.openLoadAnimation(SettingUtil.getListMode(this))
-        } else {
-            adapter.closeLoadAnimation()
-        }
-
-    }
-
 
     override fun onCreateOptionsMenu(menu: Menu?): Boolean {
         menuInflater.inflate(R.menu.todo_menu, menu)

+ 4 - 2
app/src/main/java/me/hegj/wandroid/mvp/ui/activity/web/WebviewActivity.kt

@@ -139,14 +139,16 @@ class WebviewActivity : BaseActivity<WebviewPresenter>(), WebviewContract.View {
 
     override fun onOptionsItemSelected(item: MenuItem?): Boolean {
         when (item?.itemId) {
-            R.id.web_share -> {//分享
+            R.id.web_share -> {
+                //分享
                 startActivity(Intent.createChooser(Intent().apply {
                     action = Intent.ACTION_SEND
                     putExtra(Intent.EXTRA_TEXT, "$showTitle:$url")
                     type = "text/plain"
                 }, "分享到"))
             }
-            R.id.web_refresh -> {//刷新网页
+            R.id.web_refresh -> {
+                //刷新网页
                 mAgentWeb.urlLoader.reload()
             }
             R.id.web_collect -> {//点击收藏

+ 87 - 68
app/src/main/java/me/hegj/wandroid/mvp/ui/adapter/AriticleAdapter.kt

@@ -1,7 +1,9 @@
 package me.hegj.wandroid.mvp.ui.adapter
 
+import android.content.Intent
 import android.text.Html
 import android.text.TextUtils
+import android.widget.TextView
 import com.chad.library.adapter.base.BaseQuickAdapter
 import com.chad.library.adapter.base.BaseViewHolder
 import com.chad.library.adapter.base.util.MultiTypeDelegate
@@ -10,18 +12,23 @@ import com.jess.arms.utils.ArmsUtils
 import me.hegj.wandroid.R
 import me.hegj.wandroid.app.weight.CollectView
 import me.hegj.wandroid.mvp.model.entity.AriticleResponse
+import me.hegj.wandroid.mvp.ui.activity.share.ShareByIdActivity
 
 
-class AriticleAdapter(data: ArrayList<AriticleResponse>?) : BaseQuickAdapter<AriticleResponse, BaseViewHolder>(data) {
+class AriticleAdapter(data: MutableList<AriticleResponse>?) : BaseQuickAdapter<AriticleResponse, BaseViewHolder>(data) {
     private var mOnCollectViewClickListener: OnCollectViewClickListener? = null
     private val Ariticle = 1//文章类型
     private val Project = 2//项目类型 本来打算不区分文章和项目布局用统一布局的,但是布局完以后发现差异化蛮大的,所以还是分开吧
     private var showTag = false//是否展示标签 tag 一般主页才用的到
+    private var clickable = true//点击作者是否能跳转
 
-    constructor(data: ArrayList<AriticleResponse>?, showTag: Boolean) : this(data) {
+    constructor(data: MutableList<AriticleResponse>?, showTag: Boolean) : this(data) {
         this.showTag = showTag
     }
-
+    constructor(data: MutableList<AriticleResponse>?, showTag: Boolean,clickable:Boolean) : this(data) {
+        this.showTag = showTag
+        this.clickable = clickable
+    }
     init {
         //初始化
         multiTypeDelegate = object : MultiTypeDelegate<AriticleResponse>() {
@@ -37,80 +44,92 @@ class AriticleAdapter(data: ArrayList<AriticleResponse>?) : BaseQuickAdapter<Ari
     }
 
     override fun convert(helper: BaseViewHolder, item: AriticleResponse?) {
-        if (item != null) {
-            when (helper.itemViewType) {
-                Ariticle -> {
-                    //文章布局的赋值
-                    item.run{
-                        helper.setText(R.id.item_home_author, if(author.isNotEmpty()) author else shareUser)
-                        helper.setText(R.id.item_home_content, Html.fromHtml(title))
-                        helper.setText(R.id.item_home_type2, Html.fromHtml("$superChapterName·$chapterName"))
-                        helper.setText(R.id.item_home_date, niceDate)
-                        helper.getView<CollectView>(R.id.item_home_collect).isChecked = collect
-                        if (showTag) {
-                            //展示标签
-                            helper.setGone(R.id.item_home_new, fresh)
-                            helper.setGone(R.id.item_home_top, type == 1)
-                            if (tags.isNotEmpty()) {
-                                helper.setGone(R.id.item_home_type1, true)
-                                helper.setText(R.id.item_home_type1, tags[0].name)
-                            } else {
-                                helper.setGone(R.id.item_home_type1, false)
-                            }
+        when (helper.itemViewType) {
+            Ariticle -> {
+                //文章布局的赋值
+                item?.run {
+                    helper.setText(R.id.item_home_author, if (author.isNotEmpty()) author else shareUser)
+                    helper.setText(R.id.item_home_content, Html.fromHtml(title))
+                    helper.setText(R.id.item_home_type2, Html.fromHtml("$superChapterName·$chapterName"))
+                    helper.setText(R.id.item_home_date, niceDate)
+                    helper.getView<CollectView>(R.id.item_home_collect).isChecked = collect
+                    if (showTag) {
+                        //展示标签
+                        helper.setGone(R.id.item_home_new, fresh)
+                        helper.setGone(R.id.item_home_top, type == 1)
+                        if (tags.isNotEmpty()) {
+                            helper.setGone(R.id.item_home_type1, true)
+                            helper.setText(R.id.item_home_type1, tags[0].name)
                         } else {
-                            //隐藏所有标签
-                            helper.setGone(R.id.item_home_top, false)
                             helper.setGone(R.id.item_home_type1, false)
-                            helper.setGone(R.id.item_home_new, false)
                         }
+                    } else {
+                        //隐藏所有标签
+                        helper.setGone(R.id.item_home_top, false)
+                        helper.setGone(R.id.item_home_type1, false)
+                        helper.setGone(R.id.item_home_new, false)
+                    }
+                }
+                helper.getView<CollectView>(R.id.item_home_collect).setOnCollectViewClickListener(object : CollectView.OnCollectViewClickListener {
+                    override fun onClick(v: CollectView) {
+                        mOnCollectViewClickListener?.onClick(helper, v, helper.adapterPosition)
+                    }
+                })
+                helper.getView<TextView>(R.id.item_home_author).setOnClickListener {
+                    if(clickable){
+                        mContext.startActivity(Intent(mContext,ShareByIdActivity::class.java).apply {
+                            putExtra("id",item?.userId)
+                        })
                     }
-                    helper.getView<CollectView>(R.id.item_home_collect).setOnCollectViewClickListener(object : CollectView.OnCollectViewClickListener {
-                        override fun onClick(v: CollectView) {
-                            mOnCollectViewClickListener?.onClick(helper, v, helper.adapterPosition)
-                        }
-                    })
                 }
-                Project -> {
-                    //项目布局的赋值
-                    item.run{
-                        helper.setText(R.id.item_project_author, if(author.isNotEmpty()) author else shareUser)
-                        helper.setText(R.id.item_project_title, Html.fromHtml(title))
-                        helper.setText(R.id.item_project_content, Html.fromHtml(desc))
-                        helper.setText(R.id.item_project_type, Html.fromHtml("$superChapterName·$chapterName"))
-                        helper.setText(R.id.item_project_date, niceDate)
-                        if (showTag) {
-                            //展示标签
-                            helper.setGone(R.id.item_project_new, fresh)
-                            helper.setGone(R.id.item_project_top, type == 1)
-                            if (tags.isNotEmpty()) {
-                                helper.setGone(R.id.item_project_type1, true)
-                                helper.setText(R.id.item_project_type1, tags[0].name)
-                            } else {
-                                helper.setGone(R.id.item_project_type1, false)
-                            }
+            }
+            Project -> {
+                //项目布局的赋值
+                item?.run {
+                    helper.setText(R.id.item_project_author, if (author.isNotEmpty()) author else shareUser)
+                    helper.setText(R.id.item_project_title, Html.fromHtml(title))
+                    helper.setText(R.id.item_project_content, Html.fromHtml(desc))
+                    helper.setText(R.id.item_project_type, Html.fromHtml("$superChapterName·$chapterName"))
+                    helper.setText(R.id.item_project_date, niceDate)
+                    if (showTag) {
+                        //展示标签
+                        helper.setGone(R.id.item_project_new, fresh)
+                        helper.setGone(R.id.item_project_top, type == 1)
+                        if (tags.isNotEmpty()) {
+                            helper.setGone(R.id.item_project_type1, true)
+                            helper.setText(R.id.item_project_type1, tags[0].name)
                         } else {
-                            //隐藏所有标签
-                            helper.setGone(R.id.item_project_top, false)
                             helper.setGone(R.id.item_project_type1, false)
-                            helper.setGone(R.id.item_project_new, false)
                         }
-                        helper.getView<CollectView>(R.id.item_project_collect).isChecked = collect
-                        ArmsUtils.obtainAppComponentFromContext(mContext).imageLoader().loadImage(mContext.applicationContext,
-                                ImageConfigImpl
-                                        .builder()
-                                        .url(envelopePic)
-                                        .imageView(helper.getView(R.id.item_project_imageview))
-                                        .errorPic(R.drawable.default_project_img)
-                                        .fallback(R.drawable.default_project_img)
-                                        .isCrossFade(true)
-                                        .build()
-                        )
+                    } else {
+                        //隐藏所有标签
+                        helper.setGone(R.id.item_project_top, false)
+                        helper.setGone(R.id.item_project_type1, false)
+                        helper.setGone(R.id.item_project_new, false)
+                    }
+                    helper.getView<CollectView>(R.id.item_project_collect).isChecked = collect
+                    ArmsUtils.obtainAppComponentFromContext(mContext).imageLoader().loadImage(mContext.applicationContext,
+                            ImageConfigImpl
+                                    .builder()
+                                    .url(envelopePic)
+                                    .imageView(helper.getView(R.id.item_project_imageview))
+                                    .errorPic(R.drawable.default_project_img)
+                                    .fallback(R.drawable.default_project_img)
+                                    .isCrossFade(true)
+                                    .build()
+                    )
+                }
+                helper.getView<CollectView>(R.id.item_project_collect).setOnCollectViewClickListener(object : CollectView.OnCollectViewClickListener {
+                    override fun onClick(v: CollectView) {
+                        mOnCollectViewClickListener?.onClick(helper, v, helper.adapterPosition)
+                    }
+                })
+                helper.getView<TextView>(R.id.item_project_author).setOnClickListener {
+                    if(clickable){
+                        mContext.startActivity(Intent(mContext,ShareByIdActivity::class.java).apply {
+                            putExtra("id",item?.userId)
+                        })
                     }
-                    helper.getView<CollectView>(R.id.item_project_collect).setOnCollectViewClickListener(object : CollectView.OnCollectViewClickListener {
-                        override fun onClick(v: CollectView) {
-                            mOnCollectViewClickListener?.onClick(helper, v, helper.adapterPosition)
-                        }
-                    })
                 }
             }
         }

+ 2 - 2
app/src/main/java/me/hegj/wandroid/mvp/ui/adapter/CollectAdapter.kt

@@ -36,7 +36,7 @@ class CollectAdapter(data: ArrayList<CollectResponse>?) : BaseQuickAdapter<Colle
                 Ariticle -> {
                     //文章布局的赋值
                     item.run{
-                        helper.setText(R.id.item_home_author, author)
+                        helper.setText(R.id.item_home_author, if(author.isEmpty()) "匿名用户" else author)
                         helper.setText(R.id.item_home_content, Html.fromHtml(title))
                         helper.setText(R.id.item_home_type2, Html.fromHtml(chapterName))
                         helper.setText(R.id.item_home_date, niceDate)
@@ -55,7 +55,7 @@ class CollectAdapter(data: ArrayList<CollectResponse>?) : BaseQuickAdapter<Colle
                 Project -> {
                     //项目布局的赋值
                     item.run{
-                        helper.setText(R.id.item_project_author, author)
+                        helper.setText(R.id.item_project_author, if(author.isEmpty()) "匿名用户" else author)
                         helper.setText(R.id.item_project_title, Html.fromHtml(title))
                         helper.setText(R.id.item_project_content, Html.fromHtml(desc))
                         helper.setText(R.id.item_project_type, Html.fromHtml(chapterName))

+ 26 - 0
app/src/main/java/me/hegj/wandroid/mvp/ui/adapter/ShareAdapter.kt

@@ -0,0 +1,26 @@
+package me.hegj.wandroid.mvp.ui.adapter
+
+import com.chad.library.adapter.base.BaseQuickAdapter
+import com.chad.library.adapter.base.BaseViewHolder
+import me.hegj.wandroid.R
+import me.hegj.wandroid.mvp.model.entity.AriticleResponse
+
+
+/**
+ * 分享的文章 adapter
+ * @Author:         hegaojian
+ * @CreateDate:     2019/9/1 9:52
+ */
+class ShareAdapter(data: ArrayList<AriticleResponse>?) : BaseQuickAdapter<AriticleResponse, BaseViewHolder>(R.layout.item_share_ariticle, data) {
+
+    override fun convert(helper: BaseViewHolder, item: AriticleResponse?) {
+        //赋值
+        item?.run {
+            helper.setText(R.id.item_share_title, title)
+            helper.setText(R.id.item_share_date, niceDate)
+            helper.addOnClickListener(R.id.item_share_del)
+        }
+    }
+}
+
+

+ 0 - 9
app/src/main/java/me/hegj/wandroid/mvp/ui/base/BaseIView.java

@@ -1,9 +0,0 @@
-package me.hegj.wandroid.mvp.ui.base;
-
-import androidx.appcompat.app.AppCompatActivity;
-
-import com.jess.arms.mvp.IView;
-
-public interface BaseIView extends IView {
-    AppCompatActivity getActivityContext();
-}

BIN
app/src/main/res/drawable-xxxhdpi/china_day.png


BIN
app/src/main/res/drawable-xxxhdpi/collect.png


BIN
app/src/main/res/drawable-xxxhdpi/cxk.jpg


BIN
app/src/main/res/drawable-xxxhdpi/default_project_img.jpg


BIN
app/src/main/res/drawable-xxxhdpi/ic_account.png


BIN
app/src/main/res/drawable-xxxhdpi/ic_add.png


BIN
app/src/main/res/drawable-xxxhdpi/ic_back.png


BIN
app/src/main/res/drawable-xxxhdpi/ic_clear.png


BIN
app/src/main/res/drawable-xxxhdpi/ic_close.png


BIN
app/src/main/res/drawable-xxxhdpi/ic_collect.png


BIN
app/src/main/res/drawable-xxxhdpi/ic_collected.png


BIN
app/src/main/res/drawable-xxxhdpi/ic_delete.png


BIN
app/src/main/res/drawable-xxxhdpi/ic_done.png


BIN
app/src/main/res/drawable-xxxhdpi/ic_favorite.png


BIN
app/src/main/res/drawable-xxxhdpi/ic_history.png


BIN
app/src/main/res/drawable-xxxhdpi/ic_more.png


BIN
app/src/main/res/drawable-xxxhdpi/ic_password_see.png


BIN
app/src/main/res/drawable-xxxhdpi/ic_password_see_on.png


BIN
app/src/main/res/drawable-xxxhdpi/ic_right.png


BIN
app/src/main/res/drawable-xxxhdpi/ic_search.png


BIN
app/src/main/res/drawable-xxxhdpi/ic_tag.png


BIN
app/src/main/res/drawable-xxxhdpi/ic_wandroid.png


BIN
app/src/main/res/drawable-xxxhdpi/ic_yiguoqi.png


BIN
app/src/main/res/drawable-xxxhdpi/jairu.png


BIN
app/src/main/res/drawable-xxxhdpi/jifen.png


BIN
app/src/main/res/drawable-xxxhdpi/load_empty.png


BIN
app/src/main/res/drawable-xxxhdpi/load_error.png


BIN
app/src/main/res/drawable-xxxhdpi/menu_main.png


BIN
app/src/main/res/drawable-xxxhdpi/menu_me.png


Some files were not shown because too many files changed in this diff