Commit 96b2a825 by sikang

UPDATE

parent 2be48adc
...@@ -92,9 +92,24 @@ ...@@ -92,9 +92,24 @@
<meta-data <meta-data
android:name="com.facebook.accountkit.ClientToken" android:name="com.facebook.accountkit.ClientToken"
android:value="@string/ACCOUNT_KIT_CLIENT_TOKEN" /> android:value="@string/ACCOUNT_KIT_CLIENT_TOKEN" />
<activity
android:name="com.facebook.accountkit.ui.AccountKitActivity"
android:screenOrientation="portrait" />
<!--地区选择-->
<activity
android:name=".mvp.ui.activity.RegionActivity"
android:screenOrientation="portrait" />
<!-- Zendesk -->
<activity
android:name=".mvp.ui.activity.RefreshDeskActivity"
android:screenOrientation="portrait"
android:windowSoftInputMode="adjustResize" />
<activity
android:name=".mvp.ui.activity.RefreshDeskListActivity"
android:screenOrientation="portrait" />
<activity android:name="com.facebook.accountkit.ui.AccountKitActivity"
android:screenOrientation="portrait"/>
</application> </application>
......
package tech.starwin.base; package tech.starwin.base;
import android.app.Activity;
import android.os.Bundle; import android.os.Bundle;
import android.support.annotation.CheckResult; import android.support.annotation.CheckResult;
import android.support.annotation.IdRes;
import android.support.annotation.LayoutRes; import android.support.annotation.LayoutRes;
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.Fragment; import android.support.v4.app.Fragment;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.AppCompatActivity; import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils; import android.text.TextUtils;
import android.view.Gravity;
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 android.widget.FrameLayout;
import android.widget.RelativeLayout;
import com.google.firebase.messaging.RemoteMessage; import com.google.firebase.messaging.RemoteMessage;
import com.qmuiteam.qmui.widget.QMUITopBar; import com.qmuiteam.qmui.widget.QMUITopBar;
...@@ -25,6 +31,7 @@ import tech.starwin.LibConfig; ...@@ -25,6 +31,7 @@ import tech.starwin.LibConfig;
import tech.starwin.R; import tech.starwin.R;
import tech.starwin.service.MsgHandleService; import tech.starwin.service.MsgHandleService;
import tech.starwin.mvp.IView; import tech.starwin.mvp.IView;
import tech.starwin.utils.LogUtils;
import tech.starwin.utils.PresenterHoler; import tech.starwin.utils.PresenterHoler;
import tech.starwin.utils.context_utils.FragmentLauncher; import tech.starwin.utils.context_utils.FragmentLauncher;
import tech.starwin.widget.ProgressDialog; import tech.starwin.widget.ProgressDialog;
...@@ -50,10 +57,18 @@ public abstract class BaseActivity extends AppCompatActivity implements IView { ...@@ -50,10 +57,18 @@ public abstract class BaseActivity extends AppCompatActivity implements IView {
private PresenterHoler presenterHelper; private PresenterHoler presenterHelper;
/** /**
* 侧滑抽屉
*/
private DrawerLayout drawerLayout;
/**
* loading、error 提示 * loading、error 提示
*/ */
protected ProgressDialog progressDialog; protected ProgressDialog progressDialog;
private FragmentLauncher fragmentLauncher;
private Object unBinder; private Object unBinder;
private final BehaviorSubject<ActivityEvent> lifecycleSubject = BehaviorSubject.create(); private final BehaviorSubject<ActivityEvent> lifecycleSubject = BehaviorSubject.create();
...@@ -65,8 +80,8 @@ public abstract class BaseActivity extends AppCompatActivity implements IView { ...@@ -65,8 +80,8 @@ public abstract class BaseActivity extends AppCompatActivity implements IView {
lifecycleSubject.onNext(ActivityEvent.CREATE); lifecycleSubject.onNext(ActivityEvent.CREATE);
progressDialog = new ProgressDialog(this); progressDialog = new ProgressDialog(this);
presenterHelper = new PresenterHoler(this); presenterHelper = new PresenterHoler(this);
//初始化根布局
initRootLayout(); initRootLayout();
} }
@Override @Override
...@@ -77,7 +92,7 @@ public abstract class BaseActivity extends AppCompatActivity implements IView { ...@@ -77,7 +92,7 @@ public abstract class BaseActivity extends AppCompatActivity implements IView {
String from = getIntent().getStringExtra("from"); String from = getIntent().getStringExtra("from");
if (action.equals("android.intent.action.MAIN") && if (action.equals("android.intent.action.MAIN") &&
!TextUtils.isEmpty(from)) { !TextUtils.isEmpty(from)) {
MsgHandleService.handleMsg(this,new RemoteMessage(getIntent().getExtras())); MsgHandleService.handleMsg(this, new RemoteMessage(getIntent().getExtras()));
} }
lifecycleSubject.onNext(ActivityEvent.START); lifecycleSubject.onNext(ActivityEvent.START);
} }
...@@ -153,10 +168,9 @@ public abstract class BaseActivity extends AppCompatActivity implements IView { ...@@ -153,10 +168,9 @@ public abstract class BaseActivity extends AppCompatActivity implements IView {
//----------------------------------- Layout ---------------------------------------- //----------------------------------- Layout ----------------------------------------
private void initRootLayout() { private void initRootLayout() {
setContentView(R.layout.base_activity_root); setContentView(R.layout.base_activity_root);
rootLayout = findViewById(R.id.activity_base_layout); rootLayout = findViewById(R.id.root_layout);
//判断是否要显示TopBar //判断是否要显示TopBar
if (useTopBar()) { if (useTopBar()) {
mTopBar = LayoutInflater.from(this).inflate(R.layout.base_topbar, rootLayout, true).findViewById(R.id.layout_topbar); mTopBar = LayoutInflater.from(this).inflate(R.layout.base_topbar, rootLayout, true).findViewById(R.id.layout_topbar);
...@@ -165,7 +179,17 @@ public abstract class BaseActivity extends AppCompatActivity implements IView { ...@@ -165,7 +179,17 @@ public abstract class BaseActivity extends AppCompatActivity implements IView {
} }
//填充Activity -> bindLayout(); //填充Activity -> bindLayout();
if (bindLayout() != 0) { if (bindLayout() != 0) {
LayoutInflater.from(this).inflate(bindLayout(), rootLayout, true); //是否使用了侧滑
if (bindDrawerLayout() != 0) {
drawerLayout = LayoutInflater.from(this).inflate(R.layout.base_activity_drawer, rootLayout, true).findViewById(R.id.root_drawer_layout);
FrameLayout content = drawerLayout.findViewById(R.id.root_content);
FrameLayout drawer = drawerLayout.findViewById(R.id.root_drawer);
LayoutInflater.from(this).inflate(bindLayout(), content, true);
LayoutInflater.from(this).inflate(bindDrawerLayout(), drawer, true);
} else {
LayoutInflater.from(this).inflate(bindLayout(), rootLayout, true);
}
unBinder = LibConfig.bindView(this, rootLayout); unBinder = LibConfig.bindView(this, rootLayout);
initView(); initView();
} else { } else {
...@@ -192,6 +216,13 @@ public abstract class BaseActivity extends AppCompatActivity implements IView { ...@@ -192,6 +216,13 @@ public abstract class BaseActivity extends AppCompatActivity implements IView {
} }
/** /**
* 是否使用侧滑
*/
public int bindDrawerLayout() {
return 0;
}
/**
* 初始化TopBar,需要自定义TopBar样式时重写 * 初始化TopBar,需要自定义TopBar样式时重写
* 默认TopBar只包含一个BackButton 和 Titile * 默认TopBar只包含一个BackButton 和 Titile
*/ */
...@@ -204,8 +235,34 @@ public abstract class BaseActivity extends AppCompatActivity implements IView { ...@@ -204,8 +235,34 @@ public abstract class BaseActivity extends AppCompatActivity implements IView {
}); });
} }
@IdRes
public int bindFragmentLayout() {
return 0;
}
public FragmentLauncher getFragmentLauncher() { public FragmentLauncher getFragmentLauncher() {
return null; if (bindFragmentLayout() != 0 && fragmentLauncher == null) {
fragmentLauncher = new FragmentLauncher(this, bindFragmentLayout());
}
return fragmentLauncher;
}
/**
* 左侧打开抽屉
*/
public void openDrawerLeft() {
if (drawerLayout != null) {
drawerLayout.openDrawer(Gravity.LEFT);
}
}
/**
* 右侧打开抽屉
*/
public void openDrawerRight() {
if (drawerLayout != null) {
drawerLayout.openDrawer(Gravity.RIGHT);
}
} }
//----------------------------------- Presenter ---------------------------------------- //----------------------------------- Presenter ----------------------------------------
...@@ -222,17 +279,33 @@ public abstract class BaseActivity extends AppCompatActivity implements IView { ...@@ -222,17 +279,33 @@ public abstract class BaseActivity extends AppCompatActivity implements IView {
/** /**
* 打开一个Fragment * 打开一个Fragment
*/ */
public void startFragment(Fragment fragment, boolean isAddToBackStack) { public void startFragment(Fragment fragment, boolean isOpenAnime) {
if (getFragmentLauncher() != null) if (getFragmentLauncher() != null) {
getFragmentLauncher().startFragment(fragment, isAddToBackStack); FragmentLauncher.TransitionConfig config = null;
if (isOpenAnime) {
config = new FragmentLauncher.TransitionConfig(
R.anim.slide_in_right, R.anim.slide_out_left,
R.anim.slide_in_left, R.anim.slide_out_right);
}
getFragmentLauncher().startFragment(fragment, config, isOpenAnime);
}
} }
/** /**
* 打开一个Fragment,且替换BackStack栈顶Fragment * 打开一个Fragment,且替换BackStack栈顶Fragment
*/ */
public void startFragmentAndDestroyCurrent(final Fragment fragment) { public void startFragmentAndDestroyCurrent(final Fragment fragment, boolean isOpenAnime) {
if (getFragmentLauncher() != null) if (getFragmentLauncher() != null) {
getFragmentLauncher().startFragmentAndDestroyCurrent(fragment); FragmentLauncher.TransitionConfig config = null;
if (isOpenAnime) {
config = new FragmentLauncher.TransitionConfig(
R.anim.slide_in_right, R.anim.slide_out_left,
R.anim.slide_in_left, R.anim.slide_out_right);
}
getFragmentLauncher().startFragmentAndDestroyCurrent(fragment, config);
}
} }
} }
...@@ -30,7 +30,7 @@ import tech.starwin.utils.ui_utils.UIHelper; ...@@ -30,7 +30,7 @@ import tech.starwin.utils.ui_utils.UIHelper;
*/ */
public abstract class BaseFragment extends Fragment implements IView { public abstract class BaseFragment extends Fragment implements IView {
protected String TAG; protected String TAG;
protected ViewGroup mContentView; private ViewGroup mContentView;
/** /**
* TopBar * TopBar
...@@ -54,31 +54,50 @@ public abstract class BaseFragment extends Fragment implements IView { ...@@ -54,31 +54,50 @@ public abstract class BaseFragment extends Fragment implements IView {
Object unBinder; Object unBinder;
@Nullable
@Override @Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) { public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TAG = getClass().getName(); TAG = getClass().getName();
lifecycleSubject.onNext(ActivityEvent.CREATE); lifecycleSubject.onNext(ActivityEvent.CREATE);
presenterHelper = new PresenterHoler(this); presenterHelper = new PresenterHoler(this);
progressDialog = new ProgressDialog(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); @Nullable
if (mTopBar != null) @Override
initTopBar(mTopBar); public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
if (mContentView != null) {
ViewGroup parent = (ViewGroup) mContentView.getParent();
if (parent != null) {
parent.removeView(mContentView);
}
unBinder = LibConfig.bindView(this, mContentView);
} else {
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);
if (mTopBar != null)
initTopBar(mTopBar);
}
LayoutInflater.from(getActivity()).inflate(bindLayout(), mContentView, true);
unBinder = LibConfig.bindView(this, mContentView);
initView(mContentView);
} }
mContentView = (ViewGroup) LayoutInflater.from(getActivity()).inflate(bindLayout(), mContentView);
unBinder = LibConfig.bindView(this, mContentView);
initView();
return mContentView; return mContentView;
} }
public ViewGroup getContentView() {
return mContentView;
}
@LayoutRes @LayoutRes
public abstract int bindLayout(); public abstract int bindLayout();
public abstract void initView(); /**
* 初始化入口
*/
public abstract void initView(ViewGroup contentView);
/** /**
* 是否使用TopBar,默认不使用 * 是否使用TopBar,默认不使用
...@@ -179,14 +198,14 @@ public abstract class BaseFragment extends Fragment implements IView { ...@@ -179,14 +198,14 @@ public abstract class BaseFragment extends Fragment implements IView {
return presenterHelper.getPresenter(clz); return presenterHelper.getPresenter(clz);
} }
public void startFragment(Fragment fragment) { public void startFragment(Fragment fragment, boolean isOpenAnime) {
if (getActivity() instanceof BaseActivity) if (getActivity() instanceof BaseActivity)
((BaseActivity) getActivity()).startFragment(fragment, true); ((BaseActivity) getActivity()).startFragment(fragment, isOpenAnime);
} }
public void startFragmentAndDestroyCurrent(Fragment fragment) { public void startFragmentAndDestroyCurrent(Fragment fragment, boolean isOpenAnime) {
if (getActivity() instanceof BaseActivity) if (getActivity() instanceof BaseActivity)
((BaseActivity) getActivity()).startFragmentAndDestroyCurrent(fragment); ((BaseActivity) getActivity()).startFragmentAndDestroyCurrent(fragment, isOpenAnime);
} }
} }
...@@ -7,12 +7,14 @@ import io.reactivex.Observable; ...@@ -7,12 +7,14 @@ import io.reactivex.Observable;
import io.reactivex.Observer; import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.functions.Consumer; import io.reactivex.functions.Consumer;
import io.reactivex.functions.Function;
import io.reactivex.schedulers.Schedulers; import io.reactivex.schedulers.Schedulers;
import retrofit2.Call; import retrofit2.Call;
import retrofit2.Callback; import retrofit2.Callback;
import retrofit2.Response; import retrofit2.Response;
import tech.starwin.impl.HttpObserver; import tech.starwin.impl.HttpObserver;
import tech.starwin.mvp.IView; import tech.starwin.mvp.IView;
import tech.starwin.mvp.api.UploadApi;
import tech.starwin.network.ServiceGenerator; import tech.starwin.network.ServiceGenerator;
/** /**
...@@ -47,18 +49,15 @@ public class BasePresenter<T> { ...@@ -47,18 +49,15 @@ public class BasePresenter<T> {
.subscribe(observer); .subscribe(observer);
} }
protected <T> void handleRequest(final String action, Observable<T> observable) {
handleRequest(action, observable, true);
}
protected <T> void handleRequest(final String action, Observable<T> observable, final boolean isShowLoading) { protected <T> void handleRequest(final String action, Observable<T> observable) {
observable.subscribeOn(Schedulers.io()) observable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread()) .observeOn(AndroidSchedulers.mainThread())
.compose(view.<T>bindToLifecycle()) .compose(view.<T>bindToLifecycle())
.subscribe(new HttpObserver<T>() { .subscribe(new HttpObserver<T>() {
@Override @Override
public void onStart() { public void onStart() {
view.onHttpStart(action, isShowLoading); view.onHttpStart(action, true);
} }
@Override @Override
...@@ -104,6 +103,27 @@ public class BasePresenter<T> { ...@@ -104,6 +103,27 @@ public class BasePresenter<T> {
}); });
} }
/**
* 允许Null返回 不触发OnError
*/
protected <T> Observable<T> clearError(Observable<T> observable, final T result) {
return observable.onErrorReturn(new Function<Throwable, T>() {
@Override
public T apply(Throwable throwable) throws Exception {
return result;
}
});
}
protected <T> Observable<T> clearError(Observable<T> observable, final Class<T> clz) {
return observable.onErrorReturn(new Function<Throwable, T>() {
@Override
public T apply(Throwable throwable) throws Exception {
return clz.newInstance();
}
});
}
@SuppressLint("CheckResult") @SuppressLint("CheckResult")
private void bindLifecycle(Consumer consumer) { private void bindLifecycle(Consumer consumer) {
Observable.just(true) Observable.just(true)
...@@ -113,6 +133,11 @@ public class BasePresenter<T> { ...@@ -113,6 +133,11 @@ public class BasePresenter<T> {
} }
public <T> T getService(Class<T> tClass) {
return ServiceGenerator.getService(tClass);
}
public void onDestory() { public void onDestory() {
view = null; view = null;
apiService = null; apiService = null;
......
...@@ -26,13 +26,13 @@ public abstract class BaseRecyclerAdapter<T> extends RecyclerView.Adapter<Recycl ...@@ -26,13 +26,13 @@ public abstract class BaseRecyclerAdapter<T> extends RecyclerView.Adapter<Recycl
@Override @Override
public RecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { public RecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = null; View view = null;
if (setItemLayout() instanceof Integer) { if (bindItemLayout() instanceof Integer) {
view = LayoutInflater.from(context).inflate((Integer) setItemLayout(), parent, false); view = LayoutInflater.from(context).inflate((Integer) bindItemLayout(), parent, false);
} else if (setItemLayout() instanceof View) { } else if (bindItemLayout() instanceof View) {
view = (View) setItemLayout(); view = (View) bindItemLayout();
} }
if (view == null) { if (view == null) {
throw new RuntimeException("setItemLayout() invalid"); throw new RuntimeException("bindItemLayout() invalid");
} }
final RecyclerViewHolder holder = new RecyclerViewHolder(view); final RecyclerViewHolder holder = new RecyclerViewHolder(view);
...@@ -70,7 +70,7 @@ public abstract class BaseRecyclerAdapter<T> extends RecyclerView.Adapter<Recycl ...@@ -70,7 +70,7 @@ public abstract class BaseRecyclerAdapter<T> extends RecyclerView.Adapter<Recycl
/** /**
* item布局 * item布局
*/ */
public abstract Object setItemLayout(); public abstract Object bindItemLayout();
/** /**
* item更新 * item更新
...@@ -82,11 +82,11 @@ public abstract class BaseRecyclerAdapter<T> extends RecyclerView.Adapter<Recycl ...@@ -82,11 +82,11 @@ public abstract class BaseRecyclerAdapter<T> extends RecyclerView.Adapter<Recycl
} }
public void setOnItemClickListener(OnItemClickListener listener) { public void setOnItemClickListener(OnItemClickListener<T> listener) {
mClickListener = listener; mClickListener = listener;
} }
public void setOnItemLongClickListener(OnItemLongClickListener listener) { public void setOnItemLongClickListener(OnItemLongClickListener<T> listener) {
mLongClickListener = listener; mLongClickListener = listener;
} }
......
package tech.starwin.impl; package tech.starwin.impl;
import com.google.gson.Gson;
import io.reactivex.Observer; import io.reactivex.Observer;
import io.reactivex.disposables.Disposable; import io.reactivex.disposables.Disposable;
import retrofit2.HttpException; import retrofit2.HttpException;
import tech.starwin.R; import tech.starwin.R;
import tech.starwin.LibConfig; import tech.starwin.LibConfig;
import tech.starwin.mvp.beans.ResponseErrorBody;
import tech.starwin.network.Error; import tech.starwin.network.Error;
import tech.starwin.utils.LoginManager; import tech.starwin.utils.LoginManager;
...@@ -32,6 +35,7 @@ public abstract class HttpObserver<T> implements Observer<T> { ...@@ -32,6 +35,7 @@ public abstract class HttpObserver<T> implements Observer<T> {
@Override @Override
public void onNext(T tResult) { public void onNext(T tResult) {
onFinish();
onSuccess(tResult); onSuccess(tResult);
} }
...@@ -44,13 +48,17 @@ public abstract class HttpObserver<T> implements Observer<T> { ...@@ -44,13 +48,17 @@ public abstract class HttpObserver<T> implements Observer<T> {
if (isHttpError(msg)) { if (isHttpError(msg)) {
onError(Error.HTTP_ERROR, LibConfig.getContext().getString(R.string.text_net_error)); onError(Error.HTTP_ERROR, LibConfig.getContext().getString(R.string.text_net_error));
} else if (throwable instanceof HttpException) { } else if (throwable instanceof HttpException) {
if (!isCanHandle((HttpException) throwable)) { HttpException exception = (HttpException) throwable;
onError(Error.SERVER_ERROR, msg); if (!isCanHandle(exception)) {
ResponseErrorBody responseErrorBody = new Gson().fromJson(exception.response().errorBody().string(), ResponseErrorBody.class);
onError(Error.SERVER_ERROR, responseErrorBody.getMessage());
} }
} 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")) { } else if (msg.contains("body is null")) {
onSuccess(null); onSuccess(null);
} else {
onError(Error.UNKNOW, msg);
} }
} }
...@@ -63,7 +71,6 @@ public abstract class HttpObserver<T> implements Observer<T> { ...@@ -63,7 +71,6 @@ public abstract class HttpObserver<T> implements Observer<T> {
@Override @Override
public void onComplete() { public void onComplete() {
onFinish();
if (disposable != null) if (disposable != null)
disposable.dispose(); disposable.dispose();
} }
......
...@@ -5,7 +5,6 @@ import android.view.View; ...@@ -5,7 +5,6 @@ import android.view.View;
/** /**
* Created by SiKang on 2018/9/18. * Created by SiKang on 2018/9/18.
* 防抖 ClickListener * 防抖 ClickListener
*
*/ */
public abstract class OnNoShakeClickListener extends OnEventClickListener { public abstract class OnNoShakeClickListener extends OnEventClickListener {
...@@ -19,7 +18,7 @@ public abstract class OnNoShakeClickListener extends OnEventClickListener { ...@@ -19,7 +18,7 @@ public abstract class OnNoShakeClickListener extends OnEventClickListener {
} }
@Override @Override
public void onClick(final View v) { public final void onClick(final View v) {
super.onClick(v); super.onClick(v);
v.setClickable(false); v.setClickable(false);
v.postDelayed(new Runnable() { v.postDelayed(new Runnable() {
...@@ -31,8 +30,4 @@ public abstract class OnNoShakeClickListener extends OnEventClickListener { ...@@ -31,8 +30,4 @@ public abstract class OnNoShakeClickListener extends OnEventClickListener {
onEventClick(v); onEventClick(v);
} }
@Override
public void onEventClick(View v) {
}
} }
package tech.starwin.mvp.api; package tech.starwin.mvp.api;
import android.support.annotation.NonNull;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import io.reactivex.Observable; import io.reactivex.Observable;
...@@ -9,12 +12,16 @@ import retrofit2.http.FormUrlEncoded; ...@@ -9,12 +12,16 @@ 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.POST;
import retrofit2.http.PUT;
import retrofit2.http.Path;
import retrofit2.http.Query; import retrofit2.http.Query;
import tech.starwin.mvp.beans.BankBean;
import tech.starwin.mvp.beans.DepositMethodsBean; import tech.starwin.mvp.beans.DepositMethodsBean;
import tech.starwin.mvp.beans.DepositResponseBean; import tech.starwin.mvp.beans.DepositResponseBean;
import tech.starwin.mvp.beans.HistoryLoanAppInfoBean; 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.ProductBean;
import tech.starwin.mvp.beans.ProgressBean; import tech.starwin.mvp.beans.ProgressBean;
import tech.starwin.mvp.beans.ResponseErrorBody; import tech.starwin.mvp.beans.ResponseErrorBody;
...@@ -39,8 +46,13 @@ public interface LoanApi { ...@@ -39,8 +46,13 @@ public interface LoanApi {
* 贷款进度 * 贷款进度
*/ */
@GET("record/progress") @GET("record/progress")
Observable<ProgressBean> getLoanProgress(@Header("X-AUTH-TOKEN") String token); Observable<ProgressBean> getCertifyProgress(@Header("X-AUTH-TOKEN") String token);
/**
* 获取商品列表
*/
@GET("loanapp/product_default")
Observable<List<ProductBean>> getProductsDefault();
/** /**
* 获取最新的贷款申请信息 * 获取最新的贷款申请信息
...@@ -48,7 +60,6 @@ public interface LoanApi { ...@@ -48,7 +60,6 @@ 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);
/** /**
* 取消贷款 * 取消贷款
*/ */
...@@ -79,7 +90,7 @@ public interface LoanApi { ...@@ -79,7 +90,7 @@ public interface LoanApi {
* @param amout 还款金额 * @param amout 还款金额
*/ */
@POST("loanapp/deposit") @POST("loanapp/deposit")
Observable<DepositResponseBean> doDeposit(@Query("loanAppId") String loanAppId, Observable<DepositResponseBean> getRepayOrder(@Query("loanAppId") String loanAppId,
@Query("currency") String currency, @Query("currency") String currency,
@Query("depositMethod") String method, @Query("depositMethod") String method,
@Query("amount") double amout, @Query("amount") double amout,
...@@ -87,4 +98,22 @@ public interface LoanApi { ...@@ -87,4 +98,22 @@ public interface LoanApi {
); );
/**
* 银行列表
*/
@GET("bank/support")
Observable<List<BankBean>> getBankList();
/**
* 申请贷款,提交银行卡
*/
@PUT("loanapp/{loanAppId}/bank")
Observable<ResponseBody> addBank(@Path("loanAppId") String loanAppId, @Query("bankCode") @NonNull String bankCode, @Query("cardNo") String cardNo,
@Query("applyFor") String applyFor, @Query("applyChannel") @NonNull String applyChannel, @Query("applyPlatform") String android,
@Query("couponId") long couponId, @Header("X-AUTH-TOKEN") String token);
} }
package tech.starwin.mvp.api; package tech.starwin.mvp.api;
import io.reactivex.Observable; import io.reactivex.Observable;
import okhttp3.MultipartBody; import okhttp3.MultipartBody;
import okhttp3.ResponseBody; import okhttp3.ResponseBody;
...@@ -21,6 +20,10 @@ import tech.starwin.mvp.beans.RecordFilesResponse; ...@@ -21,6 +20,10 @@ import tech.starwin.mvp.beans.RecordFilesResponse;
* 涉及上传的API * 涉及上传的API
*/ */
public interface UploadApi { public interface UploadApi {
enum UploadType {
EMPLOYMENT_PHOTO,
}
/** /**
* 上传照片 * 上传照片
* *
...@@ -30,7 +33,7 @@ public interface UploadApi { ...@@ -30,7 +33,7 @@ public interface UploadApi {
*/ */
@Multipart @Multipart
@PUT("record/files") @PUT("record/files")
Call<ResponseBody> uploadPhoto( Observable<ResponseBody> uploadPhoto(
@Part MultipartBody.Part photoFile, @Part MultipartBody.Part photoFile,
@Query("fileType") String fileType, @Query("fileType") String fileType,
@Header("X-AUTH-TOKEN") String token @Header("X-AUTH-TOKEN") String token
...@@ -45,33 +48,21 @@ public interface UploadApi { ...@@ -45,33 +48,21 @@ public interface UploadApi {
@Header("X-AUTH-TOKEN") String token); @Header("X-AUTH-TOKEN") String token);
@GET("record/files") @GET("record/files")
Observable<RecordFilesResponse> recordFiles(@Header("X-AUTH-TOKEN") String token); Call<RecordFilesResponse> recordFiles(@Header("X-AUTH-TOKEN") String token);
@Multipart
@PUT("/loanapp/verify/face")
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,
@Header("X-AUTH-TOKEN") String token);
@Multipart @Multipart
/*@PUT("/loanapp/verify/face") face++*/ /*@PUT("/loanapp/verify/face") face++*/
@PUT("/loanapp/verify/yitu") @PUT("/loanapp/verify/yitu")
Observable<BasicAck> faceVerify(@Query("loanType") String loanType, Call<BasicAck> faceVerify(@Query("loanType") String loanType,
@Query("amount") double amount, @Query("amount") double amount,
@Query("period") int period, @Query("period") int period,
@Query("periodUnit") String periodUnit, @Query("periodUnit") String periodUnit,
@Part MultipartBody.Part imageBest, @Part MultipartBody.Part imageBest,
@Part MultipartBody.Part imageEnv, @Part MultipartBody.Part imageEnv,
@Part MultipartBody.Part delta, @Part MultipartBody.Part delta,
@Query("imei") String imei, @Query("imei") String imei,
@Query("productId") long productId, @Query("productId") long productId,
@Header("X-AUTH-TOKEN") String token); @Header("X-AUTH-TOKEN") String token);
/** /**
...@@ -79,5 +70,5 @@ public interface UploadApi { ...@@ -79,5 +70,5 @@ public interface UploadApi {
*/ */
@Multipart @Multipart
@PUT("/record/ocr") @PUT("/record/ocr")
Call<OcrResultBean> identityOcr(@Part MultipartBody.Part part, @Header("X-AUTH-TOKEN") String token); Observable<OcrResultBean> identityOcr(@Part MultipartBody.Part part, @Header("X-AUTH-TOKEN") String token);
} }
\ No newline at end of file
...@@ -42,6 +42,7 @@ import tech.starwin.mvp.beans.Result; ...@@ -42,6 +42,7 @@ import tech.starwin.mvp.beans.Result;
import tech.starwin.mvp.beans.SysDictBean; import tech.starwin.mvp.beans.SysDictBean;
import tech.starwin.mvp.beans.TokenInfoBean; import tech.starwin.mvp.beans.TokenInfoBean;
import tech.starwin.mvp.beans.UserBankInfo; import tech.starwin.mvp.beans.UserBankInfo;
import tech.starwin.mvp.beans.UserBean;
import tech.starwin.mvp.beans.YWUser; import tech.starwin.mvp.beans.YWUser;
/** /**
...@@ -89,12 +90,18 @@ public interface UserApi { ...@@ -89,12 +90,18 @@ public interface UserApi {
Observable<RecordFilesResponse> getKtpImg(@Header("X-AUTH-TOKEN") String token); Observable<RecordFilesResponse> getKtpImg(@Header("X-AUTH-TOKEN") String token);
/** /**
* 获取个人信息 * 获取认证信息
*/ */
@GET("record/personalinfo") @GET("record/personalinfo")
Observable<PersonalInfoServerBean> getPersonalInfo(@Header("X-AUTH-TOKEN") String token); Observable<PersonalInfoServerBean> getPersonalInfo(@Header("X-AUTH-TOKEN") String token);
/** /**
* 用户信息
*/
@GET("info/infocenter")
Observable<UserBean> getUserInfo(@Header("X-AUTH-TOKEN") String token);
/**
* 学历列表 * 学历列表
*/ */
@GET("sysdict/{type}") @GET("sysdict/{type}")
...@@ -257,23 +264,24 @@ public interface UserApi { ...@@ -257,23 +264,24 @@ public interface UserApi {
Observable<ArrayList<ActivityInfoBean>> getActivityList(); Observable<ArrayList<ActivityInfoBean>> getActivityList();
/** /**
* * 贷款详情
* */ */
@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,
@Query("productId") long productId);
/**
* 客户服务热线
*/
@GET("loanapp/display")
Observable<DisplayBean> display();
@GET("record/employ-photo") @GET("record/employ-photo")
Observable<RecordFilesResponse> getJobImg(@Header("X-AUTH-TOKEN") String token); Observable<RecordFilesResponse> getJobImg(@Header("X-AUTH-TOKEN") String token);
@PUT("loanapp/{loanAppId}/bank")
Observable<ResponseBody> addBank(@Path("loanAppId") String loanAppId, @Query("bankCode") @NonNull String bankCode, @Query("cardNo") String cardNo,
@Query("applyFor") String applyFor, @Query("applyChannel") @NonNull String applyChannel, @Query("applyPlatform") String android,
@Query("couponId") long couponId, @Header("X-AUTH-TOKEN") String token);
@GET("bank/support")
Observable<List<BankBean>> requestBankList();
@GET("record/bankcard") @GET("record/bankcard")
Observable<UserBankInfo> getBankCardInfo(@Header("X-AUTH-TOKEN") String token); Observable<UserBankInfo> getBankCardInfo(@Header("X-AUTH-TOKEN") String token);
...@@ -281,31 +289,6 @@ public interface UserApi { ...@@ -281,31 +289,6 @@ public interface UserApi {
@GET("banner") @GET("banner")
Observable<List<BannerMessageDto>> getBannerMessageList(); Observable<List<BannerMessageDto>> getBannerMessageList();
@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") @GET("chat/account")
Observable<YWUser> getChatUserInfo(@Header("X-AUTH-TOKEN") String token); Observable<YWUser> getChatUserInfo(@Header("X-AUTH-TOKEN") String token);
......
package tech.starwin.mvp.beans;
import java.io.Serializable;
public class AccountInfo implements Serializable {
private String account;
private String token;
private String refreshToken;
private String salt;
private String loginType;
private UserInfo userInfo;
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account;
}
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
public String getRefreshToken() {
return refreshToken;
}
public void setRefreshToken(String refreshToken) {
this.refreshToken = refreshToken;
}
public String getSalt() {
return salt;
}
public void setSalt(String salt) {
this.salt = salt;
}
public String getLoginType() {
return loginType;
}
public void setLoginType(String loginType) {
this.loginType = loginType;
}
public UserInfo getUserInfo() {
return userInfo;
}
public void setUserInfo(UserInfo userInfo) {
this.userInfo = userInfo;
}
}
\ No newline at end of file
...@@ -30,6 +30,7 @@ public class EmploymentServerBean implements Serializable { ...@@ -30,6 +30,7 @@ public class EmploymentServerBean implements Serializable {
private String companyProvince; private String companyProvince;
private String profession; private String profession;
private String salary; private String salary;
private String workCardUrl;
public String getCompanyAddress() { public String getCompanyAddress() {
return companyAddress; return companyAddress;
...@@ -103,4 +104,11 @@ public class EmploymentServerBean implements Serializable { ...@@ -103,4 +104,11 @@ public class EmploymentServerBean implements Serializable {
this.salary = salary; this.salary = salary;
} }
public String getWorkCardUrl() {
return workCardUrl;
}
public void setWorkCardUrl(String workCardUrl) {
this.workCardUrl = workCardUrl;
}
} }
...@@ -8,7 +8,6 @@ import java.io.Serializable; ...@@ -8,7 +8,6 @@ import java.io.Serializable;
public class LatestLoanAppBean extends LoanAppBeanFather implements Serializable { public class LatestLoanAppBean extends LoanAppBeanFather implements Serializable {
/** /**
* amount ; 0 * amount ; 0
* bankCode ; BCA * bankCode ; BCA
...@@ -42,4 +41,31 @@ public class LatestLoanAppBean extends LoanAppBeanFather implements Serializable ...@@ -42,4 +41,31 @@ public class LatestLoanAppBean extends LoanAppBeanFather implements Serializable
public static final String REJECTED = "REJECTED";//贷款被拒绝 public static final String REJECTED = "REJECTED";//贷款被拒绝
public static final String CLOSED = "CLOSED";//贷款申请已关闭 public static final String CLOSED = "CLOSED";//贷款申请已关闭
private String applyFor;
private String applyChannel;
private long couponId;
public String getApplyFor() {
return applyFor;
}
public void setApplyFor(String applyFor) {
this.applyFor = applyFor;
}
public String getApplyChannel() {
return applyChannel;
}
public void setApplyChannel(String applyChannel) {
this.applyChannel = applyChannel;
}
public long getCouponId() {
return couponId;
}
public void setCouponId(long couponId) {
this.couponId = couponId;
}
} }
...@@ -79,6 +79,15 @@ LoanAppBeanFather implements Parcelable { ...@@ -79,6 +79,15 @@ LoanAppBeanFather implements Parcelable {
private String loanAppId; private String loanAppId;
private double paidAmount; private double paidAmount;
private String status; private String status;
private long productId;
public long getProductId() {
return productId;
}
public void setProductId(long productId) {
this.productId = productId;
}
public double getServiceFeeAccr() { public double getServiceFeeAccr() {
return this.serviceFeeAccr; return this.serviceFeeAccr;
......
package tech.starwin.mvp.beans;
import java.io.Serializable;
import java.util.List;
/**
* Created by SiKang on 2018/9/14.
*/
public class LoanInfo implements Serializable {
private LatestLoanAppBean latestLoanAppBean;
private UserBankInfo userBankInfo;
private LoaningAmoutBean loaningAmoutInfo;
private List<BankBean> bankList;
public LatestLoanAppBean getLatestLoanAppBean() {
return latestLoanAppBean;
}
public void setLatestLoanAppBean(LatestLoanAppBean latestLoanAppBean) {
this.latestLoanAppBean = latestLoanAppBean;
}
public UserBankInfo getUserBankInfo() {
return userBankInfo;
}
public void setUserBankInfo(UserBankInfo userBankInfo) {
this.userBankInfo = userBankInfo;
}
public LoaningAmoutBean getLoaningAmoutInfo() {
return loaningAmoutInfo;
}
public void setLoaningAmoutInfo(LoaningAmoutBean loaningAmoutInfo) {
this.loaningAmoutInfo = loaningAmoutInfo;
}
public List<BankBean> getBankList() {
return bankList;
}
public String[] getBankNameArray() {
if (bankList == null || bankList.size() == 0) {
return null;
}
String[] bankArray = new String[bankList.size()];
for (int i = 0; i < bankList.size(); i++) {
bankArray[i] = bankList.get(i).getBankName();
}
return bankArray;
}
public void setBankList(List<BankBean> bankList) {
this.bankList = bankList;
}
}
...@@ -30,10 +30,10 @@ public class PersonalInfoBean implements Serializable { ...@@ -30,10 +30,10 @@ public class PersonalInfoBean implements Serializable {
private String fullName; private String fullName;
private String credentialNo; private String credentialNo;
private String gender; private String gender;
private RegionBean.RegionsBean province; private String province;
private RegionBean.RegionsBean city; private String city;
private RegionBean.RegionsBean district; private String district;
private RegionBean.RegionsBean area; private String area;
private String address; private String address;
private String lastEducation; private String lastEducation;
private String maritalStatus; private String maritalStatus;
...@@ -64,16 +64,12 @@ public class PersonalInfoBean implements Serializable { ...@@ -64,16 +64,12 @@ public class PersonalInfoBean implements Serializable {
public PersonalInfoBean() { public PersonalInfoBean() {
} }
public PersonalInfoBean(PersonalInfoServerBean personalInfoServerBean){ public PersonalInfoBean(PersonalInfoServerBean personalInfoServerBean) {
province = new RegionBean.RegionsBean(); province = personalInfoServerBean.getProvince();
province.setName(personalInfoServerBean.getProvince()); city = personalInfoServerBean.getCity();
city = new RegionBean.RegionsBean(); district = personalInfoServerBean.getDistrict();
city.setName(personalInfoServerBean.getCity()); area = personalInfoServerBean.getArea();
district = new RegionBean.RegionsBean();
district.setName(personalInfoServerBean.getDistrict());
area = new RegionBean.RegionsBean();
area.setName(personalInfoServerBean.getArea());
this.setFamilyNameInLaw(personalInfoServerBean.getFamilyNameInLaw()); this.setFamilyNameInLaw(personalInfoServerBean.getFamilyNameInLaw());
this.setFullName(personalInfoServerBean.getFullName()); this.setFullName(personalInfoServerBean.getFullName());
this.setCredentialNo(personalInfoServerBean.getCredentialNo()); this.setCredentialNo(personalInfoServerBean.getCredentialNo());
...@@ -86,6 +82,7 @@ public class PersonalInfoBean implements Serializable { ...@@ -86,6 +82,7 @@ public class PersonalInfoBean implements Serializable {
this.setResidenceDuration(personalInfoServerBean.getResidenceDuration()); this.setResidenceDuration(personalInfoServerBean.getResidenceDuration());
} }
public String getFullName() { public String getFullName() {
return fullName; return fullName;
} }
...@@ -110,22 +107,62 @@ public class PersonalInfoBean implements Serializable { ...@@ -110,22 +107,62 @@ public class PersonalInfoBean implements Serializable {
this.gender = gender; this.gender = gender;
} }
public RegionBean.RegionsBean getProvince() { public String getProvince() {
return province; return province;
} }
public void setProvince(RegionBean.RegionsBean province) { public void setProvince(String province) {
this.province = province; this.province = province;
} }
public void setDistrict(RegionBean.RegionsBean district) { public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getDistrict() {
return district;
}
public void setDistrict(String district) {
this.district = district; this.district = district;
} }
public String getArea() {
return area;
}
public void setArea(String area) {
this.area = area;
}
public String getAddress() {
return address;
}
public void setAddress(String address) { public void setAddress(String address) {
this.address = address; this.address = address;
} }
public String getLastEducation() {
return lastEducation;
}
public String getMaritalStatus() {
return maritalStatus;
}
public String getChildrenNumber() {
return childrenNumber;
}
public String getResidenceDuration() {
return residenceDuration;
}
public void setLastEducation(String lastEducation) { public void setLastEducation(String lastEducation) {
this.lastEducation = lastEducation; this.lastEducation = lastEducation;
......
...@@ -41,6 +41,14 @@ public class PersonalInfoServerBean implements Serializable { ...@@ -41,6 +41,14 @@ public class PersonalInfoServerBean implements Serializable {
private String residenceDuration; private String residenceDuration;
private String familyNameInLaw; private String familyNameInLaw;
public String getRegion() {
StringBuffer buffer = new StringBuffer();
buffer.append(province + " ");
buffer.append(city + " ");
buffer.append(district + " ");
buffer.append(area);
return buffer.toString();
}
@Nullable @Nullable
private String facebookId; private String facebookId;
......
package tech.starwin.mvp.beans;
import java.io.Serializable;
/**
* Created by SiKang on 2018/10/16.
*/
public class ProductBean implements Serializable {
private Double interestRate = 0.0;
private Double serviceFee = 0.0;
private Double minAmount = 0.0;
private int gracePeriodDays = 0;
private int periodStep = 0;
private int minPeriod = 0;
private int maxPeriod = 0;
private long id = 0;
private Double minRepaymentAmount = 0.0;
private Double gracePeriodRate = 0.0;
private Double amountStep = 0.0;
private Double overdueRate = 0.0;
private Double maxAmount = 0.0;
private String description = "";
private String updateTime = "";
private String periodUnit = "";
private String createTime = "";
private String name = "";
private String withholdMethod = "";
private String certProgress = "";
private boolean choose;
public Double getInterestRate() {
return interestRate;
}
public void setInterestRate(Double interestRate) {
this.interestRate = interestRate;
}
public Double getServiceFee() {
return serviceFee;
}
public void setServiceFee(Double serviceFee) {
this.serviceFee = serviceFee;
}
public Double getMinAmount() {
return minAmount;
}
public void setMinAmount(Double minAmount) {
this.minAmount = minAmount;
}
public int getGracePeriodDays() {
return gracePeriodDays;
}
public void setGracePeriodDays(int gracePeriodDays) {
this.gracePeriodDays = gracePeriodDays;
}
public int getPeriodStep() {
return periodStep;
}
public void setPeriodStep(int periodStep) {
this.periodStep = periodStep;
}
public int getMinPeriod() {
return minPeriod;
}
public void setMinPeriod(int minPeriod) {
this.minPeriod = minPeriod;
}
public int getMaxPeriod() {
return maxPeriod;
}
public void setMaxPeriod(int maxPeriod) {
this.maxPeriod = maxPeriod;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public Double getMinRepaymentAmount() {
return minRepaymentAmount;
}
public void setMinRepaymentAmount(Double minRepaymentAmount) {
this.minRepaymentAmount = minRepaymentAmount;
}
public Double getGracePeriodRate() {
return gracePeriodRate;
}
public void setGracePeriodRate(Double gracePeriodRate) {
this.gracePeriodRate = gracePeriodRate;
}
public Double getAmountStep() {
return amountStep;
}
public void setAmountStep(Double amountStep) {
this.amountStep = amountStep;
}
public Double getOverdueRate() {
return overdueRate;
}
public void setOverdueRate(Double overdueRate) {
this.overdueRate = overdueRate;
}
public Double getMaxAmount() {
return maxAmount;
}
public void setMaxAmount(Double maxAmount) {
this.maxAmount = maxAmount;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getUpdateTime() {
return updateTime;
}
public void setUpdateTime(String updateTime) {
this.updateTime = updateTime;
}
public String getPeriodUnit() {
return periodUnit;
}
public void setPeriodUnit(String periodUnit) {
this.periodUnit = periodUnit;
}
public String getCreateTime() {
return createTime;
}
public void setCreateTime(String createTime) {
this.createTime = createTime;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getWithholdMethod() {
return withholdMethod;
}
public void setWithholdMethod(String withholdMethod) {
this.withholdMethod = withholdMethod;
}
public String getCertProgress() {
return certProgress == null ? "" : certProgress;
}
public void setCertProgress(String certProgress) {
this.certProgress = certProgress;
}
public boolean isChoose() {
return choose;
}
public void setChoose(boolean choose) {
this.choose = choose;
}
}
...@@ -19,7 +19,7 @@ public class RegionBean implements Serializable { ...@@ -19,7 +19,7 @@ public class RegionBean implements Serializable {
this.regions = regions; this.regions = regions;
} }
public static class RegionsBean { public static class RegionsBean implements Serializable{
/** /**
* id : 88021 * id : 88021
* level : city * level : city
......
...@@ -7,10 +7,6 @@ import java.io.Serializable; ...@@ -7,10 +7,6 @@ import java.io.Serializable;
*/ */
public class TokenInfoBean implements Serializable { public class TokenInfoBean implements Serializable {
/**
* token : eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxNTAyNjU2MTM4NyIsImV4cCI6MTQ4ODE5NTc3MX0.HBjRY3XZxgr2fdnCpGt3zjClWAz-gyLYC7kSZAm7WT6yp3klllVEwmyDdAMJSQZp5VDh1D0mJOdtm3ainjOfBQ
* tokenInvalid : eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxNTAyNjU2MTM4NyIsImV4cCI6MTQ4ODgwMDU3MX0.Rz5kr57TD82LAkr7b1ALKjcDVgboO6G29KjjiuyFQ7EkuTsmYoZI4iJ4PR0dv7kkSW6U2JCGcBt_S_8i4TE_ow
*/
private String token; private String token;
private String refreshToken; private String refreshToken;
......
...@@ -11,10 +11,12 @@ package tech.starwin.mvp.beans; ...@@ -11,10 +11,12 @@ package tech.starwin.mvp.beans;
public class TotalAmount { public class TotalAmount {
private double amount = 600000; private double amount = 600000;
private int day = 7; private int day = 7;
private double rate = 1; private double rate = 1;
private double totalRepayment; private double totalRepayment;
private String periodUnit; private String periodUnit;
private int productId;
public void setRate(double rate) { public void setRate(double rate) {
this.rate = rate; this.rate = rate;
} }
...@@ -32,8 +34,6 @@ public class TotalAmount { ...@@ -32,8 +34,6 @@ public class TotalAmount {
} }
public double getAmount() { public double getAmount() {
return amount; return amount;
} }
...@@ -62,5 +62,12 @@ public class TotalAmount { ...@@ -62,5 +62,12 @@ public class TotalAmount {
return totalRepayment = amount + amount * day * rate / 100; return totalRepayment = amount + amount * day * rate / 100;
} }
public int getProductId() {
return productId;
}
public void setProductId(int productId) {
this.productId = productId;
}
} }
...@@ -6,18 +6,18 @@ import java.io.Serializable; ...@@ -6,18 +6,18 @@ import java.io.Serializable;
* Created by SiKang on 2018/9/30. * Created by SiKang on 2018/9/30.
*/ */
public class UserBankInfo implements Serializable { public class UserBankInfo implements Serializable {
private String bankCode; private String bankCode = "";
private String branch; private String branch = "";
private String cardNo; private String cardNo = "";
private String city; private String city = "";
private String createTime; private String createTime = "";
private int customerId; private int customerId;
private int id; private int id;
private int loanAppId; private int loanAppId;
private String updateTime; private String updateTime = "";
private String verifyAccountHolderName; private String verifyAccountHolderName = "";
private String verifyStatus; private String verifyStatus = "";
private String province; private String province = "";
public String getBankCode() { public String getBankCode() {
return bankCode; return bankCode;
......
package tech.starwin.mvp.beans; package tech.starwin.mvp.beans;
import java.io.Serializable; import java.io.Serializable;
import java.util.List;
/** /**
* Created by SiKang on 2018/9/14. * Created by SiKang on 2018/10/23.
*/ */
public class UserBean implements Serializable { public class UserBean implements Serializable {
public int user_id; private int availableCouponCount;
public String user_name; private List<ActivityInfoBean> banner;
public int user_age; private int inviteeCount;
public String user_sex; private String name;
private YWUser chatAccount;
public UserBean(int user_id, String user_name) { public int getAvailableCouponCount() {
this.user_id = user_id; return availableCouponCount;
this.user_name = user_name;
} }
@Override public void setAvailableCouponCount(int availableCouponCount) {
public String toString() { this.availableCouponCount = availableCouponCount;
return "user_id : " + user_id + ",user_name : " + user_name + ",user_age : " + user_age + "\n"; }
public List<ActivityInfoBean> getBanner() {
return banner;
}
public void setBanner(List<ActivityInfoBean> banner) {
this.banner = banner;
}
public int getInviteeCount() {
return inviteeCount;
}
public void setInviteeCount(int inviteeCount) {
this.inviteeCount = inviteeCount;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public YWUser getChatAccount() {
return chatAccount;
}
public void setChatAccount(YWUser chatAccount) {
this.chatAccount = chatAccount;
} }
} }
package tech.starwin.mvp.beans;
import java.io.Serializable;
public class UserInfo implements Serializable {
public String headIcon;
public String nicky;
}
\ No newline at end of file
package tech.starwin.mvp.presenter; package tech.starwin.mvp.presenter;
import android.text.TextUtils;
import tech.starwin.base.BasePresenter; import tech.starwin.base.BasePresenter;
import tech.starwin.mvp.api.LoanApi; import tech.starwin.mvp.api.LoanApi;
import tech.starwin.mvp.beans.LatestLoanAppBean;
import tech.starwin.utils.LoginManager; import tech.starwin.utils.LoginManager;
/** /**
...@@ -30,8 +33,8 @@ public class LoanPresenter extends BasePresenter<LoanApi> { ...@@ -30,8 +33,8 @@ public class LoanPresenter extends BasePresenter<LoanApi> {
/** /**
* 获取贷款进度 * 获取贷款进度
*/ */
public void getLoanProgress(String action) { public void getCertifyProgress(String action) {
handleRequest(action, apiService.getLoanProgress(LoginManager.get().getToken())); handleRequest(action, apiService.getCertifyProgress(LoginManager.get().getToken()));
} }
...@@ -58,4 +61,58 @@ public class LoanPresenter extends BasePresenter<LoanApi> { ...@@ -58,4 +61,58 @@ public class LoanPresenter extends BasePresenter<LoanApi> {
} }
/**
* 商品列表
*/
public void getProductList(String action) {
handleRequest(action, apiService.getProductsDefault());
}
/**
* 获取银行列表
*/
public void getBankList(String action) {
handleRequest(action, apiService.getBankList());
}
/**
* 申请贷款
*/
public void applyLoan(String action, LatestLoanAppBean loanInfo) {
handleRequest(action,
apiService.addBank(loanInfo.getLoanAppId(),
loanInfo.getBankCode(),
loanInfo.getCardNo(),
loanInfo.getApplyFor(),
loanInfo.getApplyChannel(),
"ANDROID",
loanInfo.getCouponId(),
LoginManager.get().getToken())
);
}
/**
* 获取付款方式
*/
public void getDepostMethods(String action) {
handleRequest(action, apiService.getDepostMethods(LoginManager.get().getToken()));
}
/**
* 创建还款订单
*/
public void getRepayOrder(String action, LatestLoanAppBean loanAppBean, final double payAmount, final String repayMethodorBank) {
handleRequest(action,
apiService.getRepayOrder(loanAppBean.getLoanAppId(),
"IDR",
repayMethodorBank,
payAmount,
LoginManager.get().getToken()
));
}
} }
package tech.starwin.mvp.presenter; package tech.starwin.mvp.presenter;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.content.Context;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import com.google.gson.Gson; import com.google.gson.Gson;
...@@ -12,10 +13,15 @@ import okhttp3.ResponseBody; ...@@ -12,10 +13,15 @@ import okhttp3.ResponseBody;
import tech.starwin.base.BasePresenter; import tech.starwin.base.BasePresenter;
import tech.starwin.impl.HttpObserver; import tech.starwin.impl.HttpObserver;
import tech.starwin.mvp.api.UploadApi; import tech.starwin.mvp.api.UploadApi;
import tech.starwin.mvp.beans.BasicAck;
import tech.starwin.mvp.beans.EmploymentBean; import tech.starwin.mvp.beans.EmploymentBean;
import tech.starwin.mvp.beans.OcrResultBean; import tech.starwin.mvp.beans.OcrResultBean;
import tech.starwin.mvp.beans.ProductBean;
import tech.starwin.mvp.beans.TotalAmount;
import tech.starwin.utils.GeneralUtils;
import tech.starwin.utils.LoginManager; import tech.starwin.utils.LoginManager;
import tech.starwin.utils.MultipartBodyMaker; import tech.starwin.utils.MultipartBodyMaker;
import tech.starwin.utils.PreferencesManager;
/** /**
* Created by SiKang on 2018/9/25. * Created by SiKang on 2018/9/25.
...@@ -30,31 +36,32 @@ public class UploadPresenter extends BasePresenter<UploadApi> { ...@@ -30,31 +36,32 @@ public class UploadPresenter extends BasePresenter<UploadApi> {
* 身份证ocr识别 * 身份证ocr识别
*/ */
public void identityOcr(final String action, @NonNull File file) { public void identityOcr(final String action, @NonNull File file) {
handleRequest(apiService.identityOcr(MultipartBodyMaker.makeSimplePart("file", file), LoginManager.get().getToken()), new HttpObserver<OcrResultBean>() { handleRequest(apiService.identityOcr(MultipartBodyMaker.makeSimplePart("file", file), LoginManager.get().getToken()),
@Override new HttpObserver<OcrResultBean>() {
public void onStart() { @Override
view.onHttpStart(action, true); public void onStart() {
} view.onHttpStart(action, true);
}
@Override
public void onSuccess(OcrResultBean data) { @Override
OcrResultBean.KTP ktp = new Gson().fromJson(data.getData(), OcrResultBean.KTP.class); public void onSuccess(OcrResultBean data) {
if (ktp.getResult().equals("PASS")) OcrResultBean.KTP ktp = new Gson().fromJson(data.getData(), OcrResultBean.KTP.class);
view.onHttpSuccess(action, ktp); if (ktp.getResult().equals("PASS"))
else view.onHttpSuccess(action, ktp);
view.onHttpError(action, ktp.getMessage()); else
} view.onHttpError(action, ktp.getMessage());
}
@Override
public void onError(int code, String msg) { @Override
view.onHttpError(action, msg); public void onError(int code, String msg) {
} view.onHttpError(action, msg);
}
@Override
public void onFinish() { @Override
view.onHttpFinish(action); public void onFinish() {
} view.onHttpFinish(action);
}); }
});
} }
/** /**
...@@ -62,16 +69,35 @@ public class UploadPresenter extends BasePresenter<UploadApi> { ...@@ -62,16 +69,35 @@ public class UploadPresenter extends BasePresenter<UploadApi> {
*/ */
@SuppressLint("CheckResult") @SuppressLint("CheckResult")
public void uploadEmploymentImg(final String action, EmploymentBean employmentBean, @NonNull File file) { public void uploadEmploymentImg(final String action, EmploymentBean employmentBean, @NonNull File file) {
handleRequest(apiService.uploadPhoto(MultipartBodyMaker.makeSimplePart("file", file), "EMPLOYMENT_PHOTO", LoginManager.get().getToken()), handleRequest(action, apiService.uploadPhoto(MultipartBodyMaker.makeSimplePart("file", file), "EMPLOYMENT_PHOTO", LoginManager.get().getToken()));
new HttpObserver<ResponseBody>() { }
/**
* 上传依图 截取得帧图片
*/
public void faceVerify(final String action, Context context, double amount, int day, long productId) {
handleRequest(
apiService.faceVerify(
"PAYDAY",
amount,
day,
"D",
null,
null,
MultipartBodyMaker.makeSimplePart("delta", PreferencesManager.get().getVerificationData()),
GeneralUtils.getAndroidID(context),
productId,
LoginManager.get().getToken()
),
new HttpObserver<BasicAck>() {
@Override @Override
public void onStart() { public void onStart() {
view.onHttpStart(action, true); view.onHttpStart(action, true);
} }
@Override @Override
public void onSuccess(ResponseBody responseBody) { public void onSuccess(BasicAck data) {
view.onHttpSuccess(action, responseBody); view.onHttpSuccess(action, data);
} }
@Override @Override
......
package tech.starwin.mvp.ui.activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.Nullable;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import tech.starwin.BuildConfig;
import tech.starwin.LibConfig;
import tech.starwin.utils.LoginManager;
import zendesk.suas.Action;
import zendesk.support.request.RequestActivity;
import zendesk.support.request.RequestUiConfig;
public class RefreshDeskActivity extends RequestActivity {
private static final long LOOP_TIME = 1500;
private Handler mHandler = new Handler();
private Field mAfField = null;
private Method mRefreshCommentMethod;
private Field mStoreField = null;
private Method mDispatchMethod;
private Object mAf = null;
private Object mStore = null;
private boolean mIsPaused = false;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
try {
mAfField = RequestActivity.class.getDeclaredField("af");
mAfField.setAccessible(true);
mStoreField = RequestActivity.class.getDeclaredField("store");
mStoreField.setAccessible(true);
mAf = mAfField.get(this);
mStore = mStoreField.get(this);
mRefreshCommentMethod = mAf.getClass().getDeclaredMethod("updateCommentsAsync");
mRefreshCommentMethod.setAccessible(true);
mDispatchMethod = mStore.getClass().getDeclaredMethod("dispatch", Action.class);
mDispatchMethod.setAccessible(true);
} catch (Exception e) {
e.printStackTrace();
finish();
return;
}
}
/**
* 启动会话界面
*/
public static void start(Context context) {
RequestUiConfig.Builder config = new RequestUiConfig.Builder();
config.withRequestSubject(LoginManager.get().getTokenInfo().getMobile());
Intent intent = RequestActivity.builder()
.withTags("2.0", LibConfig.VERSION_NAME + LibConfig.VERSION_CODE)
.intent(context, config.config());
intent.setClass(context, RefreshDeskActivity.class);
context.startActivity(intent);
}
private void refresh() {
try {
mDispatchMethod.invoke(mStore, mRefreshCommentMethod.invoke(mAf));
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
protected void onResume() {
super.onResume();
mIsPaused = false;
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
if (isFinishing() || mIsPaused) {
return;
}
refresh();
mHandler.postDelayed(this, LOOP_TIME);
}
}, LOOP_TIME);
}
@Override
protected void onPause() {
super.onPause();
mIsPaused = true;
mHandler.removeCallbacksAndMessages(null);
}
@Override
protected void onStop() {
super.onStop();
if (isFinishing()) {
mHandler.removeCallbacksAndMessages(null);
}
}
}
package tech.starwin.mvp.ui.activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import zendesk.support.requestlist.RequestListActivity;
import zendesk.support.requestlist.RequestListUiConfig;
public class RefreshDeskListActivity extends RequestListActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
/**
* 开启历史会话
*/
public static void start(Context context) {
RequestListUiConfig.Builder config = new RequestListUiConfig
.Builder();
Intent intent = RequestListActivity.builder().
intent(context, config.config());
intent.setClass(context, RefreshDeskListActivity.class);
context.startActivity(intent);
}
}
package tech.starwin.mvp.ui.activity;
import android.content.Intent;
import android.support.v4.app.FragmentActivity;
import tech.starwin.R;
import tech.starwin.base.BaseActivity;
import tech.starwin.mvp.ui.fragment.RegionFragment;
import tech.starwin.utils.context_utils.EasyActivityResult;
import tech.starwin.utils.context_utils.FragmentLauncher;
/**
* Created by SiKang on 2018/9/27.
*/
public class RegionActivity extends BaseActivity {
@Override
public int bindLayout() {
return R.layout.activity_region;
}
@Override
public boolean useTopBar() {
return false;
}
@Override
public FragmentLauncher getFragmentLauncher() {
return new FragmentLauncher(this, R.id.activity_area_frgmentLayout);
}
@Override
public void initView() {
startFragment(new RegionFragment(),false);
}
public static void startForResult(FragmentActivity activity, int requestCode, EasyActivityResult.OnResultListener listener) {
Intent intent = new Intent(activity, RegionActivity.class);
new EasyActivityResult(activity).startForResult(intent, requestCode, listener);
}
@Override
public void onHttpSuccess(String action, Object result) {
}
@Override
public void onHttpError(String action, String msg) {
}
}
package tech.starwin.mvp.ui.adapter;
import android.content.Context;
import android.widget.TextView;
import java.util.List;
import tech.starwin.R;
import tech.starwin.base.BaseRecyclerAdapter;
import tech.starwin.base.RecyclerViewHolder;
import tech.starwin.mvp.beans.RegionBean;
/**
* Created by SiKang on 2018/10/15.
*/
public class RegionAdapter extends BaseRecyclerAdapter<RegionBean.RegionsBean> {
public RegionAdapter(Context ctx, List<RegionBean.RegionsBean> list) {
super(ctx, list);
}
@Override
public Object bindItemLayout() {
return R.layout.item_of_regions;
}
@Override
public void bindData(RecyclerViewHolder holder, int position, RegionBean.RegionsBean item) {
holder.getTextView(R.id.item_of_regions_regionName_tv).setText(item.getName());
}
}
package tech.starwin.mvp.ui.fragment;
import android.app.Activity;
import android.os.Bundle;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import com.qmuiteam.qmui.widget.QMUITopBar;
import java.io.Serializable;
import tech.starwin.R;
import tech.starwin.base.BaseFragment;
import tech.starwin.base.BaseRecyclerAdapter;
import tech.starwin.mvp.beans.RegionBean;
import tech.starwin.mvp.presenter.UserPresenter;
import tech.starwin.mvp.ui.adapter.RegionAdapter;
import tech.starwin.utils.context_utils.ActivityJumper;
import tech.starwin.utils.ui_utils.UIHelper;
/**
* Created by SiKang on 2018/9/27.
*/
public class RegionFragment extends BaseFragment {
/**
* 区域级别
*/
public class RegionLevel {
public static final String PROVINCE = "province";
public static final String CITY = "city";
public static final String DISTRICT = "district";
public static final String AREA = "area";
}
/**
* 当前选好的地址
*/
public static class RegionInfo implements Serializable {
public String province="";
public String city="";
public String district="";
public String area="";
@Override
public String toString() {
return province + " " + city + " " + district + " " + area;
}
}
private QMUITopBar topBar;
private RecyclerView mRegionRv;
private RegionInfo regionInfo;
@Override
public int bindLayout() {
return R.layout.fragment_region;
}
@Override
public boolean useTopBar() {
return true;
}
@Override
protected void initTopBar(QMUITopBar topBar) {
super.initTopBar(topBar);
this.topBar = topBar;
}
@Override
public void initView(ViewGroup contentView) {
mRegionRv = contentView.findViewById(R.id.fragment_region_rv);
//要显示的地区分级
RegionBean.RegionsBean regionBean;
Bundle arguments = getArguments();
if (arguments != null && arguments.getSerializable("regionLevel") != null) {
regionBean = (RegionBean.RegionsBean) getArguments().getSerializable("regionLevel");
} else {
regionBean = new RegionBean.RegionsBean(1, RegionLevel.PROVINCE, RegionLevel.PROVINCE);
}
//已经选好的部分
if (arguments != null && arguments.getSerializable("region_info") != null) {
regionInfo = (RegionInfo) getArguments().getSerializable("region_info");
} else {
regionInfo = new RegionInfo();
}
//设置标题
switch (regionBean.getLevel()) {
case RegionLevel.PROVINCE:
topBar.setTitle(R.string.textview_personal_info_province_of_residence);
break;
case RegionLevel.CITY:
topBar.setTitle(R.string.textview_personal_info_city_of_residence);
break;
case RegionLevel.DISTRICT:
topBar.setTitle(R.string.textview_personal_info_street_of_residence);
break;
case RegionLevel.AREA:
topBar.setTitle(R.string.textview_personal_info_area_of_residence);
break;
}
//获取地区列表
getPresenter(UserPresenter.class).getRegion("action_getRegion", regionBean.getLevel(), regionBean.getId());
}
/**
* 创建实例
*/
public static RegionFragment create(RegionBean.RegionsBean regionsBean) {
RegionFragment fragment = new RegionFragment();
fragment.setArguments(new ActivityJumper.Builder().put("regionLevel", regionsBean).toBundle());
return fragment;
}
@Override
public void onHttpSuccess(String action, Object result) {
if (action == "action_getRegion") {
//填充数据,更新UI
final RegionBean regionBean = (RegionBean) result;
RegionAdapter regionAdapter = new RegionAdapter(getActivity(), regionBean.getRegions());
UIHelper.bindAdapter(mRegionRv, regionAdapter);
//选中区域 item
regionAdapter.setOnItemClickListener(new BaseRecyclerAdapter.OnItemClickListener<RegionBean.RegionsBean>() {
@Override
public void onItemClick(View itemView, int pos, RegionBean.RegionsBean regionsBean) {
//
switch (regionsBean.getLevel()) {
case RegionLevel.PROVINCE:
regionInfo.province = regionsBean.getName();
regionsBean.setLevel(RegionLevel.CITY);
break;
case RegionLevel.CITY:
regionInfo.city = regionsBean.getName();
regionsBean.setLevel(RegionLevel.DISTRICT);
break;
case RegionLevel.DISTRICT:
regionInfo.district = regionsBean.getName();
regionsBean.setLevel(RegionLevel.AREA);
break;
case RegionLevel.AREA:
regionInfo.area = regionsBean.getName();
//最后一级选择完成,关闭界面,返回数据
getActivity().setResult(Activity.RESULT_OK, new ActivityJumper.Builder().put("region_info", regionInfo).toIntent());
getActivity().finish();
return;
}
//下一级
RegionFragment fragment = create(regionsBean);
fragment.getArguments().putSerializable("region_info", regionInfo);
startFragmentAndDestroyCurrent(fragment,true);
}
});
}
}
@Override
public void onHttpError(String action, String msg) {
}
}
...@@ -7,5 +7,6 @@ public class Error { ...@@ -7,5 +7,6 @@ public class Error {
public static final int HTTP_ERROR = 1001;//链路错误 public static final int HTTP_ERROR = 1001;//链路错误
public static final int SERVER_ERROR = 1002;//Server响应数据错误 public static final int SERVER_ERROR = 1002;//Server响应数据错误
public static final int APP_ERROR = 1003;//程序异常 public static final int APP_ERROR = 1003;//程序异常
public static final int UNKNOW = 1004;//程序异常
} }
...@@ -8,6 +8,7 @@ import java.util.List; ...@@ -8,6 +8,7 @@ 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; import tech.starwin.utils.LogUtils;
import tech.starwin.utils.PreferencesManager;
/** /**
* Created by SiKang on 2018/9/28. * Created by SiKang on 2018/9/28.
...@@ -33,6 +34,7 @@ public class Gateway { ...@@ -33,6 +34,7 @@ public class Gateway {
*/ */
public static void notify(GatewayInfoBean info) { public static void notify(GatewayInfoBean info) {
gatewayInfo.notifyWith(info); gatewayInfo.notifyWith(info);
PreferencesManager.get().saveGatewayInfo(info);
} }
public static List<String> getGatewayUrl() { public static List<String> getGatewayUrl() {
......
package tech.starwin.utils;
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.view.View;
/**
* Created by SiKang on 2018/10/22.
*/
public class AnimatorGenerator {
public static ObjectAnimator createScaleXAnimator(View view, long duration, float... values) {
ObjectAnimator animator = ObjectAnimator.ofFloat(view, "scaleX", values);
animator.setDuration(duration);
return animator;
}
public static ObjectAnimator createScaleYAnimator(View view, long duration, float... values) {
ObjectAnimator animator = ObjectAnimator.ofFloat(view, "scaleY", values);
animator.setDuration(duration);
return animator;
}
public static ObjectAnimator createRotationAnimator(View view, long duration, float... values) {
ObjectAnimator animator = ObjectAnimator.ofFloat(view, "rotation", values);
animator.setDuration(duration);
return animator;
}
public static ObjectAnimator createTranslationXnAnimator(View view, long duration, float... values) {
ObjectAnimator animator = ObjectAnimator.ofFloat(view, "translationX", values);
animator.setDuration(duration);
return animator;
}
public static ObjectAnimator createTranslationYAnimator(View view, long duration, float... values) {
ObjectAnimator animator = ObjectAnimator.ofFloat(view, "translationY", values);
animator.setDuration(duration);
return animator;
}
/**
* 开关动画
* 将打开动画参数取反序作为还原动作
*/
public static class SwitchAnimatorAdapter {
ObjectAnimator openAnimator;
ObjectAnimator closeAnimator;
public SwitchAnimatorAdapter(View view, String propertyName, float... values) {
openAnimator = ObjectAnimator.ofFloat(view, propertyName, values);
int length = values.length;
float[] closeValues = new float[length];
for (int i = 0; i < length; i++) {
closeValues[length - 1 - i] = values[i];
}
closeAnimator = ObjectAnimator.ofFloat(view, propertyName, closeValues);
}
public void setDuration(long duration) {
openAnimator.setDuration(duration);
closeAnimator.setDuration(duration);
}
public void addUpdateListener(ValueAnimator.AnimatorUpdateListener listener) {
openAnimator.addUpdateListener(listener);
closeAnimator.addUpdateListener(listener);
}
public void open() {
openAnimator.start();
}
public void close() {
closeAnimator.start();
}
}
}
\ No newline at end of file
package tech.starwin.utils;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.provider.ContactsContract;
/**
* Created by SiKang on 2018/10/19.
* 数据库辅助类,用于涉及数据库查询的业务封装
*/
public class DataBaseHelper {
/**
* 查询联系人信息
*
* @return String[name, number]
*/
public static String[] queryContactInfo(Context context, Uri uri) {
String[] data = null;
if (uri != null) {
Cursor cursor = context.getContentResolver()
.query(uri, new String[]{ContactsContract.CommonDataKinds.Phone.NUMBER,
ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME},
null, null, null);
while (cursor != null && cursor.moveToNext()) {
String number = cursor.getString(0);
String name = cursor.getString(1);
data = new String[]{name, number};
}
cursor.close();
}
return data;
}
}
package tech.starwin.utils;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.StringRes;
import android.text.TextUtils;
import android.util.Base64;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
import tech.starwin.R;
/**
* Created by SiKang on 2018/10/16.
*/
public class DataFormat {
/**
* 格式化金额
*/
public static String indMoneyFormat(@Nullable Context context, double money) {
return String.format(context.getString(R.string.moneySymbol) + "%,.0f", money).replaceAll(",", ".");
}
public static String moneyFormat(double paidAmount) {
// return moneyFormat(String.valueOf(paidAmount));
return String.format("%,.0f", paidAmount).replace(",", ".");
}
/**
* 格式化时间
*/
@Nullable
public static String periodFormate(@Nullable Context context, double term, @NonNull String periodUnit) {
String result = "" + (int) term + getPeriodTextUnit(context, periodUnit);
return result;
}
private static String getPeriodTextUnit(Context context, String periodUnit) {
String unit = context.getResources().getString(R.string.days);
if ("D".equals(periodUnit)) {
unit = context.getString(R.string.days);
} else if ("M".equals(periodUnit)) {
unit = context.getString(R.string.months);
} else if ("Y".equals(periodUnit)) {
unit = context.getString(R.string.years);
}
return unit;
}
public static String dayTimeFormat(Context context, int period) {
StringBuffer result = new StringBuffer();
int days = period;
if (days > 365) {
int year = days / 365;
result.append(year + context.getString(R.string.years));
days = days % 365;
}
if (days >30) {
int month = days / 30;
result.append(month + context.getString(R.string.months));
days = days & 30;
}
result.append(days + context.getString(R.string.days));
return result.toString();
}
/**
* 序列化对象
*/
public static String fromBean(Object obj) {
try {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ObjectOutputStream objectOutputStream = null;
objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
objectOutputStream.writeObject(obj);
return base64(byteArrayOutputStream.toByteArray());
} catch (IOException e) {
e.printStackTrace();
}
return "";
}
/**
* 反序列化对象
*/
public static Object toBean(String str) {
try {
byte[] bytes = Base64.decode(str, Base64.NO_WRAP);
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
return objectInputStream.readObject();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
/**
* String转base64
*/
public static String base64(String content) {
if (!TextUtils.isEmpty(content))
return Base64.encodeToString(content.getBytes(), Base64.DEFAULT);
else
return "";
}
/**
* String转base64
*/
public static String base64(byte[] bytes) {
if (bytes != null && bytes.length > 0)
return Base64.encodeToString(bytes, Base64.DEFAULT);
else
return "";
}
/**
* 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();
}
/**
* 格式化时间
*/
public static String convertTime(String srcTime, String formatStyle) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
simpleDateFormat.setTimeZone(TimeZone.getTimeZone("GMT00:00"));
SimpleDateFormat simpleDateFormatLocal = new SimpleDateFormat(formatStyle);
simpleDateFormatLocal.setTimeZone(TimeZone.getDefault());
try {
if (TextUtils.isEmpty(srcTime)) {
return "0";
}
Date srcDate = simpleDateFormat.parse(srcTime);
String targetTime = simpleDateFormatLocal.format(srcDate);
return targetTime;
} catch (ParseException e) {
e.printStackTrace();
}
return "0";
}
/**
* 转换时间(String -> Date)
*/
public static Date stringToDate(String time, String format) {
try {
SimpleDateFormat formatter = new SimpleDateFormat(format);
Date date = formatter.parse(time);
return date;
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
/**
* 转换时间(Date -> String)
*/
public static String dateToString(Date date, String format) {
SimpleDateFormat formatter = new SimpleDateFormat(format);
String time = formatter.format(date);
return time;
}
}
...@@ -38,106 +38,6 @@ import tech.starwin.R; ...@@ -38,106 +38,6 @@ import tech.starwin.R;
public class GeneralUtils { public class GeneralUtils {
/** /**
* 序列化对象
*/
public static String fromBean(Object obj) {
try {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ObjectOutputStream objectOutputStream = null;
objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
objectOutputStream.writeObject(obj);
return base64(byteArrayOutputStream.toByteArray());
} catch (IOException e) {
e.printStackTrace();
}
return "";
}
/**
* 反序列化对象
*/
public static Object toBean(String str) {
try {
byte[] bytes = Base64.decode(str, Base64.NO_WRAP);
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
return objectInputStream.readObject();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
/**
* String转base64
*/
public static String base64(String content) {
if (!TextUtils.isEmpty(content))
return Base64.encodeToString(content.getBytes(), Base64.DEFAULT);
else
return "";
}
/**
* 格式化金额
*/
public static String indMoneyFormat(@Nullable Context context, double money) {
return String.format(context.getString(R.string.moneySymbol) + "%,.0f", money).replaceAll(",", ".");
}
public static String moneyFormat(double paidAmount) {
// return moneyFormat(String.valueOf(paidAmount));
return String.format("%,.0f", paidAmount).replace(",", ".");
}
/**
* 格式化时间
*/
@Nullable
public static CharSequence periodFormate(@Nullable Context context, double term, @NonNull String periodUnit) {
String result = "" + (int) term + getPeriodTextUnit(context, periodUnit);
return result;
}
private static String getPeriodTextUnit(Context context, String periodUnit) {
String unit = context.getResources().getString(R.string.days);
if ("D".equals(periodUnit)) {
unit = context.getString(R.string.days);
} else if ("M".equals(periodUnit)) {
unit = context.getString(R.string.months);
} else if ("Y".equals(periodUnit)) {
unit = context.getString(R.string.years);
}
return unit;
}
/**
* 转换时间(String -> Date)
*/
public static Date stringToDate(String time, String format) {
try {
SimpleDateFormat formatter = new SimpleDateFormat(format);
Date date = formatter.parse(time);
return date;
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
/**
* 转换时间(Date -> String)
*/
public static String dateToString(Date date, String format) {
SimpleDateFormat formatter = new SimpleDateFormat(format);
String time = formatter.format(date);
return time;
}
/**
* List是否无内容 * List是否无内容
*/ */
public static boolean isEmpty(List list) { public static boolean isEmpty(List list) {
...@@ -146,34 +46,23 @@ public class GeneralUtils { ...@@ -146,34 +46,23 @@ public class GeneralUtils {
return false; return false;
} }
/** /**
* 获取时间戳 yyyyMMddHHmmss * 是否有空值
*/ */
public static String getTimeYMDHMS() { public static boolean hasEmpty(String value, String... values) {
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); if (TextUtils.isEmpty(value)) {
return formatter.format(new Date()); return true;
} } else {
for (String str : values) {
/** if (TextUtils.isEmpty(str)) {
* 获取时间戳 yyyyMMdd return true;
*/ }
public static String getTimeYMD() { }
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); }
return formatter.format(new Date());
}
/** return false;
* String转base64
*/
public static String base64(byte[] bytes) {
if (bytes != null && bytes.length > 0)
return Base64.encodeToString(bytes, Base64.DEFAULT);
else
return "";
} }
/** /**
* 获取应用程序名称 * 获取应用程序名称
*/ */
...@@ -190,35 +79,6 @@ public class GeneralUtils { ...@@ -190,35 +79,6 @@ public class GeneralUtils {
} }
/** /**
* 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 * 获取AndroidID
*/ */
@SuppressLint("HardwareIds") @SuppressLint("HardwareIds")
......
...@@ -5,6 +5,7 @@ import android.content.Intent; ...@@ -5,6 +5,7 @@ import android.content.Intent;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo; import android.content.pm.ResolveInfo;
import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentActivity;
import android.text.TextUtils;
import com.facebook.accountkit.AccountKitError; import com.facebook.accountkit.AccountKitError;
import com.facebook.accountkit.AccountKitLoginResult; import com.facebook.accountkit.AccountKitLoginResult;
...@@ -16,8 +17,9 @@ import java.util.List; ...@@ -16,8 +17,9 @@ 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.mvp.beans.UserBean;
import tech.starwin.utils.context_utils.EasyActivityResult; import tech.starwin.utils.context_utils.EasyActivityResult;
import tech.starwin.utils.context_utils.IntentHolder; import tech.starwin.utils.context_utils.ActivityJumper;
/** /**
* Created by SiKang on 2018/9/19. * Created by SiKang on 2018/9/19.
...@@ -27,6 +29,7 @@ public class LoginManager { ...@@ -27,6 +29,7 @@ public class LoginManager {
public static final String TAG = "LoginManager"; public static final String TAG = "LoginManager";
private static LoginManager loginManager; private static LoginManager loginManager;
private TokenInfoBean tokenInfo; private TokenInfoBean tokenInfo;
private UserBean userInfo;
private LoginManager() { private LoginManager() {
} }
...@@ -51,7 +54,7 @@ public class LoginManager { ...@@ -51,7 +54,7 @@ public class LoginManager {
tokenInfo = null; tokenInfo = null;
//跳转登录界面 //跳转登录界面
if (isActionSupport(LibConfig.getContext(), LibConfig.LOGIN_ACTIVITY_ACTION)) { if (isActionSupport(LibConfig.getContext(), LibConfig.LOGIN_ACTIVITY_ACTION)) {
new IntentHolder.Builder(LibConfig.getContext(), LibConfig.LOGIN_ACTIVITY_ACTION) new ActivityJumper.Builder(LibConfig.getContext(), LibConfig.LOGIN_ACTIVITY_ACTION)
.build().start(); .build().start();
} else { } else {
LogUtils.e(TAG, "找不到LoginActivity,请在build.gradle中配置正确的 ‘LOGIN_ACTIVITY_ACTION’ "); LogUtils.e(TAG, "找不到LoginActivity,请在build.gradle中配置正确的 ‘LOGIN_ACTIVITY_ACTION’ ");
...@@ -112,6 +115,17 @@ public class LoginManager { ...@@ -112,6 +115,17 @@ public class LoginManager {
} }
/** /**
* 获取用户信息
*/
public UserBean getUserInfo() {
if (userInfo == null) {
userInfo = PreferencesManager.get().getUserInfo();
}
return userInfo;
}
/**
* 退出登录 * 退出登录
*/ */
public void logout() { public void logout() {
......
...@@ -27,7 +27,7 @@ public class MultipartBodyMaker { ...@@ -27,7 +27,7 @@ public class MultipartBodyMaker {
} }
/** /**
* 创建一个只包含一个参数的 MultipartBody.Part * 创建一个只包含一个文件的 MultipartBody.Part
*/ */
public static MultipartBody.Part makeSimplePart(String name, File file) { public static MultipartBody.Part makeSimplePart(String name, File file) {
MediaType mediaType = MediaType.parse(FileUtils.getMimeType(file)); MediaType mediaType = MediaType.parse(FileUtils.getMimeType(file));
...@@ -35,6 +35,10 @@ public class MultipartBodyMaker { ...@@ -35,6 +35,10 @@ public class MultipartBodyMaker {
return MultipartBody.Part.createFormData(name, file.getName(), requestFile); return MultipartBody.Part.createFormData(name, file.getName(), requestFile);
} }
public static MultipartBody.Part makeSimplePart(String name, String value) {
return MultipartBody.Part.createFormData(name, value);
}
public static class Builder { public static class Builder {
MultipartBody.Builder builder; MultipartBody.Builder builder;
......
...@@ -8,7 +8,8 @@ import android.text.TextUtils; ...@@ -8,7 +8,8 @@ import android.text.TextUtils;
import java.util.Map; import java.util.Map;
import tech.starwin.mvp.beans.GatewayInfoBean; import tech.starwin.mvp.beans.GatewayInfoBean;
import tech.starwin.mvp.beans.PersonalInfo; import tech.starwin.mvp.beans.LoanInfo;
import tech.starwin.mvp.beans.PersonalInfoServerBean;
import tech.starwin.mvp.beans.TokenInfoBean; import tech.starwin.mvp.beans.TokenInfoBean;
import tech.starwin.mvp.beans.UserBean; import tech.starwin.mvp.beans.UserBean;
...@@ -51,7 +52,7 @@ public class PreferencesManager { ...@@ -51,7 +52,7 @@ public class PreferencesManager {
* 保存登录信息 * 保存登录信息
*/ */
public void saveTokenInfo(TokenInfoBean tokenInfoBean) { public void saveTokenInfo(TokenInfoBean tokenInfoBean) {
saveData("token_info", GeneralUtils.fromBean(tokenInfoBean)); saveData("token_info", DataFormat.fromBean(tokenInfoBean));
} }
/** /**
...@@ -59,52 +60,57 @@ public class PreferencesManager { ...@@ -59,52 +60,57 @@ public class PreferencesManager {
*/ */
public TokenInfoBean getTokenInfo() { public TokenInfoBean getTokenInfo() {
String tokenStr = getString("token_info", ""); String tokenStr = getString("token_info", "");
return TextUtils.isEmpty(tokenStr) ? null : (TokenInfoBean) GeneralUtils.toBean(tokenStr); return TextUtils.isEmpty(tokenStr) ? null : (TokenInfoBean) DataFormat.toBean(tokenStr);
} }
/** /**
* 保存用户登录信息 * 保存用户信息
*/ */
public void saveUserInfo(UserBean userBean) { public void saveUserInfo(UserBean userInfo) {
saveData("user_info", GeneralUtils.fromBean(userBean)); saveData("user_info", DataFormat.fromBean(userInfo));
} }
/** /**
* 获取用户登录信息 * 获取用户信息
*/ */
public UserBean getUserInfo() { public UserBean getUserInfo() {
String userStr = getString("user_info", ""); String userStr = getString("user_info", "");
return TextUtils.isEmpty(userStr) ? null : (UserBean) GeneralUtils.toBean(userStr); return TextUtils.isEmpty(userStr) ? null : (UserBean) DataFormat.toBean(userStr);
} }
/** /**
* 保存用户的个人认证信息 * 保存Gateway信息
*/ */
public void savePersonalInfo(PersonalInfo personalInfo) { public void saveGatewayInfo(GatewayInfoBean gatewayInfo) {
saveData("personal_info", GeneralUtils.fromBean(personalInfo)); saveData("gateway_info", DataFormat.fromBean(gatewayInfo));
} }
/** /**
* 获取用户的个人认证信息 * 获取Gateway信息
*/ */
public PersonalInfo getPersonalInfo() { public GatewayInfoBean getGatewayInfo() {
String objStr = getString("personal_info", ""); String objStr = getString("gateway_info", "");
return TextUtils.isEmpty(objStr) ? null : (PersonalInfo) GeneralUtils.toBean(objStr); return TextUtils.isEmpty(objStr) ? null : (GatewayInfoBean) DataFormat.toBean(objStr);
} }
/** /**
* 保存Gateway信息 * 保存活体识别截图
*/ */
public void saveGatewayInfo(GatewayInfoBean gatewayInfo) { public void saveVerificationData(byte[] data) {
saveData("gateway_info", GeneralUtils.fromBean(gatewayInfo)); if (data == null) {
saveData("verification_data", "");
} else {
saveData("verification_data", DataFormat.base64(data));
}
} }
/** /**
* 获取Gateway信息 * 获取活体识别截图
*/ */
public GatewayInfoBean getGatewayInfo() { public String getVerificationData() {
String objStr = getString("gateway_info", ""); return getString("verification_data", null);
return TextUtils.isEmpty(objStr) ? null : (GatewayInfoBean) GeneralUtils.toBean(objStr);
} }
/** /**
......
package tech.starwin.utils;
import android.text.TextUtils;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Created by SiKang on 2018/10/17.
*/
public class StringAdapter {
List<Item> itemList = new ArrayList<>();
public void addItem(Item item) {
itemList.add(item);
}
public String getItemValue(String info) {
if (!TextUtils.isEmpty(info)) {
for (Item item : itemList) {
if (info.equals(item.infoStr))
return item.dataStr;
}
}
return "";
}
public String getItemInfoStr(String value) {
if (!TextUtils.isEmpty(value)) {
for (Item item : itemList) {
if (value.equals(item.dataStr))
return item.infoStr;
}
}
return "";
}
public String[] getInfoArray() {
String[] itemArray = new String[itemList.size()];
for (int i = 0; i < itemList.size(); i++) {
itemArray[i] = itemList.get(i).infoStr;
}
return itemArray;
}
public static class Item {
//需要翻译后 展示给用户的文本
public String infoStr;
//需要传给服务器的文本
public String dataStr;
public Item(String value, String infoStr) {
this.infoStr = infoStr;
this.dataStr = value;
}
}
}
...@@ -3,6 +3,7 @@ package tech.starwin.utils.context_utils; ...@@ -3,6 +3,7 @@ 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.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import java.io.Serializable; import java.io.Serializable;
...@@ -13,14 +14,14 @@ import tech.starwin.R; ...@@ -13,14 +14,14 @@ import tech.starwin.R;
* Created by SiKang on 2018/9/16. * Created by SiKang on 2018/9/16.
* Intent的创建和使用 * Intent的创建和使用
*/ */
public class IntentHolder { public class ActivityJumper {
private Intent intent; private Intent intent;
/** /**
* 发起跳转的Context * 发起跳转的Context
*/ */
private Context context; private Context context;
private IntentHolder(Context from, Intent intent) { private ActivityJumper(Context from, Intent intent) {
this.intent = intent; this.intent = intent;
this.context = from; this.context = from;
} }
...@@ -52,12 +53,22 @@ public class IntentHolder { ...@@ -52,12 +53,22 @@ public class IntentHolder {
return intent; return intent;
} }
/**
* 启动拨号键盘
*/
public static void startCallTel(Context context, String tel) {
Intent intent = new Intent(Intent.ACTION_DIAL);
Uri data = Uri.parse("tel:" + tel);
intent.setData(data);
context.startActivity(intent);
}
public static class Builder { public static class Builder {
private Intent intent; private Intent intent;
private Context fromContext; private Context fromContext;
public Builder() { public Builder() {
intent = new Intent();
} }
public <C extends Activity> Builder(Context from, Class<C> target) { public <C extends Activity> Builder(Context from, Class<C> target) {
...@@ -100,8 +111,8 @@ public class IntentHolder { ...@@ -100,8 +111,8 @@ public class IntentHolder {
return this; return this;
} }
public IntentHolder build() { public ActivityJumper build() {
return new IntentHolder(fromContext, intent); return new ActivityJumper(fromContext, intent);
} }
public Intent toIntent() { public Intent toIntent() {
......
package tech.starwin.utils.context_utils; package tech.starwin.utils.context_utils;
import android.os.Bundle;
import android.support.annotation.IdRes; import android.support.annotation.IdRes;
import android.support.v4.app.Fragment; import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentActivity;
...@@ -9,7 +10,6 @@ import java.lang.reflect.Field; ...@@ -9,7 +10,6 @@ import java.lang.reflect.Field;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import tech.starwin.R;
import tech.starwin.utils.GeneralUtils; import tech.starwin.utils.GeneralUtils;
...@@ -37,27 +37,46 @@ public class FragmentLauncher { ...@@ -37,27 +37,46 @@ public class FragmentLauncher {
private Map<String, Fragment> framentSet; private Map<String, Fragment> framentSet;
public Fragment getCurrentFragment() {
return currentFragment;
}
public FragmentLauncher(FragmentActivity activity, @IdRes int fragmentLayout) { public FragmentLauncher(FragmentActivity activity, @IdRes int fragmentLayout) {
this.activity = activity; this.activity = activity;
this.fragmentLayout = fragmentLayout; this.fragmentLayout = fragmentLayout;
framentSet = new HashMap<>();
} }
public <T extends Fragment> T showFragmentAndHideCurrent(Class<T> clz) { public <T extends Fragment> T showFragmentAndHideCurrent(Class<T> clz) {
return changeFragment(clz, false); return changeFragment(clz, null, null, false);
} }
public <T extends Fragment> T showFragmentAndDestoryCurrent(Class<T> clz) { public <T extends Fragment> T showFragmentAndDestoryCurrent(Class<T> clz) {
return changeFragment(clz, true); return changeFragment(clz, null, null, true);
}
public <T extends Fragment> T showFragmentAndHideCurrent(Class<T> clz, OnFragmentCreateListener<T> listener) {
return changeFragment(clz, listener, null, false);
}
public <T extends Fragment> T showFragmentAndDestoryCurrent(Class<T> clz, OnFragmentCreateListener<T> listener) {
return changeFragment(clz, listener, null, true);
}
public <T extends Fragment> T showFragmentAndHideCurrent(Class<T> clz, Bundle arguments) {
return changeFragment(clz, null, arguments, false);
}
public <T extends Fragment> T showFragmentAndDestoryCurrent(Class<T> clz, Bundle arguments) {
return changeFragment(clz, null, arguments, true);
} }
/** /**
* 显示一个Fragment(没有则先创建),并隐藏当前的Fragment * 显示一个Fragment(没有则先创建),并隐藏当前的Fragment
*/ */
private <T extends Fragment> T changeFragment(Class<T> clz, boolean isDestory) { private <T extends Fragment> T changeFragment(Class<T> clz, OnFragmentCreateListener<T> listener, Bundle arguments, boolean isDestory) {
if (framentSet == null)
framentSet = new HashMap<>();
T fragment = null; T fragment = null;
String className = clz.getName(); String className = clz.getName();
//如果Fragment已被创建,且当前为显示状态,则无需改动 //如果Fragment已被创建,且当前为显示状态,则无需改动
...@@ -73,6 +92,7 @@ public class FragmentLauncher { ...@@ -73,6 +92,7 @@ public class FragmentLauncher {
if (currentFragment != null) { if (currentFragment != null) {
if (isDestory) { if (isDestory) {
transaction.remove(currentFragment); transaction.remove(currentFragment);
framentSet.remove(currentFragment);
} else { } else {
transaction.hide(currentFragment); transaction.hide(currentFragment);
} }
...@@ -88,6 +108,11 @@ public class FragmentLauncher { ...@@ -88,6 +108,11 @@ public class FragmentLauncher {
} }
//更新当前页 //更新当前页
currentFragment = fragment; currentFragment = fragment;
if (listener != null) {
listener.onFragmentCreated(fragment);
}
fragment.setArguments(arguments);
//提交 //提交
transaction.commit(); transaction.commit();
return fragment; return fragment;
...@@ -96,19 +121,20 @@ public class FragmentLauncher { ...@@ -96,19 +121,20 @@ public class FragmentLauncher {
/** /**
* 打开一个Fragment * 打开一个Fragment
* 必须实现 bindFragmentLayout() 绑定FrameLayout
*/ */
public int startFragment(Fragment fragment, boolean isAddToBackStack) { public int startFragment(Fragment fragment, TransitionConfig config, boolean isAddToBackStack) {
if (fragmentLayout != 0) { if (fragmentLayout != 0) {
TransitionConfig config = new TransitionConfig(
R.anim.slide_in_right, R.anim.slide_out_left,
R.anim.slide_in_left, R.anim.slide_out_right);
String tagName = fragment.getClass().getSimpleName(); String tagName = fragment.getClass().getSimpleName();
FragmentTransaction transaction = activity.getSupportFragmentManager() FragmentTransaction transaction = activity.getSupportFragmentManager()
.beginTransaction() .beginTransaction();
.setCustomAnimations(config.enter, config.exit, config.popenter, config.popout) if (config != null) {
.replace(fragmentLayout, fragment, tagName); transaction.setCustomAnimations(config.enter, config.exit, config.popenter, config.popout);
}
transaction.replace(fragmentLayout, fragment, tagName);
if (currentFragment != null && framentSet.containsValue(currentFragment)) {
framentSet.remove(currentFragment.getClass().getName());
currentFragment = null;
}
if (isAddToBackStack) if (isAddToBackStack)
transaction.addToBackStack(tagName); transaction.addToBackStack(tagName);
return transaction.commit(); return transaction.commit();
...@@ -118,10 +144,9 @@ public class FragmentLauncher { ...@@ -118,10 +144,9 @@ public class FragmentLauncher {
/** /**
* 打开一个Fragment,且替换BackStack栈顶Fragment * 打开一个Fragment,且替换BackStack栈顶Fragment
* 必须实现 bindFragmentLayout() 绑定FrameLayout
*/ */
public int startFragmentAndDestroyCurrent(final Fragment fragment) { public int startFragmentAndDestroyCurrent(final Fragment fragment, TransitionConfig config) {
int index = startFragment(fragment, false); int index = startFragment(fragment, config, false);
GeneralUtils.findAndModifyOpInBackStackRecord(activity.getSupportFragmentManager(), -1, new GeneralUtils.OPHandler() { GeneralUtils.findAndModifyOpInBackStackRecord(activity.getSupportFragmentManager(), -1, new GeneralUtils.OPHandler() {
@Override @Override
public boolean handle(Object op) { public boolean handle(Object op) {
...@@ -171,4 +196,8 @@ public class FragmentLauncher { ...@@ -171,4 +196,8 @@ public class FragmentLauncher {
} }
} }
public interface OnFragmentCreateListener<T extends Fragment> {
void onFragmentCreated(T t);
}
} }
...@@ -145,4 +145,16 @@ public class PermissionsHelper { ...@@ -145,4 +145,16 @@ public class PermissionsHelper {
*/ */
void onRefuseAndNeverAskAgain(Permission permission); void onRefuseAndNeverAskAgain(Permission permission);
} }
public abstract static class OnSimplePermissionListener implements OnPermissionListener {
@Override
public void onRefuse(Permission permission) {
}
@Override
public void onRefuseAndNeverAskAgain(Permission permission) {
}
}
} }
...@@ -29,6 +29,11 @@ public class EventSender { ...@@ -29,6 +29,11 @@ public class EventSender {
message = new EventMessage(); message = new EventMessage();
} }
public Builder(int what) {
message = new EventMessage();
message.what = what;
}
public Builder what(int what) { public Builder what(int what) {
message.what = what; message.what = what;
return this; return this;
......
...@@ -3,12 +3,14 @@ package tech.starwin.utils.ui_utils; ...@@ -3,12 +3,14 @@ package tech.starwin.utils.ui_utils;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.app.Activity; import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog; import android.app.Dialog;
import android.content.Context; import android.content.Context;
import android.content.ContextWrapper; import android.content.ContextWrapper;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.os.Build; import android.os.Build;
import android.text.InputType; import android.text.InputType;
import android.view.View;
import android.widget.EditText; import android.widget.EditText;
import android.widget.Toast; import android.widget.Toast;
...@@ -149,6 +151,14 @@ public class DialogFactory { ...@@ -149,6 +151,14 @@ public class DialogFactory {
return builder.create(); return builder.create();
} }
public static Dialog showCustomDialog(View view) {
Dialog dialog = new AlertDialog.Builder(view.getContext()).create();
dialog.show();
dialog.getWindow().setContentView(view);
return dialog;
}
/** /**
* 显示一个对话框,并在计时结束后dismiss * 显示一个对话框,并在计时结束后dismiss
*/ */
...@@ -166,6 +176,7 @@ public class DialogFactory { ...@@ -166,6 +176,7 @@ public class DialogFactory {
}); });
} }
public interface OnInputActionListener { public interface OnInputActionListener {
void onClick(QMUIDialog dialog, EditText editText); void onClick(QMUIDialog dialog, EditText editText);
} }
...@@ -175,7 +186,7 @@ public class DialogFactory { ...@@ -175,7 +186,7 @@ public class DialogFactory {
} }
public interface OnYesOrNoListener { public interface OnYesOrNoListener {
void onClick(Dialog dialog, boolean choice); void onClick(Dialog dialog, boolean isAgree);
} }
public static void dismiss(Dialog dialog) { public static void dismiss(Dialog dialog) {
......
...@@ -6,8 +6,10 @@ import android.app.Instrumentation; ...@@ -6,8 +6,10 @@ import android.app.Instrumentation;
import android.content.Context; import android.content.Context;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.BitmapFactory; import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.support.annotation.ColorRes;
import android.support.annotation.DrawableRes; import android.support.annotation.DrawableRes;
import android.support.annotation.IdRes; import android.support.annotation.IdRes;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
...@@ -16,6 +18,11 @@ import android.support.v4.content.ContextCompat; ...@@ -16,6 +18,11 @@ import android.support.v4.content.ContextCompat;
import android.support.v7.widget.DefaultItemAnimator; import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView;
import android.text.SpannableString;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.TextUtils;
import android.text.style.ForegroundColorSpan;
import android.util.DisplayMetrics; import android.util.DisplayMetrics;
import android.view.KeyEvent; import android.view.KeyEvent;
import android.view.View; import android.view.View;
...@@ -23,6 +30,7 @@ import android.view.ViewGroup; ...@@ -23,6 +30,7 @@ import android.view.ViewGroup;
import android.view.WindowManager; import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager; import android.view.inputmethod.InputMethodManager;
import android.widget.EditText; import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import io.reactivex.Observable; import io.reactivex.Observable;
...@@ -70,13 +78,29 @@ public class UIHelper { ...@@ -70,13 +78,29 @@ public class UIHelper {
/** /**
* 按默认配置初始化RecylerView 并绑定Adapter * 按默认配置初始化RecylerView 并绑定Adapter
*/ */
public static void bindAdapter(Context context, RecyclerView recyclerView, RecyclerView.Adapter adapter) { public static void bindAdapter(RecyclerView recyclerView, RecyclerView.Adapter adapter) {
recyclerView.setLayoutManager(new LinearLayoutManager(context)); recyclerView.setLayoutManager(new LinearLayoutManager(recyclerView.getContext()));
recyclerView.setAdapter(adapter); recyclerView.setAdapter(adapter);
recyclerView.setItemAnimator(new DefaultItemAnimator()); recyclerView.setItemAnimator(new DefaultItemAnimator());
} }
public static boolean hasEmptyValue(View... views) {
for (View view : views) {
if (view instanceof TextView) {
if (TextUtils.isEmpty(((TextView) view).getText().toString())) {
return true;
}
} else if (view instanceof EditText) {
if (TextUtils.isEmpty(((EditText) view).getText().toString())) {
return true;
}
}
}
return false;
}
/** /**
* 显示Toast * 显示Toast
*/ */
...@@ -94,6 +118,73 @@ public class UIHelper { ...@@ -94,6 +118,73 @@ public class UIHelper {
/** /**
* 显示View
*/
public static void showViews(View view, View... views) {
view.setVisibility(View.VISIBLE);
for (View v : views) {
v.setVisibility(View.VISIBLE);
}
}
/**
* 隐藏View
*/
public static void hideViews(View view, View... views) {
view.setVisibility(View.GONE);
for (View v : views) {
v.setVisibility(View.GONE);
}
}
/**
* 设置View Selected 状态
*/
public static void unSelectedViews(View view, View... views) {
view.setSelected(false);
for (View v : views) {
v.setSelected(false);
}
}
public static void selectedViews(View view, View... views) {
view.setSelected(false);
for (View v : views) {
v.setSelected(false);
}
}
/**
* 字符串高亮显示部分文字
*
* @param textView 控件
* @param text 要高亮显示的文字(输入的关键词)
* @param highTexts 高亮文字
*/
public static void setTextHighLight(TextView textView, String text, int colorId, String... highTexts) {
SpannableStringBuilder builder = new SpannableStringBuilder(text);
// 遍历要显示的文字
for (String highText : highTexts) {
if (!TextUtils.isEmpty(highText) && text.contains(highText)) {
int index = text.indexOf(highText);
builder.setSpan(new ForegroundColorSpan(textView.getContext().getResources().getColor(colorId)), index, index + highText.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
}
}
// 设置控件
textView.setText(builder);
}
/**
* public void
*
* */
/**
* 打开软键盘 * 打开软键盘
* *
* @param mEditText 输入框 * @param mEditText 输入框
......
...@@ -33,15 +33,15 @@ public class LoadingDialog extends Dialog { ...@@ -33,15 +33,15 @@ public class LoadingDialog extends Dialog {
iconView.setImageResource(LibConfig.LOADING_ICON); iconView.setImageResource(LibConfig.LOADING_ICON);
mRotationAnimation = ObjectAnimator.ofFloat(rotationView, "rotation", 0, 360); mRotationAnimation = ObjectAnimator.ofFloat(rotationView, "rotation", 0, 360);
mRotationAnimation.setDuration(1000); mRotationAnimation.setDuration(1500);
mRotationAnimation.setRepeatCount(Animation.INFINITE); mRotationAnimation.setRepeatCount(Animation.INFINITE);
mScaleXAnimation = ObjectAnimator.ofFloat(rotationView, "scaleX", 1f, 1.5f, 1f); mScaleXAnimation = ObjectAnimator.ofFloat(rotationView, "scaleX", 1f, 1.5f, 1f);
mScaleXAnimation.setDuration(1000); mScaleXAnimation.setDuration(1500);
mScaleXAnimation.setRepeatCount(Animation.INFINITE); mScaleXAnimation.setRepeatCount(Animation.INFINITE);
mScaleYAnimation = ObjectAnimator.ofFloat(rotationView, "scaleY", 1f, 1.5f, 1f); mScaleYAnimation = ObjectAnimator.ofFloat(rotationView, "scaleY", 1f, 1.5f, 1f);
mScaleYAnimation.setDuration(1000); mScaleYAnimation.setDuration(1500);
mScaleYAnimation.setRepeatCount(Animation.INFINITE); mScaleYAnimation.setRepeatCount(Animation.INFINITE);
} }
......
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@anim/decelerate_factor_interpolator">
<translate
android:duration="@integer/qmui_anim_duration"
android:fromXDelta="-40%p"
android:toXDelta="0%p" />
<alpha
android:duration="@integer/qmui_anim_duration"
android:fromAlpha="0.85"
android:toAlpha="1" />
</set>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@anim/decelerate_factor_interpolator">
<translate
android:duration="@integer/qmui_anim_duration"
android:fromXDelta="100%p"
android:toXDelta="0%p"/>
</set>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@anim/decelerate_low_factor_interpolator">
<translate
android:duration="@integer/qmui_anim_duration"
android:fromXDelta="0%p"
android:toXDelta="-100%p" />
<alpha
android:duration="@integer/qmui_anim_duration"
android:fromAlpha="1"
android:toAlpha="0.85" />
</set>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@anim/decelerate_factor_interpolator">
<translate
android:duration="@integer/qmui_anim_duration"
android:fromXDelta="0%p"
android:toXDelta="100%p"/>
</set>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportHeight="108"
android:viewportWidth="108">
<path
android:fillColor="#26A69A"
android:pathData="M0,0h108v108h-108z" />
<path
android:fillColor="#00000000"
android:pathData="M9,0L9,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M19,0L19,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M29,0L29,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M39,0L39,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M49,0L49,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M59,0L59,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M69,0L69,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M79,0L79,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M89,0L89,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M99,0L99,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,9L108,9"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,19L108,19"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,29L108,29"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,39L108,39"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,49L108,49"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,59L108,59"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,69L108,69"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,79L108,79"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,89L108,89"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,99L108,99"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M19,29L89,29"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M19,39L89,39"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M19,49L89,49"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M19,59L89,59"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M19,69L89,69"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M19,79L89,79"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M29,19L29,89"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M39,19L39,89"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M49,19L49,89"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M59,19L59,89"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M69,19L69,89"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M79,19L79,89"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
</vector>
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:color="@color/qmui_config_color_gray_9"
tools:ignore="NewApi">
<item android:drawable="@color/white" />
</ripple>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<FrameLayout
android:id="@+id/activity_area_frgmentLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/root_drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:id="@+id/root_content"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<FrameLayout
android:id="@+id/root_drawer"
android:layout_width="@dimen/x_600"
android:layout_height="match_parent"
android:layout_gravity="left" />
</android.support.v4.widget.DrawerLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/activity_base_layout" android:id="@+id/root_layout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:orientation="vertical"> android:orientation="vertical">
......
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
<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_90"
android:layout_height="@dimen/x_150" android:layout_height="@dimen/x_90"
android:layout_centerInParent="true" /> android:layout_centerInParent="true" />
</RelativeLayout> </RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.v7.widget.RecyclerView
android:id="@+id/fragment_region_rv"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/item_of_regions_regionName_tv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center_horizontal"
android:background="?android:attr/selectableItemBackground"
android:padding="@dimen/x_30"
android:text="region"
android:textColor="@color/colorBlack" />
<TextView
android:layout_width="match_parent"
android:layout_height="@dimen/x_2"
android:background="@color/big_rec_line_color" />
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name="login">Login</string> <string name="login">Login</string>
<string name="textview_personal_info_province_of_residence">Residence province</string>
<string name="textview_personal_info_city_of_residence">Residence city</string>
<string name="textview_personal_info_street_of_residence">Residence street</string>
<string name="textview_personal_info_area_of_residence">Residence area</string>
</resources> </resources>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="login">Login</string>
</resources>
\ No newline at end of file
...@@ -4,4 +4,9 @@ ...@@ -4,4 +4,9 @@
<string name="text_net_error">无网络连接</string> <string name="text_net_error">无网络连接</string>
<string name="need_camera_permission">身份认证需要您的摄像头权限来拍摄和存储证件照片!</string> <string name="need_camera_permission">身份认证需要您的摄像头权限来拍摄和存储证件照片!</string>
<string name="need_open_camera_permission">身份认证需要您的摄像头权限来拍摄和存储证件照片!请前往权限中心开启权限</string> <string name="need_open_camera_permission">身份认证需要您的摄像头权限来拍摄和存储证件照片!请前往权限中心开启权限</string>
<string name="textview_personal_info_province_of_residence">省份</string>
<string name="textview_personal_info_city_of_residence">城市</string>
<string name="textview_personal_info_street_of_residence">街道</string>
<string name="textview_personal_info_area_of_residence">村镇</string>
</resources> </resources>
\ No newline at end of file
...@@ -6,9 +6,16 @@ ...@@ -6,9 +6,16 @@
<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>
<string name="days">Hari</string> <string name="days">Hari</string>
<string name="recording">Recording...</string> <string name="recording">Recording...</string>
<string name="textview_personal_info_province_of_residence">Provinsi Hunian</string>
<string name="textview_personal_info_city_of_residence">Kota Hunian</string>
<string name="textview_personal_info_street_of_residence">Kecamatan Hunian</string>
<string name="textview_personal_info_area_of_residence">Kelurahan Hunian</string>
</resources> </resources>
<resources> <resources>
<style name="style_bg_transparent_dialog" parent="Base.Theme.AppCompat.Light.Dialog"> <style name="style_bg_transparent_dialog" parent="Base.Theme.AppCompat.Light.Dialog">
<item name="android:windowBackground">@android:color/transparent</item> <item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowIsTranslucent">true</item> <item name="android:windowIsTranslucent">true</item>
</style> </style>
<style name="QMTheme" parent="QMUI.Compat.NoActionBar"> <style name="QMTheme" parent="QMUI.Compat.NoActionBar">
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowIsTranslucent">true</item>
<!-- toolbar(actionbar)颜色 --> <!-- toolbar(actionbar)颜色 -->
<item name="colorPrimary">@color/toolbar_background</item> <item name="colorPrimary">@color/toolbar_background</item>
<!-- 状态栏颜色 --> <!-- 状态栏颜色 -->
<item name="colorPrimaryDark">@color/toolbar_background</item> <item name="colorPrimaryDark">@color/toolbar_background</item>
<!-- 窗口的背景颜色 --> <!-- 窗口的背景颜色 -->
<item name="android:windowBackground">@color/white</item>
<!-- 配置Android提供的theme --> <!-- 配置Android提供的theme -->
<item name="android:textAppearanceListItemSmall">@style/QDTextAppearanceListItemSmall</item> <item name="android:textAppearanceListItemSmall">@style/QDTextAppearanceListItemSmall</item>
<item name="android:textAppearanceListItem">@style/QDtextAppearanceListItem</item> <item name="android:textAppearanceListItem">@style/QDtextAppearanceListItem</item>
...@@ -47,5 +48,4 @@ ...@@ -47,5 +48,4 @@
<item name="qmui_topbar_subtitle_color">@color/white</item> <item name="qmui_topbar_subtitle_color">@color/white</item>
<item name="qmui_topbar_text_btn_color_state_list">@color/white</item> <item name="qmui_topbar_text_btn_color_state_list">@color/white</item>
</style> </style>
</resources> </resources>
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