version:1.0.9

fix:
update:更新资源,增加登录,增加检测更新
This commit is contained in:
2025-12-18 09:22:38 +08:00
parent ed285c05ee
commit daebcee8b8
125 changed files with 5261 additions and 237 deletions

View File

@@ -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"

View File

@@ -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>

View File

@@ -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);
}
}
}

View File

@@ -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: ");
}
});
}
}

View File

@@ -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());

View File

@@ -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>() {

View File

@@ -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);

View File

@@ -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;
}

View File

@@ -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();
}
});
}

View File

@@ -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);
}
}

View File

@@ -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();

View File

@@ -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,

View File

@@ -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();
}
}
}

View File

@@ -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;
}

View File

@@ -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) {

View File

@@ -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);

View File

@@ -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)

View 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) {
}
}
}

View File

@@ -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: ");
}
});
}
}

View File

@@ -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 {
}
}

View File

@@ -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: ");
}
});
}
}

View 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);
}
}
}

View File

@@ -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);

View 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;
}
}

View File

@@ -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() {
}
}

View 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();
}
}

View 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();
}
}

View 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();
}
}

View 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();
}
}

View 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();
}
}

View 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();
}
}

View 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();
}
}

View 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();
}
}

View File

@@ -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";
}

View File

@@ -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()) {

View File

@@ -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);

View File

@@ -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();
}
}
}
}

View File

@@ -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) {
}
}

View File

@@ -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();
}
}
}
}

View File

@@ -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) {
}
}

View File

@@ -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();
}
}
}
}

View File

@@ -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() {
}
}

View File

@@ -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();
}
}
}
}

View File

@@ -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) {
}
}

View File

@@ -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");
}
}
}

View File

@@ -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() {
}
}

View File

@@ -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 {
}
}

View File

@@ -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() {
}
}

View File

@@ -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;

View File

@@ -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() {

View File

@@ -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);

View File

@@ -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 {

View File

@@ -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;
}

View File

@@ -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));
}
}
}

View File

@@ -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: ");
}
});
}
}

View File

@@ -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

View File

@@ -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();

View File

@@ -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>() {

View File

@@ -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);

View File

@@ -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

View File

@@ -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";

View File

@@ -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

View File

@@ -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)

View 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
);
}

View File

@@ -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 {

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 164 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 171 KiB

After

Width:  |  Height:  |  Size: 171 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 79 KiB

After

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 116 KiB

After

Width:  |  Height:  |  Size: 111 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 116 KiB

After

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 96 KiB

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 198 KiB

After

Width:  |  Height:  |  Size: 198 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 198 KiB

After

Width:  |  Height:  |  Size: 198 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 125 KiB

After

Width:  |  Height:  |  Size: 125 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 115 KiB

After

Width:  |  Height:  |  Size: 115 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 354 KiB

After

Width:  |  Height:  |  Size: 519 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 142 KiB

After

Width:  |  Height:  |  Size: 142 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 141 KiB

After

Width:  |  Height:  |  Size: 141 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 258 KiB

After

Width:  |  Height:  |  Size: 536 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 521 KiB

After

Width:  |  Height:  |  Size: 521 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 529 KiB

After

Width:  |  Height:  |  Size: 529 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 415 KiB

After

Width:  |  Height:  |  Size: 748 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 748 KiB

After

Width:  |  Height:  |  Size: 1.0 MiB

View 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>

View 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>

View 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>

View 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>

View 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>

View 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>

View 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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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"

View File

@@ -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" />

View 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>

Some files were not shown because too many files have changed in this diff Show More