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