├── .gitignore ├── .idea ├── compiler.xml ├── copyright │ └── profiles_settings.xml ├── encodings.xml ├── gradle.xml ├── markdown-navigator.xml ├── markdown-navigator │ └── profiles_settings.xml ├── misc.xml ├── modules.xml ├── runConfigurations.xml └── vcs.xml ├── LICENSE ├── README.md ├── apkfile └── zuiyue最阅-release.apk ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ ├── com │ │ └── dch │ │ │ └── test │ │ │ ├── adapter │ │ │ └── swipemenu │ │ │ │ ├── DragTouchAdapter.java │ │ │ │ ├── MainItemAdapter.java │ │ │ │ ├── MenuAdapter.java │ │ │ │ ├── MenuCardAdapter.java │ │ │ │ ├── MenuVerticalAdapter.java │ │ │ │ ├── MenuViewPagerAdapter.java │ │ │ │ ├── MenuViewTypeAdapter.java │ │ │ │ └── OnItemClickListener.java │ │ │ ├── base │ │ │ ├── BaseActivity.java │ │ │ ├── BaseApplication.java │ │ │ ├── BaseFragment.java │ │ │ ├── BaseLoadLayoutFragment.java │ │ │ ├── BasePresenter.java │ │ │ ├── BaseView.java │ │ │ └── adapter │ │ │ │ ├── ListBaseAdapter.java │ │ │ │ └── SuperViewHolder.java │ │ │ ├── contract │ │ │ ├── DetailsContract.kt │ │ │ ├── HomeContract.java │ │ │ └── presenter │ │ │ │ ├── DetailsPresenter.kt │ │ │ │ └── HomePresenter.java │ │ │ ├── db │ │ │ └── MyFavoriteLocalDataSource.kt │ │ │ ├── di │ │ │ ├── activity │ │ │ │ ├── HomeActivityComponent.java │ │ │ │ ├── HomeActivityModule.java │ │ │ │ └── HomePresenterModule.java │ │ │ ├── app │ │ │ │ ├── AppComponent.java │ │ │ │ └── AppModule.java │ │ │ └── scope │ │ │ │ ├── ActivityScope.java │ │ │ │ └── FragmentScope.java │ │ │ ├── entity │ │ │ ├── MyFavorite.java │ │ │ ├── MyFavoriteCollect.kt │ │ │ └── ViewTypeBean.java │ │ │ ├── manager │ │ │ ├── DBManager.java │ │ │ ├── RequestManager.kt │ │ │ ├── RetrofitManager.java │ │ │ └── SpfManager.java │ │ │ ├── remote │ │ │ └── MusicService.java │ │ │ ├── repository │ │ │ ├── ArticalDataSource.java │ │ │ ├── ArticalRepository.java │ │ │ ├── ArticalRepositoryComponent.java │ │ │ ├── ArticalRepositoryModule.java │ │ │ ├── Remote.java │ │ │ ├── entity │ │ │ │ ├── Artical.java │ │ │ │ ├── BaseEntity.java │ │ │ │ ├── GankEntity.java │ │ │ │ └── User.java │ │ │ ├── local │ │ │ │ └── ArticalLocalDataSource.java │ │ │ └── remote │ │ │ │ ├── ArticalRemoteDataSource.java │ │ │ │ ├── CSDNApi.java │ │ │ │ ├── HttpResult.java │ │ │ │ ├── Local.java │ │ │ │ └── apistores │ │ │ │ ├── CsdnApiService.java │ │ │ │ └── GankApiService.java │ │ │ ├── ui │ │ │ ├── CardAdapter.kt │ │ │ ├── CloseFabEvent.kt │ │ │ ├── CustomLeftDrawerActivity.java │ │ │ ├── DetailActivity.java │ │ │ ├── FabCloseEvent.java │ │ │ ├── GameActivity.java │ │ │ ├── GuideActivity.java │ │ │ ├── HomeActivity.java │ │ │ ├── KotlinPhotoViewActivity.kt │ │ │ ├── KotlinScrollingActivity.kt │ │ │ ├── KotlinSettingsActivity.kt │ │ │ ├── KotlinWebDetailsActivity.kt │ │ │ ├── LeadActivity.java │ │ │ ├── SplashActivity.java │ │ │ ├── fragment │ │ │ │ ├── GankAndroidFragment.java │ │ │ │ ├── GankMeiziFragment.java │ │ │ │ └── HomeFragment.java │ │ │ └── test │ │ │ │ ├── TestFragment.java │ │ │ │ └── TestViewActivity.java │ │ │ ├── util │ │ │ ├── ActivityUtils.java │ │ │ ├── Config.java │ │ │ ├── CrashHandler.java │ │ │ ├── FloatingCustomBehavior.java │ │ │ ├── NetUtil.java │ │ │ ├── RxBus.java │ │ │ ├── SharePreferenceUtils.java │ │ │ ├── StatusBarUtils.java │ │ │ ├── ToastUtils.java │ │ │ ├── TransitionUtils.java │ │ │ ├── UIUtils.java │ │ │ └── convertfactory │ │ │ │ ├── StringConverterFactory.java │ │ │ │ ├── StringRequestBodyConverter.java │ │ │ │ └── StringResponseBodyConverter.java │ │ │ └── widget │ │ │ ├── BounceScrollView.java │ │ │ ├── ChrysanthemumLoadingView.java │ │ │ ├── CircleProgressBar.java │ │ │ ├── CountDownProgressBar.java │ │ │ ├── CustomVolumControlBar.java │ │ │ ├── FiveChessesView.java │ │ │ ├── LeftDrawerLayout.java │ │ │ ├── LoadingView.java │ │ │ ├── MaterialProgressDrawable.java │ │ │ ├── PlaneFloating.java │ │ │ ├── PullWaveView.java │ │ │ ├── SwipeLayout.java │ │ │ ├── WaterRefreshView.java │ │ │ ├── WaterView.java │ │ │ └── banner │ │ │ ├── BezierIndicatorView.java │ │ │ ├── BezierIndicatorView2.java │ │ │ └── BezierPathIndicatorView.java │ └── greendao │ │ └── gen │ │ ├── DaoMaster.java │ │ ├── DaoSession.java │ │ └── MyFavoriteDao.java │ └── res │ ├── animator │ ├── jrtt_path_one.xml │ ├── jrtt_path_three.xml │ ├── jrtt_path_two.xml │ └── tick_path.xml │ ├── drawable-v21 │ ├── ic_menu_camera.xml │ ├── ic_menu_gallery.xml │ ├── ic_menu_manage.xml │ ├── ic_menu_send.xml │ ├── ic_menu_share.xml │ └── ic_menu_slideshow.xml │ ├── drawable-xhdpi │ ├── black.png │ ├── delete.png │ ├── floating_plane.png │ ├── guide1.jpg │ ├── guide2.jpg │ ├── guide3.jpg │ ├── guide4.jpg │ ├── like.png │ ├── pic4.jpg │ ├── star.png │ ├── timg3.jpg │ └── white.png │ ├── drawable │ ├── coner_framelayout_bg.xml │ ├── divider_recycler.xml │ ├── ic_info_black_24dp.xml │ ├── ic_notifications_black_24dp.xml │ ├── ic_sync_black_24dp.xml │ ├── jrtt.xml │ ├── jrtt_vector.xml │ ├── select_white.xml │ ├── selector_green.xml │ ├── selector_purple.xml │ ├── selector_red.xml │ ├── side_nav_bar.xml │ ├── tick.xml │ ├── tick_vector.xml │ └── water_progressbar.xml │ ├── layout │ ├── activity_custom_left_drawer.xml │ ├── activity_details.xml │ ├── activity_game.xml │ ├── activity_guide.xml │ ├── activity_home.xml │ ├── activity_kotlin_photo_view.xml │ ├── activity_kotlin_scrolling.xml │ ├── activity_kotlin_settings.xml │ ├── activity_kotlin_web_details.xml │ ├── activity_lead.xml │ ├── activity_main.xml │ ├── activity_splash.xml │ ├── activity_test_view.xml │ ├── app_bar_home.xml │ ├── card_item_photoview.xml │ ├── content_home.xml │ ├── edit_layout.xml │ ├── fragment_base_loadlayout.xml │ ├── fragment_tab1.xml │ ├── fragment_tab2.xml │ ├── item_csdn.xml │ ├── item_drag_touch.xml │ ├── item_gank.xml │ ├── item_main.xml │ ├── item_meizi.xml │ ├── item_menu.xml │ ├── item_menu_card.xml │ ├── item_menu_vertical.xml │ ├── nav_header_home.xml │ └── refresh_header_waterview.xml │ ├── menu │ ├── activity_home_drawer.xml │ ├── home.xml │ ├── menu_kotlin_scrolling.xml │ ├── menu_lead.xml │ └── menu_test.xml │ ├── mipmap-hdpi │ └── ic_launcher_round.png │ ├── mipmap-mdpi │ └── ic_launcher_round.png │ ├── mipmap-xhdpi │ ├── applogo.png │ ├── ic_launcher.jpg │ ├── ic_launcher_round.png │ ├── rate_star_big_on_holo_dark.png │ ├── timg.jpg │ ├── timg1.jpg │ └── timg2.jpg │ ├── mipmap-xxhdpi │ ├── ic_action_add.png │ ├── ic_action_close.png │ ├── ic_action_delete.png │ ├── ic_action_module_black.png │ ├── ic_action_wechat.png │ └── ic_launcher_round.png │ ├── mipmap-xxxhdpi │ └── ic_launcher_round.png │ ├── transition │ ├── changebounds.xml │ └── explode.xml │ ├── values-w820dp │ └── dimens.xml │ ├── values │ ├── attrs.xml │ ├── colors.xml │ ├── dimens.xml │ ├── drawables.xml │ ├── strings.xml │ └── styles.xml │ └── xml │ ├── pref_data_sync.xml │ ├── pref_general.xml │ ├── pref_headers.xml │ └── pref_notification.xml ├── build.gradle ├── common ├── .gitignore ├── build.gradle ├── libs │ └── tbs_sdk_thirdapp_v3.1.0.1034_43100_sharewithdownload_obfs_20170301_182143.jar ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── dch │ │ └── common │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ └── res │ │ └── values │ │ └── strings.xml │ └── test │ └── java │ └── com │ └── dch │ └── common │ └── ExampleUnitTest.java ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── library ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── view │ │ └── jameson │ │ └── library │ │ └── ApplicationTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── view │ │ │ └── jameson │ │ │ └── library │ │ │ ├── CardAdapterHelper.java │ │ │ ├── CardLinearSnapHelper.java │ │ │ ├── CardScaleHelper.java │ │ │ └── SpeedRecyclerView.java │ └── res │ │ └── values │ │ └── strings.xml │ └── test │ └── java │ └── com │ └── view │ └── jameson │ └── library │ └── ExampleUnitTest.java ├── pic ├── 1.jpg ├── 111.gif ├── 222.gif ├── countdown.gif ├── loadingview.gif ├── pic2.jpg ├── pic3.jpg ├── pic4.jpg ├── qq.gif ├── revealanimator.gif └── wx_pay.jpg └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea 5 | /.idea/workspace.xml 6 | /.idea/libraries 7 | .DS_Store 8 | /build 9 | /captures 10 | .externalNativeBuild 11 | -------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /.idea/copyright/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 20 | 21 | -------------------------------------------------------------------------------- /.idea/markdown-navigator/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 19 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 46 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # KotlinMVPRxJava2Dagger2GreenDaoRetrofitDemo 2 | Kotlin+RxJava2+Dagger2+RxCache+Retrofit+GoogleMVPMode+GreenDao 3 | 4 | An android app example that I exercise. 5 | 6 | 在这个app中,你可以看到一些最新的android技术文章,可以进行收藏,然后进入我的收藏中查看已收藏的文章. 7 | 在敲累的时候你还可以进入妹纸模块,查看养眼的妹纸图... 8 | 这个项目还在完善中,存在一些bug, 还请指出,见谅! 9 | 10 | 体验app: [点我!](https://github.com/MrDeclanCoder/KotlinMVPRxJava2Dagger2GreenDaoRetrofitDemo/blob/master/apkfile/zuiyue%E6%9C%80%E9%98%85-release.apk) 11 | 12 | # 欢迎页 13 | 利用RxJava2实现右上角倒计时功能. 14 | ps:倒计时已更新,自定义ProgressBar 15 | 16 | ![](pic/countdown.gif) 17 | 18 | 老版本中倒计时: 19 | 20 | ![](pic/111.gif) 21 | 22 | #仿ios版qq下拉刷新 23 | 24 | ![](pic/qq.gif) 25 | 26 | #揭示动画 27 | 28 | ![](pic/revealanimator.gif) 29 | 30 | # 引导页 31 | 贝塞尔效果切页指示器 32 | 33 | ![](pic/pic4.jpg) 34 | 35 | #仿IOS菊花loading效果 36 | 具体实现请查看: [csdn博客](http://blog.csdn.net/coderder/article/details/75009723) 37 | 38 | ![](pic/loadingview.gif) 39 | 40 | #自定义view 五子棋(ps:gif录制有丢帧现象,具体效果还要安装试看) 41 | 42 | ![](pic/222.gif) 43 | 44 | /***** 未完待续 *****/ 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /apkfile/zuiyue最阅-release.apk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrDeclanCoder/KotlinMVPRxJava2Dagger2GreenDaoRetrofitDemo/ff71c1be21d82952d8c973e1d066cf1d031a7731/apkfile/zuiyue最阅-release.apk -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | signing.properties 3 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | apply plugin: 'me.tatarka.retrolambda' 3 | apply plugin: 'kotlin-android' 4 | apply plugin: 'kotlin-android-extensions' 5 | 6 | Properties properties = new Properties() 7 | properties.load(new FileInputStream(file("signing.properties"))) 8 | android { 9 | compileSdkVersion 25 10 | buildToolsVersion rootProject.buildToolsVersion 11 | defaultConfig { 12 | applicationId "com.dch.test" 13 | minSdkVersion 21 14 | targetSdkVersion 25 15 | versionCode 1 16 | versionName "1.0" 17 | // Enabling multidex support. 18 | multiDexEnabled true 19 | vectorDrawables.useSupportLibrary = true 20 | } 21 | 22 | signingConfigs { 23 | release { 24 | keyAlias properties['KEY_ALIAS'] 25 | keyPassword properties['KEY_PASSWORD'] 26 | storeFile file(properties['KEYSTORE_FILE']) 27 | storePassword properties['KEYSTORE_PASSWORD'] 28 | } 29 | } 30 | 31 | buildTypes { 32 | release { 33 | signingConfig signingConfigs.release 34 | minifyEnabled false 35 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 36 | } 37 | } 38 | 39 | // 注释冲突 40 | packagingOptions { 41 | exclude 'META-INF/services/javax.annotation.processing.Processor' 42 | } 43 | 44 | // 使用Java1.8 45 | // compileOptions { 46 | // sourceCompatibility JavaVersion.VERSION_1_8 47 | // targetCompatibility JavaVersion.VERSION_1_8 48 | // } 49 | packagingOptions { 50 | exclude 'META-INF/DEPENDENCIES' 51 | exclude 'META-INF/NOTICE' 52 | exclude 'META-INF/LICENSE' 53 | exclude 'META-INF/LICENSE.txt' 54 | exclude 'META-INF/NOTICE.txt' 55 | } 56 | dexOptions { 57 | //最大堆内存 58 | javaMaxHeapSize "8g" 59 | //是否支持大工程模式 60 | jumboMode = true 61 | //预编译 62 | preDexLibraries = true 63 | //线程数 64 | threadCount = 8 65 | } 66 | 67 | } 68 | 69 | dependencies { 70 | compile fileTree(include: ['*.jar'], dir: 'libs') 71 | compile project(':common') 72 | compile project(':library') 73 | // dagger 2 的配置 74 | compile 'com.google.dagger:dagger:' + rootProject.daggerVersion 75 | compile 'com.google.dagger:dagger-android-support:' + rootProject.daggerVersion 76 | compile 'com.google.dagger:dagger-android:' + rootProject.daggerVersion 77 | annotationProcessor 'com.google.dagger:dagger-compiler:' + rootProject.daggerVersion 78 | annotationProcessor 'com.google.dagger:dagger-android-processor:' + rootProject.daggerVersion 79 | //butterknife 80 | compile 'com.jakewharton:butterknife:' + rootProject.buterknifeVersion 81 | annotationProcessor 'com.jakewharton:butterknife-compiler:' + rootProject.buterknifeVersion 82 | compile 'com.android.support:support-v4:25.3.1' 83 | compile 'com.android.support:support-vector-drawable:25.3.1' 84 | compile 'com.android.support.constraint:constraint-layout:1.0.2' 85 | } 86 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in D:\develop\android\sdk\android-sdk-windows\android-sdk-windows/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | 19 | # Uncomment this to preserve the line number information for 20 | # debugging stack traces. 21 | #-keepattributes SourceFile,LineNumberTable 22 | 23 | # If you keep the line number information, uncomment this to 24 | # hide the original source file name. 25 | #-renamesourcefileattribute SourceFile 26 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 21 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 35 | 38 | 41 | 45 | 49 | 50 | 53 | 56 | 59 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | -------------------------------------------------------------------------------- /app/src/main/java/com/dch/test/adapter/swipemenu/MainItemAdapter.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 Yan Zhenjie 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.dch.test.adapter.swipemenu; 17 | 18 | import android.support.v7.widget.RecyclerView; 19 | import android.view.LayoutInflater; 20 | import android.view.View; 21 | import android.view.ViewGroup; 22 | import android.widget.TextView; 23 | 24 | import com.dch.test.R; 25 | 26 | import java.util.List; 27 | 28 | /** 29 | * Created by YOLANDA on 2016/7/22. 30 | */ 31 | public class MainItemAdapter extends RecyclerView.Adapter { 32 | 33 | private List titles; 34 | 35 | private List descriptions; 36 | 37 | private OnItemClickListener mOnItemClickListener; 38 | 39 | public MainItemAdapter(List titles, List descriptions) { 40 | this.titles = titles; 41 | this.descriptions = descriptions; 42 | } 43 | 44 | public void setOnItemClickListener(OnItemClickListener onItemClickListener) { 45 | this.mOnItemClickListener = onItemClickListener; 46 | } 47 | 48 | @Override 49 | public int getItemCount() { 50 | return titles == null ? 0 : titles.size(); 51 | } 52 | 53 | @Override 54 | public DefaultViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 55 | DefaultViewHolder viewHolder = new DefaultViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout 56 | .item_main, parent, false)); 57 | viewHolder.mOnItemClickListener = mOnItemClickListener; 58 | return viewHolder; 59 | } 60 | 61 | @Override 62 | public void onBindViewHolder(DefaultViewHolder holder, int position) { 63 | holder.setData(titles.get(position), descriptions.get(position)); 64 | } 65 | 66 | static class DefaultViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 67 | TextView tvTitle; 68 | TextView tvDescription; 69 | OnItemClickListener mOnItemClickListener; 70 | 71 | public DefaultViewHolder(View itemView) { 72 | super(itemView); 73 | itemView.setOnClickListener(this); 74 | tvTitle = (TextView) itemView.findViewById(R.id.tv_title); 75 | tvDescription = (TextView) itemView.findViewById(R.id.tv_des); 76 | } 77 | 78 | public void setData(String title, String des) { 79 | this.tvTitle.setText(title); 80 | this.tvDescription.setText(des); 81 | } 82 | 83 | @Override 84 | public void onClick(View v) { 85 | if (mOnItemClickListener != null) { 86 | mOnItemClickListener.onItemClick(getAdapterPosition()); 87 | } 88 | } 89 | } 90 | 91 | } 92 | -------------------------------------------------------------------------------- /app/src/main/java/com/dch/test/adapter/swipemenu/MenuAdapter.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 Yan Zhenjie 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.dch.test.adapter.swipemenu; 17 | 18 | import android.support.v7.widget.RecyclerView; 19 | import android.view.LayoutInflater; 20 | import android.view.View; 21 | import android.view.ViewGroup; 22 | import android.widget.TextView; 23 | 24 | import com.dch.test.R; 25 | import com.yanzhenjie.recyclerview.swipe.SwipeMenuAdapter; 26 | 27 | import java.util.List; 28 | 29 | /** 30 | * Created by YOLANDA on 2016/7/22. 31 | */ 32 | public class MenuAdapter extends SwipeMenuAdapter { 33 | 34 | private List titles; 35 | 36 | private OnItemClickListener mOnItemClickListener; 37 | 38 | public MenuAdapter(List titles) { 39 | this.titles = titles; 40 | } 41 | 42 | public void setOnItemClickListener(OnItemClickListener onItemClickListener) { 43 | this.mOnItemClickListener = onItemClickListener; 44 | } 45 | 46 | @Override 47 | public int getItemCount() { 48 | return titles == null ? 0 : titles.size(); 49 | } 50 | 51 | @Override 52 | public View onCreateContentView(ViewGroup parent, int viewType) { 53 | return LayoutInflater.from(parent.getContext()).inflate(R.layout.item_menu, parent, false); 54 | } 55 | 56 | @Override 57 | public DefaultViewHolder onCompatCreateViewHolder(View realContentView, int viewType) { 58 | DefaultViewHolder viewHolder = new DefaultViewHolder(realContentView); 59 | viewHolder.mOnItemClickListener = mOnItemClickListener; 60 | return viewHolder; 61 | } 62 | 63 | @Override 64 | public void onBindViewHolder(DefaultViewHolder holder, int position) { 65 | holder.setData(titles.get(position)); 66 | } 67 | 68 | static class DefaultViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 69 | TextView tvTitle; 70 | OnItemClickListener mOnItemClickListener; 71 | 72 | public DefaultViewHolder(View itemView) { 73 | super(itemView); 74 | itemView.setOnClickListener(this); 75 | tvTitle = (TextView) itemView.findViewById(R.id.tv_title); 76 | } 77 | 78 | public void setData(String title) { 79 | this.tvTitle.setText(title); 80 | } 81 | 82 | @Override 83 | public void onClick(View v) { 84 | if (mOnItemClickListener != null) { 85 | mOnItemClickListener.onItemClick(getAdapterPosition()); 86 | } 87 | } 88 | } 89 | 90 | } 91 | -------------------------------------------------------------------------------- /app/src/main/java/com/dch/test/adapter/swipemenu/MenuCardAdapter.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 Yan Zhenjie 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.dch.test.adapter.swipemenu; 17 | 18 | import android.support.v7.widget.CardView; 19 | import android.support.v7.widget.RecyclerView; 20 | import android.view.LayoutInflater; 21 | import android.view.View; 22 | import android.view.ViewGroup; 23 | import android.widget.TextView; 24 | 25 | import com.dch.test.R; 26 | 27 | import java.util.List; 28 | 29 | /** 30 | * Created by YOLANDA on 2016/7/22. 31 | */ 32 | public class MenuCardAdapter extends RecyclerView.Adapter { 33 | 34 | private List titles; 35 | 36 | private OnItemClickListener mOnItemClickListener; 37 | 38 | public MenuCardAdapter(List titles) { 39 | this.titles = titles; 40 | } 41 | 42 | public void setOnItemClickListener(OnItemClickListener onItemClickListener) { 43 | this.mOnItemClickListener = onItemClickListener; 44 | } 45 | 46 | @Override 47 | public int getItemCount() { 48 | return titles == null ? 0 : titles.size(); 49 | } 50 | 51 | @Override 52 | public DefaultViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 53 | DefaultViewHolder viewHolder = new DefaultViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout 54 | .item_menu_card, parent, false)); 55 | viewHolder.mOnItemClickListener = mOnItemClickListener; 56 | return viewHolder; 57 | } 58 | 59 | @Override 60 | public void onBindViewHolder(DefaultViewHolder holder, int position) { 61 | holder.setData(titles.get(position)); 62 | } 63 | 64 | static class DefaultViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 65 | TextView tvTitle; 66 | OnItemClickListener mOnItemClickListener; 67 | 68 | public DefaultViewHolder(View itemView) { 69 | super(itemView); 70 | ((CardView) itemView).getChildAt(0).setOnClickListener(this); 71 | tvTitle = (TextView) itemView.findViewById(R.id.tv_title); 72 | } 73 | 74 | public void setData(String title) { 75 | this.tvTitle.setText(title); 76 | } 77 | 78 | @Override 79 | public void onClick(View v) { 80 | if (mOnItemClickListener != null) { 81 | mOnItemClickListener.onItemClick(getAdapterPosition()); 82 | } 83 | } 84 | } 85 | 86 | } 87 | -------------------------------------------------------------------------------- /app/src/main/java/com/dch/test/adapter/swipemenu/MenuVerticalAdapter.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 Yan Zhenjie 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.dch.test.adapter.swipemenu; 17 | 18 | import android.support.v7.widget.RecyclerView; 19 | import android.view.LayoutInflater; 20 | import android.view.View; 21 | import android.view.ViewGroup; 22 | import android.widget.TextView; 23 | 24 | import com.dch.test.R; 25 | import com.yanzhenjie.recyclerview.swipe.SwipeMenuAdapter; 26 | 27 | import java.util.List; 28 | 29 | /** 30 | *

竖向排布菜单的适配器。

31 | * Created by YOLANDA on 2016/7/22. 32 | */ 33 | public class MenuVerticalAdapter extends SwipeMenuAdapter { 34 | 35 | private List titles; 36 | 37 | private OnItemClickListener mOnItemClickListener; 38 | 39 | public MenuVerticalAdapter(List titles) { 40 | this.titles = titles; 41 | } 42 | 43 | public void setOnItemClickListener(OnItemClickListener onItemClickListener) { 44 | this.mOnItemClickListener = onItemClickListener; 45 | } 46 | 47 | @Override 48 | public int getItemCount() { 49 | return titles == null ? 0 : titles.size(); 50 | } 51 | 52 | @Override 53 | public View onCreateContentView(ViewGroup parent, int viewType) { 54 | return LayoutInflater.from(parent.getContext()).inflate(R.layout.item_menu_vertical, parent, false); 55 | } 56 | 57 | @Override 58 | public DefaultViewHolder onCompatCreateViewHolder(View realContentView, int viewType) { 59 | DefaultViewHolder viewHolder = new DefaultViewHolder(realContentView); 60 | viewHolder.mOnItemClickListener = mOnItemClickListener; 61 | return viewHolder; 62 | } 63 | 64 | @Override 65 | public void onBindViewHolder(DefaultViewHolder holder, int position) { 66 | holder.setData(titles.get(position)); 67 | } 68 | 69 | static class DefaultViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 70 | TextView tvTitle; 71 | OnItemClickListener mOnItemClickListener; 72 | 73 | public DefaultViewHolder(View itemView) { 74 | super(itemView); 75 | itemView.setOnClickListener(this); 76 | tvTitle = (TextView) itemView.findViewById(R.id.tv_title); 77 | } 78 | 79 | public void setData(String title) { 80 | this.tvTitle.setText(title); 81 | } 82 | 83 | @Override 84 | public void onClick(View v) { 85 | if (mOnItemClickListener != null) { 86 | mOnItemClickListener.onItemClick(getAdapterPosition()); 87 | } 88 | } 89 | } 90 | 91 | } 92 | -------------------------------------------------------------------------------- /app/src/main/java/com/dch/test/adapter/swipemenu/MenuViewPagerAdapter.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 Yan Zhenjie 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.dch.test.adapter.swipemenu; 17 | 18 | import android.support.v4.app.Fragment; 19 | import android.support.v4.app.FragmentManager; 20 | import android.support.v4.app.FragmentPagerAdapter; 21 | 22 | import java.util.List; 23 | 24 | /** 25 | * Created by Yan Zhenjie on 2016/8/12. 26 | */ 27 | public class MenuViewPagerAdapter extends FragmentPagerAdapter { 28 | 29 | private List fragments; 30 | 31 | public MenuViewPagerAdapter(FragmentManager fragmentManager, List fragments) { 32 | super(fragmentManager); 33 | this.fragments = fragments; 34 | } 35 | 36 | @Override 37 | public int getCount() { 38 | return fragments == null ? 0 : fragments.size(); 39 | } 40 | 41 | @Override 42 | public Fragment getItem(int position) { 43 | return fragments.get(position); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /app/src/main/java/com/dch/test/adapter/swipemenu/OnItemClickListener.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 Yan Zhenjie 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.dch.test.adapter.swipemenu; 17 | 18 | /** 19 | * Created by Yan Zhenjie on 2016/7/27. 20 | */ 21 | public interface OnItemClickListener { 22 | 23 | void onItemClick(int position); 24 | 25 | } 26 | -------------------------------------------------------------------------------- /app/src/main/java/com/dch/test/base/BaseActivity.java: -------------------------------------------------------------------------------- 1 | package com.dch.test.base; 2 | 3 | import android.os.Bundle; 4 | import android.support.annotation.Nullable; 5 | import android.support.v7.app.AppCompatActivity; 6 | import android.transition.Explode; 7 | import android.transition.Slide; 8 | 9 | import com.dch.test.R; 10 | import com.dch.test.util.StatusBarUtils; 11 | import com.gyf.barlibrary.ImmersionBar; 12 | 13 | import butterknife.ButterKnife; 14 | import butterknife.Unbinder; 15 | 16 | /** 17 | * 作者:${User} on 2017/4/10 16:26 18 | * 描述: 19 | * 邮箱:daichuanhao@caijinquan.com 20 | */ 21 | public abstract class BaseActivity extends AppCompatActivity{ 22 | 23 | public Unbinder unbinder; 24 | 25 | @Override 26 | protected void onCreate(@Nullable Bundle savedInstanceState) { 27 | super.onCreate(savedInstanceState); 28 | //初始化 29 | // ImmersionBar.with(this) 30 | // .statusBarColor(R.color.colorPrimary) //状态栏颜色,不写默认透明色 31 | // .statusBarColorTransform(R.color.colorPrimary) //状态栏变色后的颜色 32 | // .init(); 33 | baseOnCreate(); 34 | } 35 | 36 | public void baseOnCreate(){ 37 | setContentView(setLayoutId()); 38 | unbinder = ButterKnife.bind(this); 39 | // initInject(); 40 | initView(); 41 | initData(); 42 | } 43 | 44 | protected abstract void initData(); 45 | 46 | protected abstract void initView(); 47 | 48 | protected abstract int setLayoutId(); 49 | 50 | @Override 51 | protected void onDestroy() { 52 | super.onDestroy(); 53 | unbinder.unbind(); 54 | ImmersionBar.with(this).destroy(); //不调用该方法,如果界面bar发生改变,在不关闭app的情况下,退出此界面再进入将记忆最后一次bar改变的状态 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /app/src/main/java/com/dch/test/base/BaseApplication.java: -------------------------------------------------------------------------------- 1 | package com.dch.test.base; 2 | 3 | import android.database.sqlite.SQLiteDatabase; 4 | import android.support.multidex.MultiDexApplication; 5 | 6 | import com.dch.test.di.app.AppModule; 7 | import com.dch.test.repository.ArticalRepositoryComponent; 8 | //import com.dch.test.repository.DaggerArticalRepositoryComponent; 9 | import com.dch.test.repository.DaggerArticalRepositoryComponent; 10 | import com.dch.test.util.CrashHandler; 11 | 12 | import greendao.gen.DaoMaster; 13 | import greendao.gen.DaoSession; 14 | 15 | /** 16 | * 作者:${User} on 2017/4/10 16:41 17 | * 描述: 18 | * 邮箱:daichuanhao@caijinquan.com 19 | */ 20 | public class BaseApplication extends MultiDexApplication { 21 | public static BaseApplication application; 22 | private ArticalRepositoryComponent articalRepositoryComponent; 23 | private DaoMaster.DevOpenHelper devOpenHelper; 24 | private SQLiteDatabase writableDatabase; 25 | private DaoMaster daoMaster; 26 | private DaoSession daoSession; 27 | 28 | @Override 29 | public void onCreate() { 30 | super.onCreate(); 31 | application = this; 32 | 33 | // CrashHandler crashHandler = CrashHandler.getInstance(); 34 | // crashHandler.init(this); 35 | 36 | articalRepositoryComponent = DaggerArticalRepositoryComponent.builder() 37 | .appModule(new AppModule((getApplicationContext()))) 38 | .build(); 39 | DatabaseInit(); 40 | } 41 | 42 | private void DatabaseInit() { 43 | devOpenHelper = new DaoMaster.DevOpenHelper(this,"collect-db"); 44 | writableDatabase = devOpenHelper.getWritableDatabase(); 45 | daoMaster = new DaoMaster(writableDatabase); 46 | daoSession = daoMaster.newSession(); 47 | } 48 | 49 | public SQLiteDatabase getWritableDatabase() { 50 | return writableDatabase; 51 | } 52 | 53 | public DaoSession getDaoSession() { 54 | return daoSession; 55 | } 56 | 57 | public ArticalRepositoryComponent getArticalRepositoryComponent(){ 58 | return articalRepositoryComponent; 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /app/src/main/java/com/dch/test/base/BaseFragment.java: -------------------------------------------------------------------------------- 1 | package com.dch.test.base; 2 | 3 | import android.os.Bundle; 4 | import android.support.annotation.Nullable; 5 | import android.support.v4.app.Fragment; 6 | import android.support.v7.app.AppCompatActivity; 7 | import android.view.LayoutInflater; 8 | import android.view.View; 9 | import android.view.ViewGroup; 10 | 11 | import com.dch.test.contract.HomeContract; 12 | 13 | import butterknife.ButterKnife; 14 | import butterknife.Unbinder; 15 | 16 | /** 17 | * 作者:Dch on 2017/4/11 12:04 18 | * 描述: 19 | * 邮箱:daichuanhao@caijinquan.com 20 | */ 21 | public abstract class BaseFragment extends Fragment implements HomeContract.View{ 22 | 23 | protected AppCompatActivity activity; 24 | protected View rootView; 25 | protected Unbinder unbinder; 26 | 27 | @Override 28 | public void onCreate(@Nullable Bundle savedInstanceState) { 29 | super.onCreate(savedInstanceState); 30 | activity = ((AppCompatActivity) getActivity()); 31 | } 32 | 33 | @Nullable 34 | @Override 35 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 36 | if (null == rootView) { 37 | rootView = initRootView(inflater, container, savedInstanceState); 38 | } 39 | if (null != rootView) { 40 | ViewGroup viewGroup = (ViewGroup) rootView.getParent(); 41 | if (null != viewGroup) { 42 | viewGroup.removeAllViews(); 43 | } 44 | unbinder = ButterKnife.bind(rootView, activity); 45 | } 46 | return rootView; 47 | } 48 | 49 | 50 | protected abstract View initRootView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState); 51 | 52 | @Override 53 | public void onDestroyView() { 54 | super.onDestroyView(); 55 | if (null != unbinder) 56 | unbinder.unbind(); 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /app/src/main/java/com/dch/test/base/BaseLoadLayoutFragment.java: -------------------------------------------------------------------------------- 1 | package com.dch.test.base; 2 | 3 | import android.os.Bundle; 4 | import android.support.annotation.Nullable; 5 | import android.support.v7.app.AppCompatActivity; 6 | import android.view.LayoutInflater; 7 | import android.view.View; 8 | import android.view.ViewGroup; 9 | import android.widget.LinearLayout; 10 | import android.widget.ProgressBar; 11 | 12 | import com.dch.test.R; 13 | import com.dch.test.contract.HomeContract; 14 | 15 | import butterknife.BindView; 16 | import butterknife.ButterKnife; 17 | import butterknife.Unbinder; 18 | 19 | /** 20 | * 作者:Dch on 2017/4/11 12:04 21 | * 描述: 22 | * 邮箱:daichuanhao@caijinquan.com 23 | */ 24 | public abstract class BaseLoadLayoutFragment extends BaseFragment implements HomeContract.View{ 25 | 26 | protected AppCompatActivity activity; 27 | protected View rootView; 28 | protected Unbinder unbinder; 29 | protected boolean isPrepared = false; 30 | 31 | @BindView(R.id.progressbar_base) 32 | protected ProgressBar progressbar_base; 33 | @BindView(R.id.ll_content_base) 34 | protected LinearLayout ll_content_base; 35 | 36 | @Override 37 | public void onCreate(@Nullable Bundle savedInstanceState) { 38 | super.onCreate(savedInstanceState); 39 | activity = ((AppCompatActivity) getActivity()); 40 | } 41 | 42 | @Nullable 43 | @Override 44 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 45 | if (null == rootView) { 46 | rootView = inflater.inflate(R.layout.fragment_base_loadlayout,null); 47 | } 48 | if (null != rootView) { 49 | ViewGroup viewGroup = (ViewGroup) rootView.getParent(); 50 | if (null != viewGroup) { 51 | viewGroup.removeAllViews(); 52 | } 53 | unbinder = ButterKnife.bind(rootView, activity); 54 | } 55 | 56 | ll_content_base.addView(addContentView(inflater)); 57 | isPrepared = true; 58 | return rootView; 59 | } 60 | 61 | @Override 62 | protected View initRootView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 63 | return null; 64 | } 65 | 66 | protected abstract View addContentView(LayoutInflater inflater); 67 | 68 | @Override 69 | public void onDestroyView() { 70 | super.onDestroyView(); 71 | isPrepared = false; 72 | if (null != unbinder) 73 | unbinder.unbind(); 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /app/src/main/java/com/dch/test/base/BasePresenter.java: -------------------------------------------------------------------------------- 1 | package com.dch.test.base; 2 | 3 | import android.support.v7.app.AppCompatActivity; 4 | 5 | import javax.inject.Inject; 6 | 7 | import dagger.Provides; 8 | 9 | /** 10 | * 作者:Dch on 2017/4/10 15:53 11 | * 描述: 12 | * 邮箱:daichuanhao@caijinquan.com 13 | */ 14 | public interface BasePresenter { 15 | 16 | void start(); 17 | } 18 | -------------------------------------------------------------------------------- /app/src/main/java/com/dch/test/base/BaseView.java: -------------------------------------------------------------------------------- 1 | package com.dch.test.base; 2 | 3 | /** 4 | * 作者:Dch on 2017/4/10 15:53 5 | * 描述: 6 | * 邮箱:daichuanhao@caijinquan.com 7 | */ 8 | public interface BaseView { 9 | void setHomePresenter(T homePresenter); 10 | void showLoading(); 11 | void hideLoading(); 12 | void showError(String error); 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/dch/test/base/adapter/ListBaseAdapter.java: -------------------------------------------------------------------------------- 1 | package com.dch.test.base.adapter; 2 | 3 | import android.content.Context; 4 | import android.support.v7.widget.RecyclerView; 5 | import android.view.LayoutInflater; 6 | import android.view.View; 7 | import android.view.ViewGroup; 8 | 9 | import java.util.ArrayList; 10 | import java.util.Collection; 11 | import java.util.List; 12 | 13 | /** 14 | * Created by dch on 2017/4/16. 15 | */ 16 | 17 | public abstract class ListBaseAdapter extends RecyclerView.Adapter { 18 | 19 | protected Context mContext; 20 | private LayoutInflater mInflater; 21 | public List mDataList = new ArrayList<>(); 22 | 23 | public ListBaseAdapter(Context context){ 24 | mContext = context; 25 | mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 26 | } 27 | 28 | protected abstract int getLayoutId(); 29 | 30 | @Override 31 | public SuperViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 32 | View view = mInflater.inflate(getLayoutId(), parent, false); 33 | return new SuperViewHolder(view); 34 | } 35 | 36 | @Override 37 | public void onBindViewHolder(SuperViewHolder holder, int position) { 38 | onBindItemHolder(holder,position); 39 | } 40 | 41 | @Override 42 | public void onBindViewHolder(SuperViewHolder holder, int position, List payloads) { 43 | if (payloads.isEmpty()){ 44 | onBindViewHolder(holder,position); 45 | } else { 46 | onBindItemHolder(holder,position,payloads); 47 | } 48 | } 49 | 50 | protected abstract void onBindItemHolder(SuperViewHolder holder, int position); 51 | public void onBindItemHolder(SuperViewHolder holder, int position, List payloads){ 52 | 53 | } 54 | @Override 55 | public int getItemCount() { 56 | return mDataList.size(); 57 | } 58 | 59 | public List getDataList(){ 60 | return mDataList; 61 | } 62 | 63 | public void setDataList(Collection list){ 64 | this.mDataList.clear(); 65 | this.mDataList.addAll(list); 66 | notifyDataSetChanged(); 67 | } 68 | 69 | public void addAll(Collection list){ 70 | int lastIndex = this.mDataList.size(); 71 | if (this.mDataList.addAll(list)){ 72 | notifyItemRangeInserted(lastIndex,list.size()); 73 | } 74 | } 75 | 76 | public void remove(int position){ 77 | this.mDataList.remove(position); 78 | notifyItemRemoved(position); 79 | if (position != (getDataList().size())){ 80 | notifyItemRangeChanged(position,this.mDataList.size() - position); 81 | } 82 | } 83 | 84 | public void clear(){ 85 | mDataList.clear(); 86 | notifyDataSetChanged(); 87 | } 88 | } 89 | -------------------------------------------------------------------------------- /app/src/main/java/com/dch/test/base/adapter/SuperViewHolder.java: -------------------------------------------------------------------------------- 1 | package com.dch.test.base.adapter; 2 | 3 | import android.support.v7.widget.RecyclerView; 4 | import android.util.SparseArray; 5 | import android.view.View; 6 | 7 | /** 8 | * Created by dch on 2017/4/16. 9 | */ 10 | 11 | public class SuperViewHolder extends RecyclerView.ViewHolder { 12 | 13 | private SparseArray views; 14 | 15 | public SuperViewHolder(View itemView) { 16 | super(itemView); 17 | this.views = new SparseArray<>(); 18 | } 19 | 20 | public T getView(int viewId){ 21 | View view = views.get(viewId); 22 | if(null == view){ 23 | view = itemView.findViewById(viewId); 24 | views.put(viewId,view); 25 | } 26 | return (T) view; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /app/src/main/java/com/dch/test/contract/DetailsContract.kt: -------------------------------------------------------------------------------- 1 | package com.dch.test.contract 2 | 3 | import com.dch.test.base.BasePresenter 4 | import com.dch.test.base.BaseView 5 | import com.dch.test.entity.MyFavorite 6 | 7 | /** 8 | * 作者:MrCoder on 2017/5/24 16:05 9 | * 描述: 10 | * 邮箱:daichuanhao@caijinquan.com 11 | */ 12 | interface DetailsContract { 13 | 14 | interface DetailsView: BaseView{ 15 | fun insertSuccess() 16 | fun insertError(exception: Exception) 17 | } 18 | 19 | interface Presenter: BasePresenter{ 20 | 21 | fun insertMyFavoriteToDb(myFavorite: MyFavorite) 22 | 23 | } 24 | } -------------------------------------------------------------------------------- /app/src/main/java/com/dch/test/contract/HomeContract.java: -------------------------------------------------------------------------------- 1 | package com.dch.test.contract; 2 | 3 | import com.dch.test.base.BasePresenter; 4 | import com.dch.test.base.BaseView; 5 | import com.dch.test.repository.entity.GankEntity; 6 | 7 | /** 8 | * 作者:Dch on 2017/4/20 19:01 9 | * 描述: 10 | * 邮箱:daichuanhao@caijinquan.com 11 | */ 12 | public interface HomeContract { 13 | 14 | interface View extends BaseView { 15 | void showDailyList(GankEntity entity); 16 | 17 | void showError(Throwable throwable); 18 | } 19 | 20 | interface HomePresenter extends BasePresenter { 21 | void getAndroidData(int pageNum, int pageSize); 22 | void getMeiziData(int pageNum, int pageSize); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/src/main/java/com/dch/test/contract/presenter/DetailsPresenter.kt: -------------------------------------------------------------------------------- 1 | package com.dch.test.contract.presenter 2 | 3 | import com.dch.test.contract.DetailsContract 4 | import com.dch.test.db.MyFavoriteLocalDataSource 5 | import com.dch.test.entity.MyFavorite 6 | 7 | /** 8 | * 作者:MrCoder on 2017/5/24 16:12 9 | * 描述: 10 | * 邮箱:daichuanhao@caijinquan.com 11 | */ 12 | open class DetailsPresenter( detailsView: DetailsContract.DetailsView, val myFavoriteLocalDataSource: MyFavoriteLocalDataSource) : DetailsContract.Presenter { 13 | 14 | val detailsView = null 15 | 16 | override fun insertMyFavoriteToDb(myFavorite: MyFavorite) { 17 | myFavoriteLocalDataSource.insertMyFavorite(myFavorite, cb()) 18 | } 19 | 20 | open class cb : MyFavoriteLocalDataSource.CallBack { 21 | override fun insertSuccess() { 22 | } 23 | 24 | override fun insertError(e: Exception) { 25 | 26 | } 27 | 28 | } 29 | 30 | 31 | override fun start() {} 32 | 33 | } -------------------------------------------------------------------------------- /app/src/main/java/com/dch/test/contract/presenter/HomePresenter.java: -------------------------------------------------------------------------------- 1 | package com.dch.test.contract.presenter; 2 | 3 | import com.dch.test.contract.HomeContract; 4 | import com.dch.test.repository.ArticalDataSource; 5 | import com.dch.test.repository.ArticalRepository; 6 | import com.dch.test.repository.entity.GankEntity; 7 | 8 | import javax.inject.Inject; 9 | 10 | import static com.google.common.base.Preconditions.checkNotNull; 11 | 12 | /** 13 | * 作者:dch on 2017/4/10 16:32 14 | * 描述: 15 | * 邮箱:daichuanhao@caijinquan.com 16 | */ 17 | public class HomePresenter implements HomeContract.HomePresenter { 18 | private final HomeContract.View view; 19 | private final ArticalRepository mArticalRepository; 20 | 21 | @Inject 22 | public HomePresenter(HomeContract.View vieww, ArticalRepository articalRepository) { 23 | view = vieww; 24 | mArticalRepository = articalRepository; 25 | } 26 | 27 | @Inject 28 | void setupListeners(){ 29 | view.setHomePresenter(this); 30 | } 31 | 32 | @Override 33 | public void start() { 34 | getAndroidData(1,20); 35 | } 36 | 37 | @Override 38 | public void getAndroidData(int pageNum, int pageSize) { 39 | mArticalRepository.getAndroidData(new ArticalDataSource.GankCallback() { 40 | @Override 41 | public void onGankdataLoaded(GankEntity entity) { 42 | view.showDailyList(entity); 43 | } 44 | 45 | @Override 46 | public void onDataNotAvailable(Throwable throwable) { 47 | view.showError(throwable); 48 | } 49 | },pageNum,pageSize); 50 | } 51 | 52 | @Override 53 | public void getMeiziData(int pageNum, int pageSize) { 54 | mArticalRepository.getMeiziData(new ArticalDataSource.GankCallback() { 55 | @Override 56 | public void onGankdataLoaded(GankEntity entity) { 57 | view.showDailyList(entity); 58 | } 59 | 60 | @Override 61 | public void onDataNotAvailable(Throwable throwable) { 62 | view.showError(throwable); 63 | } 64 | },pageNum,pageSize); 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /app/src/main/java/com/dch/test/db/MyFavoriteLocalDataSource.kt: -------------------------------------------------------------------------------- 1 | package com.dch.test.db 2 | 3 | import com.dch.test.base.BaseApplication 4 | import com.dch.test.entity.MyFavorite 5 | 6 | /** 7 | * 作者:MrCoder on 2017/5/24 16:44 8 | * 描述: 9 | * 邮箱:daichuanhao@caijinquan.com 10 | */ 11 | object MyFavoriteLocalDataSource { 12 | 13 | fun insertMyFavorite(myFavorite: MyFavorite,callBack: CallBack) { 14 | try { 15 | BaseApplication.application.daoSession.myFavoriteDao.insert(myFavorite) 16 | callBack.insertSuccess() 17 | } catch(e: Exception) { 18 | callBack.insertError(e) 19 | } 20 | } 21 | 22 | 23 | interface CallBack{ 24 | fun insertSuccess() 25 | fun insertError(e: Exception) 26 | } 27 | 28 | } -------------------------------------------------------------------------------- /app/src/main/java/com/dch/test/di/activity/HomeActivityComponent.java: -------------------------------------------------------------------------------- 1 | package com.dch.test.di.activity; 2 | 3 | import com.dch.test.di.scope.FragmentScope; 4 | import com.dch.test.repository.ArticalRepositoryComponent; 5 | import com.dch.test.ui.HomeActivity; 6 | import dagger.Component; 7 | 8 | /** 9 | * 作者:Dch on 2017/4/20 14:45 10 | * 描述: 11 | * 邮箱:daichuanhao@caijinquan.com 12 | */ 13 | @FragmentScope 14 | @Component(dependencies = ArticalRepositoryComponent.class,modules = HomePresenterModule.class) 15 | public interface HomeActivityComponent { 16 | 17 | void inject(HomeActivity homeActivity); 18 | 19 | } 20 | -------------------------------------------------------------------------------- /app/src/main/java/com/dch/test/di/activity/HomeActivityModule.java: -------------------------------------------------------------------------------- 1 | package com.dch.test.di.activity; 2 | 3 | import android.support.v7.app.AppCompatActivity; 4 | 5 | import com.dch.test.di.scope.ActivityScope; 6 | 7 | import dagger.Module; 8 | import dagger.Provides; 9 | 10 | /** 11 | * 作者:Dch on 2017/4/20 14:48 12 | * 描述: 13 | * 邮箱:daichuanhao@caijinquan.com 14 | */ 15 | @Module 16 | public class HomeActivityModule { 17 | 18 | private final AppCompatActivity activity; 19 | 20 | public HomeActivityModule(AppCompatActivity activity){ 21 | this.activity = activity; 22 | } 23 | 24 | @Provides 25 | @ActivityScope 26 | AppCompatActivity activity(){ 27 | return this.activity; 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/java/com/dch/test/di/activity/HomePresenterModule.java: -------------------------------------------------------------------------------- 1 | package com.dch.test.di.activity; 2 | 3 | import com.dch.test.contract.HomeContract; 4 | 5 | import dagger.Module; 6 | import dagger.Provides; 7 | 8 | /** 9 | * 作者:Dch on 2017/4/26 11:00 10 | * 描述: 11 | * 邮箱:daichuanhao@caijinquan.com 12 | */ 13 | 14 | @Module 15 | public class HomePresenterModule { 16 | 17 | 18 | private final HomeContract.View mView; 19 | 20 | public HomePresenterModule(HomeContract.View view){ 21 | this.mView = view; 22 | } 23 | 24 | @Provides 25 | HomeContract.View provideHomeContractView(){ 26 | return mView; 27 | } 28 | 29 | } 30 | -------------------------------------------------------------------------------- /app/src/main/java/com/dch/test/di/app/AppComponent.java: -------------------------------------------------------------------------------- 1 | package com.dch.test.di.app; 2 | 3 | import android.content.Context; 4 | 5 | import com.dch.test.manager.DBManager; 6 | import com.dch.test.manager.SpfManager; 7 | import com.dch.test.repository.remote.apistores.CsdnApiService; 8 | import com.dch.test.repository.remote.apistores.GankApiService; 9 | 10 | import javax.inject.Singleton; 11 | 12 | import dagger.Component; 13 | 14 | /** 15 | * 作者:Dch on 2017/4/20 14:25 16 | * 描述: 17 | * 邮箱:daichuanhao@caijinquan.com 18 | */ 19 | @Singleton 20 | @Component(modules = AppModule.class) 21 | public interface AppComponent { 22 | Context context(); //提供application的context 23 | 24 | CsdnApiService csdnApiService(); //csdn的网络请求 25 | 26 | GankApiService gankApiService(); //gank的网络请求 27 | 28 | SpfManager spfManager(); //SharePreference管理类 29 | 30 | DBManager dbManager(); //数据库管理类 31 | } 32 | -------------------------------------------------------------------------------- /app/src/main/java/com/dch/test/di/app/AppModule.java: -------------------------------------------------------------------------------- 1 | package com.dch.test.di.app; 2 | 3 | import android.content.Context; 4 | 5 | import com.dch.test.manager.DBManager; 6 | import com.dch.test.manager.RetrofitManager; 7 | import com.dch.test.manager.SpfManager; 8 | import com.dch.test.repository.remote.apistores.CsdnApiService; 9 | import com.dch.test.repository.remote.apistores.GankApiService; 10 | 11 | import javax.inject.Singleton; 12 | 13 | import dagger.Module; 14 | import dagger.Provides; 15 | 16 | /** 17 | * 作者:Dch on 2017/4/20 14:18 18 | * 描述: 19 | * 邮箱:daichuanhao@caijinquan.com 20 | */ 21 | @Module 22 | public final class AppModule { 23 | 24 | private final Context context; 25 | 26 | public AppModule(Context context) { 27 | this.context = context; 28 | } 29 | 30 | @Provides 31 | Context provideApplicationContext() { 32 | return context; 33 | } 34 | 35 | @Provides 36 | CsdnApiService provideCsdnApiService(RetrofitManager retrofitManager) { 37 | return retrofitManager.createCsdnApiService(); 38 | } 39 | 40 | @Provides 41 | GankApiService provideGankApiService(RetrofitManager retrofitManager) { 42 | return retrofitManager.createGankApiService(); 43 | } 44 | 45 | @Provides 46 | SpfManager provideSpfManager() { 47 | return new SpfManager(context); 48 | } 49 | 50 | @Provides 51 | DBManager provideDBManager() { 52 | return new DBManager(context); 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /app/src/main/java/com/dch/test/di/scope/ActivityScope.java: -------------------------------------------------------------------------------- 1 | package com.dch.test.di.scope; 2 | 3 | import java.lang.annotation.Retention; 4 | import java.lang.annotation.RetentionPolicy; 5 | 6 | import javax.inject.Scope; 7 | 8 | /** 9 | * 作者:Dch on 2017/4/20 14:46 10 | * 描述: 11 | * 邮箱:daichuanhao@caijinquan.com 12 | */ 13 | @Scope 14 | @Retention(RetentionPolicy.RUNTIME) 15 | public @interface ActivityScope {} 16 | -------------------------------------------------------------------------------- /app/src/main/java/com/dch/test/di/scope/FragmentScope.java: -------------------------------------------------------------------------------- 1 | package com.dch.test.di.scope; 2 | 3 | import java.lang.annotation.Retention; 4 | import java.lang.annotation.RetentionPolicy; 5 | 6 | import javax.inject.Scope; 7 | 8 | /** 9 | * 作者:Dch on 2017/4/20 14:46 10 | * 描述: 11 | * 邮箱:daichuanhao@caijinquan.com 12 | */ 13 | @Scope 14 | @Retention(RetentionPolicy.RUNTIME) 15 | public @interface FragmentScope {} 16 | -------------------------------------------------------------------------------- /app/src/main/java/com/dch/test/entity/MyFavorite.java: -------------------------------------------------------------------------------- 1 | package com.dch.test.entity; 2 | 3 | import org.greenrobot.greendao.annotation.Entity; 4 | import org.greenrobot.greendao.annotation.Generated; 5 | import org.greenrobot.greendao.annotation.Id; 6 | import org.greenrobot.greendao.annotation.Index; 7 | 8 | import java.io.Serializable; 9 | 10 | /** 11 | * 作者:Dch on 2017/5/22 17:02 12 | * 描述: 13 | * 邮箱:daichuanhao@caijinquan.com 14 | */ 15 | @Entity 16 | public class MyFavorite implements Serializable { 17 | 18 | @Id(autoincrement = true) 19 | private Long id; 20 | @Index(unique = true) 21 | private String favoriteId; 22 | private String title; 23 | private String contentDiscription; 24 | private String collectTime; 25 | private String url; 26 | private String imgUrl; 27 | 28 | @Generated(hash = 2012303583) 29 | public MyFavorite(Long id, String favoriteId, String title, 30 | String contentDiscription, String collectTime, String url, 31 | String imgUrl) { 32 | this.id = id; 33 | this.favoriteId = favoriteId; 34 | this.title = title; 35 | this.contentDiscription = contentDiscription; 36 | this.collectTime = collectTime; 37 | this.url = url; 38 | this.imgUrl = imgUrl; 39 | } 40 | 41 | @Generated(hash = 1538796775) 42 | public MyFavorite() { 43 | } 44 | 45 | public Long getId() { 46 | return this.id; 47 | } 48 | 49 | public void setId(Long id) { 50 | this.id = id; 51 | } 52 | 53 | public String getFavoriteId() { 54 | return this.favoriteId; 55 | } 56 | 57 | public void setFavoriteId(String favoriteId) { 58 | this.favoriteId = favoriteId; 59 | } 60 | 61 | public String getTitle() { 62 | return this.title; 63 | } 64 | 65 | public void setTitle(String title) { 66 | this.title = title; 67 | } 68 | 69 | public String getContentDiscription() { 70 | return this.contentDiscription; 71 | } 72 | 73 | public void setContentDiscription(String contentDiscription) { 74 | this.contentDiscription = contentDiscription; 75 | } 76 | 77 | public String getCollectTime() { 78 | return this.collectTime; 79 | } 80 | 81 | public void setCollectTime(String collectTime) { 82 | this.collectTime = collectTime; 83 | } 84 | 85 | public String getUrl() { 86 | return this.url; 87 | } 88 | 89 | public void setUrl(String url) { 90 | this.url = url; 91 | } 92 | 93 | public String getImgUrl() { 94 | return this.imgUrl; 95 | } 96 | 97 | public void setImgUrl(String imgUrl) { 98 | this.imgUrl = imgUrl; 99 | } 100 | 101 | } 102 | -------------------------------------------------------------------------------- /app/src/main/java/com/dch/test/entity/MyFavoriteCollect.kt: -------------------------------------------------------------------------------- 1 | package com.dch.test.entity 2 | 3 | /** 4 | * 作者:Dch on 2017/5/22 16:54 5 | * 描述: 6 | * 邮箱:daichuanhao@caijinquan.com 7 | */ 8 | data class MyFavoriteCollect(val title: String, val contentDiscription: String, val collectTime: String) -------------------------------------------------------------------------------- /app/src/main/java/com/dch/test/entity/ViewTypeBean.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 Yan Zhenjie 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.dch.test.entity; 17 | 18 | /** 19 | * Created by Yan Zhenjie on 2016/8/25. 20 | */ 21 | public class ViewTypeBean { 22 | 23 | private String content; 24 | 25 | private int viewType; 26 | 27 | public ViewTypeBean() { 28 | } 29 | 30 | public ViewTypeBean(String content, int viewType) { 31 | this.content = content; 32 | this.viewType = viewType; 33 | } 34 | 35 | public String getContent() { 36 | return content; 37 | } 38 | 39 | public void setContent(String content) { 40 | this.content = content; 41 | } 42 | 43 | public int getViewType() { 44 | return viewType; 45 | } 46 | 47 | public void setViewType(int viewType) { 48 | this.viewType = viewType; 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /app/src/main/java/com/dch/test/manager/DBManager.java: -------------------------------------------------------------------------------- 1 | package com.dch.test.manager; 2 | 3 | import android.content.Context; 4 | 5 | /** 6 | * 作者:Dch on 2017/4/20 14:23 7 | * 描述: 8 | * 邮箱:daichuanhao@caijinquan.com 9 | */ 10 | public class DBManager { 11 | public DBManager(Context context) { 12 | 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /app/src/main/java/com/dch/test/manager/RequestManager.kt: -------------------------------------------------------------------------------- 1 | package com.dch.test.manager 2 | 3 | import java.net.URL 4 | 5 | /** 6 | * 作者:MrCoder on 2017/5/26 17:26 7 | * 描述: 8 | * 邮箱:daichuanhao@caijinquan.com 9 | */ 10 | public class RequestManager(val url: String) { 11 | public fun run() = URL(url).readText() 12 | } -------------------------------------------------------------------------------- /app/src/main/java/com/dch/test/manager/SpfManager.java: -------------------------------------------------------------------------------- 1 | package com.dch.test.manager; 2 | 3 | import android.content.Context; 4 | 5 | /** 6 | * 作者:Dch on 2017/4/20 14:24 7 | * 描述: 8 | * 邮箱:daichuanhao@caijinquan.com 9 | */ 10 | public class SpfManager { 11 | public SpfManager(Context context) { 12 | 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /app/src/main/java/com/dch/test/remote/MusicService.java: -------------------------------------------------------------------------------- 1 | package com.dch.test.remote; 2 | 3 | import android.app.Service; 4 | import android.content.Intent; 5 | import android.os.Binder; 6 | import android.os.IBinder; 7 | import android.support.annotation.Nullable; 8 | import android.util.Log; 9 | 10 | /** 11 | * 作者:MrCoder on 2017/7/7 15:52 12 | * 描述: 13 | * 邮箱:daichuanhao@caijinquan.com 14 | */ 15 | public class MusicService extends Service { 16 | private final String TAG = "MusicService"; 17 | 18 | private boolean isMusicPlay = false; 19 | private MyBinder myBinder = new MyBinder(); 20 | 21 | public void startPlayMusic(){ 22 | isMusicPlay = true; 23 | Log.d(TAG,"startPlayMusic"); 24 | } 25 | 26 | public void stopPlayMusic(){ 27 | isMusicPlay = false; 28 | Log.d(TAG,"stopPlayMusic"); 29 | } 30 | 31 | @Nullable 32 | @Override 33 | public IBinder onBind(Intent intent) { 34 | return myBinder; 35 | } 36 | 37 | public class MyBinder extends Binder{ 38 | 39 | public MusicService getMusicService(){ 40 | return MusicService.this; 41 | } 42 | 43 | public boolean isMusicPlaying(){ 44 | return isMusicPlay; 45 | } 46 | 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /app/src/main/java/com/dch/test/repository/ArticalDataSource.java: -------------------------------------------------------------------------------- 1 | package com.dch.test.repository; 2 | 3 | import android.support.annotation.NonNull; 4 | 5 | import com.dch.test.repository.entity.GankEntity; 6 | 7 | import java.util.ArrayList; 8 | 9 | /** 10 | * 作者:Dch on 2017/4/10 17:25 11 | * 描述: 12 | * 邮箱:daichuanhao@caijinquan.com 13 | */ 14 | public interface ArticalDataSource { 15 | 16 | interface LoadArticalCallback { 17 | void onArticalLoaded(ArrayList list); 18 | void onDataNotAvailable(); 19 | } 20 | 21 | interface GankCallback { 22 | void onGankdataLoaded(GankEntity entity); 23 | void onDataNotAvailable(Throwable throwable); 24 | } 25 | 26 | void getArticalsData(@NonNull LoadArticalCallback callback); 27 | 28 | void getMeiziData(@NonNull GankCallback callback, int pageNum, int pageSize); 29 | 30 | void getAndroidData(@NonNull GankCallback callback,int pageNum, int pageSize); 31 | } 32 | -------------------------------------------------------------------------------- /app/src/main/java/com/dch/test/repository/ArticalRepositoryComponent.java: -------------------------------------------------------------------------------- 1 | package com.dch.test.repository; 2 | 3 | import com.dch.test.di.app.AppModule; 4 | 5 | import javax.inject.Singleton; 6 | 7 | import dagger.Component; 8 | 9 | /** 10 | * Created by dch on 2017/4/23. 11 | */ 12 | 13 | @Singleton 14 | @Component(modules = {ArticalRepositoryModule.class, AppModule.class}) 15 | public interface ArticalRepositoryComponent { 16 | 17 | ArticalRepository getArticalRepository(); 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/java/com/dch/test/repository/ArticalRepositoryModule.java: -------------------------------------------------------------------------------- 1 | package com.dch.test.repository; 2 | 3 | import com.dch.test.repository.local.ArticalLocalDataSource; 4 | import com.dch.test.repository.remote.ArticalRemoteDataSource; 5 | import com.dch.test.repository.remote.Local; 6 | 7 | import javax.inject.Singleton; 8 | 9 | import dagger.Binds; 10 | import dagger.Module; 11 | import dagger.Provides; 12 | 13 | /** 14 | * Created by dch on 2017/4/23. 15 | */ 16 | 17 | @Module 18 | abstract class ArticalRepositoryModule { 19 | 20 | @Singleton 21 | @Binds 22 | @Remote 23 | abstract ArticalDataSource provideRemoteArticalDataSource(ArticalRemoteDataSource remoteDataSource); 24 | 25 | @Singleton 26 | @Binds 27 | @Local 28 | abstract ArticalDataSource provideLocalArticalDataSource(ArticalLocalDataSource localDataSource); 29 | } 30 | -------------------------------------------------------------------------------- /app/src/main/java/com/dch/test/repository/Remote.java: -------------------------------------------------------------------------------- 1 | package com.dch.test.repository; 2 | 3 | import java.lang.annotation.Documented; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | 7 | import javax.inject.Qualifier; 8 | 9 | /** 10 | * Created by dch on 2017/4/23. 11 | */ 12 | 13 | @Qualifier 14 | @Documented 15 | @Retention(RetentionPolicy.RUNTIME) 16 | public @interface Remote { 17 | } 18 | -------------------------------------------------------------------------------- /app/src/main/java/com/dch/test/repository/entity/Artical.java: -------------------------------------------------------------------------------- 1 | package com.dch.test.repository.entity; 2 | 3 | /** 4 | * 作者:dch on 2017/4/10 17:21 5 | * 描述: 6 | * 邮箱:daichuanhao@caijinquan.com 7 | */ 8 | public class Artical { 9 | public String date; 10 | public String articalName; 11 | public String articalContent; 12 | } 13 | -------------------------------------------------------------------------------- /app/src/main/java/com/dch/test/repository/entity/BaseEntity.java: -------------------------------------------------------------------------------- 1 | package com.dch.test.repository.entity; 2 | 3 | import java.io.Serializable; 4 | 5 | /** 6 | * 作者:Dch on 2017/4/12 10:53 7 | * 描述: 8 | * 邮箱:daichuanhao@caijinquan.com 9 | */ 10 | public class BaseEntity implements Serializable{ 11 | 12 | 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/dch/test/repository/entity/GankEntity.java: -------------------------------------------------------------------------------- 1 | package com.dch.test.repository.entity; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | /** 7 | * 作者:Dch on 2017/4/17 14:07 8 | * 描述: 9 | * 邮箱:daichuanhao@caijinquan.com 10 | */ 11 | public class GankEntity { 12 | public String error; 13 | public List results = new ArrayList<>(); 14 | 15 | public static class Data{ 16 | public String _id; 17 | public String createdAt; 18 | public String desc; 19 | public String[] images; 20 | public String publishedAt; 21 | public String source; 22 | public String type; 23 | public String url; 24 | public String used; 25 | public String who; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /app/src/main/java/com/dch/test/repository/entity/User.java: -------------------------------------------------------------------------------- 1 | package com.dch.test.repository.entity; 2 | 3 | /** 4 | * 作者:Dch on 2017/4/12 10:52 5 | * 描述: 6 | * 邮箱:daichuanhao@caijinquan.com 7 | */ 8 | public class User { 9 | } 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/dch/test/repository/local/ArticalLocalDataSource.java: -------------------------------------------------------------------------------- 1 | package com.dch.test.repository.local; 2 | 3 | import android.support.annotation.NonNull; 4 | 5 | import com.dch.test.repository.ArticalDataSource; 6 | 7 | import javax.inject.Inject; 8 | 9 | import static com.google.common.base.Preconditions.checkNotNull; 10 | 11 | /** 12 | * 作者:Dch on 2017/4/10 17:24 13 | * 描述: 14 | * 邮箱:daichuanhao@caijinquan.com 15 | */ 16 | public class ArticalLocalDataSource implements ArticalDataSource { 17 | 18 | private static ArticalLocalDataSource INSTANCE; 19 | 20 | @Inject 21 | public ArticalLocalDataSource () { 22 | } 23 | 24 | @Override 25 | public void getArticalsData(@NonNull LoadArticalCallback callback) { 26 | 27 | } 28 | 29 | @Override 30 | public void getMeiziData(@NonNull GankCallback callback, int pageNum, int pageSize) { 31 | 32 | } 33 | 34 | @Override 35 | public void getAndroidData(@NonNull GankCallback callback,int pageNum, int pageSize) { 36 | 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /app/src/main/java/com/dch/test/repository/remote/CSDNApi.java: -------------------------------------------------------------------------------- 1 | package com.dch.test.repository.remote; 2 | 3 | /** 4 | * 作者:Dch on 2017/4/11 12:10 5 | * 描述: 6 | * 邮箱:daichuanhao@caijinquan.com 7 | */ 8 | public interface CSDNApi { 9 | } 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/dch/test/repository/remote/HttpResult.java: -------------------------------------------------------------------------------- 1 | package com.dch.test.repository.remote; 2 | 3 | /** 4 | * 作者:Dch on 2017/4/12 17:25 5 | * 描述: 6 | * 邮箱:daichuanhao@caijinquan.com 7 | */ 8 | public class HttpResult { 9 | } 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/dch/test/repository/remote/Local.java: -------------------------------------------------------------------------------- 1 | package com.dch.test.repository.remote; 2 | 3 | import java.lang.annotation.Documented; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | 7 | import javax.inject.Qualifier; 8 | 9 | /** 10 | * Created by dch on 2017/4/23. 11 | */ 12 | 13 | @Qualifier 14 | @Documented 15 | @Retention(RetentionPolicy.RUNTIME) 16 | public @interface Local { 17 | } 18 | -------------------------------------------------------------------------------- /app/src/main/java/com/dch/test/repository/remote/apistores/CsdnApiService.java: -------------------------------------------------------------------------------- 1 | package com.dch.test.repository.remote.apistores; 2 | 3 | import com.dch.test.repository.entity.BaseEntity; 4 | import com.dch.test.repository.entity.User; 5 | 6 | import java.util.Map; 7 | 8 | import io.reactivex.Observable; 9 | import retrofit2.http.FieldMap; 10 | import retrofit2.http.FormUrlEncoded; 11 | import retrofit2.http.GET; 12 | import retrofit2.http.POST; 13 | 14 | /** 15 | * 作者:Dch on 2017/4/10 18:55 16 | * 描述: 17 | * 邮箱:daichuanhao@caijinquan.com 18 | */ 19 | public interface CsdnApiService { 20 | public String base_url = "http://blog.csdn.net"; 21 | public String list_url = "/coderder"; 22 | 23 | @FormUrlEncoded 24 | @POST("getUser") 25 | Observable> getUser(@FieldMap Map map); 26 | 27 | 28 | @GET(CsdnApiService.list_url) 29 | Observable getArticalList(); 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/java/com/dch/test/repository/remote/apistores/GankApiService.java: -------------------------------------------------------------------------------- 1 | package com.dch.test.repository.remote.apistores; 2 | 3 | import com.dch.test.repository.entity.GankEntity; 4 | 5 | import io.reactivex.Flowable; 6 | import retrofit2.http.GET; 7 | import retrofit2.http.POST; 8 | import retrofit2.http.Path; 9 | import retrofit2.http.Url; 10 | 11 | /** 12 | * 作者:Dch on 2017/4/17 14:11 13 | * 描述: 14 | * 邮箱:daichuanhao@caijinquan.com 15 | */ 16 | public interface GankApiService { 17 | 18 | public String base_url = "http://gank.io/api/data/"; 19 | public String android_url = "http://gank.io/api/data/"; 20 | 21 | 22 | @GET("{type}/{count}/{pageIndex}") 23 | Flowable getDailyMeiziData(@Path("type") String type,@Path("count") int count,@Path("pageIndex") int pageIndex); 24 | 25 | @GET("{type}/{count}/{pageIndex}") 26 | Flowable getDailyAndroidData(@Path("type") String type,@Path("count") int count,@Path("pageIndex") int pageIndex); 27 | } 28 | -------------------------------------------------------------------------------- /app/src/main/java/com/dch/test/ui/CardAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.dch.test.ui 2 | 3 | import android.support.v7.widget.RecyclerView 4 | import android.view.View 5 | import android.view.ViewGroup 6 | import android.widget.ImageView 7 | import com.dch.test.R 8 | import kotlinx.android.synthetic.main.card_item_photoview.view.* 9 | 10 | /** 11 | * 作者:MrCoder on 2017/6/2 17:47 12 | * 描述: 13 | * 邮箱:daichuanhao@caijinquan.com 14 | */ 15 | public class CardAdapter(var items: List,val showImageView:(ImageView, String)->Unit): RecyclerView.Adapter(){ 16 | override fun onBindViewHolder(holder: CardHolder?, position: Int) { 17 | holder?.bindView(items[position]) 18 | } 19 | 20 | override fun getItemCount() = items.size 21 | 22 | override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): CardHolder { 23 | var view = View.inflate(parent?.context, R.layout.card_item_photoview, null) 24 | return CardHolder(view,showImageView) 25 | } 26 | 27 | 28 | class CardHolder(itemView: View, val showView: (ImageView,String) -> Unit):RecyclerView.ViewHolder(itemView){ 29 | fun bindView(url: String){ 30 | with(url){ 31 | showView(itemView.imageView_photoview,url) 32 | } 33 | } 34 | } 35 | } -------------------------------------------------------------------------------- /app/src/main/java/com/dch/test/ui/CloseFabEvent.kt: -------------------------------------------------------------------------------- 1 | package com.dch.test.ui 2 | 3 | /** 4 | * 作者:MrCoder on 2017/7/4 14:49 5 | * 描述: 6 | * 邮箱:daichuanhao@caijinquan.com 7 | */ 8 | public class CloseFabEvent(status : String = "0"){ 9 | 10 | } -------------------------------------------------------------------------------- /app/src/main/java/com/dch/test/ui/FabCloseEvent.java: -------------------------------------------------------------------------------- 1 | package com.dch.test.ui; 2 | 3 | /** 4 | * 作者:MrCoder on 2017/7/4 14:56 5 | * 描述: 6 | * 邮箱:daichuanhao@caijinquan.com 7 | */ 8 | public class FabCloseEvent { 9 | public int status = 0; 10 | } 11 | -------------------------------------------------------------------------------- /app/src/main/java/com/dch/test/ui/GameActivity.java: -------------------------------------------------------------------------------- 1 | package com.dch.test.ui; 2 | 3 | import android.support.design.widget.Snackbar; 4 | import android.support.v7.app.AppCompatActivity; 5 | import android.os.Bundle; 6 | import android.support.v7.widget.DefaultItemAnimator; 7 | import android.view.View; 8 | 9 | import com.dch.test.R; 10 | import com.dch.test.base.BaseActivity; 11 | import com.dch.test.util.StatusBarUtils; 12 | import com.dch.test.widget.FiveChessesView; 13 | 14 | import butterknife.BindView; 15 | 16 | public class GameActivity extends BaseActivity { 17 | 18 | @BindView(R.id.chessesview) 19 | FiveChessesView chessesView; 20 | 21 | @Override 22 | protected void initData() { 23 | 24 | } 25 | 26 | @Override 27 | protected void initView() { 28 | chessesView.setIChessResultListener(new FiveChessesView.IChessResultListener() { 29 | @Override 30 | public void ResultListerer(int result) { 31 | if (0 == result){ 32 | //黑子胜 33 | Snackbar.make(chessesView,"黑棋胜",Snackbar.LENGTH_LONG).setAction("再来一局", new View.OnClickListener() { 34 | @Override 35 | public void onClick(View v) { 36 | chessesView.reStart(); 37 | } 38 | }).show(); 39 | } else { 40 | Snackbar.make(chessesView,"白棋胜",Snackbar.LENGTH_LONG).setAction("再来一局", new View.OnClickListener() { 41 | @Override 42 | public void onClick(View v) { 43 | chessesView.reStart(); 44 | } 45 | }).show(); 46 | } 47 | } 48 | }); 49 | } 50 | 51 | @Override 52 | protected int setLayoutId() { 53 | return R.layout.activity_game; 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /app/src/main/java/com/dch/test/ui/KotlinSettingsActivity.kt: -------------------------------------------------------------------------------- 1 | package com.dch.test.ui 2 | 3 | import android.view.ViewGroup 4 | import android.widget.ImageView 5 | import com.dch.test.R 6 | import com.dch.test.base.BaseActivity 7 | import com.dch.test.widget.PlaneFloating 8 | import com.ufreedom.floatingview.Floating 9 | import com.ufreedom.floatingview.FloatingBuilder 10 | import kotlinx.android.synthetic.main.activity_kotlin_settings.* 11 | import org.jetbrains.anko.act 12 | import org.jetbrains.anko.onClick 13 | 14 | class KotlinSettingsActivity : BaseActivity() { 15 | override fun initData() { 16 | bt_plane.onClick { v -> 17 | val imageView = ImageView(act) 18 | imageView.layoutParams = ViewGroup.LayoutParams(bt_plane.measuredWidth, bt_plane.measuredHeight) 19 | imageView.setImageResource(R.drawable.floating_plane) 20 | 21 | val build = FloatingBuilder() 22 | .anchorView(v) 23 | .targetView(imageView) 24 | .floatingTransition(PlaneFloating()) 25 | .build() 26 | Floating(this).startFloating(build) 27 | } 28 | 29 | bt_star.onClick { v -> 30 | val imageView = ImageView(act) 31 | imageView.layoutParams = ViewGroup.LayoutParams(bt_plane.measuredWidth, bt_plane.measuredHeight) 32 | imageView.setImageResource(R.drawable.floating_plane) 33 | 34 | val build = FloatingBuilder() 35 | .anchorView(v) 36 | .targetView(imageView) 37 | .floatingTransition(PlaneFloating()) 38 | .build() 39 | Floating(this).startFloating(build) 40 | } 41 | } 42 | 43 | override fun initView() { 44 | circlepb.start() 45 | } 46 | 47 | override fun setLayoutId() = R.layout.activity_kotlin_settings 48 | } 49 | -------------------------------------------------------------------------------- /app/src/main/java/com/dch/test/ui/KotlinWebDetailsActivity.kt: -------------------------------------------------------------------------------- 1 | package com.dch.test.ui 2 | 3 | import com.dch.test.R 4 | import com.dch.test.base.BaseActivity 5 | 6 | class KotlinWebDetailsActivity : BaseActivity() { 7 | 8 | override fun initView() { 9 | TODO("not implemented") //To change body of created functions use File | Settings | File Templates. 10 | } 11 | 12 | override fun setLayoutId() = R.layout.activity_kotlin_web_details 13 | 14 | override fun initData() { 15 | TODO("not implemented") //To change body of created functions use File | Settings | File Templates. 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /app/src/main/java/com/dch/test/ui/LeadActivity.java: -------------------------------------------------------------------------------- 1 | package com.dch.test.ui; 2 | 3 | import android.graphics.Path; 4 | import android.support.design.widget.FloatingActionButton; 5 | import android.support.design.widget.Snackbar; 6 | import android.support.v7.app.AppCompatActivity; 7 | import android.support.v7.widget.Toolbar; 8 | 9 | import android.support.v4.app.Fragment; 10 | import android.support.v4.app.FragmentManager; 11 | import android.support.v4.app.FragmentPagerAdapter; 12 | import android.support.v4.view.ViewPager; 13 | import android.os.Bundle; 14 | import android.view.LayoutInflater; 15 | import android.view.Menu; 16 | import android.view.MenuItem; 17 | import android.view.View; 18 | import android.view.ViewGroup; 19 | 20 | import android.widget.TextView; 21 | 22 | import com.dch.test.R; 23 | import com.dch.test.base.BaseActivity; 24 | import com.mcxtzhang.pathanimlib.StoreHouseAnimView; 25 | import com.mcxtzhang.pathanimlib.res.StoreHousePath; 26 | import com.mcxtzhang.pathanimlib.utils.PathParserUtils; 27 | 28 | import butterknife.BindView; 29 | 30 | public class LeadActivity extends BaseActivity { 31 | 32 | @BindView(R.id.pathAnimView1) 33 | StoreHouseAnimView pathAnimView1; 34 | 35 | @Override 36 | protected void initData() { 37 | 38 | Path path = new Path(); 39 | path.moveTo(0,0); 40 | path.addCircle(40,40,30, Path.Direction.CW); 41 | pathAnimView1.setSourcePath(PathParserUtils.getPathFromArrayFloatList(StoreHousePath.getPath("pathview"))); 42 | pathAnimView1.startAnim(); 43 | 44 | } 45 | 46 | @Override 47 | protected void initView() { 48 | 49 | } 50 | 51 | @Override 52 | protected int setLayoutId() { 53 | return R.layout.activity_lead; 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /app/src/main/java/com/dch/test/ui/test/TestFragment.java: -------------------------------------------------------------------------------- 1 | package com.dch.test.ui.test; 2 | 3 | import android.os.Bundle; 4 | import android.support.annotation.Nullable; 5 | import android.support.v4.app.Fragment; 6 | import android.view.LayoutInflater; 7 | import android.view.View; 8 | import android.view.ViewGroup; 9 | import android.widget.TextView; 10 | 11 | /** 12 | * Created by dch on 2017/7/27. 13 | */ 14 | 15 | public class TestFragment extends Fragment { 16 | 17 | @Nullable 18 | @Override 19 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) { 20 | TextView textView = new TextView(container.getContext()); 21 | ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); 22 | textView.setLayoutParams(layoutParams); 23 | Bundle arguments = getArguments(); 24 | String pos = arguments.getString("pos"); 25 | textView.setText("我是第"+pos+"个位置"); 26 | return textView; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /app/src/main/java/com/dch/test/util/ActivityUtils.java: -------------------------------------------------------------------------------- 1 | package com.dch.test.util; 2 | 3 | import android.app.Activity; 4 | import android.content.Intent; 5 | 6 | /** 7 | * 作者:Dch on 2017/4/17 11:30 8 | * 描述: 9 | * 邮箱:daichuanhao@caijinquan.com 10 | */ 11 | public class ActivityUtils { 12 | 13 | public static void startActivity(Activity activity, Class clazz){ 14 | activity.startActivity(new Intent(activity,clazz)); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/java/com/dch/test/util/Config.java: -------------------------------------------------------------------------------- 1 | package com.dch.test.util; 2 | 3 | /** 4 | * 作者:Dch on 2017/5/24 10:43 5 | * 描述: 6 | * 邮箱:daichuanhao@caijinquan.com 7 | */ 8 | public class Config { 9 | public static String APP_GUIDE = "APP_GUIDE"; 10 | 11 | public static String MYFAVOTITE = "MYFAVOTITE"; 12 | } 13 | -------------------------------------------------------------------------------- /app/src/main/java/com/dch/test/util/CrashHandler.java: -------------------------------------------------------------------------------- 1 | package com.dch.test.util; 2 | 3 | import android.content.Context; 4 | import android.content.DialogInterface; 5 | import android.support.v7.app.AlertDialog; 6 | import android.view.WindowManager; 7 | 8 | /** 9 | * 作者:Dch on 2017/4/27 12:09 10 | * 描述: 11 | * 邮箱:daichuanhao@caijinquan.com 12 | */ 13 | public class CrashHandler implements Thread.UncaughtExceptionHandler { 14 | 15 | private static CrashHandler instance = new CrashHandler(); 16 | private Thread.UncaughtExceptionHandler defaultUncaughtExceptionHandler; 17 | private Context context; 18 | 19 | private CrashHandler(){} 20 | 21 | public static CrashHandler getInstance(){ 22 | return instance; 23 | } 24 | 25 | public void init(Context context){ 26 | defaultUncaughtExceptionHandler = Thread.getDefaultUncaughtExceptionHandler(); 27 | Thread.setDefaultUncaughtExceptionHandler(this); 28 | this.context = context; 29 | } 30 | 31 | 32 | /** 33 | * 34 | * @param t 出现未捕获异常的线程 35 | * @param e 未捕获的异常 36 | */ 37 | @Override 38 | public void uncaughtException(Thread t, Throwable e) { 39 | final AlertDialog.Builder builder = new AlertDialog.Builder(context); 40 | builder.setTitle("出现异常"); 41 | builder.setMessage(e.getMessage()); 42 | builder.setPositiveButton("确定", new DialogInterface.OnClickListener(){ 43 | 44 | @Override 45 | public void onClick(DialogInterface dialog, int which) { 46 | dialog.dismiss(); 47 | } 48 | }); 49 | AlertDialog alertDialog = builder.create(); 50 | alertDialog.setCancelable(false); 51 | alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); 52 | alertDialog.show(); 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /app/src/main/java/com/dch/test/util/NetUtil.java: -------------------------------------------------------------------------------- 1 | package com.dch.test.util; 2 | 3 | import android.content.Context; 4 | import android.net.ConnectivityManager; 5 | import android.net.NetworkInfo; 6 | import android.widget.Toast; 7 | 8 | import com.dch.test.R; 9 | import com.dch.test.base.BaseApplication; 10 | 11 | /** 12 | * Created by Eric on 2017/1/17. 13 | */ 14 | 15 | public class NetUtil { 16 | 17 | /** 18 | * 检查当前网络是否可用 19 | * 20 | * @return 是否连接到网络 21 | */ 22 | public static boolean isNetworkAvailable() { 23 | ConnectivityManager connectivityManager = (ConnectivityManager) BaseApplication.application 24 | .getSystemService(Context.CONNECTIVITY_SERVICE); 25 | 26 | if (connectivityManager != null) { 27 | NetworkInfo info = connectivityManager.getActiveNetworkInfo(); 28 | if (info != null && info.isConnected()) { 29 | if (info.getState() == NetworkInfo.State.CONNECTED) { 30 | return true; 31 | } 32 | } 33 | } 34 | return false; 35 | } 36 | 37 | public static boolean isNetworkErrThenShowMsg() { 38 | if (!isNetworkAvailable()) { 39 | //TODO: 刚启动app Snackbar不起作用,延迟显示也不好使,这是why? 40 | Toast.makeText(BaseApplication.application, BaseApplication.application.getString(R.string.internet_error), 41 | Toast.LENGTH_SHORT).show(); 42 | return true; 43 | } 44 | return false; 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /app/src/main/java/com/dch/test/util/RxBus.java: -------------------------------------------------------------------------------- 1 | package com.dch.test.util; 2 | 3 | import io.reactivex.BackpressureStrategy; 4 | import io.reactivex.Flowable; 5 | import io.reactivex.FlowableEmitter; 6 | import io.reactivex.FlowableOnSubscribe; 7 | import io.reactivex.android.schedulers.AndroidSchedulers; 8 | import io.reactivex.annotations.NonNull; 9 | import io.reactivex.functions.Consumer; 10 | 11 | /** 12 | * 作者:Dch on 2017/4/13 12:10 13 | * 描述: 14 | * 邮箱:daichuanhao@caijinquan.com 15 | */ 16 | public class RxBus { 17 | private Flowable flowable; 18 | private FlowableEmitter emmiter; 19 | private static RxBus instance; 20 | 21 | private RxBus() { 22 | flowable = Flowable.create(new FlowableOnSubscribe() { 23 | @Override 24 | public void subscribe(@NonNull FlowableEmitter e) throws Exception { 25 | emmiter = e; 26 | } 27 | }, BackpressureStrategy.ERROR); 28 | } 29 | 30 | public static RxBus getInstance() { 31 | if (null == instance) { 32 | synchronized (RxBus.class) { 33 | if (null == instance) { 34 | instance = new RxBus(); 35 | } 36 | } 37 | } 38 | return instance; 39 | } 40 | 41 | //主线程接收消息 42 | public void registSubject(final CallBack callBack) { 43 | flowable.observeOn(AndroidSchedulers.mainThread()) 44 | .subscribe(new Consumer() { 45 | @Override 46 | public void accept(@NonNull T o) { 47 | try { 48 | callBack.onNext(o); 49 | } catch (Exception e){ 50 | callBack.onError(e); 51 | } 52 | } 53 | }); 54 | 55 | } 56 | 57 | public void post(T obj) { 58 | if (emmiter != null) 59 | emmiter.onNext(obj); 60 | } 61 | 62 | public interface CallBack { 63 | void onNext(T s); 64 | 65 | void onError(Exception t); 66 | } 67 | 68 | } 69 | -------------------------------------------------------------------------------- /app/src/main/java/com/dch/test/util/ToastUtils.java: -------------------------------------------------------------------------------- 1 | package com.dch.test.util; 2 | 3 | import android.widget.Toast; 4 | 5 | import com.dch.test.base.BaseApplication; 6 | 7 | /** 8 | * 作者:dch on 2017/4/10 16:48 9 | * 描述: 10 | * 邮箱:daichuanhao@caijinquan.com 11 | */ 12 | public class ToastUtils { 13 | 14 | private static Toast toast; 15 | 16 | public static void showMessage(String content) { 17 | if (toast == null) { 18 | toast = Toast.makeText(BaseApplication.application, 19 | content, 20 | Toast.LENGTH_SHORT); 21 | } else { 22 | toast.setText(content); 23 | } 24 | toast.show(); 25 | } 26 | 27 | 28 | public static void showLongTimeMessage(String content) { 29 | if (toast == null) { 30 | toast = Toast.makeText(BaseApplication.application, 31 | content, 32 | Toast.LENGTH_LONG); 33 | } else { 34 | toast.setText(content); 35 | } 36 | toast.show(); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /app/src/main/java/com/dch/test/util/TransitionUtils.java: -------------------------------------------------------------------------------- 1 | package com.dch.test.util; 2 | 3 | import android.animation.Animator; 4 | import android.annotation.TargetApi; 5 | import android.app.Activity; 6 | import android.support.v4.content.ContextCompat; 7 | import android.view.ViewAnimationUtils; 8 | import android.view.ViewGroup; 9 | import android.view.animation.AccelerateDecelerateInterpolator; 10 | 11 | /** 12 | * 作者:Dch on 2017/4/17 19:30 13 | * 描述: 14 | * 邮箱:daichuanhao@caijinquan.com 15 | */ 16 | public class TransitionUtils { 17 | /** 18 | *创建Reveal动画并执行 19 | * 20 | * @param viewRoot 要执行动画的布局 21 | * @param color 揭露的颜色 22 | * @param cx 揭露点的X坐标 23 | * @param cy 揭露点的Y坐标 24 | * @return 返回创建成功的动画 25 | */ 26 | @TargetApi(21) 27 | private Animator animateRevealColorFromCoordinates(ViewGroup viewRoot, int color, int cx, int cy, Activity activity) { 28 | float finalRadius= (float) Math.hypot(viewRoot.getWidth(),viewRoot.getHeight()); 29 | 30 | Animator anim= ViewAnimationUtils.createCircularReveal(viewRoot,cx,cy,0,finalRadius); 31 | viewRoot.setBackgroundColor(ContextCompat.getColor(activity,color)); 32 | anim.setDuration(1000); 33 | anim.setInterpolator(new AccelerateDecelerateInterpolator()); 34 | anim.start(); 35 | return anim; 36 | } 37 | 38 | } 39 | -------------------------------------------------------------------------------- /app/src/main/java/com/dch/test/util/UIUtils.java: -------------------------------------------------------------------------------- 1 | package com.dch.test.util; 2 | 3 | import android.app.Activity; 4 | import android.content.Context; 5 | import android.graphics.Color; 6 | import android.os.Build; 7 | import android.util.DisplayMetrics; 8 | import android.view.View; 9 | import android.view.Window; 10 | import android.view.WindowManager; 11 | 12 | /** 13 | * 界面工具类 14 | * 15 | * @author dch 16 | */ 17 | public class UIUtils { 18 | /** 19 | * dip转换px 20 | */ 21 | public static int dip2px(int dip, Context cxt) { 22 | final float scale = cxt.getResources().getDisplayMetrics().density; 23 | return (int) (dip * scale + 0.5f); 24 | } 25 | 26 | /** 27 | * pxz转换dip 28 | */ 29 | public static int px2dip(int px, Context cxt) { 30 | final float scale = cxt.getResources().getDisplayMetrics().density; 31 | return (int) (px / scale + 0.5f); 32 | } 33 | 34 | 35 | 36 | /** 37 | * 获取屏幕的宽 38 | */ 39 | public static int getScreenWidth(Activity activity) { 40 | DisplayMetrics dm = new DisplayMetrics(); 41 | activity.getWindow().getWindowManager().getDefaultDisplay().getMetrics(dm); 42 | return dm.widthPixels; 43 | } 44 | 45 | public static void setStatusbarTrans(Activity activity) { 46 | activity.getWindow().requestFeature(Window.FEATURE_NO_TITLE); 47 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 48 | Window window = activity.getWindow(); 49 | window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS 50 | // | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION 51 | ); 52 | window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 53 | // | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 54 | | View.SYSTEM_UI_FLAG_LAYOUT_STABLE); 55 | window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); 56 | window.setStatusBarColor(Color.TRANSPARENT); 57 | // window.setNavigationBarColor(Color.TRANSPARENT); 58 | } 59 | } 60 | 61 | public static void judgeHideTopStatusView(View status) { 62 | if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { 63 | status.setVisibility(View.GONE); 64 | } 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /app/src/main/java/com/dch/test/util/convertfactory/StringConverterFactory.java: -------------------------------------------------------------------------------- 1 | package com.dch.test.util.convertfactory; 2 | 3 | import java.lang.annotation.Annotation; 4 | import java.lang.reflect.Type; 5 | 6 | import okhttp3.RequestBody; 7 | import okhttp3.ResponseBody; 8 | import retrofit2.Converter; 9 | import retrofit2.Retrofit; 10 | 11 | 12 | /** 13 | * 作者:Dch on 2017/4/12 18:10 14 | * 描述: 15 | * 邮箱:daichuanhao@caijinquan.com 16 | */ 17 | public class StringConverterFactory extends Converter.Factory { 18 | public static StringConverterFactory create() { 19 | return new StringConverterFactory(); 20 | } 21 | 22 | private StringConverterFactory() { 23 | 24 | } 25 | 26 | @Override 27 | public Converter responseBodyConverter(Type type, Annotation[] annotations, 28 | Retrofit retrofit) { 29 | return new StringResponseBodyConverter(); 30 | } 31 | 32 | @Override 33 | public Converter requestBodyConverter(Type type, 34 | Annotation[] parameterAnnotations, Annotation[] methodAnnotations, Retrofit retrofit) { 35 | return new StringRequestBodyConverter(); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /app/src/main/java/com/dch/test/util/convertfactory/StringRequestBodyConverter.java: -------------------------------------------------------------------------------- 1 | package com.dch.test.util.convertfactory; 2 | import java.io.IOException; 3 | import java.io.OutputStreamWriter; 4 | import java.io.Writer; 5 | import java.nio.charset.Charset; 6 | 7 | import okhttp3.MediaType; 8 | import okhttp3.RequestBody; 9 | import okio.Buffer; 10 | import retrofit2.Converter; 11 | 12 | /** 13 | * 作者:Dch on 2017/4/12 18:12 14 | * 描述: 15 | * 邮箱:daichuanhao@caijinquan.com 16 | */ 17 | public class StringRequestBodyConverter implements Converter { 18 | private static final MediaType MEDIA_TYPE = MediaType.parse("application/json; charset=UTF-8"); 19 | private static final Charset UTF_8 = Charset.forName("UTF-8"); 20 | 21 | StringRequestBodyConverter() { 22 | } 23 | 24 | @Override public RequestBody convert(String value) throws IOException { 25 | Buffer buffer = new Buffer(); 26 | Writer writer = new OutputStreamWriter(buffer.outputStream(), UTF_8); 27 | writer.write(value); 28 | writer.close(); 29 | return RequestBody.create(MEDIA_TYPE, buffer.readByteString()); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /app/src/main/java/com/dch/test/util/convertfactory/StringResponseBodyConverter.java: -------------------------------------------------------------------------------- 1 | package com.dch.test.util.convertfactory; 2 | 3 | import java.io.IOException; 4 | 5 | import okhttp3.ResponseBody; 6 | import retrofit2.Converter; 7 | 8 | /** 9 | * 作者:Dch on 2017/4/12 18:11 10 | * 描述: 11 | * 邮箱:daichuanhao@caijinquan.com 12 | */ 13 | public class StringResponseBodyConverter implements Converter { 14 | @Override 15 | public String convert(ResponseBody value) throws IOException { 16 | try { 17 | return value.string(); 18 | } finally { 19 | value.close(); 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/src/main/java/com/dch/test/widget/PlaneFloating.java: -------------------------------------------------------------------------------- 1 | package com.dch.test.widget; 2 | 3 | import android.animation.Animator; 4 | import android.animation.AnimatorListenerAdapter; 5 | import android.animation.ObjectAnimator; 6 | import android.animation.ValueAnimator; 7 | import android.graphics.Path; 8 | 9 | import com.ufreedom.floatingview.spring.SimpleReboundListener; 10 | import com.ufreedom.floatingview.spring.SpringHelper; 11 | import com.ufreedom.floatingview.transition.BaseFloatingPathTransition; 12 | import com.ufreedom.floatingview.transition.FloatingPath; 13 | import com.ufreedom.floatingview.transition.PathPosition; 14 | import com.ufreedom.floatingview.transition.YumFloating; 15 | 16 | /** 17 | * 作者:MrCoder on 2017/6/6 11:00 18 | * 描述: 19 | * 邮箱:daichuanhao@caijinquan.com 20 | */ 21 | public class PlaneFloating extends BaseFloatingPathTransition{ 22 | @Override 23 | public FloatingPath getFloatingPath() { 24 | Path path = new Path(); 25 | path.moveTo(0, 0); 26 | // path.cubicTo(-300,-200,-300,-900,0,-1800); 27 | path.quadTo(300, -300, 0, -600); 28 | path.quadTo(0, -600,-300,-900); 29 | path.quadTo(-300, -900,0,-1200); 30 | path.rLineTo(0, -1920 -300); 31 | return FloatingPath.create(path, false); 32 | } 33 | 34 | @Override 35 | public void applyFloating(final YumFloating yumFloating) { 36 | 37 | ValueAnimator translateAnimator = ObjectAnimator.ofFloat(getStartPathPosition(), getEndPathPosition()); 38 | translateAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 39 | @Override 40 | public void onAnimationUpdate(ValueAnimator valueAnimator) { 41 | float value = (float) valueAnimator.getAnimatedValue(); 42 | PathPosition floatingPosition = getFloatingPosition(value); 43 | yumFloating.setTranslationX(floatingPosition.x); 44 | yumFloating.setTranslationY(floatingPosition.y); 45 | 46 | } 47 | }); 48 | translateAnimator.addListener(new AnimatorListenerAdapter() { 49 | @Override 50 | public void onAnimationEnd(Animator animation) { 51 | super.onAnimationEnd(animation); 52 | yumFloating.setTranslationX(0); 53 | yumFloating.setTranslationY(0); 54 | yumFloating.setAlpha(0f); 55 | yumFloating.clear(); 56 | } 57 | }); 58 | 59 | 60 | SpringHelper.createWithBouncinessAndSpeed(0.0f, 1.0f, 14, 15) 61 | .reboundListener(new SimpleReboundListener() { 62 | @Override 63 | public void onReboundUpdate(double currentValue) { 64 | yumFloating.setScaleX((float) currentValue); 65 | yumFloating.setScaleY((float) currentValue); 66 | } 67 | }).start(yumFloating); 68 | 69 | translateAnimator.setDuration(3000); 70 | translateAnimator.start(); 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /app/src/main/java/greendao/gen/DaoSession.java: -------------------------------------------------------------------------------- 1 | package greendao.gen; 2 | 3 | import java.util.Map; 4 | 5 | import org.greenrobot.greendao.AbstractDao; 6 | import org.greenrobot.greendao.AbstractDaoSession; 7 | import org.greenrobot.greendao.database.Database; 8 | import org.greenrobot.greendao.identityscope.IdentityScopeType; 9 | import org.greenrobot.greendao.internal.DaoConfig; 10 | 11 | import com.dch.test.entity.MyFavorite; 12 | 13 | import greendao.gen.MyFavoriteDao; 14 | 15 | // THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. 16 | 17 | /** 18 | * {@inheritDoc} 19 | * 20 | * @see org.greenrobot.greendao.AbstractDaoSession 21 | */ 22 | public class DaoSession extends AbstractDaoSession { 23 | 24 | private final DaoConfig myFavoriteDaoConfig; 25 | 26 | private final MyFavoriteDao myFavoriteDao; 27 | 28 | public DaoSession(Database db, IdentityScopeType type, Map>, DaoConfig> 29 | daoConfigMap) { 30 | super(db); 31 | 32 | myFavoriteDaoConfig = daoConfigMap.get(MyFavoriteDao.class).clone(); 33 | myFavoriteDaoConfig.initIdentityScope(type); 34 | 35 | myFavoriteDao = new MyFavoriteDao(myFavoriteDaoConfig, this); 36 | 37 | registerDao(MyFavorite.class, myFavoriteDao); 38 | } 39 | 40 | public void clear() { 41 | myFavoriteDaoConfig.clearIdentityScope(); 42 | } 43 | 44 | public MyFavoriteDao getMyFavoriteDao() { 45 | return myFavoriteDao; 46 | } 47 | 48 | } 49 | -------------------------------------------------------------------------------- /app/src/main/res/animator/jrtt_path_one.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 28 | 51 | 74 | 97 | 98 | -------------------------------------------------------------------------------- /app/src/main/res/animator/jrtt_path_three.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 24 | 43 | 62 | 81 | 82 | -------------------------------------------------------------------------------- /app/src/main/res/animator/jrtt_path_two.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 24 | 43 | 62 | 81 | 82 | -------------------------------------------------------------------------------- /app/src/main/res/animator/tick_path.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 22 | 38 | 54 | 75 | 96 | 97 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v21/ic_menu_camera.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v21/ic_menu_gallery.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v21/ic_menu_manage.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v21/ic_menu_send.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v21/ic_menu_share.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v21/ic_menu_slideshow.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrDeclanCoder/KotlinMVPRxJava2Dagger2GreenDaoRetrofitDemo/ff71c1be21d82952d8c973e1d066cf1d031a7731/app/src/main/res/drawable-xhdpi/black.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrDeclanCoder/KotlinMVPRxJava2Dagger2GreenDaoRetrofitDemo/ff71c1be21d82952d8c973e1d066cf1d031a7731/app/src/main/res/drawable-xhdpi/delete.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/floating_plane.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrDeclanCoder/KotlinMVPRxJava2Dagger2GreenDaoRetrofitDemo/ff71c1be21d82952d8c973e1d066cf1d031a7731/app/src/main/res/drawable-xhdpi/floating_plane.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/guide1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrDeclanCoder/KotlinMVPRxJava2Dagger2GreenDaoRetrofitDemo/ff71c1be21d82952d8c973e1d066cf1d031a7731/app/src/main/res/drawable-xhdpi/guide1.jpg -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/guide2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrDeclanCoder/KotlinMVPRxJava2Dagger2GreenDaoRetrofitDemo/ff71c1be21d82952d8c973e1d066cf1d031a7731/app/src/main/res/drawable-xhdpi/guide2.jpg -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/guide3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrDeclanCoder/KotlinMVPRxJava2Dagger2GreenDaoRetrofitDemo/ff71c1be21d82952d8c973e1d066cf1d031a7731/app/src/main/res/drawable-xhdpi/guide3.jpg -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/guide4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrDeclanCoder/KotlinMVPRxJava2Dagger2GreenDaoRetrofitDemo/ff71c1be21d82952d8c973e1d066cf1d031a7731/app/src/main/res/drawable-xhdpi/guide4.jpg -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/like.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrDeclanCoder/KotlinMVPRxJava2Dagger2GreenDaoRetrofitDemo/ff71c1be21d82952d8c973e1d066cf1d031a7731/app/src/main/res/drawable-xhdpi/like.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/pic4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrDeclanCoder/KotlinMVPRxJava2Dagger2GreenDaoRetrofitDemo/ff71c1be21d82952d8c973e1d066cf1d031a7731/app/src/main/res/drawable-xhdpi/pic4.jpg -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/star.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrDeclanCoder/KotlinMVPRxJava2Dagger2GreenDaoRetrofitDemo/ff71c1be21d82952d8c973e1d066cf1d031a7731/app/src/main/res/drawable-xhdpi/star.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/timg3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrDeclanCoder/KotlinMVPRxJava2Dagger2GreenDaoRetrofitDemo/ff71c1be21d82952d8c973e1d066cf1d031a7731/app/src/main/res/drawable-xhdpi/timg3.jpg -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrDeclanCoder/KotlinMVPRxJava2Dagger2GreenDaoRetrofitDemo/ff71c1be21d82952d8c973e1d066cf1d031a7731/app/src/main/res/drawable-xhdpi/white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/coner_framelayout_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/divider_recycler.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_info_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_notifications_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_sync_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/jrtt.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 22 | 34 | 46 | 47 | 60 | 61 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/jrtt_vector.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 8 | 9 | 12 | 13 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/select_white.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/selector_green.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/selector_purple.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/selector_red.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/side_nav_bar.xml: -------------------------------------------------------------------------------- 1 | 3 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/tick.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/tick_vector.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/water_progressbar.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 27 | 28 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_custom_left_drawer.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | 14 | 15 | 21 | 22 | 28 | 29 | 32 | 33 | 39 | 40 | 41 | 42 | 43 | 48 | 49 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_game.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_guide.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | 14 | 15 | 29 | 30 | 44 |