package com.anthony.library;
import android.content.Context;
import android.content.Intent;
import com.anthony.library.data.EventPosterHelper;
import com.anthony.library.data.HttpHelper;
import com.anthony.library.data.PreferencesHelper;
import com.anthony.library.data.DatabaseHelper;
import com.anthony.library.data.download.DownloadEvent;
import com.anthony.library.data.download.DownloadFinishEvent;
import com.anthony.library.data.download.DownloadService;
import com.anthony.library.data.event.UploadEvent;
import com.anthony.library.data.event.UploadFinishEvent;
import com.anthony.library.data.net.RemoteApi;
import com.anthony.library.data.upload.UploadParam;
import com.anthony.library.data.upload.UploadService;
import com.anthony.library.utils.FileUtil;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Map;
import okhttp3.ResponseBody;
import rx.Observable;
import rx.exceptions.Exceptions;
import rx.functions.Action0;
import rx.functions.Func1;
/**
* Created by Anthony on 2016/6/12.
* Class Note:
* data entrance of all kinds of data
* using {@link HttpHelper},{@link PreferencesHelper},
* {@link EventPosterHelper} ,
* {@link DatabaseHelper}
* and {@link RxBus} to access data
* <p>
* 所有数据的入口类
*/
public class BaseDataRepository {
HttpHelper mHttpHelper;
PreferencesHelper mPreferencesHelper;
EventPosterHelper mEventPoster; //otto
DatabaseHelper mDatabaseHelper;
protected Context mContext;
/**
* using constructor class to generate other classes
* @param context
*/
public BaseDataRepository(Context context) {
this.mContext = context;
mHttpHelper = new HttpHelper(mContext);
mPreferencesHelper = new PreferencesHelper(mContext);
mDatabaseHelper = new DatabaseHelper(mContext);
}
public DatabaseHelper getDatabaseHelper() {
return mDatabaseHelper;
}
public PreferencesHelper getPreferencesHelper() {
return mPreferencesHelper;
}
public HttpHelper getHttpHelper() {
return mHttpHelper;
}
private Action0 postEventAction(final Object event) {
return new Action0() {
@Override
public void call() {
mEventPoster.postEventSafely(event);
}
};
}
/**
* load String data ,support data from local and online
*/
public Observable<String> loadString(String url) {
if (url.startsWith(Constants.LOCAL_FILE_BASE_END_POINT)) {
try {
String s = FileUtil.getString(mContext, url);
return Observable.just(s);
} catch (IOException e) {
e.printStackTrace();
throw Exceptions.propagate(e);
}
} else {
String path = url.substring(Constants.Remote_BASE_END_POINT.length());
return mHttpHelper.getApi(RemoteApi.class)
.loadString(path)
.flatMap(new Func1<ResponseBody, Observable<String>>() {
@Override
public Observable<String> call(ResponseBody responseBody) {
try {
String result = responseBody.string();
return Observable.just(result);
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("IOException when convert Response Body to String");
}
}
});
}
}
/**
* post string to server
*/
public Observable<String> postString(String url, Map<String, String> paramMap) {
return mHttpHelper.getApi(RemoteApi.class)
.postString(url, paramMap)
.flatMap(new Func1<ResponseBody, Observable<String>>() {
@Override
public Observable<String> call(ResponseBody responseBody) {
try {
String result = responseBody.string();
return Observable.just(result);
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("IOException when convert Response Body to String");
}
}
});
}
/**
* 通过GET方式下载远程文件,支持大文件下载
* 想要获知下载进度事件,请订阅{@link DownloadEvent}
* 想要获知下载完成事件,请订阅{@link DownloadFinishEvent}
*/
public void downloadFile(Context ctx, final String url) {
Intent startIntent = new Intent(ctx, DownloadService.class);
startIntent.putExtra(DownloadService.DOWNLOAD_URL, url);
ctx.startService(startIntent);
}
/**
* 通过POST方式上传文件,支持多文件上传
* 想要获知上传进度事件,请订阅{@link UploadEvent}
* 想要获知上传完成事件,请订阅{@link UploadFinishEvent}
*/
public void uploadFile(Context ctx, String url, ArrayList<UploadParam> fileList, ArrayList<UploadParam> paramList) {
Intent startIntent = new Intent(ctx, UploadService.class);
startIntent.putExtra(UploadService.UPLOAD_URL, url);
startIntent.putParcelableArrayListExtra(UploadService.UPLOAD_FILES, fileList);
if (paramList != null) {
startIntent.putParcelableArrayListExtra(UploadService.UPLOAD_PARAMS, paramList);
}
ctx.startService(startIntent);
}
public void uploadFile(Context ctx, String url, ArrayList<UploadParam> fileList) {
uploadFile(ctx, url, fileList, null);
}
}