Commit fcbdd49a by sikang

librarys

parent 9b4a5f15
...@@ -16,26 +16,15 @@ android { ...@@ -16,26 +16,15 @@ android {
} }
} }
buildTypes { buildTypes {
debug { release {
// 显示Log
debuggable true
versionNameSuffix "-debug"
minifyEnabled false minifyEnabled false
zipAlignEnabled false
shrinkResources false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
} }
}
release { sourceSets {
// 不显示Log main {
debuggable false jniLibs.srcDirs = ['libs']
//混淆
minifyEnabled true
//Zipalign优化
zipAlignEnabled true
// 移除无用的resource文件
shrinkResources false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
} }
} }
} }
...@@ -47,10 +36,10 @@ dependencies { ...@@ -47,10 +36,10 @@ dependencies {
androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
// //support包
implementation "com.android.support:appcompat-v7:26.1.0" api "com.android.support:appcompat-v7:26.1.0"
implementation "com.android.support:support-v4:26.1.0" api "com.android.support:support-v4:26.1.0"
implementation "com.android.support:recyclerview-v7:26.1.0" api "com.android.support:recyclerview-v7:26.1.0"
//QMUI //QMUI
api 'com.qmuiteam:qmui:1.1.3' api 'com.qmuiteam:qmui:1.1.3'
...@@ -65,8 +54,12 @@ dependencies { ...@@ -65,8 +54,12 @@ dependencies {
//Gson //Gson
api 'com.google.code.gson:gson:2.8.2' 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 //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' api 'io.reactivex.rxjava2:rxandroid:2.1.0'
//rxpermissions //rxpermissions
api 'com.github.tbruyelle:rxpermissions:0.10.2' api 'com.github.tbruyelle:rxpermissions:0.10.2'
...@@ -81,10 +74,23 @@ dependencies { ...@@ -81,10 +74,23 @@ dependencies {
api 'com.squareup.retrofit2:converter-gson:2.4.0' api 'com.squareup.retrofit2:converter-gson:2.4.0'
api 'com.squareup.retrofit2:adapter-rxjava2: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 //camerakit
api 'com.wonderkiln:camerakit:0.13.1' api 'com.wonderkiln:camerakit:0.13.1'
//facebook accountKit //facebook accountKit
api 'com.facebook.android:account-kit-sdk:4.37.0' 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 @@ ...@@ -18,6 +18,7 @@
#-keepclassmembers class fqcn.of.javascript.interface.for.webview { #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *; # public *;
#} #}
-ignorewarnings
#指定代码的压缩级别 #指定代码的压缩级别
-optimizationpasses 5 -optimizationpasses 5
...@@ -175,11 +176,8 @@ ...@@ -175,11 +176,8 @@
**[] $VALUES; **[] $VALUES;
public *; public *;
} }
# for DexGuard only #zendesk
#-keepresourcexmlelements manifest/application/meta-data@value=GlideModule -keep class zendesk.**{*;}
-keep class com.daunkredit.program.sulu.bean.**{*;}
# OkHttp3 # OkHttp3
-dontwarn okhttp3.logging.** -dontwarn okhttp3.logging.**
-keep class okhttp3.internal.**{*;} -keep class okhttp3.internal.**{*;}
...@@ -230,7 +228,7 @@ ...@@ -230,7 +228,7 @@
######引用的其他Module可以直接在app的这个混淆文件里配置 ######引用的其他Module可以直接在app的这个混淆文件里配置
# 如果使用了Gson之类的工具要使被它解析的JavaBean类即实体类不被混淆。 # 如果使用了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/libpl_droidsonroids_gif.so
#-libraryjars ../android-gif-drawable-1.2.5/src/main/jniLibs/x86_64/libpl_droidsonroids_gif.so #-libraryjars ../android-gif-drawable-1.2.5/src/main/jniLibs/x86_64/libpl_droidsonroids_gif.so
...@@ -332,8 +330,6 @@ ...@@ -332,8 +330,6 @@
-keep class com.appsflyer.** {*;} -keep class com.appsflyer.** {*;}
-keep interface 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 java.** {*;}
-keep class com.coremedia.** {*;} -keep class com.coremedia.** {*;}
......
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <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; package tech.starwin;
import android.app.Activity;
import android.app.Application; import android.app.Application;
import android.content.Context; import android.content.Context;
import android.support.annotation.NonNull;
import android.view.View; 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.SmartRefreshLayout;
import com.scwang.smartrefresh.layout.api.DefaultRefreshFooterCreator; import com.scwang.smartrefresh.layout.api.DefaultRefreshFooterCreator;
import com.scwang.smartrefresh.layout.api.DefaultRefreshHeaderCreator; import com.scwang.smartrefresh.layout.api.DefaultRefreshHeaderCreator;
...@@ -12,10 +20,22 @@ import com.scwang.smartrefresh.layout.api.RefreshHeader; ...@@ -12,10 +20,22 @@ import com.scwang.smartrefresh.layout.api.RefreshHeader;
import com.scwang.smartrefresh.layout.api.RefreshLayout; import com.scwang.smartrefresh.layout.api.RefreshLayout;
import com.scwang.smartrefresh.layout.footer.ClassicsFooter; import com.scwang.smartrefresh.layout.footer.ClassicsFooter;
import com.scwang.smartrefresh.layout.header.ClassicsHeader; 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.R;
import tech.starwin.mvp.beans.InviteResult;
import tech.starwin.network.Gateway; import tech.starwin.network.Gateway;
import tech.starwin.utils.FireBaseHelper;
import tech.starwin.utils.PreferencesManager; 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. * Created by SiKang on 2018/9/30.
...@@ -44,6 +64,11 @@ public class LibConfig { ...@@ -44,6 +64,11 @@ public class LibConfig {
public static String GATEWAY_HOST_G0; public static String GATEWAY_HOST_G0;
public static String GATEWAY_HOST_G1; public static String GATEWAY_HOST_G1;
public static String HARVESTER_IP; 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 int HARVESTER_PORT;
public static ButterKnifeBinder butterKnifeBinder; public static ButterKnifeBinder butterKnifeBinder;
...@@ -56,16 +81,38 @@ public class LibConfig { ...@@ -56,16 +81,38 @@ public class LibConfig {
/** /**
* 为Library绑定一个Context * 初始化 BaseLibrary
*/ */
public static void initLib(Application application) { public static void initLib(Application application) {
if (application != null) { if (application != null) {
CONTEXT = application; CONTEXT = application;
//init FireBase RemoteConfig
//RemoteConfig
FirebaseRemoteConfig.getInstance().setConfigSettings(
new FirebaseRemoteConfigSettings.Builder()
.setDeveloperModeEnabled(LibConfig.DEBUG)
.build()
);
FireBaseHelper.fetchRemoteConfig();
//init SharePreferences
PreferencesManager.get().init(application); PreferencesManager.get().init(application);
//init gateway
Gateway.init(PreferencesManager.get().getGatewayInfo()); 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()的功能 * 用于在Base 中 实现Butterknife.bind()的功能
* *
...@@ -115,4 +162,5 @@ public class LibConfig { ...@@ -115,4 +162,5 @@ public class LibConfig {
} }
}); });
} }
} }
...@@ -7,10 +7,12 @@ import android.support.annotation.NonNull; ...@@ -7,10 +7,12 @@ import android.support.annotation.NonNull;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.support.v4.app.Fragment; import android.support.v4.app.Fragment;
import android.support.v7.app.AppCompatActivity; import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import com.google.firebase.messaging.RemoteMessage;
import com.qmuiteam.qmui.widget.QMUITopBar; import com.qmuiteam.qmui.widget.QMUITopBar;
import com.trello.rxlifecycle2.LifecycleTransformer; import com.trello.rxlifecycle2.LifecycleTransformer;
import com.trello.rxlifecycle2.RxLifecycle; import com.trello.rxlifecycle2.RxLifecycle;
...@@ -21,10 +23,11 @@ import io.reactivex.Observable; ...@@ -21,10 +23,11 @@ import io.reactivex.Observable;
import io.reactivex.subjects.BehaviorSubject; import io.reactivex.subjects.BehaviorSubject;
import tech.starwin.LibConfig; import tech.starwin.LibConfig;
import tech.starwin.R; import tech.starwin.R;
import tech.starwin.common.service.MsgHandleService;
import tech.starwin.mvp.IView; import tech.starwin.mvp.IView;
import tech.starwin.utils.PresenterHoler; import tech.starwin.utils.PresenterHoler;
import tech.starwin.utils.activity_utils.FragmentLauncher; import tech.starwin.utils.context_utils.FragmentLauncher;
import tech.starwin.utils.ui_utils.ProgressHolder; import tech.starwin.widget.ProgressDialog;
/** /**
* Created by SiKang on 2018/9/14. * Created by SiKang on 2018/9/14.
...@@ -49,7 +52,7 @@ public abstract class BaseActivity extends AppCompatActivity implements IView { ...@@ -49,7 +52,7 @@ public abstract class BaseActivity extends AppCompatActivity implements IView {
/** /**
* loading、error 提示 * loading、error 提示
*/ */
protected ProgressHolder progressHolder; protected ProgressDialog progressDialog;
private Object unBinder; private Object unBinder;
...@@ -60,7 +63,7 @@ public abstract class BaseActivity extends AppCompatActivity implements IView { ...@@ -60,7 +63,7 @@ public abstract class BaseActivity extends AppCompatActivity implements IView {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
TAG = getClass().getSimpleName(); TAG = getClass().getSimpleName();
lifecycleSubject.onNext(ActivityEvent.CREATE); lifecycleSubject.onNext(ActivityEvent.CREATE);
progressHolder = new ProgressHolder(this); progressDialog = new ProgressDialog(this);
presenterHelper = new PresenterHoler(this); presenterHelper = new PresenterHoler(this);
//初始化根布局 //初始化根布局
initRootLayout(); initRootLayout();
...@@ -69,6 +72,13 @@ public abstract class BaseActivity extends AppCompatActivity implements IView { ...@@ -69,6 +72,13 @@ public abstract class BaseActivity extends AppCompatActivity implements IView {
@Override @Override
protected void onStart() { protected void onStart() {
super.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); lifecycleSubject.onNext(ActivityEvent.START);
} }
...@@ -82,7 +92,7 @@ public abstract class BaseActivity extends AppCompatActivity implements IView { ...@@ -82,7 +92,7 @@ public abstract class BaseActivity extends AppCompatActivity implements IView {
protected void onPause() { protected void onPause() {
super.onPause(); super.onPause();
lifecycleSubject.onNext(ActivityEvent.PAUSE); lifecycleSubject.onNext(ActivityEvent.PAUSE);
progressHolder.dissmissLoading(); progressDialog.dissmissLoading();
} }
@Override @Override
...@@ -130,14 +140,14 @@ public abstract class BaseActivity extends AppCompatActivity implements IView { ...@@ -130,14 +140,14 @@ public abstract class BaseActivity extends AppCompatActivity implements IView {
@Override @Override
public void onHttpStart(String action, boolean isShowLoading) { public void onHttpStart(String action, boolean isShowLoading) {
if (isShowLoading) { if (isShowLoading) {
progressHolder.showLoading(); progressDialog.showLoading();
} }
} }
@Override @Override
public void onHttpFinish(String action) { public void onHttpFinish(String action) {
progressHolder.dissmissLoading(); progressDialog.dissmissLoading();
} }
......
...@@ -22,7 +22,7 @@ import tech.starwin.LibConfig; ...@@ -22,7 +22,7 @@ import tech.starwin.LibConfig;
import tech.starwin.R; import tech.starwin.R;
import tech.starwin.mvp.IView; import tech.starwin.mvp.IView;
import tech.starwin.utils.PresenterHoler; import tech.starwin.utils.PresenterHoler;
import tech.starwin.utils.ui_utils.ProgressHolder; import tech.starwin.widget.ProgressDialog;
import tech.starwin.utils.ui_utils.UIHelper; import tech.starwin.utils.ui_utils.UIHelper;
/** /**
...@@ -45,7 +45,7 @@ public abstract class BaseFragment extends Fragment implements IView { ...@@ -45,7 +45,7 @@ public abstract class BaseFragment extends Fragment implements IView {
/** /**
* loading、error 提示 * loading、error 提示
*/ */
protected ProgressHolder progressHolder; protected ProgressDialog progressDialog;
/** /**
* LifeCycle * LifeCycle
...@@ -61,7 +61,7 @@ public abstract class BaseFragment extends Fragment implements IView { ...@@ -61,7 +61,7 @@ public abstract class BaseFragment extends Fragment implements IView {
TAG = getClass().getName(); TAG = getClass().getName();
lifecycleSubject.onNext(ActivityEvent.CREATE); lifecycleSubject.onNext(ActivityEvent.CREATE);
presenterHelper = new PresenterHoler(this); presenterHelper = new PresenterHoler(this);
progressHolder = new ProgressHolder(getActivity()); progressDialog = new ProgressDialog(getActivity());
mContentView = (ViewGroup) LayoutInflater.from(getActivity()).inflate(R.layout.base_activity_root, null); mContentView = (ViewGroup) LayoutInflater.from(getActivity()).inflate(R.layout.base_activity_root, null);
if (useTopBar()) { if (useTopBar()) {
mTopBar = LayoutInflater.from(getActivity()).inflate(R.layout.base_topbar, mContentView, true).findViewById(R.id.layout_topbar); 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 { ...@@ -105,13 +105,13 @@ public abstract class BaseFragment extends Fragment implements IView {
@Override @Override
public void onHttpStart(String action, boolean isShowLoading) { public void onHttpStart(String action, boolean isShowLoading) {
if (isShowLoading) { if (isShowLoading) {
progressHolder.showLoading(); progressDialog.showLoading();
} }
} }
@Override @Override
public void onHttpFinish(String action) { public void onHttpFinish(String action) {
progressHolder.dissmissLoading(); progressDialog.dissmissLoading();
} }
...@@ -132,7 +132,7 @@ public abstract class BaseFragment extends Fragment implements IView { ...@@ -132,7 +132,7 @@ public abstract class BaseFragment extends Fragment implements IView {
public void onPause() { public void onPause() {
super.onPause(); super.onPause();
lifecycleSubject.onNext(ActivityEvent.PAUSE); lifecycleSubject.onNext(ActivityEvent.PAUSE);
progressHolder.dissmissLoading(); progressDialog.dissmissLoading();
} }
@Override @Override
......
...@@ -78,16 +78,15 @@ public class BasePresenter<T> { ...@@ -78,16 +78,15 @@ public class BasePresenter<T> {
}); });
} }
@SuppressLint("CheckResult")
protected <T> void handleRequest(Call<T> call, final Observer<T> observer) { protected <T> void handleRequest(Call<T> call, final Observer<T> observer) {
observer.onSubscribe(null); observer.onSubscribe(null);
call.enqueue(new Callback<T>() { call.enqueue(new Callback<T>() {
@Override @Override
public void onResponse(Call<T> call, final Response<T> response) { public void onResponse(Call<T> call, final Response<T> response) {
bindLifecycle(new Consumer<Boolean>() { bindLifecycle(new Consumer() {
@Override @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> { ...@@ -48,6 +48,8 @@ public abstract class HttpObserver<T> implements Observer<T> {
} }
} else if (msg.contains("java.lang.IllegalStateException")) { } else if (msg.contains("java.lang.IllegalStateException")) {
onError(Error.APP_ERROR, LibConfig.getContext().getString(R.string.text_app_error)); 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; ...@@ -5,7 +5,7 @@ import android.view.View;
/** /**
* Created by SiKang on 2018/9/18. * 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 abstract void onNoShakeClick(View view);
public int lockTime = 1500; public int lockTime = 1500;
...@@ -18,14 +18,15 @@ public abstract class OnNoShakeClickListener implements View.OnClickListener { ...@@ -18,14 +18,15 @@ public abstract class OnNoShakeClickListener implements View.OnClickListener {
} }
@Override @Override
public void onClick(final View view) { public void onClick(final View v) {
view.setClickable(false); super.onClick(v);
view.postDelayed(new Runnable() { v.setClickable(false);
v.postDelayed(new Runnable() {
@Override @Override
public void run() { public void run() {
view.setClickable(true); v.setClickable(true);
} }
}, lockTime); }, 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; package tech.starwin.mvp.api;
import java.util.List;
import io.reactivex.Observable; import io.reactivex.Observable;
import okhttp3.ResponseBody;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET; import retrofit2.http.GET;
import retrofit2.http.Header; 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.LatestLoanAppBean;
import tech.starwin.mvp.beans.LoanRange; import tech.starwin.mvp.beans.LoanRange;
import tech.starwin.mvp.beans.ProgressBean; import tech.starwin.mvp.beans.ProgressBean;
...@@ -37,4 +47,43 @@ public interface LoanApi { ...@@ -37,4 +47,43 @@ public interface LoanApi {
@GET("loanapp/latest/v2") @GET("loanapp/latest/v2")
Observable<LatestLoanAppBean> getLatestLoanApp(@Header("X-AUTH-TOKEN") String token); 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; ...@@ -18,6 +18,13 @@ import tech.starwin.mvp.beans.OcrResultBean;
import tech.starwin.mvp.beans.RecordFilesResponse; import tech.starwin.mvp.beans.RecordFilesResponse;
public interface UploadApi { public interface UploadApi {
/**
* 上传照片
*
* @param fileType 照片类型 KTP_PHOTO:身份证;
* EMPLOYMENT_PHOTO:工作证件;
* CONTRACT_VIDEO:合同;
*/
@Multipart @Multipart
@PUT("record/files") @PUT("record/files")
Call<ResponseBody> uploadPhoto( Call<ResponseBody> uploadPhoto(
...@@ -49,10 +56,25 @@ public interface UploadApi { ...@@ -49,10 +56,25 @@ public interface UploadApi {
@Query("imei") String imei, @Query("imei") String imei,
@Header("X-AUTH-TOKEN") String token); @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识别 * 身份证ocr识别
* */ */
@Multipart @Multipart
@PUT("/record/ocr") @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 { ...@@ -114,6 +114,21 @@ public interface UserApi {
@GET @GET
Observable<GatewayInfoBean> getGateway(@Url String url); 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 @FormUrlEncoded
@PUT("record/employment") @PUT("record/employment")
Observable<ResponseBody> submitEmploymentInfo(@Field("companyName") String companyName, Observable<ResponseBody> submitEmploymentInfo(@Field("companyName") String companyName,
...@@ -128,6 +143,10 @@ public interface UserApi { ...@@ -128,6 +143,10 @@ public interface UserApi {
// @Field("workEmail") String workEmail, // @Field("workEmail") String workEmail,
@Header("X-AUTH-TOKEN") String token); @Header("X-AUTH-TOKEN") String token);
/**
* 提交个人信息
*/
@FormUrlEncoded @FormUrlEncoded
@PUT("record/personalinfo") @PUT("record/personalinfo")
Observable<ResponseBody> submitPersonalInfo(@Field("fullName") String fullName, Observable<ResponseBody> submitPersonalInfo(@Field("fullName") String fullName,
...@@ -146,126 +165,99 @@ public interface UserApi { ...@@ -146,126 +165,99 @@ public interface UserApi {
@Field("facebookId") String facebookId, @Field("facebookId") String facebookId,
@Header("X-AUTH-TOKEN") String token); @Header("X-AUTH-TOKEN") String token);
@FormUrlEncoded /**
@PUT("record/contact") * 刷新token
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
);
@POST("auth/refresh") @POST("auth/refresh")
Observable<Result<TokenInfoBean>> refreshToken(@Query("mobile") String mobile, Observable<Result<TokenInfoBean>> refreshToken(@Query("mobile") String mobile,
@Query("tokenInvalid") String refreshToken); @Query("tokenInvalid") String refreshToken);
/**
* 退出登录
*/
@FormUrlEncoded @FormUrlEncoded
@POST("auth/logout") @POST("auth/logout")
Observable<ResponseBody> logout(@Field("token") String token); 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") @GET("info/inbox/all")
Observable<List<MsgInboxBean>> getMsgInbox(@Header("X-AUTH-TOKEN") String token); Observable<List<MsgInboxBean>> getMsgInbox(@Header("X-AUTH-TOKEN") String token);
/**
* 已读消息列表
*/
@FormUrlEncoded @FormUrlEncoded
@POST("info/inbox/read") @POST("info/inbox/read")
Observable<ResponseBody> sendReadMsg(@Field("msgId") String msgId, Observable<ResponseBody> sendReadMsg(@Field("msgId") String msgId,
@Header("X-AUTH-TOKEN") String token); @Header("X-AUTH-TOKEN") String token);
/**
* 获取联系人信息
*/
@GET("record/contact") @GET("record/contact")
Observable<ContactInfoBean> getContactInfo(@Header("X-AUTH-TOKEN") String token); Observable<ContactInfoBean> getContactInfo(@Header("X-AUTH-TOKEN") String token);
/**
* 获取工作认证信息
*/
@GET("record/employment") @GET("record/employment")
Observable<EmploymentServerBean> getEmploymentInfo(@Header("X-AUTH-TOKEN") String token); 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") @GET("version/latest")
Observable<ResponseBody> getVersionInfo(); Observable<ResponseBody> getVersionInfo();
/** /**
* obtain loan range(min --- max) * 获取邀请码
*
* @return
*/ */
@GET("loanapp/range")
Observable<LoanRange> getLoanRange();
@GET("invitation/mine/code") @GET("invitation/mine/code")
Observable<ResponseBody> getInviteCode(@Header("X-AUTH-TOKEN") String token); Observable<ResponseBody> getInviteCode(@Header("X-AUTH-TOKEN") String token);
@GET("invitation/mine/invitee") @GET("invitation/mine/invitee")
Observable<InviteeBean> getInviteInfo(@Header("X-AUTH-TOKEN") String token); 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") @GET("coupon/available")
Observable<List<CouponBean>> getAvailableCoupon(@Header("X-AUTH-TOKEN") String token); Observable<List<CouponBean>> getAvailableCoupon(@Header("X-AUTH-TOKEN") String token);
/**
* 获取已使用的优惠券
*/
@GET("coupon/used") @GET("coupon/used")
Observable<List<CouponBean>> getUsedCoupon(@Header("X-AUTH-TOKEN") String token); Observable<List<CouponBean>> getUsedCoupon(@Header("X-AUTH-TOKEN") String token);
/**
* 获取过期优惠券
*/
@GET("coupon/outdated") @GET("coupon/outdated")
Observable<List<CouponBean>> getOutdatedCoupon(@Header("X-AUTH-TOKEN") String token); Observable<List<CouponBean>> getOutdatedCoupon(@Header("X-AUTH-TOKEN") String token);
/**
* 获取活动Bannder信息
*/
@GET("banner") @GET("banner")
Observable<ArrayList<ActivityInfoBean>> getActivityList(); Observable<ArrayList<ActivityInfoBean>> getActivityList();
@GET("invitation/mine/invitee/list") /**
Observable<ArrayList<InviteePersonBean>> getInvitedList(@Header("X-AUTH-TOKEN") String token); *
* */
@GET("loanapp/repayment-amount-detail") @GET("loanapp/repayment-amount-detail")
Observable<LoaningAmoutBean> getLoanAmoutData(@Query("principal") double amount, @Query("period") int day, @Query("periodUnit") String periodUnit); Observable<LoaningAmoutBean> getLoanAmoutData(@Query("principal") double amount, @Query("period") int day, @Query("periodUnit") String periodUnit);
...@@ -291,5 +283,31 @@ public interface UserApi { ...@@ -291,5 +283,31 @@ public interface UserApi {
@GET("loanapp/display") @GET("loanapp/display")
Observable<DisplayBean> 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; package tech.starwin.mvp.beans;
public class BannerMessageDto { import java.io.Serializable;
public class BannerMessageDto implements Serializable {
public long id; public long id;
public String content; public String content;
......
package tech.starwin.mvp.beans; package tech.starwin.mvp.beans;
import java.io.Serializable;
/** /**
* Created by SiKang on 2018/9/30. * Created by SiKang on 2018/9/30.
*/ */
public class BasicAck { public class BasicAck implements Serializable {
private String code; private String code;
private String message; private String message;
private String data; private String data;
......
package tech.starwin.mvp.beans; package tech.starwin.mvp.beans;
import java.io.Serializable;
/** /**
* Created by SiKang on 2018/9/20. * Created by SiKang on 2018/9/20.
*/ */
public class CertBean { public class CertBean implements Serializable {
public boolean isComplete; public boolean isComplete;
} }
package tech.starwin.mvp.beans; package tech.starwin.mvp.beans;
import java.io.Serializable;
/** /**
* Created by Miaoke on 2017/3/1. * Created by Miaoke on 2017/3/1.
*/ */
public class ContactInfoBean { public class ContactInfoBean implements Serializable {
/** /**
* friendMobile : string * friendMobile : string
......
package tech.starwin.mvp.beans; package tech.starwin.mvp.beans;
import java.io.Serializable;
import java.util.List; import java.util.List;
/** /**
* Created by Miaoke on 2017/3/13. * Created by Miaoke on 2017/3/13.
*/ */
public class DepositMethodsBean { public class DepositMethodsBean implements Serializable {
private List<String> depositMethods; private List<String> depositMethods;
......
package tech.starwin.mvp.beans; package tech.starwin.mvp.beans;
import java.io.Serializable;
/** /**
* Created by Miaoke on 2017/3/13. * Created by Miaoke on 2017/3/13.
*/ */
public class DepositResponseBean { public class DepositResponseBean implements Serializable {
/** /**
......
package tech.starwin.mvp.beans; package tech.starwin.mvp.beans;
import java.io.Serializable;
/** /**
* Created by Miaoke on 2017/3/1. * Created by Miaoke on 2017/3/1.
*/ */
public class EmploymentBean { public class EmploymentBean implements Serializable {
/** /**
...@@ -21,15 +23,15 @@ public class EmploymentBean { ...@@ -21,15 +23,15 @@ public class EmploymentBean {
* workEmail : string * workEmail : string
*/ */
public String companyName; private String companyName;
public RegionBean.RegionsBean companyProvince ; private RegionBean.RegionsBean companyProvince ;
public RegionBean.RegionsBean companyCity; private RegionBean.RegionsBean companyCity;
public RegionBean.RegionsBean companyDistrict; private RegionBean.RegionsBean companyDistrict;
public RegionBean.RegionsBean companyArea; private RegionBean.RegionsBean companyArea;
public String companyAddress; private String companyAddress;
public String companyPhone; private String companyPhone;
public String salary; private String salary;
public String mJobType; private String jobType;
public EmploymentBean() { public EmploymentBean() {
} }
...@@ -53,27 +55,75 @@ public class EmploymentBean { ...@@ -53,27 +55,75 @@ public class EmploymentBean {
} }
public String getCompanyName() {
return companyName;
}
public void setCompanyName(String companyName) { public void setCompanyName(String companyName) {
this.companyName = 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) { public void setCompanyAddress(String companyAddress) {
this.companyAddress = companyAddress; this.companyAddress = companyAddress;
} }
public String getCompanyPhone() {
return companyPhone;
}
public void setCompanyPhone(String companyPhone) { public void setCompanyPhone(String companyPhone) {
this.companyPhone = companyPhone; this.companyPhone = companyPhone;
} }
public String getSalary() {
return salary;
}
public void setSalary(String salary) { public void setSalary(String salary) {
this.salary = salary; this.salary = salary;
} }
public String getJobType() {
return jobType;
}
public void setJobType(String jobType) { public void setJobType(String jobType) {
mJobType = jobType; this.jobType = jobType;
} }
} }
package tech.starwin.mvp.beans; package tech.starwin.mvp.beans;
import java.io.Serializable;
/** /**
* Created by Miaoke on 31/03/2017. * Created by Miaoke on 31/03/2017.
*/ */
public class EmploymentServerBean { public class EmploymentServerBean implements Serializable {
/** /**
* companyAddress : string * companyAddress : string
......
package tech.starwin.mvp.beans; package tech.starwin.mvp.beans;
import java.io.Serializable;
/** /**
* @作者:XJY * @作者:XJY
* @创建日期: 2017/3/15 14:58 * @创建日期: 2017/3/15 14:58
...@@ -9,7 +11,7 @@ package tech.starwin.mvp.beans; ...@@ -9,7 +11,7 @@ package tech.starwin.mvp.beans;
* @更新描述:${TODO} * @更新描述:${TODO}
*/ */
public class HistoryLoanAppInfoBean extends LoanAppBeanFather { public class HistoryLoanAppInfoBean extends LoanAppBeanFather implements Serializable {
/** /**
......
package tech.starwin.mvp.beans; package tech.starwin.mvp.beans;
import java.io.Serializable;
/** /**
* Created by SiKang on 2018/9/30. * Created by SiKang on 2018/9/30.
*/ */
public class IdentifyBean { public class IdentifyBean implements Serializable {
private String name; private String name;
private String ktp; private String ktp;
private String gender; private String gender;
......
package tech.starwin.mvp.beans; package tech.starwin.mvp.beans;
import java.io.Serializable;
/** /**
* Created by SiKang on 2018/9/30. * Created by SiKang on 2018/9/30.
*/ */
public class InviteResult { public class InviteResult implements Serializable {
private InviteePersonBean list; private InviteePersonBean list;
private InviteeBean bean; private InviteeBean bean;
private String code; private String code;
......
package tech.starwin.mvp.beans; package tech.starwin.mvp.beans;
import java.io.Serializable;
/** /**
* Created by SiKang on 2018/9/30. * Created by SiKang on 2018/9/30.
*/ */
public class InviteeBean { public class InviteeBean implements Serializable {
private int completeLoanApplyCount; private int completeLoanApplyCount;
private int inviteeCount; private int inviteeCount;
......
package tech.starwin.mvp.beans; package tech.starwin.mvp.beans;
import java.io.Serializable;
/** /**
* Created by SiKang on 2018/9/30. * Created by SiKang on 2018/9/30.
*/ */
public class InviteePersonBean { public class InviteePersonBean implements Serializable {
private String mobile; private String mobile;
private String realName; private String realName;
private String registerTime; private String registerTime;
......
package tech.starwin.mvp.beans; package tech.starwin.mvp.beans;
import java.io.Serializable;
/** /**
* Created by Miaoke on 2017/3/6. * Created by Miaoke on 2017/3/6.
*/ */
public class LatestLoanAppBean extends LoanAppBeanFather { public class LatestLoanAppBean extends LoanAppBeanFather implements Serializable {
/** /**
......
package tech.starwin.mvp.beans; package tech.starwin.mvp.beans;
import java.io.Serializable;
/** /**
* @作者:My * @作者:My
* @创建日期: 2017/3/20 11:35 * @创建日期: 2017/3/20 11:35
...@@ -9,7 +11,7 @@ package tech.starwin.mvp.beans; ...@@ -9,7 +11,7 @@ package tech.starwin.mvp.beans;
* @更新描述:${TODO} * @更新描述:${TODO}
*/ */
public class LoanAppHelpCenterTipsBean { public class LoanAppHelpCenterTipsBean implements Serializable {
public String mTitle; public String mTitle;
public String mDetail; public String mDetail;
} }
package tech.starwin.mvp.beans; package tech.starwin.mvp.beans;
import java.io.Serializable;
/** /**
* @作者:My * @作者:My
* @创建日期: 2017/7/19 17:47 * @创建日期: 2017/7/19 17:47
...@@ -9,7 +11,7 @@ package tech.starwin.mvp.beans; ...@@ -9,7 +11,7 @@ package tech.starwin.mvp.beans;
* @更新描述:${TODO} * @更新描述:${TODO}
*/ */
public class LoanRange { public class LoanRange implements Serializable {
private Double amountStep; private Double amountStep;
private Double interestRate; private Double interestRate;
private Double maxAmount; private Double maxAmount;
......
package tech.starwin.mvp.beans; package tech.starwin.mvp.beans;
import java.io.Serializable;
/** /**
* Created by SiKang on 2018/9/30. * Created by SiKang on 2018/9/30.
*/ */
public class LoaningAmoutBean { public class LoaningAmoutBean implements Serializable {
private double dueAmount; private double dueAmount;
private double interest; private double interest;
private double serviceFee; private double serviceFee;
......
package tech.starwin.mvp.beans; package tech.starwin.mvp.beans;
import java.io.Serializable;
/** /**
* Created by localuser on 2017/2/27. * Created by localuser on 2017/2/27.
*/ */
public class LoginRequestBean { public class LoginRequestBean implements Serializable {
public Mobile mobile; public Mobile mobile;
public SMSCode smsCode; public SMSCode smsCode;
......
package tech.starwin.mvp.beans; package tech.starwin.mvp.beans;
import java.io.Serializable;
/** /**
* @作者:My * @作者:My
* @创建日期: 2017/4/5 17:17 * @创建日期: 2017/4/5 17:17
...@@ -10,6 +12,6 @@ package tech.starwin.mvp.beans; ...@@ -10,6 +12,6 @@ package tech.starwin.mvp.beans;
* @更新描述:${TODO} * @更新描述:${TODO}
*/ */
public class LoginStatusBean { public class LoginStatusBean implements Serializable {
public long mChangTime = 1L; public long mChangTime = 1L;
} }
package tech.starwin.mvp.beans; package tech.starwin.mvp.beans;
import java.io.Serializable;
/** /**
* Created by SiKang on 2018/9/30. * Created by SiKang on 2018/9/30.
*/ */
public class MessageBean { public class MessageBean implements Serializable {
private boolean fromMe; private boolean fromMe;
private String time; private String time;
private String message; private String message;
......
package tech.starwin.mvp.beans; package tech.starwin.mvp.beans;
import java.io.Serializable;
/** /**
* Created by Miaoke on 2017/3/24. * Created by Miaoke on 2017/3/24.
*/ */
public class MsgInboxBean { public class MsgInboxBean implements Serializable {
/** /**
* createTime : 2017-03-24T09:56:37.757Z * createTime : 2017-03-24T09:56:37.757Z
......
...@@ -2,12 +2,14 @@ package tech.starwin.mvp.beans; ...@@ -2,12 +2,14 @@ package tech.starwin.mvp.beans;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import java.io.Serializable;
/** /**
* Created by Miaoke on 2017/3/1. * Created by Miaoke on 2017/3/1.
*/ */
public class PersonalInfoBean { public class PersonalInfoBean implements Serializable {
/** /**
......
...@@ -2,11 +2,13 @@ package tech.starwin.mvp.beans; ...@@ -2,11 +2,13 @@ package tech.starwin.mvp.beans;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import java.io.Serializable;
/** /**
* Created by Miaoke on 31/03/2017. * Created by Miaoke on 31/03/2017.
*/ */
public class PersonalInfoServerBean { public class PersonalInfoServerBean implements Serializable {
/** /**
* address : string * address : string
......
package tech.starwin.mvp.beans; package tech.starwin.mvp.beans;
import java.io.File; import java.io.File;
import java.io.Serializable;
/** /**
* @作者:My * @作者:My
...@@ -11,8 +12,8 @@ import java.io.File; ...@@ -11,8 +12,8 @@ import java.io.File;
* @更新描述:${TODO} * @更新描述:${TODO}
*/ */
public class PhotoInfo { public class PhotoInfo implements Serializable {
public File mFile; public File mFile;
public boolean isKTP; public boolean isKTP;
} }
package tech.starwin.mvp.beans; package tech.starwin.mvp.beans;
import java.io.Serializable;
/** /**
* Created by Miaoke on 2017/3/20. * Created by Miaoke on 2017/3/20.
*/ */
public class ProgressBean { public class ProgressBean implements Serializable {
/** /**
* personalInfoPart : false * personalInfoPart : false
......
package tech.starwin.mvp.beans; package tech.starwin.mvp.beans;
import java.io.Serializable;
import java.util.List; import java.util.List;
/** /**
* Created by localuser on 2017/3/1. * Created by localuser on 2017/3/1.
*/ */
public class RecordFilesResponse { public class RecordFilesResponse implements Serializable {
private List<FilesBean> files; private List<FilesBean> files;
public List<FilesBean> getFiles() { public List<FilesBean> getFiles() {
......
package tech.starwin.mvp.beans; package tech.starwin.mvp.beans;
import java.io.Serializable;
import java.util.List; import java.util.List;
/** /**
* Created by Miaoke on 2017/3/10. * Created by Miaoke on 2017/3/10.
*/ */
public class RegionBean { public class RegionBean implements Serializable {
private List<RegionsBean> regions; private List<RegionsBean> regions;
......
package tech.starwin.mvp.beans; package tech.starwin.mvp.beans;
import java.io.Serializable;
/** /**
* Created by Miaoke on 30/03/2017. * Created by Miaoke on 30/03/2017.
*/ */
public class ResponseErrorBody { public class ResponseErrorBody implements Serializable {
/** /**
* error : err.auth.access.denied * error : err.auth.access.denied
......
package tech.starwin.mvp.beans; package tech.starwin.mvp.beans;
import java.io.Serializable;
/** /**
* Created by SiKang on 2018/9/14. * Created by SiKang on 2018/9/14.
*/ */
public class Result<T> { public class Result<T> implements Serializable {
public int code; public int code;
public String msg; public String msg;
public T data; public T data;
......
package tech.starwin.mvp.beans; package tech.starwin.mvp.beans;
import java.io.Serializable;
/** /**
* Created by SiKang on 2018/9/30. * Created by SiKang on 2018/9/30.
*/ */
public class UserBankInfo { public class UserBankInfo implements Serializable {
private String bankCode; private String bankCode;
private String branch; private String branch;
private String cardNo; private String cardNo;
......
package tech.starwin.mvp.beans; package tech.starwin.mvp.beans;
public class UserInfo { import java.io.Serializable;
public class UserInfo implements Serializable {
public String headIcon; public String headIcon;
public String nicky; public String nicky;
......
package tech.starwin.mvp.beans; package tech.starwin.mvp.beans;
import java.io.Serializable;
/** /**
* @作者:My * @作者:My
* @创建日期: 2017/3/31 16:55 * @创建日期: 2017/3/31 16:55
...@@ -9,7 +11,7 @@ package tech.starwin.mvp.beans; ...@@ -9,7 +11,7 @@ package tech.starwin.mvp.beans;
* @更新描述:${TODO} * @更新描述:${TODO}
*/ */
public class YWUser { public class YWUser implements Serializable {
/** /**
* userid : 59523e9f4736c2cab70a470f088b53dd * userid : 59523e9f4736c2cab70a470f088b53dd
......
...@@ -42,5 +42,20 @@ public class LoanPresenter extends BasePresenter<LoanApi> { ...@@ -42,5 +42,20 @@ public class LoanPresenter extends BasePresenter<LoanApi> {
handleRequest(action, apiService.getLatestLoanApp(LoginManager.get().getToken())); 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; package tech.starwin.mvp.presenter;
import android.annotation.SuppressLint;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import com.google.gson.Gson; import com.google.gson.Gson;
...@@ -8,11 +10,17 @@ import com.google.gson.Gson; ...@@ -8,11 +10,17 @@ import com.google.gson.Gson;
import java.io.File; import java.io.File;
import java.util.List; import java.util.List;
import io.reactivex.Observable;
import io.reactivex.functions.BiFunction;
import okhttp3.MultipartBody; import okhttp3.MultipartBody;
import okhttp3.ResponseBody;
import tech.starwin.base.BasePresenter; import tech.starwin.base.BasePresenter;
import tech.starwin.common.impl.HttpObserver; import tech.starwin.common.impl.HttpObserver;
import tech.starwin.mvp.api.UploadApi; 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.mvp.beans.OcrResultBean;
import tech.starwin.network.ServiceGenerator;
import tech.starwin.utils.LoginManager; import tech.starwin.utils.LoginManager;
import tech.starwin.utils.MultipartBodyMaker; import tech.starwin.utils.MultipartBodyMaker;
...@@ -28,12 +36,8 @@ public class UploadPresenter extends BasePresenter<UploadApi> { ...@@ -28,12 +36,8 @@ public class UploadPresenter extends BasePresenter<UploadApi> {
/** /**
* 身份证ocr识别 * 身份证ocr识别
*/ */
public void identityOcr(final String action, @Nullable File file) { public void identityOcr(final String action, @NonNull File file) {
List<MultipartBody.Part> parts = new MultipartBodyMaker.Builder() handleRequest(apiService.identityOcr(MultipartBodyMaker.makeSimplePart("file", file), LoginManager.get().getToken()), new HttpObserver<OcrResultBean>() {
.addDataPart("file", file)
.build().makeParts();
handleRequest(apiService.identityOcr(parts, LoginManager.get().getToken()), new HttpObserver<OcrResultBean>() {
@Override @Override
public void onStart() { public void onStart() {
view.onHttpStart(action, true); view.onHttpStart(action, true);
...@@ -59,4 +63,33 @@ public class UploadPresenter extends BasePresenter<UploadApi> { ...@@ -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; ...@@ -8,12 +8,15 @@ import io.reactivex.ObservableSource;
import io.reactivex.functions.Consumer; import io.reactivex.functions.Consumer;
import io.reactivex.functions.Function; import io.reactivex.functions.Function;
import io.reactivex.functions.Predicate; import io.reactivex.functions.Predicate;
import okhttp3.ResponseBody;
import tech.starwin.base.BasePresenter; import tech.starwin.base.BasePresenter;
import tech.starwin.common.impl.HttpObserver; import tech.starwin.common.impl.HttpObserver;
import tech.starwin.mvp.api.UserApi; import tech.starwin.mvp.api.UserApi;
import tech.starwin.mvp.beans.EmploymentBean;
import tech.starwin.mvp.beans.GatewayInfoBean; import tech.starwin.mvp.beans.GatewayInfoBean;
import tech.starwin.mvp.beans.TokenInfoBean; import tech.starwin.mvp.beans.TokenInfoBean;
import tech.starwin.network.Gateway; import tech.starwin.network.Gateway;
import tech.starwin.network.ServiceGenerator;
import tech.starwin.utils.LoginManager; import tech.starwin.utils.LoginManager;
/** /**
...@@ -152,6 +155,37 @@ public class UserPresenter extends BasePresenter<UserApi> { ...@@ -152,6 +155,37 @@ public class UserPresenter extends BasePresenter<UserApi> {
handleRequest(action, apiService.getRegion(level, id)); 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; package tech.starwin.network;
import com.google.firebase.remoteconfig.FirebaseRemoteConfig;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import tech.starwin.LibConfig; import tech.starwin.LibConfig;
import tech.starwin.mvp.beans.GatewayInfoBean; import tech.starwin.mvp.beans.GatewayInfoBean;
import tech.starwin.utils.LogUtils;
/** /**
* Created by SiKang on 2018/9/28. * Created by SiKang on 2018/9/28.
......
...@@ -16,7 +16,9 @@ public class NullOnEmptyConverterFactory extends Converter.Factory { ...@@ -16,7 +16,9 @@ public class NullOnEmptyConverterFactory extends Converter.Factory {
return new Converter<ResponseBody, Object>() { return new Converter<ResponseBody, Object>() {
@Override @Override
public Object convert(ResponseBody body) throws IOException { 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); return delegate.convert(body);
} }
}; };
......
...@@ -29,6 +29,7 @@ public class ServiceGenerator { ...@@ -29,6 +29,7 @@ public class ServiceGenerator {
.connectTimeout(TIME_OUT, TimeUnit.SECONDS) .connectTimeout(TIME_OUT, TimeUnit.SECONDS)
.writeTimeout(TIME_OUT, TimeUnit.SECONDS) .writeTimeout(TIME_OUT, TimeUnit.SECONDS)
.readTimeout(TIME_OUT, TimeUnit.SECONDS) .readTimeout(TIME_OUT, TimeUnit.SECONDS)
.addInterceptor(new DefaultHeaderAddInterceptor())
.build(); .build();
serviceMap = new HashMap<>(); 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; package tech.starwin.utils;
import android.annotation.SuppressLint;
import android.content.Context; import android.content.Context;
import android.content.pm.PackageInfo; import android.content.pm.PackageInfo;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.provider.Settings;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentManager;
...@@ -18,11 +20,14 @@ import java.io.IOException; ...@@ -18,11 +20,14 @@ import java.io.IOException;
import java.io.ObjectInputStream; import java.io.ObjectInputStream;
import java.io.ObjectOutputStream; import java.io.ObjectOutputStream;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.DateFormat; import java.text.DateFormat;
import java.text.ParseException; import java.text.ParseException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.UUID;
import tech.starwin.R; import tech.starwin.R;
...@@ -183,6 +188,43 @@ public class GeneralUtils { ...@@ -183,6 +188,43 @@ public class GeneralUtils {
return null; 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) { public static void findAndModifyOpInBackStackRecord(FragmentManager fragmentManager, int backStackIndex, OPHandler handler) {
if (fragmentManager == null || handler == null) { if (fragmentManager == null || handler == null) {
......
package tech.starwin.utils; package tech.starwin.utils;
import android.content.Context;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log; 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; import tech.starwin.BuildConfig;
......
package tech.starwin.utils; package tech.starwin.utils;
import android.content.ActivityNotFoundException; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentActivity;
import com.facebook.accountkit.AccountKitError; import com.facebook.accountkit.AccountKitError;
...@@ -10,15 +12,18 @@ import com.facebook.accountkit.ui.AccountKitActivity; ...@@ -10,15 +12,18 @@ import com.facebook.accountkit.ui.AccountKitActivity;
import com.facebook.accountkit.ui.AccountKitConfiguration; import com.facebook.accountkit.ui.AccountKitConfiguration;
import com.facebook.accountkit.ui.LoginType; import com.facebook.accountkit.ui.LoginType;
import java.util.List;
import tech.starwin.LibConfig; import tech.starwin.LibConfig;
import tech.starwin.mvp.beans.TokenInfoBean; import tech.starwin.mvp.beans.TokenInfoBean;
import tech.starwin.utils.activity_utils.EasyActivityResult; import tech.starwin.utils.context_utils.EasyActivityResult;
import tech.starwin.utils.activity_utils.IntentHolder; import tech.starwin.utils.context_utils.IntentHolder;
/** /**
* Created by SiKang on 2018/9/19. * Created by SiKang on 2018/9/19.
*/ */
public class LoginManager { public class LoginManager {
public static final String TAG = "LoginManager";
private static LoginManager loginManager; private static LoginManager loginManager;
private TokenInfoBean tokenInfo; private TokenInfoBean tokenInfo;
...@@ -43,12 +48,12 @@ public class LoginManager { ...@@ -43,12 +48,12 @@ public class LoginManager {
//清除登录状态 //清除登录状态
PreferencesManager.get().clearLoginInfo(); PreferencesManager.get().clearLoginInfo();
tokenInfo = null; tokenInfo = null;
try { //跳转登录界面
//跳转登录界面 if (isActionSupport(LibConfig.getContext(), LibConfig.LOGIN_ACTIVITY_ACTION)) {
new IntentHolder.Builder(LibConfig.getContext(), LibConfig.LOGIN_ACTIVITY_ACTION) new IntentHolder.Builder(LibConfig.getContext(), LibConfig.LOGIN_ACTIVITY_ACTION)
.build().start(); .build().start();
} catch (ActivityNotFoundException e) { } else {
throw new RuntimeException("找不到LoginActivity,请在build.gradle中配置正确的 ‘LOGIN_ACTIVITY_ACTION’ "); LogUtils.e(TAG, "找不到LoginActivity,请在build.gradle中配置正确的 ‘LOGIN_ACTIVITY_ACTION’ ");
} }
} }
...@@ -122,4 +127,18 @@ public class LoginManager { ...@@ -122,4 +127,18 @@ public class LoginManager {
void onLoginCancelled(); 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; ...@@ -9,7 +9,6 @@ import okhttp3.RequestBody;
/** /**
* Created by SiKang on 2018/9/28. * Created by SiKang on 2018/9/28.
*
*/ */
public class MultipartBodyMaker { public class MultipartBodyMaker {
MultipartBody.Builder builder; MultipartBody.Builder builder;
...@@ -22,6 +21,12 @@ public class MultipartBodyMaker { ...@@ -22,6 +21,12 @@ public class MultipartBodyMaker {
return builder.build().parts(); 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 { public static class Builder {
MultipartBody.Builder builder; MultipartBody.Builder builder;
......
package tech.starwin.utils.activity_utils; package tech.starwin.utils.context_utils;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; 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.content.Intent;
import android.support.v4.app.Fragment; import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentActivity;
...@@ -43,6 +44,10 @@ public class EasyActivityResult { ...@@ -43,6 +44,10 @@ public class EasyActivityResult {
mAvoidOnResultFragment.startForResult(intent, requestCode, activityReesult); 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 { public interface OnResultListener {
void onActivityResult(int requestCode, int resultCode, Intent data); 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.annotation.IdRes;
import android.support.v4.app.Fragment; import android.support.v4.app.Fragment;
......
package tech.starwin.utils.activity_utils; package tech.starwin.utils.context_utils;
import android.app.Activity; import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle;
import java.io.Serializable; import java.io.Serializable;
...@@ -27,6 +28,9 @@ public class IntentHolder { ...@@ -27,6 +28,9 @@ public class IntentHolder {
* 打开Activity * 打开Activity
*/ */
public void start() { public void start() {
if (context == null) {
return;
}
context.startActivity(intent); context.startActivity(intent);
if (context instanceof Activity) { if (context instanceof Activity) {
((Activity) context).overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_left); ((Activity) context).overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_left);
...@@ -37,6 +41,8 @@ public class IntentHolder { ...@@ -37,6 +41,8 @@ public class IntentHolder {
* 在新的Task种打开Activity * 在新的Task种打开Activity
*/ */
public void startWithNewTask() { public void startWithNewTask() {
if (context == null)
return;
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent); context.startActivity(intent);
} }
...@@ -49,6 +55,10 @@ public class IntentHolder { ...@@ -49,6 +55,10 @@ public class IntentHolder {
private Intent intent; private Intent intent;
private Context fromContext; private Context fromContext;
public Builder() {
}
public <C extends Activity> Builder(Context from, Class<C> target) { public <C extends Activity> Builder(Context from, Class<C> target) {
this.fromContext = from; this.fromContext = from;
intent = new Intent(fromContext, target); intent = new Intent(fromContext, target);
...@@ -92,6 +102,14 @@ public class IntentHolder { ...@@ -92,6 +102,14 @@ public class IntentHolder {
public IntentHolder build() { public IntentHolder build() {
return new IntentHolder(fromContext, intent); 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.Manifest;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
...@@ -48,19 +48,29 @@ public class PermissionsHelper { ...@@ -48,19 +48,29 @@ public class PermissionsHelper {
} }
@SuppressLint("CheckResult") @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 rxPermissions
.requestEach(permissions) .requestEach(permissions)
.subscribe(new Consumer<Permission>() { .subscribe(new Consumer<Permission>() {
int index = 0;
int refuseCount = 0;
@Override @Override
public void accept(Permission permission) throws Exception { public void accept(Permission permission) throws Exception {
if (permission.granted) { 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) { } else if (permission.shouldShowRequestPermissionRationale) {
refuseCount++;
listener.onRefuse(permission); listener.onRefuse(permission);
} else { } else {
refuseCount++;
listener.onRefuseAndNeverAskAgain(permission); listener.onRefuseAndNeverAskAgain(permission);
} }
index++;
} }
}); });
} }
...@@ -122,7 +132,7 @@ public class PermissionsHelper { ...@@ -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; ...@@ -10,6 +10,7 @@ import android.content.DialogInterface;
import android.os.Build; import android.os.Build;
import android.text.InputType; import android.text.InputType;
import android.widget.EditText; import android.widget.EditText;
import android.widget.Toast;
import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUIDialog;
import com.qmuiteam.qmui.widget.dialog.QMUIDialogAction; import com.qmuiteam.qmui.widget.dialog.QMUIDialogAction;
...@@ -29,7 +30,7 @@ import io.reactivex.functions.Consumer; ...@@ -29,7 +30,7 @@ import io.reactivex.functions.Consumer;
public class DialogFactory { public class DialogFactory {
/** /**
* 创建提示类消息弹窗 * 创建一个半透明背景带有Icon的Dialog (Loading、Error等)
*/ */
public static Dialog createTipDialog(Context context, @QMUITipDialog.Builder.IconType int mode, String tipWord) { public static Dialog createTipDialog(Context context, @QMUITipDialog.Builder.IconType int mode, String tipWord) {
return new QMUITipDialog.Builder(context) return new QMUITipDialog.Builder(context)
...@@ -39,19 +40,40 @@ public class DialogFactory { ...@@ -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) return new QMUIDialog.MessageDialogBuilder(context)
.setTitle("Tip") .setTitle(title)
.setMessage(message) .setMessage(message)
.addAction("cancel", new QMUIDialogAction.ActionListener() { .addAction(btnText, new QMUIDialogAction.ActionListener() {
@Override @Override
public void onClick(QMUIDialog dialog, int index) { public void onClick(QMUIDialog dialog, int index) {
dialog.dismiss(); 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(); .create();
} }
...@@ -151,6 +173,10 @@ public class DialogFactory { ...@@ -151,6 +173,10 @@ public class DialogFactory {
void onClick(QMUIDialog dialog, int[] checkedItemIndexes); void onClick(QMUIDialog dialog, int[] checkedItemIndexes);
} }
public interface OnYesOrNoListener {
void onClick(Dialog dialog, boolean choice);
}
public static void dismiss(Dialog dialog) { public static void dismiss(Dialog dialog) {
if (dialog != null) { if (dialog != null) {
Context context = ((ContextWrapper) dialog.getContext()).getBaseContext(); Context context = ((ContextWrapper) dialog.getContext()).getBaseContext();
......
...@@ -45,10 +45,12 @@ public class UIHelper { ...@@ -45,10 +45,12 @@ public class UIHelper {
* 为View添加ClickListener * 为View添加ClickListener
*/ */
public static <T extends View.OnClickListener> void bindClickListener(T listener, View... views) { 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; return;
for (View view : views) }
for (View view : views) {
view.setOnClickListener(listener); view.setOnClickListener(listener);
}
} }
/** /**
...@@ -180,7 +182,7 @@ public class UIHelper { ...@@ -180,7 +182,7 @@ public class UIHelper {
/** /**
* 创建一个(icon + text)类型的Tab按钮 * 创建一个(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( return new QMUITabSegment.Tab(
ContextCompat.getDrawable(context, normalIcon), ContextCompat.getDrawable(context, normalIcon),
ContextCompat.getDrawable(context, selectIcon), ContextCompat.getDrawable(context, selectIcon),
...@@ -191,7 +193,7 @@ public class UIHelper { ...@@ -191,7 +193,7 @@ public class UIHelper {
/** /**
* 创建一个(icon + text)类型的Tab按钮,并按指定尺寸显示icon * 创建一个(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(), Bitmap normalBitmap = BitmapFactory.decodeResource(context.getResources(),
normalIcon); normalIcon);
Bitmap selectBitmap = BitmapFactory.decodeResource(context.getResources(), Bitmap selectBitmap = BitmapFactory.decodeResource(context.getResources(),
...@@ -258,4 +260,5 @@ public class UIHelper { ...@@ -258,4 +260,5 @@ public class UIHelper {
.subscribe(); .subscribe();
} }
} }
package tech.starwin.utils.ui_utils; package tech.starwin.widget;
import android.animation.ObjectAnimator; import android.animation.ObjectAnimator;
import android.app.Dialog; import android.app.Dialog;
...@@ -9,6 +9,7 @@ import android.view.View; ...@@ -9,6 +9,7 @@ import android.view.View;
import android.view.animation.Animation; import android.view.animation.Animation;
import android.widget.ImageView; import android.widget.ImageView;
import tech.starwin.LibConfig;
import tech.starwin.R; import tech.starwin.R;
/** /**
...@@ -22,9 +23,10 @@ public class LoadDialog extends Dialog { ...@@ -22,9 +23,10 @@ public class LoadDialog extends Dialog {
View view = LayoutInflater.from(context).inflate(R.layout.base_progress_loading, null, false); View view = LayoutInflater.from(context).inflate(R.layout.base_progress_loading, null, false);
setContentView(view); setContentView(view);
setCanceledOnTouchOutside(false); setCanceledOnTouchOutside(false);
// TODO 动态配置loadingIcon
ImageView rotationView = view.findViewById(R.id.progress_dialog_loadingImv); ImageView rotationView = view.findViewById(R.id.progress_dialog_loadingImv);
ImageView iconView = view.findViewById(R.id.progress_dialog_iconImv); 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 = ObjectAnimator.ofFloat(rotationView, "rotation", 0, 360);
mLoadAnimation.setDuration(1000); mLoadAnimation.setDuration(1000);
......
package tech.starwin.utils.ui_utils; package tech.starwin.widget;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.app.Dialog; import android.app.Dialog;
...@@ -7,21 +7,24 @@ import android.support.annotation.NonNull; ...@@ -7,21 +7,24 @@ import android.support.annotation.NonNull;
import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; 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. * Created by SiKang on 2018/9/19.
*/ */
public class ProgressHolder { public class ProgressDialog {
//loading dialog //loading dialog
private Dialog loadingDialog; private Dialog loadingDialog;
private Context context; private Context context;
public ProgressHolder(@NonNull Context context) { public ProgressDialog(@NonNull Context context) {
this.context = context; this.context = context;
this.loadingDialog = new LoadDialog(context); this.loadingDialog = new LoadDialog(context);
} }
public ProgressHolder(@NonNull Dialog loadingDialog) { public ProgressDialog(@NonNull Dialog loadingDialog) {
this.context = loadingDialog.getContext(); this.context = loadingDialog.getContext();
this.loadingDialog = loadingDialog; this.loadingDialog = loadingDialog;
} }
......
...@@ -8,13 +8,11 @@ ...@@ -8,13 +8,11 @@
android:id="@+id/progress_dialog_loadingImv" android:id="@+id/progress_dialog_loadingImv"
android:layout_width="@dimen/x_300" android:layout_width="@dimen/x_300"
android:layout_height="@dimen/x_300" android:layout_height="@dimen/x_300"
android:layout_centerInParent="true" android:layout_centerInParent="true" />
android:src="@mipmap/ic_launcher" />
<ImageView <ImageView
android:id="@+id/progress_dialog_iconImv" android:id="@+id/progress_dialog_iconImv"
android:layout_width="@dimen/x_150" android:layout_width="@dimen/x_150"
android:layout_height="@dimen/x_150" android:layout_height="@dimen/x_150"
android:layout_centerInParent="true" android:layout_centerInParent="true" />
android:src="@mipmap/ic_launcher" />
</RelativeLayout> </RelativeLayout>
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
<string name="null_response">NO Data</string> <string name="null_response">NO Data</string>
<string name="moneySymbol">Rp.</string> <string name="moneySymbol">Rp.</string>
<string name="loading_loading">loading....</string> <string name="loading_loading">loading....</string>
<string name="years">tahun</string> <string name="years">tahun</string>
<string name="months">bulan</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