Commit 96b2a825 by sikang

UPDATE

parent 2be48adc
......@@ -92,9 +92,24 @@
<meta-data
android:name="com.facebook.accountkit.ClientToken"
android:value="@string/ACCOUNT_KIT_CLIENT_TOKEN" />
<activity
android:name="com.facebook.accountkit.ui.AccountKitActivity"
android:screenOrientation="portrait" />
<!--地区选择-->
<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>
......
package tech.starwin.base;
import android.app.Activity;
import android.os.Bundle;
import android.support.annotation.CheckResult;
import android.support.annotation.IdRes;
import android.support.annotation.LayoutRes;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.RelativeLayout;
import com.google.firebase.messaging.RemoteMessage;
import com.qmuiteam.qmui.widget.QMUITopBar;
......@@ -25,6 +31,7 @@ import tech.starwin.LibConfig;
import tech.starwin.R;
import tech.starwin.service.MsgHandleService;
import tech.starwin.mvp.IView;
import tech.starwin.utils.LogUtils;
import tech.starwin.utils.PresenterHoler;
import tech.starwin.utils.context_utils.FragmentLauncher;
import tech.starwin.widget.ProgressDialog;
......@@ -50,10 +57,18 @@ public abstract class BaseActivity extends AppCompatActivity implements IView {
private PresenterHoler presenterHelper;
/**
* 侧滑抽屉
*/
private DrawerLayout drawerLayout;
/**
* loading、error 提示
*/
protected ProgressDialog progressDialog;
private FragmentLauncher fragmentLauncher;
private Object unBinder;
private final BehaviorSubject<ActivityEvent> lifecycleSubject = BehaviorSubject.create();
......@@ -65,8 +80,8 @@ public abstract class BaseActivity extends AppCompatActivity implements IView {
lifecycleSubject.onNext(ActivityEvent.CREATE);
progressDialog = new ProgressDialog(this);
presenterHelper = new PresenterHoler(this);
//初始化根布局
initRootLayout();
}
@Override
......@@ -77,7 +92,7 @@ public abstract class BaseActivity extends AppCompatActivity implements IView {
String from = getIntent().getStringExtra("from");
if (action.equals("android.intent.action.MAIN") &&
!TextUtils.isEmpty(from)) {
MsgHandleService.handleMsg(this,new RemoteMessage(getIntent().getExtras()));
MsgHandleService.handleMsg(this, new RemoteMessage(getIntent().getExtras()));
}
lifecycleSubject.onNext(ActivityEvent.START);
}
......@@ -153,10 +168,9 @@ public abstract class BaseActivity extends AppCompatActivity implements IView {
//----------------------------------- Layout ----------------------------------------
private void initRootLayout() {
setContentView(R.layout.base_activity_root);
rootLayout = findViewById(R.id.activity_base_layout);
rootLayout = findViewById(R.id.root_layout);
//判断是否要显示TopBar
if (useTopBar()) {
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 {
}
//填充Activity -> bindLayout();
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);
initView();
} else {
......@@ -192,6 +216,13 @@ public abstract class BaseActivity extends AppCompatActivity implements IView {
}
/**
* 是否使用侧滑
*/
public int bindDrawerLayout() {
return 0;
}
/**
* 初始化TopBar,需要自定义TopBar样式时重写
* 默认TopBar只包含一个BackButton 和 Titile
*/
......@@ -204,8 +235,34 @@ public abstract class BaseActivity extends AppCompatActivity implements IView {
});
}
@IdRes
public int bindFragmentLayout() {
return 0;
}
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 ----------------------------------------
......@@ -222,17 +279,33 @@ public abstract class BaseActivity extends AppCompatActivity implements IView {
/**
* 打开一个Fragment
*/
public void startFragment(Fragment fragment, boolean isAddToBackStack) {
if (getFragmentLauncher() != null)
getFragmentLauncher().startFragment(fragment, isAddToBackStack);
public void startFragment(Fragment fragment, boolean isOpenAnime) {
if (getFragmentLauncher() != null) {
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
*/
public void startFragmentAndDestroyCurrent(final Fragment fragment) {
if (getFragmentLauncher() != null)
getFragmentLauncher().startFragmentAndDestroyCurrent(fragment);
public void startFragmentAndDestroyCurrent(final Fragment fragment, boolean isOpenAnime) {
if (getFragmentLauncher() != null) {
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;
*/
public abstract class BaseFragment extends Fragment implements IView {
protected String TAG;
protected ViewGroup mContentView;
private ViewGroup mContentView;
/**
* TopBar
......@@ -54,31 +54,50 @@ public abstract class BaseFragment extends Fragment implements IView {
Object unBinder;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TAG = getClass().getName();
lifecycleSubject.onNext(ActivityEvent.CREATE);
presenterHelper = new PresenterHoler(this);
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);
if (mTopBar != null)
initTopBar(mTopBar);
}
@Nullable
@Override
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;
}
public ViewGroup getContentView() {
return mContentView;
}
@LayoutRes
public abstract int bindLayout();
public abstract void initView();
/**
* 初始化入口
*/
public abstract void initView(ViewGroup contentView);
/**
* 是否使用TopBar,默认不使用
......@@ -179,14 +198,14 @@ public abstract class BaseFragment extends Fragment implements IView {
return presenterHelper.getPresenter(clz);
}
public void startFragment(Fragment fragment) {
public void startFragment(Fragment fragment, boolean isOpenAnime) {
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)
((BaseActivity) getActivity()).startFragmentAndDestroyCurrent(fragment);
((BaseActivity) getActivity()).startFragmentAndDestroyCurrent(fragment, isOpenAnime);
}
}
......@@ -7,12 +7,14 @@ import io.reactivex.Observable;
import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.functions.Consumer;
import io.reactivex.functions.Function;
import io.reactivex.schedulers.Schedulers;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import tech.starwin.impl.HttpObserver;
import tech.starwin.mvp.IView;
import tech.starwin.mvp.api.UploadApi;
import tech.starwin.network.ServiceGenerator;
/**
......@@ -47,18 +49,15 @@ public class BasePresenter<T> {
.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())
.observeOn(AndroidSchedulers.mainThread())
.compose(view.<T>bindToLifecycle())
.subscribe(new HttpObserver<T>() {
@Override
public void onStart() {
view.onHttpStart(action, isShowLoading);
view.onHttpStart(action, true);
}
@Override
......@@ -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")
private void bindLifecycle(Consumer consumer) {
Observable.just(true)
......@@ -113,6 +133,11 @@ public class BasePresenter<T> {
}
public <T> T getService(Class<T> tClass) {
return ServiceGenerator.getService(tClass);
}
public void onDestory() {
view = null;
apiService = null;
......
......@@ -26,13 +26,13 @@ public abstract class BaseRecyclerAdapter<T> extends RecyclerView.Adapter<Recycl
@Override
public RecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = null;
if (setItemLayout() instanceof Integer) {
view = LayoutInflater.from(context).inflate((Integer) setItemLayout(), parent, false);
} else if (setItemLayout() instanceof View) {
view = (View) setItemLayout();
if (bindItemLayout() instanceof Integer) {
view = LayoutInflater.from(context).inflate((Integer) bindItemLayout(), parent, false);
} else if (bindItemLayout() instanceof View) {
view = (View) bindItemLayout();
}
if (view == null) {
throw new RuntimeException("setItemLayout() invalid");
throw new RuntimeException("bindItemLayout() invalid");
}
final RecyclerViewHolder holder = new RecyclerViewHolder(view);
......@@ -70,7 +70,7 @@ public abstract class BaseRecyclerAdapter<T> extends RecyclerView.Adapter<Recycl
/**
* item布局
*/
public abstract Object setItemLayout();
public abstract Object bindItemLayout();
/**
* item更新
......@@ -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;
}
public void setOnItemLongClickListener(OnItemLongClickListener listener) {
public void setOnItemLongClickListener(OnItemLongClickListener<T> listener) {
mLongClickListener = listener;
}
......
package tech.starwin.impl;
import com.google.gson.Gson;
import io.reactivex.Observer;
import io.reactivex.disposables.Disposable;
import retrofit2.HttpException;
import tech.starwin.R;
import tech.starwin.LibConfig;
import tech.starwin.mvp.beans.ResponseErrorBody;
import tech.starwin.network.Error;
import tech.starwin.utils.LoginManager;
......@@ -32,6 +35,7 @@ public abstract class HttpObserver<T> implements Observer<T> {
@Override
public void onNext(T tResult) {
onFinish();
onSuccess(tResult);
}
......@@ -44,13 +48,17 @@ public abstract class HttpObserver<T> implements Observer<T> {
if (isHttpError(msg)) {
onError(Error.HTTP_ERROR, LibConfig.getContext().getString(R.string.text_net_error));
} else if (throwable instanceof HttpException) {
if (!isCanHandle((HttpException) throwable)) {
onError(Error.SERVER_ERROR, msg);
HttpException exception = (HttpException) throwable;
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")) {
onError(Error.APP_ERROR, LibConfig.getContext().getString(R.string.text_app_error));
} else if (msg.contains("body is null")) {
onSuccess(null);
} else {
onError(Error.UNKNOW, msg);
}
}
......@@ -63,7 +71,6 @@ public abstract class HttpObserver<T> implements Observer<T> {
@Override
public void onComplete() {
onFinish();
if (disposable != null)
disposable.dispose();
}
......
......@@ -5,7 +5,6 @@ import android.view.View;
/**
* Created by SiKang on 2018/9/18.
* 防抖 ClickListener
*
*/
public abstract class OnNoShakeClickListener extends OnEventClickListener {
......@@ -19,7 +18,7 @@ public abstract class OnNoShakeClickListener extends OnEventClickListener {
}
@Override
public void onClick(final View v) {
public final void onClick(final View v) {
super.onClick(v);
v.setClickable(false);
v.postDelayed(new Runnable() {
......@@ -31,8 +30,4 @@ public abstract class OnNoShakeClickListener extends OnEventClickListener {
onEventClick(v);
}
@Override
public void onEventClick(View v) {
}
}
package tech.starwin.mvp.api;
import android.support.annotation.NonNull;
import java.util.ArrayList;
import java.util.List;
import io.reactivex.Observable;
......@@ -9,12 +12,16 @@ import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.Header;
import retrofit2.http.POST;
import retrofit2.http.PUT;
import retrofit2.http.Path;
import retrofit2.http.Query;
import tech.starwin.mvp.beans.BankBean;
import tech.starwin.mvp.beans.DepositMethodsBean;
import tech.starwin.mvp.beans.DepositResponseBean;
import tech.starwin.mvp.beans.HistoryLoanAppInfoBean;
import tech.starwin.mvp.beans.LatestLoanAppBean;
import tech.starwin.mvp.beans.LoanRange;
import tech.starwin.mvp.beans.ProductBean;
import tech.starwin.mvp.beans.ProgressBean;
import tech.starwin.mvp.beans.ResponseErrorBody;
......@@ -39,8 +46,13 @@ public interface LoanApi {
* 贷款进度
*/
@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 {
@GET("loanapp/latest/v2")
Observable<LatestLoanAppBean> getLatestLoanApp(@Header("X-AUTH-TOKEN") String token);
/**
* 取消贷款
*/
......@@ -79,7 +90,7 @@ public interface LoanApi {
* @param amout 还款金额
*/
@POST("loanapp/deposit")
Observable<DepositResponseBean> doDeposit(@Query("loanAppId") String loanAppId,
Observable<DepositResponseBean> getRepayOrder(@Query("loanAppId") String loanAppId,
@Query("currency") String currency,
@Query("depositMethod") String method,
@Query("amount") double amout,
......@@ -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;
import io.reactivex.Observable;
import okhttp3.MultipartBody;
import okhttp3.ResponseBody;
......@@ -21,6 +20,10 @@ import tech.starwin.mvp.beans.RecordFilesResponse;
* 涉及上传的API
*/
public interface UploadApi {
enum UploadType {
EMPLOYMENT_PHOTO,
}
/**
* 上传照片
*
......@@ -30,7 +33,7 @@ public interface UploadApi {
*/
@Multipart
@PUT("record/files")
Call<ResponseBody> uploadPhoto(
Observable<ResponseBody> uploadPhoto(
@Part MultipartBody.Part photoFile,
@Query("fileType") String fileType,
@Header("X-AUTH-TOKEN") String token
......@@ -45,33 +48,21 @@ public interface UploadApi {
@Header("X-AUTH-TOKEN") String token);
@GET("record/files")
Observable<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);
Call<RecordFilesResponse> recordFiles(@Header("X-AUTH-TOKEN") String token);
@Multipart
/*@PUT("/loanapp/verify/face") face++*/
@PUT("/loanapp/verify/yitu")
Observable<BasicAck> faceVerify(@Query("loanType") String loanType,
@Query("amount") double amount,
@Query("period") int period,
@Query("periodUnit") String periodUnit,
@Part MultipartBody.Part imageBest,
@Part MultipartBody.Part imageEnv,
@Part MultipartBody.Part delta,
@Query("imei") String imei,
@Query("productId") long productId,
@Header("X-AUTH-TOKEN") String token);
Call<BasicAck> faceVerify(@Query("loanType") String loanType,
@Query("amount") double amount,
@Query("period") int period,
@Query("periodUnit") String periodUnit,
@Part MultipartBody.Part imageBest,
@Part MultipartBody.Part imageEnv,
@Part MultipartBody.Part delta,
@Query("imei") String imei,
@Query("productId") long productId,
@Header("X-AUTH-TOKEN") String token);
/**
......@@ -79,5 +70,5 @@ public interface UploadApi {
*/
@Multipart
@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;
import tech.starwin.mvp.beans.SysDictBean;
import tech.starwin.mvp.beans.TokenInfoBean;
import tech.starwin.mvp.beans.UserBankInfo;
import tech.starwin.mvp.beans.UserBean;
import tech.starwin.mvp.beans.YWUser;
/**
......@@ -89,12 +90,18 @@ public interface UserApi {
Observable<RecordFilesResponse> getKtpImg(@Header("X-AUTH-TOKEN") String token);
/**
* 获取个人信息
* 获取认证信息
*/
@GET("record/personalinfo")
Observable<PersonalInfoServerBean> getPersonalInfo(@Header("X-AUTH-TOKEN") String token);
/**
* 用户信息
*/
@GET("info/infocenter")
Observable<UserBean> getUserInfo(@Header("X-AUTH-TOKEN") String token);
/**
* 学历列表
*/
@GET("sysdict/{type}")
......@@ -257,23 +264,24 @@ public interface UserApi {
Observable<ArrayList<ActivityInfoBean>> getActivityList();
/**
*
* */
* 贷款详情
*/
@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")
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")
Observable<UserBankInfo> getBankCardInfo(@Header("X-AUTH-TOKEN") String token);
......@@ -281,31 +289,6 @@ public interface UserApi {
@GET("banner")
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")
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 {
private String companyProvince;
private String profession;
private String salary;
private String workCardUrl;
public String getCompanyAddress() {
return companyAddress;
......@@ -103,4 +104,11 @@ public class EmploymentServerBean implements Serializable {
this.salary = salary;
}
public String getWorkCardUrl() {
return workCardUrl;
}
public void setWorkCardUrl(String workCardUrl) {
this.workCardUrl = workCardUrl;
}
}
......@@ -8,7 +8,6 @@ import java.io.Serializable;
public class LatestLoanAppBean extends LoanAppBeanFather implements Serializable {
/**
* amount ; 0
* bankCode ; BCA
......@@ -42,4 +41,31 @@ public class LatestLoanAppBean extends LoanAppBeanFather implements Serializable
public static final String REJECTED = "REJECTED";//贷款被拒绝
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 {
private String loanAppId;
private double paidAmount;
private String status;
private long productId;
public long getProductId() {
return productId;
}
public void setProductId(long productId) {
this.productId = productId;
}
public double getServiceFeeAccr() {
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 {
private String fullName;
private String credentialNo;
private String gender;
private RegionBean.RegionsBean province;
private RegionBean.RegionsBean city;
private RegionBean.RegionsBean district;
private RegionBean.RegionsBean area;
private String province;
private String city;
private String district;
private String area;
private String address;
private String lastEducation;
private String maritalStatus;
......@@ -64,16 +64,12 @@ public class PersonalInfoBean implements Serializable {
public PersonalInfoBean() {
}
public PersonalInfoBean(PersonalInfoServerBean personalInfoServerBean){
public PersonalInfoBean(PersonalInfoServerBean personalInfoServerBean) {
province = new RegionBean.RegionsBean();
province.setName(personalInfoServerBean.getProvince());
city = new RegionBean.RegionsBean();
city.setName(personalInfoServerBean.getCity());
district = new RegionBean.RegionsBean();
district.setName(personalInfoServerBean.getDistrict());
area = new RegionBean.RegionsBean();
area.setName(personalInfoServerBean.getArea());
province = personalInfoServerBean.getProvince();
city = personalInfoServerBean.getCity();
district = personalInfoServerBean.getDistrict();
area = personalInfoServerBean.getArea();
this.setFamilyNameInLaw(personalInfoServerBean.getFamilyNameInLaw());
this.setFullName(personalInfoServerBean.getFullName());
this.setCredentialNo(personalInfoServerBean.getCredentialNo());
......@@ -86,6 +82,7 @@ public class PersonalInfoBean implements Serializable {
this.setResidenceDuration(personalInfoServerBean.getResidenceDuration());
}
public String getFullName() {
return fullName;
}
......@@ -110,22 +107,62 @@ public class PersonalInfoBean implements Serializable {
this.gender = gender;
}
public RegionBean.RegionsBean getProvince() {
public String getProvince() {
return province;
}
public void setProvince(RegionBean.RegionsBean province) {
public void setProvince(String 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;
}
public String getArea() {
return area;
}
public void setArea(String area) {
this.area = area;
}
public String getAddress() {
return address;
}
public void setAddress(String 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) {
this.lastEducation = lastEducation;
......
......@@ -41,6 +41,14 @@ public class PersonalInfoServerBean implements Serializable {
private String residenceDuration;
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
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 {
this.regions = regions;
}
public static class RegionsBean {
public static class RegionsBean implements Serializable{
/**
* id : 88021
* level : city
......
......@@ -7,10 +7,6 @@ import java.io.Serializable;
*/
public class TokenInfoBean implements Serializable {
/**
* token : eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxNTAyNjU2MTM4NyIsImV4cCI6MTQ4ODE5NTc3MX0.HBjRY3XZxgr2fdnCpGt3zjClWAz-gyLYC7kSZAm7WT6yp3klllVEwmyDdAMJSQZp5VDh1D0mJOdtm3ainjOfBQ
* tokenInvalid : eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxNTAyNjU2MTM4NyIsImV4cCI6MTQ4ODgwMDU3MX0.Rz5kr57TD82LAkr7b1ALKjcDVgboO6G29KjjiuyFQ7EkuTsmYoZI4iJ4PR0dv7kkSW6U2JCGcBt_S_8i4TE_ow
*/
private String token;
private String refreshToken;
......
......@@ -11,10 +11,12 @@ package tech.starwin.mvp.beans;
public class TotalAmount {
private double amount = 600000;
private int day = 7;
private double rate = 1;
private int day = 7;
private double rate = 1;
private double totalRepayment;
private String periodUnit;
private int productId;
public void setRate(double rate) {
this.rate = rate;
}
......@@ -32,8 +34,6 @@ public class TotalAmount {
}
public double getAmount() {
return amount;
}
......@@ -62,5 +62,12 @@ public class TotalAmount {
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;
* Created by SiKang on 2018/9/30.
*/
public class UserBankInfo implements Serializable {
private String bankCode;
private String branch;
private String cardNo;
private String city;
private String createTime;
private String bankCode = "";
private String branch = "";
private String cardNo = "";
private String city = "";
private String createTime = "";
private int customerId;
private int id;
private int loanAppId;
private String updateTime;
private String verifyAccountHolderName;
private String verifyStatus;
private String province;
private String updateTime = "";
private String verifyAccountHolderName = "";
private String verifyStatus = "";
private String province = "";
public String getBankCode() {
return bankCode;
......
package tech.starwin.mvp.beans;
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 int user_id;
public String user_name;
public int user_age;
public String user_sex;
private int availableCouponCount;
private List<ActivityInfoBean> banner;
private int inviteeCount;
private String name;
private YWUser chatAccount;
public UserBean(int user_id, String user_name) {
this.user_id = user_id;
this.user_name = user_name;
public int getAvailableCouponCount() {
return availableCouponCount;
}
@Override
public String toString() {
return "user_id : " + user_id + ",user_name : " + user_name + ",user_age : " + user_age + "\n";
public void setAvailableCouponCount(int availableCouponCount) {
this.availableCouponCount = availableCouponCount;
}
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;
import android.text.TextUtils;
import tech.starwin.base.BasePresenter;
import tech.starwin.mvp.api.LoanApi;
import tech.starwin.mvp.beans.LatestLoanAppBean;
import tech.starwin.utils.LoginManager;
/**
......@@ -30,8 +33,8 @@ public class LoanPresenter extends BasePresenter<LoanApi> {
/**
* 获取贷款进度
*/
public void getLoanProgress(String action) {
handleRequest(action, apiService.getLoanProgress(LoginManager.get().getToken()));
public void getCertifyProgress(String action) {
handleRequest(action, apiService.getCertifyProgress(LoginManager.get().getToken()));
}
......@@ -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;
import android.annotation.SuppressLint;
import android.content.Context;
import android.support.annotation.NonNull;
import com.google.gson.Gson;
......@@ -12,10 +13,15 @@ import okhttp3.ResponseBody;
import tech.starwin.base.BasePresenter;
import tech.starwin.impl.HttpObserver;
import tech.starwin.mvp.api.UploadApi;
import tech.starwin.mvp.beans.BasicAck;
import tech.starwin.mvp.beans.EmploymentBean;
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.MultipartBodyMaker;
import tech.starwin.utils.PreferencesManager;
/**
* Created by SiKang on 2018/9/25.
......@@ -30,31 +36,32 @@ public class UploadPresenter extends BasePresenter<UploadApi> {
* 身份证ocr识别
*/
public void identityOcr(final String action, @NonNull File file) {
handleRequest(apiService.identityOcr(MultipartBodyMaker.makeSimplePart("file", file), LoginManager.get().getToken()), new HttpObserver<OcrResultBean>() {
@Override
public void onStart() {
view.onHttpStart(action, true);
}
@Override
public void onSuccess(OcrResultBean data) {
OcrResultBean.KTP ktp = new Gson().fromJson(data.getData(), OcrResultBean.KTP.class);
if (ktp.getResult().equals("PASS"))
view.onHttpSuccess(action, ktp);
else
view.onHttpError(action, ktp.getMessage());
}
@Override
public void onError(int code, String msg) {
view.onHttpError(action, msg);
}
@Override
public void onFinish() {
view.onHttpFinish(action);
}
});
handleRequest(apiService.identityOcr(MultipartBodyMaker.makeSimplePart("file", file), LoginManager.get().getToken()),
new HttpObserver<OcrResultBean>() {
@Override
public void onStart() {
view.onHttpStart(action, true);
}
@Override
public void onSuccess(OcrResultBean data) {
OcrResultBean.KTP ktp = new Gson().fromJson(data.getData(), OcrResultBean.KTP.class);
if (ktp.getResult().equals("PASS"))
view.onHttpSuccess(action, ktp);
else
view.onHttpError(action, ktp.getMessage());
}
@Override
public void onError(int code, String msg) {
view.onHttpError(action, msg);
}
@Override
public void onFinish() {
view.onHttpFinish(action);
}
});
}
/**
......@@ -62,16 +69,35 @@ public class UploadPresenter extends BasePresenter<UploadApi> {
*/
@SuppressLint("CheckResult")
public void uploadEmploymentImg(final String action, EmploymentBean employmentBean, @NonNull File file) {
handleRequest(apiService.uploadPhoto(MultipartBodyMaker.makeSimplePart("file", file), "EMPLOYMENT_PHOTO", LoginManager.get().getToken()),
new HttpObserver<ResponseBody>() {
handleRequest(action, apiService.uploadPhoto(MultipartBodyMaker.makeSimplePart("file", file), "EMPLOYMENT_PHOTO", LoginManager.get().getToken()));
}
/**
* 上传依图 截取得帧图片
*/
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
public void onStart() {
view.onHttpStart(action, true);
}
@Override
public void onSuccess(ResponseBody responseBody) {
view.onHttpSuccess(action, responseBody);
public void onSuccess(BasicAck data) {
view.onHttpSuccess(action, data);
}
@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 {
public static final int HTTP_ERROR = 1001;//链路错误
public static final int SERVER_ERROR = 1002;//Server响应数据错误
public static final int APP_ERROR = 1003;//程序异常
public static final int UNKNOW = 1004;//程序异常
}
......@@ -8,6 +8,7 @@ import java.util.List;
import tech.starwin.LibConfig;
import tech.starwin.mvp.beans.GatewayInfoBean;
import tech.starwin.utils.LogUtils;
import tech.starwin.utils.PreferencesManager;
/**
* Created by SiKang on 2018/9/28.
......@@ -33,6 +34,7 @@ public class Gateway {
*/
public static void notify(GatewayInfoBean info) {
gatewayInfo.notifyWith(info);
PreferencesManager.get().saveGatewayInfo(info);
}
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;
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是否无内容
*/
public static boolean isEmpty(List list) {
......@@ -146,34 +46,23 @@ public class GeneralUtils {
return false;
}
/**
* 获取时间戳 yyyyMMddHHmmss
* 是否有空值
*/
public static String getTimeYMDHMS() {
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return formatter.format(new Date());
}
/**
* 获取时间戳 yyyyMMdd
*/
public static String getTimeYMD() {
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
return formatter.format(new Date());
}
public static boolean hasEmpty(String value, String... values) {
if (TextUtils.isEmpty(value)) {
return true;
} else {
for (String str : values) {
if (TextUtils.isEmpty(str)) {
return true;
}
}
}
/**
* String转base64
*/
public static String base64(byte[] bytes) {
if (bytes != null && bytes.length > 0)
return Base64.encodeToString(bytes, Base64.DEFAULT);
else
return "";
return false;
}
/**
* 获取应用程序名称
*/
......@@ -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
*/
@SuppressLint("HardwareIds")
......
......@@ -5,6 +5,7 @@ import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.support.v4.app.FragmentActivity;
import android.text.TextUtils;
import com.facebook.accountkit.AccountKitError;
import com.facebook.accountkit.AccountKitLoginResult;
......@@ -16,8 +17,9 @@ import java.util.List;
import tech.starwin.LibConfig;
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.IntentHolder;
import tech.starwin.utils.context_utils.ActivityJumper;
/**
* Created by SiKang on 2018/9/19.
......@@ -27,6 +29,7 @@ public class LoginManager {
public static final String TAG = "LoginManager";
private static LoginManager loginManager;
private TokenInfoBean tokenInfo;
private UserBean userInfo;
private LoginManager() {
}
......@@ -51,7 +54,7 @@ public class LoginManager {
tokenInfo = null;
//跳转登录界面
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();
} else {
LogUtils.e(TAG, "找不到LoginActivity,请在build.gradle中配置正确的 ‘LOGIN_ACTIVITY_ACTION’ ");
......@@ -112,6 +115,17 @@ public class LoginManager {
}
/**
* 获取用户信息
*/
public UserBean getUserInfo() {
if (userInfo == null) {
userInfo = PreferencesManager.get().getUserInfo();
}
return userInfo;
}
/**
* 退出登录
*/
public void logout() {
......
......@@ -27,7 +27,7 @@ public class MultipartBodyMaker {
}
/**
* 创建一个只包含一个参数的 MultipartBody.Part
* 创建一个只包含一个文件的 MultipartBody.Part
*/
public static MultipartBody.Part makeSimplePart(String name, File file) {
MediaType mediaType = MediaType.parse(FileUtils.getMimeType(file));
......@@ -35,6 +35,10 @@ public class MultipartBodyMaker {
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 {
MultipartBody.Builder builder;
......
......@@ -8,7 +8,8 @@ import android.text.TextUtils;
import java.util.Map;
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.UserBean;
......@@ -51,7 +52,7 @@ public class PreferencesManager {
* 保存登录信息
*/
public void saveTokenInfo(TokenInfoBean tokenInfoBean) {
saveData("token_info", GeneralUtils.fromBean(tokenInfoBean));
saveData("token_info", DataFormat.fromBean(tokenInfoBean));
}
/**
......@@ -59,52 +60,57 @@ public class PreferencesManager {
*/
public TokenInfoBean getTokenInfo() {
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) {
saveData("user_info", GeneralUtils.fromBean(userBean));
public void saveUserInfo(UserBean userInfo) {
saveData("user_info", DataFormat.fromBean(userInfo));
}
/**
* 获取用户登录信息
* 获取用户信息
*/
public UserBean getUserInfo() {
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) {
saveData("personal_info", GeneralUtils.fromBean(personalInfo));
public void saveGatewayInfo(GatewayInfoBean gatewayInfo) {
saveData("gateway_info", DataFormat.fromBean(gatewayInfo));
}
/**
* 获取用户的个人认证信息
* 获取Gateway信息
*/
public PersonalInfo getPersonalInfo() {
String objStr = getString("personal_info", "");
return TextUtils.isEmpty(objStr) ? null : (PersonalInfo) GeneralUtils.toBean(objStr);
public GatewayInfoBean getGatewayInfo() {
String objStr = getString("gateway_info", "");
return TextUtils.isEmpty(objStr) ? null : (GatewayInfoBean) DataFormat.toBean(objStr);
}
/**
* 保存Gateway信息
* 保存活体识别截图
*/
public void saveGatewayInfo(GatewayInfoBean gatewayInfo) {
saveData("gateway_info", GeneralUtils.fromBean(gatewayInfo));
public void saveVerificationData(byte[] data) {
if (data == null) {
saveData("verification_data", "");
} else {
saveData("verification_data", DataFormat.base64(data));
}
}
/**
* 获取Gateway信息
* 获取活体识别截图
*/
public GatewayInfoBean getGatewayInfo() {
String objStr = getString("gateway_info", "");
return TextUtils.isEmpty(objStr) ? null : (GatewayInfoBean) GeneralUtils.toBean(objStr);
public String getVerificationData() {
return getString("verification_data", null);
}
/**
......
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;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import java.io.Serializable;
......@@ -13,14 +14,14 @@ import tech.starwin.R;
* Created by SiKang on 2018/9/16.
* Intent的创建和使用
*/
public class IntentHolder {
public class ActivityJumper {
private Intent intent;
/**
* 发起跳转的Context
*/
private Context context;
private IntentHolder(Context from, Intent intent) {
private ActivityJumper(Context from, Intent intent) {
this.intent = intent;
this.context = from;
}
......@@ -52,12 +53,22 @@ public class IntentHolder {
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 {
private Intent intent;
private Context fromContext;
public Builder() {
intent = new Intent();
}
public <C extends Activity> Builder(Context from, Class<C> target) {
......@@ -100,8 +111,8 @@ public class IntentHolder {
return this;
}
public IntentHolder build() {
return new IntentHolder(fromContext, intent);
public ActivityJumper build() {
return new ActivityJumper(fromContext, intent);
}
public Intent toIntent() {
......
package tech.starwin.utils.context_utils;
import android.os.Bundle;
import android.support.annotation.IdRes;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
......@@ -9,7 +10,6 @@ import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;
import tech.starwin.R;
import tech.starwin.utils.GeneralUtils;
......@@ -37,27 +37,46 @@ public class FragmentLauncher {
private Map<String, Fragment> framentSet;
public Fragment getCurrentFragment() {
return currentFragment;
}
public FragmentLauncher(FragmentActivity activity, @IdRes int fragmentLayout) {
this.activity = activity;
this.fragmentLayout = fragmentLayout;
framentSet = new HashMap<>();
}
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) {
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
*/
private <T extends Fragment> T changeFragment(Class<T> clz, boolean isDestory) {
if (framentSet == null)
framentSet = new HashMap<>();
private <T extends Fragment> T changeFragment(Class<T> clz, OnFragmentCreateListener<T> listener, Bundle arguments, boolean isDestory) {
T fragment = null;
String className = clz.getName();
//如果Fragment已被创建,且当前为显示状态,则无需改动
......@@ -73,6 +92,7 @@ public class FragmentLauncher {
if (currentFragment != null) {
if (isDestory) {
transaction.remove(currentFragment);
framentSet.remove(currentFragment);
} else {
transaction.hide(currentFragment);
}
......@@ -88,6 +108,11 @@ public class FragmentLauncher {
}
//更新当前页
currentFragment = fragment;
if (listener != null) {
listener.onFragmentCreated(fragment);
}
fragment.setArguments(arguments);
//提交
transaction.commit();
return fragment;
......@@ -96,19 +121,20 @@ public class FragmentLauncher {
/**
* 打开一个Fragment
* 必须实现 bindFragmentLayout() 绑定FrameLayout
*/
public int startFragment(Fragment fragment, boolean isAddToBackStack) {
public int startFragment(Fragment fragment, TransitionConfig config, boolean isAddToBackStack) {
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();
FragmentTransaction transaction = activity.getSupportFragmentManager()
.beginTransaction()
.setCustomAnimations(config.enter, config.exit, config.popenter, config.popout)
.replace(fragmentLayout, fragment, tagName);
.beginTransaction();
if (config != null) {
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)
transaction.addToBackStack(tagName);
return transaction.commit();
......@@ -118,10 +144,9 @@ public class FragmentLauncher {
/**
* 打开一个Fragment,且替换BackStack栈顶Fragment
* 必须实现 bindFragmentLayout() 绑定FrameLayout
*/
public int startFragmentAndDestroyCurrent(final Fragment fragment) {
int index = startFragment(fragment, false);
public int startFragmentAndDestroyCurrent(final Fragment fragment, TransitionConfig config) {
int index = startFragment(fragment, config, false);
GeneralUtils.findAndModifyOpInBackStackRecord(activity.getSupportFragmentManager(), -1, new GeneralUtils.OPHandler() {
@Override
public boolean handle(Object op) {
......@@ -171,4 +196,8 @@ public class FragmentLauncher {
}
}
public interface OnFragmentCreateListener<T extends Fragment> {
void onFragmentCreated(T t);
}
}
......@@ -145,4 +145,16 @@ public class PermissionsHelper {
*/
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 {
message = new EventMessage();
}
public Builder(int what) {
message = new EventMessage();
message.what = what;
}
public Builder what(int what) {
message.what = what;
return this;
......
......@@ -3,12 +3,14 @@ package tech.starwin.utils.ui_utils;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.ContextWrapper;
import android.content.DialogInterface;
import android.os.Build;
import android.text.InputType;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
......@@ -149,6 +151,14 @@ public class DialogFactory {
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
*/
......@@ -166,6 +176,7 @@ public class DialogFactory {
});
}
public interface OnInputActionListener {
void onClick(QMUIDialog dialog, EditText editText);
}
......@@ -175,7 +186,7 @@ public class DialogFactory {
}
public interface OnYesOrNoListener {
void onClick(Dialog dialog, boolean choice);
void onClick(Dialog dialog, boolean isAgree);
}
public static void dismiss(Dialog dialog) {
......
......@@ -6,8 +6,10 @@ import android.app.Instrumentation;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.support.annotation.ColorRes;
import android.support.annotation.DrawableRes;
import android.support.annotation.IdRes;
import android.support.annotation.NonNull;
......@@ -16,6 +18,11 @@ import android.support.v4.content.ContextCompat;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.LinearLayoutManager;
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.view.KeyEvent;
import android.view.View;
......@@ -23,6 +30,7 @@ import android.view.ViewGroup;
import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import io.reactivex.Observable;
......@@ -70,13 +78,29 @@ public class UIHelper {
/**
* 按默认配置初始化RecylerView 并绑定Adapter
*/
public static void bindAdapter(Context context, RecyclerView recyclerView, RecyclerView.Adapter adapter) {
recyclerView.setLayoutManager(new LinearLayoutManager(context));
public static void bindAdapter(RecyclerView recyclerView, RecyclerView.Adapter adapter) {
recyclerView.setLayoutManager(new LinearLayoutManager(recyclerView.getContext()));
recyclerView.setAdapter(adapter);
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
*/
......@@ -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 输入框
......
......@@ -33,15 +33,15 @@ public class LoadingDialog extends Dialog {
iconView.setImageResource(LibConfig.LOADING_ICON);
mRotationAnimation = ObjectAnimator.ofFloat(rotationView, "rotation", 0, 360);
mRotationAnimation.setDuration(1000);
mRotationAnimation.setDuration(1500);
mRotationAnimation.setRepeatCount(Animation.INFINITE);
mScaleXAnimation = ObjectAnimator.ofFloat(rotationView, "scaleX", 1f, 1.5f, 1f);
mScaleXAnimation.setDuration(1000);
mScaleXAnimation.setDuration(1500);
mScaleXAnimation.setRepeatCount(Animation.INFINITE);
mScaleYAnimation = ObjectAnimator.ofFloat(rotationView, "scaleY", 1f, 1.5f, 1f);
mScaleYAnimation.setDuration(1000);
mScaleYAnimation.setDuration(1500);
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"?>
<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_height="match_parent"
android:orientation="vertical">
......
......@@ -14,7 +14,7 @@
<ImageView
android:id="@+id/progress_dialog_iconImv"
android:layout_width="@dimen/x_150"
android:layout_height="@dimen/x_150"
android:layout_width="@dimen/x_90"
android:layout_height="@dimen/x_90"
android:layout_centerInParent="true" />
</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"?>
<resources>
<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>
\ 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 @@
<string name="text_net_error">无网络连接</string>
<string name="need_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>
\ No newline at end of file
......@@ -6,9 +6,16 @@
<string name="moneySymbol">Rp.</string>
<string name="loading_loading">loading....</string>
<string name="years">tahun</string>
<string name="months">bulan</string>
<string name="days">Hari</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>
<style name="style_bg_transparent_dialog" parent="Base.Theme.AppCompat.Light.Dialog">
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowIsTranslucent">true</item>
</style>
<style name="QMTheme" parent="QMUI.Compat.NoActionBar">
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowIsTranslucent">true</item>
<!-- toolbar(actionbar)颜色 -->
<item name="colorPrimary">@color/toolbar_background</item>
<!-- 状态栏颜色 -->
<item name="colorPrimaryDark">@color/toolbar_background</item>
<!-- 窗口的背景颜色 -->
<item name="android:windowBackground">@color/white</item>
<!-- 配置Android提供的theme -->
<item name="android:textAppearanceListItemSmall">@style/QDTextAppearanceListItemSmall</item>
<item name="android:textAppearanceListItem">@style/QDtextAppearanceListItem</item>
......@@ -47,5 +48,4 @@
<item name="qmui_topbar_subtitle_color">@color/white</item>
<item name="qmui_topbar_text_btn_color_state_list">@color/white</item>
</style>
</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