version:1.0.9
fix: update:更新资源,增加登录,增加检测更新
@@ -5,7 +5,7 @@ def appName() {
|
||||
}
|
||||
|
||||
def releaseTime() {
|
||||
return new Date().format("yyyyMMdd-HHmmss", TimeZone.getDefault())
|
||||
return new Date().format("yyyyMMdd_HHmmss", TimeZone.getDefault())
|
||||
}
|
||||
|
||||
android {
|
||||
@@ -16,8 +16,8 @@ android {
|
||||
minSdkVersion 24
|
||||
targetSdkVersion 29
|
||||
|
||||
versionCode 6
|
||||
versionName "1.0.5"
|
||||
versionCode 10
|
||||
versionName "1.0.9"
|
||||
|
||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||
|
||||
|
||||
@@ -232,6 +232,16 @@
|
||||
android:name=".activity.homework.HomeworkDetailsActivity"
|
||||
android:launchMode="singleTask"
|
||||
android:screenOrientation="landscape" />
|
||||
<activity
|
||||
android:name=".activity.vip.pay.PayVipActivity"
|
||||
android:launchMode="singleTask"
|
||||
android:screenOrientation="landscape"
|
||||
android:theme="@style/AppWhiteTheme" />
|
||||
<activity
|
||||
android:name=".activity.vip.list.VipActivity"
|
||||
android:launchMode="singleTask"
|
||||
android:screenOrientation="landscape"
|
||||
android:theme="@style/AppWhiteTheme" />
|
||||
|
||||
|
||||
<receiver
|
||||
@@ -363,11 +373,11 @@
|
||||
|
||||
<meta-data
|
||||
android:name="design_width_in_dp"
|
||||
android:value="640" />
|
||||
android:value="624" />
|
||||
|
||||
<meta-data
|
||||
android:name="design_height_in_dp"
|
||||
android:value="360" />
|
||||
android:value="390" />
|
||||
</application>
|
||||
|
||||
</manifest>
|
||||
@@ -1,13 +1,26 @@
|
||||
package com.xwad.os.activity.activation;
|
||||
|
||||
import android.graphics.Bitmap;
|
||||
import android.text.Editable;
|
||||
import android.text.InputFilter;
|
||||
import android.text.Spanned;
|
||||
import android.text.TextUtils;
|
||||
import android.text.method.DigitsKeyListener;
|
||||
import android.view.View;
|
||||
|
||||
import androidx.lifecycle.Observer;
|
||||
|
||||
import com.hjq.toast.Toaster;
|
||||
import com.xwad.os.R;
|
||||
import com.xwad.os.base.mvvm.BaseMvvmActivity;
|
||||
import com.xwad.os.bean.OrderInfo;
|
||||
import com.xwad.os.bean.PayInfo;
|
||||
import com.xwad.os.bean.VipInfo;
|
||||
import com.xwad.os.databinding.ActivityActivationBinding;
|
||||
import com.xwad.os.utils.BitmapUtils;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
public class ActivationActivity extends BaseMvvmActivity<ActivationViewModel, ActivityActivationBinding> {
|
||||
|
||||
@@ -64,6 +77,40 @@ public class ActivationActivity extends BaseMvvmActivity<ActivationViewModel, Ac
|
||||
|
||||
@Override
|
||||
protected void initData() {
|
||||
mViewModel.mVipInfoListData.observe(this, new Observer<List<VipInfo>>() {
|
||||
@Override
|
||||
public void onChanged(List<VipInfo> vipInfos) {
|
||||
Optional<VipInfo> optional = vipInfos.stream().findFirst();
|
||||
if (optional.isPresent()) {
|
||||
VipInfo vipInfo = optional.get();
|
||||
mViewDataBinding.tvPrice.setText(vipInfo.getPrice());
|
||||
mViewModel.getPayInfo(vipInfo.getId());
|
||||
}
|
||||
}
|
||||
});
|
||||
mViewModel.getVipList();
|
||||
|
||||
mViewModel.mOrderInfoData.observe(this, new Observer<OrderInfo>() {
|
||||
@Override
|
||||
public void onChanged(OrderInfo orderInfo) {
|
||||
if (orderInfo != null) {
|
||||
mViewModel.getQrCodeUrl(orderInfo.getOrder_sn());
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
mViewModel.mPayInfoData.observe(this, new Observer<PayInfo>() {
|
||||
@Override
|
||||
public void onChanged(PayInfo payInfo) {
|
||||
if (payInfo != null) {
|
||||
String url = payInfo.getCode_url();
|
||||
long expireTime = payInfo.getTime_expire();
|
||||
// initWechatCountdown(expireTime);
|
||||
Bitmap bitmap = BitmapUtils.createQRImage(url, 400, getColor(R.color.black), getColor(R.color.white));
|
||||
mViewDataBinding.ivQrcode.setImageBitmap(bitmap);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
@@ -89,6 +136,20 @@ public class ActivationActivity extends BaseMvvmActivity<ActivationViewModel, Ac
|
||||
mViewDataBinding.clCoupons.setVisibility(View.GONE);
|
||||
mViewDataBinding.clKey.setVisibility(View.VISIBLE);
|
||||
}
|
||||
|
||||
public void keyConfirm(View view) {
|
||||
Editable editable = mViewDataBinding.etKey.getText();
|
||||
if (editable == null) {
|
||||
Toaster.show("请输入激活码");
|
||||
return;
|
||||
}
|
||||
String code = editable.toString();
|
||||
if (TextUtils.isEmpty(code)) {
|
||||
Toaster.show("请输入激活码");
|
||||
return;
|
||||
}
|
||||
mViewModel.codeActivation(code);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,8 +1,25 @@
|
||||
package com.xwad.os.activity.activation;
|
||||
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.lifecycle.MutableLiveData;
|
||||
|
||||
import com.hjq.toast.Toaster;
|
||||
import com.trello.rxlifecycle4.RxLifecycle;
|
||||
import com.trello.rxlifecycle4.android.ActivityEvent;
|
||||
import com.xwad.os.base.mvvm.BaseViewModel;
|
||||
import com.xwad.os.bean.BaseResponse;
|
||||
import com.xwad.os.bean.OrderInfo;
|
||||
import com.xwad.os.bean.PayInfo;
|
||||
import com.xwad.os.bean.VipInfo;
|
||||
import com.xwad.os.databinding.ActivityActivationBinding;
|
||||
import com.xwad.os.network.NetInterfaceManager;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import io.reactivex.rxjava3.annotations.NonNull;
|
||||
import io.reactivex.rxjava3.core.Observer;
|
||||
import io.reactivex.rxjava3.disposables.Disposable;
|
||||
|
||||
public class ActivationViewModel extends BaseViewModel<ActivityActivationBinding, ActivityEvent> {
|
||||
|
||||
@@ -15,4 +32,132 @@ public class ActivationViewModel extends BaseViewModel<ActivityActivationBinding
|
||||
public void onDestroy() {
|
||||
|
||||
}
|
||||
|
||||
public MutableLiveData<List<VipInfo>> mVipInfoListData = new MutableLiveData<>();
|
||||
|
||||
public void getVipList() {
|
||||
NetInterfaceManager.getInstance().getVipListControl()
|
||||
.compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY))
|
||||
.subscribe(new Observer<BaseResponse<List<VipInfo>>>() {
|
||||
@Override
|
||||
public void onSubscribe(@NonNull Disposable d) {
|
||||
Log.e("getVipList", "onSubscribe: ");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNext(@NonNull BaseResponse<List<VipInfo>> listBaseResponse) {
|
||||
Log.e("getVipList", "onNext: " + listBaseResponse);
|
||||
if (listBaseResponse.code == 200) {
|
||||
List<VipInfo> vipInfos = listBaseResponse.data;
|
||||
mVipInfoListData.setValue(vipInfos);
|
||||
} else {
|
||||
Toaster.show(listBaseResponse.msg);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(@NonNull Throwable e) {
|
||||
Log.e("getVipList", "onError: " + e.getMessage());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onComplete() {
|
||||
Log.e("getVipList", "onComplete: ");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public MutableLiveData<OrderInfo> mOrderInfoData = new MutableLiveData<>();
|
||||
|
||||
public void getPayInfo(String vipId) {
|
||||
NetInterfaceManager.getInstance().getBuyVipControl(vipId)
|
||||
.compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY))
|
||||
.subscribe(new Observer<BaseResponse<OrderInfo>>() {
|
||||
@Override
|
||||
public void onSubscribe(@NonNull Disposable d) {
|
||||
Log.e("getPayUrl", "onSubscribe: ");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNext(@NonNull BaseResponse<OrderInfo> baseResponse) {
|
||||
Log.e("getPayUrl", "onNext: " + baseResponse);
|
||||
if (baseResponse.code == 200) {
|
||||
OrderInfo orderInfo = baseResponse.data;
|
||||
mOrderInfoData.setValue(orderInfo);
|
||||
} else {
|
||||
Toaster.show(baseResponse.msg);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(@NonNull Throwable e) {
|
||||
Log.e("getPayUrl", "onError: " + e.getMessage());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onComplete() {
|
||||
Log.e("getPayUrl", "onComplete: ");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public MutableLiveData<PayInfo> mPayInfoData = new MutableLiveData<>();
|
||||
|
||||
public void getQrCodeUrl(String orderSn) {
|
||||
NetInterfaceManager.getInstance().getPayQrcodeControl(orderSn)
|
||||
.compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY))
|
||||
.subscribe(new Observer<BaseResponse<PayInfo>>() {
|
||||
@Override
|
||||
public void onSubscribe(@NonNull Disposable d) {
|
||||
Log.e("getQrCodeUrl", "onSubscribe: ");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNext(@NonNull BaseResponse<PayInfo> baseResponse) {
|
||||
Log.e("getQrCodeUrl", "onNext: " + baseResponse);
|
||||
if (baseResponse.code == 200) {
|
||||
PayInfo payInfo = baseResponse.data;
|
||||
mPayInfoData.setValue(payInfo);
|
||||
} else {
|
||||
Toaster.show(baseResponse.data);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(@NonNull Throwable e) {
|
||||
Log.e("getQrCodeUrl", "onError: " + e.getMessage());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onComplete() {
|
||||
Log.e("getQrCodeUrl", "onComplete: ");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void codeActivation(String code) {
|
||||
NetInterfaceManager.getInstance().getCodeActivationControl(code)
|
||||
.compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY))
|
||||
.subscribe(new Observer<BaseResponse>() {
|
||||
@Override
|
||||
public void onSubscribe(@NonNull Disposable d) {
|
||||
Log.e("codeActivation", "onSubscribe: ");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNext(@NonNull BaseResponse baseResponse) {
|
||||
Log.e("codeActivation", "onNext: " + baseResponse);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(@NonNull Throwable e) {
|
||||
Log.e("codeActivation", "onError: " + e.getMessage());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onComplete() {
|
||||
Log.e("codeActivation", "onComplete: ");
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,6 +13,7 @@ import com.xwad.os.R;
|
||||
import com.xwad.os.base.mvvm.BaseMvvmActivity;
|
||||
import com.xwad.os.config.CommonConfig;
|
||||
import com.xwad.os.databinding.ActivityEditBinding;
|
||||
import com.xwad.os.manager.DeviceSNManager;
|
||||
import com.xwad.os.manager.RemoteManager;
|
||||
import com.xwad.os.utils.ActivationUtil;
|
||||
import com.xwad.os.utils.LenovoCsdkUtil;
|
||||
@@ -101,10 +102,10 @@ public class EditActivity extends BaseMvvmActivity<EditViewModel, ActivityEditBi
|
||||
Toaster.show("不能为空");
|
||||
return;
|
||||
}
|
||||
if (ActivationUtil.getInstance().isActivation()) {
|
||||
if (ActivationUtil.getInstance().isLogin()) {
|
||||
Map<String, String> params = new HashMap<>();
|
||||
params.put("sn", RemoteManager.getInstance().getSerial());
|
||||
params.put(mTypeName, mViewDataBinding.editText.getText().toString());
|
||||
params.put("sn", DeviceSNManager.getDeviceSN());
|
||||
params.put(mKey, mViewDataBinding.editText.getText().toString());
|
||||
mViewModel.updateInfo(params);
|
||||
} else {
|
||||
mMMKV.encode(mTypeName, mViewDataBinding.editText.getText().toString());
|
||||
|
||||
@@ -34,9 +34,6 @@ public class EditViewModel extends BaseViewModel<ActivityEditBinding, ActivityEv
|
||||
public MutableLiveData<Boolean> mSuccessfulData = new MutableLiveData<>();
|
||||
|
||||
public void updateInfo(Map<String, String> params) {
|
||||
if (!ActivationUtil.getInstance().isActivation()) {
|
||||
return;
|
||||
}
|
||||
NetInterfaceManager.getInstance().getUpdateInfoObservable(params)
|
||||
.compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY))
|
||||
.subscribe(new Observer<BaseResponse>() {
|
||||
|
||||
@@ -24,6 +24,7 @@ import androidx.annotation.NonNull;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.fragment.app.FragmentManager;
|
||||
import androidx.fragment.app.FragmentPagerAdapter;
|
||||
import androidx.lifecycle.Observer;
|
||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
import androidx.viewpager.widget.ViewPager;
|
||||
|
||||
@@ -35,7 +36,9 @@ import com.xwad.os.BuildConfig;
|
||||
import com.xwad.os.R;
|
||||
import com.xwad.os.activity.login.LoginActivity;
|
||||
import com.xwad.os.activity.permission.PermissionActivity;
|
||||
import com.xwad.os.activity.update.UpdateActivity;
|
||||
import com.xwad.os.base.mvvm.BaseMvvmActivity;
|
||||
import com.xwad.os.bean.AppUpdateInfo;
|
||||
import com.xwad.os.bean.jxw.TabBean;
|
||||
import com.xwad.os.config.CommonConfig;
|
||||
import com.xwad.os.databinding.ActivityHomeBinding;
|
||||
@@ -59,6 +62,7 @@ import com.xwad.os.jxw.event.UpdateGradeEvent;
|
||||
import com.xwad.os.jxw.fragment.SztzFragment;
|
||||
import com.xwad.os.manager.DeviceSNManager;
|
||||
import com.xwad.os.manager.RemoteManager;
|
||||
import com.xwad.os.utils.ApkUtils;
|
||||
import com.xwad.os.utils.DataUtil;
|
||||
import com.xwad.os.utils.OpenApkUtils;
|
||||
import com.xwad.os.utils.Utils;
|
||||
@@ -104,7 +108,7 @@ public class HomeActivity extends BaseMvvmActivity<HomeViewModel, ActivityHomeBi
|
||||
|
||||
@Override
|
||||
public void initView() {
|
||||
Log.e(TAG, "initView: getSerial = " + RemoteManager.getInstance().getSerial());
|
||||
Log.e(TAG, "initView: getSerial = " + DeviceSNManager.getDeviceSN());
|
||||
Log.e(TAG, "initView: getDeviceSN = " + DeviceSNManager.getDeviceSN());
|
||||
|
||||
if (!EventBus.getDefault().isRegistered(this)) {
|
||||
@@ -113,7 +117,11 @@ public class HomeActivity extends BaseMvvmActivity<HomeViewModel, ActivityHomeBi
|
||||
|
||||
setWallpaper();
|
||||
|
||||
startActivity(new Intent(HomeActivity.this, LoginActivity.class));
|
||||
// ComponentName componentName = new ComponentName("com.jxw.hdhb", "com.jxw.hdhb.ui.activity.MainActivity");
|
||||
// startActivity(new Intent().setComponent(componentName));
|
||||
// startActivity(new Intent(HomeActivity.this, LoginActivity.class));
|
||||
|
||||
|
||||
RemoteManager.setListener(this);
|
||||
Utils.getAndroiodScreenProperty(this);
|
||||
|
||||
@@ -177,6 +185,25 @@ public class HomeActivity extends BaseMvvmActivity<HomeViewModel, ActivityHomeBi
|
||||
|
||||
@Override
|
||||
public void initData() {
|
||||
mViewModel.mAppUpdateInfoData.observe(this, new Observer<AppUpdateInfo>() {
|
||||
@Override
|
||||
public void onChanged(AppUpdateInfo appUpdateInfo) {
|
||||
if (appUpdateInfo == null) {
|
||||
Toaster.show("已是最新版本");
|
||||
} else {
|
||||
if (ApkUtils.isUpdate(HomeActivity.this, appUpdateInfo)) {
|
||||
Intent intent = new Intent(HomeActivity.this, UpdateActivity.class);
|
||||
intent.putExtra("appUpdateInfo", appUpdateInfo);
|
||||
startActivity(intent);
|
||||
Toaster.show("有新的版本需要更新");
|
||||
} else {
|
||||
Toaster.show("已是最新版本");
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
mViewModel.checkUpdate();
|
||||
|
||||
initDatas();
|
||||
}
|
||||
|
||||
@@ -236,7 +263,7 @@ public class HomeActivity extends BaseMvvmActivity<HomeViewModel, ActivityHomeBi
|
||||
// if ("小学".equals(Util.checkGrade(SPUtils.getGrade()))) {
|
||||
tabBeanLists.add(new TabBean("素养课", R.drawable.icon_tab_syk, R.drawable.icon_tab_syk_pre));
|
||||
// }
|
||||
tabBeanLists.add(new TabBean("应用", R.drawable.icon_tab_app, R.drawable.icon_tab_app));
|
||||
tabBeanLists.add(new TabBean("应用", R.drawable.icon_tab_lsaq, R.drawable.icon_tab_lsaq_pre));
|
||||
|
||||
tabAdapter.setData(tabBeanLists);
|
||||
tabAdapter.setChoosePosition(defaultCurrent);
|
||||
|
||||
@@ -6,6 +6,10 @@ import android.util.Log;
|
||||
import androidx.lifecycle.MutableLiveData;
|
||||
|
||||
import com.google.gson.JsonObject;
|
||||
import com.hjq.toast.Toaster;
|
||||
import com.tencent.mmkv.MMKV;
|
||||
import com.trello.rxlifecycle4.RxLifecycle;
|
||||
import com.trello.rxlifecycle4.android.ActivityEvent;
|
||||
import com.xwad.os.BuildConfig;
|
||||
import com.xwad.os.R;
|
||||
import com.xwad.os.base.mvvm.BaseViewModel;
|
||||
@@ -15,17 +19,12 @@ import com.xwad.os.bean.SnInfo;
|
||||
import com.xwad.os.bean.SystemSettings;
|
||||
import com.xwad.os.config.CommonConfig;
|
||||
import com.xwad.os.databinding.ActivityHomeBinding;
|
||||
import com.xwad.os.manager.RemoteManager;
|
||||
import com.xwad.os.jxw.SPUtils;
|
||||
import com.xwad.os.manager.DeviceSNManager;
|
||||
import com.xwad.os.network.NetInterfaceManager;
|
||||
import com.xwad.os.utils.ActivationUtil;
|
||||
import com.xwad.os.utils.ApkUtils;
|
||||
import com.xwad.os.utils.AppUsedTimeUtils;
|
||||
import com.xwad.os.utils.LenovoCsdkUtil;
|
||||
import com.xwad.os.utils.Utils;
|
||||
import com.hjq.toast.Toaster;
|
||||
import com.tencent.mmkv.MMKV;
|
||||
import com.trello.rxlifecycle4.RxLifecycle;
|
||||
import com.trello.rxlifecycle4.android.ActivityEvent;
|
||||
|
||||
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
|
||||
import io.reactivex.rxjava3.annotations.NonNull;
|
||||
@@ -65,14 +64,16 @@ public class HomeViewModel extends BaseViewModel<ActivityHomeBinding, ActivityEv
|
||||
if (snInfoBaseResponse.code == 200) {
|
||||
SnInfo snInfo = snInfoBaseResponse.data;
|
||||
String old = mMMKV.decodeString(CommonConfig.UIUI_USER_GRADE_KEY, getCtx().getString(R.string.default_grade));
|
||||
if (!old.equals(snInfo.getGrade())) {
|
||||
mMMKV.encode(CommonConfig.UIUI_USER_GRADE_KEY, snInfo.getGrade());
|
||||
Toaster.showLong("桌面调整,正在重启");
|
||||
Utils.triggerRebirth(getCtx());
|
||||
} else {
|
||||
Log.e("getSnInfo", "onNext: not changed");
|
||||
}
|
||||
mGradleData.setValue(snInfo.getGrade());
|
||||
String grade = snInfo.getGrade();
|
||||
SPUtils.setGrade(grade);
|
||||
// if (!old.equals(grade)) {
|
||||
// mMMKV.encode(CommonConfig.UIUI_USER_GRADE_KEY, grade);
|
||||
// Toaster.showLong("桌面调整,正在重启");
|
||||
// Utils.triggerRebirth(getCtx());
|
||||
// } else {
|
||||
// Log.e("getSnInfo", "onNext: not changed");
|
||||
// }
|
||||
mGradleData.setValue(grade);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -92,7 +93,7 @@ public class HomeViewModel extends BaseViewModel<ActivityHomeBinding, ActivityEv
|
||||
public MutableLiveData<SystemSettings> mSystemSettingsMutableLiveData = new MutableLiveData<>();
|
||||
|
||||
public void getSystemSettings() {
|
||||
NetInterfaceManager.getInstance().getsettingControl()
|
||||
NetInterfaceManager.getInstance().getSettingControl()
|
||||
.subscribe(new Observer<BaseResponse<SystemSettings>>() {
|
||||
@Override
|
||||
public void onSubscribe(@NonNull Disposable d) {
|
||||
@@ -158,7 +159,7 @@ public class HomeViewModel extends BaseViewModel<ActivityHomeBinding, ActivityEv
|
||||
|
||||
@Deprecated
|
||||
public void sendAPPUsage() {
|
||||
boolean activation = ActivationUtil.getInstance().isActivation();
|
||||
boolean activation = ActivationUtil.getInstance().isLogin();
|
||||
if (!activation) {
|
||||
return;
|
||||
}
|
||||
@@ -174,7 +175,7 @@ public class HomeViewModel extends BaseViewModel<ActivityHomeBinding, ActivityEv
|
||||
Log.e(TAG, "onRestart: " + packagename);
|
||||
NetInterfaceManager.getInstance()
|
||||
.getAppUsageRecordControl()
|
||||
.sendappUsageRecord(RemoteManager.getInstance().getSerial(),
|
||||
.sendappUsageRecord(DeviceSNManager.getDeviceSN(),
|
||||
ApkUtils.getAppNameByPackage(getCtx(), packagename),
|
||||
packagename,
|
||||
AppUsedTimeUtils.getInstance().getStartTime() / 1000,
|
||||
@@ -211,7 +212,7 @@ public class HomeViewModel extends BaseViewModel<ActivityHomeBinding, ActivityEv
|
||||
|
||||
@Deprecated
|
||||
public void sendRunningInfo() {
|
||||
boolean activation = ActivationUtil.getInstance().isActivation();
|
||||
boolean activation = ActivationUtil.getInstance().isLogin();
|
||||
if (!activation) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1,12 +1,17 @@
|
||||
package com.xwad.os.activity.login;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Intent;
|
||||
import android.text.Editable;
|
||||
import android.text.TextUtils;
|
||||
import android.view.View;
|
||||
|
||||
import androidx.lifecycle.Observer;
|
||||
|
||||
import com.hjq.toast.Toaster;
|
||||
import com.xwad.os.R;
|
||||
import com.xwad.os.base.mvvm.BaseMvvmActivity;
|
||||
import com.xwad.os.bean.LoginInfo;
|
||||
import com.xwad.os.databinding.ActivityLoginBinding;
|
||||
|
||||
public class LoginActivity extends BaseMvvmActivity<LoginViewModel, ActivityLoginBinding> {
|
||||
@@ -31,6 +36,15 @@ public class LoginActivity extends BaseMvvmActivity<LoginViewModel, ActivityLogi
|
||||
|
||||
@Override
|
||||
protected void initData() {
|
||||
mViewModel.mLoginInfoData.observe(this, new Observer<LoginInfo>() {
|
||||
@Override
|
||||
public void onChanged(LoginInfo loginInfo) {
|
||||
Toaster.show("登录成功");
|
||||
Intent intent = new Intent();
|
||||
setResult(Activity.RESULT_OK, intent);
|
||||
finish();
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -5,10 +5,14 @@ import android.util.Log;
|
||||
import androidx.lifecycle.MutableLiveData;
|
||||
|
||||
import com.hjq.toast.Toaster;
|
||||
import com.tencent.mmkv.MMKV;
|
||||
import com.trello.rxlifecycle4.RxLifecycle;
|
||||
import com.trello.rxlifecycle4.android.ActivityEvent;
|
||||
import com.xwad.os.base.mvvm.BaseViewModel;
|
||||
import com.xwad.os.bean.BaseResponse;
|
||||
import com.xwad.os.bean.LoginInfo;
|
||||
import com.xwad.os.bean.LoginInfoDevice;
|
||||
import com.xwad.os.config.CommonConfig;
|
||||
import com.xwad.os.databinding.ActivityLoginBinding;
|
||||
import com.xwad.os.network.NetInterfaceManager;
|
||||
|
||||
@@ -18,6 +22,8 @@ import io.reactivex.rxjava3.disposables.Disposable;
|
||||
|
||||
public class LoginViewModel extends BaseViewModel<ActivityLoginBinding, ActivityEvent> {
|
||||
|
||||
private MMKV mMMKV = MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE);
|
||||
|
||||
@Override
|
||||
public ActivityLoginBinding getVDBinding() {
|
||||
return binding;
|
||||
@@ -58,24 +64,32 @@ public class LoginViewModel extends BaseViewModel<ActivityLoginBinding, Activity
|
||||
});
|
||||
}
|
||||
|
||||
public MutableLiveData<Boolean> mLoginSuccessfullyData = new MutableLiveData<>();
|
||||
public MutableLiveData<LoginInfo> mLoginInfoData = new MutableLiveData<>();
|
||||
|
||||
public void codeLogin(String mobile, String code) {
|
||||
NetInterfaceManager.getInstance().getCodeLoginObservable(mobile, code)
|
||||
.compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY))
|
||||
.subscribe(new Observer<BaseResponse>() {
|
||||
.subscribe(new Observer<BaseResponse<LoginInfo>>() {
|
||||
@Override
|
||||
public void onSubscribe(@NonNull Disposable d) {
|
||||
Log.e("codeLogin", "onSubscribe: ");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNext(@NonNull BaseResponse baseResponse) {
|
||||
public void onNext(@NonNull BaseResponse<LoginInfo> baseResponse) {
|
||||
Log.e("codeLogin", "onNext: " + baseResponse);
|
||||
if (baseResponse.code == 200) {
|
||||
mLoginSuccessfullyData.setValue(true);
|
||||
LoginInfo loginInfo = baseResponse.data;
|
||||
mMMKV.encode(CommonConfig.ACCOUNT_LOGIN_STATU, 1);
|
||||
mMMKV.encode(CommonConfig.ACCOUNT_LOGIN_TOKEN, loginInfo.getToken());
|
||||
mMMKV.encode(CommonConfig.ACCOUNT_LOGIN_MOBILE, loginInfo.getMobile());
|
||||
mMMKV.encode(CommonConfig.ACCOUNT_LOGIN_ID, loginInfo.getId());
|
||||
LoginInfoDevice loginInfoDevice = loginInfo.getDevice();
|
||||
mMMKV.encode(CommonConfig.ACCOUNT_DEVICE_ID, loginInfoDevice.getId());
|
||||
mMMKV.encode(CommonConfig.ACCOUNT_DEVICE_SN, loginInfoDevice.getSn());
|
||||
mLoginInfoData.setValue(loginInfo);
|
||||
} else {
|
||||
mLoginSuccessfullyData.setValue(false);
|
||||
mMMKV.encode(CommonConfig.ACCOUNT_LOGIN_STATU, 0);
|
||||
Toaster.show(baseResponse.msg);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -43,6 +43,7 @@ import com.xwad.os.fragment.read.ReadFragment;
|
||||
import com.xwad.os.fragment.safe.SafeFragment;
|
||||
import com.xwad.os.jxw.JxwPackageConfig;
|
||||
import com.xwad.os.manager.AmapManager;
|
||||
import com.xwad.os.manager.DeviceSNManager;
|
||||
import com.xwad.os.manager.RemoteManager;
|
||||
import com.xwad.os.service.SocketService;
|
||||
import com.xwad.os.utils.ApkUtils;
|
||||
@@ -103,7 +104,7 @@ public class MainActivity extends BaseMvvmActivity<MainViewModel, ActivityMainBi
|
||||
|
||||
@Override
|
||||
public void initView() {
|
||||
Log.e(TAG, "initView: getSerial = " + RemoteManager.getInstance().getSerial());
|
||||
Log.e(TAG, "initView: getSerial = " + DeviceSNManager.getDeviceSN());
|
||||
|
||||
|
||||
// OpenApkUtils.getInstance().openWordLecture();
|
||||
|
||||
@@ -19,12 +19,12 @@ import com.xwad.os.bean.SnInfo;
|
||||
import com.xwad.os.bean.SystemSettings;
|
||||
import com.xwad.os.config.CommonConfig;
|
||||
import com.xwad.os.databinding.ActivityMainBinding;
|
||||
import com.xwad.os.manager.DeviceSNManager;
|
||||
import com.xwad.os.manager.RemoteManager;
|
||||
import com.xwad.os.network.NetInterfaceManager;
|
||||
import com.xwad.os.utils.ActivationUtil;
|
||||
import com.xwad.os.utils.ApkUtils;
|
||||
import com.xwad.os.utils.AppUsedTimeUtils;
|
||||
import com.xwad.os.utils.LenovoCsdkUtil;
|
||||
import com.xwad.os.utils.Utils;
|
||||
|
||||
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
|
||||
@@ -93,7 +93,7 @@ public class MainViewModel extends BaseViewModel<ActivityMainBinding, ActivityEv
|
||||
public MutableLiveData<SystemSettings> mSystemSettingsMutableLiveData = new MutableLiveData<>();
|
||||
|
||||
public void getSystemSettings() {
|
||||
NetInterfaceManager.getInstance().getsettingControl()
|
||||
NetInterfaceManager.getInstance().getSettingControl()
|
||||
.subscribe(new Observer<BaseResponse<SystemSettings>>() {
|
||||
@Override
|
||||
public void onSubscribe(@NonNull Disposable d) {
|
||||
@@ -175,7 +175,7 @@ public class MainViewModel extends BaseViewModel<ActivityMainBinding, ActivityEv
|
||||
Log.e(TAG, "onRestart: " + packagename);
|
||||
NetInterfaceManager.getInstance()
|
||||
.getAppUsageRecordControl()
|
||||
.sendappUsageRecord(RemoteManager.getInstance().getSerial(),
|
||||
.sendappUsageRecord(DeviceSNManager.getDeviceSN(),
|
||||
ApkUtils.getAppNameByPackage(getCtx(), packagename),
|
||||
packagename,
|
||||
AppUsedTimeUtils.getInstance().getStartTime() / 1000,
|
||||
|
||||
@@ -15,6 +15,7 @@ import com.xwad.os.config.CommonConfig;
|
||||
import com.xwad.os.databinding.ActivitySelecteGradeBinding;
|
||||
import com.xwad.os.jxw.SPUtils;
|
||||
import com.xwad.os.jxw.event.UpdateGradeEvent;
|
||||
import com.xwad.os.manager.DeviceSNManager;
|
||||
import com.xwad.os.manager.RemoteManager;
|
||||
import com.xwad.os.utils.ActivationUtil;
|
||||
import com.xwad.os.utils.LenovoCsdkUtil;
|
||||
@@ -128,16 +129,16 @@ public class SelecteGradeActivity extends BaseMvvmActivity<SelecteGradeViewModel
|
||||
|
||||
@Override
|
||||
public void initData() {
|
||||
// mViewModel.mSuccessfulData.observe(this, new Observer<Boolean>() {
|
||||
// @Override
|
||||
// public void onChanged(Boolean aBoolean) {
|
||||
// if (aBoolean) {
|
||||
mViewModel.mSuccessfulData.observe(this, new Observer<Boolean>() {
|
||||
@Override
|
||||
public void onChanged(Boolean aBoolean) {
|
||||
if (aBoolean) {
|
||||
// Toaster.showLong("桌面调整,正在重启");
|
||||
// Utils.triggerRebirth(SelecteGradeActivity.this);
|
||||
// finish();
|
||||
// }
|
||||
// }
|
||||
// });
|
||||
finish();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void setPrimary(View view) {
|
||||
@@ -175,15 +176,16 @@ public class SelecteGradeActivity extends BaseMvvmActivity<SelecteGradeViewModel
|
||||
|
||||
public void submit(View view) {
|
||||
mMMKV.encode(CommonConfig.UIUI_USER_GRADE_KEY, grade);
|
||||
// if (ActivationUtil.getInstance().isActivation()) {
|
||||
// Map<String, String> params = new HashMap<>();
|
||||
// params.put("sn", RemoteManager.getInstance().getSerial());
|
||||
// params.put("sn_grade", grade);
|
||||
// mViewModel.updateInfo(params);
|
||||
// }
|
||||
SPUtils.setGrade(grade);
|
||||
EventBus.getDefault().postSticky(new UpdateGradeEvent());
|
||||
finish();
|
||||
if (ActivationUtil.getInstance().isLogin()) {
|
||||
Map<String, String> params = new HashMap<>();
|
||||
params.put("sn", DeviceSNManager.getDeviceSN());
|
||||
params.put("sn_grade", grade);
|
||||
mViewModel.updateInfo(params);
|
||||
} else {
|
||||
finish();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -34,7 +34,7 @@ public class SelecteGradeViewModel extends BaseViewModel<ActivitySelecteGradeBin
|
||||
public MutableLiveData<Boolean> mSuccessfulData = new MutableLiveData<>();
|
||||
|
||||
public void updateInfo(Map<String, String> params) {
|
||||
if (!ActivationUtil.getInstance().isActivation()) {
|
||||
if (!ActivationUtil.getInstance().isLogin()) {
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package com.xwad.os.activity.update;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.os.Build;
|
||||
import android.view.View;
|
||||
|
||||
import com.arialyy.aria.core.Aria;
|
||||
@@ -57,7 +58,12 @@ public class UpdateActivity extends BaseMvvmActivity<UpdateViewModel, ActivityUp
|
||||
}
|
||||
|
||||
public void upgrade(View view) {
|
||||
startService(new Intent(UpdateActivity.this, DownloadService.class));
|
||||
Intent intent = new Intent(UpdateActivity.this, DownloadService.class);
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||
startForegroundService(intent);
|
||||
} else {
|
||||
startService(intent);
|
||||
}
|
||||
if (mAppInfoData != null) {
|
||||
DownloadEntity entity = Aria.download(this).getFirstDownloadEntity(mAppInfoData.getApp_url());
|
||||
if (null != entity) {
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package com.xwad.os.activity.user;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.net.Uri;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
import android.view.View;
|
||||
@@ -30,10 +31,13 @@ import com.xwad.os.bean.UserAvatarInfo;
|
||||
import com.xwad.os.config.CommonConfig;
|
||||
import com.xwad.os.custom.GlideEngine;
|
||||
import com.xwad.os.databinding.ActivityUserBinding;
|
||||
import com.xwad.os.fragment.usercenter.account.AccountFragment;
|
||||
import com.xwad.os.fragment.usercenter.device.DeviceFragment;
|
||||
import com.xwad.os.fragment.usercenter.info.InfoFragment;
|
||||
import com.xwad.os.fragment.usercenter.parents.ParentsFragment;
|
||||
import com.xwad.os.manager.DeviceSNManager;
|
||||
import com.xwad.os.manager.RemoteManager;
|
||||
import com.xwad.os.network.NetInterfaceManager;
|
||||
import com.xwad.os.utils.ActivationUtil;
|
||||
import com.xwad.os.utils.ApkUtils;
|
||||
import com.xwad.os.utils.FileUtil;
|
||||
@@ -78,7 +82,7 @@ public class UserActivity extends BaseMvvmActivity<UserViewModel, ActivityUserBi
|
||||
|
||||
@Override
|
||||
protected void initView() {
|
||||
mFragments = new Fragment[3];
|
||||
mFragments = new Fragment[4];
|
||||
mFragmentManager = getSupportFragmentManager();
|
||||
|
||||
mViewDataBinding.tvVersion.setText("版本:V" + BuildConfig.VERSION_NAME);
|
||||
@@ -100,12 +104,22 @@ public class UserActivity extends BaseMvvmActivity<UserViewModel, ActivityUserBi
|
||||
}
|
||||
}
|
||||
});
|
||||
mViewDataBinding.rbAccount.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
|
||||
@Override
|
||||
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
|
||||
Log.d(TAG, "onCheckedChanged: rbAccount Checked = " + b);
|
||||
if (b) {
|
||||
switchContent(2);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
mViewDataBinding.rbDevice.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
|
||||
@Override
|
||||
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
|
||||
Log.d(TAG, "onCheckedChanged: rbDevice Checked = " + b);
|
||||
if (b) {
|
||||
switchContent(2);
|
||||
switchContent(3);
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -127,6 +141,9 @@ public class UserActivity extends BaseMvvmActivity<UserViewModel, ActivityUserBi
|
||||
mViewDataBinding.rbParents.setChecked(true);
|
||||
break;
|
||||
case 2:
|
||||
mViewDataBinding.rbAccount.setChecked(true);
|
||||
break;
|
||||
case 3:
|
||||
mViewDataBinding.rbDevice.setChecked(true);
|
||||
break;
|
||||
}
|
||||
@@ -169,7 +186,7 @@ public class UserActivity extends BaseMvvmActivity<UserViewModel, ActivityUserBi
|
||||
@Override
|
||||
protected void onResume() {
|
||||
super.onResume();
|
||||
if (ActivationUtil.getInstance().isActivation()) {
|
||||
if (ActivationUtil.getInstance().isLogin()) {
|
||||
mViewModel.getUserAvatarInfo();
|
||||
} else {
|
||||
setLocalData();
|
||||
@@ -211,12 +228,20 @@ public class UserActivity extends BaseMvvmActivity<UserViewModel, ActivityUserBi
|
||||
break;
|
||||
case 2:
|
||||
if (mFragments[2] == null) {
|
||||
mFragments[2] = new DeviceFragment();
|
||||
mFragments[2] = new AccountFragment();
|
||||
transaction.add(R.id.content, mFragments[2], 2 + "");
|
||||
} else {
|
||||
transaction.show(mFragments[2]);
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
if (mFragments[3] == null) {
|
||||
mFragments[3] = new DeviceFragment();
|
||||
transaction.add(R.id.content, mFragments[3], 3 + "");
|
||||
} else {
|
||||
transaction.show(mFragments[3]);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
}
|
||||
transaction.commit();
|
||||
@@ -248,20 +273,20 @@ public class UserActivity extends BaseMvvmActivity<UserViewModel, ActivityUserBi
|
||||
Log.e("selectPicture", "onResult: " + avatarFilePath);
|
||||
GlideLoadUtils.getInstance().glideLoad(UserActivity.this, avatarFilePath, mViewDataBinding.nvAvatar, R.drawable.default_avatar);
|
||||
|
||||
if (ActivationUtil.getInstance().isActivation()) {
|
||||
if (ActivationUtil.getInstance().isLogin()) {
|
||||
File avatarFile;
|
||||
if (TextUtils.isEmpty(avatarFilePath)) {
|
||||
avatarFile = FileUtil.drawableToFile(UserActivity.this, R.drawable.default_avatar, "avatar");
|
||||
} else {
|
||||
// Uri uri = Uri.parse(avatarFilePath);
|
||||
// avatarFile = FileUtil.uriToFile(uri, UserActivity.this);
|
||||
avatarFile = new File(avatarFilePath);
|
||||
Uri uri = Uri.parse(avatarFilePath);
|
||||
avatarFile = FileUtil.uriToFile(uri, UserActivity.this);
|
||||
// avatarFile = new File(avatarFilePath);
|
||||
}
|
||||
MediaType mediaType = MediaType.Companion.parse("image/png");
|
||||
RequestBody requestBody = RequestBody.Companion.create(avatarFile, mediaType);
|
||||
MultipartBody.Part body = MultipartBody.Part.createFormData("avatar", avatarFile.getName(), requestBody);
|
||||
Map<String, String> params = new HashMap<>();
|
||||
params.put("sn", RemoteManager.getInstance().getSerial());
|
||||
Map<String, RequestBody> params = new HashMap<>();
|
||||
params.put("sn", NetInterfaceManager.convertToJsonRequestBody(DeviceSNManager.getDeviceSN()));
|
||||
mViewModel.updateInfo(params, body);
|
||||
} else {
|
||||
mMMKV.encode(CommonConfig.UIUI_USER_AVATAR_KEY, avatarFilePath);
|
||||
|
||||
@@ -22,6 +22,7 @@ import io.reactivex.rxjava3.annotations.NonNull;
|
||||
import io.reactivex.rxjava3.core.Observer;
|
||||
import io.reactivex.rxjava3.disposables.Disposable;
|
||||
import okhttp3.MultipartBody;
|
||||
import okhttp3.RequestBody;
|
||||
|
||||
public class UserViewModel extends BaseViewModel<ActivityUserBinding, ActivityEvent> {
|
||||
private static final String TAG = "UserViewModel";
|
||||
@@ -104,9 +105,8 @@ public class UserViewModel extends BaseViewModel<ActivityUserBinding, ActivityEv
|
||||
|
||||
public MutableLiveData<Boolean> mSuccessfulData = new MutableLiveData<>();
|
||||
|
||||
public void updateInfo(Map<String, String> params, MultipartBody.Part multipartBody) {
|
||||
if (!ActivationUtil.getInstance().isActivation()) {
|
||||
|
||||
public void updateInfo(Map<String, RequestBody> params, MultipartBody.Part multipartBody) {
|
||||
if (!ActivationUtil.getInstance().isLogin()) {
|
||||
return;
|
||||
}
|
||||
NetInterfaceManager.getInstance().getUpdateInfoObservable(params, multipartBody)
|
||||
|
||||
199
app/src/main/java/com/xwad/os/activity/vip/list/VipActivity.java
Normal file
@@ -0,0 +1,199 @@
|
||||
package com.xwad.os.activity.vip.list;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
import android.view.View;
|
||||
|
||||
import androidx.activity.result.ActivityResult;
|
||||
import androidx.activity.result.ActivityResultCallback;
|
||||
import androidx.activity.result.ActivityResultLauncher;
|
||||
import androidx.activity.result.contract.ActivityResultContracts;
|
||||
import androidx.lifecycle.Observer;
|
||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.hjq.toast.Toaster;
|
||||
import com.trello.rxlifecycle4.RxLifecycle;
|
||||
import com.trello.rxlifecycle4.android.ActivityEvent;
|
||||
import com.xwad.os.R;
|
||||
import com.xwad.os.activity.privacy.PrivacyActivity;
|
||||
import com.xwad.os.activity.vip.pay.PayVipActivity;
|
||||
import com.xwad.os.adapter.VipAdapter;
|
||||
import com.xwad.os.base.mvvm.BaseMvvmActivity;
|
||||
import com.xwad.os.bean.VipInfo;
|
||||
import com.xwad.os.databinding.ActivityVipBinding;
|
||||
import com.xwad.os.view.EquallyDividedItemDecoration;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
|
||||
import io.reactivex.rxjava3.core.Observable;
|
||||
import io.reactivex.rxjava3.disposables.Disposable;
|
||||
import io.reactivex.rxjava3.functions.Consumer;
|
||||
import io.reactivex.rxjava3.schedulers.Schedulers;
|
||||
|
||||
public class VipActivity extends BaseMvvmActivity<VipViewModel, ActivityVipBinding> {
|
||||
private static final String TAG = "VipActivity";
|
||||
|
||||
private ActivityResultLauncher<Intent> mCodeLauncher;
|
||||
private VipAdapter mVipAdapter;
|
||||
private String mId = "";
|
||||
|
||||
@Override
|
||||
public boolean setNightMode() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean setfitWindow() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getLayoutId() {
|
||||
return R.layout.activity_vip;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void initDataBinding() {
|
||||
mViewModel.setCtx(this);
|
||||
mViewModel.setVDBinding(mViewDataBinding);
|
||||
mViewModel.setLifecycle(getLifecycleSubject());
|
||||
mViewDataBinding.setClick(new BtnClick());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void initView() {
|
||||
mCodeLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() {
|
||||
@Override
|
||||
public void onActivityResult(ActivityResult result) {
|
||||
if (result.getResultCode() == RESULT_OK) {
|
||||
finish();
|
||||
}
|
||||
}
|
||||
});
|
||||
mVipAdapter = new VipAdapter();
|
||||
mVipAdapter.setVipSelectListener(new VipAdapter.VipSelectListener() {
|
||||
@Override
|
||||
public void onVipSelect(VipInfo vipInfo) {
|
||||
mId = vipInfo.getId();
|
||||
}
|
||||
});
|
||||
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
|
||||
linearLayoutManager.setOrientation(RecyclerView.HORIZONTAL);
|
||||
mViewDataBinding.rvVip.setLayoutManager(linearLayoutManager);
|
||||
EquallyDividedItemDecoration equallyDividedItemDecoration = new EquallyDividedItemDecoration(3, 10);
|
||||
mViewDataBinding.rvVip.addItemDecoration(equallyDividedItemDecoration);
|
||||
mViewDataBinding.rvVip.setAdapter(mVipAdapter);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void initData() {
|
||||
mViewModel.mVipInfoListData.observe(this, new Observer<List<VipInfo>>() {
|
||||
@Override
|
||||
public void onChanged(List<VipInfo> vipInfos) {
|
||||
mVipAdapter.setVipInfos(vipInfos);
|
||||
}
|
||||
});
|
||||
mViewModel.getVipList();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
super.onDestroy();
|
||||
dispose();
|
||||
}
|
||||
|
||||
private void dispose() {
|
||||
if (mWechatDisposable != null && !mWechatDisposable.isDisposed()) {
|
||||
mWechatDisposable.dispose();
|
||||
mWechatDisposable = null;
|
||||
}
|
||||
if (mOrderDisposable != null && !mOrderDisposable.isDisposed()) {
|
||||
mOrderDisposable.dispose();
|
||||
mOrderDisposable = null;
|
||||
}
|
||||
}
|
||||
|
||||
private Disposable mWechatDisposable;
|
||||
|
||||
private void initWechatCountdown(long time_expire) {
|
||||
if (mWechatDisposable != null) {
|
||||
if (!mWechatDisposable.isDisposed()) {
|
||||
mWechatDisposable.dispose();
|
||||
mWechatDisposable = null;
|
||||
} else {
|
||||
mWechatDisposable = null;
|
||||
}
|
||||
}
|
||||
|
||||
mWechatDisposable = Observable.interval(1, TimeUnit.SECONDS)
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.compose(RxLifecycle.bindUntilEvent(getLifecycleSubject(), ActivityEvent.DESTROY))
|
||||
.subscribe(new Consumer<Long>() {
|
||||
@Override
|
||||
public void accept(Long aLong) throws Exception {
|
||||
Log.e("initWechatCountdown", "accept:" + aLong);
|
||||
long nowTime = System.currentTimeMillis();
|
||||
Log.e("initWechatCountdown", "accept:" + nowTime);
|
||||
if (nowTime < time_expire * 1000 && !mWechatDisposable.isDisposed()) {
|
||||
Log.e("initWechatCountdown", "accept:" + time_expire);
|
||||
} else {
|
||||
mWechatDisposable.dispose();
|
||||
mWechatDisposable = null;
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private Disposable mOrderDisposable;
|
||||
|
||||
private void initOrderCountdown(String order_id, String order_sn) {
|
||||
if (mOrderDisposable != null) {
|
||||
if (!mOrderDisposable.isDisposed()) {
|
||||
mOrderDisposable.dispose();
|
||||
mOrderDisposable = null;
|
||||
} else {
|
||||
mOrderDisposable = null;
|
||||
}
|
||||
}
|
||||
mOrderDisposable = Observable.interval(3, TimeUnit.SECONDS)
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.compose(RxLifecycle.bindUntilEvent(getLifecycleSubject(), ActivityEvent.DESTROY))
|
||||
.subscribe(new Consumer<Long>() {
|
||||
@Override
|
||||
public void accept(Long aLong) throws Throwable {
|
||||
Log.e("initOrderCountdown", "accept:" + aLong);
|
||||
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public class BtnClick {
|
||||
public void exit(View view) {
|
||||
finish();
|
||||
}
|
||||
|
||||
public void buy(View view) {
|
||||
if (TextUtils.isEmpty(mId)) {
|
||||
Toaster.show("请先选择套餐");
|
||||
} else {
|
||||
Intent intent = new Intent(VipActivity.this, PayVipActivity.class);
|
||||
intent.putExtra("VipId", mId);
|
||||
startActivity(intent);
|
||||
}
|
||||
}
|
||||
|
||||
public void agreement(View view) {
|
||||
startActivity(new Intent(VipActivity.this, PrivacyActivity.class));
|
||||
}
|
||||
|
||||
public void code(View view) {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,68 @@
|
||||
package com.xwad.os.activity.vip.list;
|
||||
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.lifecycle.MutableLiveData;
|
||||
|
||||
import com.hjq.toast.Toaster;
|
||||
import com.trello.rxlifecycle4.RxLifecycle;
|
||||
import com.trello.rxlifecycle4.android.ActivityEvent;
|
||||
import com.xwad.os.base.mvvm.BaseViewModel;
|
||||
import com.xwad.os.bean.BaseResponse;
|
||||
import com.xwad.os.bean.VipInfo;
|
||||
import com.xwad.os.databinding.ActivityVipBinding;
|
||||
import com.xwad.os.network.NetInterfaceManager;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import io.reactivex.rxjava3.annotations.NonNull;
|
||||
import io.reactivex.rxjava3.core.Observer;
|
||||
import io.reactivex.rxjava3.disposables.Disposable;
|
||||
|
||||
public class VipViewModel extends BaseViewModel<ActivityVipBinding, ActivityEvent> {
|
||||
|
||||
@Override
|
||||
public ActivityVipBinding getVDBinding() {
|
||||
return binding;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
|
||||
}
|
||||
|
||||
public MutableLiveData<List<VipInfo>> mVipInfoListData = new MutableLiveData<>();
|
||||
|
||||
public void getVipList() {
|
||||
NetInterfaceManager.getInstance().getVipListControl()
|
||||
.compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY))
|
||||
.subscribe(new Observer<BaseResponse<List<VipInfo>>>() {
|
||||
@Override
|
||||
public void onSubscribe(@NonNull Disposable d) {
|
||||
Log.e("getVipList", "onSubscribe: ");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNext(@NonNull BaseResponse<List<VipInfo>> listBaseResponse) {
|
||||
Log.e("getVipList", "onNext: " + listBaseResponse);
|
||||
if (listBaseResponse.code == 200) {
|
||||
List<VipInfo> vipInfos = listBaseResponse.data;
|
||||
mVipInfoListData.setValue(vipInfos);
|
||||
} else {
|
||||
Toaster.show(listBaseResponse.msg);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(@NonNull Throwable e) {
|
||||
Log.e("getVipList", "onError: " + e.getMessage());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onComplete() {
|
||||
Log.e("getVipList", "onComplete: ");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,142 @@
|
||||
package com.xwad.os.activity.vip.pay;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.graphics.Bitmap;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.lifecycle.Observer;
|
||||
|
||||
import com.trello.rxlifecycle4.RxLifecycle;
|
||||
import com.trello.rxlifecycle4.android.ActivityEvent;
|
||||
import com.xwad.os.R;
|
||||
import com.xwad.os.base.mvvm.BaseMvvmActivity;
|
||||
import com.xwad.os.bean.OrderInfo;
|
||||
import com.xwad.os.bean.PayInfo;
|
||||
import com.xwad.os.databinding.ActivityPayVipBinding;
|
||||
import com.xwad.os.utils.BitmapUtils;
|
||||
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
|
||||
import io.reactivex.rxjava3.core.Observable;
|
||||
import io.reactivex.rxjava3.disposables.Disposable;
|
||||
import io.reactivex.rxjava3.functions.Consumer;
|
||||
import io.reactivex.rxjava3.schedulers.Schedulers;
|
||||
|
||||
public class PayVipActivity extends BaseMvvmActivity<PayVipViewModel, ActivityPayVipBinding> {
|
||||
|
||||
private String mVipId;
|
||||
|
||||
@Override
|
||||
public boolean setNightMode() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean setfitWindow() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getLayoutId() {
|
||||
return R.layout.activity_pay_vip;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void initDataBinding() {
|
||||
mViewModel.setCtx(this);
|
||||
mViewModel.setVDBinding(mViewDataBinding);
|
||||
mViewModel.setLifecycle(getLifecycleSubject());
|
||||
mViewDataBinding.setClick(new BtnClick());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void initView() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void initData() {
|
||||
mViewModel.mOrderInfoData.observe(this, new Observer<OrderInfo>() {
|
||||
@Override
|
||||
public void onChanged(OrderInfo orderInfo) {
|
||||
if (orderInfo != null) {
|
||||
mViewModel.getQrCodeUrl(orderInfo.getOrder_sn());
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
mViewModel.mPayInfoData.observe(this, new Observer<PayInfo>() {
|
||||
@Override
|
||||
public void onChanged(PayInfo payInfo) {
|
||||
if (payInfo != null) {
|
||||
String url = payInfo.getCode_url();
|
||||
long expireTime = payInfo.getTime_expire();
|
||||
initWechatCountdown(expireTime);
|
||||
Bitmap bitmap = BitmapUtils.createQRImage(url, 400, getColor(R.color.black), getColor(R.color.white));
|
||||
mViewDataBinding.ivQrcode.setImageBitmap(bitmap);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
Intent intent = getIntent();
|
||||
mVipId = intent.getStringExtra("VipId");
|
||||
if (!TextUtils.isEmpty(mVipId)) {
|
||||
mViewModel.getPayInfo(mVipId);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDestroy() {
|
||||
super.onDestroy();
|
||||
dispose();
|
||||
}
|
||||
|
||||
private void dispose() {
|
||||
if (mWechatDisposable != null && !mWechatDisposable.isDisposed()) {
|
||||
mWechatDisposable.dispose();
|
||||
mWechatDisposable = null;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private Disposable mWechatDisposable;
|
||||
|
||||
private void initWechatCountdown(long time_expire) {
|
||||
if (mWechatDisposable != null) {
|
||||
if (!mWechatDisposable.isDisposed()) {
|
||||
mWechatDisposable.dispose();
|
||||
mWechatDisposable = null;
|
||||
} else {
|
||||
mWechatDisposable = null;
|
||||
}
|
||||
}
|
||||
|
||||
mWechatDisposable = Observable.interval(1, TimeUnit.SECONDS)
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.compose(RxLifecycle.bindUntilEvent(getLifecycleSubject(), ActivityEvent.DESTROY))
|
||||
.subscribe(new Consumer<Long>() {
|
||||
@Override
|
||||
public void accept(Long aLong) throws Exception {
|
||||
Log.e("initWechatCountdown", "accept:" + aLong);
|
||||
long nowTime = System.currentTimeMillis();
|
||||
Log.e("initWechatCountdown", "accept:" + nowTime);
|
||||
if (nowTime < time_expire * 1000 && !mWechatDisposable.isDisposed()) {
|
||||
Log.e("initWechatCountdown", "accept:" + time_expire);
|
||||
} else {
|
||||
mWechatDisposable.dispose();
|
||||
mWechatDisposable = null;
|
||||
mViewModel.getPayInfo(mVipId);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public class BtnClick {
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,95 @@
|
||||
package com.xwad.os.activity.vip.pay;
|
||||
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.lifecycle.MutableLiveData;
|
||||
|
||||
import com.hjq.toast.Toaster;
|
||||
import com.trello.rxlifecycle4.RxLifecycle;
|
||||
import com.trello.rxlifecycle4.android.ActivityEvent;
|
||||
import com.xwad.os.base.mvvm.BaseViewModel;
|
||||
import com.xwad.os.bean.BaseResponse;
|
||||
import com.xwad.os.bean.OrderInfo;
|
||||
import com.xwad.os.bean.PayInfo;
|
||||
import com.xwad.os.databinding.ActivityPayVipBinding;
|
||||
import com.xwad.os.network.NetInterfaceManager;
|
||||
|
||||
import io.reactivex.rxjava3.annotations.NonNull;
|
||||
import io.reactivex.rxjava3.core.Observer;
|
||||
import io.reactivex.rxjava3.disposables.Disposable;
|
||||
|
||||
public class PayVipViewModel extends BaseViewModel<ActivityPayVipBinding, ActivityEvent> {
|
||||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
|
||||
}
|
||||
|
||||
public MutableLiveData<OrderInfo> mOrderInfoData = new MutableLiveData<>();
|
||||
|
||||
public void getPayInfo(String vipId) {
|
||||
NetInterfaceManager.getInstance().getBuyVipControl(vipId)
|
||||
.compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY))
|
||||
.subscribe(new Observer<BaseResponse<OrderInfo>>() {
|
||||
@Override
|
||||
public void onSubscribe(@NonNull Disposable d) {
|
||||
Log.e("getPayUrl", "onSubscribe: ");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNext(@NonNull BaseResponse<OrderInfo> baseResponse) {
|
||||
Log.e("getPayUrl", "onNext: " + baseResponse);
|
||||
if (baseResponse.code == 200) {
|
||||
OrderInfo orderInfo = baseResponse.data;
|
||||
mOrderInfoData.setValue(orderInfo);
|
||||
} else {
|
||||
Toaster.show(baseResponse.msg);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(@NonNull Throwable e) {
|
||||
Log.e("getPayUrl", "onError: " + e.getMessage());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onComplete() {
|
||||
Log.e("getPayUrl", "onComplete: ");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public MutableLiveData<PayInfo> mPayInfoData = new MutableLiveData<>();
|
||||
|
||||
public void getQrCodeUrl(String orderSn) {
|
||||
NetInterfaceManager.getInstance().getPayQrcodeControl(orderSn)
|
||||
.compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY))
|
||||
.subscribe(new Observer<BaseResponse<PayInfo>>() {
|
||||
@Override
|
||||
public void onSubscribe(@NonNull Disposable d) {
|
||||
Log.e("getQrCodeUrl", "onSubscribe: ");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNext(@NonNull BaseResponse<PayInfo> baseResponse) {
|
||||
Log.e("getQrCodeUrl", "onNext: " + baseResponse);
|
||||
if (baseResponse.code == 200) {
|
||||
PayInfo payInfo = baseResponse.data;
|
||||
mPayInfoData.setValue(payInfo);
|
||||
} else {
|
||||
Toaster.show(baseResponse.data);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(@NonNull Throwable e) {
|
||||
Log.e("getQrCodeUrl", "onError: " + e.getMessage());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onComplete() {
|
||||
Log.e("getQrCodeUrl", "onComplete: ");
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
98
app/src/main/java/com/xwad/os/adapter/VipAdapter.java
Normal file
@@ -0,0 +1,98 @@
|
||||
package com.xwad.os.adapter;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.Paint;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.xwad.os.R;
|
||||
import com.xwad.os.bean.VipInfo;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
public class VipAdapter extends RecyclerView.Adapter<VipAdapter.VipHolder> {
|
||||
private Context mContext;
|
||||
|
||||
private List<VipInfo> mVipInfos;
|
||||
private String mSelectId = "";
|
||||
|
||||
public void setVipInfos(List<VipInfo> vipInfos) {
|
||||
mVipInfos = vipInfos;
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
|
||||
public interface VipSelectListener {
|
||||
void onVipSelect(VipInfo vipInfo);
|
||||
}
|
||||
|
||||
private VipSelectListener mVipSelectListener;
|
||||
|
||||
public void setVipSelectListener(VipSelectListener vipSelectListener) {
|
||||
mVipSelectListener = vipSelectListener;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public VipHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
||||
mContext = parent.getContext();
|
||||
return new VipHolder(LayoutInflater.from(mContext).inflate(R.layout.item_vip, parent, false));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBindViewHolder(@NonNull VipHolder holder, int position) {
|
||||
VipInfo vipInfo = mVipInfos.get(position);
|
||||
String id = vipInfo.getId();
|
||||
String name = vipInfo.getName();
|
||||
int year = vipInfo.getYear();
|
||||
String price = vipInfo.getPrice();
|
||||
String origin_price = vipInfo.getOrigin_price();
|
||||
|
||||
holder.tv_combo_name.setText(name);
|
||||
holder.tv_year.setText(String.format(mContext.getString(R.string.validity_period), year));
|
||||
holder.tv_price.setText("现价:¥" + price);
|
||||
holder.tv_origin_price.setText("原价:¥" + origin_price);
|
||||
|
||||
holder.tv_origin_price.getPaint().setFlags(Paint.STRIKE_THRU_TEXT_FLAG | Paint.ANTI_ALIAS_FLAG);
|
||||
holder.root.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
mSelectId = id;
|
||||
if (mVipSelectListener != null) {
|
||||
mVipSelectListener.onVipSelect(vipInfo);
|
||||
}
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
});
|
||||
if (Objects.equals(mSelectId, id)) {
|
||||
holder.root.setBackground(mContext.getDrawable(R.drawable.bg_vip_select));
|
||||
} else {
|
||||
holder.root.setBackground(mContext.getDrawable(R.drawable.bg_vip_unselect));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getItemCount() {
|
||||
return mVipInfos == null ? 0 : mVipInfos.size();
|
||||
}
|
||||
|
||||
public class VipHolder extends RecyclerView.ViewHolder {
|
||||
LinearLayout root;
|
||||
TextView tv_combo_name, tv_year, tv_price, tv_origin_price;
|
||||
|
||||
public VipHolder(@NonNull View itemView) {
|
||||
super(itemView);
|
||||
root = itemView.findViewById(R.id.root);
|
||||
tv_combo_name = itemView.findViewById(R.id.tv_combo_name);
|
||||
tv_year = itemView.findViewById(R.id.tv_year);
|
||||
tv_price = itemView.findViewById(R.id.tv_price);
|
||||
tv_origin_price = itemView.findViewById(R.id.tv_origin_price);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -23,6 +23,7 @@ import com.xwad.os.alarm.AlarmUtils;
|
||||
import com.xwad.os.manager.AmapManager;
|
||||
import com.xwad.os.manager.AppManager;
|
||||
import com.xwad.os.manager.ConnectManager;
|
||||
import com.xwad.os.manager.DeviceSNManager;
|
||||
import com.xwad.os.manager.RemoteManager;
|
||||
import com.xwad.os.network.NetInterfaceManager;
|
||||
import com.xwad.os.push.PushManager;
|
||||
@@ -85,7 +86,7 @@ public class BaseApplication extends Application {
|
||||
LenovoCsdkUtil.init(this);
|
||||
|
||||
CrashReport.initCrashReport(getApplicationContext(), "d1cd982951", false);
|
||||
CrashReport.setDeviceId(BaseApplication.this, RemoteManager.getInstance().getSerial());
|
||||
CrashReport.setDeviceId(BaseApplication.this, DeviceSNManager.getDeviceSN());
|
||||
|
||||
// 初始化 Toast 框架
|
||||
Toaster.init(this);
|
||||
|
||||
44
app/src/main/java/com/xwad/os/base/BaseDialogFragment.java
Normal file
@@ -0,0 +1,44 @@
|
||||
package com.xwad.os.base;
|
||||
|
||||
import android.os.Bundle;
|
||||
|
||||
import com.xwad.os.base.rx.BaseRxDialogFragment;
|
||||
|
||||
public abstract class BaseDialogFragment extends BaseRxDialogFragment {
|
||||
|
||||
protected boolean isViewInitiated;
|
||||
protected boolean isVisibleToUser;
|
||||
protected boolean isDataInitiated;
|
||||
|
||||
|
||||
@Override
|
||||
public void onActivityCreated(Bundle savedInstanceState) {
|
||||
super.onActivityCreated(savedInstanceState);
|
||||
isViewInitiated = true;
|
||||
prepareFetchData();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setUserVisibleHint(boolean isVisibleToUser) {
|
||||
super.setUserVisibleHint(isVisibleToUser);
|
||||
this.isVisibleToUser = isVisibleToUser;
|
||||
prepareFetchData();
|
||||
}
|
||||
|
||||
public abstract void fetchData();
|
||||
|
||||
public boolean prepareFetchData() {
|
||||
return prepareFetchData(false);
|
||||
}
|
||||
|
||||
public boolean prepareFetchData(boolean forceUpdate) {
|
||||
if (isVisibleToUser && isViewInitiated && (!isDataInitiated || forceUpdate)) {
|
||||
fetchData();
|
||||
//注释掉保证每次都更新数据
|
||||
// isDataInitiated = true;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,184 @@
|
||||
package com.xwad.os.base.mvvm.fragment;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Context;
|
||||
import android.content.res.Configuration;
|
||||
import android.os.Bundle;
|
||||
import android.util.Log;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.inputmethod.InputMethodManager;
|
||||
import android.widget.EditText;
|
||||
|
||||
import androidx.annotation.LayoutRes;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.databinding.DataBindingUtil;
|
||||
import androidx.databinding.ViewDataBinding;
|
||||
import androidx.lifecycle.ViewModel;
|
||||
import androidx.lifecycle.ViewModelProvider;
|
||||
|
||||
import com.xwad.os.base.BaseDialogFragment;
|
||||
|
||||
import java.lang.ref.WeakReference;
|
||||
import java.lang.reflect.ParameterizedType;
|
||||
|
||||
/**
|
||||
* @author: lml
|
||||
* @date: 2021/12/15
|
||||
*/
|
||||
public abstract class BaseMvvmDialogFragment<VM extends ViewModel, VDB extends ViewDataBinding> extends BaseDialogFragment {
|
||||
protected String mTag = this.getClass().getSimpleName();
|
||||
/**
|
||||
* 是否顯示了
|
||||
*/
|
||||
protected boolean mIsVisible;
|
||||
/**
|
||||
* 是否準備好了-Created
|
||||
*/
|
||||
protected boolean mHasPrepare;
|
||||
|
||||
|
||||
protected VM mViewModel;
|
||||
protected VDB mViewDataBinding;
|
||||
protected Class<VM> vmClass;
|
||||
//
|
||||
// protected Toolbar toolbar;
|
||||
// protected View statusBarView;
|
||||
//
|
||||
protected Bundle bundle;//来自getArguments()
|
||||
protected Bundle savedInstanceState;
|
||||
|
||||
// protected Context context;
|
||||
|
||||
/**
|
||||
* 上下文
|
||||
*/
|
||||
private WeakReference<Context> ctx;
|
||||
|
||||
public Context getCtx() {
|
||||
return ctx == null ? null : ctx.get();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAttach(@NonNull Context context) {
|
||||
super.onAttach(context);
|
||||
// this.context = context;
|
||||
ctx = new WeakReference<>(context);
|
||||
}
|
||||
|
||||
/**
|
||||
* onCreate、onResume里不能调用
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public boolean isAttached() {
|
||||
boolean flag = getCtx() != null && isAdded();
|
||||
Log.e(" >> isAttached >>", "flag = " + flag);
|
||||
return flag;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
|
||||
//ViewDataBinding
|
||||
mViewDataBinding = DataBindingUtil.inflate(inflater, getLayoutId(), container, false);
|
||||
mViewDataBinding.setLifecycleOwner(this);
|
||||
|
||||
//ViewModel
|
||||
vmClass = (Class<VM>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
|
||||
mViewModel = new ViewModelProvider(this).get(vmClass);
|
||||
|
||||
return mViewDataBinding.getRoot();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
|
||||
super.onViewCreated(view, savedInstanceState);
|
||||
|
||||
initDataBinding();
|
||||
initView(bundle = getArguments());
|
||||
|
||||
initData(this.savedInstanceState = savedInstanceState);
|
||||
|
||||
if (mIsVisible) {
|
||||
onEnter();
|
||||
}
|
||||
mHasPrepare = true;
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroyView() {
|
||||
super.onDestroyView();
|
||||
mHasPrepare = false;
|
||||
mViewDataBinding = null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setUserVisibleHint(boolean isVisibleToUser) {
|
||||
super.setUserVisibleHint(isVisibleToUser);
|
||||
if (mIsVisible == getUserVisibleHint())
|
||||
return;
|
||||
mIsVisible = getUserVisibleHint();
|
||||
if (mIsVisible) {
|
||||
if (!mHasPrepare)
|
||||
return;
|
||||
onEnter();
|
||||
} else {
|
||||
onExit();
|
||||
}
|
||||
}
|
||||
|
||||
@LayoutRes
|
||||
protected abstract int getLayoutId();
|
||||
|
||||
protected abstract void initDataBinding();
|
||||
|
||||
protected abstract void initView(Bundle bundle);
|
||||
|
||||
protected abstract void initData(Bundle savedInstanceState);
|
||||
|
||||
@Override
|
||||
public void onConfigurationChanged(Configuration newConfig) {
|
||||
super.onConfigurationChanged(newConfig);
|
||||
}
|
||||
|
||||
protected void hideInputMethod(Activity activity) {
|
||||
InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
|
||||
View view = activity.getCurrentFocus();
|
||||
if (view != null) {
|
||||
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
|
||||
}
|
||||
}
|
||||
|
||||
protected void hideInputMethod(Activity activity, EditText editText) {
|
||||
InputMethodManager imm = (InputMethodManager) editText.getContext().getSystemService(Activity.INPUT_METHOD_SERVICE);
|
||||
View view = activity.getCurrentFocus();
|
||||
if (view != null) {
|
||||
imm.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
|
||||
}
|
||||
}
|
||||
|
||||
protected void showInputMethod(EditText editText) {
|
||||
InputMethodManager imm = (InputMethodManager) editText.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
|
||||
imm.showSoftInput(editText, InputMethodManager.SHOW_FORCED);
|
||||
}
|
||||
|
||||
/**
|
||||
* 進入界面
|
||||
*/
|
||||
protected void onEnter() {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 離開界面
|
||||
*/
|
||||
protected void onExit() {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
123
app/src/main/java/com/xwad/os/base/rx/BaseRxDialogFragment.java
Normal file
@@ -0,0 +1,123 @@
|
||||
package com.xwad.os.base.rx;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.view.View;
|
||||
|
||||
import androidx.annotation.CallSuper;
|
||||
import androidx.annotation.CheckResult;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.fragment.app.DialogFragment;
|
||||
|
||||
import com.trello.rxlifecycle4.LifecycleProvider;
|
||||
import com.trello.rxlifecycle4.LifecycleTransformer;
|
||||
import com.trello.rxlifecycle4.RxLifecycle;
|
||||
import com.trello.rxlifecycle4.android.FragmentEvent;
|
||||
import com.trello.rxlifecycle4.android.RxLifecycleAndroid;
|
||||
|
||||
import io.reactivex.rxjava3.core.Observable;
|
||||
import io.reactivex.rxjava3.subjects.BehaviorSubject;
|
||||
|
||||
/**
|
||||
* {@link com.trello.rxlifecycle4.components.RxFragment}
|
||||
* copied form RxFragment}
|
||||
*/
|
||||
public class BaseRxDialogFragment extends DialogFragment implements LifecycleProvider<FragmentEvent> {
|
||||
private final BehaviorSubject<FragmentEvent> lifecycleSubject = BehaviorSubject.create();
|
||||
|
||||
public BehaviorSubject<FragmentEvent> getLifecycleSubject() {
|
||||
return lifecycleSubject;
|
||||
}
|
||||
|
||||
@Override
|
||||
@NonNull
|
||||
@CheckResult
|
||||
public final Observable<FragmentEvent> lifecycle() {
|
||||
return lifecycleSubject.hide();
|
||||
}
|
||||
|
||||
@Override
|
||||
@NonNull
|
||||
@CheckResult
|
||||
public final <T> LifecycleTransformer<T> bindUntilEvent(@NonNull FragmentEvent event) {
|
||||
return RxLifecycle.bindUntilEvent(lifecycleSubject, event);
|
||||
}
|
||||
|
||||
@Override
|
||||
@NonNull
|
||||
@CheckResult
|
||||
public final <T> LifecycleTransformer<T> bindToLifecycle() {
|
||||
return RxLifecycleAndroid.bindFragment(lifecycleSubject);
|
||||
}
|
||||
|
||||
@Override
|
||||
@CallSuper
|
||||
public void onAttach(android.app.Activity activity) {
|
||||
super.onAttach(activity);
|
||||
lifecycleSubject.onNext(FragmentEvent.ATTACH);
|
||||
}
|
||||
|
||||
@Override
|
||||
@CallSuper
|
||||
public void onCreate(@Nullable Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
lifecycleSubject.onNext(FragmentEvent.CREATE);
|
||||
}
|
||||
|
||||
@Override
|
||||
@CallSuper
|
||||
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
|
||||
super.onViewCreated(view, savedInstanceState);
|
||||
lifecycleSubject.onNext(FragmentEvent.CREATE_VIEW);
|
||||
}
|
||||
|
||||
@Override
|
||||
@CallSuper
|
||||
public void onStart() {
|
||||
super.onStart();
|
||||
lifecycleSubject.onNext(FragmentEvent.START);
|
||||
}
|
||||
|
||||
@Override
|
||||
@CallSuper
|
||||
public void onResume() {
|
||||
super.onResume();
|
||||
lifecycleSubject.onNext(FragmentEvent.RESUME);
|
||||
}
|
||||
|
||||
@Override
|
||||
@CallSuper
|
||||
public void onPause() {
|
||||
lifecycleSubject.onNext(FragmentEvent.PAUSE);
|
||||
super.onPause();
|
||||
}
|
||||
|
||||
@Override
|
||||
@CallSuper
|
||||
public void onStop() {
|
||||
lifecycleSubject.onNext(FragmentEvent.STOP);
|
||||
super.onStop();
|
||||
}
|
||||
|
||||
@Override
|
||||
@CallSuper
|
||||
public void onDestroyView() {
|
||||
lifecycleSubject.onNext(FragmentEvent.DESTROY_VIEW);
|
||||
super.onDestroyView();
|
||||
}
|
||||
|
||||
@Override
|
||||
@CallSuper
|
||||
public void onDestroy() {
|
||||
lifecycleSubject.onNext(FragmentEvent.DESTROY);
|
||||
super.onDestroy();
|
||||
}
|
||||
|
||||
@Override
|
||||
@CallSuper
|
||||
public void onDetach() {
|
||||
lifecycleSubject.onNext(FragmentEvent.DETACH);
|
||||
super.onDetach();
|
||||
}
|
||||
}
|
||||
|
||||
55
app/src/main/java/com/xwad/os/bean/LoginInfo.java
Normal file
@@ -0,0 +1,55 @@
|
||||
package com.xwad.os.bean;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import com.google.gson.Gson;
|
||||
import com.google.gson.JsonParser;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
public class LoginInfo implements Serializable {
|
||||
private static final long serialVersionUID = -1274385918936999804L;
|
||||
|
||||
String token;
|
||||
String mobile;
|
||||
int id;
|
||||
LoginInfoDevice device;
|
||||
|
||||
public String getToken() {
|
||||
return token;
|
||||
}
|
||||
|
||||
public void setToken(String token) {
|
||||
this.token = token;
|
||||
}
|
||||
|
||||
public String getMobile() {
|
||||
return mobile;
|
||||
}
|
||||
|
||||
public void setMobile(String mobile) {
|
||||
this.mobile = mobile;
|
||||
}
|
||||
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(int id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public LoginInfoDevice getDevice() {
|
||||
return device;
|
||||
}
|
||||
|
||||
public void setDevice(LoginInfoDevice device) {
|
||||
this.device = device;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public String toString() {
|
||||
return JsonParser.parseString(new Gson().toJson(this)).getAsJsonObject().toString();
|
||||
}
|
||||
}
|
||||
37
app/src/main/java/com/xwad/os/bean/LoginInfoDevice.java
Normal file
@@ -0,0 +1,37 @@
|
||||
package com.xwad.os.bean;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import com.google.gson.Gson;
|
||||
import com.google.gson.JsonParser;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
public class LoginInfoDevice implements Serializable {
|
||||
private static final long serialVersionUID = -6466237943128805876L;
|
||||
|
||||
int id;
|
||||
String sn;
|
||||
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(int id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getSn() {
|
||||
return sn;
|
||||
}
|
||||
|
||||
public void setSn(String sn) {
|
||||
this.sn = sn;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public String toString() {
|
||||
return JsonParser.parseString(new Gson().toJson(this)).getAsJsonObject().toString();
|
||||
}
|
||||
}
|
||||
55
app/src/main/java/com/xwad/os/bean/OrderInfo.java
Normal file
@@ -0,0 +1,55 @@
|
||||
package com.xwad.os.bean;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import com.google.gson.Gson;
|
||||
import com.google.gson.JsonParser;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
public class OrderInfo implements Serializable {
|
||||
private static final long serialVersionUID = 3912597539259754298L;
|
||||
|
||||
int order_id;
|
||||
String order_sn;
|
||||
String sn;
|
||||
String vip_level_id;
|
||||
|
||||
public int getOrder_id() {
|
||||
return order_id;
|
||||
}
|
||||
|
||||
public void setOrder_id(int order_id) {
|
||||
this.order_id = order_id;
|
||||
}
|
||||
|
||||
public String getOrder_sn() {
|
||||
return order_sn;
|
||||
}
|
||||
|
||||
public void setOrder_sn(String order_sn) {
|
||||
this.order_sn = order_sn;
|
||||
}
|
||||
|
||||
public String getSn() {
|
||||
return sn;
|
||||
}
|
||||
|
||||
public void setSn(String sn) {
|
||||
this.sn = sn;
|
||||
}
|
||||
|
||||
public String getVip_level_id() {
|
||||
return vip_level_id;
|
||||
}
|
||||
|
||||
public void setVip_level_id(String vip_level_id) {
|
||||
this.vip_level_id = vip_level_id;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public String toString() {
|
||||
return JsonParser.parseString(new Gson().toJson(this)).getAsJsonObject().toString();
|
||||
}
|
||||
}
|
||||
46
app/src/main/java/com/xwad/os/bean/PayInfo.java
Normal file
@@ -0,0 +1,46 @@
|
||||
package com.xwad.os.bean;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import com.google.gson.Gson;
|
||||
import com.google.gson.JsonParser;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
public class PayInfo implements Serializable {
|
||||
private static final long serialVersionUID = -3399598160427270467L;
|
||||
|
||||
String price;
|
||||
String code_url;
|
||||
long time_expire;
|
||||
|
||||
public String getPrice() {
|
||||
return price;
|
||||
}
|
||||
|
||||
public void setPrice(String price) {
|
||||
this.price = price;
|
||||
}
|
||||
|
||||
public String getCode_url() {
|
||||
return code_url;
|
||||
}
|
||||
|
||||
public void setCode_url(String code_url) {
|
||||
this.code_url = code_url;
|
||||
}
|
||||
|
||||
public long getTime_expire() {
|
||||
return time_expire;
|
||||
}
|
||||
|
||||
public void setTime_expire(long time_expire) {
|
||||
this.time_expire = time_expire;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public String toString() {
|
||||
return JsonParser.parseString(new Gson().toJson(this)).getAsJsonObject().toString();
|
||||
}
|
||||
}
|
||||
83
app/src/main/java/com/xwad/os/bean/UserInfo.java
Normal file
@@ -0,0 +1,83 @@
|
||||
package com.xwad.os.bean;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import com.google.gson.Gson;
|
||||
import com.google.gson.JsonParser;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
public class UserInfo implements Serializable {
|
||||
private static final long serialVersionUID = -260785307483060956L;
|
||||
|
||||
int id;
|
||||
String username;
|
||||
int status;
|
||||
int vip_level_id;
|
||||
String mobile;
|
||||
String expire_at;
|
||||
VipLevel vip_level;
|
||||
|
||||
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(int id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getUsername() {
|
||||
return username;
|
||||
}
|
||||
|
||||
public void setUsername(String username) {
|
||||
this.username = username;
|
||||
}
|
||||
|
||||
public int getStatus() {
|
||||
return status;
|
||||
}
|
||||
|
||||
public void setStatus(int status) {
|
||||
this.status = status;
|
||||
}
|
||||
|
||||
public int getVip_level_id() {
|
||||
return vip_level_id;
|
||||
}
|
||||
|
||||
public void setVip_level_id(int vip_level_id) {
|
||||
this.vip_level_id = vip_level_id;
|
||||
}
|
||||
|
||||
public String getMobile() {
|
||||
return mobile;
|
||||
}
|
||||
|
||||
public void setMobile(String mobile) {
|
||||
this.mobile = mobile;
|
||||
}
|
||||
|
||||
public String getExpire_at() {
|
||||
return expire_at;
|
||||
}
|
||||
|
||||
public void setExpire_at(String expire_at) {
|
||||
this.expire_at = expire_at;
|
||||
}
|
||||
|
||||
public VipLevel getVip_level() {
|
||||
return vip_level;
|
||||
}
|
||||
|
||||
public void setVip_level(VipLevel vip_level) {
|
||||
this.vip_level = vip_level;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public String toString() {
|
||||
return JsonParser.parseString(new Gson().toJson(this)).getAsJsonObject().toString();
|
||||
}
|
||||
}
|
||||
73
app/src/main/java/com/xwad/os/bean/VipInfo.java
Normal file
@@ -0,0 +1,73 @@
|
||||
package com.xwad.os.bean;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import com.google.gson.Gson;
|
||||
import com.google.gson.JsonParser;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
public class VipInfo implements Serializable {
|
||||
private static final long serialVersionUID = 5319505910193277865L;
|
||||
|
||||
String id;
|
||||
String name;
|
||||
String img;
|
||||
int year;
|
||||
String price;
|
||||
String origin_price;
|
||||
|
||||
public String getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(String id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public String getImg() {
|
||||
return img;
|
||||
}
|
||||
|
||||
public void setImg(String img) {
|
||||
this.img = img;
|
||||
}
|
||||
|
||||
public int getYear() {
|
||||
return year;
|
||||
}
|
||||
|
||||
public void setYear(int year) {
|
||||
this.year = year;
|
||||
}
|
||||
|
||||
public String getPrice() {
|
||||
return price;
|
||||
}
|
||||
|
||||
public void setPrice(String price) {
|
||||
this.price = price;
|
||||
}
|
||||
|
||||
public String getOrigin_price() {
|
||||
return origin_price;
|
||||
}
|
||||
|
||||
public void setOrigin_price(String origin_price) {
|
||||
this.origin_price = origin_price;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public String toString() {
|
||||
return JsonParser.parseString(new Gson().toJson(this)).getAsJsonObject().toString();
|
||||
}
|
||||
}
|
||||
37
app/src/main/java/com/xwad/os/bean/VipLevel.java
Normal file
@@ -0,0 +1,37 @@
|
||||
package com.xwad.os.bean;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import com.google.gson.Gson;
|
||||
import com.google.gson.JsonParser;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
public class VipLevel implements Serializable {
|
||||
private static final long serialVersionUID = 317188760579268253L;
|
||||
|
||||
int id;
|
||||
String name;
|
||||
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(int id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public String toString() {
|
||||
return JsonParser.parseString(new Gson().toJson(this)).getAsJsonObject().toString();
|
||||
}
|
||||
}
|
||||
@@ -5,6 +5,7 @@ public class CommonConfig {
|
||||
|
||||
public static final String CLOUD_LESSON_SETTINGS_KEY = "cloud_lesson_settings_key";
|
||||
|
||||
@Deprecated
|
||||
public static final String isLogined = "isLogined";
|
||||
public static final String AES_KEY = "xqdep8exnafpef3d";
|
||||
|
||||
@@ -61,4 +62,11 @@ public class CommonConfig {
|
||||
|
||||
public static final String APPOINT_PERIOD_NAME = "appoint_period_name_key";
|
||||
|
||||
public static final String ACCOUNT_LOGIN_STATU = "account_login_statu_key";
|
||||
public static final String ACCOUNT_LOGIN_TOKEN = "account_login_token_key";
|
||||
public static final String ACCOUNT_LOGIN_MOBILE = "account_login_mobile_key";
|
||||
public static final String ACCOUNT_LOGIN_ID = "account_login_id_key";
|
||||
|
||||
public static final String ACCOUNT_DEVICE_ID = "account_device_id_key";
|
||||
public static final String ACCOUNT_DEVICE_SN = "account_device_sn_key";
|
||||
}
|
||||
|
||||
@@ -15,6 +15,7 @@ import androidx.fragment.app.Fragment;
|
||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
|
||||
import com.blankj.utilcode.util.NetworkUtils;
|
||||
import com.bumptech.glide.Glide;
|
||||
import com.chad.library.adapter.base.BaseQuickAdapter;
|
||||
import com.chad.library.adapter.base.BaseViewHolder;
|
||||
import com.google.gson.Gson;
|
||||
@@ -22,9 +23,11 @@ import com.google.gson.reflect.TypeToken;
|
||||
import com.xwad.os.R;
|
||||
import com.xwad.os.base.mvvm.fragment.BaseMvvmFragment;
|
||||
import com.xwad.os.bean.jxw.ItemsBean;
|
||||
import com.xwad.os.bean.jxw.TbddBookBean;
|
||||
import com.xwad.os.databinding.FragmentChineseBinding;
|
||||
import com.xwad.os.jxw.AssertUtils;
|
||||
import com.xwad.os.jxw.SPUtils;
|
||||
import com.xwad.os.jxw.TbddProviderUtil;
|
||||
import com.xwad.os.jxw.util.Util;
|
||||
import com.xwad.os.manager.AmapManager;
|
||||
import com.xwad.os.utils.OpenApkUtils;
|
||||
@@ -191,6 +194,7 @@ public class ChineseFragment extends BaseMvvmFragment<ChineseViewModel, Fragment
|
||||
public void fetchData() {
|
||||
Log.e(TAG, "fetchData: ");
|
||||
AmapManager.getInstance().startLocation();
|
||||
load();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -216,6 +220,7 @@ public class ChineseFragment extends BaseMvvmFragment<ChineseViewModel, Fragment
|
||||
@Override
|
||||
public void onResume() {
|
||||
super.onResume();
|
||||
load();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -248,6 +253,22 @@ public class ChineseFragment extends BaseMvvmFragment<ChineseViewModel, Fragment
|
||||
mViewDataBinding.ivTabJdbk.setVisibility(View.INVISIBLE);
|
||||
}
|
||||
|
||||
private void load() {
|
||||
TbddBookBean tbddData = TbddProviderUtil.getTbddData("语文", "", "");
|
||||
try {
|
||||
if (tbddData != null) {
|
||||
mViewDataBinding.ivZb.setVisibility(View.VISIBLE);
|
||||
Glide.with(mContext).load(tbddData.getCoverUrl()).into(mViewDataBinding.ivCover);
|
||||
} else {
|
||||
mViewDataBinding.ivZb.setVisibility(View.GONE);
|
||||
mViewDataBinding.ivCover.setBackgroundResource(R.drawable.icon_yw_tjsb);
|
||||
}
|
||||
} catch (Exception unused) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void getMyList() {
|
||||
File fileStreamPath = mContext.getFileStreamPath(FILE_NAME);
|
||||
if (fileStreamPath.exists()) {
|
||||
|
||||
@@ -144,6 +144,9 @@ public class ComplexFragment extends BaseMvvmFragment<ComplexViewModel, Fragment
|
||||
}
|
||||
|
||||
private void initViews() {
|
||||
if (mViewDataBinding == null) {
|
||||
return;
|
||||
}
|
||||
if ("小学".equals(Util.checkGrade(SPUtils.getGrade()))) {
|
||||
mViewDataBinding.rlXx.setVisibility(View.VISIBLE);
|
||||
mViewDataBinding.subjectViewPager.setVisibility(View.GONE);
|
||||
|
||||
@@ -0,0 +1,167 @@
|
||||
package com.xwad.os.fragment.dialog.login.account;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.graphics.Color;
|
||||
import android.graphics.drawable.ColorDrawable;
|
||||
import android.os.Bundle;
|
||||
import android.text.Editable;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
import android.view.Gravity;
|
||||
import android.view.View;
|
||||
import android.view.Window;
|
||||
import android.view.WindowManager;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.fragment.app.DialogFragment;
|
||||
import androidx.fragment.app.FragmentManager;
|
||||
import androidx.fragment.app.FragmentTransaction;
|
||||
import androidx.lifecycle.Observer;
|
||||
|
||||
import com.hjq.toast.Toaster;
|
||||
import com.xwad.os.R;
|
||||
import com.xwad.os.base.mvvm.fragment.BaseMvvmDialogFragment;
|
||||
import com.xwad.os.bean.LoginInfo;
|
||||
import com.xwad.os.databinding.FragmentDialogAccountLoginBinding;
|
||||
|
||||
public class AccountLoginDialogFragment extends BaseMvvmDialogFragment<AccountLoginViewModel, FragmentDialogAccountLoginBinding> {
|
||||
private static final String TAG = "LoginDialogFragment";
|
||||
|
||||
private Context mContext;
|
||||
private ClickCallback mClickCallback;
|
||||
|
||||
|
||||
public interface ClickCallback {
|
||||
void onCodeLoginClick();
|
||||
|
||||
void onLoginSuccessful();
|
||||
}
|
||||
|
||||
public AccountLoginDialogFragment(ClickCallback clickCallback) {
|
||||
this.mClickCallback = clickCallback;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getLayoutId() {
|
||||
return R.layout.fragment_dialog_account_login;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void initDataBinding() {
|
||||
mContext = getActivity();
|
||||
mViewModel.setCtx(getCtx());
|
||||
mViewModel.setLifecycle(getLifecycleSubject());
|
||||
mViewModel.setVDBinding(mViewDataBinding);
|
||||
mViewDataBinding.setClick(new BtnClick());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void initView(Bundle bundle) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void initData(Bundle savedInstanceState) {
|
||||
mViewModel.mLoginInfoData.observe(this, new Observer<LoginInfo>() {
|
||||
@Override
|
||||
public void onChanged(LoginInfo loginInfo) {
|
||||
Toaster.show("登录成功");
|
||||
if (mClickCallback != null) {
|
||||
mClickCallback.onLoginSuccessful();
|
||||
}
|
||||
dismiss();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void fetchData() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStart() {
|
||||
super.onStart();
|
||||
if (getDialog() != null) {
|
||||
Window window = getDialog().getWindow();
|
||||
if (window == null) return;
|
||||
WindowManager.LayoutParams params = window.getAttributes();
|
||||
params.width = WindowManager.LayoutParams.MATCH_PARENT;
|
||||
params.height = WindowManager.LayoutParams.WRAP_CONTENT;
|
||||
params.gravity = Gravity.CENTER;
|
||||
window.setAttributes(params);
|
||||
window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
|
||||
getDialog().setCancelable(true);
|
||||
getDialog().setCanceledOnTouchOutside(false);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void show(FragmentManager manager, String tag) {
|
||||
DialogFragment fragment = (DialogFragment) manager.findFragmentByTag(tag);
|
||||
if (fragment != null && fragment.isAdded()
|
||||
&& fragment.getDialog() != null && fragment.getDialog().isShowing()) {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
FragmentTransaction ft = manager.beginTransaction();
|
||||
ft.add(this, tag);
|
||||
ft.commitAllowingStateLoss();
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "show: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
super.onDestroy();
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDismiss(@NonNull DialogInterface dialog) {
|
||||
super.onDismiss(dialog);
|
||||
|
||||
}
|
||||
|
||||
public class BtnClick {
|
||||
public void login(View view) {
|
||||
Editable phoneEditable = mViewDataBinding.etPhone.getText();
|
||||
if (phoneEditable == null) {
|
||||
Toaster.show("请输入手机号");
|
||||
return;
|
||||
}
|
||||
String phone = phoneEditable.toString();
|
||||
if (TextUtils.isEmpty(phone)) {
|
||||
Toaster.show("请输入手机号");
|
||||
return;
|
||||
}
|
||||
Editable passwdEditable = mViewDataBinding.etPasswd.getText();
|
||||
if (passwdEditable == null) {
|
||||
Toaster.show("请输入密码");
|
||||
return;
|
||||
}
|
||||
String passwd = passwdEditable.toString();
|
||||
if (TextUtils.isEmpty(passwd)) {
|
||||
Toaster.show("请输入密码");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!mViewDataBinding.checkBox.isChecked()) {
|
||||
Toaster.show("请先同意用户协议");
|
||||
return;
|
||||
}
|
||||
|
||||
mViewModel.login(phone, passwd);
|
||||
|
||||
}
|
||||
|
||||
public void codeLogin(View view) {
|
||||
if (mClickCallback != null) {
|
||||
mClickCallback.onCodeLoginClick();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
package com.xwad.os.fragment.dialog.login.account;
|
||||
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.lifecycle.MutableLiveData;
|
||||
|
||||
import com.hjq.toast.Toaster;
|
||||
import com.tencent.mmkv.MMKV;
|
||||
import com.trello.rxlifecycle4.RxLifecycle;
|
||||
import com.trello.rxlifecycle4.android.FragmentEvent;
|
||||
import com.xwad.os.base.mvvm.BaseViewModel;
|
||||
import com.xwad.os.bean.BaseResponse;
|
||||
import com.xwad.os.bean.LoginInfo;
|
||||
import com.xwad.os.bean.LoginInfoDevice;
|
||||
import com.xwad.os.config.CommonConfig;
|
||||
import com.xwad.os.databinding.FragmentDialogAccountLoginBinding;
|
||||
import com.xwad.os.network.NetInterfaceManager;
|
||||
|
||||
import io.reactivex.rxjava3.annotations.NonNull;
|
||||
import io.reactivex.rxjava3.core.Observer;
|
||||
import io.reactivex.rxjava3.disposables.Disposable;
|
||||
|
||||
public class AccountLoginViewModel extends BaseViewModel<FragmentDialogAccountLoginBinding, FragmentEvent> {
|
||||
private static final String TAG = "LoginViewModel";
|
||||
|
||||
private MMKV mMMKV = MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE);
|
||||
|
||||
@Override
|
||||
public FragmentDialogAccountLoginBinding getVDBinding() {
|
||||
return binding;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
|
||||
}
|
||||
|
||||
public MutableLiveData<LoginInfo> mLoginInfoData = new MutableLiveData<>();
|
||||
|
||||
public void login(String phone, String passwd) {
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,184 @@
|
||||
package com.xwad.os.fragment.dialog.login.code;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.graphics.Color;
|
||||
import android.graphics.drawable.ColorDrawable;
|
||||
import android.os.Bundle;
|
||||
import android.text.Editable;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
import android.view.Gravity;
|
||||
import android.view.View;
|
||||
import android.view.Window;
|
||||
import android.view.WindowManager;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.fragment.app.DialogFragment;
|
||||
import androidx.fragment.app.FragmentManager;
|
||||
import androidx.fragment.app.FragmentTransaction;
|
||||
import androidx.lifecycle.Observer;
|
||||
|
||||
import com.hjq.toast.Toaster;
|
||||
import com.xwad.os.R;
|
||||
import com.xwad.os.base.mvvm.fragment.BaseMvvmDialogFragment;
|
||||
import com.xwad.os.bean.LoginInfo;
|
||||
import com.xwad.os.databinding.FragmentDialogCodeLoginBinding;
|
||||
import com.xwad.os.databinding.FragmentDialogCodeLoginBinding;
|
||||
|
||||
public class CodeLoginDialogFragment extends BaseMvvmDialogFragment<CodeLoginViewModel, FragmentDialogCodeLoginBinding> {
|
||||
private static final String TAG = "LoginDialogFragment";
|
||||
|
||||
private Context mContext;
|
||||
private ClickCallback mClickCallback;
|
||||
|
||||
|
||||
public interface ClickCallback {
|
||||
void onAccountLoginClick();
|
||||
}
|
||||
|
||||
public CodeLoginDialogFragment(ClickCallback clickCallback) {
|
||||
this.mClickCallback = clickCallback;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getLayoutId() {
|
||||
return R.layout.fragment_dialog_code_login;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void initDataBinding() {
|
||||
mContext = getActivity();
|
||||
mViewModel.setCtx(getCtx());
|
||||
mViewModel.setLifecycle(getLifecycleSubject());
|
||||
mViewModel.setVDBinding(mViewDataBinding);
|
||||
mViewDataBinding.setClick(new BtnClick());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void initView(Bundle bundle) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void initData(Bundle savedInstanceState) {
|
||||
mViewModel.mCodeData.observe(this, new Observer<Boolean>() {
|
||||
@Override
|
||||
public void onChanged(Boolean aBoolean) {
|
||||
if (aBoolean) {
|
||||
Toaster.show("短信发送成功");
|
||||
} else {
|
||||
Toaster.show("短信发送失败");
|
||||
}
|
||||
}
|
||||
});
|
||||
mViewModel.mLoginInfoData.observe(this, new Observer<LoginInfo>() {
|
||||
@Override
|
||||
public void onChanged(LoginInfo loginInfo) {
|
||||
Toaster.show("登录成功");
|
||||
dismiss();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void fetchData() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStart() {
|
||||
super.onStart();
|
||||
if (getDialog() != null) {
|
||||
Window window = getDialog().getWindow();
|
||||
if (window == null) return;
|
||||
WindowManager.LayoutParams params = window.getAttributes();
|
||||
params.width = WindowManager.LayoutParams.MATCH_PARENT;
|
||||
params.height = WindowManager.LayoutParams.WRAP_CONTENT;
|
||||
params.gravity = Gravity.CENTER;
|
||||
window.setAttributes(params);
|
||||
window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
|
||||
getDialog().setCancelable(true);
|
||||
getDialog().setCanceledOnTouchOutside(false);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void show(FragmentManager manager, String tag) {
|
||||
DialogFragment fragment = (DialogFragment) manager.findFragmentByTag(tag);
|
||||
if (fragment != null && fragment.isAdded()
|
||||
&& fragment.getDialog() != null && fragment.getDialog().isShowing()) {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
FragmentTransaction ft = manager.beginTransaction();
|
||||
ft.add(this, tag);
|
||||
ft.commitAllowingStateLoss();
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "show: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
super.onDestroy();
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDismiss(@NonNull DialogInterface dialog) {
|
||||
super.onDismiss(dialog);
|
||||
|
||||
}
|
||||
|
||||
public class BtnClick {
|
||||
public void getCode(View view) {
|
||||
Editable editable = mViewDataBinding.etPhone.getText();
|
||||
if (editable == null) {
|
||||
Toaster.show("请输入手机号");
|
||||
return;
|
||||
}
|
||||
String phone = editable.toString();
|
||||
if (TextUtils.isEmpty(phone)) {
|
||||
Toaster.show("请输入手机号");
|
||||
return;
|
||||
}
|
||||
mViewModel.getCode(phone);
|
||||
}
|
||||
|
||||
public void login(View view) {
|
||||
Editable phoneEditable = mViewDataBinding.etPhone.getText();
|
||||
if (phoneEditable == null) {
|
||||
Toaster.show("请输入手机号");
|
||||
return;
|
||||
}
|
||||
String phone = phoneEditable.toString();
|
||||
if (TextUtils.isEmpty(phone)) {
|
||||
Toaster.show("请输入手机号");
|
||||
return;
|
||||
}
|
||||
Editable codeEditable = mViewDataBinding.etCode.getText();
|
||||
if (codeEditable == null) {
|
||||
Toaster.show("请输入验证码");
|
||||
return;
|
||||
}
|
||||
String code = codeEditable.toString();
|
||||
if (TextUtils.isEmpty(code)) {
|
||||
Toaster.show("请输入验证码");
|
||||
return;
|
||||
}
|
||||
if (!mViewDataBinding.checkBox.isChecked()) {
|
||||
Toaster.show("请先同意用户协议");
|
||||
return;
|
||||
}
|
||||
mViewModel.codeLogin(phone, code);
|
||||
}
|
||||
|
||||
public void accountLogin(View view) {
|
||||
if (mClickCallback != null) {
|
||||
mClickCallback.onAccountLoginClick();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
package com.xwad.os.fragment.dialog.login.code;
|
||||
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.lifecycle.MutableLiveData;
|
||||
|
||||
import com.hjq.toast.Toaster;
|
||||
import com.tencent.mmkv.MMKV;
|
||||
import com.trello.rxlifecycle4.RxLifecycle;
|
||||
import com.trello.rxlifecycle4.android.FragmentEvent;
|
||||
import com.xwad.os.base.mvvm.BaseViewModel;
|
||||
import com.xwad.os.bean.BaseResponse;
|
||||
import com.xwad.os.bean.LoginInfo;
|
||||
import com.xwad.os.bean.LoginInfoDevice;
|
||||
import com.xwad.os.config.CommonConfig;
|
||||
import com.xwad.os.databinding.FragmentDialogCodeLoginBinding;
|
||||
import com.xwad.os.network.NetInterfaceManager;
|
||||
|
||||
import io.reactivex.rxjava3.annotations.NonNull;
|
||||
import io.reactivex.rxjava3.core.Observer;
|
||||
import io.reactivex.rxjava3.disposables.Disposable;
|
||||
|
||||
public class CodeLoginViewModel extends BaseViewModel<FragmentDialogCodeLoginBinding, FragmentEvent> {
|
||||
|
||||
private static final String TAG = "LoginViewModel";
|
||||
|
||||
private MMKV mMMKV = MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE);
|
||||
|
||||
@Override
|
||||
public FragmentDialogCodeLoginBinding getVDBinding() {
|
||||
return binding;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
|
||||
}
|
||||
|
||||
public MutableLiveData<Boolean> mCodeData = new MutableLiveData<>();
|
||||
|
||||
public void getCode(String phoneNumber) {
|
||||
|
||||
}
|
||||
|
||||
public MutableLiveData<LoginInfo> mLoginInfoData = new MutableLiveData<>();
|
||||
|
||||
public void codeLogin(String phone, String code) {
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,125 @@
|
||||
package com.xwad.os.fragment.dialog.login.logout;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.graphics.Color;
|
||||
import android.graphics.drawable.ColorDrawable;
|
||||
import android.os.Bundle;
|
||||
import android.util.Log;
|
||||
import android.view.Gravity;
|
||||
import android.view.View;
|
||||
import android.view.Window;
|
||||
import android.view.WindowManager;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.fragment.app.DialogFragment;
|
||||
import androidx.fragment.app.FragmentManager;
|
||||
import androidx.fragment.app.FragmentTransaction;
|
||||
|
||||
import com.xwad.os.R;
|
||||
import com.xwad.os.base.mvvm.fragment.BaseMvvmDialogFragment;
|
||||
import com.xwad.os.databinding.FragmentDialogLogoutBinding;
|
||||
|
||||
public class LogoutDialogFragment extends BaseMvvmDialogFragment<LogoutViewModel, FragmentDialogLogoutBinding> {
|
||||
private static final String TAG = "LoginDialogFragment";
|
||||
|
||||
private Context mContext;
|
||||
private ClickCallback mClickCallback;
|
||||
|
||||
|
||||
public interface ClickCallback {
|
||||
void onChangePasswdClick();
|
||||
}
|
||||
|
||||
public LogoutDialogFragment(ClickCallback clickCallback) {
|
||||
this.mClickCallback = clickCallback;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getLayoutId() {
|
||||
return R.layout.fragment_dialog_logout;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void initDataBinding() {
|
||||
mContext = getActivity();
|
||||
mViewModel.setCtx(getCtx());
|
||||
mViewModel.setLifecycle(getLifecycleSubject());
|
||||
mViewModel.setVDBinding(mViewDataBinding);
|
||||
mViewDataBinding.setClick(new BtnClick());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void initView(Bundle bundle) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void initData(Bundle savedInstanceState) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void fetchData() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStart() {
|
||||
super.onStart();
|
||||
if (getDialog() != null) {
|
||||
Window window = getDialog().getWindow();
|
||||
if (window == null) return;
|
||||
WindowManager.LayoutParams params = window.getAttributes();
|
||||
params.width = WindowManager.LayoutParams.MATCH_PARENT;
|
||||
params.height = WindowManager.LayoutParams.WRAP_CONTENT;
|
||||
params.gravity = Gravity.CENTER;
|
||||
window.setAttributes(params);
|
||||
window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
|
||||
getDialog().setCancelable(true);
|
||||
getDialog().setCanceledOnTouchOutside(true);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void show(FragmentManager manager, String tag) {
|
||||
DialogFragment fragment = (DialogFragment) manager.findFragmentByTag(tag);
|
||||
if (fragment != null && fragment.isAdded()
|
||||
&& fragment.getDialog() != null && fragment.getDialog().isShowing()) {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
FragmentTransaction ft = manager.beginTransaction();
|
||||
ft.add(this, tag);
|
||||
ft.commitAllowingStateLoss();
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "show: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
super.onDestroy();
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDismiss(@NonNull DialogInterface dialog) {
|
||||
super.onDismiss(dialog);
|
||||
|
||||
}
|
||||
|
||||
public class BtnClick {
|
||||
|
||||
public void logout(View view) {
|
||||
|
||||
}
|
||||
|
||||
public void changePasswd(View view) {
|
||||
if (mClickCallback != null) {
|
||||
mClickCallback.onChangePasswdClick();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
package com.xwad.os.fragment.dialog.login.logout;
|
||||
|
||||
import com.trello.rxlifecycle4.android.FragmentEvent;
|
||||
import com.xwad.os.base.mvvm.BaseViewModel;
|
||||
import com.xwad.os.databinding.FragmentDialogLogoutBinding;
|
||||
|
||||
public class LogoutViewModel extends BaseViewModel<FragmentDialogLogoutBinding, FragmentEvent> {
|
||||
|
||||
private static final String TAG = "LoginViewModel";
|
||||
|
||||
@Override
|
||||
public FragmentDialogLogoutBinding getVDBinding() {
|
||||
return binding;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,182 @@
|
||||
package com.xwad.os.fragment.dialog.login.passwd;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.graphics.Color;
|
||||
import android.graphics.drawable.ColorDrawable;
|
||||
import android.os.Bundle;
|
||||
import android.text.Editable;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
import android.view.Gravity;
|
||||
import android.view.View;
|
||||
import android.view.Window;
|
||||
import android.view.WindowManager;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.fragment.app.DialogFragment;
|
||||
import androidx.fragment.app.FragmentManager;
|
||||
import androidx.fragment.app.FragmentTransaction;
|
||||
import androidx.lifecycle.Observer;
|
||||
|
||||
import com.hjq.toast.Toaster;
|
||||
import com.xwad.os.R;
|
||||
import com.xwad.os.base.mvvm.fragment.BaseMvvmDialogFragment;
|
||||
import com.xwad.os.databinding.FragmentDialogPasswdBinding;
|
||||
|
||||
public class PasswdDialogFragment extends BaseMvvmDialogFragment<PasswdViewModel, FragmentDialogPasswdBinding> {
|
||||
private static final String TAG = "LoginDialogFragment";
|
||||
|
||||
private Context mContext;
|
||||
private ClickCallback mClickCallback;
|
||||
|
||||
|
||||
public interface ClickCallback {
|
||||
void onCodeLoginClick();
|
||||
}
|
||||
|
||||
public PasswdDialogFragment(ClickCallback clickCallback) {
|
||||
this.mClickCallback = clickCallback;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getLayoutId() {
|
||||
return R.layout.fragment_dialog_passwd;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void initDataBinding() {
|
||||
mContext = getActivity();
|
||||
mViewModel.setCtx(getCtx());
|
||||
mViewModel.setLifecycle(getLifecycleSubject());
|
||||
mViewModel.setVDBinding(mViewDataBinding);
|
||||
mViewDataBinding.setClick(new BtnClick());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void initView(Bundle bundle) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void initData(Bundle savedInstanceState) {
|
||||
mViewModel.mBooleanData.observe(this, new Observer<Boolean>() {
|
||||
@Override
|
||||
public void onChanged(Boolean aBoolean) {
|
||||
if (aBoolean) {
|
||||
Toaster.show("验证码发送成功");
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
mViewModel.mPasswdData.observe(this, new Observer<Boolean>() {
|
||||
@Override
|
||||
public void onChanged(Boolean aBoolean) {
|
||||
if (aBoolean) {
|
||||
Toaster.show("密码设置成功");
|
||||
dismiss();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void fetchData() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStart() {
|
||||
super.onStart();
|
||||
if (getDialog() != null) {
|
||||
Window window = getDialog().getWindow();
|
||||
if (window == null) return;
|
||||
WindowManager.LayoutParams params = window.getAttributes();
|
||||
params.width = WindowManager.LayoutParams.MATCH_PARENT;
|
||||
params.height = WindowManager.LayoutParams.WRAP_CONTENT;
|
||||
params.gravity = Gravity.CENTER;
|
||||
window.setAttributes(params);
|
||||
window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
|
||||
getDialog().setCancelable(true);
|
||||
getDialog().setCanceledOnTouchOutside(false);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void show(FragmentManager manager, String tag) {
|
||||
DialogFragment fragment = (DialogFragment) manager.findFragmentByTag(tag);
|
||||
if (fragment != null && fragment.isAdded()
|
||||
&& fragment.getDialog() != null && fragment.getDialog().isShowing()) {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
FragmentTransaction ft = manager.beginTransaction();
|
||||
ft.add(this, tag);
|
||||
ft.commitAllowingStateLoss();
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "show: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
super.onDestroy();
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDismiss(@NonNull DialogInterface dialog) {
|
||||
super.onDismiss(dialog);
|
||||
|
||||
}
|
||||
|
||||
public class BtnClick {
|
||||
public void login(View view) {
|
||||
Editable passwdEditable = mViewDataBinding.etPasswd.getText();
|
||||
if (passwdEditable == null) {
|
||||
Toaster.show("请输入新密码");
|
||||
return;
|
||||
}
|
||||
String passwd = passwdEditable.toString();
|
||||
if (TextUtils.isEmpty(passwd)) {
|
||||
Toaster.show("请输入新密码");
|
||||
return;
|
||||
}
|
||||
|
||||
Editable confirmPasswdEditable = mViewDataBinding.etConfirmPassword.getText();
|
||||
if (confirmPasswdEditable == null) {
|
||||
Toaster.show("请输入确认密码");
|
||||
return;
|
||||
}
|
||||
String confirmPasswd = confirmPasswdEditable.toString();
|
||||
if (TextUtils.isEmpty(confirmPasswd)) {
|
||||
Toaster.show("请输入确认密码");
|
||||
return;
|
||||
}
|
||||
|
||||
Editable codeEditable = mViewDataBinding.etCode.getText();
|
||||
if (codeEditable == null) {
|
||||
Toaster.show("请输入验证码");
|
||||
return;
|
||||
}
|
||||
String code = codeEditable.toString();
|
||||
if (TextUtils.isEmpty(code)) {
|
||||
Toaster.show("请输入验证码");
|
||||
return;
|
||||
}
|
||||
|
||||
mViewModel.setPasswd(passwd, confirmPasswd, code);
|
||||
}
|
||||
|
||||
public void getCode(View view) {
|
||||
mViewModel.getPasswdSmsCode();
|
||||
}
|
||||
|
||||
public void codeLogin(View view) {
|
||||
if (mClickCallback != null) {
|
||||
mClickCallback.onCodeLoginClick();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
package com.xwad.os.fragment.dialog.login.passwd;
|
||||
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.lifecycle.MutableLiveData;
|
||||
|
||||
import com.hjq.toast.Toaster;
|
||||
import com.trello.rxlifecycle4.RxLifecycle;
|
||||
import com.trello.rxlifecycle4.android.FragmentEvent;
|
||||
import com.xwad.os.base.mvvm.BaseViewModel;
|
||||
import com.xwad.os.bean.BaseResponse;
|
||||
import com.xwad.os.databinding.FragmentDialogPasswdBinding;
|
||||
import com.xwad.os.network.NetInterfaceManager;
|
||||
|
||||
import io.reactivex.rxjava3.annotations.NonNull;
|
||||
import io.reactivex.rxjava3.core.Observer;
|
||||
import io.reactivex.rxjava3.disposables.Disposable;
|
||||
|
||||
public class PasswdViewModel extends BaseViewModel<FragmentDialogPasswdBinding, FragmentEvent> {
|
||||
|
||||
private static final String TAG = "LoginViewModel";
|
||||
|
||||
@Override
|
||||
public FragmentDialogPasswdBinding getVDBinding() {
|
||||
return binding;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
|
||||
}
|
||||
|
||||
public MutableLiveData<Boolean> mBooleanData = new MutableLiveData<>();
|
||||
|
||||
|
||||
public void getPasswdSmsCode() {
|
||||
|
||||
}
|
||||
|
||||
public MutableLiveData<Boolean> mPasswdData = new MutableLiveData<>();
|
||||
|
||||
public void setPasswd(String password, String confirm_password, String code) {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,148 @@
|
||||
package com.xwad.os.fragment.dialog.login.statu;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.graphics.Color;
|
||||
import android.graphics.drawable.ColorDrawable;
|
||||
import android.os.Bundle;
|
||||
import android.util.Log;
|
||||
import android.view.Gravity;
|
||||
import android.view.View;
|
||||
import android.view.Window;
|
||||
import android.view.WindowManager;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.fragment.app.DialogFragment;
|
||||
import androidx.fragment.app.FragmentManager;
|
||||
import androidx.fragment.app.FragmentTransaction;
|
||||
|
||||
import com.tencent.mmkv.MMKV;
|
||||
import com.xwad.os.R;
|
||||
import com.xwad.os.base.mvvm.fragment.BaseMvvmDialogFragment;
|
||||
import com.xwad.os.config.CommonConfig;
|
||||
import com.xwad.os.databinding.FragmentDialogLoginStatuBinding;
|
||||
import com.xwad.os.fragment.dialog.login.passwd.PasswdDialogFragment;
|
||||
|
||||
public class LoginStatuDialogFragment extends BaseMvvmDialogFragment<LoginStatuViewModel, FragmentDialogLoginStatuBinding> {
|
||||
private static final String TAG = "LoginDialogFragment";
|
||||
|
||||
private MMKV mMMKV = MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE);
|
||||
|
||||
private Context mContext;
|
||||
private ClickCallback mClickCallback;
|
||||
|
||||
|
||||
public interface ClickCallback {
|
||||
void onLoginOut();
|
||||
|
||||
void onChangePasswdClick();
|
||||
}
|
||||
|
||||
public LoginStatuDialogFragment(ClickCallback clickCallback) {
|
||||
this.mClickCallback = clickCallback;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getLayoutId() {
|
||||
return R.layout.fragment_dialog_login_statu;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void initDataBinding() {
|
||||
mContext = getActivity();
|
||||
mViewModel.setCtx(getCtx());
|
||||
mViewModel.setLifecycle(getLifecycleSubject());
|
||||
mViewModel.setVDBinding(mViewDataBinding);
|
||||
mViewDataBinding.setClick(new BtnClick());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void initView(Bundle bundle) {
|
||||
String phone = mMMKV.decodeString(CommonConfig.ACCOUNT_LOGIN_MOBILE, "");
|
||||
mViewDataBinding.tvPhone.setText(phone);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void initData(Bundle savedInstanceState) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void fetchData() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStart() {
|
||||
super.onStart();
|
||||
if (getDialog() != null) {
|
||||
Window window = getDialog().getWindow();
|
||||
if (window == null) return;
|
||||
WindowManager.LayoutParams params = window.getAttributes();
|
||||
params.width = WindowManager.LayoutParams.MATCH_PARENT;
|
||||
params.height = WindowManager.LayoutParams.WRAP_CONTENT;
|
||||
params.gravity = Gravity.CENTER;
|
||||
window.setAttributes(params);
|
||||
window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
|
||||
getDialog().setCancelable(true);
|
||||
getDialog().setCanceledOnTouchOutside(true);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void show(FragmentManager manager, String tag) {
|
||||
DialogFragment fragment = (DialogFragment) manager.findFragmentByTag(tag);
|
||||
if (fragment != null && fragment.isAdded()
|
||||
&& fragment.getDialog() != null && fragment.getDialog().isShowing()) {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
FragmentTransaction ft = manager.beginTransaction();
|
||||
ft.add(this, tag);
|
||||
ft.commitAllowingStateLoss();
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "show: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
super.onDestroy();
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDismiss(@NonNull DialogInterface dialog) {
|
||||
super.onDismiss(dialog);
|
||||
|
||||
}
|
||||
|
||||
public class BtnClick {
|
||||
public void logout(View view) {
|
||||
// new LogoutDialogFragment(new LogoutDialogFragment.ClickCallback() {
|
||||
// @Override
|
||||
// public void onChangePasswdClick() {
|
||||
//
|
||||
// }
|
||||
// }).show(getChildFragmentManager(), "LogoutDialogFragment");
|
||||
|
||||
mMMKV.encode(CommonConfig.ACCOUNT_LOGIN_STATU, 0);
|
||||
mMMKV.remove(CommonConfig.ACCOUNT_LOGIN_TOKEN);
|
||||
mMMKV.remove(CommonConfig.ACCOUNT_LOGIN_MOBILE);
|
||||
mMMKV.remove(CommonConfig.ACCOUNT_LOGIN_ID);
|
||||
if (mClickCallback != null) {
|
||||
mClickCallback.onLoginOut();
|
||||
}
|
||||
}
|
||||
|
||||
public void changePasswd(View view) {
|
||||
new PasswdDialogFragment(new PasswdDialogFragment.ClickCallback() {
|
||||
@Override
|
||||
public void onCodeLoginClick() {
|
||||
|
||||
}
|
||||
}).show(getChildFragmentManager(), "PasswdDialogFragment");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
package com.xwad.os.fragment.dialog.login.statu;
|
||||
|
||||
import com.trello.rxlifecycle4.android.FragmentEvent;
|
||||
import com.xwad.os.base.mvvm.BaseViewModel;
|
||||
import com.xwad.os.databinding.FragmentDialogLoginStatuBinding;
|
||||
|
||||
public class LoginStatuViewModel extends BaseViewModel<FragmentDialogLoginStatuBinding, FragmentEvent> {
|
||||
|
||||
private static final String TAG = "LoginViewModel";
|
||||
|
||||
@Override
|
||||
public FragmentDialogLoginStatuBinding getVDBinding() {
|
||||
return binding;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,108 @@
|
||||
package com.xwad.os.fragment.dialog.viplist;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.Color;
|
||||
import android.graphics.drawable.ColorDrawable;
|
||||
import android.os.Bundle;
|
||||
import android.util.Log;
|
||||
import android.view.Gravity;
|
||||
import android.view.Window;
|
||||
import android.view.WindowManager;
|
||||
|
||||
import androidx.fragment.app.DialogFragment;
|
||||
import androidx.fragment.app.FragmentManager;
|
||||
import androidx.fragment.app.FragmentTransaction;
|
||||
import androidx.lifecycle.Observer;
|
||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
|
||||
import com.xwad.os.R;
|
||||
import com.xwad.os.adapter.VipAdapter;
|
||||
import com.xwad.os.base.mvvm.fragment.BaseMvvmDialogFragment;
|
||||
import com.xwad.os.bean.VipInfo;
|
||||
import com.xwad.os.databinding.FragmentDialogVipListBinding;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class VipListDialogFragment extends BaseMvvmDialogFragment<VipListViewModel, FragmentDialogVipListBinding> {
|
||||
private static final String TAG = "VipListDialogFragment";
|
||||
|
||||
private Context mContext;
|
||||
private VipAdapter mVipAdapter;
|
||||
|
||||
@Override
|
||||
protected int getLayoutId() {
|
||||
return R.layout.fragment_dialog_vip_list;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void initDataBinding() {
|
||||
mContext = getActivity();
|
||||
mViewModel.setCtx(getCtx());
|
||||
mViewModel.setLifecycle(getLifecycleSubject());
|
||||
mViewModel.setVDBinding(mViewDataBinding);
|
||||
mViewDataBinding.setClick(new BtnClick());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void initView(Bundle bundle) {
|
||||
mVipAdapter = new VipAdapter();
|
||||
mViewDataBinding.recyclerView.setAdapter(mVipAdapter);
|
||||
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(mContext);
|
||||
linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
|
||||
mViewDataBinding.recyclerView.setLayoutManager(linearLayoutManager);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void initData(Bundle savedInstanceState) {
|
||||
mViewModel.mVipInfoListData.observe(this, new Observer<List<VipInfo>>() {
|
||||
@Override
|
||||
public void onChanged(List<VipInfo> vipInfos) {
|
||||
mVipAdapter.setVipInfos(vipInfos);
|
||||
}
|
||||
});
|
||||
mViewModel.getVipList();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void fetchData() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStart() {
|
||||
super.onStart();
|
||||
if (getDialog() != null) {
|
||||
Window window = getDialog().getWindow();
|
||||
if (window == null) return;
|
||||
WindowManager.LayoutParams params = window.getAttributes();
|
||||
params.width = WindowManager.LayoutParams.MATCH_PARENT;
|
||||
params.height = WindowManager.LayoutParams.WRAP_CONTENT;
|
||||
params.gravity = Gravity.CENTER;
|
||||
window.setAttributes(params);
|
||||
window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
|
||||
getDialog().setCancelable(true);
|
||||
getDialog().setCanceledOnTouchOutside(true);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void show(FragmentManager manager, String tag) {
|
||||
DialogFragment fragment = (DialogFragment) manager.findFragmentByTag(tag);
|
||||
if (fragment != null && fragment.isAdded()
|
||||
&& fragment.getDialog() != null && fragment.getDialog().isShowing()) {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
FragmentTransaction ft = manager.beginTransaction();
|
||||
ft.add(this, tag);
|
||||
ft.commitAllowingStateLoss();
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "show: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
public class BtnClick {
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
package com.xwad.os.fragment.dialog.viplist;
|
||||
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.lifecycle.MutableLiveData;
|
||||
|
||||
import com.hjq.toast.Toaster;
|
||||
import com.trello.rxlifecycle4.RxLifecycle;
|
||||
import com.trello.rxlifecycle4.android.FragmentEvent;
|
||||
import com.xwad.os.base.mvvm.BaseViewModel;
|
||||
import com.xwad.os.bean.BaseResponse;
|
||||
import com.xwad.os.bean.VipInfo;
|
||||
import com.xwad.os.databinding.FragmentDialogVipListBinding;
|
||||
import com.xwad.os.network.NetInterfaceManager;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import io.reactivex.rxjava3.annotations.NonNull;
|
||||
import io.reactivex.rxjava3.core.Observer;
|
||||
import io.reactivex.rxjava3.disposables.Disposable;
|
||||
|
||||
public class VipListViewModel extends BaseViewModel<FragmentDialogVipListBinding, FragmentEvent> {
|
||||
|
||||
private static final String TAG = "VipListViewModel";
|
||||
|
||||
@Override
|
||||
public FragmentDialogVipListBinding getVDBinding() {
|
||||
return binding;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
|
||||
}
|
||||
|
||||
|
||||
public MutableLiveData<List<VipInfo>> mVipInfoListData = new MutableLiveData<>();
|
||||
|
||||
public void getVipList() {
|
||||
|
||||
}
|
||||
}
|
||||
@@ -182,10 +182,15 @@ public class EnglishFragment extends BaseMvvmFragment<EnglishViewModel, Fragment
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroyView() {
|
||||
super.onDestroyView();
|
||||
public void onResume() {
|
||||
super.onResume();
|
||||
load();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
super.onDestroy();
|
||||
}
|
||||
|
||||
private void setTag(View view) {
|
||||
String str;
|
||||
|
||||
@@ -122,6 +122,8 @@ public class MineFragment extends BaseMvvmFragment<MineViewModel, FragmentMineBi
|
||||
mParam2 = getArguments().getString(ARG_PARAM2);
|
||||
}
|
||||
|
||||
setName();
|
||||
|
||||
// mViewDataBinding.gridViewId.setLayoutManager(new GridLayoutManager(mContext, 8));
|
||||
// zhMenuAdapter = new ZhMenuAdapter(mContext, mlistAppInfo);
|
||||
// mViewDataBinding.gridViewId.setAdapter(zhMenuAdapter);
|
||||
@@ -190,7 +192,6 @@ public class MineFragment extends BaseMvvmFragment<MineViewModel, FragmentMineBi
|
||||
// }
|
||||
// });
|
||||
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -199,13 +200,25 @@ public class MineFragment extends BaseMvvmFragment<MineViewModel, FragmentMineBi
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
public void fetchData() {
|
||||
Log.e(TAG, "fetchData: ");
|
||||
setName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void fetchData() {
|
||||
public void onDestroy() {
|
||||
super.onDestroy();
|
||||
Log.e(TAG, "onDestroy: ");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setUserVisibleHint(boolean isVisibleToUser) {
|
||||
super.setUserVisibleHint(isVisibleToUser);
|
||||
Log.e(TAG, "setUserVisibleHint: isVisibleToUser = " + isVisibleToUser);
|
||||
|
||||
}
|
||||
|
||||
private void setName() {
|
||||
String nickName = mMMKV.decodeString(CommonConfig.UIUI_USER_NAME_KEY, "");
|
||||
if (TextUtils.isEmpty(nickName)) {
|
||||
mViewDataBinding.tvName.setText(getString(R.string.default_nickname));
|
||||
@@ -218,19 +231,6 @@ public class MineFragment extends BaseMvvmFragment<MineViewModel, FragmentMineBi
|
||||
} else {
|
||||
mViewDataBinding.tvGrade.setText(sn_grade);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroyView() {
|
||||
super.onDestroyView();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setUserVisibleHint(boolean isVisibleToUser) {
|
||||
super.setUserVisibleHint(isVisibleToUser);
|
||||
Log.e(TAG, "setUserVisibleHint: isVisibleToUser = " + isVisibleToUser);
|
||||
|
||||
}
|
||||
|
||||
// public void initAppData() {
|
||||
|
||||
@@ -122,7 +122,7 @@ public class SafeFragment extends BaseMvvmFragment<SafeViewModel, FragmentSafeBi
|
||||
mParam2 = getArguments().getString(ARG_PARAM2);
|
||||
}
|
||||
|
||||
mViewDataBinding.gridViewId.setLayoutManager(new GridLayoutManager(mContext, 8));
|
||||
mViewDataBinding.gridViewId.setLayoutManager(new GridLayoutManager(mContext, 7));
|
||||
zhMenuAdapter = new ZhMenuAdapter(mContext, mlistAppInfo);
|
||||
mViewDataBinding.gridViewId.setAdapter(zhMenuAdapter);
|
||||
mViewDataBinding.relaRoot.setOnClickListener(new View.OnClickListener() {
|
||||
@@ -287,10 +287,10 @@ public class SafeFragment extends BaseMvvmFragment<SafeViewModel, FragmentSafeBi
|
||||
// AppInfo build7 = new AppInfo.Builder().appLabel("切换壁纸").appStargs(getResources().getString(R.string.tag_args_launcher)).appIcon(mContext.getResources().getDrawable(R.drawable.icon_bbx_qhbz)).build();
|
||||
// AppInfo build8 = new AppInfo.Builder().appLabel("安卓平台").appStargs(getResources().getString(R.string.tag_args_launcher)).appIcon(mContext.getResources().getDrawable(R.drawable.icon_bbx_azpt)).build();
|
||||
// AppInfo build9 = new AppInfo.Builder().appLabel("设置").appStargs(getResources().getString(R.string.tag_args_new_jxwSettings)).appIcon(mContext.getResources().getDrawable(R.drawable.icon_bbx_sz)).build();
|
||||
AppInfo build10 = new AppInfo.Builder().appLabel("时钟").appStargs(getResources().getString(R.string.tag_args_new_sz)).appIcon(mContext.getResources().getDrawable(R.drawable.com_android_deskclock)).build();
|
||||
AppInfo build11 = new AppInfo.Builder().appLabel("计算器").appStargs(getResources().getString(R.string.tag_args_new_calc)).appIcon(mContext.getResources().getDrawable(R.drawable.com_android_calculator2)).build();
|
||||
AppInfo build12 = new AppInfo.Builder().appLabel("相机").appStargs(getResources().getString(R.string.tag_args_new_camera)).appIcon(mContext.getResources().getDrawable(R.drawable.com_android_camera)).build();
|
||||
AppInfo build13 = new AppInfo.Builder().appLabel("图库").appStargs(getResources().getString(R.string.tag_args_new_tk)).appIcon(mContext.getResources().getDrawable(R.drawable.com_android_gallery3d_app)).build();
|
||||
AppInfo build10 = new AppInfo.Builder().appLabel("时钟").appStargs(OpenApkUtils.getInstance().getDeskClockPackageName() + ",,,," + "时钟").appIcon(mContext.getResources().getDrawable(R.drawable.com_android_deskclock)).build();
|
||||
AppInfo build11 = new AppInfo.Builder().appLabel("计算器").appStargs(OpenApkUtils.getInstance().getCalculatorPackageName() + ",,,," + "计算器").appIcon(mContext.getResources().getDrawable(R.drawable.com_android_calculator2)).build();
|
||||
AppInfo build12 = new AppInfo.Builder().appLabel("相机").appStargs(OpenApkUtils.getInstance().getCameraPackageName() + ",,,," + "相机").appIcon(mContext.getResources().getDrawable(R.drawable.com_android_camera)).build();
|
||||
AppInfo build13 = new AppInfo.Builder().appLabel("图库").appStargs(OpenApkUtils.getInstance().getGalleryPackageName() + ",,,," + "图库").appIcon(mContext.getResources().getDrawable(R.drawable.com_android_gallery3d_app)).build();
|
||||
|
||||
// mlistAppInfo.add(build);
|
||||
// mlistAppInfo.add(build2);
|
||||
|
||||
@@ -45,6 +45,7 @@ import com.xwad.os.bean.StudyStatBean;
|
||||
import com.xwad.os.config.CommonConfig;
|
||||
import com.xwad.os.databinding.FragmentUserBinding;
|
||||
import com.xwad.os.jxw.JxwPackageConfig;
|
||||
import com.xwad.os.jxw.SPUtils;
|
||||
import com.xwad.os.manager.RemoteManager;
|
||||
import com.xwad.os.utils.OpenApkUtils;
|
||||
import com.xwad.os.utils.TimeUtils;
|
||||
@@ -207,6 +208,7 @@ public class UserFragment extends BaseMvvmFragment<UserViewModel, FragmentUserBi
|
||||
Glide.with(mViewDataBinding.ivAvatar).load(snInfo.getAvatar()).error(R.drawable.default_avatar).into(mViewDataBinding.ivAvatar);
|
||||
String name = snInfo.getSn_name();
|
||||
String grade = snInfo.getGrade();
|
||||
SPUtils.setGrade(grade);
|
||||
if (TextUtils.isEmpty(name)) {
|
||||
mViewDataBinding.tvName.setText(getString(R.string.default_nickname));
|
||||
} else {
|
||||
|
||||
@@ -24,6 +24,7 @@ import com.xwad.os.bean.StudyStatBean;
|
||||
import com.xwad.os.config.CommonConfig;
|
||||
import com.xwad.os.databinding.FragmentUserBinding;
|
||||
import com.xwad.os.manager.AppManager;
|
||||
import com.xwad.os.manager.DeviceSNManager;
|
||||
import com.xwad.os.manager.RemoteManager;
|
||||
import com.xwad.os.network.NetInterfaceManager;
|
||||
import com.xwad.os.network.UrlAddress;
|
||||
@@ -62,7 +63,7 @@ public class UserViewModel extends BaseViewModel<FragmentUserBinding, FragmentEv
|
||||
public MutableLiveData<BaseResponse<SnInfo>> mSnInfoData = new MutableLiveData<>();
|
||||
|
||||
public void getSnInfo() {
|
||||
boolean activation = ActivationUtil.getInstance().isActivation();
|
||||
boolean activation = ActivationUtil.getInstance().isLogin();
|
||||
if (!activation) {
|
||||
return;
|
||||
}
|
||||
@@ -99,7 +100,7 @@ public class UserViewModel extends BaseViewModel<FragmentUserBinding, FragmentEv
|
||||
public MutableLiveData<StudyStatBean> mStudyStatBeanData = new MutableLiveData<>();
|
||||
|
||||
public void getStudyStat() {
|
||||
boolean activation = ActivationUtil.getInstance().isActivation();
|
||||
boolean activation = ActivationUtil.getInstance().isLogin();
|
||||
if (!activation) {
|
||||
return;
|
||||
}
|
||||
@@ -138,7 +139,7 @@ public class UserViewModel extends BaseViewModel<FragmentUserBinding, FragmentEv
|
||||
public MutableLiveData<Bitmap> mQrCodeData = new MutableLiveData<>();
|
||||
|
||||
public void getQrCode() {
|
||||
String encryptString = CXAESUtil.encrypt(CommonConfig.AES_KEY, RemoteManager.getInstance().getSerial());
|
||||
String encryptString = CXAESUtil.encrypt(CommonConfig.AES_KEY, DeviceSNManager.getDeviceSN());
|
||||
Log.e("getQRCode", "setImageAndText: " + encryptString);
|
||||
Bitmap bitmap = Utils.createQRImage(encryptString, 400, 400);
|
||||
mQrCodeData.setValue(bitmap);
|
||||
@@ -174,36 +175,13 @@ public class UserViewModel extends BaseViewModel<FragmentUserBinding, FragmentEv
|
||||
public MutableLiveData<Long> mAppUsedData = new MutableLiveData<>();
|
||||
|
||||
public void getAppUsedStatistics() {
|
||||
String jsonString = RemoteManager.getInstance().getAppUsedStatistics();
|
||||
if (TextUtils.isEmpty(jsonString)) {
|
||||
mAppUsedData.setValue((long) 0);
|
||||
} else {
|
||||
Gson gson = new Gson();
|
||||
Type listType = new TypeToken<List<AppUsed>>() {
|
||||
}.getType();
|
||||
try {
|
||||
List<AppUsed> appUseds = gson.fromJson(jsonString, listType);
|
||||
Log.e(TAG, "getAppUsedStatistics: " + appUseds);
|
||||
List<AppUsed> appUseTime = appUseds.stream().filter(new Predicate<AppUsed>() {
|
||||
@Override
|
||||
public boolean test(AppUsed appUsed) {
|
||||
return !BuildConfig.APPLICATION_ID.equals(appUsed.getPackages())
|
||||
&& !"com.safe.uiui".equals(appUsed.getPackages());
|
||||
}
|
||||
}).collect(Collectors.toList());
|
||||
long time = appUseTime.stream().mapToLong(AppUsed::getUseTime).sum();
|
||||
mAppUsedData.setValue(time);
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "getAppUsedStatistics: " + e.getMessage());
|
||||
mAppUsedData.setValue((long) 0);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public MutableLiveData<List<HomeworkBean>> mHomeworkBeanListData = new MutableLiveData<>();
|
||||
|
||||
public void getHomework() {
|
||||
boolean activation = ActivationUtil.getInstance().isActivation();
|
||||
boolean activation = ActivationUtil.getInstance().isLogin();
|
||||
if (!activation) {
|
||||
return;
|
||||
}
|
||||
@@ -247,7 +225,7 @@ public class UserViewModel extends BaseViewModel<FragmentUserBinding, FragmentEv
|
||||
public MutableLiveData<PhraseContent> mPhraseData = new MutableLiveData<>();
|
||||
|
||||
public void getPhrase() {
|
||||
boolean activation = ActivationUtil.getInstance().isActivation();
|
||||
boolean activation = ActivationUtil.getInstance().isLogin();
|
||||
if (!activation) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,197 @@
|
||||
package com.xwad.os.fragment.usercenter.account;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
import android.view.View;
|
||||
|
||||
import androidx.activity.result.ActivityResult;
|
||||
import androidx.activity.result.ActivityResultCallback;
|
||||
import androidx.activity.result.ActivityResultLauncher;
|
||||
import androidx.activity.result.contract.ActivityResultContracts;
|
||||
import androidx.lifecycle.Observer;
|
||||
|
||||
import com.hjq.toast.Toaster;
|
||||
import com.tencent.mmkv.MMKV;
|
||||
import com.xwad.os.R;
|
||||
import com.xwad.os.activity.activation.ActivationActivity;
|
||||
import com.xwad.os.activity.login.LoginActivity;
|
||||
import com.xwad.os.activity.vip.list.VipActivity;
|
||||
import com.xwad.os.base.mvvm.fragment.BaseMvvmFragment;
|
||||
import com.xwad.os.bean.UserInfo;
|
||||
import com.xwad.os.bean.VipLevel;
|
||||
import com.xwad.os.config.CommonConfig;
|
||||
import com.xwad.os.databinding.FragmentAccountBinding;
|
||||
import com.xwad.os.fragment.dialog.login.account.AccountLoginDialogFragment;
|
||||
import com.xwad.os.fragment.dialog.login.code.CodeLoginDialogFragment;
|
||||
import com.xwad.os.fragment.dialog.login.statu.LoginStatuDialogFragment;
|
||||
import com.xwad.os.fragment.dialog.viplist.VipListDialogFragment;
|
||||
import com.xwad.os.utils.OpenApkUtils;
|
||||
|
||||
|
||||
public class AccountFragment extends BaseMvvmFragment<AccountViewModel, FragmentAccountBinding> {
|
||||
private static final String TAG = "ParentsFragment";
|
||||
|
||||
private MMKV mMMKV = MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE);
|
||||
|
||||
|
||||
private Context mContext;
|
||||
private int mLoginStatu = 0;
|
||||
private CodeLoginDialogFragment mCodeLoginDialogFragment;
|
||||
private AccountLoginDialogFragment mAccountLoginDialogFragment;
|
||||
private LoginStatuDialogFragment mLoginStatuDialogFragment;
|
||||
private VipListDialogFragment mVipListDialogFragment;
|
||||
|
||||
public static AccountFragment newInstance() {
|
||||
return new AccountFragment();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected int getLayoutId() {
|
||||
return R.layout.fragment_account;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void initDataBinding() {
|
||||
mContext = getActivity();
|
||||
mViewModel.setCtx(getCtx());
|
||||
mViewModel.setLifecycle(getLifecycleSubject());
|
||||
mViewModel.setVDBinding(mViewDataBinding);
|
||||
mViewDataBinding.setClick(new BtnClick());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void initView(Bundle bundle) {
|
||||
getLocalLoginInfo();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void initData(Bundle savedInstanceState) {
|
||||
mViewModel.mUserInfoData.observe(this, new Observer<UserInfo>() {
|
||||
@Override
|
||||
public void onChanged(UserInfo userInfo) {
|
||||
mLoginStatu = 1;
|
||||
mViewDataBinding.setUserInfo(userInfo);
|
||||
int vip_level_id = userInfo.getVip_level_id();
|
||||
String expire_at = userInfo.getExpire_at();
|
||||
VipLevel vipLevel = userInfo.getVip_level();
|
||||
if (vip_level_id != 0) {
|
||||
mViewDataBinding.tvVipStatu.setText("过期时间:" + expire_at);
|
||||
if (vipLevel != null && !TextUtils.isEmpty(vipLevel.getName())) {
|
||||
mViewDataBinding.tvVipName.setText(vipLevel.getName());
|
||||
}
|
||||
} else {
|
||||
mViewDataBinding.tvVipName.setText("学王365AI旗舰版");
|
||||
mViewDataBinding.tvVipStatu.setText("点击购买激活");
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void fetchData() {
|
||||
Log.e(TAG, "fetchData: ");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onResume() {
|
||||
super.onResume();
|
||||
Log.e(TAG, "onResume: ");
|
||||
mViewModel.getUserInfo();
|
||||
}
|
||||
|
||||
private ActivityResultLauncher<Intent> mLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() {
|
||||
@Override
|
||||
public void onActivityResult(ActivityResult result) {
|
||||
Log.e(TAG, "onActivityResult: " + result);
|
||||
if (result != null) {
|
||||
Intent intent = result.getData();
|
||||
if (intent != null && result.getResultCode() == Activity.RESULT_OK) {
|
||||
mViewModel.getUserInfo();
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
private void getLocalLoginInfo() {
|
||||
mLoginStatu = mMMKV.decodeInt(CommonConfig.ACCOUNT_LOGIN_STATU, 0);
|
||||
|
||||
}
|
||||
|
||||
private void showCodeLogin() {
|
||||
mCodeLoginDialogFragment = new CodeLoginDialogFragment(new CodeLoginDialogFragment.ClickCallback() {
|
||||
@Override
|
||||
public void onAccountLoginClick() {
|
||||
mCodeLoginDialogFragment.dismiss();
|
||||
mCodeLoginDialogFragment = null;
|
||||
showAccountLogin();
|
||||
}
|
||||
});
|
||||
mCodeLoginDialogFragment.show(getChildFragmentManager(), "LoginDialogFragment");
|
||||
}
|
||||
|
||||
private void showAccountLogin() {
|
||||
mAccountLoginDialogFragment = new AccountLoginDialogFragment(new AccountLoginDialogFragment.ClickCallback() {
|
||||
@Override
|
||||
public void onCodeLoginClick() {
|
||||
mAccountLoginDialogFragment.dismiss();
|
||||
mAccountLoginDialogFragment = null;
|
||||
showCodeLogin();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onLoginSuccessful() {
|
||||
mViewModel.getUserInfo();
|
||||
}
|
||||
});
|
||||
mAccountLoginDialogFragment.show(getChildFragmentManager(), "AccountLoginDialogFragment");
|
||||
}
|
||||
|
||||
public class BtnClick {
|
||||
public void openSn(View view) {
|
||||
OpenApkUtils.getInstance().openZySn();
|
||||
}
|
||||
|
||||
public void login(View view) {
|
||||
if (mLoginStatu == 1) {
|
||||
mLoginStatuDialogFragment = new LoginStatuDialogFragment(new LoginStatuDialogFragment.ClickCallback() {
|
||||
@Override
|
||||
public void onLoginOut() {
|
||||
mViewDataBinding.setUserInfo(null);
|
||||
mLoginStatu = 0;
|
||||
mViewDataBinding.tvPhone.setText("点击登录");
|
||||
mViewDataBinding.tvVipName.setText("普通会员");
|
||||
mViewDataBinding.tvVipStatu.setText("点击购买激活");
|
||||
mLoginStatuDialogFragment.dismiss();
|
||||
Toaster.show("退出成功");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onChangePasswdClick() {
|
||||
|
||||
}
|
||||
});
|
||||
mLoginStatuDialogFragment.show(getChildFragmentManager(), "LoginStatuDialogFragment");
|
||||
|
||||
} else {
|
||||
// showCodeLogin();
|
||||
mLauncher.launch(new Intent(mContext, LoginActivity.class));
|
||||
}
|
||||
}
|
||||
|
||||
public void loginStatu(View view) {
|
||||
|
||||
}
|
||||
|
||||
public void openVipList(View view) {
|
||||
// mVipListDialogFragment = new VipListDialogFragment();
|
||||
// mVipListDialogFragment.show(getChildFragmentManager(), "mVipListDialogFragment");
|
||||
startActivity(new Intent(mContext, ActivationActivity.class));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,69 @@
|
||||
package com.xwad.os.fragment.usercenter.account;
|
||||
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.lifecycle.MutableLiveData;
|
||||
|
||||
import com.tencent.mmkv.MMKV;
|
||||
import com.trello.rxlifecycle4.RxLifecycle;
|
||||
import com.trello.rxlifecycle4.android.FragmentEvent;
|
||||
import com.xwad.os.base.mvvm.BaseViewModel;
|
||||
import com.xwad.os.bean.BaseResponse;
|
||||
import com.xwad.os.bean.UserInfo;
|
||||
import com.xwad.os.config.CommonConfig;
|
||||
import com.xwad.os.databinding.FragmentAccountBinding;
|
||||
import com.xwad.os.network.NetInterfaceManager;
|
||||
|
||||
import io.reactivex.rxjava3.annotations.NonNull;
|
||||
import io.reactivex.rxjava3.core.Observer;
|
||||
import io.reactivex.rxjava3.disposables.Disposable;
|
||||
|
||||
public class AccountViewModel extends BaseViewModel<FragmentAccountBinding, FragmentEvent> {
|
||||
|
||||
private static final String TAG = "ParentsViewModel";
|
||||
|
||||
private MMKV mMMKV = MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE);
|
||||
|
||||
|
||||
@Override
|
||||
public FragmentAccountBinding getVDBinding() {
|
||||
return binding;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
|
||||
}
|
||||
|
||||
public MutableLiveData<UserInfo> mUserInfoData = new MutableLiveData<>();
|
||||
|
||||
public void getUserInfo() {
|
||||
NetInterfaceManager.getInstance().getUserInfoControl()
|
||||
.compose(RxLifecycle.bindUntilEvent(getLifecycle(), FragmentEvent.DESTROY))
|
||||
.subscribe(new Observer<BaseResponse<UserInfo>>() {
|
||||
@Override
|
||||
public void onSubscribe(@NonNull Disposable d) {
|
||||
Log.e("getUserInfo", "onSubscribe: ");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNext(@NonNull BaseResponse<UserInfo> userInfoBaseResponse) {
|
||||
Log.e("getUserInfo", "onNext: " + userInfoBaseResponse);
|
||||
if (userInfoBaseResponse.code == 200) {
|
||||
UserInfo userInfo = userInfoBaseResponse.data;
|
||||
mUserInfoData.setValue(userInfo);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(@NonNull Throwable e) {
|
||||
Log.e("getUserInfo", "onError: " + e.getMessage());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onComplete() {
|
||||
Log.e("getUserInfo", "onComplete: ");
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -12,6 +12,7 @@ import com.xwad.os.activity.permission.PermissionActivity;
|
||||
import com.xwad.os.activity.service.ServiceActivity;
|
||||
import com.xwad.os.base.mvvm.fragment.BaseMvvmFragment;
|
||||
import com.xwad.os.databinding.FragmentDeviceBinding;
|
||||
import com.xwad.os.manager.DeviceSNManager;
|
||||
import com.xwad.os.manager.RemoteManager;
|
||||
import com.xwad.os.utils.LenovoCsdkUtil;
|
||||
|
||||
@@ -41,7 +42,7 @@ public class DeviceFragment extends BaseMvvmFragment<DeviceViewModel, FragmentDe
|
||||
protected void initView(Bundle bundle) {
|
||||
mViewDataBinding.tvModel.setText(Build.MODEL);
|
||||
mViewDataBinding.tvVersion.setText(BuildConfig.VERSION_NAME);
|
||||
mViewDataBinding.tvMac.setText(RemoteManager.getInstance().getSerial());
|
||||
mViewDataBinding.tvMac.setText(DeviceSNManager.getDeviceSN());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -18,6 +18,7 @@ import com.xwad.os.base.mvvm.fragment.BaseMvvmFragment;
|
||||
import com.xwad.os.bean.SnInfo;
|
||||
import com.xwad.os.config.CommonConfig;
|
||||
import com.xwad.os.databinding.FragmentInfoBinding;
|
||||
import com.xwad.os.manager.DeviceSNManager;
|
||||
import com.xwad.os.manager.RemoteManager;
|
||||
import com.xwad.os.utils.ActivationUtil;
|
||||
import com.xwad.os.utils.LenovoCsdkUtil;
|
||||
@@ -61,9 +62,9 @@ public class InfoFragment extends BaseMvvmFragment<InfoViewModel, FragmentInfoBi
|
||||
@Override
|
||||
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
|
||||
if (b) {
|
||||
if (ActivationUtil.getInstance().isActivation()) {
|
||||
if (ActivationUtil.getInstance().isLogin()) {
|
||||
Map<String, String> params = new HashMap<>();
|
||||
params.put("sn", RemoteManager.getInstance().getSerial());
|
||||
params.put("sn", DeviceSNManager.getDeviceSN());
|
||||
params.put("sex", "1");
|
||||
mViewModel.updateInfo(params);
|
||||
} else {
|
||||
@@ -76,9 +77,9 @@ public class InfoFragment extends BaseMvvmFragment<InfoViewModel, FragmentInfoBi
|
||||
@Override
|
||||
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
|
||||
if (b) {
|
||||
if (ActivationUtil.getInstance().isActivation()) {
|
||||
if (ActivationUtil.getInstance().isLogin()) {
|
||||
Map<String, String> params = new HashMap<>();
|
||||
params.put("sn", RemoteManager.getInstance().getSerial());
|
||||
params.put("sn", DeviceSNManager.getDeviceSN());
|
||||
params.put("sex", "2");
|
||||
mViewModel.updateInfo(params);
|
||||
} else {
|
||||
@@ -124,7 +125,7 @@ public class InfoFragment extends BaseMvvmFragment<InfoViewModel, FragmentInfoBi
|
||||
@Override
|
||||
public void onResume() {
|
||||
super.onResume();
|
||||
if (ActivationUtil.getInstance().isActivation()) {
|
||||
if (ActivationUtil.getInstance().isLogin()) {
|
||||
mViewModel.getSnInfo();
|
||||
} else {
|
||||
getLocalData();
|
||||
|
||||
@@ -35,10 +35,6 @@ public class InfoViewModel extends BaseViewModel<FragmentInfoBinding, FragmentEv
|
||||
public MutableLiveData<SnInfo> mSnInfoData = new MutableLiveData<>();
|
||||
|
||||
public void getSnInfo() {
|
||||
if (!ActivationUtil.getInstance().isActivation()) {
|
||||
|
||||
return;
|
||||
}
|
||||
NetInterfaceManager.getInstance().getSnInfoControl()
|
||||
.compose(RxLifecycle.bindUntilEvent(getLifecycle(), FragmentEvent.DESTROY))
|
||||
.subscribe(new Observer<BaseResponse<SnInfo>>() {
|
||||
@@ -70,10 +66,6 @@ public class InfoViewModel extends BaseViewModel<FragmentInfoBinding, FragmentEv
|
||||
public MutableLiveData<Boolean> mSuccessfulData = new MutableLiveData<>();
|
||||
|
||||
public void updateInfo(Map<String, String> params) {
|
||||
if (!ActivationUtil.getInstance().isActivation()) {
|
||||
|
||||
return;
|
||||
}
|
||||
NetInterfaceManager.getInstance().getUpdateInfoObservable(params)
|
||||
.compose(RxLifecycle.bindUntilEvent(getLifecycle(), FragmentEvent.DESTROY))
|
||||
.subscribe(new Observer<BaseResponse>() {
|
||||
|
||||
@@ -167,23 +167,23 @@ public class RemoteManager {
|
||||
/**
|
||||
* @return 获取sn
|
||||
*/
|
||||
public String getSerial() {
|
||||
if (mIGetInfoInterface != null) {
|
||||
try {
|
||||
return mIGetInfoInterface.getSerial();
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "getSerial: " + e.getMessage());
|
||||
}
|
||||
} else {
|
||||
bindInfoService();
|
||||
}
|
||||
return mMMKV.decodeString(SN_KEY, "unknown");
|
||||
}
|
||||
|
||||
public String getAppUsedStatistics() {
|
||||
Log.e(TAG, "getAppUsedStatistics: " );
|
||||
return null;
|
||||
}
|
||||
// public String getSerial() {
|
||||
// if (mIGetInfoInterface != null) {
|
||||
// try {
|
||||
// return mIGetInfoInterface.getSerial();
|
||||
// } catch (Exception e) {
|
||||
// Log.e(TAG, "getSerial: " + e.getMessage());
|
||||
// }
|
||||
// } else {
|
||||
// bindInfoService();
|
||||
// }
|
||||
// return mMMKV.decodeString(SN_KEY, "unknown");
|
||||
// }
|
||||
//
|
||||
// public String getAppUsedStatistics() {
|
||||
// Log.e(TAG, "getAppUsedStatistics: " );
|
||||
// return null;
|
||||
// }
|
||||
|
||||
public boolean getSnIsActivation() {
|
||||
int is_activation = Settings.Global.getInt(mContext.getContentResolver(), CommonConfig.UIUI_ACTIVATION_KEY, 0);
|
||||
|
||||
@@ -21,11 +21,16 @@ import com.xwad.os.bean.HomeworkBean;
|
||||
import com.xwad.os.bean.LessonApp;
|
||||
import com.xwad.os.bean.LessonJson;
|
||||
import com.xwad.os.bean.LessonSetting;
|
||||
import com.xwad.os.bean.LoginInfo;
|
||||
import com.xwad.os.bean.OrderInfo;
|
||||
import com.xwad.os.bean.PayInfo;
|
||||
import com.xwad.os.bean.PhraseContent;
|
||||
import com.xwad.os.bean.SnInfo;
|
||||
import com.xwad.os.bean.StudyStatBean;
|
||||
import com.xwad.os.bean.SystemSettings;
|
||||
import com.xwad.os.bean.UserAvatarInfo;
|
||||
import com.xwad.os.bean.UserInfo;
|
||||
import com.xwad.os.bean.VipInfo;
|
||||
import com.xwad.os.config.CommonConfig;
|
||||
import com.xwad.os.disklrucache.CacheHelper;
|
||||
import com.xwad.os.gson.GsonUtils;
|
||||
@@ -40,6 +45,7 @@ import com.xwad.os.network.api.LoginApi;
|
||||
import com.xwad.os.network.api.PhraseApi;
|
||||
import com.xwad.os.network.api.SnInfoApi;
|
||||
import com.xwad.os.network.api.SettingApi;
|
||||
import com.xwad.os.network.api.UserApi;
|
||||
import com.xwad.os.network.api.uiuios.CheckUpdateApi;
|
||||
import com.xwad.os.network.interceptor.RepeatRequestInterceptor;
|
||||
import com.xwad.os.utils.LenovoCsdkUtil;
|
||||
@@ -198,6 +204,12 @@ public class NetInterfaceManager {
|
||||
return requestBody;
|
||||
}
|
||||
|
||||
|
||||
private String getToken() {
|
||||
String token = mMMKV.decodeString(CommonConfig.ACCOUNT_LOGIN_TOKEN, "");
|
||||
return token;
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查更新
|
||||
*
|
||||
@@ -228,14 +240,14 @@ public class NetInterfaceManager {
|
||||
|
||||
public Observable<BaseResponse<SnInfo>> getSnInfoControl() {
|
||||
return mRetrofit.create(SnInfoApi.class)
|
||||
.getSninfo(RemoteManager.getInstance().getSerial())
|
||||
.getSninfo(DeviceSNManager.getDeviceSN())
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread());
|
||||
}
|
||||
|
||||
public Observable<BaseResponse<UserAvatarInfo>> getUserAvatarInfoControl() {
|
||||
return mRetrofit.create(SnInfoApi.class)
|
||||
.getUserAvatarInfo(RemoteManager.getInstance().getSerial())
|
||||
.getUserAvatarInfo(DeviceSNManager.getDeviceSN())
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread());
|
||||
}
|
||||
@@ -249,32 +261,30 @@ public class NetInterfaceManager {
|
||||
.observeOn(AndroidSchedulers.mainThread());
|
||||
}
|
||||
|
||||
public Observable<BaseResponse> getUpdateInfoObservable(Map<String, String> params, MultipartBody.Part multipartBody) {
|
||||
String json = GsonUtils.toJSONString(params);
|
||||
RequestBody requestBody = convertToJsonRequestBody(json);
|
||||
public Observable<BaseResponse> getUpdateInfoObservable(Map<String, RequestBody> params, MultipartBody.Part multipartBody) {
|
||||
return mRetrofit.create(SnInfoApi.class)
|
||||
.updateUserInfo(requestBody, multipartBody)
|
||||
.updateUserInfo(params, multipartBody)
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread());
|
||||
}
|
||||
|
||||
public Observable<BaseResponse> getRunningAppObservable(String json) {
|
||||
return mRetrofit.create(AppUsageRecordApi.class)
|
||||
.sendRunningInfo(RemoteManager.getInstance().getSerial(), json)
|
||||
.sendRunningInfo(DeviceSNManager.getDeviceSN(), json)
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread());
|
||||
}
|
||||
|
||||
public Observable<BaseResponse<LessonSetting>> getCloudLessonObservable() {
|
||||
return mRetrofit.create(SettingApi.class)
|
||||
.getCloudLessonSetting(RemoteManager.getInstance().getSerial())
|
||||
.getCloudLessonSetting(DeviceSNManager.getDeviceSN())
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread());
|
||||
}
|
||||
|
||||
public Observable<BaseResponse<LessonApp>> getCloudLessonAppObservable() {
|
||||
return mRetrofit.create(SettingApi.class)
|
||||
.getCloudLessonApp(RemoteManager.getInstance().getSerial())
|
||||
.getCloudLessonApp(DeviceSNManager.getDeviceSN())
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread());
|
||||
}
|
||||
@@ -282,28 +292,28 @@ public class NetInterfaceManager {
|
||||
public Observable<BaseResponse<List<AlarmClockData>>> getAlarmClockObservable() {
|
||||
return mRetrofit
|
||||
.create(AlarmClockApi.class)
|
||||
.getAlarmClock(RemoteManager.getInstance().getSerial())
|
||||
.getAlarmClock(DeviceSNManager.getDeviceSN())
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread());
|
||||
}
|
||||
|
||||
public Observable<BaseResponse> getUpdateAlarmObservable(int id) {
|
||||
return mRetrofit.create(AlarmClockApi.class)
|
||||
.updateAlarm(RemoteManager.getInstance().getSerial(), id)
|
||||
.updateAlarm(DeviceSNManager.getDeviceSN(), id)
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread());
|
||||
}
|
||||
|
||||
public Observable<BaseResponse<StudyStatBean>> getStudyStatObservable() {
|
||||
return mRetrofit.create(SnInfoApi.class)
|
||||
.getStudyStat(RemoteManager.getInstance().getSerial())
|
||||
.getStudyStat(DeviceSNManager.getDeviceSN())
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread());
|
||||
}
|
||||
|
||||
public Observable<BaseResponse> getUpdateAddressObservable(String address, double longitude, double latitude) {
|
||||
return mRetrofit.create(SnInfoApi.class)
|
||||
.updateAddress(RemoteManager.getInstance().getSerial(), address, longitude, latitude)
|
||||
.updateAddress(DeviceSNManager.getDeviceSN(), address, longitude, latitude)
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread());
|
||||
}
|
||||
@@ -317,35 +327,35 @@ public class NetInterfaceManager {
|
||||
|
||||
public Observable<BaseResponse<ArrayList<HomeworkBean>>> getHomeworkObservable() {
|
||||
return mRetrofit.create(HomeworkApi.class)
|
||||
.getHomeworks(RemoteManager.getInstance().getSerial())
|
||||
.getHomeworks(DeviceSNManager.getDeviceSN())
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread());
|
||||
}
|
||||
|
||||
public Observable<BaseResponse<HomeworkBean>> getHomeworkDetailObservable(int id) {
|
||||
return mRetrofit.create(HomeworkApi.class)
|
||||
.getHomeworkDetail(RemoteManager.getInstance().getSerial(), id)
|
||||
.getHomeworkDetail(DeviceSNManager.getDeviceSN(), id)
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread());
|
||||
}
|
||||
|
||||
public Observable<BaseResponse> getHomeworkUpdateObservable(int id) {
|
||||
return mRetrofit.create(HomeworkApi.class)
|
||||
.updateHomework(RemoteManager.getInstance().getSerial(), id)
|
||||
.updateHomework(DeviceSNManager.getDeviceSN(), id)
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread());
|
||||
}
|
||||
|
||||
public Observable<BaseResponse<PhraseContent>> getPhraseObservable() {
|
||||
return mRetrofit.create(PhraseApi.class)
|
||||
.getPhrase(RemoteManager.getInstance().getSerial())
|
||||
.getPhrase(DeviceSNManager.getDeviceSN())
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread());
|
||||
}
|
||||
|
||||
public Observable<BaseResponse<SystemSettings>> getsettingControl() {
|
||||
public Observable<BaseResponse<SystemSettings>> getSettingControl() {
|
||||
return mRetrofit.create(SettingApi.class)
|
||||
.getSetting(RemoteManager.getInstance().getSerial())
|
||||
.getSetting(DeviceSNManager.getDeviceSN())
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread());
|
||||
}
|
||||
@@ -364,7 +374,7 @@ public class NetInterfaceManager {
|
||||
.observeOn(AndroidSchedulers.mainThread());
|
||||
}
|
||||
|
||||
public Observable<BaseResponse> getCodeLoginObservable(String mobile, String code) {
|
||||
public Observable<BaseResponse<LoginInfo>> getCodeLoginObservable(String mobile, String code) {
|
||||
return mRetrofit.create(LoginApi.class)
|
||||
.codeLogin(mobile, code, DeviceSNManager.getDeviceSN())
|
||||
.subscribeOn(Schedulers.io())
|
||||
@@ -378,6 +388,42 @@ public class NetInterfaceManager {
|
||||
.observeOn(AndroidSchedulers.mainThread());
|
||||
}
|
||||
|
||||
public Observable<BaseResponse<UserInfo>> getUserInfoControl() {
|
||||
return mRetrofit.create(UserApi.class)
|
||||
.getUserInfo(getToken())
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread());
|
||||
}
|
||||
|
||||
public Observable<BaseResponse<List<VipInfo>>> getVipListControl() {
|
||||
return mRetrofit.create(UserApi.class)
|
||||
.getVipList(getToken(), BuildConfig.APPLICATION_ID)
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread());
|
||||
}
|
||||
|
||||
public Observable<BaseResponse<OrderInfo>> getBuyVipControl(String vipId) {
|
||||
return mRetrofit.create(UserApi.class)
|
||||
.buyVip(getToken(), DeviceSNManager.getDeviceSN(), vipId)
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread());
|
||||
}
|
||||
|
||||
public Observable<BaseResponse> getCodeActivationControl(String code) {
|
||||
return mRetrofit.create(UserApi.class)
|
||||
.codeActivation(getToken(), DeviceSNManager.getDeviceSN(), code)
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread());
|
||||
}
|
||||
|
||||
public Observable<BaseResponse<PayInfo>> getPayQrcodeControl(String orderSn) {
|
||||
return mRetrofit.create(UserApi.class)
|
||||
.payQrcode(getToken(), DeviceSNManager.getDeviceSN(), orderSn)
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread());
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
*
|
||||
* execution
|
||||
|
||||
@@ -11,6 +11,19 @@ public class UrlAddress {
|
||||
/*账号密码登录*/
|
||||
public final static String USER_LOGIN = "login/user-login";
|
||||
|
||||
/*用户会员信息(用于判断是否有VIP)*/
|
||||
public static final String USER_INFO = "user/info";
|
||||
/*套餐可选列表*/
|
||||
public static final String VIP_LIST = "user/vip-list";
|
||||
/*购买VIP下订单*/
|
||||
public static final String BUY = "user/buy";
|
||||
/*激活码激活*/
|
||||
public static final String activation_code = "activation/code";
|
||||
/*发起支付*/
|
||||
public static final String PAY_QRCODE = "pay/qrcode";
|
||||
/*续费购买(已经是VIP过期或没过期)*/
|
||||
@Deprecated
|
||||
public static final String RENEW = "user/renew";
|
||||
|
||||
/*获取管理员所有应用*/
|
||||
public final static String GET_ADMIN_APP = "getAdminApp";
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package com.xwad.os.network.api;
|
||||
|
||||
import com.xwad.os.bean.BaseResponse;
|
||||
import com.xwad.os.bean.LoginInfo;
|
||||
import com.xwad.os.network.UrlAddress;
|
||||
|
||||
import io.reactivex.rxjava3.core.Observable;
|
||||
@@ -18,7 +19,7 @@ public interface LoginApi {
|
||||
|
||||
@FormUrlEncoded
|
||||
@POST(UrlAddress.CODE_LOGIN)
|
||||
Observable<BaseResponse> codeLogin(
|
||||
Observable<BaseResponse<LoginInfo>> codeLogin(
|
||||
@Field("mobile") String mobile,
|
||||
@Field("code") String code,
|
||||
@Field("sn") String sn
|
||||
|
||||
@@ -6,6 +6,8 @@ import com.xwad.os.bean.StudyStatBean;
|
||||
import com.xwad.os.bean.UserAvatarInfo;
|
||||
import com.xwad.os.network.UrlAddress;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import io.reactivex.rxjava3.core.Observable;
|
||||
import okhttp3.MultipartBody;
|
||||
import okhttp3.RequestBody;
|
||||
@@ -16,6 +18,7 @@ import retrofit2.http.GET;
|
||||
import retrofit2.http.Multipart;
|
||||
import retrofit2.http.POST;
|
||||
import retrofit2.http.Part;
|
||||
import retrofit2.http.PartMap;
|
||||
import retrofit2.http.Query;
|
||||
|
||||
public interface SnInfoApi {
|
||||
@@ -36,7 +39,7 @@ public interface SnInfoApi {
|
||||
@Multipart
|
||||
@POST(UrlAddress.UPDATE_INFO)
|
||||
Observable<BaseResponse> updateUserInfo(
|
||||
@Body RequestBody requestBody,
|
||||
@PartMap Map<String, RequestBody> params,
|
||||
@Part MultipartBody.Part body);
|
||||
|
||||
@GET(UrlAddress.GET_STUDY_STAT)
|
||||
|
||||
63
app/src/main/java/com/xwad/os/network/api/UserApi.java
Normal file
@@ -0,0 +1,63 @@
|
||||
package com.xwad.os.network.api;
|
||||
|
||||
import com.xwad.os.bean.BaseResponse;
|
||||
import com.xwad.os.bean.OrderInfo;
|
||||
import com.xwad.os.bean.PayInfo;
|
||||
import com.xwad.os.bean.UserInfo;
|
||||
import com.xwad.os.bean.VipInfo;
|
||||
import com.xwad.os.network.UrlAddress;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import io.reactivex.rxjava3.core.Observable;
|
||||
import retrofit2.http.Field;
|
||||
import retrofit2.http.FormUrlEncoded;
|
||||
import retrofit2.http.GET;
|
||||
import retrofit2.http.Header;
|
||||
import retrofit2.http.POST;
|
||||
import retrofit2.http.Query;
|
||||
|
||||
public interface UserApi {
|
||||
@GET(UrlAddress.USER_INFO)
|
||||
Observable<BaseResponse<UserInfo>> getUserInfo(
|
||||
@Header("token") String token
|
||||
);
|
||||
|
||||
@GET(UrlAddress.VIP_LIST)
|
||||
Observable<BaseResponse<List<VipInfo>>> getVipList(
|
||||
@Header("token") String token,
|
||||
@Query("app_package") String app_package
|
||||
);
|
||||
|
||||
@FormUrlEncoded
|
||||
@POST(UrlAddress.BUY)
|
||||
Observable<BaseResponse<OrderInfo>> buyVip(
|
||||
@Header("token") String token,
|
||||
@Field("sn") String sn,
|
||||
@Field("vip_level_id") String vip_level_id
|
||||
);
|
||||
|
||||
@FormUrlEncoded
|
||||
@POST(UrlAddress.activation_code)
|
||||
Observable<BaseResponse> codeActivation(
|
||||
@Header("token") String token,
|
||||
@Field("sn") String sn,
|
||||
@Field("code") String code
|
||||
);
|
||||
|
||||
@FormUrlEncoded
|
||||
@POST(UrlAddress.PAY_QRCODE)
|
||||
Observable<BaseResponse<PayInfo>> payQrcode(
|
||||
@Header("token") String token,
|
||||
@Field("sn") String sn,
|
||||
@Field("order_sn") String order_sn
|
||||
);
|
||||
|
||||
@FormUrlEncoded
|
||||
@POST(UrlAddress.RENEW)
|
||||
Observable<BaseResponse> renew(
|
||||
@Header("token") String token,
|
||||
@Field("sn") String sn,
|
||||
@Field("vip_level_id") String vip_level_id
|
||||
);
|
||||
}
|
||||
@@ -25,6 +25,7 @@ import com.xwad.os.BuildConfig;
|
||||
import com.xwad.os.R;
|
||||
import com.xwad.os.activity.main.MainActivity;
|
||||
import com.xwad.os.config.CommonConfig;
|
||||
import com.xwad.os.manager.DeviceSNManager;
|
||||
import com.xwad.os.manager.RemoteManager;
|
||||
import com.xwad.os.utils.ActivationUtil;
|
||||
import com.xwad.os.utils.LenovoCsdkUtil;
|
||||
@@ -117,7 +118,7 @@ public class SocketService extends Service implements NetworkUtils.OnNetworkStat
|
||||
registerScreenLockReceiver();
|
||||
registerJxwRegisterRefreshReceiver();
|
||||
|
||||
if (ActivationUtil.getInstance().isActivation()) {
|
||||
if (ActivationUtil.getInstance().isLogin()) {
|
||||
//初始化websocket
|
||||
initSocketClient();
|
||||
startLoop();
|
||||
@@ -294,7 +295,7 @@ public class SocketService extends Service implements NetworkUtils.OnNetworkStat
|
||||
public void accept(Long s) throws Exception {
|
||||
Log.d(TAG, "startLoop accept: " + s);
|
||||
Log.i(TAG, "心跳包检测websocket连接状态");
|
||||
if (!ActivationUtil.getInstance().isActivation()) {
|
||||
if (!ActivationUtil.getInstance().isLogin()) {
|
||||
dispose();
|
||||
}
|
||||
//每隔一定的时间,对长连接进行一次心跳检测
|
||||
@@ -322,7 +323,7 @@ public class SocketService extends Service implements NetworkUtils.OnNetworkStat
|
||||
* 初始化websocket连接
|
||||
*/
|
||||
private void initSocketClient() {
|
||||
URI uri = URI.create(BuildConfig.WEBSOCKET_URL + "?sn=" + RemoteManager.getInstance().getSerial());
|
||||
URI uri = URI.create(BuildConfig.WEBSOCKET_URL + "?sn=" + DeviceSNManager.getDeviceSN());
|
||||
mJWebSocketClient = new JWebSocketClient(uri) {
|
||||
@Override
|
||||
public void onMessage(String message) {
|
||||
@@ -400,7 +401,7 @@ public class SocketService extends Service implements NetworkUtils.OnNetworkStat
|
||||
*/
|
||||
public void sendPingMsg() {
|
||||
JsonObject jsonObject = new JsonObject();
|
||||
jsonObject.addProperty("sn", RemoteManager.getInstance().getSerial());
|
||||
jsonObject.addProperty("sn", DeviceSNManager.getDeviceSN());
|
||||
jsonObject.addProperty("type", "ping");
|
||||
if (null != mJWebSocketClient) {
|
||||
Log.i(TAG, "sendPingMsg: 发送的消息:" + jsonObject.toString());
|
||||
@@ -410,7 +411,7 @@ public class SocketService extends Service implements NetworkUtils.OnNetworkStat
|
||||
|
||||
public void sendMsgScreen() {
|
||||
JsonObject jsonObject = new JsonObject();
|
||||
jsonObject.addProperty("sn", RemoteManager.getInstance().getSerial());
|
||||
jsonObject.addProperty("sn", DeviceSNManager.getDeviceSN());
|
||||
if (Utils.isScreenOn(SocketService.this)) {
|
||||
jsonObject.addProperty("type", "device_open_screen");
|
||||
} else {
|
||||
|
||||
@@ -56,6 +56,7 @@ public class ActivationUtil {
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
@Deprecated
|
||||
public boolean isActivation() {
|
||||
return getActivationStateCode() == ACTIVATED_KEY;
|
||||
}
|
||||
@@ -105,4 +106,8 @@ public class ActivationUtil {
|
||||
return mMMKV.decodeLong(CommonConfig.UIUI_EXPIRE_TIME_KEY, DEFAULT_EXPIRE_TIME);
|
||||
}
|
||||
|
||||
public boolean isLogin() {
|
||||
return mMMKV.decodeInt(CommonConfig.ACCOUNT_LOGIN_STATU, 0) == 1;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -15,9 +15,17 @@ import android.graphics.drawable.BitmapDrawable;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.os.Build;
|
||||
|
||||
import com.google.zxing.BarcodeFormat;
|
||||
import com.google.zxing.EncodeHintType;
|
||||
import com.google.zxing.WriterException;
|
||||
import com.google.zxing.common.BitMatrix;
|
||||
import com.google.zxing.qrcode.QRCodeWriter;
|
||||
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
|
||||
import com.xwad.os.R;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public class BitmapUtils {
|
||||
public static Bitmap Bytes2Bimap(byte[] b) {
|
||||
@@ -126,4 +134,56 @@ public class BitmapUtils {
|
||||
return background;
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成二维码图片
|
||||
*
|
||||
* @param content 二维码内容
|
||||
* @param size 二维码尺寸(宽高一致)
|
||||
* @param foregroundColor 二维码前景色(二维码图案颜色)
|
||||
* @param backgroundColor 二维码背景色
|
||||
* @return 生成的二维码Bitmap,失败返回null
|
||||
*/
|
||||
public static Bitmap createQRImage(String content, int size, int foregroundColor, int backgroundColor) {
|
||||
// 参数校验:内容为空或尺寸无效时直接返回null
|
||||
if (content == null || content.isEmpty() || size <= 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
// 配置二维码参数
|
||||
Map<EncodeHintType, Object> hints = new HashMap<>();
|
||||
hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); // 字符编码
|
||||
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); // 高容错级别
|
||||
hints.put(EncodeHintType.MARGIN, 1); // 边距(默认4,这里设为1减小边距)
|
||||
|
||||
// 生成二维码矩阵
|
||||
BitMatrix bitMatrix = new QRCodeWriter().encode(content,
|
||||
BarcodeFormat.QR_CODE, size, size, hints);
|
||||
|
||||
// 像素数组:存储二维码所有像素点颜色
|
||||
int[] pixels = new int[size * size];
|
||||
|
||||
// 填充像素数据:根据矩阵生成对应颜色的像素
|
||||
for (int y = 0; y < size; y++) {
|
||||
for (int x = 0; x < size; x++) {
|
||||
// 根据矩阵点是否为黑色,设置对应前景/背景色
|
||||
pixels[y * size + x] = bitMatrix.get(x, y) ? foregroundColor : backgroundColor;
|
||||
}
|
||||
}
|
||||
|
||||
// 创建并填充Bitmap
|
||||
Bitmap bitmap = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
|
||||
bitmap.setPixels(pixels, 0, size, 0, 0, size, size);
|
||||
|
||||
return bitmap;
|
||||
|
||||
} catch (WriterException e) {
|
||||
// 编码失败(如内容过长等)
|
||||
e.printStackTrace();
|
||||
} catch (Exception e) {
|
||||
// 其他异常
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,16 +29,21 @@ import com.xwad.os.bean.BaseResponse;
|
||||
import com.xwad.os.bean.LessonJson;
|
||||
import com.xwad.os.config.CommonConfig;
|
||||
import com.xwad.os.jxw.JxwPackageConfig;
|
||||
import com.xwad.os.jxw.SPUtils;
|
||||
import com.xwad.os.manager.RemoteManager;
|
||||
import com.xwad.os.network.NetInterfaceManager;
|
||||
import com.xwad.os.service.DownloadService;
|
||||
|
||||
import java.lang.reflect.Type;
|
||||
import java.math.BigDecimal;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
import java.util.function.BiConsumer;
|
||||
import java.util.function.Predicate;
|
||||
|
||||
import io.reactivex.rxjava3.annotations.NonNull;
|
||||
import io.reactivex.rxjava3.core.Observer;
|
||||
@@ -235,7 +240,7 @@ public class OpenApkUtils {
|
||||
}};
|
||||
|
||||
private void sendRuningApp(String packageName) {
|
||||
boolean activation = ActivationUtil.getInstance().isActivation();
|
||||
boolean activation = ActivationUtil.getInstance().isLogin();
|
||||
if (!activation) {
|
||||
return;
|
||||
}
|
||||
@@ -714,6 +719,19 @@ public class OpenApkUtils {
|
||||
}
|
||||
}
|
||||
|
||||
if (!intent.hasExtra("key_grade")) {
|
||||
intent.putExtra("key_grade", SPUtils.getGrade());
|
||||
}
|
||||
if (!intent.hasExtra("grade")) {
|
||||
intent.putExtra("grade", SPUtils.getGrade());
|
||||
}
|
||||
if (!intent.hasExtra("learnStage")) {
|
||||
intent.putExtra("learnStage", checkGrade(SPUtils.getGrade()));
|
||||
}
|
||||
if (!intent.hasExtra("key_id")) {
|
||||
intent.putExtra("key_id", checkGradeInt(SPUtils.getGrade()));
|
||||
}
|
||||
|
||||
// 4. 启动Activity(处理异常)
|
||||
try {
|
||||
activity.startActivity(intent);
|
||||
@@ -848,4 +866,131 @@ public class OpenApkUtils {
|
||||
});
|
||||
}
|
||||
|
||||
public String getDeskClockPackageName() {
|
||||
List<String> pkgList = new ArrayList<String>() {{
|
||||
this.add("com.android.deskclock");
|
||||
this.add("com.hihonor.deskclock");
|
||||
this.add("com.huawei.deskclock");
|
||||
this.add("com.coloros.alarmclock");
|
||||
this.add("com.android.BBKClock");
|
||||
}};
|
||||
|
||||
Optional<String> optional = pkgList.stream().filter(new Predicate<String>() {
|
||||
@Override
|
||||
public boolean test(String s) {
|
||||
return ApkUtils.isAvailable(mContext, s);
|
||||
}
|
||||
}).findFirst();
|
||||
return optional.orElse("com.android.deskclock");
|
||||
}
|
||||
|
||||
public String getCalculatorPackageName() {
|
||||
List<String> pkgList = new ArrayList<String>() {{
|
||||
this.add("com.android.calculator2");
|
||||
this.add("com.hihonor.calculator");
|
||||
this.add("com.huawei.calculator");
|
||||
this.add("com.miui.calculator");
|
||||
this.add("com.coloros.calculator");
|
||||
this.add("com.android.bbkcalculator");
|
||||
}};
|
||||
|
||||
Optional<String> optional = pkgList.stream().filter(new Predicate<String>() {
|
||||
@Override
|
||||
public boolean test(String s) {
|
||||
return ApkUtils.isAvailable(mContext, s);
|
||||
}
|
||||
}).findFirst();
|
||||
return optional.orElse("com.android.deskclock");
|
||||
}
|
||||
|
||||
public String getCameraPackageName() {
|
||||
List<String> pkgList = new ArrayList<String>() {{
|
||||
this.add("com.android.camera");
|
||||
this.add("com.hihonor.camera");
|
||||
this.add("com.huawei.camera");
|
||||
this.add("com.oplus.camera");
|
||||
}};
|
||||
|
||||
Optional<String> optional = pkgList.stream().filter(new Predicate<String>() {
|
||||
@Override
|
||||
public boolean test(String s) {
|
||||
return ApkUtils.isAvailable(mContext, s);
|
||||
}
|
||||
}).findFirst();
|
||||
return optional.orElse("com.android.camera");
|
||||
}
|
||||
|
||||
public String getGalleryPackageName() {
|
||||
List<String> pkgList = new ArrayList<String>() {{
|
||||
this.add("com.android.gallery3d");
|
||||
this.add("com.hihonor.photos");
|
||||
this.add("com.huawei.photos");
|
||||
this.add("com.miui.gallery");
|
||||
this.add("com.coloros.gallery3d");
|
||||
this.add("com.vivo.gallery");
|
||||
}};
|
||||
|
||||
Optional<String> optional = pkgList.stream().filter(new Predicate<String>() {
|
||||
@Override
|
||||
public boolean test(String s) {
|
||||
return ApkUtils.isAvailable(mContext, s);
|
||||
}
|
||||
}).findFirst();
|
||||
return optional.orElse("com.android.gallery3d");
|
||||
}
|
||||
|
||||
public static String checkGrade(String str) {
|
||||
if (!TextUtils.isEmpty(str)) {
|
||||
switch (str) {
|
||||
case "一年级":
|
||||
case "二年级":
|
||||
case "三年级":
|
||||
case "四年级":
|
||||
case "五年级":
|
||||
case "六年级":
|
||||
return "小学";
|
||||
case "初中六年级":
|
||||
case "七年级":
|
||||
case "八年级":
|
||||
case "九年级":
|
||||
return "初中";
|
||||
case "高一":
|
||||
case "高二":
|
||||
case "高三":
|
||||
return "高中";
|
||||
default:
|
||||
return "初中";
|
||||
}
|
||||
} else {
|
||||
return "初中";
|
||||
}
|
||||
}
|
||||
|
||||
public static int checkGradeInt(String str) {
|
||||
if (!TextUtils.isEmpty(str)) {
|
||||
switch (str) {
|
||||
case "一年级":
|
||||
case "二年级":
|
||||
case "三年级":
|
||||
case "四年级":
|
||||
case "五年级":
|
||||
case "六年级":
|
||||
return 1;
|
||||
case "初中六年级":
|
||||
case "七年级":
|
||||
case "八年级":
|
||||
case "九年级":
|
||||
return 2;
|
||||
case "高一":
|
||||
case "高二":
|
||||
case "高三":
|
||||
return 3;
|
||||
default:
|
||||
return 2;
|
||||
}
|
||||
} else {
|
||||
return 2;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
BIN
app/src/main/res/drawable-hdpi/vip_details.png
Normal file
|
After Width: | Height: | Size: 164 KiB |
|
Before Width: | Height: | Size: 171 KiB After Width: | Height: | Size: 171 KiB |
|
Before Width: | Height: | Size: 79 KiB After Width: | Height: | Size: 118 KiB |
|
Before Width: | Height: | Size: 116 KiB After Width: | Height: | Size: 111 KiB |
|
Before Width: | Height: | Size: 116 KiB After Width: | Height: | Size: 116 KiB |
|
Before Width: | Height: | Size: 96 KiB After Width: | Height: | Size: 96 KiB |
|
Before Width: | Height: | Size: 198 KiB After Width: | Height: | Size: 198 KiB |
|
Before Width: | Height: | Size: 198 KiB After Width: | Height: | Size: 198 KiB |
|
Before Width: | Height: | Size: 125 KiB After Width: | Height: | Size: 125 KiB |
|
Before Width: | Height: | Size: 115 KiB After Width: | Height: | Size: 115 KiB |
|
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 1.9 KiB |
BIN
app/src/main/res/drawable-nodpi/icon_tab_app_pre.png
Normal file
|
After Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 354 KiB After Width: | Height: | Size: 519 KiB |
|
Before Width: | Height: | Size: 142 KiB After Width: | Height: | Size: 142 KiB |
|
Before Width: | Height: | Size: 141 KiB After Width: | Height: | Size: 141 KiB |
|
Before Width: | Height: | Size: 258 KiB After Width: | Height: | Size: 536 KiB |
|
Before Width: | Height: | Size: 521 KiB After Width: | Height: | Size: 521 KiB |
|
Before Width: | Height: | Size: 529 KiB After Width: | Height: | Size: 529 KiB |
|
Before Width: | Height: | Size: 415 KiB After Width: | Height: | Size: 748 KiB |
|
Before Width: | Height: | Size: 748 KiB After Width: | Height: | Size: 1.0 MiB |
6
app/src/main/res/drawable/bg_vip_select.xml
Normal file
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<!-- 内部颜色 -->
|
||||
<solid android:color="@color/default_blue" />
|
||||
<corners android:radius="8dp" />
|
||||
</shape>
|
||||
6
app/src/main/res/drawable/bg_vip_unselect.xml
Normal file
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<!-- 内部颜色 -->
|
||||
<solid android:color="#C9D9FF" />
|
||||
<corners android:radius="8dp" />
|
||||
</shape>
|
||||
11
app/src/main/res/drawable/edit_text_login_bg.xml
Normal file
@@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<!-- 内部颜色 -->
|
||||
<solid android:color="#F2F1F1" />
|
||||
<!-- 圆角的幅度 -->
|
||||
<corners android:radius="32dp" />
|
||||
|
||||
<padding
|
||||
android:left="8dp"
|
||||
android:right="8dp" />
|
||||
</shape>
|
||||
9
app/src/main/res/drawable/ic_negative.xml
Normal file
@@ -0,0 +1,9 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="12dp"
|
||||
android:height="12dp"
|
||||
android:viewportWidth="1024"
|
||||
android:viewportHeight="1024">
|
||||
<path
|
||||
android:fillColor="#CDE0FF"
|
||||
android:pathData="M512,512m-448,0a448,448 0,1 0,896 0,448 448,0 1,0 -896,0Z" />
|
||||
</vector>
|
||||
10
app/src/main/res/drawable/ic_positive.xml
Normal file
@@ -0,0 +1,10 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="12dp"
|
||||
android:height="12dp"
|
||||
android:viewportWidth="1024"
|
||||
android:viewportHeight="1024">
|
||||
|
||||
<path
|
||||
android:fillColor="#0362ff"
|
||||
android:pathData="M511.6,63.6c-246.9,0 -448,201.2 -448,448 0,247.3 201.2,448 448,448s448,-200.7 448,-448c0,-246.9 -200.7,-448 -448,-448zM771.5,382.1L474.6,699.3c-7,7.3 -16.5,12.1 -27.4,12.1 -10.5,0 -20.5,-4.7 -27.4,-12.1L252,520c-7,-7.3 -11.5,-17.8 -11.5,-29.4 0,-23.1 17.5,-41.4 38.9,-41.4 10.5,0 20.5,4.7 27.4,12.1l140.7,149.9 270,-287.8c7,-7.3 16.5,-12.1 27.4,-12.1 21.5,0 38.9,18.3 38.9,41.4 -0.8,11.6 -5.3,22.1 -12.3,29.4zM771.5,382.1" />
|
||||
</vector>
|
||||
5
app/src/main/res/drawable/policy_checkbox_bg.xml
Normal file
@@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:state_enabled="true" android:state_checked="false" android:drawable="@drawable/ic_negative" />
|
||||
<item android:state_enabled="true" android:state_checked="true" android:drawable="@drawable/ic_positive" />
|
||||
</selector>
|
||||
18
app/src/main/res/drawable/tv_activation.xml
Normal file
@@ -0,0 +1,18 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<!-- 内部颜色 -->
|
||||
<!-- <solid android:color="@color/check_update_color" />-->
|
||||
<!-- 圆角的幅度 -->
|
||||
<corners android:radius="4dp" />
|
||||
|
||||
<padding
|
||||
android:bottom="8dp"
|
||||
android:left="4dp"
|
||||
android:right="4dp"
|
||||
android:top="8dp" />
|
||||
|
||||
<gradient
|
||||
android:angle="270"
|
||||
android:endColor="#4c71f6"
|
||||
android:startColor="#6695f7" />
|
||||
</shape>
|
||||
@@ -3,11 +3,11 @@
|
||||
<!-- 内部颜色 -->
|
||||
<solid android:color="@color/default_blue" />
|
||||
<!-- 圆角的幅度 -->
|
||||
<corners android:radius="32dp" />
|
||||
<corners android:radius="16dp" />
|
||||
|
||||
<padding
|
||||
android:bottom="6dp"
|
||||
android:left="32dp"
|
||||
android:right="32dp"
|
||||
android:top="6dp" />
|
||||
android:bottom="4dp"
|
||||
android:left="20dp"
|
||||
android:right="20dp"
|
||||
android:top="4dp" />
|
||||
</shape>
|
||||
@@ -3,11 +3,11 @@
|
||||
<!-- 内部颜色 -->
|
||||
<solid android:color="@color/lightGray" />
|
||||
<!-- 圆角的幅度 -->
|
||||
<corners android:radius="32dp" />
|
||||
<corners android:radius="16dp" />
|
||||
|
||||
<padding
|
||||
android:bottom="6dp"
|
||||
android:left="32dp"
|
||||
android:right="32dp"
|
||||
android:top="6dp" />
|
||||
android:bottom="4dp"
|
||||
android:left="20dp"
|
||||
android:right="20dp"
|
||||
android:top="4dp" />
|
||||
</shape>
|
||||
@@ -625,6 +625,7 @@
|
||||
android:layout_height="25dp"
|
||||
android:adjustViewBounds="true"
|
||||
android:scaleType="centerCrop"
|
||||
android:onClick="@{click::keyConfirm}"
|
||||
android:src="@drawable/icon_activation_confirm"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
|
||||
@@ -116,7 +116,7 @@
|
||||
android:layout_marginEnd="19dp"
|
||||
android:ellipsize="marquee"
|
||||
android:singleLine="true"
|
||||
android:text="小九"
|
||||
android:text="@string/default_nickname"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="9sp" />
|
||||
|
||||
|
||||
68
app/src/main/res/layout/activity_pay_vip.xml
Normal file
@@ -0,0 +1,68 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<layout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
tools:context=".activity.vip.pay.PayVipActivity">
|
||||
|
||||
<data>
|
||||
|
||||
<variable
|
||||
name="click"
|
||||
type="com.xwad.os.activity.vip.pay.PayVipActivity.BtnClick" />
|
||||
</data>
|
||||
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/iv_qrcode"
|
||||
android:layout_width="180dp"
|
||||
android:layout_height="180dp"
|
||||
android:adjustViewBounds="true"
|
||||
android:scaleType="centerCrop"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintHorizontal_bias="0.499"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintVertical_bias="0.219" />
|
||||
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="@+id/iv_qrcode"
|
||||
app:layout_constraintStart_toStartOf="@+id/iv_qrcode"
|
||||
app:layout_constraintTop_toBottomOf="@+id/iv_qrcode">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/imageView28"
|
||||
android:layout_width="48dp"
|
||||
android:layout_height="48dp"
|
||||
android:adjustViewBounds="true"
|
||||
android:scaleType="centerCrop"
|
||||
android:src="@drawable/icon_wechat_pay"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="16dp"
|
||||
android:maxLines="1"
|
||||
android:singleLine="true"
|
||||
android:text="请使用微信扫描二维码"
|
||||
android:textColor="@color/black"
|
||||
android:textSize="16sp"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toEndOf="@+id/imageView28"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
||||
</layout>
|
||||