├── .gitignore ├── .idea ├── compiler.xml ├── copyright │ └── profiles_settings.xml ├── dictionaries │ └── Administrator.xml ├── encodings.xml ├── gradle.xml ├── misc.xml ├── modules.xml └── runConfigurations.xml ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── jeremy │ │ └── android │ │ └── consumer │ │ └── ApplicationTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── assets │ │ └── fonts │ │ │ ├── Bodoni_MT_Black.ttf │ │ │ └── KaiTi_GB2312.ttf │ ├── java │ │ └── com │ │ │ └── jeremy │ │ │ └── android │ │ │ └── consumer │ │ │ ├── AppComponent.java │ │ │ ├── AppModule.java │ │ │ ├── BasePresenter.java │ │ │ ├── BaseView.java │ │ │ ├── MyApplication.java │ │ │ ├── about │ │ │ ├── AboutActivity.java │ │ │ ├── AboutComponent.java │ │ │ ├── AboutContract.java │ │ │ ├── AboutPresenter.java │ │ │ └── AboutPresenterModule.java │ │ │ ├── adapter │ │ │ ├── BomDialogListAdapter.java │ │ │ ├── BomSelectedListAdapter.java │ │ │ ├── BomSettingsAdapter.java │ │ │ ├── CardsPullToRefreshAdapter.java │ │ │ ├── ConsumeBomsAdapter.java │ │ │ ├── ConsumeRecordsAdapter.java │ │ │ └── RechargeRecordsAdapter.java │ │ │ ├── addCard │ │ │ ├── AddCardActivity.java │ │ │ ├── AddCardComponent.java │ │ │ ├── AddCardPresenter.java │ │ │ ├── AddCardPresenterModule.java │ │ │ └── AddCardsContract.java │ │ │ ├── base │ │ │ ├── BaseActivity.java │ │ │ └── BaseFragment.java │ │ │ ├── cardDetail │ │ │ ├── CardDetailActivity.java │ │ │ ├── CardDetailComponent.java │ │ │ ├── CardDetailContract.java │ │ │ ├── CardDetailPresenter.java │ │ │ ├── CardDetailPresenterModule.java │ │ │ └── tabs │ │ │ │ ├── comsumption │ │ │ │ ├── ConsumeBomListModule.java │ │ │ │ ├── ConsumptionComponent.java │ │ │ │ ├── ConsumptionContract.java │ │ │ │ ├── ConsumptionFragment.java │ │ │ │ ├── ConsumptionPresenter.java │ │ │ │ └── ConsumptionPresenterModule.java │ │ │ │ ├── consumptionRecords │ │ │ │ ├── ConsumptionRecordComponent.java │ │ │ │ ├── ConsumptionRecordContract.java │ │ │ │ ├── ConsumptionRecordFragment.java │ │ │ │ ├── ConsumptionRecordListModule.java │ │ │ │ ├── ConsumptionRecordPresenter.java │ │ │ │ └── ConsumptionRecordPresenterModule.java │ │ │ │ ├── detailInfo │ │ │ │ ├── DetailInfoComponent.java │ │ │ │ ├── DetailInfoContract.java │ │ │ │ ├── DetailInfoFragment.java │ │ │ │ ├── DetailInfoPresenter.java │ │ │ │ └── DetailInfoPresenterModule.java │ │ │ │ ├── recharge │ │ │ │ ├── RechargeComponent.java │ │ │ │ ├── RechargeContract.java │ │ │ │ ├── RechargeFragment.java │ │ │ │ ├── RechargePresenter.java │ │ │ │ └── RechargePresenterModule.java │ │ │ │ └── rechargeRecords │ │ │ │ ├── RechargeRecordComponent.java │ │ │ │ ├── RechargeRecordContract.java │ │ │ │ ├── RechargeRecordFragment.java │ │ │ │ ├── RechargeRecordListModule.java │ │ │ │ ├── RechargeRecordPresenter.java │ │ │ │ └── RechargeRecordPresenterModule.java │ │ │ ├── cards │ │ │ ├── CardItemListModule.java │ │ │ ├── CardsActivity.java │ │ │ ├── CardsComponent.java │ │ │ ├── CardsContract.java │ │ │ ├── CardsPresenter.java │ │ │ └── CardsPresenterModule.java │ │ │ ├── data │ │ │ ├── bean │ │ │ │ ├── CardItem.java │ │ │ │ ├── ConsumeBom.java │ │ │ │ ├── FeedBack.java │ │ │ │ └── VersionConfig.java │ │ │ └── source │ │ │ │ ├── DataRepository.java │ │ │ │ ├── DataRepositoryModule.java │ │ │ │ ├── DataSource.java │ │ │ │ ├── Local.java │ │ │ │ ├── Remote.java │ │ │ │ ├── local │ │ │ │ └── LocalDataSource.java │ │ │ │ └── remote │ │ │ │ ├── RemoteDataSource.java │ │ │ │ └── webApi │ │ │ │ ├── ApiService.java │ │ │ │ ├── ApiServiceModule.java │ │ │ │ ├── BaseResponse.java │ │ │ │ └── WebApiObserver.java │ │ │ ├── rxbus │ │ │ ├── RxBus.java │ │ │ ├── RxBusModule.java │ │ │ └── event │ │ │ │ ├── UpdateCardBalance.java │ │ │ │ └── UpdateCardPoints.java │ │ │ ├── setting │ │ │ ├── BomSetting │ │ │ │ ├── BomSettingActivity.java │ │ │ │ ├── BomSettingComponent.java │ │ │ │ ├── BomSettingContract.java │ │ │ │ ├── BomSettingPresenter.java │ │ │ │ └── BomSettingPresenterModule.java │ │ │ ├── SettingActivity.java │ │ │ ├── SettingComponent.java │ │ │ ├── SettingContract.java │ │ │ ├── SettingPresenter.java │ │ │ └── SettingPresenterModule.java │ │ │ ├── utils │ │ │ ├── BroadcastUtils.java │ │ │ ├── BundleKeys.java │ │ │ ├── DBHelper.java │ │ │ ├── HistoryUtils.java │ │ │ ├── ImeiUtils.java │ │ │ ├── JsonUtil.java │ │ │ ├── MD5Utils.java │ │ │ ├── NetworkUtils.java │ │ │ ├── OkHttpClientManager.java │ │ │ ├── PerActivityScoped.java │ │ │ ├── PerAppScoped.java │ │ │ ├── PerFragmentScoped.java │ │ │ ├── PreferencesUtils.java │ │ │ ├── RequestCode.java │ │ │ ├── SmsUtils.java │ │ │ ├── TimeUtils.java │ │ │ ├── Utility.java │ │ │ └── VersionUtils.java │ │ │ ├── view │ │ │ ├── AddAndSubView.java │ │ │ ├── CardItemView.java │ │ │ ├── DividerItemDecoration.java │ │ │ ├── FullyLinearLayoutManager.java │ │ │ ├── MoneyTextWatcher.java │ │ │ └── XEditText.java │ │ │ └── welcome │ │ │ └── WelcomeActivity.java │ └── res │ │ ├── anim │ │ ├── activity_slide_in_left.xml │ │ ├── activity_slide_in_right.xml │ │ ├── activity_slide_out_left.xml │ │ ├── activity_slide_out_right.xml │ │ ├── popmenu_hide.xml │ │ └── popmenu_show.xml │ │ ├── drawable-hdpi │ │ ├── ic_about_black.png │ │ ├── ic_menu_white.png │ │ ├── ic_search_white.png │ │ ├── ic_setting_black.png │ │ └── ic_share_white.png │ │ ├── drawable-mdpi │ │ ├── ic_about_black.png │ │ ├── ic_menu_white.png │ │ ├── ic_search_white.png │ │ ├── ic_setting_black.png │ │ └── ic_share_white.png │ │ ├── drawable-xhdpi │ │ ├── app_logo.png │ │ ├── ic_about_black.png │ │ ├── ic_add_black.png │ │ ├── ic_add_white.png │ │ ├── ic_back.png │ │ ├── ic_card_white.png │ │ ├── ic_clear_black.png │ │ ├── ic_cloud_download_white.png │ │ ├── ic_cloud_upload_white.png │ │ ├── ic_delete_white.png │ │ ├── ic_delete_white2.png │ │ ├── ic_edit_white.png │ │ ├── ic_expired_white.png │ │ ├── ic_eyes_white.png │ │ ├── ic_help_black.png │ │ ├── ic_home_white.png │ │ ├── ic_menu_white.png │ │ ├── ic_more_white.png │ │ ├── ic_phone_white.png │ │ ├── ic_save_white.png │ │ ├── ic_search.png │ │ ├── ic_search_white.png │ │ ├── ic_setting_black.png │ │ ├── ic_share_white.png │ │ ├── ic_sub_black.png │ │ ├── ic_tab_main_clicked.png │ │ └── ic_user_white.png │ │ ├── drawable-xxhdpi │ │ ├── ic_about_black.png │ │ ├── ic_menu_white.png │ │ ├── ic_search_white.png │ │ ├── ic_setting_black.png │ │ └── ic_share_white.png │ │ ├── drawable │ │ ├── cursor_blue.xml │ │ ├── cursor_white.xml │ │ ├── dark_bg_selector.xml │ │ ├── delete_btn_selector.xml │ │ ├── selector_btn_green_round.xml │ │ ├── selector_light_blue_bg.xml │ │ ├── selector_light_gray_bg.xml │ │ ├── selector_radio_btn.xml │ │ ├── selector_white_bg.xml │ │ ├── shape_border.xml │ │ ├── tab_bg_selector.xml │ │ ├── tab_white_stoke_bg.xml │ │ ├── transparent_bg_selector.xml │ │ ├── transparent_border_bg_selector.xml │ │ ├── transparent_full_round_bg.xml │ │ ├── white_full_round_bg.xml │ │ └── white_stoke_bg.xml │ │ ├── layout │ │ ├── activity_about.xml │ │ ├── activity_add.xml │ │ ├── activity_bom_setting.xml │ │ ├── activity_card_detail.xml │ │ ├── activity_main.xml │ │ ├── activity_setting.xml │ │ ├── activity_welcome.xml │ │ ├── dialog_bom_add.xml │ │ ├── dialog_bom_list.xml │ │ ├── dialog_record_consume_detail.xml │ │ ├── dialog_record_recharge_detail.xml │ │ ├── fragment_consumption.xml │ │ ├── fragment_consumption_record.xml │ │ ├── fragment_detail_info.xml │ │ ├── fragment_recharge.xml │ │ ├── fragment_recharge_record.xml │ │ ├── item_bom_add.xml │ │ ├── item_bom_consume.xml │ │ ├── item_bom_dialog.xml │ │ ├── item_bom_selected.xml │ │ ├── item_bom_setting.xml │ │ ├── item_card_add.xml │ │ ├── item_consumption_record.xml │ │ ├── item_layout_carditemview.xml │ │ ├── item_recharge_record.xml │ │ ├── view_add_sub.xml │ │ └── view_item_card.xml │ │ ├── menu │ │ ├── menu.xml │ │ ├── save.xml │ │ └── share.xml │ │ ├── mipmap-hdpi │ │ └── ic_launcher.png │ │ ├── mipmap-mdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxxhdpi │ │ └── ic_launcher.png │ │ ├── values-w820dp │ │ └── dimens.xml │ │ └── values │ │ ├── attrs.xml │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── ids.xml │ │ ├── strings.xml │ │ ├── styles.xml │ │ └── urls.xml │ └── test │ └── java │ └── com │ └── jeremy │ └── android │ └── consumer │ └── ExampleUnitTest.java ├── build.gradle ├── database ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── jeremy │ │ └── android │ │ └── database │ │ └── ApplicationTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── jeremy │ │ │ └── android │ │ │ └── database │ │ │ ├── AppDatabase.java │ │ │ └── model │ │ │ ├── Bom.java │ │ │ ├── Card.java │ │ │ ├── Consumption.java │ │ │ └── Recharge.java │ └── res │ │ └── values │ │ └── strings.xml │ └── test │ └── java │ └── com │ └── jeremy │ └── android │ └── database │ └── ExampleUnitTest.java ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── projectFilesBackup └── .idea │ └── workspace.xml ├── screenshot └── consumer.gif ├── settings.gradle └── signature ├── keystore.jks └── password.txt /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/workspace.xml 5 | /.idea/libraries 6 | .DS_Store 7 | /build 8 | /captures 9 | -------------------------------------------------------------------------------- /.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/dictionaries/Administrator.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 18 | 19 | -------------------------------------------------------------------------------- /.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 | 47 | 48 | 49 | 50 | 51 | 56 | 57 | 58 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Consumer 2 | 结合MVP+RxJava2+RxBus2+Retrofit2+Dragger2+Butterkinfe+DBFlow搭配使用,带有仓库模块。
3 | 4 | 示例: 5 | --- 6 | ![](https://raw.githubusercontent.com/JeremyLam1/Consumer/master/screenshot/consumer.gif) 7 | 8 | Todo: 9 | --- 10 | 1.适配6.0手机系统权限。
11 | 2.该demo现仅能单机使用,之后配合与服务端通信。 12 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | apply plugin: 'me.tatarka.retrolambda' 3 | 4 | android { 5 | compileSdkVersion rootProject.ext.compileSdkVersion 6 | buildToolsVersion rootProject.ext.buildToolsVersion 7 | 8 | defaultConfig { 9 | applicationId "com.jeremy.android.consumer" 10 | minSdkVersion rootProject.ext.minSdkVersion 11 | targetSdkVersion rootProject.ext.targetSdkVersion 12 | versionCode 1 13 | versionName "1.0.0" 14 | 15 | javaCompileOptions { 16 | annotationProcessorOptions { 17 | arguments = [eventBusIndex: 'org.greenrobot.eventbusperf.MyEventBusIndex'] 18 | } 19 | } 20 | } 21 | 22 | compileOptions { 23 | sourceCompatibility JavaVersion.VERSION_1_8 24 | targetCompatibility JavaVersion.VERSION_1_8 25 | } 26 | 27 | buildTypes { 28 | release { 29 | minifyEnabled false 30 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 31 | } 32 | } 33 | 34 | lintOptions { 35 | checkReleaseBuilds false 36 | abortOnError false 37 | ignoreWarnings true 38 | } 39 | 40 | packagingOptions { 41 | exclude 'META-INF/rxjava.properties' 42 | exclude 'project.properties' 43 | exclude 'META-INF/LICENSE.txt' 44 | exclude 'META-INF/LICENSE' 45 | exclude 'META-INF/NOTICE.txt' 46 | exclude 'META-INF/NOTICE' 47 | exclude 'META-INF/DEPENDENCIES.txt' 48 | exclude 'META-INF/DEPENDENCIES' 49 | } 50 | } 51 | 52 | dependencies { 53 | compile fileTree(include: ['*.jar'], dir: 'libs') 54 | compile project(':database') 55 | testCompile 'junit:junit:4.12' 56 | compile "com.android.support:design:$rootProject.supportLibraryVersion" 57 | compile "com.android.support:appcompat-v7:$rootProject.supportLibraryVersion" 58 | compile "com.android.support:support-v4:$rootProject.supportLibraryVersion" 59 | compile "com.android.support:recyclerview-v7:$rootProject.supportLibraryVersion" 60 | compile "com.android.support:cardview-v7:$rootProject.supportLibraryVersion" 61 | 62 | compile 'com.github.dmytrodanylyk.circular-progress-button:library:1.1.3' 63 | compile 'uk.co.chrisjenx:calligraphy:2.2.0' 64 | 65 | compile 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.8.0' 66 | 67 | compile 'com.kyleduo.switchbutton:library:1.4.0' 68 | compile 'com.github.bumptech.glide:glide:3.6.1' 69 | compile 'com.google.code.gson:gson:2.6.2' 70 | compile 'org.zeroturnaround:zt-zip:1.9' 71 | //okhttp3 72 | compile 'com.squareup.okhttp3:okhttp:3.5.0' 73 | //retrofit 74 | compile 'com.squareup.retrofit2:retrofit:2.2.0' 75 | compile 'com.squareup.retrofit2:adapter-rxjava2:2.2.0' 76 | compile 'com.squareup.retrofit2:converter-gson:2.2.0' 77 | //butterknife 78 | compile 'com.jakewharton:butterknife:8.5.1' 79 | annotationProcessor 'com.jakewharton:butterknife-compiler:8.5.1' 80 | //javapoet 81 | compile 'com.squareup:javapoet:1.8.0' 82 | //rxJava2 83 | compile 'io.reactivex.rxjava2:rxandroid:2.0.1' 84 | compile 'io.reactivex.rxjava2:rxjava:2.0.4' 85 | //rxlifecycle2 86 | compile 'com.trello.rxlifecycle2:rxlifecycle:2.0.1' 87 | compile 'com.trello.rxlifecycle2:rxlifecycle-android:2.0.1' 88 | compile 'com.trello.rxlifecycle2:rxlifecycle-components:2.0.1' 89 | //rxpermissions2 90 | compile 'com.tbruyelle.rxpermissions2:rxpermissions:0.9.1@aar' 91 | //rxbroadcast 92 | compile 'com.cantrowitz:rxbroadcast:2.0.0' 93 | //dagger2 94 | compile 'com.google.dagger:dagger:2.9' 95 | annotationProcessor 'com.google.dagger:dagger-compiler:2.9' 96 | } 97 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | -keep class * extends com.raizlabs.android.dbflow.config.DatabaseHolder { 2 | *; 3 | } 4 | 5 | -keep class com.chad.library.adapter.** { 6 | *; 7 | } 8 | -------------------------------------------------------------------------------- /app/src/androidTest/java/com/jeremy/android/consumer/ApplicationTest.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer; 2 | 3 | import android.app.Application; 4 | import android.test.ApplicationTestCase; 5 | 6 | /** 7 | * Testing Fundamentals 8 | */ 9 | public class ApplicationTest extends ApplicationTestCase { 10 | public ApplicationTest() { 11 | super(Application.class); 12 | } 13 | } -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 32 | 33 | 36 | 37 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 49 | 52 | 55 | 58 | 61 | 64 | 67 | 68 | 69 | -------------------------------------------------------------------------------- /app/src/main/assets/fonts/Bodoni_MT_Black.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeremyLam1/Consumer/6b02721a15b550709bc06a79955a9da723a70443/app/src/main/assets/fonts/Bodoni_MT_Black.ttf -------------------------------------------------------------------------------- /app/src/main/assets/fonts/KaiTi_GB2312.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeremyLam1/Consumer/6b02721a15b550709bc06a79955a9da723a70443/app/src/main/assets/fonts/KaiTi_GB2312.ttf -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/AppComponent.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer; 2 | 3 | import com.jeremy.android.consumer.data.source.DataRepository; 4 | import com.jeremy.android.consumer.data.source.DataRepositoryModule; 5 | import com.jeremy.android.consumer.data.source.remote.webApi.ApiService; 6 | import com.jeremy.android.consumer.data.source.remote.webApi.ApiServiceModule; 7 | import com.jeremy.android.consumer.rxbus.RxBusModule; 8 | import com.jeremy.android.consumer.rxbus.RxBus; 9 | 10 | import javax.inject.Singleton; 11 | 12 | import dagger.Component; 13 | 14 | /** 15 | * Created by Jeremy on 2017/1/23. 16 | */ 17 | @Singleton 18 | @Component(modules = {AppModule.class, ApiServiceModule.class, DataRepositoryModule.class, RxBusModule.class}) 19 | public interface AppComponent { 20 | 21 | RxBus getRxBus(); 22 | 23 | ApiService getApiService(); 24 | 25 | DataRepository getCardsRepository(); 26 | 27 | } 28 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/AppModule.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer; 2 | 3 | import android.app.Application; 4 | 5 | import dagger.Module; 6 | import dagger.Provides; 7 | 8 | /** 9 | * Created by Jeremy on 2017/2/28. 10 | */ 11 | 12 | @Module 13 | public class AppModule { 14 | 15 | private final Application application; 16 | 17 | AppModule(Application application) { 18 | this.application = application; 19 | } 20 | 21 | @Provides 22 | Application providesApplication() { 23 | return this.application; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/BasePresenter.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer; 2 | 3 | public interface BasePresenter { 4 | 5 | void subscribe(); 6 | 7 | void unsubscribe(); 8 | 9 | } 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/BaseView.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer; 2 | 3 | import com.trello.rxlifecycle2.LifecycleTransformer; 4 | 5 | public interface BaseView { 6 | 7 | void setPresenter(T presenter); 8 | 9 | LifecycleTransformer getBindToLifecycle(); 10 | 11 | } 12 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/MyApplication.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer; 2 | 3 | import android.app.Application; 4 | import android.content.pm.PackageInfo; 5 | import android.content.pm.PackageManager; 6 | 7 | import com.jeremy.android.consumer.data.source.DataRepositoryModule; 8 | import com.raizlabs.android.dbflow.config.FlowManager; 9 | 10 | /** 11 | * Created by Jeremy on 2016/3/28. 12 | */ 13 | public class MyApplication extends Application { 14 | 15 | private AppComponent appComponent; 16 | 17 | private static MyApplication _instance; 18 | 19 | private int currAppVersion = -1; 20 | 21 | @Override 22 | public void onCreate() { 23 | super.onCreate(); 24 | 25 | _instance = (MyApplication) getApplicationContext(); 26 | 27 | FlowManager.init(this); 28 | 29 | initCurrAppVersion(); 30 | 31 | appComponent = DaggerAppComponent.builder() 32 | .dataRepositoryModule(new DataRepositoryModule()) 33 | .appModule(new AppModule(this)) 34 | .build(); 35 | } 36 | 37 | private void initCurrAppVersion() { 38 | PackageManager packageManager = getPackageManager(); 39 | PackageInfo packInfo; 40 | try { 41 | packInfo = packageManager.getPackageInfo( 42 | getPackageName(), 0); 43 | currAppVersion = packInfo.versionCode; 44 | } catch (PackageManager.NameNotFoundException ignored) { 45 | } 46 | } 47 | 48 | public static MyApplication get() { 49 | return _instance; 50 | } 51 | 52 | public AppComponent getAppComponent() { 53 | return appComponent; 54 | } 55 | 56 | public int getCurrAppVersion() { 57 | return currAppVersion; 58 | } 59 | 60 | public void setCurrAppVersion(int currAppVersion) { 61 | this.currAppVersion = currAppVersion; 62 | } 63 | 64 | } 65 | 66 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/about/AboutComponent.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.about; 2 | 3 | import com.jeremy.android.consumer.AppComponent; 4 | import com.jeremy.android.consumer.utils.PerActivityScoped; 5 | 6 | import dagger.Component; 7 | 8 | /** 9 | * Created by Jeremy on 2017/2/24. 10 | */ 11 | @PerActivityScoped 12 | @Component(dependencies = AppComponent.class, modules = AboutPresenterModule.class) 13 | public interface AboutComponent { 14 | 15 | void inject(AboutActivity activity); 16 | 17 | } 18 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/about/AboutContract.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.about; 2 | 3 | import android.content.Context; 4 | 5 | import com.jeremy.android.consumer.BasePresenter; 6 | import com.jeremy.android.consumer.BaseView; 7 | import com.jeremy.android.consumer.data.bean.VersionConfig; 8 | 9 | /** 10 | * Created by Jeremy on 2017/2/24. 11 | */ 12 | 13 | public class AboutContract { 14 | 15 | interface View extends BaseView { 16 | 17 | void showCheckingVersion(); 18 | 19 | void showHasNewVersion(VersionConfig config); 20 | 21 | void showCurrVersionIsNew(); 22 | 23 | void showSharePage(); 24 | 25 | void showDialPage(); 26 | 27 | void showBrowse(); 28 | 29 | int getSentButtonProgress(); 30 | 31 | void showSentButtonSuccess(); 32 | 33 | void showSentButtonError(); 34 | 35 | void showSentButtonLoading(); 36 | 37 | void showSentButtonNormal(); 38 | 39 | void showPageMsg(String txt); 40 | 41 | void cleanInputData(); 42 | } 43 | 44 | interface Presenter extends BasePresenter { 45 | 46 | void checkVersionUpdate(Context context); 47 | 48 | void share(); 49 | 50 | void contactUs(); 51 | 52 | void visitCompanyWebsite(); 53 | 54 | void sendFeedBack(String content, String contact); 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/about/AboutPresenterModule.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.about; 2 | 3 | import dagger.Module; 4 | import dagger.Provides; 5 | 6 | /** 7 | * Created by Jeremy on 2017/2/24. 8 | */ 9 | 10 | @Module 11 | public class AboutPresenterModule { 12 | 13 | private final AboutContract.View view; 14 | 15 | public AboutPresenterModule(AboutContract.View view) { 16 | this.view = view; 17 | } 18 | 19 | @Provides 20 | public AboutContract.View ProvidesAboutContractView() { 21 | return this.view; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/adapter/BomDialogListAdapter.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.adapter; 2 | 3 | import android.support.v7.widget.RecyclerView; 4 | import android.view.LayoutInflater; 5 | import android.view.View; 6 | import android.view.ViewGroup; 7 | import android.widget.CheckBox; 8 | import android.widget.TextView; 9 | 10 | import com.jeremy.android.consumer.R; 11 | import com.jeremy.android.database.model.Bom; 12 | 13 | import java.util.ArrayList; 14 | import java.util.List; 15 | 16 | import butterknife.BindView; 17 | import butterknife.ButterKnife; 18 | 19 | /** 20 | * Created by Jeremy on 2016/04/05. 21 | */ 22 | public class BomDialogListAdapter extends RecyclerView.Adapter { 23 | 24 | private List items; 25 | 26 | private List checks; 27 | 28 | private Bom getValueAt(int position) { 29 | return items.get(position); 30 | } 31 | 32 | public BomDialogListAdapter(List items) { 33 | this.items = items; 34 | checks = new ArrayList<>(); 35 | for (int i = 0; i < items.size(); i++) { 36 | checks.add(false); 37 | } 38 | } 39 | 40 | public List getChecks() { 41 | return this.checks; 42 | } 43 | 44 | @Override 45 | public BomDialogListAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 46 | View view = LayoutInflater.from(parent.getContext()) 47 | .inflate(R.layout.item_bom_dialog, parent, false); 48 | return new ViewHolder(view); 49 | } 50 | 51 | 52 | @Override 53 | public void onBindViewHolder(final BomDialogListAdapter.ViewHolder holder, final int position) { 54 | 55 | final Bom item = getValueAt(position); 56 | holder.cb_select.setChecked(checks.get(position)); 57 | holder.tvBomName.setText(item.name); 58 | holder.tvUnitPrice.setText(item.price + ""); 59 | holder.tvUnit.setText(item.unit); 60 | 61 | if (position % 2 == 0) { 62 | holder.convertView.setBackgroundResource(R.drawable.dark_bg_selector); 63 | } else { 64 | holder.convertView.setBackgroundResource(R.drawable.selector_light_gray_bg); 65 | } 66 | 67 | holder.cb_select.setOnCheckedChangeListener((buttonView, isChecked) -> checks.set(position, isChecked)); 68 | 69 | } 70 | 71 | @Override 72 | public int getItemCount() { 73 | return items.size(); 74 | } 75 | 76 | public static class ViewHolder extends RecyclerView.ViewHolder { 77 | @BindView(R.id.layout) 78 | public View convertView; 79 | @BindView(R.id.cb_select) 80 | public CheckBox cb_select; 81 | @BindView(R.id.tv_bom_name) 82 | public TextView tvBomName; 83 | @BindView(R.id.tv_unit_price) 84 | public TextView tvUnitPrice; 85 | @BindView(R.id.tv_unit) 86 | public TextView tvUnit; 87 | 88 | public ViewHolder(View convertView) { 89 | super(convertView); 90 | ButterKnife.bind(this, convertView); 91 | } 92 | } 93 | } -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/adapter/BomSelectedListAdapter.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.adapter; 2 | 3 | import android.support.v7.widget.RecyclerView; 4 | import android.view.LayoutInflater; 5 | import android.view.View; 6 | import android.view.ViewGroup; 7 | import android.widget.TextView; 8 | 9 | import com.jeremy.android.consumer.R; 10 | import com.jeremy.android.database.model.Bom; 11 | 12 | import java.util.List; 13 | 14 | import butterknife.BindView; 15 | import butterknife.ButterKnife; 16 | 17 | /** 18 | * Created by Jeremy on 2016/04/05. 19 | */ 20 | public class BomSelectedListAdapter extends RecyclerView.Adapter { 21 | 22 | private List items; 23 | 24 | private Bom getValueAt(int position) { 25 | return items.get(position); 26 | } 27 | 28 | public BomSelectedListAdapter(List items) { 29 | this.items = items; 30 | } 31 | 32 | @Override 33 | public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 34 | View view = LayoutInflater.from(parent.getContext()) 35 | .inflate(R.layout.item_bom_selected, parent, false); 36 | return new ViewHolder(view); 37 | } 38 | 39 | @Override 40 | public void onBindViewHolder(final ViewHolder holder, final int position) { 41 | final Bom item = getValueAt(position); 42 | 43 | holder.tvBomName.setText(item.name); 44 | holder.tvUnitPrice.setText(item.price + ""); 45 | holder.tvUnit.setText(item.unit); 46 | 47 | if (position % 2 == 0) { 48 | holder.convertView.setBackgroundResource(R.drawable.dark_bg_selector); 49 | } else { 50 | holder.convertView.setBackgroundResource(R.drawable.selector_light_gray_bg); 51 | } 52 | } 53 | 54 | @Override 55 | public int getItemCount() { 56 | return items.size(); 57 | } 58 | 59 | public static class ViewHolder extends RecyclerView.ViewHolder { 60 | @BindView(R.id.layout) 61 | public View convertView; 62 | @BindView(R.id.tv_bom_name) 63 | public TextView tvBomName; 64 | @BindView(R.id.tv_unit_price) 65 | public TextView tvUnitPrice; 66 | @BindView(R.id.tv_unit) 67 | public TextView tvUnit; 68 | 69 | public ViewHolder(View convertView) { 70 | super(convertView); 71 | ButterKnife.bind(this, convertView); 72 | } 73 | } 74 | } -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/adapter/BomSettingsAdapter.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.adapter; 2 | 3 | import com.chad.library.adapter.base.BaseQuickAdapter; 4 | import com.chad.library.adapter.base.BaseViewHolder; 5 | import com.jeremy.android.consumer.R; 6 | import com.jeremy.android.database.model.Bom; 7 | 8 | import java.util.List; 9 | 10 | import javax.inject.Inject; 11 | 12 | /** 13 | * Created by Jeremy on 2017/2/17. 14 | */ 15 | 16 | public class BomSettingsAdapter extends BaseQuickAdapter { 17 | 18 | @Inject 19 | BomSettingsAdapter(List data) { 20 | super(R.layout.item_bom_setting, data); 21 | } 22 | 23 | @Override 24 | protected void convert(BaseViewHolder helper, Bom item) { 25 | helper.setChecked(R.id.cb_select, item.selected == 1); 26 | 27 | helper.setText(R.id.tv_bom_name, item.name); 28 | helper.setText(R.id.tv_unit_price, item.price + ""); 29 | helper.setText(R.id.tv_unit, item.unit); 30 | 31 | helper.addOnClickListener(R.id.cb_select); 32 | helper.addOnClickListener(R.id.img_delete); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/adapter/CardsPullToRefreshAdapter.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.adapter; 2 | 3 | import com.chad.library.adapter.base.BaseMultiItemQuickAdapter; 4 | import com.chad.library.adapter.base.BaseViewHolder; 5 | import com.jeremy.android.consumer.R; 6 | import com.jeremy.android.consumer.data.bean.CardItem; 7 | import com.jeremy.android.consumer.view.CardItemView; 8 | 9 | import java.util.List; 10 | 11 | import javax.inject.Inject; 12 | 13 | /** 14 | * Created by Jeremy on 2017/2/7. 15 | */ 16 | 17 | public class CardsPullToRefreshAdapter extends BaseMultiItemQuickAdapter { 18 | 19 | 20 | @Inject 21 | CardsPullToRefreshAdapter(List data) { 22 | super(data); 23 | addItemType(CardItem.ADD, R.layout.item_card_add); 24 | addItemType(CardItem.ITEM, R.layout.item_layout_carditemview); 25 | } 26 | 27 | @Override 28 | protected void convert(BaseViewHolder helper, CardItem item) { 29 | switch (helper.getItemViewType()) { 30 | case CardItem.ADD: 31 | break; 32 | case CardItem.ITEM: 33 | helper.addOnClickListener(R.id.img_delete); 34 | CardItemView itemView = (CardItemView) helper.getConvertView(); 35 | itemView.setCardInfo(item); 36 | break; 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/adapter/ConsumeRecordsAdapter.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.adapter; 2 | 3 | import com.chad.library.adapter.base.BaseQuickAdapter; 4 | import com.chad.library.adapter.base.BaseViewHolder; 5 | import com.jeremy.android.consumer.R; 6 | import com.jeremy.android.consumer.utils.TimeUtils; 7 | import com.jeremy.android.database.model.Consumption; 8 | 9 | import java.util.List; 10 | 11 | import javax.inject.Inject; 12 | 13 | /** 14 | * Created by Jeremy on 2016/04/05. 15 | */ 16 | public class ConsumeRecordsAdapter extends BaseQuickAdapter { 17 | 18 | @Inject 19 | ConsumeRecordsAdapter(List data) { 20 | super(R.layout.item_consumption_record, data); 21 | } 22 | 23 | @Override 24 | protected void convert(BaseViewHolder helper, Consumption item) { 25 | helper.setText(R.id.tv_time, TimeUtils.getFormatByTimeStamp(item.payTime)); 26 | helper.setText(R.id.tv_per_price, String.valueOf(item.payMoney)); 27 | helper.setText(R.id.tv_bom_name, item.bomName); 28 | } 29 | } -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/adapter/RechargeRecordsAdapter.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.adapter; 2 | 3 | import com.chad.library.adapter.base.BaseQuickAdapter; 4 | import com.chad.library.adapter.base.BaseViewHolder; 5 | import com.jeremy.android.consumer.R; 6 | import com.jeremy.android.consumer.utils.TimeUtils; 7 | import com.jeremy.android.database.model.Recharge; 8 | 9 | import java.util.List; 10 | 11 | import javax.inject.Inject; 12 | 13 | /** 14 | * Created by Jeremy on 2016/04/05. 15 | */ 16 | public class RechargeRecordsAdapter extends BaseQuickAdapter { 17 | 18 | @Inject 19 | RechargeRecordsAdapter(List data) { 20 | super(R.layout.item_recharge_record, data); 21 | } 22 | 23 | @Override 24 | protected void convert(BaseViewHolder helper, Recharge item) { 25 | helper.setText(R.id.tv_time, TimeUtils.getFormatByTimeStamp(item.chargeTime)); 26 | helper.setText(R.id.tv_per_price, String.valueOf(item.chargeMoney)); 27 | helper.setText(R.id.tv_memo, item.memo); 28 | } 29 | } -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/addCard/AddCardComponent.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.addCard; 2 | 3 | import com.jeremy.android.consumer.AppComponent; 4 | import com.jeremy.android.consumer.utils.PerActivityScoped; 5 | 6 | import dagger.Component; 7 | 8 | /** 9 | * Created by Jeremy on 2017/2/7. 10 | */ 11 | @PerActivityScoped 12 | @Component(dependencies = AppComponent.class, modules = AddCardPresenterModule.class) 13 | public interface AddCardComponent { 14 | 15 | void inject(AddCardActivity activity); 16 | 17 | } 18 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/addCard/AddCardPresenterModule.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.addCard; 2 | 3 | import dagger.Module; 4 | import dagger.Provides; 5 | 6 | /** 7 | * Created by Jeremy on 2017/2/7. 8 | */ 9 | 10 | @Module 11 | public class AddCardPresenterModule { 12 | 13 | private final AddCardsContract.View view; 14 | 15 | public AddCardPresenterModule(AddCardsContract.View view) { 16 | this.view = view; 17 | } 18 | 19 | @Provides 20 | public AddCardsContract.View providesAddCardsContractView() { 21 | return this.view; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/addCard/AddCardsContract.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.addCard; 2 | 3 | 4 | import com.jeremy.android.consumer.BasePresenter; 5 | import com.jeremy.android.consumer.BaseView; 6 | import com.jeremy.android.consumer.data.bean.CardItem; 7 | import com.jeremy.android.database.model.Card; 8 | import com.jeremy.android.database.model.Recharge; 9 | 10 | /** 11 | * Created by Jeremy on 2017/2/7. 12 | */ 13 | 14 | public class AddCardsContract { 15 | 16 | interface View extends BaseView { 17 | 18 | void showCardNoAfterAutoSet(String cardNo); 19 | 20 | void showSaveCardMsg(String msg); 21 | 22 | void showExpiredTimeUpdated(String expiredTime); 23 | 24 | void initDpDialog(int year, int month, int dayOfMonth); 25 | 26 | void showCardList(CardItem newCardItem); 27 | 28 | } 29 | 30 | interface Presenter extends BasePresenter { 31 | 32 | void autoSetCardNo(); 33 | 34 | void updateExpiredTime(int year, int monthOfYear, int dayOfMonth); 35 | 36 | void saveCard(String userName, String cardNo, String userPhone, String userAddr, String memo, String price); 37 | 38 | void sendSmsMsg(Card card, Recharge recharge); 39 | 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/base/BaseActivity.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.base; 2 | 3 | import android.content.Context; 4 | import android.support.design.widget.Snackbar; 5 | import android.os.Bundle; 6 | 7 | import com.trello.rxlifecycle2.components.support.RxAppCompatActivity; 8 | 9 | import uk.co.chrisjenx.calligraphy.CalligraphyContextWrapper; 10 | 11 | public class BaseActivity extends RxAppCompatActivity { 12 | 13 | @Override 14 | protected void onCreate(Bundle savedInstanceState) { 15 | super.onCreate(savedInstanceState); 16 | } 17 | 18 | protected void showMsg(String text) { 19 | Snackbar.make(getWindow().getDecorView(), text, Snackbar.LENGTH_SHORT).show(); 20 | } 21 | 22 | protected void showMsg(int resId) { 23 | Snackbar.make(getWindow().getDecorView(), resId, Snackbar.LENGTH_SHORT).show(); 24 | } 25 | 26 | @Override 27 | protected void attachBaseContext(Context newBase) { 28 | super.attachBaseContext(CalligraphyContextWrapper.wrap(newBase)); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/base/BaseFragment.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.base; 2 | 3 | 4 | import android.support.design.widget.Snackbar; 5 | import android.support.v4.app.Fragment; 6 | 7 | /** 8 | * A simple {@link Fragment} subclass. 9 | */ 10 | public class BaseFragment extends Fragment { 11 | 12 | 13 | public BaseFragment() { 14 | // Required empty public constructor 15 | } 16 | 17 | protected void showMsg(String text) { 18 | Snackbar.make(getView(), text, Snackbar.LENGTH_SHORT).show(); 19 | } 20 | 21 | protected void showMsg(int resId) { 22 | Snackbar.make(getView(), resId, Snackbar.LENGTH_SHORT).show(); 23 | } 24 | 25 | 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/cardDetail/CardDetailComponent.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.cardDetail; 2 | 3 | import com.jeremy.android.consumer.AppComponent; 4 | import com.jeremy.android.consumer.utils.PerActivityScoped; 5 | 6 | import dagger.Component; 7 | 8 | /** 9 | * Created by Jeremy on 2017/3/7. 10 | */ 11 | @PerActivityScoped 12 | @Component(dependencies = AppComponent.class, modules = CardDetailPresenterModule.class) 13 | public interface CardDetailComponent { 14 | 15 | void inject(CardDetailActivity activity); 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/cardDetail/CardDetailContract.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.cardDetail; 2 | 3 | import com.jeremy.android.consumer.BasePresenter; 4 | import com.jeremy.android.consumer.BaseView; 5 | import com.jeremy.android.database.model.Card; 6 | 7 | /** 8 | * Created by Jeremy on 2017/3/7. 9 | */ 10 | 11 | public class CardDetailContract { 12 | 13 | interface View extends BaseView { 14 | 15 | void setTitle(String title); 16 | 17 | void initViewPage(Card card); 18 | 19 | void showPageMsg(String msg); 20 | 21 | void showCardListPage(); 22 | } 23 | 24 | interface Presenter extends BasePresenter { 25 | 26 | void saveDetailInfo(); 27 | } 28 | 29 | } 30 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/cardDetail/CardDetailPresenter.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.cardDetail; 2 | 3 | import android.support.annotation.Nullable; 4 | 5 | import com.jeremy.android.consumer.data.source.DataRepository; 6 | 7 | import javax.inject.Inject; 8 | 9 | import io.reactivex.android.schedulers.AndroidSchedulers; 10 | import io.reactivex.schedulers.Schedulers; 11 | 12 | /** 13 | * Created by Jeremy on 2017/3/7. 14 | */ 15 | 16 | public class CardDetailPresenter implements CardDetailContract.Presenter { 17 | 18 | private DataRepository mDataRepository; 19 | 20 | private CardDetailContract.View mView; 21 | 22 | @Nullable 23 | private long mCardId; 24 | 25 | @Inject 26 | CardDetailPresenter(@Nullable long cardId, DataRepository dataRepository, CardDetailContract.View view) { 27 | this.mCardId = cardId; 28 | this.mDataRepository = dataRepository; 29 | this.mView = view; 30 | view.setPresenter(this); 31 | } 32 | 33 | @Override 34 | public void subscribe() { 35 | loadCard(); 36 | } 37 | 38 | private void loadCard() { 39 | mDataRepository.getCard(mCardId) 40 | .compose(mView.getBindToLifecycle()) 41 | .subscribeOn(Schedulers.computation()) 42 | .observeOn(AndroidSchedulers.mainThread()) 43 | .subscribe(card -> { 44 | mView.setTitle(card.cardNo); 45 | mView.initViewPage(card); 46 | } 47 | , throwable -> mView.showPageMsg(throwable.getMessage()) 48 | ); 49 | } 50 | 51 | @Override 52 | public void saveDetailInfo() { 53 | 54 | } 55 | 56 | @Override 57 | public void unsubscribe() { 58 | if (mView != null) { 59 | mView = null; 60 | } 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/cardDetail/CardDetailPresenterModule.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.cardDetail; 2 | 3 | import dagger.Module; 4 | import dagger.Provides; 5 | 6 | /** 7 | * Created by Jeremy on 2017/3/7. 8 | */ 9 | @Module 10 | public class CardDetailPresenterModule { 11 | 12 | private final CardDetailContract.View mView; 13 | 14 | private final long mCardId; 15 | 16 | public CardDetailPresenterModule(CardDetailContract.View view, long cardId) { 17 | mView = view; 18 | mCardId = cardId; 19 | } 20 | 21 | @Provides 22 | CardDetailContract.View provideCardDetailContractView() { 23 | return mView; 24 | } 25 | 26 | @Provides 27 | long provideCardId() { 28 | return mCardId; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/cardDetail/tabs/comsumption/ConsumeBomListModule.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.cardDetail.tabs.comsumption; 2 | 3 | import com.jeremy.android.consumer.data.bean.ConsumeBom; 4 | 5 | import java.util.ArrayList; 6 | import java.util.List; 7 | 8 | import dagger.Module; 9 | import dagger.Provides; 10 | 11 | /** 12 | * Created by Jeremy on 2017/3/8. 13 | */ 14 | @Module 15 | public class ConsumeBomListModule { 16 | 17 | @Provides 18 | List provideConsumeBoms() { 19 | List consumeBoms = new ArrayList<>(); 20 | consumeBoms.add(0, ConsumeBom.newAddInstance()); 21 | return consumeBoms; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/cardDetail/tabs/comsumption/ConsumptionComponent.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.cardDetail.tabs.comsumption; 2 | 3 | import com.jeremy.android.consumer.AppComponent; 4 | import com.jeremy.android.consumer.utils.PerFragmentScoped; 5 | 6 | import dagger.Component; 7 | 8 | /** 9 | * Created by Jeremy on 2017/3/7. 10 | */ 11 | @PerFragmentScoped 12 | @Component(dependencies = AppComponent.class, modules = {ConsumeBomListModule.class, ConsumptionPresenterModule.class}) 13 | public interface ConsumptionComponent { 14 | 15 | void inject(ConsumptionFragment fragment); 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/cardDetail/tabs/comsumption/ConsumptionContract.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.cardDetail.tabs.comsumption; 2 | 3 | import android.content.Context; 4 | 5 | import com.jeremy.android.consumer.BasePresenter; 6 | import com.jeremy.android.consumer.BaseView; 7 | import com.jeremy.android.consumer.data.bean.ConsumeBom; 8 | import com.jeremy.android.database.model.Bom; 9 | import com.jeremy.android.database.model.Card; 10 | 11 | import java.util.List; 12 | 13 | /** 14 | * Created by Jeremy on 2017/3/7. 15 | */ 16 | public class ConsumptionContract { 17 | 18 | interface View extends BaseView { 19 | 20 | void showNoEnableBomsDialog(); 21 | 22 | void showBoms(List boms); 23 | 24 | void showPageMsg(String msg); 25 | 26 | int getConsumeButtonProgress(); 27 | 28 | void showConsumeSuccess(); 29 | 30 | void showConsumeButtonError(); 31 | 32 | void showConsumeButtonLoading(); 33 | 34 | void showConsumeButtonNormal(); 35 | 36 | void showConsumeConfirmDialog(float total); 37 | 38 | void showBomsDeleted(int position); 39 | 40 | void showBomsAdd(); 41 | 42 | void showBomsSettingPage(); 43 | 44 | void showCardBalanceUpdate(float balance); 45 | 46 | Context getCtx(); 47 | 48 | List getConsumeBoms(); 49 | 50 | } 51 | 52 | interface Presenter extends BasePresenter { 53 | 54 | void loadEnableBoms(); 55 | 56 | void addBoms(List boms, List checks); 57 | 58 | void deleteBom(int position); 59 | 60 | void setBoms(); 61 | 62 | void calculatePrice(); 63 | 64 | void doConsume(float needPayPrice, Card mCard, String memo); 65 | 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/cardDetail/tabs/comsumption/ConsumptionPresenterModule.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.cardDetail.tabs.comsumption; 2 | 3 | import dagger.Module; 4 | import dagger.Provides; 5 | 6 | /** 7 | * Created by Jeremy on 2017/3/7. 8 | */ 9 | @Module 10 | public class ConsumptionPresenterModule { 11 | 12 | private final ConsumptionContract.View mView; 13 | 14 | public ConsumptionPresenterModule(ConsumptionContract.View view) { 15 | mView = view; 16 | } 17 | 18 | @Provides 19 | ConsumptionContract.View provideConsumptionContractView() { 20 | return mView; 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/cardDetail/tabs/consumptionRecords/ConsumptionRecordComponent.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.cardDetail.tabs.consumptionRecords; 2 | 3 | import com.jeremy.android.consumer.AppComponent; 4 | import com.jeremy.android.consumer.utils.PerFragmentScoped; 5 | 6 | import dagger.Component; 7 | 8 | /** 9 | * Created by Jeremy on 2017/3/11. 10 | */ 11 | @PerFragmentScoped 12 | @Component(dependencies = AppComponent.class, modules = {ConsumptionRecordListModule.class, ConsumptionRecordPresenterModule.class}) 13 | public interface ConsumptionRecordComponent { 14 | 15 | void inject(ConsumptionRecordFragment fragment); 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/cardDetail/tabs/consumptionRecords/ConsumptionRecordContract.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.cardDetail.tabs.consumptionRecords; 2 | 3 | import com.jeremy.android.consumer.BasePresenter; 4 | import com.jeremy.android.consumer.BaseView; 5 | import com.jeremy.android.database.model.Consumption; 6 | 7 | import java.util.List; 8 | 9 | /** 10 | * Created by Jeremy on 2017/3/11. 11 | */ 12 | 13 | public class ConsumptionRecordContract { 14 | 15 | interface View extends BaseView { 16 | 17 | void showConsumptions(List consumptions); 18 | 19 | void showConsumptionDetail(Consumption consumption); 20 | 21 | void showConsumptionDeleted(int position); 22 | 23 | void showConsumptionAdded(Consumption consumption); 24 | 25 | void showPageMsg(String msg); 26 | } 27 | 28 | interface Presenter extends BasePresenter { 29 | 30 | void loadConsumptions(long cardId); 31 | 32 | void openConsumptionDetail(long consumptionId); 33 | 34 | void deleteConsumption(int position, long consumptionId); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/cardDetail/tabs/consumptionRecords/ConsumptionRecordListModule.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.cardDetail.tabs.consumptionRecords; 2 | 3 | import com.jeremy.android.database.model.Consumption; 4 | 5 | import java.util.ArrayList; 6 | import java.util.List; 7 | 8 | import dagger.Module; 9 | import dagger.Provides; 10 | 11 | /** 12 | * Created by Jeremy on 2017/3/11. 13 | */ 14 | @Module 15 | public class ConsumptionRecordListModule { 16 | 17 | @Provides 18 | List provideConsumptionRecords() { 19 | return new ArrayList<>(); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/cardDetail/tabs/consumptionRecords/ConsumptionRecordPresenter.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.cardDetail.tabs.consumptionRecords; 2 | 3 | import com.jeremy.android.consumer.data.source.DataRepository; 4 | import com.jeremy.android.consumer.rxbus.RxBus; 5 | import com.jeremy.android.database.model.Consumption; 6 | 7 | import javax.inject.Inject; 8 | 9 | import io.reactivex.android.schedulers.AndroidSchedulers; 10 | import io.reactivex.disposables.CompositeDisposable; 11 | import io.reactivex.disposables.Disposable; 12 | import io.reactivex.schedulers.Schedulers; 13 | 14 | /** 15 | * Created by Jeremy on 2017/3/11. 16 | */ 17 | public class ConsumptionRecordPresenter implements ConsumptionRecordContract.Presenter { 18 | 19 | private DataRepository mDataRepository; 20 | 21 | private ConsumptionRecordContract.View mView; 22 | 23 | private RxBus mRxBus; 24 | 25 | private CompositeDisposable compositeDisposable; 26 | 27 | @Inject 28 | ConsumptionRecordPresenter(DataRepository dataRepository, ConsumptionRecordContract.View view, RxBus rxBus) { 29 | this.mDataRepository = dataRepository; 30 | this.mView = view; 31 | this.mRxBus = rxBus; 32 | mView.setPresenter(this); 33 | compositeDisposable = new CompositeDisposable(); 34 | } 35 | 36 | @Override 37 | public void subscribe() { 38 | compositeDisposable.clear(); 39 | Disposable disposable = mRxBus.toFlowable(Consumption.class) 40 | .compose(mView.getBindToLifecycle()) 41 | .subscribe(consumption -> { 42 | mView.showConsumptionAdded(consumption); 43 | }); 44 | compositeDisposable.add(disposable); 45 | } 46 | 47 | @Override 48 | public void loadConsumptions(long cardId) { 49 | mDataRepository.getConsumptionsByCardId(cardId) 50 | .compose(mView.getBindToLifecycle()) 51 | .subscribeOn(Schedulers.computation()) 52 | .observeOn(AndroidSchedulers.mainThread()) 53 | .subscribe(consumptions -> mView.showConsumptions(consumptions) 54 | , throwable -> mView.showPageMsg(throwable.getMessage())); 55 | } 56 | 57 | @Override 58 | public void openConsumptionDetail(long consumptionId) { 59 | mDataRepository.getConsumption(consumptionId) 60 | .compose(mView.getBindToLifecycle()) 61 | .subscribeOn(Schedulers.computation()) 62 | .observeOn(AndroidSchedulers.mainThread()) 63 | .subscribe(consumption -> mView.showConsumptionDetail(consumption) 64 | , throwable -> mView.showPageMsg(throwable.getMessage())); 65 | } 66 | 67 | @Override 68 | public void deleteConsumption(int position, long consumptionId) { 69 | mDataRepository.deleteConsumption(consumptionId); 70 | mView.showConsumptionDeleted(position); 71 | } 72 | 73 | @Override 74 | public void unsubscribe() { 75 | if (compositeDisposable != null && !compositeDisposable.isDisposed()) { 76 | compositeDisposable.dispose(); 77 | } 78 | if (mView != null) { 79 | mView = null; 80 | } 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/cardDetail/tabs/consumptionRecords/ConsumptionRecordPresenterModule.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.cardDetail.tabs.consumptionRecords; 2 | 3 | import dagger.Module; 4 | import dagger.Provides; 5 | 6 | /** 7 | * Created by Jeremy on 2017/3/11. 8 | */ 9 | @Module 10 | public class ConsumptionRecordPresenterModule { 11 | 12 | private final ConsumptionRecordContract.View mView; 13 | 14 | ConsumptionRecordPresenterModule(ConsumptionRecordContract.View view) { 15 | mView = view; 16 | } 17 | 18 | @Provides 19 | ConsumptionRecordContract.View provideConsumptionRecordContractView() { 20 | return mView; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/cardDetail/tabs/detailInfo/DetailInfoComponent.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.cardDetail.tabs.detailInfo; 2 | 3 | import com.jeremy.android.consumer.AppComponent; 4 | import com.jeremy.android.consumer.utils.PerFragmentScoped; 5 | 6 | import dagger.Component; 7 | 8 | /** 9 | * Created by Jeremy on 2017/3/17. 10 | */ 11 | @PerFragmentScoped 12 | @Component(dependencies = AppComponent.class, modules = DetailInfoPresenterModule.class) 13 | public interface DetailInfoComponent { 14 | 15 | void inject(DetailInfoFragment fragment); 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/cardDetail/tabs/detailInfo/DetailInfoContract.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.cardDetail.tabs.detailInfo; 2 | 3 | import android.content.Context; 4 | 5 | import com.jeremy.android.consumer.BasePresenter; 6 | import com.jeremy.android.consumer.BaseView; 7 | import com.jeremy.android.consumer.data.bean.CardItem; 8 | import com.jeremy.android.database.model.Card; 9 | 10 | /** 11 | * Created by Jeremy on 2017/3/17. 12 | */ 13 | 14 | public class DetailInfoContract { 15 | 16 | interface View extends BaseView { 17 | 18 | void showCardNoAfterAutoSet(String cardNo); 19 | 20 | void showCardPointsUpdated(float points); 21 | 22 | void showCardBalanceUpdated(float balance); 23 | 24 | void showExpiredTimeUpdated(String expiredTime); 25 | 26 | void showUpdateCardMsg(String msg); 27 | 28 | long getCardExpirdTime(); 29 | 30 | void initDpDialog(int year, int month, int dayOfMonth); 31 | 32 | void showCardList(CardItem newCardItem); 33 | 34 | Context getCtx(); 35 | } 36 | 37 | interface Presenter extends BasePresenter { 38 | 39 | void autoSetCardNo(); 40 | 41 | void updateExpiredTime(int year, int monthOfYear, int dayOfMonth); 42 | 43 | void updateCard(Card card, String newName, String newCardNo, String newPhone, String newAddress, String newMemo); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/cardDetail/tabs/detailInfo/DetailInfoPresenterModule.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.cardDetail.tabs.detailInfo; 2 | 3 | import dagger.Module; 4 | import dagger.Provides; 5 | 6 | /** 7 | * Created by Jeremy on 2017/3/17. 8 | */ 9 | @Module 10 | public class DetailInfoPresenterModule { 11 | 12 | private final DetailInfoContract.View mView; 13 | 14 | public DetailInfoPresenterModule(DetailInfoContract.View mView) { 15 | this.mView = mView; 16 | } 17 | 18 | @Provides 19 | DetailInfoContract.View providesDetailInfoContractView() { 20 | return this.mView; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/cardDetail/tabs/recharge/RechargeComponent.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.cardDetail.tabs.recharge; 2 | 3 | import com.jeremy.android.consumer.AppComponent; 4 | import com.jeremy.android.consumer.utils.PerFragmentScoped; 5 | 6 | import dagger.Component; 7 | 8 | /** 9 | * Created by Jeremy on 2017/3/17. 10 | */ 11 | @PerFragmentScoped 12 | @Component(dependencies = AppComponent.class, modules = RechargePresenterModule.class) 13 | public interface RechargeComponent { 14 | 15 | void inject(RechargeFragment fragment); 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/cardDetail/tabs/recharge/RechargeContract.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.cardDetail.tabs.recharge; 2 | 3 | import android.content.Context; 4 | 5 | import com.jeremy.android.consumer.BasePresenter; 6 | import com.jeremy.android.consumer.BaseView; 7 | import com.jeremy.android.database.model.Card; 8 | 9 | /** 10 | * Created by Jeremy on 2017/3/17. 11 | */ 12 | 13 | public class RechargeContract { 14 | 15 | interface View extends BaseView { 16 | 17 | void showPageMsg(String msg); 18 | 19 | int getRechargeButtonProgress(); 20 | 21 | void showRechargeSuccess(); 22 | 23 | void showRechargeButtonError(); 24 | 25 | void showRechargeButtonLoading(); 26 | 27 | void showRechargeButtonNormal(); 28 | 29 | void showRechargeConfirmDialog(); 30 | 31 | void showCardBalanceUpdate(float balance); 32 | 33 | Context getCtx(); 34 | } 35 | 36 | interface Presenter extends BasePresenter { 37 | 38 | void doRecharge(Card mCard, String rechargeMoney, String memo); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/cardDetail/tabs/recharge/RechargePresenterModule.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.cardDetail.tabs.recharge; 2 | 3 | import dagger.Module; 4 | import dagger.Provides; 5 | 6 | /** 7 | * Created by Jeremy on 2017/3/17. 8 | */ 9 | @Module 10 | public class RechargePresenterModule { 11 | 12 | private final RechargeContract.View mView; 13 | 14 | public RechargePresenterModule(RechargeContract.View mView) { 15 | this.mView = mView; 16 | } 17 | 18 | @Provides 19 | RechargeContract.View providesRechargeContractView() { 20 | return mView; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/cardDetail/tabs/rechargeRecords/RechargeRecordComponent.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.cardDetail.tabs.rechargeRecords; 2 | 3 | import com.jeremy.android.consumer.AppComponent; 4 | import com.jeremy.android.consumer.utils.PerFragmentScoped; 5 | 6 | import dagger.Component; 7 | 8 | /** 9 | * Created by Jeremy on 2017/3/15. 10 | */ 11 | @PerFragmentScoped 12 | @Component(dependencies = AppComponent.class, modules = {RechargeRecordListModule.class, RechargeRecordPresenterModule.class}) 13 | public interface RechargeRecordComponent { 14 | 15 | void inject(RechargeRecordFragment fragment); 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/cardDetail/tabs/rechargeRecords/RechargeRecordContract.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.cardDetail.tabs.rechargeRecords; 2 | 3 | import com.jeremy.android.consumer.BasePresenter; 4 | import com.jeremy.android.consumer.BaseView; 5 | import com.jeremy.android.database.model.Recharge; 6 | 7 | import java.util.List; 8 | 9 | /** 10 | * Created by Jeremy on 2017/3/15. 11 | */ 12 | 13 | public class RechargeRecordContract { 14 | 15 | interface View extends BaseView { 16 | 17 | void showRecharges(List recharges); 18 | 19 | void showRechargeDetail(Recharge recharge); 20 | 21 | void showRechargeDeleted(int position); 22 | 23 | void showRechargeAdded(Recharge recharge); 24 | 25 | void showPageMsg(String msg); 26 | } 27 | 28 | interface Presenter extends BasePresenter { 29 | 30 | void loadRecharges(long cardId); 31 | 32 | void openRechargeDetail(long rechargeId); 33 | 34 | void deleteRecharge(int position, long rechargeId); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/cardDetail/tabs/rechargeRecords/RechargeRecordListModule.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.cardDetail.tabs.rechargeRecords; 2 | 3 | import com.jeremy.android.database.model.Recharge; 4 | 5 | import java.util.ArrayList; 6 | import java.util.List; 7 | 8 | import dagger.Module; 9 | import dagger.Provides; 10 | 11 | /** 12 | * Created by Jeremy on 2017/3/15. 13 | */ 14 | @Module 15 | public class RechargeRecordListModule { 16 | 17 | @Provides 18 | List provideRechargeRecords() { 19 | return new ArrayList<>(); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/cardDetail/tabs/rechargeRecords/RechargeRecordPresenter.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.cardDetail.tabs.rechargeRecords; 2 | 3 | import com.jeremy.android.consumer.data.source.DataRepository; 4 | import com.jeremy.android.consumer.rxbus.RxBus; 5 | import com.jeremy.android.database.model.Recharge; 6 | 7 | import javax.inject.Inject; 8 | 9 | import io.reactivex.android.schedulers.AndroidSchedulers; 10 | import io.reactivex.disposables.CompositeDisposable; 11 | import io.reactivex.disposables.Disposable; 12 | import io.reactivex.schedulers.Schedulers; 13 | 14 | /** 15 | * Created by Jeremy on 2017/3/15. 16 | */ 17 | 18 | public class RechargeRecordPresenter implements RechargeRecordContract.Presenter { 19 | 20 | private DataRepository mDataRepository; 21 | 22 | private RechargeRecordContract.View mView; 23 | 24 | private RxBus mRxBus; 25 | 26 | private CompositeDisposable compositeDisposable; 27 | 28 | @Inject 29 | RechargeRecordPresenter(DataRepository dataRepository, RechargeRecordContract.View view, RxBus rxBus) { 30 | this.mDataRepository = dataRepository; 31 | this.mView = view; 32 | this.mRxBus = rxBus; 33 | mView.setPresenter(this); 34 | compositeDisposable = new CompositeDisposable(); 35 | } 36 | 37 | @Override 38 | public void subscribe() { 39 | compositeDisposable.clear(); 40 | Disposable disposable = mRxBus.toFlowable(Recharge.class) 41 | .compose(mView.getBindToLifecycle()) 42 | .subscribe(recharge -> { 43 | mView.showRechargeAdded(recharge); 44 | }); 45 | compositeDisposable.add(disposable); 46 | } 47 | 48 | @Override 49 | public void loadRecharges(long cardId) { 50 | mDataRepository.getRechargesByCardId(cardId) 51 | .compose(mView.getBindToLifecycle()) 52 | .subscribeOn(Schedulers.computation()) 53 | .observeOn(AndroidSchedulers.mainThread()) 54 | .subscribe(recharges -> mView.showRecharges(recharges) 55 | , throwable -> mView.showPageMsg(throwable.getMessage())); 56 | } 57 | 58 | @Override 59 | public void openRechargeDetail(long rechargeId) { 60 | mDataRepository.getRecharge(rechargeId) 61 | .compose(mView.getBindToLifecycle()) 62 | .subscribeOn(Schedulers.computation()) 63 | .observeOn(AndroidSchedulers.mainThread()) 64 | .subscribe(recharge -> mView.showRechargeDetail(recharge) 65 | , throwable -> mView.showPageMsg(throwable.getMessage())); 66 | } 67 | 68 | @Override 69 | public void deleteRecharge(int position, long rechargeId) { 70 | mDataRepository.deleteConsumption(rechargeId); 71 | mView.showRechargeDeleted(position); 72 | } 73 | 74 | @Override 75 | public void unsubscribe() { 76 | if (compositeDisposable != null && !compositeDisposable.isDisposed()) { 77 | compositeDisposable.dispose(); 78 | } 79 | if (mView != null) { 80 | mView = null; 81 | } 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/cardDetail/tabs/rechargeRecords/RechargeRecordPresenterModule.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.cardDetail.tabs.rechargeRecords; 2 | 3 | import dagger.Module; 4 | import dagger.Provides; 5 | 6 | /** 7 | * Created by Jeremy on 2017/3/15. 8 | */ 9 | @Module 10 | public class RechargeRecordPresenterModule { 11 | 12 | private final RechargeRecordContract.View mView; 13 | 14 | public RechargeRecordPresenterModule(RechargeRecordContract.View view) { 15 | this.mView = view; 16 | } 17 | 18 | @Provides 19 | RechargeRecordContract.View provideRechargeRecordContractView() { 20 | return mView; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/cards/CardItemListModule.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.cards; 2 | 3 | import com.jeremy.android.consumer.data.bean.CardItem; 4 | 5 | import java.util.ArrayList; 6 | import java.util.List; 7 | 8 | import dagger.Module; 9 | import dagger.Provides; 10 | 11 | /** 12 | * Created by Jeremy on 2017/3/8. 13 | */ 14 | @Module 15 | public class CardItemListModule { 16 | 17 | @Provides 18 | public List provideCardList() { 19 | List cardItems = new ArrayList<>(); 20 | cardItems.add(0, CardItem.newAddInstance()); 21 | return cardItems; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/cards/CardsComponent.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.cards; 2 | 3 | import com.jeremy.android.consumer.AppComponent; 4 | import com.jeremy.android.consumer.utils.PerActivityScoped; 5 | 6 | import dagger.Component; 7 | 8 | /** 9 | * Created by Jeremy on 2017/1/23. 10 | */ 11 | @PerActivityScoped 12 | @Component(dependencies = AppComponent.class, modules = {CardItemListModule.class, CardsPresenterModule.class}) 13 | public interface CardsComponent { 14 | 15 | void inject(CardsActivity activity); 16 | 17 | } 18 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/cards/CardsContract.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.cards; 2 | 3 | import android.content.Intent; 4 | 5 | import com.jeremy.android.consumer.BasePresenter; 6 | import com.jeremy.android.consumer.BaseView; 7 | import com.jeremy.android.consumer.data.bean.CardItem; 8 | import com.jeremy.android.consumer.data.bean.VersionConfig; 9 | 10 | import java.util.List; 11 | 12 | /** 13 | * Created by Jeremy on 2017/1/21. 14 | */ 15 | 16 | public class CardsContract { 17 | 18 | interface View extends BaseView { 19 | 20 | void showHasNewVersion(VersionConfig config); 21 | 22 | void showRefreshLoadingIndicator(); 23 | 24 | void hideRefreshLoadingIndicator(boolean loadMoreEnd); 25 | 26 | void hideMoreLoadingIndicator(boolean loadMoreEnd); 27 | 28 | void showRefreshToGetCards(); 29 | 30 | void showAddCard(); 31 | 32 | void showCardDetail(long cardId); 33 | 34 | void showLoadingCardsError(String errorMsg); 35 | 36 | void showCardDeleted(int pos); 37 | 38 | void showCardsUpdated(); 39 | 40 | void showNoDataMsg(); 41 | 42 | void showIsAllDataMsg(); 43 | 44 | void showSettingSavedMsg(); 45 | 46 | void showUpdateCardSuccessMsg(); 47 | 48 | void showAddCardSuccessMsg(); 49 | 50 | List getCardItems(); 51 | 52 | } 53 | 54 | interface Presenter extends BasePresenter { 55 | 56 | void checkVersionUpdate(); 57 | 58 | void result(int requestCode, int resultCode, Intent data); 59 | 60 | void loadCards(boolean isRefresh, String search); 61 | 62 | void addNewCard(); 63 | 64 | void openCardDetail(long cardId); 65 | 66 | void deleteCard(int pos, long cardId); 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/cards/CardsPresenterModule.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.cards; 2 | 3 | import com.jeremy.android.consumer.utils.PerActivityScoped; 4 | 5 | import dagger.Module; 6 | import dagger.Provides; 7 | 8 | /** 9 | * Created by Jeremy on 2017/1/23. 10 | */ 11 | @PerActivityScoped 12 | @Module 13 | public class CardsPresenterModule { 14 | 15 | private final CardsContract.View view; 16 | 17 | public CardsPresenterModule(CardsContract.View view) { 18 | this.view = view; 19 | } 20 | 21 | @Provides 22 | public CardsContract.View provideCardsContractView() { 23 | return this.view; 24 | } 25 | 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/data/bean/CardItem.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.data.bean; 2 | 3 | import com.chad.library.adapter.base.entity.MultiItemEntity; 4 | import com.jeremy.android.database.model.Card; 5 | 6 | import java.io.Serializable; 7 | 8 | /** 9 | * Created by Jeremy on 2017/2/7. 10 | */ 11 | 12 | public class CardItem implements MultiItemEntity, Serializable { 13 | 14 | public static final int ADD = 1; 15 | public static final int ITEM = 2; 16 | private int itemType; 17 | 18 | private Long cardId; 19 | private String userName; 20 | private String userPhone; 21 | private String cardNo; 22 | private Long cardExpired; 23 | 24 | private boolean isShowDeletes; 25 | 26 | private CardItem(int itemType) { 27 | setItemType(itemType); 28 | } 29 | 30 | private CardItem(int itemType, Card card) { 31 | setItemType(itemType); 32 | setCardId(card._id); 33 | setUserName(card.userName); 34 | setUserPhone(card.userPhone); 35 | setCardNo(card.cardNo); 36 | setCardExpired(card.cardExpired); 37 | setShowDeletes(false); 38 | } 39 | 40 | public static CardItem newAddInstance() { 41 | return new CardItem(ADD); 42 | } 43 | 44 | public static CardItem newItemInstance(Card card) { 45 | return new CardItem(ITEM, card); 46 | } 47 | 48 | @Override 49 | public int getItemType() { 50 | return itemType; 51 | } 52 | 53 | public void setItemType(int itemType) { 54 | this.itemType = itemType; 55 | } 56 | 57 | public Long getCardId() { 58 | return cardId; 59 | } 60 | 61 | public void setCardId(Long cardId) { 62 | this.cardId = cardId; 63 | } 64 | 65 | public String getUserName() { 66 | return userName; 67 | } 68 | 69 | public void setUserName(String userName) { 70 | this.userName = userName; 71 | } 72 | 73 | public String getUserPhone() { 74 | return userPhone; 75 | } 76 | 77 | public void setUserPhone(String userPhone) { 78 | this.userPhone = userPhone; 79 | } 80 | 81 | public String getCardNo() { 82 | return cardNo; 83 | } 84 | 85 | public void setCardNo(String cardNo) { 86 | this.cardNo = cardNo; 87 | } 88 | 89 | public Long getCardExpired() { 90 | return cardExpired; 91 | } 92 | 93 | public void setCardExpired(Long cardExpired) { 94 | this.cardExpired = cardExpired; 95 | } 96 | 97 | public boolean isShowDeletes() { 98 | return isShowDeletes; 99 | } 100 | 101 | public void setShowDeletes(boolean showDeletes) { 102 | isShowDeletes = showDeletes; 103 | } 104 | } 105 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/data/bean/ConsumeBom.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.data.bean; 2 | 3 | import com.chad.library.adapter.base.entity.MultiItemEntity; 4 | import com.jeremy.android.database.model.Bom; 5 | 6 | import java.io.Serializable; 7 | import java.util.Locale; 8 | 9 | /** 10 | * Created by Jeremy on 2016/4/14 0014. 11 | */ 12 | public class ConsumeBom implements MultiItemEntity, Serializable { 13 | 14 | public static final int ADD = 1; 15 | public static final int ITEM = 2; 16 | private int itemType; 17 | 18 | private Long bomId; 19 | private String bomName; 20 | private float unitPrice; 21 | private int count; 22 | private String time; 23 | private float price; 24 | private String unit; 25 | private String memo; 26 | 27 | private ConsumeBom(int itemType) { 28 | setItemType(itemType); 29 | } 30 | 31 | private ConsumeBom(int itemType, Bom bom) { 32 | setItemType(itemType); 33 | setBomId(bom._id); 34 | setBomName(bom.name); 35 | setUnitPrice(bom.price); 36 | setUnit(bom.unit); 37 | setMemo(bom.memo); 38 | setPrice(Float.valueOf(String.format(Locale.getDefault(), "%.2f", bom.price))); 39 | setCount(1); 40 | setTime("1"); 41 | } 42 | 43 | public static ConsumeBom newAddInstance() { 44 | return new ConsumeBom(ADD); 45 | } 46 | 47 | public static ConsumeBom newItemInstance(Bom bom) { 48 | return new ConsumeBom(ITEM, bom); 49 | } 50 | 51 | @Override 52 | public int getItemType() { 53 | return itemType; 54 | } 55 | 56 | public void setItemType(int itemType) { 57 | this.itemType = itemType; 58 | } 59 | 60 | public Long getBomId() { 61 | return bomId; 62 | } 63 | 64 | public void setBomId(Long bomId) { 65 | this.bomId = bomId; 66 | } 67 | 68 | public String getBomName() { 69 | return bomName; 70 | } 71 | 72 | public void setBomName(String bomName) { 73 | this.bomName = bomName; 74 | } 75 | 76 | public float getUnitPrice() { 77 | return unitPrice; 78 | } 79 | 80 | public void setUnitPrice(float unitPrice) { 81 | this.unitPrice = unitPrice; 82 | } 83 | 84 | public int getCount() { 85 | return count; 86 | } 87 | 88 | public void setCount(int count) { 89 | this.count = count; 90 | } 91 | 92 | public String getTime() { 93 | return time; 94 | } 95 | 96 | public void setTime(String time) { 97 | this.time = time; 98 | } 99 | 100 | public float getPrice() { 101 | return price; 102 | } 103 | 104 | public void setPrice(float price) { 105 | this.price = price; 106 | } 107 | 108 | public String getUnit() { 109 | return unit; 110 | } 111 | 112 | public void setUnit(String unit) { 113 | this.unit = unit; 114 | } 115 | 116 | public String getMemo() { 117 | return memo; 118 | } 119 | 120 | public void setMemo(String memo) { 121 | this.memo = memo; 122 | } 123 | 124 | } 125 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/data/bean/FeedBack.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.data.bean; 2 | 3 | import com.jeremy.android.consumer.utils.TimeUtils; 4 | 5 | /** 6 | * 意见反馈实体类 7 | */ 8 | public class FeedBack { 9 | 10 | //反馈内容 11 | private String contents = ""; 12 | 13 | //联系方式 (电话or邮箱) 14 | private String contact = ""; 15 | 16 | //反馈时间 17 | private String feed_time = ""; 18 | 19 | //apk版本 20 | private String version = ""; 21 | 22 | public String getContents() { 23 | return contents; 24 | } 25 | 26 | public void setContents(String contents) { 27 | this.contents = contents; 28 | } 29 | 30 | public String getContact() { 31 | return contact; 32 | } 33 | 34 | public void setContact(String contact) { 35 | this.contact = contact; 36 | } 37 | 38 | public String getFeed_time() { 39 | return feed_time; 40 | } 41 | 42 | public void setFeed_time(long feed_time) { 43 | this.feed_time = TimeUtils.getFormatByTimeStamp(feed_time); 44 | } 45 | 46 | public String getVersion() { 47 | return version; 48 | } 49 | 50 | public void setVersion(String version) { 51 | this.version = version; 52 | } 53 | 54 | } 55 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/data/bean/VersionConfig.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.data.bean; 2 | 3 | import android.os.Parcel; 4 | import android.os.Parcelable; 5 | 6 | import java.util.ArrayList; 7 | import java.util.List; 8 | 9 | /** 10 | * Created by Jeremy on 2017/3/1. 11 | *

12 | * 格式: 13 | * { 14 | * "appName": "app名称", 15 | * "fileName": "http://...../.....apk", 16 | * "verName": "1.2", 17 | * "verCode": 3, 18 | * "changes": [ 19 | * "1. 修正......", 20 | * "2. 修正......", 21 | * "3. 修正......", 22 | * "4. 修正......" 23 | * ], 24 | * } 25 | */ 26 | 27 | public class VersionConfig implements Parcelable { 28 | 29 | private String appName = ""; 30 | private String fileName = ""; 31 | private String verName = ""; 32 | private int verCode = 0; 33 | private List changes; 34 | 35 | public VersionConfig() { 36 | changes = new ArrayList<>(); 37 | } 38 | 39 | protected VersionConfig(Parcel in) { 40 | appName = in.readString(); 41 | fileName = in.readString(); 42 | verName = in.readString(); 43 | verCode = in.readInt(); 44 | changes = in.createStringArrayList(); 45 | } 46 | 47 | public static final Creator CREATOR = new Creator() { 48 | @Override 49 | public VersionConfig createFromParcel(Parcel in) { 50 | return new VersionConfig(in); 51 | } 52 | 53 | @Override 54 | public VersionConfig[] newArray(int size) { 55 | return new VersionConfig[size]; 56 | } 57 | }; 58 | 59 | public String getAppName() { 60 | return appName; 61 | } 62 | 63 | public void setAppName(String appName) { 64 | this.appName = appName; 65 | } 66 | 67 | public String getFileName() { 68 | return fileName; 69 | } 70 | 71 | public void setFileName(String fileName) { 72 | this.fileName = fileName; 73 | } 74 | 75 | public String getVerName() { 76 | return verName; 77 | } 78 | 79 | public void setVerName(String verName) { 80 | this.verName = verName; 81 | } 82 | 83 | public int getVerCode() { 84 | return verCode; 85 | } 86 | 87 | public void setVerCode(int verCode) { 88 | this.verCode = verCode; 89 | } 90 | 91 | public List getChanges() { 92 | return changes; 93 | } 94 | 95 | public void setChanges(List changes) { 96 | this.changes = changes; 97 | } 98 | 99 | public String getChangesString() { 100 | StringBuffer sb = new StringBuffer(); 101 | for (String s : changes) { 102 | sb.append(s).append("\n"); 103 | } 104 | sb.deleteCharAt(sb.length() - "\n".length()); 105 | return sb.toString(); 106 | } 107 | 108 | @Override 109 | public int describeContents() { 110 | return 0; 111 | } 112 | 113 | @Override 114 | public void writeToParcel(Parcel parcel, int i) { 115 | parcel.writeString(appName); 116 | parcel.writeString(fileName); 117 | parcel.writeString(verName); 118 | parcel.writeInt(verCode); 119 | parcel.writeStringList(changes); 120 | } 121 | } 122 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/data/source/DataRepositoryModule.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.data.source; 2 | 3 | import com.jeremy.android.consumer.data.source.local.LocalDataSource; 4 | import com.jeremy.android.consumer.data.source.remote.RemoteDataSource; 5 | 6 | import javax.inject.Singleton; 7 | 8 | import dagger.Module; 9 | import dagger.Provides; 10 | 11 | /** 12 | * Created by Jeremy on 2017/1/23. 13 | */ 14 | 15 | @Module 16 | public class DataRepositoryModule { 17 | 18 | @Provides 19 | @Singleton 20 | @Remote 21 | DataSource provideCardsRemoteDataSource() { 22 | return new RemoteDataSource(); 23 | } 24 | 25 | @Provides 26 | @Singleton 27 | @Local 28 | DataSource provideCardsLocalDataSource() { 29 | return new LocalDataSource(); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/data/source/DataSource.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.data.source; 2 | 3 | import android.support.annotation.NonNull; 4 | 5 | import com.jeremy.android.database.model.Bom; 6 | import com.jeremy.android.database.model.Card; 7 | import com.jeremy.android.database.model.Consumption; 8 | import com.jeremy.android.database.model.Recharge; 9 | 10 | import java.util.List; 11 | 12 | import io.reactivex.Flowable; 13 | import io.reactivex.Observable; 14 | 15 | /** 16 | * Created by Jeremy on 2017/1/23. 17 | */ 18 | 19 | public interface DataSource { 20 | 21 | /***************************************/ 22 | Flowable getCard(long cardId); 23 | 24 | Flowable> getCards(long lastId, String search, int limit); 25 | 26 | Observable checkCardNoExist(String cardNo); 27 | 28 | void saveCard(Card card); 29 | 30 | void updateCard(Card card); 31 | 32 | void refreshCards(); 33 | 34 | void deleteAllCards(); 35 | 36 | void deleteCard(@NonNull long cardId); 37 | 38 | 39 | /***************************************/ 40 | Flowable getRecharge(long rechargeId); 41 | 42 | Flowable> getRechargesByCardId(long cardId); 43 | 44 | void saveRecharge(Recharge recharge); 45 | 46 | void deleteRecharge(@NonNull long rechargeId); 47 | 48 | 49 | /***************************************/ 50 | Flowable getConsumption(long consumptionId); 51 | 52 | Flowable> getConsumptionsByCardId(long cardId); 53 | 54 | void saveConsumption(Consumption consumption); 55 | 56 | void deleteConsumption(@NonNull long consumptionId); 57 | 58 | 59 | /***************************************/ 60 | Flowable getBom(long bomId); 61 | 62 | Flowable> getBoms(); 63 | 64 | Observable checkBomNameExist(String name); 65 | 66 | void saveBom(Bom bom); 67 | 68 | void deleteBom(@NonNull long bomId); 69 | 70 | void updateBom(Bom bom); 71 | } 72 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/data/source/Local.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.data.source; 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 Jeremy on 2017/1/25. 11 | */ 12 | 13 | @Qualifier 14 | @Documented 15 | @Retention(RetentionPolicy.RUNTIME) 16 | public @interface Local { 17 | 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/data/source/Remote.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.data.source; 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 Jeremy on 2017/1/25. 11 | */ 12 | 13 | @Qualifier 14 | @Documented 15 | @Retention(RetentionPolicy.RUNTIME) 16 | public @interface Remote { 17 | 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/data/source/remote/webApi/ApiService.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.data.source.remote.webApi; 2 | 3 | import com.jeremy.android.consumer.data.bean.FeedBack; 4 | import com.jeremy.android.consumer.data.bean.VersionConfig; 5 | 6 | import io.reactivex.Observable; 7 | import okhttp3.MultipartBody; 8 | import okhttp3.RequestBody; 9 | import okhttp3.ResponseBody; 10 | import retrofit2.http.Body; 11 | import retrofit2.http.GET; 12 | import retrofit2.http.Headers; 13 | import retrofit2.http.Multipart; 14 | import retrofit2.http.POST; 15 | import retrofit2.http.Part; 16 | import retrofit2.http.Streaming; 17 | import retrofit2.http.Url; 18 | 19 | /** 20 | * Created by Jeremy on 2017/2/28. 21 | */ 22 | 23 | public interface ApiService { 24 | 25 | /** 26 | * 问题反馈请求 27 | * 28 | * @param feedBack 29 | * @return 30 | */ 31 | @Headers("Accept:application/json") 32 | @POST("/product_feedback.php") 33 | Observable> sendFeedBack(@Body FeedBack feedBack); 34 | 35 | 36 | /** 37 | * 上传数据库备份 38 | * 39 | * @return 40 | */ 41 | @Multipart 42 | @POST("/upload_count.php") 43 | Observable uploadDbBackups(@Part("description") RequestBody description, @Part MultipartBody.Part file); 44 | 45 | 46 | /** 47 | * 下载数据库备份 48 | * 49 | * @return 50 | */ 51 | @Streaming 52 | @GET("/.../db.zip") 53 | Observable downloadDbBackups(); 54 | 55 | /** 56 | * 下载数据库备份 57 | * 58 | * @return 59 | */ 60 | @Streaming 61 | @GET 62 | Observable downloadDbBackups(@Url String fileUrl); 63 | 64 | 65 | /** 66 | * 版本更新信息请求 67 | * 68 | * @return 69 | */ 70 | @GET("/update/update_consumer.json") 71 | Observable getVersionConfig(); 72 | 73 | } 74 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/data/source/remote/webApi/ApiServiceModule.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.data.source.remote.webApi; 2 | 3 | import android.app.Application; 4 | 5 | import com.jeremy.android.consumer.R; 6 | 7 | import java.util.concurrent.TimeUnit; 8 | 9 | import javax.inject.Singleton; 10 | 11 | import dagger.Module; 12 | import dagger.Provides; 13 | import okhttp3.OkHttpClient; 14 | import retrofit2.Retrofit; 15 | import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory; 16 | import retrofit2.converter.gson.GsonConverterFactory; 17 | 18 | /** 19 | * Created by Jeremy on 2017/2/28. 20 | */ 21 | 22 | @Module 23 | public class ApiServiceModule { 24 | 25 | @Singleton 26 | @Provides 27 | OkHttpClient providesOkHttpClient() { 28 | return new OkHttpClient.Builder() 29 | .connectTimeout(60 * 1000, TimeUnit.MILLISECONDS) 30 | .readTimeout(60 * 1000, TimeUnit.MILLISECONDS) 31 | .writeTimeout(60 * 1000, TimeUnit.MILLISECONDS) 32 | .build(); 33 | } 34 | 35 | @Singleton 36 | @Provides 37 | Retrofit providesRetrofit(Application app, OkHttpClient okHttpClient) { 38 | return new Retrofit.Builder() 39 | .baseUrl(app.getString(R.string.service_base_url))//设置服务器路径 40 | .addConverterFactory(GsonConverterFactory.create())//添加转化库,默认是Gson 41 | .addCallAdapterFactory(RxJava2CallAdapterFactory.create())//添加回调库,采用RxJava2 42 | .client(okHttpClient) 43 | .build(); 44 | } 45 | 46 | @Singleton 47 | @Provides 48 | ApiService providesApiService(Retrofit retrofit) { 49 | return retrofit.create(ApiService.class); 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/data/source/remote/webApi/BaseResponse.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.data.source.remote.webApi; 2 | 3 | /** 4 | * Created by Jeremy on 2017/2/28. 5 | */ 6 | 7 | public class BaseResponse { 8 | 9 | private String code; 10 | 11 | private String message; 12 | 13 | private E data; 14 | 15 | public String getCode() { 16 | return code; 17 | } 18 | 19 | public void setCode(String code) { 20 | this.code = code; 21 | } 22 | 23 | public String getMessage() { 24 | return message; 25 | } 26 | 27 | public void setMessage(String message) { 28 | this.message = message; 29 | } 30 | 31 | public E getData() { 32 | return data; 33 | } 34 | 35 | public void setData(E data) { 36 | this.data = data; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/data/source/remote/webApi/WebApiObserver.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.data.source.remote.webApi; 2 | 3 | 4 | import io.reactivex.Observer; 5 | import io.reactivex.disposables.Disposable; 6 | 7 | /** 8 | * Created by Jeremy on 2017/2/28. 9 | */ 10 | 11 | public abstract class WebApiObserver implements Observer> { 12 | 13 | private Disposable mDisposable; 14 | 15 | private static final String API_CODE_SUCCESS = "1"; 16 | 17 | @Override 18 | public void onSubscribe(Disposable d) { 19 | mDisposable = d; 20 | } 21 | 22 | 23 | @Override 24 | public void onNext(BaseResponse t) { 25 | if (t.getCode().equals(API_CODE_SUCCESS)) { 26 | onSuccess(t.getData()); 27 | } else { 28 | onFailed(t.getCode(), t.getMessage()); 29 | } 30 | } 31 | 32 | @Override 33 | public void onError(Throwable error) { 34 | onFailed("", error.getMessage()); 35 | onFinish(); 36 | if (!mDisposable.isDisposed()) { 37 | mDisposable.dispose(); 38 | } 39 | } 40 | 41 | @Override 42 | public void onComplete() { 43 | onFinish(); 44 | if (!mDisposable.isDisposed()) { 45 | mDisposable.dispose(); 46 | } 47 | } 48 | 49 | public abstract void onSuccess(T t); 50 | 51 | public abstract void onFailed(String errorCode, String errorMsg); 52 | 53 | public abstract void onFinish(); 54 | } 55 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/rxbus/RxBus.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.rxbus; 2 | 3 | import java.util.Map; 4 | import java.util.concurrent.ConcurrentHashMap; 5 | 6 | import io.reactivex.BackpressureStrategy; 7 | import io.reactivex.Flowable; 8 | import io.reactivex.processors.FlowableProcessor; 9 | import io.reactivex.processors.PublishProcessor; 10 | 11 | /** 12 | * Created by Jeremy on 2017/3/16. 13 | * 基于RxJava2 14 | */ 15 | public class RxBus { 16 | 17 | private static volatile RxBus mDefaultInstance; 18 | 19 | private final FlowableProcessor _bus = PublishProcessor.create().toSerialized(); 20 | 21 | private final Map, Object> mStickyEventMap = new ConcurrentHashMap<>(); 22 | 23 | private RxBus() { 24 | 25 | } 26 | 27 | public static RxBus get() { 28 | if (mDefaultInstance == null) { 29 | synchronized (RxBus.class) { 30 | if (mDefaultInstance == null) { 31 | mDefaultInstance = new RxBus(); 32 | } 33 | } 34 | } 35 | return mDefaultInstance; 36 | } 37 | 38 | /** 39 | * 判断是否有订阅者 40 | * 41 | * @return 42 | */ 43 | public boolean hasSubscribers() { 44 | return _bus.hasSubscribers(); 45 | } 46 | 47 | /** 48 | * 重置RxBus 49 | */ 50 | public void reset() { 51 | mDefaultInstance = null; 52 | } 53 | 54 | /** 55 | * 发送一个新的事件 56 | * 57 | * @param event 58 | * @return 59 | */ 60 | public RxBus post(Object event) { 61 | _bus.onNext(event); 62 | return this; 63 | } 64 | 65 | /** 66 | * 根据传递的eventType类型返回特定类型(eventType)的被观察者 67 | * 68 | * @param eventType 69 | * @param 70 | * @return 71 | */ 72 | public Flowable toFlowable(Class eventType) { 73 | return _bus.ofType(eventType); 74 | } 75 | 76 | /** 77 | * 发送一个新的粘性事件 78 | * 79 | * @param event 80 | */ 81 | public void postSticky(Object event) { 82 | synchronized (mStickyEventMap) { 83 | mStickyEventMap.put(event.getClass(), event); 84 | } 85 | post(event); 86 | } 87 | 88 | /** 89 | * 根据传递的eventType类型返回特定类型(eventType)的被观察者 90 | * 91 | * @param eventType 92 | * @param 93 | * @return 94 | */ 95 | public Flowable toFlowableSticky(final Class eventType) { 96 | synchronized (mStickyEventMap) { 97 | Flowable flowable = _bus.ofType(eventType); 98 | final Object event = mStickyEventMap.get(eventType); 99 | if (event != null) { 100 | return flowable.mergeWith(Flowable.create(e -> e.onNext(eventType.cast(event)), BackpressureStrategy.DROP)); 101 | } else { 102 | return flowable; 103 | } 104 | } 105 | } 106 | 107 | /** 108 | * 根据eventType获取Stick事件 109 | * 110 | * @param eventType 111 | * @param 112 | * @return 113 | */ 114 | public T getStickyEvent(Class eventType) { 115 | synchronized (mStickyEventMap) { 116 | return eventType.cast(mStickyEventMap.get(eventType)); 117 | } 118 | } 119 | 120 | /** 121 | * 移除指定eventType的Sticky事件 122 | * 123 | * @param eventType 124 | * @param 125 | * @return 126 | */ 127 | public T removeStickyEvent(Class eventType) { 128 | synchronized (mStickyEventMap) { 129 | return eventType.cast(mStickyEventMap.remove(eventType)); 130 | } 131 | } 132 | 133 | /** 134 | * 移除所有的Sticky事件 135 | */ 136 | public void removeAllStickyEvents() { 137 | synchronized (mStickyEventMap) { 138 | mStickyEventMap.clear(); 139 | } 140 | } 141 | } 142 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/rxbus/RxBusModule.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.rxbus; 2 | 3 | 4 | import javax.inject.Singleton; 5 | 6 | import dagger.Module; 7 | import dagger.Provides; 8 | 9 | /** 10 | * Created by Jeremy on 2017/3/10. 11 | */ 12 | @Module 13 | public class RxBusModule { 14 | 15 | @Singleton 16 | @Provides 17 | public RxBus provideRxBus() { 18 | return RxBus.get(); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/rxbus/event/UpdateCardBalance.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.rxbus.event; 2 | 3 | /** 4 | * Created by Jeremy on 2017/3/16. 5 | */ 6 | 7 | public class UpdateCardBalance { 8 | 9 | private float balance; 10 | 11 | public UpdateCardBalance(float balance) { 12 | this.balance = balance; 13 | } 14 | 15 | public float getBalance() { 16 | return balance; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/rxbus/event/UpdateCardPoints.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.rxbus.event; 2 | 3 | /** 4 | * Created by Jeremy on 2017/3/16. 5 | */ 6 | 7 | public class UpdateCardPoints { 8 | 9 | private float points; 10 | 11 | public UpdateCardPoints(float points) { 12 | this.points = points; 13 | } 14 | 15 | public float getPoints() { 16 | return points; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/setting/BomSetting/BomSettingComponent.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.setting.BomSetting; 2 | 3 | import com.jeremy.android.consumer.AppComponent; 4 | import com.jeremy.android.consumer.utils.PerActivityScoped; 5 | 6 | import dagger.Component; 7 | 8 | /** 9 | * Created by Jeremy on 2017/2/17. 10 | */ 11 | 12 | @PerActivityScoped 13 | @Component(dependencies = AppComponent.class, modules = BomSettingPresenterModule.class) 14 | public interface BomSettingComponent { 15 | 16 | void inject(BomSettingActivity activity); 17 | } 18 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/setting/BomSetting/BomSettingContract.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.setting.BomSetting; 2 | 3 | import com.jeremy.android.consumer.BasePresenter; 4 | import com.jeremy.android.consumer.BaseView; 5 | import com.jeremy.android.database.model.Bom; 6 | 7 | import java.util.List; 8 | 9 | /** 10 | * Created by Jeremy on 2017/2/17. 11 | */ 12 | 13 | public class BomSettingContract { 14 | 15 | interface View extends BaseView { 16 | 17 | void showBoms(List boms); 18 | 19 | void showBomAdded(Bom bom); 20 | 21 | void showBomDeleted(Bom bom); 22 | 23 | void showBomEdited(Bom bom, int position); 24 | 25 | void showBomEnableUpdated(Bom bom, int position); 26 | 27 | void showErrorMsg(String msg); 28 | 29 | void hideAddDialog(); 30 | 31 | void hideEditDialog(); 32 | } 33 | 34 | interface Presenter extends BasePresenter { 35 | 36 | void loadBoms(); 37 | 38 | void addBom(String name, String price, String unit, String memo); 39 | 40 | void updateBom(Bom bom, int position, String nameNew, String priceNew, String unitNew, String memoNew); 41 | 42 | void deleteBom(Bom bom); 43 | 44 | void changeBomEnable(Bom bom, int position, boolean isEnable); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/setting/BomSetting/BomSettingPresenterModule.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.setting.BomSetting; 2 | 3 | import com.jeremy.android.database.model.Bom; 4 | 5 | import java.util.ArrayList; 6 | import java.util.List; 7 | 8 | import dagger.Module; 9 | import dagger.Provides; 10 | 11 | /** 12 | * Created by Jeremy on 2017/2/17. 13 | */ 14 | 15 | @Module 16 | public class BomSettingPresenterModule { 17 | 18 | private final BomSettingContract.View view; 19 | 20 | public BomSettingPresenterModule(BomSettingContract.View view) { 21 | this.view = view; 22 | } 23 | 24 | @Provides 25 | public BomSettingContract.View provideBomSettingContractView() { 26 | return this.view; 27 | } 28 | 29 | @Provides 30 | public List provideBomList() { 31 | return new ArrayList<>(); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/setting/SettingComponent.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.setting; 2 | 3 | import com.jeremy.android.consumer.AppComponent; 4 | import com.jeremy.android.consumer.utils.PerActivityScoped; 5 | 6 | import dagger.Component; 7 | 8 | /** 9 | * Created by Jeremy on 2017/2/17. 10 | */ 11 | @PerActivityScoped 12 | @Component(dependencies = AppComponent.class, modules = SettingPresenterModule.class) 13 | public interface SettingComponent { 14 | 15 | void inject(SettingActivity activity); 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/setting/SettingContract.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.setting; 2 | 3 | import com.jeremy.android.consumer.BasePresenter; 4 | import com.jeremy.android.consumer.BaseView; 5 | 6 | /** 7 | * Created by Jeremy on 2017/2/17. 8 | */ 9 | 10 | public class SettingContract { 11 | 12 | interface View extends BaseView { 13 | 14 | void showStoreName(String name); 15 | 16 | void showSmsEnableStatus(boolean status); 17 | 18 | void showRechargeTemplate(String template); 19 | 20 | void showConsumerTemplate(String template); 21 | 22 | void showBomSettingsPage(); 23 | 24 | void showPageMsg(String msg); 25 | 26 | void showCardListPage(); 27 | 28 | void showLoading(String content); 29 | 30 | void hideLoading(); 31 | 32 | } 33 | 34 | interface Presenter extends BasePresenter { 35 | 36 | void openBomSetting(); 37 | 38 | void uploadLocalDatas(); 39 | 40 | void downloadRemoteDatas(); 41 | 42 | void saveSetting(String storeName, boolean smsEnable); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/setting/SettingPresenterModule.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.setting; 2 | 3 | import dagger.Module; 4 | import dagger.Provides; 5 | 6 | /** 7 | * Created by Jeremy on 2017/2/17. 8 | */ 9 | @Module 10 | public class SettingPresenterModule { 11 | 12 | private final SettingContract.View view; 13 | 14 | public SettingPresenterModule(SettingContract.View view) { 15 | this.view = view; 16 | } 17 | 18 | @Provides 19 | public SettingContract.View provideSettingContractView() { 20 | return this.view; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/utils/BroadcastUtils.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.utils; 2 | 3 | import android.content.BroadcastReceiver; 4 | import android.content.Context; 5 | import android.content.Intent; 6 | import android.content.IntentFilter; 7 | import android.os.Bundle; 8 | 9 | import java.util.List; 10 | 11 | /** 12 | * 发送广播的公共单元 13 | */ 14 | 15 | public class BroadcastUtils { 16 | 17 | public static String ACTION_SHOW_VERSION_DIALOG = "action_show_version_dialog"; 18 | 19 | /** 20 | * 注册广播接收器 21 | * 22 | * @param action 23 | * @param receiver 24 | */ 25 | public static void registBroadcastReceiver(Context context, String action, 26 | BroadcastReceiver receiver) { 27 | IntentFilter filter = new IntentFilter(); 28 | filter.addAction(action); 29 | context.registerReceiver(receiver, filter); 30 | } 31 | 32 | /** 33 | * 注册广播接收器 34 | * 35 | * @param actions 36 | * @param receiver 37 | */ 38 | public static void registBroadcastReceiver(Context context, 39 | List actions, BroadcastReceiver receiver) { 40 | IntentFilter filter = new IntentFilter(); 41 | for (String action : actions) 42 | filter.addAction(action); 43 | context.registerReceiver(receiver, filter); 44 | } 45 | 46 | /** 47 | * 注册广播接收 48 | * 49 | * @param actions 50 | * @param receiver 51 | */ 52 | public static void registBroadcastReceiver(Context context, 53 | String[] actions, BroadcastReceiver receiver) { 54 | IntentFilter filter = new IntentFilter(); 55 | for (String action : actions) 56 | filter.addAction(action); 57 | context.registerReceiver(receiver, filter); 58 | } 59 | 60 | /** 61 | * 注销广播接收 62 | * 63 | * @param receiver 64 | */ 65 | public static void unregistBroadcastReceiver(Context context, 66 | BroadcastReceiver receiver) { 67 | context.unregisterReceiver(receiver); 68 | } 69 | 70 | /** 71 | * 发送一个广播消息 72 | * 73 | * @param action 74 | */ 75 | public static void broadcastAction(Context context, String action) { 76 | broadcastAction(context, action, null); 77 | } 78 | 79 | /** 80 | * 发送一个广播消息 81 | * 82 | * @param action 83 | * @param bundle 84 | */ 85 | public static void broadcastAction(Context context, String action, 86 | Bundle bundle) { 87 | Intent mIntent = new Intent(action); 88 | if (bundle != null) 89 | mIntent.putExtras(bundle); 90 | context.sendBroadcast(mIntent); 91 | } 92 | 93 | } 94 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/utils/BundleKeys.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.utils; 2 | 3 | /** 4 | * Created by Jeremy on 2016/4/11 0011. 5 | */ 6 | public class BundleKeys { 7 | public static final String CARD_ID = "card_id"; 8 | public static final String CARD= "card"; 9 | public static final String CARD_ITEM = "card_item"; 10 | public static final String VERSION_CONFIG = "version_config"; 11 | } 12 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/utils/HistoryUtils.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.utils; 2 | 3 | /** 4 | * Created by Administrator on 2016/4/7 0007. 5 | */ 6 | public class HistoryUtils { 7 | 8 | 9 | } 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/utils/JsonUtil.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.utils; 2 | 3 | import android.util.Log; 4 | 5 | import com.google.gson.Gson; 6 | import com.google.gson.JsonObject; 7 | import com.google.gson.reflect.TypeToken; 8 | 9 | import org.json.JSONException; 10 | 11 | import java.lang.reflect.Type; 12 | import java.util.ArrayList; 13 | import java.util.List; 14 | 15 | /** 16 | * Created by Jeremry on 2015/8/12. 17 | */ 18 | public class JsonUtil { 19 | 20 | private final static String TAG = "JsonUtil"; 21 | 22 | /** 23 | * 字符串转化为单个实体对象 24 | * 25 | * @param jsonString 26 | * @param clazz 27 | * @return 28 | * @throws JSONException 29 | */ 30 | public static T Json2Object(String jsonString, Class clazz) 31 | throws JSONException { 32 | 33 | T t; 34 | 35 | try { 36 | Gson gson = new Gson(); 37 | 38 | t = gson.fromJson(jsonString, clazz); 39 | 40 | } catch (Exception e) { 41 | Log.e(TAG, "json解析异常", e); 42 | throw new JSONException(e.getMessage()); 43 | } 44 | return t; 45 | } 46 | 47 | /** 48 | * 字符串转为实体对象List 49 | * 50 | * @param jsonString 51 | * @param classOfT 52 | * @return 53 | */ 54 | public static ArrayList Json2ObjectList(String jsonString, 55 | Class classOfT) { 56 | Type type = new TypeToken>() { 57 | }.getType(); 58 | ArrayList jsonObjs = new Gson().fromJson(jsonString, type); 59 | 60 | ArrayList listOfT = new ArrayList(); 61 | for (JsonObject jsonObj : jsonObjs) { 62 | listOfT.add(new Gson().fromJson(jsonObj, classOfT)); 63 | } 64 | return listOfT; 65 | } 66 | 67 | /** 68 | * 单个实体对象转为Json字符串 69 | * 70 | * @param t 71 | * @return 72 | */ 73 | public static String Object2Json(T t) { 74 | Gson gson = new Gson(); 75 | return gson.toJson(t); 76 | } 77 | 78 | /** 79 | * 实体对象List转为Json字符串 80 | * 81 | * @param t_list 82 | * @return 83 | */ 84 | public static String ObjectList2Json(List t_list) { 85 | Gson gson = new Gson(); 86 | return gson.toJson(t_list); 87 | } 88 | 89 | } 90 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/utils/MD5Utils.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.utils; 2 | 3 | import java.io.UnsupportedEncodingException; 4 | import java.security.MessageDigest; 5 | import java.security.NoSuchAlgorithmException; 6 | 7 | public class MD5Utils { 8 | /** 9 | * 将字符串转成MD5值 10 | * 11 | * @param string 12 | * @return 13 | */ 14 | public static String stringToMD5(String string) { 15 | byte[] hash; 16 | 17 | try { 18 | hash = MessageDigest.getInstance("MD5").digest( 19 | string.getBytes("UTF-8")); 20 | } catch (NoSuchAlgorithmException e) { 21 | e.printStackTrace(); 22 | return null; 23 | } catch (UnsupportedEncodingException e) { 24 | e.printStackTrace(); 25 | return null; 26 | } 27 | 28 | StringBuilder hex = new StringBuilder(hash.length * 2); 29 | for (byte b : hash) { 30 | if ((b & 0xFF) < 0x10) 31 | hex.append("0"); 32 | hex.append(Integer.toHexString(b & 0xFF)); 33 | } 34 | 35 | return hex.substring(8, 24).toString(); 36 | } 37 | } -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/utils/NetworkUtils.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.utils; 2 | 3 | import android.content.Context; 4 | import android.net.ConnectivityManager; 5 | import android.net.NetworkInfo; 6 | import android.telephony.TelephonyManager; 7 | 8 | /** 9 | * 网络工具类 10 | */ 11 | public class NetworkUtils { 12 | 13 | public static final int NETWORK_TYPE_WIFI = 99; 14 | 15 | /** 16 | * wifi状态 开启为true,否则为false 17 | * 18 | * @param context 19 | * @return 20 | */ 21 | public static boolean isWifiActive(Context context) { 22 | ConnectivityManager connectivityManager = (ConnectivityManager) context 23 | .getSystemService(Context.CONNECTIVITY_SERVICE); 24 | NetworkInfo info = connectivityManager.getActiveNetworkInfo(); 25 | if (info != null && info.getType() == ConnectivityManager.TYPE_WIFI) { 26 | return true; 27 | } 28 | return false; 29 | } 30 | 31 | /** 32 | * 判断网络是否可用 33 | * 34 | * @param context 35 | * @return 36 | */ 37 | public static boolean isNetworkAvailable(Context context) { 38 | ConnectivityManager manager = (ConnectivityManager) context 39 | .getSystemService(Context.CONNECTIVITY_SERVICE); 40 | NetworkInfo info = manager.getActiveNetworkInfo(); 41 | return (info != null && info.isAvailable()); 42 | } 43 | 44 | /** 45 | * 判断网络是否连接 46 | * 47 | * @param context 48 | * @return 49 | */ 50 | public static boolean isNetworkConnected(Context context) { 51 | ConnectivityManager connectivityManager = (ConnectivityManager) context 52 | .getSystemService(Context.CONNECTIVITY_SERVICE); 53 | NetworkInfo[] info = connectivityManager.getAllNetworkInfo(); 54 | for (int i = 0; i < info.length; i++) { 55 | if (info[i].getState() == NetworkInfo.State.CONNECTED) { 56 | return true; 57 | } 58 | } 59 | return false; 60 | } 61 | 62 | /** 63 | * 判断是否正在使用GPRS网络 64 | * 65 | * @param context 66 | * @return 67 | */ 68 | public static boolean isMobileConnected(Context context) { 69 | ConnectivityManager connectivityManager = (ConnectivityManager) context 70 | .getSystemService(Context.CONNECTIVITY_SERVICE); 71 | NetworkInfo mobileInfo = connectivityManager 72 | .getNetworkInfo(ConnectivityManager.TYPE_MOBILE); 73 | if (mobileInfo.getState() == NetworkInfo.State.CONNECTED) { 74 | return true; 75 | } 76 | return false; 77 | } 78 | 79 | /** 80 | * 获取当前网络的名字 81 | * 82 | * @param context 83 | * @return 84 | */ 85 | public static String getNetworkName(Context context) { 86 | ConnectivityManager connectivityManager = (ConnectivityManager) context 87 | .getSystemService(Context.CONNECTIVITY_SERVICE); 88 | NetworkInfo info = connectivityManager.getActiveNetworkInfo(); 89 | return info.getTypeName(); 90 | } 91 | 92 | public static int getMobileNetworkType(Context context) { 93 | 94 | ConnectivityManager connectivityManager = (ConnectivityManager) context 95 | .getSystemService(Context.CONNECTIVITY_SERVICE); 96 | 97 | android.net.NetworkInfo ni = connectivityManager.getActiveNetworkInfo(); 98 | if (ni != null) { 99 | if (ConnectivityManager.TYPE_MOBILE == ni.getType()) { 100 | TelephonyManager mTelephonyManager = (TelephonyManager) context 101 | .getSystemService(Context.TELEPHONY_SERVICE); 102 | return mTelephonyManager.getNetworkType(); 103 | } else if (ConnectivityManager.TYPE_WIFI == ni.getType()) { 104 | return NETWORK_TYPE_WIFI; 105 | } 106 | } 107 | 108 | return TelephonyManager.NETWORK_TYPE_UNKNOWN; 109 | } 110 | } 111 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/utils/PerActivityScoped.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.utils; 2 | 3 | import java.lang.annotation.Documented; 4 | import java.lang.annotation.Retention; 5 | 6 | import javax.inject.Scope; 7 | 8 | import static java.lang.annotation.RetentionPolicy.RUNTIME; 9 | 10 | /** 11 | * Created by Jeremy on 2017/1/25. 12 | */ 13 | 14 | @Scope 15 | @Documented 16 | @Retention(RUNTIME) 17 | public @interface PerActivityScoped { 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/utils/PerAppScoped.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.utils; 2 | 3 | import java.lang.annotation.Documented; 4 | import java.lang.annotation.Retention; 5 | 6 | import javax.inject.Scope; 7 | 8 | import static java.lang.annotation.RetentionPolicy.RUNTIME; 9 | 10 | /** 11 | * Created by Jeremy on 2017/3/1. 12 | */ 13 | @Scope 14 | @Documented 15 | @Retention(RUNTIME) 16 | public @interface PerAppScoped { 17 | } 18 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/utils/PerFragmentScoped.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.utils; 2 | 3 | import java.lang.annotation.Documented; 4 | import java.lang.annotation.Retention; 5 | 6 | import javax.inject.Scope; 7 | 8 | import static java.lang.annotation.RetentionPolicy.RUNTIME; 9 | 10 | /** 11 | * Created by Jeremy on 2017/1/25. 12 | */ 13 | 14 | @Scope 15 | @Documented 16 | @Retention(RUNTIME) 17 | public @interface PerFragmentScoped { 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/utils/PreferencesUtils.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.utils; 2 | 3 | import android.content.Context; 4 | import android.content.SharedPreferences; 5 | 6 | /** 7 | * Created by Jeremy on 2016/4/5. 8 | */ 9 | public class PreferencesUtils { 10 | 11 | /** 12 | * 保存在手机里面的文件名 13 | */ 14 | private static final String FILE_NAME = "setting"; 15 | 16 | 17 | private volatile static PreferencesUtils instance; 18 | private volatile static SharedPreferences myPreference; 19 | private volatile static SharedPreferences.Editor myPreferenceEditor; 20 | 21 | public static PreferencesUtils getInstance(Context ctx) { 22 | if (instance == null) { 23 | synchronized (PreferencesUtils.class) { 24 | if (instance == null) { // 第二次检查 25 | instance = new PreferencesUtils(); 26 | myPreference = ctx.getApplicationContext().getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE); 27 | myPreferenceEditor = myPreference.edit(); 28 | } 29 | } 30 | } 31 | return instance; 32 | } 33 | 34 | /** 35 | * 获取店铺名称 36 | * 37 | * @return 38 | */ 39 | public String getStoreName(Context context) { 40 | return myPreference.getString("storeName", VersionUtils.getAppName(context)); 41 | } 42 | 43 | /** 44 | * 设置店铺名称 45 | * 46 | * @param storeName 47 | */ 48 | public void setStoreName(String storeName) { 49 | myPreferenceEditor.putString("storeName", storeName); 50 | myPreferenceEditor.commit(); 51 | } 52 | 53 | /** 54 | * 获取短信通知开关 55 | * 56 | * @return 57 | */ 58 | public boolean getSMSEnable() { 59 | return myPreference.getBoolean("smsEnable", true); 60 | } 61 | 62 | /** 63 | * 设置短信通知开关 64 | * 65 | * @param enable 66 | */ 67 | public void setSMSEnable(boolean enable) { 68 | myPreferenceEditor.putBoolean("smsEnable", enable); 69 | myPreferenceEditor.commit(); 70 | } 71 | 72 | /** 73 | * 获取广告关闭按钮显示状态 74 | * 75 | * @return 76 | */ 77 | public boolean getAdCloseBtnShow() { 78 | return myPreference.getBoolean("adCloseBtnShow", true); 79 | } 80 | 81 | /** 82 | * 设置广告关闭按钮显示状态 83 | * 84 | * @param show 85 | */ 86 | public void setAdCloseBtnShowe(boolean show) { 87 | myPreferenceEditor.putBoolean("adCloseBtnShow", show); 88 | myPreferenceEditor.commit(); 89 | } 90 | 91 | 92 | /** 93 | * 获取IMEI号 94 | * 95 | * @return 96 | */ 97 | public String getImei() { 98 | return myPreference.getString("imei", ""); 99 | } 100 | 101 | /** 102 | * 设置IMEI号 103 | * 104 | * @param imei 105 | */ 106 | public void setImei(String imei) { 107 | myPreferenceEditor.putString("imei", imei); 108 | myPreferenceEditor.commit(); 109 | } 110 | 111 | 112 | } 113 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/utils/RequestCode.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.utils; 2 | 3 | /** 4 | * Created by Administrator on 2016/4/13 0013. 5 | */ 6 | public class RequestCode { 7 | public static final int CODE_ADD_CARD = 100; 8 | public static final int CODE_SETTING = 101; 9 | public static final int CODE_ABOUT = 102; 10 | public static final int CODE_CARD_DETAIL = 103; 11 | public static final int CODE_BOM_SETTING = 104; 12 | } 13 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/utils/SmsUtils.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.utils; 2 | 3 | import android.content.Context; 4 | import android.telephony.SmsManager; 5 | 6 | import com.jeremy.android.consumer.R; 7 | import com.jeremy.android.database.model.Card; 8 | import com.jeremy.android.database.model.Recharge; 9 | 10 | import java.util.ArrayList; 11 | 12 | /** 13 | * Created by Jeremy on 2016/4/7 0007. 14 | */ 15 | public class SmsUtils { 16 | 17 | public static String getRechargeSmsTemplate(Context ctx) { 18 | return "尊敬的" + ctx.getString(R.string.sms_key_user_name) + ",您的【" + ctx.getString(R.string.sms_key_card_no) + "】号会员卡,于" + ctx.getString(R.string.sms_key_current_time) + "成功充值" + ctx.getString(R.string.sms_key_price) + "元,所剩余额为" + ctx.getString(R.string.sms_key_balance) + "元。" + ctx.getString(R.string.sms_key_store_name); 19 | } 20 | 21 | public static String getConsumeSmsTemplate(Context ctx) { 22 | return "尊敬的" + ctx.getString(R.string.sms_key_user_name) + ",您的【" + ctx.getString(R.string.sms_key_card_no) + "】号会员卡,于" + ctx.getString(R.string.sms_key_current_time) + "成功消费" + ctx.getString(R.string.sms_key_price) + "元,所剩余额为" + ctx.getString(R.string.sms_key_balance) + "元。" + ctx.getString(R.string.sms_key_store_name); 23 | } 24 | 25 | public static void sendRechargeSms(Context ctx, Card card, Recharge recharge) { 26 | String template = getRechargeSmsTemplate(ctx); 27 | template = template.replace(ctx.getString(R.string.sms_key_user_name), card.userName); 28 | template = template.replace(ctx.getString(R.string.sms_key_card_no), card.cardNo); 29 | template = template.replace(ctx.getString(R.string.sms_key_current_time), TimeUtils.getFormatByTimeStamp(recharge.chargeTime)); 30 | template = template.replace(ctx.getString(R.string.sms_key_price), recharge.chargeMoney + ""); 31 | template = template.replace(ctx.getString(R.string.sms_key_balance), card.cardBalance + ""); 32 | template = template.replace(ctx.getString(R.string.sms_key_store_name), PreferencesUtils.getInstance(ctx).getStoreName(ctx)); 33 | template = template + "-" + VersionUtils.getAppName(ctx); 34 | 35 | sendSMS(card.userPhone, template); 36 | } 37 | 38 | public static void sendConsumeSms(Context ctx, Card card, long consumeTime, float payMoney) { 39 | String template = getConsumeSmsTemplate(ctx); 40 | template = template.replace(ctx.getString(R.string.sms_key_user_name), card.userName); 41 | template = template.replace(ctx.getString(R.string.sms_key_card_no), card.cardNo); 42 | template = template.replace(ctx.getString(R.string.sms_key_current_time), TimeUtils.getFormatByTimeStamp(consumeTime)); 43 | template = template.replace(ctx.getString(R.string.sms_key_price), payMoney + ""); 44 | template = template.replace(ctx.getString(R.string.sms_key_balance), card.cardBalance + ""); 45 | template = template.replace(ctx.getString(R.string.sms_key_store_name), PreferencesUtils.getInstance(ctx).getStoreName(ctx)); 46 | template = template + "-" + VersionUtils.getAppName(ctx); 47 | 48 | sendSMS(card.userPhone, template); 49 | } 50 | 51 | private static void sendSMS(String phone, String content) { 52 | SmsManager manager = SmsManager.getDefault(); 53 | if (content.length() > 70) { 54 | ArrayList list = manager.divideMessage(content); 55 | manager.sendMultipartTextMessage(phone, null, list, null, null); 56 | } else { 57 | manager.sendTextMessage(phone, null, content, null, null); 58 | } 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/utils/TimeUtils.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.utils; 2 | 3 | import java.text.SimpleDateFormat; 4 | import java.util.Date; 5 | 6 | /** 7 | * Created by Jeremy on 2016/4/6. 8 | */ 9 | public class TimeUtils { 10 | 11 | private static final String TIMESTAMP_FORMAT = "yyyy-MM-dd HH:mm:ss"; 12 | 13 | private static final String TIMESTAMP_DATE_FORMAT = "yyyy-MM-dd"; 14 | 15 | public static String getFormatByTimeStamp(Long timestamp) { 16 | return new SimpleDateFormat(TIMESTAMP_FORMAT).format(new Date( 17 | timestamp)); 18 | } 19 | 20 | public static String getDateFormatByTimeStamp(Long timestamp) { 21 | return new SimpleDateFormat(TIMESTAMP_DATE_FORMAT).format(new Date( 22 | timestamp)); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/utils/Utility.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.utils; 2 | 3 | import java.io.IOException; 4 | import java.io.InputStream; 5 | 6 | public class Utility { 7 | 8 | public static String inputStream2String(InputStream in) throws IOException { 9 | StringBuffer out = new StringBuffer(); 10 | byte[] b = new byte[4096]; 11 | for (int n; (n = in.read(b)) != -1; ) { 12 | out.append(new String(b, 0, n)); 13 | } 14 | in.close(); 15 | return out.toString(); 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/utils/VersionUtils.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.utils; 2 | 3 | import android.content.Context; 4 | import android.content.pm.PackageInfo; 5 | import android.content.pm.PackageManager; 6 | 7 | import com.jeremy.android.consumer.data.bean.VersionConfig; 8 | 9 | /** 10 | * Created by Jeremy on 2016/3/28. 11 | */ 12 | public class VersionUtils { 13 | 14 | public static String getAppName(Context mContext) { 15 | String appName = ""; 16 | PackageInfo pkg; 17 | try { 18 | pkg = mContext.getPackageManager().getPackageInfo( 19 | mContext.getApplicationContext().getPackageName(), 0); 20 | appName = pkg.applicationInfo.loadLabel( 21 | mContext.getPackageManager()).toString(); 22 | } catch (PackageManager.NameNotFoundException e) { 23 | e.printStackTrace(); 24 | } 25 | return appName; 26 | } 27 | 28 | public static String getVersionName(Context mContext) { 29 | String versionName = ""; 30 | PackageInfo pkg; 31 | try { 32 | pkg = mContext.getPackageManager().getPackageInfo( 33 | mContext.getApplicationContext().getPackageName(), 0); 34 | versionName = pkg.versionName; 35 | } catch (PackageManager.NameNotFoundException e) { 36 | e.printStackTrace(); 37 | } 38 | return "v " + versionName; 39 | } 40 | 41 | public static String getAppAndVersionName(Context mContext) { 42 | return getAppName(mContext) + "(" + getVersionName(mContext) + ")"; 43 | } 44 | 45 | public static final boolean isNewVersion(Context context, VersionConfig config) { 46 | if (config != null) { 47 | PackageManager pm = context.getPackageManager(); 48 | try { 49 | PackageInfo info = pm.getPackageInfo(context.getPackageName(), 0); 50 | String currentVersionName = info.versionName; 51 | String newVersionName = config.getVerName(); 52 | String configVersion[] = newVersionName.split("[.]"); 53 | String currentVersion[] = currentVersionName.split("[.]"); 54 | int minLength = configVersion.length < currentVersion.length ? configVersion.length : currentVersion.length; 55 | for (int i = 0; i < minLength; i++) { 56 | int cv = Integer.parseInt(configVersion[i]); 57 | int av = Integer.parseInt(currentVersion[i]); 58 | if (cv > av) { 59 | return true; 60 | } else if (cv < av) { 61 | return false; 62 | } 63 | } 64 | return configVersion.length > currentVersion.length ? true : false; 65 | } catch (PackageManager.NameNotFoundException e) { 66 | e.printStackTrace(); 67 | } 68 | } 69 | return false; 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/view/AddAndSubView.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.view; 2 | 3 | import android.content.Context; 4 | import android.text.TextWatcher; 5 | import android.util.AttributeSet; 6 | import android.view.LayoutInflater; 7 | import android.view.View; 8 | import android.widget.Button; 9 | import android.widget.EditText; 10 | import android.widget.LinearLayout; 11 | 12 | import com.jeremy.android.consumer.R; 13 | 14 | import butterknife.ButterKnife; 15 | 16 | /** 17 | * Created by Jeremy on 2016/4/20 0020. 18 | */ 19 | public class AddAndSubView extends LinearLayout { 20 | 21 | private EditText edtCount; 22 | private Button btnAdd; 23 | private Button btnReduce; 24 | 25 | public AddAndSubView(Context context) { 26 | this(context, null); 27 | } 28 | 29 | public AddAndSubView(Context context, AttributeSet attrs) { 30 | this(context, attrs, 0); 31 | } 32 | 33 | public AddAndSubView(Context context, AttributeSet attrs, int defStyleAttr) { 34 | super(context, attrs, defStyleAttr); 35 | init(context); 36 | } 37 | 38 | private void init(Context context) { 39 | View v = LayoutInflater.from(context).inflate(R.layout.view_add_sub, this); 40 | edtCount = ButterKnife.findById(v, R.id.edt_count); 41 | btnAdd = ButterKnife.findById(v, R.id.btn_add); 42 | btnReduce = ButterKnife.findById(v, R.id.btn_sub); 43 | 44 | btnAdd.setOnClickListener(new OnClickListener() { 45 | @Override 46 | public void onClick(View v) { 47 | int count = Integer.valueOf(edtCount.getText().toString()); 48 | if (count < 99999999) { 49 | count++; 50 | edtCount.setText(count + ""); 51 | } 52 | } 53 | }); 54 | 55 | btnReduce.setOnClickListener(new OnClickListener() { 56 | @Override 57 | public void onClick(View v) { 58 | int count = Integer.valueOf(edtCount.getText().toString()); 59 | if (count > 1) { 60 | count--; 61 | edtCount.setText(count + ""); 62 | } 63 | } 64 | }); 65 | } 66 | 67 | public void setEdtCount(int count) { 68 | edtCount.setText(count + ""); 69 | } 70 | 71 | public void setEdtSelection(int i) { 72 | edtCount.setSelection(i); 73 | } 74 | 75 | public void addTextChangedListener(TextWatcher textWatcher) { 76 | edtCount.addTextChangedListener(textWatcher); 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/view/CardItemView.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.view; 2 | 3 | import android.content.Context; 4 | import android.util.AttributeSet; 5 | import android.view.LayoutInflater; 6 | import android.widget.ImageView; 7 | import android.widget.LinearLayout; 8 | import android.widget.TextView; 9 | 10 | import com.jeremy.android.consumer.R; 11 | import com.jeremy.android.consumer.data.bean.CardItem; 12 | import com.jeremy.android.consumer.utils.TimeUtils; 13 | 14 | /** 15 | * 用户卡片布局 16 | */ 17 | public class CardItemView extends LinearLayout { 18 | 19 | private TextView tvCardNo, tvUserName, tvUserPhone, tvCardExpired; 20 | private ImageView imgDelete; 21 | 22 | public CardItemView(Context context) { 23 | this(context, null); 24 | } 25 | 26 | public CardItemView(Context context, AttributeSet attrs) { 27 | this(context, attrs, 0); 28 | } 29 | 30 | public CardItemView(Context context, AttributeSet attrs, int defStyle) { 31 | super(context, attrs, defStyle); 32 | init(context); 33 | } 34 | 35 | private void init(Context context) { 36 | LayoutInflater.from(context).inflate(R.layout.view_item_card, this); 37 | tvUserName = (TextView) findViewById(R.id.tv_user_name); 38 | tvUserPhone = (TextView) findViewById(R.id.tv_user_phone); 39 | tvCardNo = (TextView) findViewById(R.id.tv_card_no); 40 | tvCardExpired = (TextView) findViewById(R.id.tv_card_expired); 41 | imgDelete = (ImageView) findViewById(R.id.img_delete); 42 | } 43 | 44 | public ImageView getImgDelete() { 45 | return this.imgDelete; 46 | } 47 | 48 | public void setCardInfo(CardItem item) { 49 | tvUserName.setText(item.getUserName()); 50 | tvUserPhone.setText(item.getUserPhone()); 51 | tvCardNo.setText(item.getCardNo()); 52 | tvCardExpired.setText(TimeUtils.getDateFormatByTimeStamp(item.getCardExpired())); 53 | if (item.isShowDeletes()) { 54 | imgDelete.setVisibility(VISIBLE); 55 | } else { 56 | imgDelete.setVisibility(GONE); 57 | } 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/view/MoneyTextWatcher.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.view; 2 | 3 | 4 | import android.text.Editable; 5 | import android.text.TextWatcher; 6 | import android.widget.EditText; 7 | 8 | /** 9 | * Created by Jeremy on 2016/4/13 0013. 10 | */ 11 | public class MoneyTextWatcher implements TextWatcher { 12 | 13 | private EditText editText; 14 | 15 | public MoneyTextWatcher(EditText editText) { 16 | this.editText = editText; 17 | } 18 | 19 | @Override 20 | public void onTextChanged(CharSequence s, int start, int before, 21 | int count) { 22 | if (s.length() == 0) { 23 | editText.setText(0.0 + ""); 24 | return; 25 | } 26 | if (s.toString().equals("0.0")) { 27 | editText.setSelection(s.length()); 28 | return; 29 | } 30 | if (s.toString().length() == 4 && s.toString().startsWith("0.0")) { 31 | s.toString().replace("0.0", ""); 32 | editText.setText(s.subSequence(3, 4)); 33 | editText.setSelection(1); 34 | return; 35 | } 36 | if (s.toString().length() == 4 && s.toString().endsWith("0.0") && editText.getSelectionStart() == 1) { 37 | s.toString().replace("0.0", ""); 38 | editText.setText(s.subSequence(0, 1)); 39 | editText.setSelection(1); 40 | return; 41 | } 42 | if (s.toString().contains(".")) { 43 | if (s.length() - 1 - s.toString().indexOf(".") > 1) { 44 | s = s.toString().subSequence(0, 45 | s.toString().indexOf(".") + 2); 46 | editText.setText(s); 47 | editText.setSelection(s.length()); 48 | } 49 | } 50 | if (s.toString().trim().substring(0).equals(".")) { 51 | s = "0" + s; 52 | editText.setText(s); 53 | editText.setSelection(2); 54 | } 55 | if (s.toString().startsWith("0") && s.toString().trim().length() > 1) { 56 | if (!s.toString().substring(1, 2).equals(".")) { 57 | editText.setText(s.subSequence(1, s.toString().trim().length())); 58 | editText.setSelection(1); 59 | return; 60 | } 61 | } 62 | } 63 | 64 | @Override 65 | public void beforeTextChanged(CharSequence s, int start, int count, int after) { 66 | } 67 | 68 | @Override 69 | public void afterTextChanged(Editable s) { 70 | 71 | } 72 | } -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/view/XEditText.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.view; 2 | 3 | import android.content.Context; 4 | import android.graphics.drawable.Drawable; 5 | import android.util.AttributeSet; 6 | import android.view.MotionEvent; 7 | import android.view.View; 8 | import android.widget.AutoCompleteTextView; 9 | 10 | 11 | /** 12 | * TODO: document your custom view class. 13 | */ 14 | public class XEditText extends AutoCompleteTextView { 15 | 16 | private DrawableLeftListener mLeftListener; 17 | private DrawableRightListener mRightListener; 18 | 19 | final int DRAWABLE_LEFT = 0; 20 | final int DRAWABLE_RIGHT = 2; 21 | 22 | 23 | public XEditText(Context context, AttributeSet attrs, int defStyleAttr) { 24 | super(context, attrs, defStyleAttr); 25 | } 26 | 27 | public XEditText(Context context, AttributeSet attrs) { 28 | super(context, attrs); 29 | } 30 | 31 | public XEditText(Context context) { 32 | super(context); 33 | } 34 | 35 | public void setDrawableLeftListener(DrawableLeftListener listener) { 36 | this.mLeftListener = listener; 37 | } 38 | 39 | public void setDrawableRightListener(DrawableRightListener listener) { 40 | this.mRightListener = listener; 41 | } 42 | 43 | public interface DrawableLeftListener { 44 | void onDrawableLeftClick(View view); 45 | } 46 | 47 | public interface DrawableRightListener { 48 | void onDrawableRightClick(View view); 49 | } 50 | 51 | @Override 52 | public boolean onTouchEvent(MotionEvent event) { 53 | switch (event.getAction()) { 54 | case MotionEvent.ACTION_UP: 55 | if (mLeftListener != null) { 56 | Drawable drawableLeft = getCompoundDrawables()[DRAWABLE_LEFT]; 57 | if (drawableLeft != null && event.getRawX() <= (getLeft() + drawableLeft.getBounds().width())) { 58 | mLeftListener.onDrawableLeftClick(this); 59 | event.setAction(MotionEvent.ACTION_CANCEL); 60 | requestFocus(); 61 | } 62 | } 63 | Drawable drawableRight = getCompoundDrawables()[DRAWABLE_RIGHT]; 64 | if (drawableRight != null && event.getRawX() >= (getRight() - drawableRight.getBounds().width())) { 65 | setText(""); 66 | if (mRightListener != null) { 67 | mRightListener.onDrawableRightClick(this); 68 | } 69 | event.setAction(MotionEvent.ACTION_CANCEL); 70 | requestFocus(); 71 | } 72 | break; 73 | } 74 | 75 | return super.onTouchEvent(event); 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeremy/android/consumer/welcome/WelcomeActivity.java: -------------------------------------------------------------------------------- 1 | package com.jeremy.android.consumer.welcome; 2 | 3 | import android.content.Intent; 4 | import android.os.Bundle; 5 | import android.widget.TextView; 6 | 7 | import com.jeremy.android.consumer.R; 8 | import com.jeremy.android.consumer.base.BaseActivity; 9 | import com.jeremy.android.consumer.cards.CardsActivity; 10 | import com.jeremy.android.consumer.utils.VersionUtils; 11 | import com.trello.rxlifecycle2.android.ActivityEvent; 12 | 13 | import java.util.concurrent.TimeUnit; 14 | 15 | import butterknife.BindView; 16 | import butterknife.ButterKnife; 17 | import io.reactivex.Flowable; 18 | 19 | public class WelcomeActivity extends BaseActivity { 20 | 21 | @BindView(R.id.tv_app_name) 22 | TextView tvAppName; 23 | 24 | @BindView(R.id.tv_version) 25 | TextView tvVersion; 26 | 27 | @Override 28 | protected void onCreate(Bundle savedInstanceState) { 29 | super.onCreate(savedInstanceState); 30 | setContentView(R.layout.activity_welcome); 31 | ButterKnife.bind(this); 32 | 33 | String appName = VersionUtils.getAppName(this); 34 | String version = VersionUtils.getVersionName(this); 35 | 36 | tvAppName.setText(appName); 37 | tvVersion.setText(version); 38 | 39 | Flowable.timer(3000, TimeUnit.MILLISECONDS) 40 | .compose(bindUntilEvent(ActivityEvent.DESTROY)) 41 | .subscribe(o -> { 42 | goMainActivity(); 43 | }); 44 | 45 | } 46 | 47 | private void goMainActivity() { 48 | Intent intent = new Intent(WelcomeActivity.this, CardsActivity.class); 49 | startActivity(intent); 50 | finish(); 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /app/src/main/res/anim/activity_slide_in_left.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/anim/activity_slide_in_right.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/anim/activity_slide_out_left.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/anim/activity_slide_out_right.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/anim/popmenu_hide.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/anim/popmenu_show.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 12 | 13 | 14 | 28 | 29 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_about_black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeremyLam1/Consumer/6b02721a15b550709bc06a79955a9da723a70443/app/src/main/res/drawable-hdpi/ic_about_black.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_menu_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeremyLam1/Consumer/6b02721a15b550709bc06a79955a9da723a70443/app/src/main/res/drawable-hdpi/ic_menu_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_search_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeremyLam1/Consumer/6b02721a15b550709bc06a79955a9da723a70443/app/src/main/res/drawable-hdpi/ic_search_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_setting_black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeremyLam1/Consumer/6b02721a15b550709bc06a79955a9da723a70443/app/src/main/res/drawable-hdpi/ic_setting_black.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_share_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeremyLam1/Consumer/6b02721a15b550709bc06a79955a9da723a70443/app/src/main/res/drawable-hdpi/ic_share_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_about_black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeremyLam1/Consumer/6b02721a15b550709bc06a79955a9da723a70443/app/src/main/res/drawable-mdpi/ic_about_black.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_menu_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeremyLam1/Consumer/6b02721a15b550709bc06a79955a9da723a70443/app/src/main/res/drawable-mdpi/ic_menu_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_search_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeremyLam1/Consumer/6b02721a15b550709bc06a79955a9da723a70443/app/src/main/res/drawable-mdpi/ic_search_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_setting_black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeremyLam1/Consumer/6b02721a15b550709bc06a79955a9da723a70443/app/src/main/res/drawable-mdpi/ic_setting_black.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_share_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeremyLam1/Consumer/6b02721a15b550709bc06a79955a9da723a70443/app/src/main/res/drawable-mdpi/ic_share_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/app_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeremyLam1/Consumer/6b02721a15b550709bc06a79955a9da723a70443/app/src/main/res/drawable-xhdpi/app_logo.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_about_black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeremyLam1/Consumer/6b02721a15b550709bc06a79955a9da723a70443/app/src/main/res/drawable-xhdpi/ic_about_black.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_add_black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeremyLam1/Consumer/6b02721a15b550709bc06a79955a9da723a70443/app/src/main/res/drawable-xhdpi/ic_add_black.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_add_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeremyLam1/Consumer/6b02721a15b550709bc06a79955a9da723a70443/app/src/main/res/drawable-xhdpi/ic_add_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeremyLam1/Consumer/6b02721a15b550709bc06a79955a9da723a70443/app/src/main/res/drawable-xhdpi/ic_back.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_card_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeremyLam1/Consumer/6b02721a15b550709bc06a79955a9da723a70443/app/src/main/res/drawable-xhdpi/ic_card_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_clear_black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeremyLam1/Consumer/6b02721a15b550709bc06a79955a9da723a70443/app/src/main/res/drawable-xhdpi/ic_clear_black.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_cloud_download_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeremyLam1/Consumer/6b02721a15b550709bc06a79955a9da723a70443/app/src/main/res/drawable-xhdpi/ic_cloud_download_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_cloud_upload_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeremyLam1/Consumer/6b02721a15b550709bc06a79955a9da723a70443/app/src/main/res/drawable-xhdpi/ic_cloud_upload_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_delete_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeremyLam1/Consumer/6b02721a15b550709bc06a79955a9da723a70443/app/src/main/res/drawable-xhdpi/ic_delete_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_delete_white2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeremyLam1/Consumer/6b02721a15b550709bc06a79955a9da723a70443/app/src/main/res/drawable-xhdpi/ic_delete_white2.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_edit_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeremyLam1/Consumer/6b02721a15b550709bc06a79955a9da723a70443/app/src/main/res/drawable-xhdpi/ic_edit_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_expired_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeremyLam1/Consumer/6b02721a15b550709bc06a79955a9da723a70443/app/src/main/res/drawable-xhdpi/ic_expired_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_eyes_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeremyLam1/Consumer/6b02721a15b550709bc06a79955a9da723a70443/app/src/main/res/drawable-xhdpi/ic_eyes_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_help_black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeremyLam1/Consumer/6b02721a15b550709bc06a79955a9da723a70443/app/src/main/res/drawable-xhdpi/ic_help_black.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_home_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeremyLam1/Consumer/6b02721a15b550709bc06a79955a9da723a70443/app/src/main/res/drawable-xhdpi/ic_home_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_menu_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeremyLam1/Consumer/6b02721a15b550709bc06a79955a9da723a70443/app/src/main/res/drawable-xhdpi/ic_menu_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_more_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeremyLam1/Consumer/6b02721a15b550709bc06a79955a9da723a70443/app/src/main/res/drawable-xhdpi/ic_more_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_phone_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeremyLam1/Consumer/6b02721a15b550709bc06a79955a9da723a70443/app/src/main/res/drawable-xhdpi/ic_phone_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_save_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeremyLam1/Consumer/6b02721a15b550709bc06a79955a9da723a70443/app/src/main/res/drawable-xhdpi/ic_save_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeremyLam1/Consumer/6b02721a15b550709bc06a79955a9da723a70443/app/src/main/res/drawable-xhdpi/ic_search.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_search_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeremyLam1/Consumer/6b02721a15b550709bc06a79955a9da723a70443/app/src/main/res/drawable-xhdpi/ic_search_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_setting_black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeremyLam1/Consumer/6b02721a15b550709bc06a79955a9da723a70443/app/src/main/res/drawable-xhdpi/ic_setting_black.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_share_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeremyLam1/Consumer/6b02721a15b550709bc06a79955a9da723a70443/app/src/main/res/drawable-xhdpi/ic_share_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_sub_black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeremyLam1/Consumer/6b02721a15b550709bc06a79955a9da723a70443/app/src/main/res/drawable-xhdpi/ic_sub_black.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_tab_main_clicked.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeremyLam1/Consumer/6b02721a15b550709bc06a79955a9da723a70443/app/src/main/res/drawable-xhdpi/ic_tab_main_clicked.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_user_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeremyLam1/Consumer/6b02721a15b550709bc06a79955a9da723a70443/app/src/main/res/drawable-xhdpi/ic_user_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_about_black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeremyLam1/Consumer/6b02721a15b550709bc06a79955a9da723a70443/app/src/main/res/drawable-xxhdpi/ic_about_black.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_menu_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeremyLam1/Consumer/6b02721a15b550709bc06a79955a9da723a70443/app/src/main/res/drawable-xxhdpi/ic_menu_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_search_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeremyLam1/Consumer/6b02721a15b550709bc06a79955a9da723a70443/app/src/main/res/drawable-xxhdpi/ic_search_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_setting_black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeremyLam1/Consumer/6b02721a15b550709bc06a79955a9da723a70443/app/src/main/res/drawable-xxhdpi/ic_setting_black.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_share_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeremyLam1/Consumer/6b02721a15b550709bc06a79955a9da723a70443/app/src/main/res/drawable-xxhdpi/ic_share_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/cursor_blue.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/cursor_white.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/dark_bg_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/delete_btn_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/selector_btn_green_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/selector_light_blue_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/selector_light_gray_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/selector_radio_btn.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/selector_white_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/shape_border.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 9 | 10 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/tab_bg_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/tab_white_stoke_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/transparent_bg_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/transparent_border_bg_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/transparent_full_round_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/white_full_round_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/white_stoke_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_card_detail.xml: -------------------------------------------------------------------------------- 1 | 2 | 12 | 13 | 20 | 21 | 30 | 31 | 32 | 33 | 39 | 40 | 52 | 53 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 9 | 10 | 19 | 20 | 27 | 28 | 33 | 34 | 35 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_welcome.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 16 | 17 | 22 | 23 | 35 | 36 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /app/src/main/res/layout/dialog_bom_list.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/layout/dialog_record_recharge_detail.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 11 | 12 | 20 | 21 | 30 | 31 | 32 | 33 | 36 | 37 | 45 | 46 | 55 | 56 | 57 | 58 | 61 | 62 | 70 | 71 | 80 | 81 | 82 | 83 | 86 | 87 | 95 | 96 | 105 | 106 | 107 | 108 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_consumption_record.xml: -------------------------------------------------------------------------------- 1 | 8 | 9 | 13 | 14 | 19 | 20 | 30 | 31 | 35 | 36 | 45 | 46 | 50 | 51 | 61 | 62 | 63 | 69 | 70 | 71 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_recharge_record.xml: -------------------------------------------------------------------------------- 1 | 8 | 9 | 13 | 14 | 19 | 20 | 30 | 31 | 35 | 36 | 44 | 45 | 49 | 50 | 60 | 61 | 62 | 68 | 69 | 70 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_bom_add.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 16 | 17 | 21 | 22 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_bom_dialog.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 12 | 13 | 17 | 18 | 28 | 29 | 33 | 34 | 42 | 43 | 47 | 48 | 57 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_bom_selected.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 17 | 18 | 22 | 23 | 31 | 32 | 36 | 37 | 46 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_bom_setting.xml: -------------------------------------------------------------------------------- 1 | 8 | 9 | 13 | 14 | 18 | 19 | 26 | 27 | 31 | 32 | 42 | 43 | 47 | 48 | 56 | 57 | 61 | 62 | 71 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_card_add.xml: -------------------------------------------------------------------------------- 1 | 9 | 10 | 17 | 18 | 22 | 23 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_consumption_record.xml: -------------------------------------------------------------------------------- 1 | 8 | 9 | 20 | 21 | 25 | 26 | 35 | 36 | 40 | 41 | 52 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_layout_carditemview.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_recharge_record.xml: -------------------------------------------------------------------------------- 1 | 8 | 9 | 20 | 21 | 25 | 26 | 35 | 36 | 40 | 41 | 52 | -------------------------------------------------------------------------------- /app/src/main/res/layout/view_add_sub.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 |