Commit fcbdd49a by sikang

librarys

parent 9b4a5f15
......@@ -16,26 +16,15 @@ android {
}
}
buildTypes {
debug {
// 显示Log
debuggable true
versionNameSuffix "-debug"
release {
minifyEnabled false
zipAlignEnabled false
shrinkResources false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
release {
// 不显示Log
debuggable false
//混淆
minifyEnabled true
//Zipalign优化
zipAlignEnabled true
// 移除无用的resource文件
shrinkResources false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
}
......@@ -47,10 +36,10 @@ dependencies {
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
//
implementation "com.android.support:appcompat-v7:26.1.0"
implementation "com.android.support:support-v4:26.1.0"
implementation "com.android.support:recyclerview-v7:26.1.0"
//support包
api "com.android.support:appcompat-v7:26.1.0"
api "com.android.support:support-v4:26.1.0"
api "com.android.support:recyclerview-v7:26.1.0"
//QMUI
api 'com.qmuiteam:qmui:1.1.3'
......@@ -65,8 +54,12 @@ dependencies {
//Gson
api 'com.google.code.gson:gson:2.8.2'
//bugly
api 'com.tencent.bugly:crashreport:2.6.6.1'
api 'com.tencent.bugly:nativecrashreport:3.3.1'
//rxjava
api "io.reactivex.rxjava2:rxjava:2.2.1"
api 'com.jakewharton.rxbinding2:rxbinding:2.2.0'
api 'io.reactivex.rxjava2:rxandroid:2.1.0'
//rxpermissions
api 'com.github.tbruyelle:rxpermissions:0.10.2'
......@@ -81,10 +74,23 @@ dependencies {
api 'com.squareup.retrofit2:converter-gson:2.4.0'
api 'com.squareup.retrofit2:adapter-rxjava2:2.4.0'
//firebase core
api 'com.google.firebase:firebase-core:16.0.3'
//firebase cloud message
api 'com.google.firebase:firebase-messaging:17.3.2'
//firebase remoteConfig
api 'com.google.firebase:firebase-config:16.0.0'
//camerakit
api 'com.wonderkiln:camerakit:0.13.1'
//facebook accountKit
api 'com.facebook.android:account-kit-sdk:4.37.0'
api 'com.google.android.gms:play-services-auth:15.0.1'
api 'com.google.android.gms:play-services-auth-api-phone:15.0.1'
//zendesk
api group: 'com.zendesk', name: 'support', version: '2.1.1'
}
......@@ -18,6 +18,7 @@
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
-ignorewarnings
#指定代码的压缩级别
-optimizationpasses 5
......@@ -175,11 +176,8 @@
**[] $VALUES;
public *;
}
# for DexGuard only
#-keepresourcexmlelements manifest/application/meta-data@value=GlideModule
-keep class com.daunkredit.program.sulu.bean.**{*;}
#zendesk
-keep class zendesk.**{*;}
# OkHttp3
-dontwarn okhttp3.logging.**
-keep class okhttp3.internal.**{*;}
......@@ -230,7 +228,7 @@
######引用的其他Module可以直接在app的这个混淆文件里配置
# 如果使用了Gson之类的工具要使被它解析的JavaBean类即实体类不被混淆。
-keep class tech.starwin.beans.** { *; }
-keep class tech.starwin.mvp.beans.** { *; }
#-libraryjars ../android-gif-drawable-1.2.5/src/main/jniLibs/x86/libpl_droidsonroids_gif.so
#-libraryjars ../android-gif-drawable-1.2.5/src/main/jniLibs/x86_64/libpl_droidsonroids_gif.so
......@@ -332,8 +330,6 @@
-keep class com.appsflyer.** {*;}
-keep interface com.appsflyer.** {*;}
-keep class com.daunkredit.program.sulu.view.camera.** {*;}
-keep interface com.daunkredit.program.sulu.view.camera.** {*;}
#
-keep class java.** {*;}
-keep class com.coremedia.** {*;}
......
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="tech.starwin" />
xmlns:tools="http://schemas.android.com/tools"
package="tech.starwin">
<!--写入SD卡-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!--读取SD卡-->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!--允许挂载和反挂载文件系统可移动存储-->
<uses-permission
android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
tools:ignore="ProtectedPermissions" />
<!--系统对话框-->
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<!--相机-->
<uses-permission android:name="android.permission.CAMERA" />
<!--相机聚焦-->
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<!--读取Log-->
<uses-permission android:name="android.permission.READ_CALL_LOG" />
<!--读取短信-->
<uses-permission android:name="android.permission.READ_SMS" />
<!--发送短信-->
<uses-permission android:name="android.permission.SEND_SMS" />
<!--读取手机状态-->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!--访问手机网络状态-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!--使用音频-->
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<!--访问网络-->
<uses-permission android:name="android.permission.INTERNET" />
<!--读取联系人信息-->
<uses-permission android:name="android.permission.READ_CONTACTS" />
<!--访问wifi状态-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!--读取系统设置-->
<uses-permission android:name="android.permission.READ_SETTINGS" />
<!--读取日志-->
<uses-permission
android:name="android.permission.READ_LOGS"
tools:ignore="ProtectedPermissions" />
<!--操作系统设置-->
<uses-permission
android:name="android.permission.WRITE_SETTINGS"
tools:ignore="ProtectedPermissions" />
<!--打电话-->
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.GET_TASKS" />
<!--锁屏唤醒-->
<uses-permission android:name="android.permission.WAKE_LOCK" />
<!--操作音频设置-->
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<!--震动传感器-->
<uses-permission android:name="android.permission.VIBRATE" />
<!--读取系统设置-->
<uses-permission android:name="android.permission.READ_SETTINGS" />
<application>
<!--适应全面屏-->
<meta-data
android:name="android.max_aspect"
android:value="2.5" />
<!--FireBase 推送-->
<meta-data
android:name="com.google.firebase.messaging.default_notification_channel_id"
android:value="${CHANNEL_NAME}" />
<meta-data
android:name="firebase_messaging_auto_init_enabled"
android:value="false" />
<service android:name=".common.service.MsgHandleService">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
<service android:name=".common.service.MsgInstanceIdService">
<intent-filter>
<action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
</intent-filter>
</service>
<!--Facebook AccountKit-->
<meta-data
android:name="com.facebook.accountkit.ApplicationName"
android:value="@string/app_name" />
<meta-data
android:name="com.facebook.sdk.ApplicationId"
android:value="@string/FACEBOOK_APP_ID" />
<meta-data
android:name="com.facebook.accountkit.ClientToken"
android:value="@string/ACCOUNT_KIT_CLIENT_TOKEN" />
<activity android:name="com.facebook.accountkit.ui.AccountKitActivity"
android:screenOrientation="portrait"/>
</application>
</manifest>
\ No newline at end of file
package tech.starwin;
import android.app.Activity;
import android.app.Application;
import android.content.Context;
import android.support.annotation.NonNull;
import android.view.View;
import android.widget.Toast;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.FirebaseApp;
import com.google.firebase.remoteconfig.FirebaseRemoteConfig;
import com.google.firebase.remoteconfig.FirebaseRemoteConfigSettings;
import com.scwang.smartrefresh.layout.SmartRefreshLayout;
import com.scwang.smartrefresh.layout.api.DefaultRefreshFooterCreator;
import com.scwang.smartrefresh.layout.api.DefaultRefreshHeaderCreator;
......@@ -12,10 +20,22 @@ import com.scwang.smartrefresh.layout.api.RefreshHeader;
import com.scwang.smartrefresh.layout.api.RefreshLayout;
import com.scwang.smartrefresh.layout.footer.ClassicsFooter;
import com.scwang.smartrefresh.layout.header.ClassicsHeader;
import com.tencent.bugly.crashreport.CrashReport;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import tech.starwin.R;
import tech.starwin.mvp.beans.InviteResult;
import tech.starwin.network.Gateway;
import tech.starwin.utils.FireBaseHelper;
import tech.starwin.utils.PreferencesManager;
import zendesk.core.AnonymousIdentity;
import zendesk.core.Identity;
import zendesk.core.Zendesk;
import zendesk.support.Support;
import static com.facebook.accountkit.internal.AccountKitController.getApplicationContext;
/**
* Created by SiKang on 2018/9/30.
......@@ -44,6 +64,11 @@ public class LibConfig {
public static String GATEWAY_HOST_G0;
public static String GATEWAY_HOST_G1;
public static String HARVESTER_IP;
public static String ZENDESK_URL;
public static String ZENDESK_APP_ID;
public static String ZENDESK_OAUTH_CLIENT_ID;
public static int LOADING_ICON;//loading图标
public static int LOADING_BACKGROUND;//loading旋转背景
public static int HARVESTER_PORT;
public static ButterKnifeBinder butterKnifeBinder;
......@@ -56,16 +81,38 @@ public class LibConfig {
/**
* 为Library绑定一个Context
* 初始化 BaseLibrary
*/
public static void initLib(Application application) {
if (application != null) {
CONTEXT = application;
//init FireBase RemoteConfig
//RemoteConfig
FirebaseRemoteConfig.getInstance().setConfigSettings(
new FirebaseRemoteConfigSettings.Builder()
.setDeveloperModeEnabled(LibConfig.DEBUG)
.build()
);
FireBaseHelper.fetchRemoteConfig();
//init SharePreferences
PreferencesManager.get().init(application);
//init gateway
Gateway.init(PreferencesManager.get().getGatewayInfo());
//init Bugly
CrashReport.initCrashReport(getApplicationContext(), BUGLY_APP_ID, DEBUG);
//init zendesk
Zendesk.INSTANCE.init(application, ZENDESK_URL, ZENDESK_APP_ID, ZENDESK_OAUTH_CLIENT_ID);
Support.INSTANCE.init(Zendesk.INSTANCE);
//匿名
Zendesk.INSTANCE.setIdentity(new AnonymousIdentity());
}
}
/**
* 用于在Base 中 实现Butterknife.bind()的功能
*
......@@ -115,4 +162,5 @@ public class LibConfig {
}
});
}
}
......@@ -7,10 +7,12 @@ import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.google.firebase.messaging.RemoteMessage;
import com.qmuiteam.qmui.widget.QMUITopBar;
import com.trello.rxlifecycle2.LifecycleTransformer;
import com.trello.rxlifecycle2.RxLifecycle;
......@@ -21,10 +23,11 @@ import io.reactivex.Observable;
import io.reactivex.subjects.BehaviorSubject;
import tech.starwin.LibConfig;
import tech.starwin.R;
import tech.starwin.common.service.MsgHandleService;
import tech.starwin.mvp.IView;
import tech.starwin.utils.PresenterHoler;
import tech.starwin.utils.activity_utils.FragmentLauncher;
import tech.starwin.utils.ui_utils.ProgressHolder;
import tech.starwin.utils.context_utils.FragmentLauncher;
import tech.starwin.widget.ProgressDialog;
/**
* Created by SiKang on 2018/9/14.
......@@ -49,7 +52,7 @@ public abstract class BaseActivity extends AppCompatActivity implements IView {
/**
* loading、error 提示
*/
protected ProgressHolder progressHolder;
protected ProgressDialog progressDialog;
private Object unBinder;
......@@ -60,7 +63,7 @@ public abstract class BaseActivity extends AppCompatActivity implements IView {
super.onCreate(savedInstanceState);
TAG = getClass().getSimpleName();
lifecycleSubject.onNext(ActivityEvent.CREATE);
progressHolder = new ProgressHolder(this);
progressDialog = new ProgressDialog(this);
presenterHelper = new PresenterHoler(this);
//初始化根布局
initRootLayout();
......@@ -69,6 +72,13 @@ public abstract class BaseActivity extends AppCompatActivity implements IView {
@Override
protected void onStart() {
super.onStart();
//如果是通过FireBase CloudMessage 调起的界面,将消息交给Service处理
String action = getIntent().getAction() == null ? "" : getIntent().getAction();
String from = getIntent().getStringExtra("from");
if (action.equals("android.intent.action.MAIN") &&
!TextUtils.isEmpty(from)) {
MsgHandleService.handleMsg(this,new RemoteMessage(getIntent().getExtras()));
}
lifecycleSubject.onNext(ActivityEvent.START);
}
......@@ -82,7 +92,7 @@ public abstract class BaseActivity extends AppCompatActivity implements IView {
protected void onPause() {
super.onPause();
lifecycleSubject.onNext(ActivityEvent.PAUSE);
progressHolder.dissmissLoading();
progressDialog.dissmissLoading();
}
@Override
......@@ -130,14 +140,14 @@ public abstract class BaseActivity extends AppCompatActivity implements IView {
@Override
public void onHttpStart(String action, boolean isShowLoading) {
if (isShowLoading) {
progressHolder.showLoading();
progressDialog.showLoading();
}
}
@Override
public void onHttpFinish(String action) {
progressHolder.dissmissLoading();
progressDialog.dissmissLoading();
}
......
......@@ -22,7 +22,7 @@ import tech.starwin.LibConfig;
import tech.starwin.R;
import tech.starwin.mvp.IView;
import tech.starwin.utils.PresenterHoler;
import tech.starwin.utils.ui_utils.ProgressHolder;
import tech.starwin.widget.ProgressDialog;
import tech.starwin.utils.ui_utils.UIHelper;
/**
......@@ -45,7 +45,7 @@ public abstract class BaseFragment extends Fragment implements IView {
/**
* loading、error 提示
*/
protected ProgressHolder progressHolder;
protected ProgressDialog progressDialog;
/**
* LifeCycle
......@@ -61,7 +61,7 @@ public abstract class BaseFragment extends Fragment implements IView {
TAG = getClass().getName();
lifecycleSubject.onNext(ActivityEvent.CREATE);
presenterHelper = new PresenterHoler(this);
progressHolder = new ProgressHolder(getActivity());
progressDialog = new ProgressDialog(getActivity());
mContentView = (ViewGroup) LayoutInflater.from(getActivity()).inflate(R.layout.base_activity_root, null);
if (useTopBar()) {
mTopBar = LayoutInflater.from(getActivity()).inflate(R.layout.base_topbar, mContentView, true).findViewById(R.id.layout_topbar);
......@@ -105,13 +105,13 @@ public abstract class BaseFragment extends Fragment implements IView {
@Override
public void onHttpStart(String action, boolean isShowLoading) {
if (isShowLoading) {
progressHolder.showLoading();
progressDialog.showLoading();
}
}
@Override
public void onHttpFinish(String action) {
progressHolder.dissmissLoading();
progressDialog.dissmissLoading();
}
......@@ -132,7 +132,7 @@ public abstract class BaseFragment extends Fragment implements IView {
public void onPause() {
super.onPause();
lifecycleSubject.onNext(ActivityEvent.PAUSE);
progressHolder.dissmissLoading();
progressDialog.dissmissLoading();
}
@Override
......
......@@ -78,16 +78,15 @@ public class BasePresenter<T> {
});
}
@SuppressLint("CheckResult")
protected <T> void handleRequest(Call<T> call, final Observer<T> observer) {
observer.onSubscribe(null);
call.enqueue(new Callback<T>() {
@Override
public void onResponse(Call<T> call, final Response<T> response) {
bindLifecycle(new Consumer<Boolean>() {
bindLifecycle(new Consumer() {
@Override
public void accept(Boolean aBoolean) throws Exception {
public void accept(Object o) throws Exception {
observer.onNext(response.body());
}
});
......
......@@ -48,6 +48,8 @@ public abstract class HttpObserver<T> implements Observer<T> {
}
} else if (msg.contains("java.lang.IllegalStateException")) {
onError(Error.APP_ERROR, LibConfig.getContext().getString(R.string.text_app_error));
} else if (msg.contains("body is null")) {
onSuccess(null);
}
}
......
package tech.starwin.common.impl;
import android.view.View;
import tech.starwin.utils.FireBaseHelper;
import tech.starwin.utils.LogUtils;
/**
* Created by SiKang on 2018/10/11.
*/
public abstract class OnEventClickListener implements View.OnClickListener {
@Override
public void onClick(View v) {
FireBaseHelper.LogClickEventByTag(v);
onEventClick(v);
}
public abstract void onEventClick(View v);
}
......@@ -5,7 +5,7 @@ import android.view.View;
/**
* Created by SiKang on 2018/9/18.
*/
public abstract class OnNoShakeClickListener implements View.OnClickListener {
public abstract class OnNoShakeClickListener extends OnEventClickListener {
public abstract void onNoShakeClick(View view);
public int lockTime = 1500;
......@@ -18,14 +18,15 @@ public abstract class OnNoShakeClickListener implements View.OnClickListener {
}
@Override
public void onClick(final View view) {
view.setClickable(false);
view.postDelayed(new Runnable() {
public void onClick(final View v) {
super.onClick(v);
v.setClickable(false);
v.postDelayed(new Runnable() {
@Override
public void run() {
view.setClickable(true);
v.setClickable(true);
}
}, lockTime);
onNoShakeClick(view);
onNoShakeClick(v);
}
}
package tech.starwin.common.receiver;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
/**
* Created by SiKang on 2018/9/28.
*/
public class DownloadReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
}
}
package tech.starwin.common.service;
import android.content.Context;
import android.content.Intent;
import com.google.firebase.messaging.FirebaseMessagingService;
import com.google.firebase.messaging.RemoteMessage;
import org.greenrobot.eventbus.EventBus;
/**
* Created by SiKang on 2018/9/27.
*/
public class MsgHandleService extends FirebaseMessagingService {
public static final String TAG = "MsgHandleService";
public static final String RECEIVED_FIREBASE_MESSAGE = "action.receivedFireBaseMessage";
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
handleMsg(this, remoteMessage);
}
@Override
public void onDeletedMessages() {
}
/**
* 处理推送内容
*/
public static void handleMsg(Context context, RemoteMessage remoteMessage) {
if (remoteMessage != null) {
//EventBus通知
EventBus.getDefault().post(remoteMessage);
//广播形式通知
Intent intent = remoteMessage.toIntent();
intent.setAction(RECEIVED_FIREBASE_MESSAGE);
context.sendBroadcast(intent);
}
}
}
package tech.starwin.common.service;
import com.google.firebase.iid.FirebaseInstanceId;
import com.google.firebase.iid.FirebaseInstanceIdService;
import tech.starwin.utils.LogUtils;
/**
* Created by SiKang on 2018/9/27.
*/
public class MsgInstanceIdService extends FirebaseInstanceIdService {
public static final String TAG = "MsgInstanceIdService";
@Override
public void onTokenRefresh() {
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
LogUtils.d(TAG, "message token:" + refreshedToken);
}
}
package tech.starwin.mvp.api;
import java.util.List;
import io.reactivex.Observable;
import okhttp3.ResponseBody;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.Header;
import retrofit2.http.POST;
import retrofit2.http.Query;
import tech.starwin.mvp.beans.DepositMethodsBean;
import tech.starwin.mvp.beans.DepositResponseBean;
import tech.starwin.mvp.beans.HistoryLoanAppInfoBean;
import tech.starwin.mvp.beans.LatestLoanAppBean;
import tech.starwin.mvp.beans.LoanRange;
import tech.starwin.mvp.beans.ProgressBean;
......@@ -37,4 +47,43 @@ public interface LoanApi {
@GET("loanapp/latest/v2")
Observable<LatestLoanAppBean> getLatestLoanApp(@Header("X-AUTH-TOKEN") String token);
/**
* 取消贷款
*/
@FormUrlEncoded
@POST("loanapp/cancel")
Observable<ResponseBody> cancelLoan(@Field("loanAppId") String loanAppId,
@Header("X-AUTH-TOKEN") String token);
/**
* 我的贷款记录
*/
@GET("loanapp/all/v2")
Observable<List<HistoryLoanAppInfoBean>> getLoanAppAll(@Header("X-AUTH-TOKEN") String token);
/**
* 获取付款方式
*/
@GET("loanapp/deposit/methods")
Observable<DepositMethodsBean> getDepostMethods(@Header("X-AUTH-TOKEN") String token);
/**
* 还款
*
* @param loanAppId 贷款订单id
* @param method 还款方式
* @param amout 还款金额
*/
@POST("loanapp/deposit")
Observable<DepositResponseBean> doDeposit(@Query("loanAppId") String loanAppId,
@Query("currency") String currency,
@Query("depositMethod") String method,
@Query("amount") double amout,
@Header("X-AUTH-TOKEN") String token
);
}
......@@ -18,6 +18,13 @@ import tech.starwin.mvp.beans.OcrResultBean;
import tech.starwin.mvp.beans.RecordFilesResponse;
public interface UploadApi {
/**
* 上传照片
*
* @param fileType 照片类型 KTP_PHOTO:身份证;
* EMPLOYMENT_PHOTO:工作证件;
* CONTRACT_VIDEO:合同;
*/
@Multipart
@PUT("record/files")
Call<ResponseBody> uploadPhoto(
......@@ -49,10 +56,25 @@ public interface UploadApi {
@Query("imei") String imei,
@Header("X-AUTH-TOKEN") String token);
@Multipart
/*@PUT("/loanapp/verify/face") face++*/
@PUT("/loanapp/verify/yitu")
Observable<BasicAck> faceVerify(@Query("loanType") String loanType,
@Query("amount") double amount,
@Query("period") int period,
@Query("periodUnit") String periodUnit,
@Part MultipartBody.Part imageBest,
@Part MultipartBody.Part imageEnv,
@Part MultipartBody.Part delta,
@Query("imei") String imei,
@Query("productId") long productId,
@Header("X-AUTH-TOKEN") String token);
/**
* 身份证ocr识别
* */
*/
@Multipart
@PUT("/record/ocr")
Call<OcrResultBean> identityOcr(@Part List<MultipartBody.Part> parts, @Header("X-AUTH-TOKEN") String token);
Call<OcrResultBean> identityOcr(@Part MultipartBody.Part part, @Header("X-AUTH-TOKEN") String token);
}
\ No newline at end of file
......@@ -114,6 +114,21 @@ public interface UserApi {
@GET
Observable<GatewayInfoBean> getGateway(@Url String url);
/**
* 提交联系人信息
*/
@FormUrlEncoded
@PUT("record/contact")
Observable<ResponseBody> submitContactInfo(@Field("parentName") String parentName,
@Field("parentMobile") String parentMobile,
@Field("friendName") String friendName,
@Field("friendMobile") String friendMobile,
@Header("X-AUTH-TOKEN") String token);
/**
* 提交工作认证信息
*/
@FormUrlEncoded
@PUT("record/employment")
Observable<ResponseBody> submitEmploymentInfo(@Field("companyName") String companyName,
......@@ -128,6 +143,10 @@ public interface UserApi {
// @Field("workEmail") String workEmail,
@Header("X-AUTH-TOKEN") String token);
/**
* 提交个人信息
*/
@FormUrlEncoded
@PUT("record/personalinfo")
Observable<ResponseBody> submitPersonalInfo(@Field("fullName") String fullName,
......@@ -146,126 +165,99 @@ public interface UserApi {
@Field("facebookId") String facebookId,
@Header("X-AUTH-TOKEN") String token);
@FormUrlEncoded
@PUT("record/contact")
Observable<ResponseBody> submitContactInfo(@Field("parentName") String parentName,
@Field("parentMobile") String parentMobile,
@Field("friendName") String friendName,
@Field("friendMobile") String friendMobile,
@Header("X-AUTH-TOKEN") String token);
@FormUrlEncoded
@POST("loanapp")
Observable<ResponseBody> applyLoanApp(@Field("loanType") String loanType,
@Field("amount") String amount,
@Field("period") String period,
@Field("periodUnit") String periodUnit,
@Field("bankCode") String bankCode,
@Field("cardNo") String cardNo,
@Field("applyFor") String applyFor,
@Field("applyChannel") String applyChannel,
@Field("applyPlatform") String applyPlatform,
@Field("couponId") long couponId,
@Header("X-AUTH-TOKEN") String token
, @Header("imei") String imei
);
/**
* 刷新token
*/
@POST("auth/refresh")
Observable<Result<TokenInfoBean>> refreshToken(@Query("mobile") String mobile,
@Query("tokenInvalid") String refreshToken);
/**
* 退出登录
*/
@FormUrlEncoded
@POST("auth/logout")
Observable<ResponseBody> logout(@Field("token") String token);
@GET("loanapp/deposit/methods")
Observable<DepositMethodsBean> getDepostMethods(@Header("X-AUTH-TOKEN") String token);
@POST("loanapp/deposit")
Observable<DepositResponseBean> doDeposit(@Query("loanAppId") String loanAppId,
@Query("currency") String currency,
@Query("depositMethod") String method,
@Query("amount") double amout,
@Header("X-AUTH-TOKEN") String token
);
@FormUrlEncoded
@PUT("loanapp/deposit")
Observable<ResponseBody> sendPayCode(@Field("depositId") String loanAppId,
@Field("outerTransactionId") String paymentCode,
@Header("X-AUTH-TOKEN") String token
);
@GET("loanapp/all/v2")
Observable<List<HistoryLoanAppInfoBean>> getLoanAppAll(@Header("X-AUTH-TOKEN") String token);
@GET("record/progress")
Observable<ProgressBean> progress(@Header("X-AUTH-TOKEN") String token);
@FormUrlEncoded
@POST("loanapp/cancel")
Observable<ResponseBody> cancelLoan(@Field("loanAppId") String loanAppId,
@Header("X-AUTH-TOKEN") String token);
/**
* 消息列表
*/
@GET("info/inbox/all")
Observable<List<MsgInboxBean>> getMsgInbox(@Header("X-AUTH-TOKEN") String token);
/**
* 已读消息列表
*/
@FormUrlEncoded
@POST("info/inbox/read")
Observable<ResponseBody> sendReadMsg(@Field("msgId") String msgId,
@Header("X-AUTH-TOKEN") String token);
/**
* 获取联系人信息
*/
@GET("record/contact")
Observable<ContactInfoBean> getContactInfo(@Header("X-AUTH-TOKEN") String token);
/**
* 获取工作认证信息
*/
@GET("record/employment")
Observable<EmploymentServerBean> getEmploymentInfo(@Header("X-AUTH-TOKEN") String token);
@GET("chat/account")
Observable<YWUser> getChatUserInfo(@Header("X-AUTH-TOKEN") String token);
/**
* obtain latest version
*
* @return
* 最新版本号
*/
@GET("version/latest")
Observable<ResponseBody> getVersionInfo();
/**
* obtain loan range(min --- max)
*
* @return
* 获取邀请码
*/
@GET("loanapp/range")
Observable<LoanRange> getLoanRange();
@GET("invitation/mine/code")
Observable<ResponseBody> getInviteCode(@Header("X-AUTH-TOKEN") String token);
@GET("invitation/mine/invitee")
Observable<InviteeBean> getInviteInfo(@Header("X-AUTH-TOKEN") String token);
/**
* 已邀请的用户
*/
@GET("invitation/mine/invitee/list")
Observable<ArrayList<InviteePersonBean>> getInvitedList(@Header("X-AUTH-TOKEN") String token);
/**
* 获取可用优惠券
*/
@GET("coupon/available")
Observable<List<CouponBean>> getAvailableCoupon(@Header("X-AUTH-TOKEN") String token);
/**
* 获取已使用的优惠券
*/
@GET("coupon/used")
Observable<List<CouponBean>> getUsedCoupon(@Header("X-AUTH-TOKEN") String token);
/**
* 获取过期优惠券
*/
@GET("coupon/outdated")
Observable<List<CouponBean>> getOutdatedCoupon(@Header("X-AUTH-TOKEN") String token);
/**
* 获取活动Bannder信息
*/
@GET("banner")
Observable<ArrayList<ActivityInfoBean>> getActivityList();
@GET("invitation/mine/invitee/list")
Observable<ArrayList<InviteePersonBean>> getInvitedList(@Header("X-AUTH-TOKEN") String token);
/**
*
* */
@GET("loanapp/repayment-amount-detail")
Observable<LoaningAmoutBean> getLoanAmoutData(@Query("principal") double amount, @Query("period") int day, @Query("periodUnit") String periodUnit);
......@@ -291,5 +283,31 @@ public interface UserApi {
@GET("loanapp/display")
Observable<DisplayBean> display();
@FormUrlEncoded
@PUT("loanapp/deposit")
Observable<ResponseBody> sendPayCode(@Field("depositId") String loanAppId,
@Field("outerTransactionId") String paymentCode,
@Header("X-AUTH-TOKEN") String token
);
@FormUrlEncoded
@POST("loanapp")
Observable<ResponseBody> applyLoanApp(@Field("loanType") String loanType,
@Field("amount") String amount,
@Field("period") String period,
@Field("periodUnit") String periodUnit,
@Field("bankCode") String bankCode,
@Field("cardNo") String cardNo,
@Field("applyFor") String applyFor,
@Field("applyChannel") String applyChannel,
@Field("applyPlatform") String applyPlatform,
@Field("couponId") long couponId,
@Header("X-AUTH-TOKEN") String token
, @Header("imei") String imei
);
@GET("chat/account")
Observable<YWUser> getChatUserInfo(@Header("X-AUTH-TOKEN") String token);
}
package tech.starwin.mvp.beans;
public class BannerMessageDto {
import java.io.Serializable;
public class BannerMessageDto implements Serializable {
public long id;
public String content;
......
package tech.starwin.mvp.beans;
import java.io.Serializable;
/**
* Created by SiKang on 2018/9/30.
*/
public class BasicAck {
public class BasicAck implements Serializable {
private String code;
private String message;
private String data;
......
package tech.starwin.mvp.beans;
import java.io.Serializable;
/**
* Created by SiKang on 2018/9/20.
*/
public class CertBean {
public class CertBean implements Serializable {
public boolean isComplete;
}
package tech.starwin.mvp.beans;
import java.io.Serializable;
/**
* Created by Miaoke on 2017/3/1.
*/
public class ContactInfoBean {
public class ContactInfoBean implements Serializable {
/**
* friendMobile : string
......
package tech.starwin.mvp.beans;
import java.io.Serializable;
import java.util.List;
/**
* Created by Miaoke on 2017/3/13.
*/
public class DepositMethodsBean {
public class DepositMethodsBean implements Serializable {
private List<String> depositMethods;
......
package tech.starwin.mvp.beans;
import java.io.Serializable;
/**
* Created by Miaoke on 2017/3/13.
*/
public class DepositResponseBean {
public class DepositResponseBean implements Serializable {
/**
......
package tech.starwin.mvp.beans;
import java.io.Serializable;
/**
* Created by Miaoke on 2017/3/1.
*/
public class EmploymentBean {
public class EmploymentBean implements Serializable {
/**
......@@ -21,15 +23,15 @@ public class EmploymentBean {
* workEmail : string
*/
public String companyName;
public RegionBean.RegionsBean companyProvince ;
public RegionBean.RegionsBean companyCity;
public RegionBean.RegionsBean companyDistrict;
public RegionBean.RegionsBean companyArea;
public String companyAddress;
public String companyPhone;
public String salary;
public String mJobType;
private String companyName;
private RegionBean.RegionsBean companyProvince ;
private RegionBean.RegionsBean companyCity;
private RegionBean.RegionsBean companyDistrict;
private RegionBean.RegionsBean companyArea;
private String companyAddress;
private String companyPhone;
private String salary;
private String jobType;
public EmploymentBean() {
}
......@@ -53,27 +55,75 @@ public class EmploymentBean {
}
public String getCompanyName() {
return companyName;
}
public void setCompanyName(String companyName) {
this.companyName = companyName;
}
public RegionBean.RegionsBean getCompanyProvince() {
return companyProvince;
}
public void setCompanyProvince(RegionBean.RegionsBean companyProvince) {
this.companyProvince = companyProvince;
}
public RegionBean.RegionsBean getCompanyCity() {
return companyCity;
}
public void setCompanyCity(RegionBean.RegionsBean companyCity) {
this.companyCity = companyCity;
}
public RegionBean.RegionsBean getCompanyDistrict() {
return companyDistrict;
}
public void setCompanyDistrict(RegionBean.RegionsBean companyDistrict) {
this.companyDistrict = companyDistrict;
}
public RegionBean.RegionsBean getCompanyArea() {
return companyArea;
}
public void setCompanyArea(RegionBean.RegionsBean companyArea) {
this.companyArea = companyArea;
}
public String getCompanyAddress() {
return companyAddress;
}
public void setCompanyAddress(String companyAddress) {
this.companyAddress = companyAddress;
}
public String getCompanyPhone() {
return companyPhone;
}
public void setCompanyPhone(String companyPhone) {
this.companyPhone = companyPhone;
}
public String getSalary() {
return salary;
}
public void setSalary(String salary) {
this.salary = salary;
}
public String getJobType() {
return jobType;
}
public void setJobType(String jobType) {
mJobType = jobType;
this.jobType = jobType;
}
}
package tech.starwin.mvp.beans;
import java.io.Serializable;
/**
* Created by Miaoke on 31/03/2017.
*/
public class EmploymentServerBean {
public class EmploymentServerBean implements Serializable {
/**
* companyAddress : string
......
package tech.starwin.mvp.beans;
import java.io.Serializable;
/**
* @作者:XJY
* @创建日期: 2017/3/15 14:58
......@@ -9,7 +11,7 @@ package tech.starwin.mvp.beans;
* @更新描述:${TODO}
*/
public class HistoryLoanAppInfoBean extends LoanAppBeanFather {
public class HistoryLoanAppInfoBean extends LoanAppBeanFather implements Serializable {
/**
......
package tech.starwin.mvp.beans;
import java.io.Serializable;
/**
* Created by SiKang on 2018/9/30.
*/
public class IdentifyBean {
public class IdentifyBean implements Serializable {
private String name;
private String ktp;
private String gender;
......
package tech.starwin.mvp.beans;
import java.io.Serializable;
/**
* Created by SiKang on 2018/9/30.
*/
public class InviteResult {
public class InviteResult implements Serializable {
private InviteePersonBean list;
private InviteeBean bean;
private String code;
......
package tech.starwin.mvp.beans;
import java.io.Serializable;
/**
* Created by SiKang on 2018/9/30.
*/
public class InviteeBean {
public class InviteeBean implements Serializable {
private int completeLoanApplyCount;
private int inviteeCount;
......
package tech.starwin.mvp.beans;
import java.io.Serializable;
/**
* Created by SiKang on 2018/9/30.
*/
public class InviteePersonBean {
public class InviteePersonBean implements Serializable {
private String mobile;
private String realName;
private String registerTime;
......
package tech.starwin.mvp.beans;
import java.io.Serializable;
/**
* Created by Miaoke on 2017/3/6.
*/
public class LatestLoanAppBean extends LoanAppBeanFather {
public class LatestLoanAppBean extends LoanAppBeanFather implements Serializable {
/**
......
package tech.starwin.mvp.beans;
import java.io.Serializable;
/**
* @作者:My
* @创建日期: 2017/3/20 11:35
......@@ -9,7 +11,7 @@ package tech.starwin.mvp.beans;
* @更新描述:${TODO}
*/
public class LoanAppHelpCenterTipsBean {
public class LoanAppHelpCenterTipsBean implements Serializable {
public String mTitle;
public String mDetail;
}
package tech.starwin.mvp.beans;
import java.io.Serializable;
/**
* @作者:My
* @创建日期: 2017/7/19 17:47
......@@ -9,7 +11,7 @@ package tech.starwin.mvp.beans;
* @更新描述:${TODO}
*/
public class LoanRange {
public class LoanRange implements Serializable {
private Double amountStep;
private Double interestRate;
private Double maxAmount;
......
package tech.starwin.mvp.beans;
import java.io.Serializable;
/**
* Created by SiKang on 2018/9/30.
*/
public class LoaningAmoutBean {
public class LoaningAmoutBean implements Serializable {
private double dueAmount;
private double interest;
private double serviceFee;
......
package tech.starwin.mvp.beans;
import java.io.Serializable;
/**
* Created by localuser on 2017/2/27.
*/
public class LoginRequestBean {
public class LoginRequestBean implements Serializable {
public Mobile mobile;
public SMSCode smsCode;
......
package tech.starwin.mvp.beans;
import java.io.Serializable;
/**
* @作者:My
* @创建日期: 2017/4/5 17:17
......@@ -10,6 +12,6 @@ package tech.starwin.mvp.beans;
* @更新描述:${TODO}
*/
public class LoginStatusBean {
public class LoginStatusBean implements Serializable {
public long mChangTime = 1L;
}
package tech.starwin.mvp.beans;
import java.io.Serializable;
/**
* Created by SiKang on 2018/9/30.
*/
public class MessageBean {
public class MessageBean implements Serializable {
private boolean fromMe;
private String time;
private String message;
......
package tech.starwin.mvp.beans;
import java.io.Serializable;
/**
* Created by Miaoke on 2017/3/24.
*/
public class MsgInboxBean {
public class MsgInboxBean implements Serializable {
/**
* createTime : 2017-03-24T09:56:37.757Z
......
......@@ -2,12 +2,14 @@ package tech.starwin.mvp.beans;
import android.support.annotation.Nullable;
import java.io.Serializable;
/**
* Created by Miaoke on 2017/3/1.
*/
public class PersonalInfoBean {
public class PersonalInfoBean implements Serializable {
/**
......
......@@ -2,11 +2,13 @@ package tech.starwin.mvp.beans;
import android.support.annotation.Nullable;
import java.io.Serializable;
/**
* Created by Miaoke on 31/03/2017.
*/
public class PersonalInfoServerBean {
public class PersonalInfoServerBean implements Serializable {
/**
* address : string
......
package tech.starwin.mvp.beans;
import java.io.File;
import java.io.Serializable;
/**
* @作者:My
......@@ -11,7 +12,7 @@ import java.io.File;
* @更新描述:${TODO}
*/
public class PhotoInfo {
public class PhotoInfo implements Serializable {
public File mFile;
public boolean isKTP;
}
......
package tech.starwin.mvp.beans;
import java.io.Serializable;
/**
* Created by Miaoke on 2017/3/20.
*/
public class ProgressBean {
public class ProgressBean implements Serializable {
/**
* personalInfoPart : false
......
package tech.starwin.mvp.beans;
import java.io.Serializable;
import java.util.List;
/**
* Created by localuser on 2017/3/1.
*/
public class RecordFilesResponse {
public class RecordFilesResponse implements Serializable {
private List<FilesBean> files;
public List<FilesBean> getFiles() {
......
package tech.starwin.mvp.beans;
import java.io.Serializable;
import java.util.List;
/**
* Created by Miaoke on 2017/3/10.
*/
public class RegionBean {
public class RegionBean implements Serializable {
private List<RegionsBean> regions;
......
package tech.starwin.mvp.beans;
import java.io.Serializable;
/**
* Created by Miaoke on 30/03/2017.
*/
public class ResponseErrorBody {
public class ResponseErrorBody implements Serializable {
/**
* error : err.auth.access.denied
......
package tech.starwin.mvp.beans;
import java.io.Serializable;
/**
* Created by SiKang on 2018/9/14.
*/
public class Result<T> {
public class Result<T> implements Serializable {
public int code;
public String msg;
public T data;
......
package tech.starwin.mvp.beans;
import java.io.Serializable;
/**
* Created by SiKang on 2018/9/30.
*/
public class UserBankInfo {
public class UserBankInfo implements Serializable {
private String bankCode;
private String branch;
private String cardNo;
......
package tech.starwin.mvp.beans;
public class UserInfo {
import java.io.Serializable;
public class UserInfo implements Serializable {
public String headIcon;
public String nicky;
......
package tech.starwin.mvp.beans;
import java.io.Serializable;
/**
* @作者:My
* @创建日期: 2017/3/31 16:55
......@@ -9,7 +11,7 @@ package tech.starwin.mvp.beans;
* @更新描述:${TODO}
*/
public class YWUser {
public class YWUser implements Serializable {
/**
* userid : 59523e9f4736c2cab70a470f088b53dd
......
......@@ -42,5 +42,20 @@ public class LoanPresenter extends BasePresenter<LoanApi> {
handleRequest(action, apiService.getLatestLoanApp(LoginManager.get().getToken()));
}
/**
* 获取贷款记录
*/
public void getLoanHistory(String action) {
handleRequest(action, apiService.getLoanAppAll(LoginManager.get().getToken()));
}
/**
* 取消贷款
* */
public void cancelLoan(String action,String loanAppId){
handleRequest(action,apiService.cancelLoan(loanAppId,LoginManager.get().getToken()));
}
}
package tech.starwin.mvp.presenter;
import android.annotation.SuppressLint;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import com.google.gson.Gson;
......@@ -8,11 +10,17 @@ import com.google.gson.Gson;
import java.io.File;
import java.util.List;
import io.reactivex.Observable;
import io.reactivex.functions.BiFunction;
import okhttp3.MultipartBody;
import okhttp3.ResponseBody;
import tech.starwin.base.BasePresenter;
import tech.starwin.common.impl.HttpObserver;
import tech.starwin.mvp.api.UploadApi;
import tech.starwin.mvp.api.UserApi;
import tech.starwin.mvp.beans.EmploymentBean;
import tech.starwin.mvp.beans.OcrResultBean;
import tech.starwin.network.ServiceGenerator;
import tech.starwin.utils.LoginManager;
import tech.starwin.utils.MultipartBodyMaker;
......@@ -28,12 +36,8 @@ public class UploadPresenter extends BasePresenter<UploadApi> {
/**
* 身份证ocr识别
*/
public void identityOcr(final String action, @Nullable File file) {
List<MultipartBody.Part> parts = new MultipartBodyMaker.Builder()
.addDataPart("file", file)
.build().makeParts();
handleRequest(apiService.identityOcr(parts, LoginManager.get().getToken()), new HttpObserver<OcrResultBean>() {
public void identityOcr(final String action, @NonNull File file) {
handleRequest(apiService.identityOcr(MultipartBodyMaker.makeSimplePart("file", file), LoginManager.get().getToken()), new HttpObserver<OcrResultBean>() {
@Override
public void onStart() {
view.onHttpStart(action, true);
......@@ -59,4 +63,33 @@ public class UploadPresenter extends BasePresenter<UploadApi> {
}
});
}
/**
* 上传工作证件照片
*/
@SuppressLint("CheckResult")
public void uploadEmploymentImg(final String action, EmploymentBean employmentBean, @NonNull File file) {
handleRequest(apiService.uploadPhoto(MultipartBodyMaker.makeSimplePart("file", file), "EMPLOYMENT_PHOTO", LoginManager.get().getToken()),
new HttpObserver<ResponseBody>() {
@Override
public void onStart() {
view.onHttpStart(action, true);
}
@Override
public void onSuccess(ResponseBody responseBody) {
view.onHttpSuccess(action, responseBody);
}
@Override
public void onError(int code, String msg) {
view.onHttpError(action, msg);
}
@Override
public void onFinish() {
view.onHttpFinish(action);
}
});
}
}
......@@ -8,12 +8,15 @@ import io.reactivex.ObservableSource;
import io.reactivex.functions.Consumer;
import io.reactivex.functions.Function;
import io.reactivex.functions.Predicate;
import okhttp3.ResponseBody;
import tech.starwin.base.BasePresenter;
import tech.starwin.common.impl.HttpObserver;
import tech.starwin.mvp.api.UserApi;
import tech.starwin.mvp.beans.EmploymentBean;
import tech.starwin.mvp.beans.GatewayInfoBean;
import tech.starwin.mvp.beans.TokenInfoBean;
import tech.starwin.network.Gateway;
import tech.starwin.network.ServiceGenerator;
import tech.starwin.utils.LoginManager;
/**
......@@ -152,6 +155,37 @@ public class UserPresenter extends BasePresenter<UserApi> {
handleRequest(action, apiService.getRegion(level, id));
}
/**
* 提交联系人信息
*/
public void submitContactInfo(String action, String parentName, String parentPhone, String friendName, String friendPhone) {
handleRequest(action, apiService.submitContactInfo(parentName, parentPhone, friendName, friendPhone, LoginManager.get().getToken()));
}
/**
* 提交联系人信息
*/
public void submitEmploymentInfo(String action, EmploymentBean employmentBean) {
Observable<ResponseBody> observable = ServiceGenerator.getService(UserApi.class)
.submitEmploymentInfo(employmentBean.getCompanyName(),
employmentBean.getCompanyProvince().getName(),
employmentBean.getCompanyCity().getName(),
employmentBean.getCompanyDistrict().getName(),
employmentBean.getCompanyArea().getName(),
employmentBean.getCompanyAddress(),
employmentBean.getCompanyPhone(),
employmentBean.getJobType(),
employmentBean.getSalary(),
LoginManager.get().getToken());
handleRequest(action, observable);
}
// /**
// * 获取身份证图片 + 获取用户个人信息
// */
......
package tech.starwin.network;
import java.io.IOException;
import okhttp3.Headers;
import okhttp3.Interceptor;
import okhttp3.MediaType;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import okhttp3.internal.Util;
import tech.starwin.LibConfig;
/**
* Created by XLEO on 2018/1/30.
*/
class DefaultHeaderAddInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Request userRequest = chain.request();
Request.Builder requestBuilder = userRequest.newBuilder();
RequestBody body = userRequest.body();
if (body != null) {
MediaType contentType = body.contentType();
if (contentType != null) {
requestBuilder.header("Content-Type", contentType.toString());
}
long contentLength = body.contentLength();
if (contentLength != -1L) {
requestBuilder.header("Content-Length", Long.toString(contentLength));
requestBuilder.removeHeader("Transfer-Encoding");
} else {
requestBuilder.header("Transfer-Encoding", "chunked");
requestBuilder.removeHeader("Content-Length");
}
}
if (userRequest.header("Host") == null) {
requestBuilder.header("Host", Util.hostHeader(userRequest.url(), false));
}
if (userRequest.header("Connection") == null) {
requestBuilder.header("Connection", "Keep-Alive");
}
boolean transparentGzip = false;
if (userRequest.header("Accept-Encoding") == null && userRequest.header("Range") == null) {
transparentGzip = true;
requestBuilder.header("Accept-Encoding", "gzip");
}
requestBuilder.header("X-APP-TYPE", "ANDROID")
.header("X-APP-VERSION", String.valueOf(LibConfig.VERSION_CODE))
.header("X-APP-PACKAGE-NAME", LibConfig.APPLICATION_ID);
return chain.proceed(requestBuilder.build());
}
}
package tech.starwin.network;
import com.google.firebase.remoteconfig.FirebaseRemoteConfig;
import java.util.Arrays;
import java.util.List;
import tech.starwin.LibConfig;
import tech.starwin.mvp.beans.GatewayInfoBean;
import tech.starwin.utils.LogUtils;
/**
* Created by SiKang on 2018/9/28.
......
......@@ -16,7 +16,9 @@ public class NullOnEmptyConverterFactory extends Converter.Factory {
return new Converter<ResponseBody, Object>() {
@Override
public Object convert(ResponseBody body) throws IOException {
if (body.contentLength() == 0) return null;
if (body.contentLength() == 0) {
throw new NullPointerException("body is null!");
}
return delegate.convert(body);
}
};
......
......@@ -29,6 +29,7 @@ public class ServiceGenerator {
.connectTimeout(TIME_OUT, TimeUnit.SECONDS)
.writeTimeout(TIME_OUT, TimeUnit.SECONDS)
.readTimeout(TIME_OUT, TimeUnit.SECONDS)
.addInterceptor(new DefaultHeaderAddInterceptor())
.build();
serviceMap = new HashMap<>();
......
package tech.starwin.signal;
import android.content.Context;
/**
* Created by SiKang on 2018/10/10.
*/
public class JNISignal {
static {
System.loadLibrary("signal");
}
public static native String getSignal(Context context);
}
package tech.starwin.utils;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.analytics.FirebaseAnalytics;
import com.google.firebase.remoteconfig.FirebaseRemoteConfig;
/**
* Created by SiKang on 2018/10/11.
*/
public class FireBaseHelper {
public static final String REST_URL = "rest_url";
/**
* click埋点,ITEM_NAME = view.getTag()
*/
public static void LogClickEventByTag(View view) {
if (view.getTag() != null && view.getTag() instanceof String) {
logClickEvent(view.getContext(), (String) view.getTag());
}
}
/**
* click埋点 ITEM_NAME = view.getText()
*/
public static void LogClickEventByText(View view) {
String itemName = "";
if (view instanceof TextView) {
itemName = ((TextView) view).getText().toString();
} else if (view instanceof Button) {
itemName = ((Button) view).getText().toString();
}
if (!TextUtils.isEmpty(itemName)) {
logClickEvent(view.getContext(), itemName);
}
}
/**
* click埋点
*/
public static void logClickEvent(Context context, String itemName) {
Bundle bundle = new Bundle();
bundle.putString(FirebaseAnalytics.Param.CONTENT_TYPE, "click_" + itemName);
FirebaseAnalytics.getInstance(context).logEvent(FirebaseAnalytics.Event.SELECT_CONTENT, bundle);
}
/**
* 获取FireBase RemoteConfig 并激活
*/
private static final int CACHE_EXPIRATION_SECONDS = 60 * 5;//remoteConfig 刷新频率
public static void fetchRemoteConfig() {
final FirebaseRemoteConfig config = FirebaseRemoteConfig.getInstance();
config.fetch(CACHE_EXPIRATION_SECONDS)
.addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()) {
config.activateFetched();
}
}
});
}
}
package tech.starwin.utils;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.provider.Settings;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.FragmentManager;
......@@ -18,11 +20,14 @@ import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Field;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.UUID;
import tech.starwin.R;
......@@ -183,6 +188,43 @@ public class GeneralUtils {
return null;
}
/**
* MD5
*/
public static String MD5(String key) {
String cacheKey;
try {
final MessageDigest mDigest = MessageDigest.getInstance("MD5");
mDigest.update(key.getBytes());
cacheKey = bytesToHexString(mDigest.digest());
} catch (NoSuchAlgorithmException e) {
cacheKey = String.valueOf(key.hashCode());
}
return cacheKey;
}
private static String bytesToHexString(byte[] bytes) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < bytes.length; i++) {
String hex = Integer.toHexString(0xFF & bytes[i]);
if (hex.length() == 1) {
sb.append('0');
}
sb.append(hex);
}
return sb.toString();
}
/**
* 获取AndroidID
*/
@SuppressLint("HardwareIds")
public static String getAndroidID(Context context) {
return Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID);
}
public static void findAndModifyOpInBackStackRecord(FragmentManager fragmentManager, int backStackIndex, OPHandler handler) {
if (fragmentManager == null || handler == null) {
......
package tech.starwin.utils;
import android.content.Context;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.TextView;
import com.google.firebase.analytics.FirebaseAnalytics;
import tech.starwin.BuildConfig;
......
package tech.starwin.utils;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.support.v4.app.FragmentActivity;
import com.facebook.accountkit.AccountKitError;
......@@ -10,15 +12,18 @@ import com.facebook.accountkit.ui.AccountKitActivity;
import com.facebook.accountkit.ui.AccountKitConfiguration;
import com.facebook.accountkit.ui.LoginType;
import java.util.List;
import tech.starwin.LibConfig;
import tech.starwin.mvp.beans.TokenInfoBean;
import tech.starwin.utils.activity_utils.EasyActivityResult;
import tech.starwin.utils.activity_utils.IntentHolder;
import tech.starwin.utils.context_utils.EasyActivityResult;
import tech.starwin.utils.context_utils.IntentHolder;
/**
* Created by SiKang on 2018/9/19.
*/
public class LoginManager {
public static final String TAG = "LoginManager";
private static LoginManager loginManager;
private TokenInfoBean tokenInfo;
......@@ -43,12 +48,12 @@ public class LoginManager {
//清除登录状态
PreferencesManager.get().clearLoginInfo();
tokenInfo = null;
try {
//跳转登录界面
if (isActionSupport(LibConfig.getContext(), LibConfig.LOGIN_ACTIVITY_ACTION)) {
new IntentHolder.Builder(LibConfig.getContext(), LibConfig.LOGIN_ACTIVITY_ACTION)
.build().start();
} catch (ActivityNotFoundException e) {
throw new RuntimeException("找不到LoginActivity,请在build.gradle中配置正确的 ‘LOGIN_ACTIVITY_ACTION’ ");
} else {
LogUtils.e(TAG, "找不到LoginActivity,请在build.gradle中配置正确的 ‘LOGIN_ACTIVITY_ACTION’ ");
}
}
......@@ -122,4 +127,18 @@ public class LoginManager {
void onLoginCancelled();
}
/**
* 是否存在某个可跳转的action
*/
private boolean isActionSupport(Context context, String action) {
final PackageManager packageManager = context.getPackageManager();
final Intent intent = new Intent(action);
List<ResolveInfo> resolveInfo = packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
if (resolveInfo.size() > 0) {
return true;
}
return false;
}
}
......@@ -9,7 +9,6 @@ import okhttp3.RequestBody;
/**
* Created by SiKang on 2018/9/28.
*
*/
public class MultipartBodyMaker {
MultipartBody.Builder builder;
......@@ -22,6 +21,12 @@ public class MultipartBodyMaker {
return builder.build().parts();
}
public static MultipartBody.Part makeSimplePart(String name, File file) {
MediaType mediaType = MediaType.parse(FileUtils.getMimeType(file));
RequestBody requestFile = RequestBody.create(mediaType, file);
return MultipartBody.Part.createFormData(name, file.getName(), requestFile);
}
public static class Builder {
MultipartBody.Builder builder;
......
package tech.starwin.utils.activity_utils;
package tech.starwin.utils.context_utils;
import android.content.Intent;
import android.os.Bundle;
......
package tech.starwin.utils.activity_utils;
package tech.starwin.utils.context_utils;
import android.app.Activity;
import android.content.Intent;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
......@@ -43,6 +44,10 @@ public class EasyActivityResult {
mAvoidOnResultFragment.startForResult(intent, requestCode, activityReesult);
}
public void startForResult(Class<? extends Activity> activity, int requestCode, OnResultListener activityReesult) {
mAvoidOnResultFragment.startForResult(new Intent(mAvoidOnResultFragment.getContext(), activity), requestCode, activityReesult);
}
public interface OnResultListener {
void onActivityResult(int requestCode, int resultCode, Intent data);
}
......
package tech.starwin.utils.activity_utils;
package tech.starwin.utils.context_utils;
import android.support.annotation.IdRes;
import android.support.v4.app.Fragment;
......
package tech.starwin.utils.activity_utils;
package tech.starwin.utils.context_utils;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import java.io.Serializable;
......@@ -27,6 +28,9 @@ public class IntentHolder {
* 打开Activity
*/
public void start() {
if (context == null) {
return;
}
context.startActivity(intent);
if (context instanceof Activity) {
((Activity) context).overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_left);
......@@ -37,6 +41,8 @@ public class IntentHolder {
* 在新的Task种打开Activity
*/
public void startWithNewTask() {
if (context == null)
return;
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
}
......@@ -49,6 +55,10 @@ public class IntentHolder {
private Intent intent;
private Context fromContext;
public Builder() {
}
public <C extends Activity> Builder(Context from, Class<C> target) {
this.fromContext = from;
intent = new Intent(fromContext, target);
......@@ -92,6 +102,14 @@ public class IntentHolder {
public IntentHolder build() {
return new IntentHolder(fromContext, intent);
}
public Intent toIntent() {
return intent;
}
public Bundle toBundle() {
return intent.getExtras();
}
}
}
......
package tech.starwin.utils.activity_utils;
package tech.starwin.utils.context_utils;
import android.Manifest;
import android.annotation.SuppressLint;
......@@ -48,19 +48,29 @@ public class PermissionsHelper {
}
@SuppressLint("CheckResult")
private static void getPermission(RxPermissions rxPermissions, String[] permissions, final OnPermissionListener listener) {
private static void getPermission(RxPermissions rxPermissions, final String[] permissions, final OnPermissionListener listener) {
rxPermissions
.requestEach(permissions)
.subscribe(new Consumer<Permission>() {
int index = 0;
int refuseCount = 0;
@Override
public void accept(Permission permission) throws Exception {
if (permission.granted) {
listener.onAllow(permission);
if (index == permissions.length - 1 && refuseCount == 0) {
listener.onAllow(permission, true);
} else {
listener.onAllow(permission, false);
}
} else if (permission.shouldShowRequestPermissionRationale) {
refuseCount++;
listener.onRefuse(permission);
} else {
refuseCount++;
listener.onRefuseAndNeverAskAgain(permission);
}
index++;
}
});
}
......@@ -122,7 +132,7 @@ public class PermissionsHelper {
/**
* 允许权限
*/
void onAllow(Permission permission);
void onAllow(Permission permission, boolean allAllowed);
/**
* 拒绝权限,下次再问
......
......@@ -10,6 +10,7 @@ import android.content.DialogInterface;
import android.os.Build;
import android.text.InputType;
import android.widget.EditText;
import android.widget.Toast;
import com.qmuiteam.qmui.widget.dialog.QMUIDialog;
import com.qmuiteam.qmui.widget.dialog.QMUIDialogAction;
......@@ -29,7 +30,7 @@ import io.reactivex.functions.Consumer;
public class DialogFactory {
/**
* 创建提示类消息弹窗
* 创建一个半透明背景带有Icon的Dialog (Loading、Error等)
*/
public static Dialog createTipDialog(Context context, @QMUITipDialog.Builder.IconType int mode, String tipWord) {
return new QMUITipDialog.Builder(context)
......@@ -39,19 +40,40 @@ public class DialogFactory {
}
/**
* 创建提示类对话框
* 创建一个带有文本提示的对话框
*/
public static Dialog createMessageDialog(Context context, String message, String btnText, QMUIDialogAction.ActionListener listener) {
public static Dialog createMessageDialog(Context context, String title, String message, String btnText) {
return new QMUIDialog.MessageDialogBuilder(context)
.setTitle("Tip")
.setTitle(title)
.setMessage(message)
.addAction("cancel", new QMUIDialogAction.ActionListener() {
.addAction(btnText, new QMUIDialogAction.ActionListener() {
@Override
public void onClick(QMUIDialog dialog, int index) {
dialog.dismiss();
}
})
.addAction(btnText, listener)
.create();
}
/**
* 创建一个带有文本提示和两个含义相对按钮的对话框
*/
public static Dialog createYesOrNoDialog(Context context, String title, String msg, String yesBtnText, String noBtnText, final OnYesOrNoListener onYesOrNoListener) {
return new QMUIDialog.MessageDialogBuilder(context)
.setTitle(title)
.setMessage(msg)
.addAction(0, noBtnText, QMUIDialogAction.ACTION_PROP_NEGATIVE, new QMUIDialogAction.ActionListener() {
@Override
public void onClick(QMUIDialog dialog, int index) {
onYesOrNoListener.onClick(dialog, false);
}
})
.addAction(yesBtnText, new QMUIDialogAction.ActionListener() {
@Override
public void onClick(QMUIDialog dialog, int index) {
onYesOrNoListener.onClick(dialog, true);
}
})
.create();
}
......@@ -151,6 +173,10 @@ public class DialogFactory {
void onClick(QMUIDialog dialog, int[] checkedItemIndexes);
}
public interface OnYesOrNoListener {
void onClick(Dialog dialog, boolean choice);
}
public static void dismiss(Dialog dialog) {
if (dialog != null) {
Context context = ((ContextWrapper) dialog.getContext()).getBaseContext();
......
......@@ -45,11 +45,13 @@ public class UIHelper {
* 为View添加ClickListener
*/
public static <T extends View.OnClickListener> void bindClickListener(T listener, View... views) {
if (views.length == 0 || listener == null)
if (views.length == 0 || listener == null) {
return;
for (View view : views)
}
for (View view : views) {
view.setOnClickListener(listener);
}
}
/**
* 为View添加ClickListener
......@@ -180,7 +182,7 @@ public class UIHelper {
/**
* 创建一个(icon + text)类型的Tab按钮
*/
public static QMUITabSegment.Tab createTab(Context context,@DrawableRes int normalIcon, @DrawableRes int selectIcon, String text) {
public static QMUITabSegment.Tab createTab(Context context, @DrawableRes int normalIcon, @DrawableRes int selectIcon, String text) {
return new QMUITabSegment.Tab(
ContextCompat.getDrawable(context, normalIcon),
ContextCompat.getDrawable(context, selectIcon),
......@@ -191,7 +193,7 @@ public class UIHelper {
/**
* 创建一个(icon + text)类型的Tab按钮,并按指定尺寸显示icon
*/
public static QMUITabSegment.Tab createTab(Context context,int iconWidtn, int iconHeight, @DrawableRes int normalIcon, @DrawableRes int selectIcon, String text) {
public static QMUITabSegment.Tab createTab(Context context, int iconWidtn, int iconHeight, @DrawableRes int normalIcon, @DrawableRes int selectIcon, String text) {
Bitmap normalBitmap = BitmapFactory.decodeResource(context.getResources(),
normalIcon);
Bitmap selectBitmap = BitmapFactory.decodeResource(context.getResources(),
......@@ -258,4 +260,5 @@ public class UIHelper {
.subscribe();
}
}
package tech.starwin.utils.ui_utils;
package tech.starwin.widget;
import android.animation.ObjectAnimator;
import android.app.Dialog;
......@@ -9,6 +9,7 @@ import android.view.View;
import android.view.animation.Animation;
import android.widget.ImageView;
import tech.starwin.LibConfig;
import tech.starwin.R;
/**
......@@ -22,9 +23,10 @@ public class LoadDialog extends Dialog {
View view = LayoutInflater.from(context).inflate(R.layout.base_progress_loading, null, false);
setContentView(view);
setCanceledOnTouchOutside(false);
// TODO 动态配置loadingIcon
ImageView rotationView = view.findViewById(R.id.progress_dialog_loadingImv);
ImageView iconView = view.findViewById(R.id.progress_dialog_iconImv);
rotationView.setImageResource(LibConfig.LOADING_BACKGROUND);
iconView.setImageResource(LibConfig.LOADING_ICON);
//初始化动画
mLoadAnimation = ObjectAnimator.ofFloat(rotationView, "rotation", 0, 360);
mLoadAnimation.setDuration(1000);
......
package tech.starwin.utils.ui_utils;
package tech.starwin.widget;
import android.annotation.SuppressLint;
import android.app.Dialog;
......@@ -7,21 +7,24 @@ import android.support.annotation.NonNull;
import com.qmuiteam.qmui.widget.dialog.QMUITipDialog;
import tech.starwin.utils.ui_utils.DialogFactory;
import tech.starwin.widget.LoadDialog;
/**
* Created by SiKang on 2018/9/19.
*/
public class ProgressHolder {
public class ProgressDialog {
//loading dialog
private Dialog loadingDialog;
private Context context;
public ProgressHolder(@NonNull Context context) {
public ProgressDialog(@NonNull Context context) {
this.context = context;
this.loadingDialog = new LoadDialog(context);
}
public ProgressHolder(@NonNull Dialog loadingDialog) {
public ProgressDialog(@NonNull Dialog loadingDialog) {
this.context = loadingDialog.getContext();
this.loadingDialog = loadingDialog;
}
......
......@@ -8,13 +8,11 @@
android:id="@+id/progress_dialog_loadingImv"
android:layout_width="@dimen/x_300"
android:layout_height="@dimen/x_300"
android:layout_centerInParent="true"
android:src="@mipmap/ic_launcher" />
android:layout_centerInParent="true" />
<ImageView
android:id="@+id/progress_dialog_iconImv"
android:layout_width="@dimen/x_150"
android:layout_height="@dimen/x_150"
android:layout_centerInParent="true"
android:src="@mipmap/ic_launcher" />
android:layout_centerInParent="true" />
</RelativeLayout>
......@@ -5,6 +5,7 @@
<string name="null_response">NO Data</string>
<string name="moneySymbol">Rp.</string>
<string name="loading_loading">loading....</string>
<string name="years">tahun</string>
<string name="months">bulan</string>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment