diff --git a/app/build.gradle b/app/build.gradle
index f96dd46..7b31e6a 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -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"
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 37dd993..4d1d18d 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -232,6 +232,16 @@
android:name=".activity.homework.HomeworkDetailsActivity"
android:launchMode="singleTask"
android:screenOrientation="landscape" />
+
+
+ android:value="624" />
+ android:value="390" />
\ No newline at end of file
diff --git a/app/src/main/java/com/xwad/os/activity/activation/ActivationActivity.java b/app/src/main/java/com/xwad/os/activity/activation/ActivationActivity.java
index 78b957e..1b7465e 100644
--- a/app/src/main/java/com/xwad/os/activity/activation/ActivationActivity.java
+++ b/app/src/main/java/com/xwad/os/activity/activation/ActivationActivity.java
@@ -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 {
@@ -64,6 +77,40 @@ public class ActivationActivity extends BaseMvvmActivity>() {
+ @Override
+ public void onChanged(List vipInfos) {
+ Optional 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() {
+ @Override
+ public void onChanged(OrderInfo orderInfo) {
+ if (orderInfo != null) {
+ mViewModel.getQrCodeUrl(orderInfo.getOrder_sn());
+ }
+ }
+ });
+
+ mViewModel.mPayInfoData.observe(this, new Observer() {
+ @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 {
@@ -15,4 +32,132 @@ public class ActivationViewModel extends BaseViewModel> mVipInfoListData = new MutableLiveData<>();
+
+ public void getVipList() {
+ NetInterfaceManager.getInstance().getVipListControl()
+ .compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY))
+ .subscribe(new Observer>>() {
+ @Override
+ public void onSubscribe(@NonNull Disposable d) {
+ Log.e("getVipList", "onSubscribe: ");
+ }
+
+ @Override
+ public void onNext(@NonNull BaseResponse> listBaseResponse) {
+ Log.e("getVipList", "onNext: " + listBaseResponse);
+ if (listBaseResponse.code == 200) {
+ List 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 mOrderInfoData = new MutableLiveData<>();
+
+ public void getPayInfo(String vipId) {
+ NetInterfaceManager.getInstance().getBuyVipControl(vipId)
+ .compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY))
+ .subscribe(new Observer>() {
+ @Override
+ public void onSubscribe(@NonNull Disposable d) {
+ Log.e("getPayUrl", "onSubscribe: ");
+ }
+
+ @Override
+ public void onNext(@NonNull BaseResponse 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 mPayInfoData = new MutableLiveData<>();
+
+ public void getQrCodeUrl(String orderSn) {
+ NetInterfaceManager.getInstance().getPayQrcodeControl(orderSn)
+ .compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY))
+ .subscribe(new Observer>() {
+ @Override
+ public void onSubscribe(@NonNull Disposable d) {
+ Log.e("getQrCodeUrl", "onSubscribe: ");
+ }
+
+ @Override
+ public void onNext(@NonNull BaseResponse 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() {
+ @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: ");
+ }
+ });
+ }
}
diff --git a/app/src/main/java/com/xwad/os/activity/edit/EditActivity.java b/app/src/main/java/com/xwad/os/activity/edit/EditActivity.java
index 5f61fb6..d7ada17 100644
--- a/app/src/main/java/com/xwad/os/activity/edit/EditActivity.java
+++ b/app/src/main/java/com/xwad/os/activity/edit/EditActivity.java
@@ -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 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());
diff --git a/app/src/main/java/com/xwad/os/activity/edit/EditViewModel.java b/app/src/main/java/com/xwad/os/activity/edit/EditViewModel.java
index 07413ce..d62e395 100644
--- a/app/src/main/java/com/xwad/os/activity/edit/EditViewModel.java
+++ b/app/src/main/java/com/xwad/os/activity/edit/EditViewModel.java
@@ -34,9 +34,6 @@ public class EditViewModel extends BaseViewModel mSuccessfulData = new MutableLiveData<>();
public void updateInfo(Map params) {
- if (!ActivationUtil.getInstance().isActivation()) {
- return;
- }
NetInterfaceManager.getInstance().getUpdateInfoObservable(params)
.compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY))
.subscribe(new Observer() {
diff --git a/app/src/main/java/com/xwad/os/activity/home/HomeActivity.java b/app/src/main/java/com/xwad/os/activity/home/HomeActivity.java
index a28feeb..3a43d7a 100644
--- a/app/src/main/java/com/xwad/os/activity/home/HomeActivity.java
+++ b/app/src/main/java/com/xwad/os/activity/home/HomeActivity.java
@@ -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() {
+ @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 mSystemSettingsMutableLiveData = new MutableLiveData<>();
public void getSystemSettings() {
- NetInterfaceManager.getInstance().getsettingControl()
+ NetInterfaceManager.getInstance().getSettingControl()
.subscribe(new Observer>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
@@ -158,7 +159,7 @@ public class HomeViewModel extends BaseViewModel {
@@ -31,6 +36,15 @@ public class LoginActivity extends BaseMvvmActivity() {
+ @Override
+ public void onChanged(LoginInfo loginInfo) {
+ Toaster.show("登录成功");
+ Intent intent = new Intent();
+ setResult(Activity.RESULT_OK, intent);
+ finish();
+ }
+ });
}
diff --git a/app/src/main/java/com/xwad/os/activity/login/LoginViewModel.java b/app/src/main/java/com/xwad/os/activity/login/LoginViewModel.java
index 6a25212..2b967ac 100644
--- a/app/src/main/java/com/xwad/os/activity/login/LoginViewModel.java
+++ b/app/src/main/java/com/xwad/os/activity/login/LoginViewModel.java
@@ -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 {
+ 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 mLoginSuccessfullyData = new MutableLiveData<>();
+ public MutableLiveData mLoginInfoData = new MutableLiveData<>();
public void codeLogin(String mobile, String code) {
NetInterfaceManager.getInstance().getCodeLoginObservable(mobile, code)
.compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY))
- .subscribe(new Observer() {
+ .subscribe(new Observer>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
Log.e("codeLogin", "onSubscribe: ");
}
@Override
- public void onNext(@NonNull BaseResponse baseResponse) {
+ public void onNext(@NonNull BaseResponse 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);
}
}
diff --git a/app/src/main/java/com/xwad/os/activity/main/MainActivity.java b/app/src/main/java/com/xwad/os/activity/main/MainActivity.java
index 1161045..1069ffc 100644
--- a/app/src/main/java/com/xwad/os/activity/main/MainActivity.java
+++ b/app/src/main/java/com/xwad/os/activity/main/MainActivity.java
@@ -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() {
-// @Override
-// public void onChanged(Boolean aBoolean) {
-// if (aBoolean) {
+ mViewModel.mSuccessfulData.observe(this, new Observer() {
+ @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 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 params = new HashMap<>();
+ params.put("sn", DeviceSNManager.getDeviceSN());
+ params.put("sn_grade", grade);
+ mViewModel.updateInfo(params);
+ } else {
+ finish();
+ }
}
}
diff --git a/app/src/main/java/com/xwad/os/activity/selectegrade/SelecteGradeViewModel.java b/app/src/main/java/com/xwad/os/activity/selectegrade/SelecteGradeViewModel.java
index 6886a10..08a6810 100644
--- a/app/src/main/java/com/xwad/os/activity/selectegrade/SelecteGradeViewModel.java
+++ b/app/src/main/java/com/xwad/os/activity/selectegrade/SelecteGradeViewModel.java
@@ -34,7 +34,7 @@ public class SelecteGradeViewModel extends BaseViewModel mSuccessfulData = new MutableLiveData<>();
public void updateInfo(Map params) {
- if (!ActivationUtil.getInstance().isActivation()) {
+ if (!ActivationUtil.getInstance().isLogin()) {
return;
}
diff --git a/app/src/main/java/com/xwad/os/activity/update/UpdateActivity.java b/app/src/main/java/com/xwad/os/activity/update/UpdateActivity.java
index 63b3452..d866447 100644
--- a/app/src/main/java/com/xwad/os/activity/update/UpdateActivity.java
+++ b/app/src/main/java/com/xwad/os/activity/update/UpdateActivity.java
@@ -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= Build.VERSION_CODES.O) {
+ startForegroundService(intent);
+ } else {
+ startService(intent);
+ }
if (mAppInfoData != null) {
DownloadEntity entity = Aria.download(this).getFirstDownloadEntity(mAppInfoData.getApp_url());
if (null != entity) {
diff --git a/app/src/main/java/com/xwad/os/activity/user/UserActivity.java b/app/src/main/java/com/xwad/os/activity/user/UserActivity.java
index 455d467..e74bc9c 100644
--- a/app/src/main/java/com/xwad/os/activity/user/UserActivity.java
+++ b/app/src/main/java/com/xwad/os/activity/user/UserActivity.java
@@ -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 params = new HashMap<>();
- params.put("sn", RemoteManager.getInstance().getSerial());
+ Map params = new HashMap<>();
+ params.put("sn", NetInterfaceManager.convertToJsonRequestBody(DeviceSNManager.getDeviceSN()));
mViewModel.updateInfo(params, body);
} else {
mMMKV.encode(CommonConfig.UIUI_USER_AVATAR_KEY, avatarFilePath);
diff --git a/app/src/main/java/com/xwad/os/activity/user/UserViewModel.java b/app/src/main/java/com/xwad/os/activity/user/UserViewModel.java
index 0d7b7be..36f5b8b 100644
--- a/app/src/main/java/com/xwad/os/activity/user/UserViewModel.java
+++ b/app/src/main/java/com/xwad/os/activity/user/UserViewModel.java
@@ -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 {
private static final String TAG = "UserViewModel";
@@ -104,9 +105,8 @@ public class UserViewModel extends BaseViewModel mSuccessfulData = new MutableLiveData<>();
- public void updateInfo(Map params, MultipartBody.Part multipartBody) {
- if (!ActivationUtil.getInstance().isActivation()) {
-
+ public void updateInfo(Map params, MultipartBody.Part multipartBody) {
+ if (!ActivationUtil.getInstance().isLogin()) {
return;
}
NetInterfaceManager.getInstance().getUpdateInfoObservable(params, multipartBody)
diff --git a/app/src/main/java/com/xwad/os/activity/vip/list/VipActivity.java b/app/src/main/java/com/xwad/os/activity/vip/list/VipActivity.java
new file mode 100644
index 0000000..1e9b2fb
--- /dev/null
+++ b/app/src/main/java/com/xwad/os/activity/vip/list/VipActivity.java
@@ -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 {
+ private static final String TAG = "VipActivity";
+
+ private ActivityResultLauncher 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() {
+ @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>() {
+ @Override
+ public void onChanged(List 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() {
+ @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() {
+ @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) {
+
+ }
+ }
+}
diff --git a/app/src/main/java/com/xwad/os/activity/vip/list/VipViewModel.java b/app/src/main/java/com/xwad/os/activity/vip/list/VipViewModel.java
new file mode 100644
index 0000000..9845df4
--- /dev/null
+++ b/app/src/main/java/com/xwad/os/activity/vip/list/VipViewModel.java
@@ -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 {
+
+ @Override
+ public ActivityVipBinding getVDBinding() {
+ return binding;
+ }
+
+ @Override
+ public void onDestroy() {
+
+ }
+
+ public MutableLiveData> mVipInfoListData = new MutableLiveData<>();
+
+ public void getVipList() {
+ NetInterfaceManager.getInstance().getVipListControl()
+ .compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY))
+ .subscribe(new Observer>>() {
+ @Override
+ public void onSubscribe(@NonNull Disposable d) {
+ Log.e("getVipList", "onSubscribe: ");
+ }
+
+ @Override
+ public void onNext(@NonNull BaseResponse> listBaseResponse) {
+ Log.e("getVipList", "onNext: " + listBaseResponse);
+ if (listBaseResponse.code == 200) {
+ List 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: ");
+ }
+ });
+ }
+
+}
diff --git a/app/src/main/java/com/xwad/os/activity/vip/pay/PayVipActivity.java b/app/src/main/java/com/xwad/os/activity/vip/pay/PayVipActivity.java
new file mode 100644
index 0000000..e8afb3d
--- /dev/null
+++ b/app/src/main/java/com/xwad/os/activity/vip/pay/PayVipActivity.java
@@ -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 {
+
+ 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() {
+ @Override
+ public void onChanged(OrderInfo orderInfo) {
+ if (orderInfo != null) {
+ mViewModel.getQrCodeUrl(orderInfo.getOrder_sn());
+ }
+ }
+ });
+
+ mViewModel.mPayInfoData.observe(this, new Observer() {
+ @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() {
+ @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 {
+
+ }
+
+
+}
diff --git a/app/src/main/java/com/xwad/os/activity/vip/pay/PayVipViewModel.java b/app/src/main/java/com/xwad/os/activity/vip/pay/PayVipViewModel.java
new file mode 100644
index 0000000..6e38e39
--- /dev/null
+++ b/app/src/main/java/com/xwad/os/activity/vip/pay/PayVipViewModel.java
@@ -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 {
+
+ @Override
+ public void onDestroy() {
+
+ }
+
+ public MutableLiveData mOrderInfoData = new MutableLiveData<>();
+
+ public void getPayInfo(String vipId) {
+ NetInterfaceManager.getInstance().getBuyVipControl(vipId)
+ .compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY))
+ .subscribe(new Observer>() {
+ @Override
+ public void onSubscribe(@NonNull Disposable d) {
+ Log.e("getPayUrl", "onSubscribe: ");
+ }
+
+ @Override
+ public void onNext(@NonNull BaseResponse 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 mPayInfoData = new MutableLiveData<>();
+
+ public void getQrCodeUrl(String orderSn) {
+ NetInterfaceManager.getInstance().getPayQrcodeControl(orderSn)
+ .compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY))
+ .subscribe(new Observer>() {
+ @Override
+ public void onSubscribe(@NonNull Disposable d) {
+ Log.e("getQrCodeUrl", "onSubscribe: ");
+ }
+
+ @Override
+ public void onNext(@NonNull BaseResponse 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: ");
+ }
+ });
+ }
+}
diff --git a/app/src/main/java/com/xwad/os/adapter/VipAdapter.java b/app/src/main/java/com/xwad/os/adapter/VipAdapter.java
new file mode 100644
index 0000000..70b11ad
--- /dev/null
+++ b/app/src/main/java/com/xwad/os/adapter/VipAdapter.java
@@ -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 {
+ private Context mContext;
+
+ private List mVipInfos;
+ private String mSelectId = "";
+
+ public void setVipInfos(List 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);
+ }
+ }
+}
diff --git a/app/src/main/java/com/xwad/os/base/BaseApplication.java b/app/src/main/java/com/xwad/os/base/BaseApplication.java
index 55b8409..ac0a9e7 100644
--- a/app/src/main/java/com/xwad/os/base/BaseApplication.java
+++ b/app/src/main/java/com/xwad/os/base/BaseApplication.java
@@ -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);
diff --git a/app/src/main/java/com/xwad/os/base/BaseDialogFragment.java b/app/src/main/java/com/xwad/os/base/BaseDialogFragment.java
new file mode 100644
index 0000000..165a52d
--- /dev/null
+++ b/app/src/main/java/com/xwad/os/base/BaseDialogFragment.java
@@ -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;
+ }
+
+}
diff --git a/app/src/main/java/com/xwad/os/base/mvvm/fragment/BaseMvvmDialogFragment.java b/app/src/main/java/com/xwad/os/base/mvvm/fragment/BaseMvvmDialogFragment.java
new file mode 100644
index 0000000..e755117
--- /dev/null
+++ b/app/src/main/java/com/xwad/os/base/mvvm/fragment/BaseMvvmDialogFragment.java
@@ -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 extends BaseDialogFragment {
+ protected String mTag = this.getClass().getSimpleName();
+ /**
+ * 是否顯示了
+ */
+ protected boolean mIsVisible;
+ /**
+ * 是否準備好了-Created
+ */
+ protected boolean mHasPrepare;
+
+
+ protected VM mViewModel;
+ protected VDB mViewDataBinding;
+ protected Class vmClass;
+ //
+// protected Toolbar toolbar;
+// protected View statusBarView;
+ //
+ protected Bundle bundle;//来自getArguments()
+ protected Bundle savedInstanceState;
+
+// protected Context context;
+
+ /**
+ * 上下文
+ */
+ private WeakReference 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) ((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() {
+
+ }
+
+}
diff --git a/app/src/main/java/com/xwad/os/base/rx/BaseRxDialogFragment.java b/app/src/main/java/com/xwad/os/base/rx/BaseRxDialogFragment.java
new file mode 100644
index 0000000..20c8854
--- /dev/null
+++ b/app/src/main/java/com/xwad/os/base/rx/BaseRxDialogFragment.java
@@ -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 {
+ private final BehaviorSubject lifecycleSubject = BehaviorSubject.create();
+
+ public BehaviorSubject getLifecycleSubject() {
+ return lifecycleSubject;
+ }
+
+ @Override
+ @NonNull
+ @CheckResult
+ public final Observable lifecycle() {
+ return lifecycleSubject.hide();
+ }
+
+ @Override
+ @NonNull
+ @CheckResult
+ public final LifecycleTransformer bindUntilEvent(@NonNull FragmentEvent event) {
+ return RxLifecycle.bindUntilEvent(lifecycleSubject, event);
+ }
+
+ @Override
+ @NonNull
+ @CheckResult
+ public final LifecycleTransformer 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();
+ }
+}
+
diff --git a/app/src/main/java/com/xwad/os/bean/LoginInfo.java b/app/src/main/java/com/xwad/os/bean/LoginInfo.java
new file mode 100644
index 0000000..7f8697b
--- /dev/null
+++ b/app/src/main/java/com/xwad/os/bean/LoginInfo.java
@@ -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();
+ }
+}
diff --git a/app/src/main/java/com/xwad/os/bean/LoginInfoDevice.java b/app/src/main/java/com/xwad/os/bean/LoginInfoDevice.java
new file mode 100644
index 0000000..5ad339c
--- /dev/null
+++ b/app/src/main/java/com/xwad/os/bean/LoginInfoDevice.java
@@ -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();
+ }
+}
diff --git a/app/src/main/java/com/xwad/os/bean/OrderInfo.java b/app/src/main/java/com/xwad/os/bean/OrderInfo.java
new file mode 100644
index 0000000..fad8a8b
--- /dev/null
+++ b/app/src/main/java/com/xwad/os/bean/OrderInfo.java
@@ -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();
+ }
+}
diff --git a/app/src/main/java/com/xwad/os/bean/PayInfo.java b/app/src/main/java/com/xwad/os/bean/PayInfo.java
new file mode 100644
index 0000000..49f6323
--- /dev/null
+++ b/app/src/main/java/com/xwad/os/bean/PayInfo.java
@@ -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();
+ }
+}
diff --git a/app/src/main/java/com/xwad/os/bean/UserInfo.java b/app/src/main/java/com/xwad/os/bean/UserInfo.java
new file mode 100644
index 0000000..1ff0b52
--- /dev/null
+++ b/app/src/main/java/com/xwad/os/bean/UserInfo.java
@@ -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();
+ }
+}
diff --git a/app/src/main/java/com/xwad/os/bean/VipInfo.java b/app/src/main/java/com/xwad/os/bean/VipInfo.java
new file mode 100644
index 0000000..8b1727d
--- /dev/null
+++ b/app/src/main/java/com/xwad/os/bean/VipInfo.java
@@ -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();
+ }
+}
diff --git a/app/src/main/java/com/xwad/os/bean/VipLevel.java b/app/src/main/java/com/xwad/os/bean/VipLevel.java
new file mode 100644
index 0000000..47da001
--- /dev/null
+++ b/app/src/main/java/com/xwad/os/bean/VipLevel.java
@@ -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();
+ }
+}
diff --git a/app/src/main/java/com/xwad/os/config/CommonConfig.java b/app/src/main/java/com/xwad/os/config/CommonConfig.java
index 1c9b540..d6dfad7 100644
--- a/app/src/main/java/com/xwad/os/config/CommonConfig.java
+++ b/app/src/main/java/com/xwad/os/config/CommonConfig.java
@@ -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";
}
diff --git a/app/src/main/java/com/xwad/os/fragment/chinese/ChineseFragment.java b/app/src/main/java/com/xwad/os/fragment/chinese/ChineseFragment.java
index 653faed..900e39d 100644
--- a/app/src/main/java/com/xwad/os/fragment/chinese/ChineseFragment.java
+++ b/app/src/main/java/com/xwad/os/fragment/chinese/ChineseFragment.java
@@ -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 {
+ 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() {
+ @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();
+ }
+ }
+ }
+}
diff --git a/app/src/main/java/com/xwad/os/fragment/dialog/login/account/AccountLoginViewModel.java b/app/src/main/java/com/xwad/os/fragment/dialog/login/account/AccountLoginViewModel.java
new file mode 100644
index 0000000..e6f091b
--- /dev/null
+++ b/app/src/main/java/com/xwad/os/fragment/dialog/login/account/AccountLoginViewModel.java
@@ -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 {
+ 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 mLoginInfoData = new MutableLiveData<>();
+
+ public void login(String phone, String passwd) {
+
+ }
+}
diff --git a/app/src/main/java/com/xwad/os/fragment/dialog/login/code/CodeLoginDialogFragment.java b/app/src/main/java/com/xwad/os/fragment/dialog/login/code/CodeLoginDialogFragment.java
new file mode 100644
index 0000000..a3f5039
--- /dev/null
+++ b/app/src/main/java/com/xwad/os/fragment/dialog/login/code/CodeLoginDialogFragment.java
@@ -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 {
+ 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() {
+ @Override
+ public void onChanged(Boolean aBoolean) {
+ if (aBoolean) {
+ Toaster.show("短信发送成功");
+ } else {
+ Toaster.show("短信发送失败");
+ }
+ }
+ });
+ mViewModel.mLoginInfoData.observe(this, new Observer() {
+ @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();
+ }
+ }
+ }
+}
diff --git a/app/src/main/java/com/xwad/os/fragment/dialog/login/code/CodeLoginViewModel.java b/app/src/main/java/com/xwad/os/fragment/dialog/login/code/CodeLoginViewModel.java
new file mode 100644
index 0000000..db8318a
--- /dev/null
+++ b/app/src/main/java/com/xwad/os/fragment/dialog/login/code/CodeLoginViewModel.java
@@ -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 {
+
+ 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 mCodeData = new MutableLiveData<>();
+
+ public void getCode(String phoneNumber) {
+
+ }
+
+ public MutableLiveData mLoginInfoData = new MutableLiveData<>();
+
+ public void codeLogin(String phone, String code) {
+
+ }
+}
diff --git a/app/src/main/java/com/xwad/os/fragment/dialog/login/logout/LogoutDialogFragment.java b/app/src/main/java/com/xwad/os/fragment/dialog/login/logout/LogoutDialogFragment.java
new file mode 100644
index 0000000..ebd755a
--- /dev/null
+++ b/app/src/main/java/com/xwad/os/fragment/dialog/login/logout/LogoutDialogFragment.java
@@ -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 {
+ 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();
+ }
+ }
+ }
+}
diff --git a/app/src/main/java/com/xwad/os/fragment/dialog/login/logout/LogoutViewModel.java b/app/src/main/java/com/xwad/os/fragment/dialog/login/logout/LogoutViewModel.java
new file mode 100644
index 0000000..f08c8df
--- /dev/null
+++ b/app/src/main/java/com/xwad/os/fragment/dialog/login/logout/LogoutViewModel.java
@@ -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 {
+
+ private static final String TAG = "LoginViewModel";
+
+ @Override
+ public FragmentDialogLogoutBinding getVDBinding() {
+ return binding;
+ }
+
+ @Override
+ public void onDestroy() {
+
+ }
+
+
+}
diff --git a/app/src/main/java/com/xwad/os/fragment/dialog/login/passwd/PasswdDialogFragment.java b/app/src/main/java/com/xwad/os/fragment/dialog/login/passwd/PasswdDialogFragment.java
new file mode 100644
index 0000000..0ff2715
--- /dev/null
+++ b/app/src/main/java/com/xwad/os/fragment/dialog/login/passwd/PasswdDialogFragment.java
@@ -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 {
+ 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() {
+ @Override
+ public void onChanged(Boolean aBoolean) {
+ if (aBoolean) {
+ Toaster.show("验证码发送成功");
+ }
+ }
+ });
+
+ mViewModel.mPasswdData.observe(this, new Observer() {
+ @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();
+ }
+ }
+ }
+}
diff --git a/app/src/main/java/com/xwad/os/fragment/dialog/login/passwd/PasswdViewModel.java b/app/src/main/java/com/xwad/os/fragment/dialog/login/passwd/PasswdViewModel.java
new file mode 100644
index 0000000..b813c61
--- /dev/null
+++ b/app/src/main/java/com/xwad/os/fragment/dialog/login/passwd/PasswdViewModel.java
@@ -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 {
+
+ private static final String TAG = "LoginViewModel";
+
+ @Override
+ public FragmentDialogPasswdBinding getVDBinding() {
+ return binding;
+ }
+
+ @Override
+ public void onDestroy() {
+
+ }
+
+ public MutableLiveData mBooleanData = new MutableLiveData<>();
+
+
+ public void getPasswdSmsCode() {
+
+ }
+
+ public MutableLiveData mPasswdData = new MutableLiveData<>();
+
+ public void setPasswd(String password, String confirm_password, String code) {
+
+ }
+
+}
diff --git a/app/src/main/java/com/xwad/os/fragment/dialog/login/statu/LoginStatuDialogFragment.java b/app/src/main/java/com/xwad/os/fragment/dialog/login/statu/LoginStatuDialogFragment.java
new file mode 100644
index 0000000..a73ce2f
--- /dev/null
+++ b/app/src/main/java/com/xwad/os/fragment/dialog/login/statu/LoginStatuDialogFragment.java
@@ -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 {
+ 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");
+ }
+ }
+}
diff --git a/app/src/main/java/com/xwad/os/fragment/dialog/login/statu/LoginStatuViewModel.java b/app/src/main/java/com/xwad/os/fragment/dialog/login/statu/LoginStatuViewModel.java
new file mode 100644
index 0000000..8c6b489
--- /dev/null
+++ b/app/src/main/java/com/xwad/os/fragment/dialog/login/statu/LoginStatuViewModel.java
@@ -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 {
+
+ private static final String TAG = "LoginViewModel";
+
+ @Override
+ public FragmentDialogLoginStatuBinding getVDBinding() {
+ return binding;
+ }
+
+ @Override
+ public void onDestroy() {
+
+ }
+
+}
diff --git a/app/src/main/java/com/xwad/os/fragment/dialog/viplist/VipListDialogFragment.java b/app/src/main/java/com/xwad/os/fragment/dialog/viplist/VipListDialogFragment.java
new file mode 100644
index 0000000..d76b0cc
--- /dev/null
+++ b/app/src/main/java/com/xwad/os/fragment/dialog/viplist/VipListDialogFragment.java
@@ -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 {
+ 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>() {
+ @Override
+ public void onChanged(List 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 {
+
+ }
+}
diff --git a/app/src/main/java/com/xwad/os/fragment/dialog/viplist/VipListViewModel.java b/app/src/main/java/com/xwad/os/fragment/dialog/viplist/VipListViewModel.java
new file mode 100644
index 0000000..6bda608
--- /dev/null
+++ b/app/src/main/java/com/xwad/os/fragment/dialog/viplist/VipListViewModel.java
@@ -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 {
+
+ private static final String TAG = "VipListViewModel";
+
+ @Override
+ public FragmentDialogVipListBinding getVDBinding() {
+ return binding;
+ }
+
+ @Override
+ public void onDestroy() {
+
+ }
+
+
+ public MutableLiveData> mVipInfoListData = new MutableLiveData<>();
+
+ public void getVipList() {
+
+ }
+}
diff --git a/app/src/main/java/com/xwad/os/fragment/english/EnglishFragment.java b/app/src/main/java/com/xwad/os/fragment/english/EnglishFragment.java
index 04aa4f9..997df2b 100644
--- a/app/src/main/java/com/xwad/os/fragment/english/EnglishFragment.java
+++ b/app/src/main/java/com/xwad/os/fragment/english/EnglishFragment.java
@@ -182,10 +182,15 @@ public class EnglishFragment extends BaseMvvmFragment> 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 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 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 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>() {
- }.getType();
- try {
- List appUseds = gson.fromJson(jsonString, listType);
- Log.e(TAG, "getAppUsedStatistics: " + appUseds);
- List appUseTime = appUseds.stream().filter(new Predicate() {
- @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> 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 mPhraseData = new MutableLiveData<>();
public void getPhrase() {
- boolean activation = ActivationUtil.getInstance().isActivation();
+ boolean activation = ActivationUtil.getInstance().isLogin();
if (!activation) {
return;
}
diff --git a/app/src/main/java/com/xwad/os/fragment/usercenter/account/AccountFragment.java b/app/src/main/java/com/xwad/os/fragment/usercenter/account/AccountFragment.java
new file mode 100644
index 0000000..7c75112
--- /dev/null
+++ b/app/src/main/java/com/xwad/os/fragment/usercenter/account/AccountFragment.java
@@ -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 {
+ 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() {
+ @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 mLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback() {
+ @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));
+ }
+ }
+
+}
diff --git a/app/src/main/java/com/xwad/os/fragment/usercenter/account/AccountViewModel.java b/app/src/main/java/com/xwad/os/fragment/usercenter/account/AccountViewModel.java
new file mode 100644
index 0000000..f3616ad
--- /dev/null
+++ b/app/src/main/java/com/xwad/os/fragment/usercenter/account/AccountViewModel.java
@@ -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 {
+
+ 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 mUserInfoData = new MutableLiveData<>();
+
+ public void getUserInfo() {
+ NetInterfaceManager.getInstance().getUserInfoControl()
+ .compose(RxLifecycle.bindUntilEvent(getLifecycle(), FragmentEvent.DESTROY))
+ .subscribe(new Observer>() {
+ @Override
+ public void onSubscribe(@NonNull Disposable d) {
+ Log.e("getUserInfo", "onSubscribe: ");
+ }
+
+ @Override
+ public void onNext(@NonNull BaseResponse 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: ");
+ }
+ });
+ }
+}
diff --git a/app/src/main/java/com/xwad/os/fragment/usercenter/device/DeviceFragment.java b/app/src/main/java/com/xwad/os/fragment/usercenter/device/DeviceFragment.java
index 9f6a98d..760982e 100644
--- a/app/src/main/java/com/xwad/os/fragment/usercenter/device/DeviceFragment.java
+++ b/app/src/main/java/com/xwad/os/fragment/usercenter/device/DeviceFragment.java
@@ -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 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 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 mSnInfoData = new MutableLiveData<>();
public void getSnInfo() {
- if (!ActivationUtil.getInstance().isActivation()) {
-
- return;
- }
NetInterfaceManager.getInstance().getSnInfoControl()
.compose(RxLifecycle.bindUntilEvent(getLifecycle(), FragmentEvent.DESTROY))
.subscribe(new Observer>() {
@@ -70,10 +66,6 @@ public class InfoViewModel extends BaseViewModel mSuccessfulData = new MutableLiveData<>();
public void updateInfo(Map params) {
- if (!ActivationUtil.getInstance().isActivation()) {
-
- return;
- }
NetInterfaceManager.getInstance().getUpdateInfoObservable(params)
.compose(RxLifecycle.bindUntilEvent(getLifecycle(), FragmentEvent.DESTROY))
.subscribe(new Observer() {
diff --git a/app/src/main/java/com/xwad/os/manager/RemoteManager.java b/app/src/main/java/com/xwad/os/manager/RemoteManager.java
index 1c6f89c..30f8ce6 100644
--- a/app/src/main/java/com/xwad/os/manager/RemoteManager.java
+++ b/app/src/main/java/com/xwad/os/manager/RemoteManager.java
@@ -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);
diff --git a/app/src/main/java/com/xwad/os/network/NetInterfaceManager.java b/app/src/main/java/com/xwad/os/network/NetInterfaceManager.java
index c0e2afc..b1cc667 100644
--- a/app/src/main/java/com/xwad/os/network/NetInterfaceManager.java
+++ b/app/src/main/java/com/xwad/os/network/NetInterfaceManager.java
@@ -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> getSnInfoControl() {
return mRetrofit.create(SnInfoApi.class)
- .getSninfo(RemoteManager.getInstance().getSerial())
+ .getSninfo(DeviceSNManager.getDeviceSN())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
public Observable> 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 getUpdateInfoObservable(Map params, MultipartBody.Part multipartBody) {
- String json = GsonUtils.toJSONString(params);
- RequestBody requestBody = convertToJsonRequestBody(json);
+ public Observable getUpdateInfoObservable(Map params, MultipartBody.Part multipartBody) {
return mRetrofit.create(SnInfoApi.class)
- .updateUserInfo(requestBody, multipartBody)
+ .updateUserInfo(params, multipartBody)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
public Observable 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> getCloudLessonObservable() {
return mRetrofit.create(SettingApi.class)
- .getCloudLessonSetting(RemoteManager.getInstance().getSerial())
+ .getCloudLessonSetting(DeviceSNManager.getDeviceSN())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
public Observable> 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>> getAlarmClockObservable() {
return mRetrofit
.create(AlarmClockApi.class)
- .getAlarmClock(RemoteManager.getInstance().getSerial())
+ .getAlarmClock(DeviceSNManager.getDeviceSN())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
public Observable 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> getStudyStatObservable() {
return mRetrofit.create(SnInfoApi.class)
- .getStudyStat(RemoteManager.getInstance().getSerial())
+ .getStudyStat(DeviceSNManager.getDeviceSN())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
public Observable 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>> getHomeworkObservable() {
return mRetrofit.create(HomeworkApi.class)
- .getHomeworks(RemoteManager.getInstance().getSerial())
+ .getHomeworks(DeviceSNManager.getDeviceSN())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
public Observable> 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 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> getPhraseObservable() {
return mRetrofit.create(PhraseApi.class)
- .getPhrase(RemoteManager.getInstance().getSerial())
+ .getPhrase(DeviceSNManager.getDeviceSN())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
- public Observable> getsettingControl() {
+ public Observable> 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 getCodeLoginObservable(String mobile, String code) {
+ public Observable> 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> getUserInfoControl() {
+ return mRetrofit.create(UserApi.class)
+ .getUserInfo(getToken())
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread());
+ }
+
+ public Observable>> getVipListControl() {
+ return mRetrofit.create(UserApi.class)
+ .getVipList(getToken(), BuildConfig.APPLICATION_ID)
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread());
+ }
+
+ public Observable> getBuyVipControl(String vipId) {
+ return mRetrofit.create(UserApi.class)
+ .buyVip(getToken(), DeviceSNManager.getDeviceSN(), vipId)
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread());
+ }
+
+ public Observable getCodeActivationControl(String code) {
+ return mRetrofit.create(UserApi.class)
+ .codeActivation(getToken(), DeviceSNManager.getDeviceSN(), code)
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread());
+ }
+
+ public Observable> getPayQrcodeControl(String orderSn) {
+ return mRetrofit.create(UserApi.class)
+ .payQrcode(getToken(), DeviceSNManager.getDeviceSN(), orderSn)
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread());
+ }
+
+
/*
*
* execution
diff --git a/app/src/main/java/com/xwad/os/network/UrlAddress.java b/app/src/main/java/com/xwad/os/network/UrlAddress.java
index 70cf5eb..e2ae9b5 100644
--- a/app/src/main/java/com/xwad/os/network/UrlAddress.java
+++ b/app/src/main/java/com/xwad/os/network/UrlAddress.java
@@ -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";
diff --git a/app/src/main/java/com/xwad/os/network/api/LoginApi.java b/app/src/main/java/com/xwad/os/network/api/LoginApi.java
index bfe5df8..28d341a 100644
--- a/app/src/main/java/com/xwad/os/network/api/LoginApi.java
+++ b/app/src/main/java/com/xwad/os/network/api/LoginApi.java
@@ -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 codeLogin(
+ Observable> codeLogin(
@Field("mobile") String mobile,
@Field("code") String code,
@Field("sn") String sn
diff --git a/app/src/main/java/com/xwad/os/network/api/SnInfoApi.java b/app/src/main/java/com/xwad/os/network/api/SnInfoApi.java
index 81f4e41..09e3760 100644
--- a/app/src/main/java/com/xwad/os/network/api/SnInfoApi.java
+++ b/app/src/main/java/com/xwad/os/network/api/SnInfoApi.java
@@ -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 updateUserInfo(
- @Body RequestBody requestBody,
+ @PartMap Map params,
@Part MultipartBody.Part body);
@GET(UrlAddress.GET_STUDY_STAT)
diff --git a/app/src/main/java/com/xwad/os/network/api/UserApi.java b/app/src/main/java/com/xwad/os/network/api/UserApi.java
new file mode 100644
index 0000000..ed9fbf3
--- /dev/null
+++ b/app/src/main/java/com/xwad/os/network/api/UserApi.java
@@ -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> getUserInfo(
+ @Header("token") String token
+ );
+
+ @GET(UrlAddress.VIP_LIST)
+ Observable>> getVipList(
+ @Header("token") String token,
+ @Query("app_package") String app_package
+ );
+
+ @FormUrlEncoded
+ @POST(UrlAddress.BUY)
+ Observable> buyVip(
+ @Header("token") String token,
+ @Field("sn") String sn,
+ @Field("vip_level_id") String vip_level_id
+ );
+
+ @FormUrlEncoded
+ @POST(UrlAddress.activation_code)
+ Observable codeActivation(
+ @Header("token") String token,
+ @Field("sn") String sn,
+ @Field("code") String code
+ );
+
+ @FormUrlEncoded
+ @POST(UrlAddress.PAY_QRCODE)
+ Observable> payQrcode(
+ @Header("token") String token,
+ @Field("sn") String sn,
+ @Field("order_sn") String order_sn
+ );
+
+ @FormUrlEncoded
+ @POST(UrlAddress.RENEW)
+ Observable renew(
+ @Header("token") String token,
+ @Field("sn") String sn,
+ @Field("vip_level_id") String vip_level_id
+ );
+}
diff --git a/app/src/main/java/com/xwad/os/service/SocketService.java b/app/src/main/java/com/xwad/os/service/SocketService.java
index aa0a949..7641212 100644
--- a/app/src/main/java/com/xwad/os/service/SocketService.java
+++ b/app/src/main/java/com/xwad/os/service/SocketService.java
@@ -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 {
diff --git a/app/src/main/java/com/xwad/os/utils/ActivationUtil.java b/app/src/main/java/com/xwad/os/utils/ActivationUtil.java
index 40cb073..b1d3dd6 100644
--- a/app/src/main/java/com/xwad/os/utils/ActivationUtil.java
+++ b/app/src/main/java/com/xwad/os/utils/ActivationUtil.java
@@ -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;
+ }
+
}
\ No newline at end of file
diff --git a/app/src/main/java/com/xwad/os/utils/BitmapUtils.java b/app/src/main/java/com/xwad/os/utils/BitmapUtils.java
index ca95f6a..17e866b 100644
--- a/app/src/main/java/com/xwad/os/utils/BitmapUtils.java
+++ b/app/src/main/java/com/xwad/os/utils/BitmapUtils.java
@@ -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 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;
+ }
}
diff --git a/app/src/main/java/com/xwad/os/utils/OpenApkUtils.java b/app/src/main/java/com/xwad/os/utils/OpenApkUtils.java
index 94517ff..68ec453 100644
--- a/app/src/main/java/com/xwad/os/utils/OpenApkUtils.java
+++ b/app/src/main/java/com/xwad/os/utils/OpenApkUtils.java
@@ -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 pkgList = new ArrayList() {{
+ 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 optional = pkgList.stream().filter(new Predicate() {
+ @Override
+ public boolean test(String s) {
+ return ApkUtils.isAvailable(mContext, s);
+ }
+ }).findFirst();
+ return optional.orElse("com.android.deskclock");
+ }
+
+ public String getCalculatorPackageName() {
+ List pkgList = new ArrayList() {{
+ 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 optional = pkgList.stream().filter(new Predicate() {
+ @Override
+ public boolean test(String s) {
+ return ApkUtils.isAvailable(mContext, s);
+ }
+ }).findFirst();
+ return optional.orElse("com.android.deskclock");
+ }
+
+ public String getCameraPackageName() {
+ List pkgList = new ArrayList() {{
+ this.add("com.android.camera");
+ this.add("com.hihonor.camera");
+ this.add("com.huawei.camera");
+ this.add("com.oplus.camera");
+ }};
+
+ Optional optional = pkgList.stream().filter(new Predicate() {
+ @Override
+ public boolean test(String s) {
+ return ApkUtils.isAvailable(mContext, s);
+ }
+ }).findFirst();
+ return optional.orElse("com.android.camera");
+ }
+
+ public String getGalleryPackageName() {
+ List pkgList = new ArrayList() {{
+ 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 optional = pkgList.stream().filter(new Predicate() {
+ @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;
+ }
+ }
+
}
diff --git a/app/src/main/res/drawable-hdpi/vip_details.png b/app/src/main/res/drawable-hdpi/vip_details.png
new file mode 100644
index 0000000..cc0f48a
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/vip_details.png differ
diff --git a/app/src/main/res/drawable-nodpi/icon_ddyfz_jpkc.png b/app/src/main/res/drawable-nodpi/icon_ddyfz_jpkc.png
index 81bf9e6..1501aef 100644
Binary files a/app/src/main/res/drawable-nodpi/icon_ddyfz_jpkc.png and b/app/src/main/res/drawable-nodpi/icon_ddyfz_jpkc.png differ
diff --git a/app/src/main/res/drawable-nodpi/icon_dl_jpkc.png b/app/src/main/res/drawable-nodpi/icon_dl_jpkc.png
index 896150d..25253a6 100644
Binary files a/app/src/main/res/drawable-nodpi/icon_dl_jpkc.png and b/app/src/main/res/drawable-nodpi/icon_dl_jpkc.png differ
diff --git a/app/src/main/res/drawable-nodpi/icon_dl_zxts.png b/app/src/main/res/drawable-nodpi/icon_dl_zxts.png
index 712a826..6c441e7 100644
Binary files a/app/src/main/res/drawable-nodpi/icon_dl_zxts.png and b/app/src/main/res/drawable-nodpi/icon_dl_zxts.png differ
diff --git a/app/src/main/res/drawable-nodpi/icon_hx_jpkc.png b/app/src/main/res/drawable-nodpi/icon_hx_jpkc.png
index e158763..244fcd6 100644
Binary files a/app/src/main/res/drawable-nodpi/icon_hx_jpkc.png and b/app/src/main/res/drawable-nodpi/icon_hx_jpkc.png differ
diff --git a/app/src/main/res/drawable-nodpi/icon_hx_zxts.png b/app/src/main/res/drawable-nodpi/icon_hx_zxts.png
index 07805c4..57d6aa6 100644
Binary files a/app/src/main/res/drawable-nodpi/icon_hx_zxts.png and b/app/src/main/res/drawable-nodpi/icon_hx_zxts.png differ
diff --git a/app/src/main/res/drawable-nodpi/icon_kx_jpkc.png b/app/src/main/res/drawable-nodpi/icon_kx_jpkc.png
index 1bb6305..271dc4c 100644
Binary files a/app/src/main/res/drawable-nodpi/icon_kx_jpkc.png and b/app/src/main/res/drawable-nodpi/icon_kx_jpkc.png differ
diff --git a/app/src/main/res/drawable-nodpi/icon_ls_jpkc.png b/app/src/main/res/drawable-nodpi/icon_ls_jpkc.png
index 2f272c1..36c94e0 100644
Binary files a/app/src/main/res/drawable-nodpi/icon_ls_jpkc.png and b/app/src/main/res/drawable-nodpi/icon_ls_jpkc.png differ
diff --git a/app/src/main/res/drawable-nodpi/icon_sw_jpkc.png b/app/src/main/res/drawable-nodpi/icon_sw_jpkc.png
index 0fc9738..f18ce0d 100644
Binary files a/app/src/main/res/drawable-nodpi/icon_sw_jpkc.png and b/app/src/main/res/drawable-nodpi/icon_sw_jpkc.png differ
diff --git a/app/src/main/res/drawable-nodpi/icon_sw_zxts.png b/app/src/main/res/drawable-nodpi/icon_sw_zxts.png
index 47afba7..6308598 100644
Binary files a/app/src/main/res/drawable-nodpi/icon_sw_zxts.png and b/app/src/main/res/drawable-nodpi/icon_sw_zxts.png differ
diff --git a/app/src/main/res/drawable-nodpi/icon_tab_app.png b/app/src/main/res/drawable-nodpi/icon_tab_app.png
index 14841f3..9e2b26d 100644
Binary files a/app/src/main/res/drawable-nodpi/icon_tab_app.png and b/app/src/main/res/drawable-nodpi/icon_tab_app.png differ
diff --git a/app/src/main/res/drawable-nodpi/icon_tab_app_pre.png b/app/src/main/res/drawable-nodpi/icon_tab_app_pre.png
new file mode 100644
index 0000000..16d7d7e
Binary files /dev/null and b/app/src/main/res/drawable-nodpi/icon_tab_app_pre.png differ
diff --git a/app/src/main/res/drawable-nodpi/icon_wl_aidyfxl_bg.png b/app/src/main/res/drawable-nodpi/icon_wl_aidyfxl_bg.png
index c2c3f1d..9276a3b 100644
Binary files a/app/src/main/res/drawable-nodpi/icon_wl_aidyfxl_bg.png and b/app/src/main/res/drawable-nodpi/icon_wl_aidyfxl_bg.png differ
diff --git a/app/src/main/res/drawable-nodpi/icon_wl_jpkc.png b/app/src/main/res/drawable-nodpi/icon_wl_jpkc.png
index 9b1a5ef..405c7f2 100644
Binary files a/app/src/main/res/drawable-nodpi/icon_wl_jpkc.png and b/app/src/main/res/drawable-nodpi/icon_wl_jpkc.png differ
diff --git a/app/src/main/res/drawable-nodpi/icon_wl_zxts.png b/app/src/main/res/drawable-nodpi/icon_wl_zxts.png
index 036fadd..3b80ef2 100644
Binary files a/app/src/main/res/drawable-nodpi/icon_wl_zxts.png and b/app/src/main/res/drawable-nodpi/icon_wl_zxts.png differ
diff --git a/app/src/main/res/drawable-nodpi/icon_xk_dl_tbfd.png b/app/src/main/res/drawable-nodpi/icon_xk_dl_tbfd.png
index b252fbc..8d869d7 100644
Binary files a/app/src/main/res/drawable-nodpi/icon_xk_dl_tbfd.png and b/app/src/main/res/drawable-nodpi/icon_xk_dl_tbfd.png differ
diff --git a/app/src/main/res/drawable-nodpi/icon_xk_hx_tbfd.png b/app/src/main/res/drawable-nodpi/icon_xk_hx_tbfd.png
index 98b1f75..432c16f 100644
Binary files a/app/src/main/res/drawable-nodpi/icon_xk_hx_tbfd.png and b/app/src/main/res/drawable-nodpi/icon_xk_hx_tbfd.png differ
diff --git a/app/src/main/res/drawable-nodpi/icon_xk_sw_tbfd.png b/app/src/main/res/drawable-nodpi/icon_xk_sw_tbfd.png
index 705f6af..9fa573d 100644
Binary files a/app/src/main/res/drawable-nodpi/icon_xk_sw_tbfd.png and b/app/src/main/res/drawable-nodpi/icon_xk_sw_tbfd.png differ
diff --git a/app/src/main/res/drawable-nodpi/icon_xk_wl_khl.png b/app/src/main/res/drawable-nodpi/icon_xk_wl_khl.png
index cca00d1..181cc48 100644
Binary files a/app/src/main/res/drawable-nodpi/icon_xk_wl_khl.png and b/app/src/main/res/drawable-nodpi/icon_xk_wl_khl.png differ
diff --git a/app/src/main/res/drawable-nodpi/icon_yw_khl.png b/app/src/main/res/drawable-nodpi/icon_yw_khl.png
index 11316d2..eddf427 100644
Binary files a/app/src/main/res/drawable-nodpi/icon_yw_khl.png and b/app/src/main/res/drawable-nodpi/icon_yw_khl.png differ
diff --git a/app/src/main/res/drawable/bg_vip_select.xml b/app/src/main/res/drawable/bg_vip_select.xml
new file mode 100644
index 0000000..83416c7
--- /dev/null
+++ b/app/src/main/res/drawable/bg_vip_select.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_vip_unselect.xml b/app/src/main/res/drawable/bg_vip_unselect.xml
new file mode 100644
index 0000000..2c9baf4
--- /dev/null
+++ b/app/src/main/res/drawable/bg_vip_unselect.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/edit_text_login_bg.xml b/app/src/main/res/drawable/edit_text_login_bg.xml
new file mode 100644
index 0000000..ee05a62
--- /dev/null
+++ b/app/src/main/res/drawable/edit_text_login_bg.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_negative.xml b/app/src/main/res/drawable/ic_negative.xml
new file mode 100644
index 0000000..485f93e
--- /dev/null
+++ b/app/src/main/res/drawable/ic_negative.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_positive.xml b/app/src/main/res/drawable/ic_positive.xml
new file mode 100644
index 0000000..1f3bac8
--- /dev/null
+++ b/app/src/main/res/drawable/ic_positive.xml
@@ -0,0 +1,10 @@
+
+
+
+
diff --git a/app/src/main/res/drawable/policy_checkbox_bg.xml b/app/src/main/res/drawable/policy_checkbox_bg.xml
new file mode 100644
index 0000000..ae1863c
--- /dev/null
+++ b/app/src/main/res/drawable/policy_checkbox_bg.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/app/src/main/res/drawable/tv_activation.xml b/app/src/main/res/drawable/tv_activation.xml
new file mode 100644
index 0000000..fc791a7
--- /dev/null
+++ b/app/src/main/res/drawable/tv_activation.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/update_background.xml b/app/src/main/res/drawable/update_background.xml
index b904dbe..a0b112f 100644
--- a/app/src/main/res/drawable/update_background.xml
+++ b/app/src/main/res/drawable/update_background.xml
@@ -3,11 +3,11 @@
-
+
+ android:bottom="4dp"
+ android:left="20dp"
+ android:right="20dp"
+ android:top="4dp" />
\ No newline at end of file
diff --git a/app/src/main/res/drawable/update_cancel_background.xml b/app/src/main/res/drawable/update_cancel_background.xml
index 58247be..c328117 100644
--- a/app/src/main/res/drawable/update_cancel_background.xml
+++ b/app/src/main/res/drawable/update_cancel_background.xml
@@ -3,11 +3,11 @@
-
+
+ android:bottom="4dp"
+ android:left="20dp"
+ android:right="20dp"
+ android:top="4dp" />
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_activation.xml b/app/src/main/res/layout/activity_activation.xml
index 53d123a..485042a 100644
--- a/app/src/main/res/layout/activity_activation.xml
+++ b/app/src/main/res/layout/activity_activation.xml
@@ -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"
diff --git a/app/src/main/res/layout/activity_home.xml b/app/src/main/res/layout/activity_home.xml
index 20d7f64..3b6b3c2 100644
--- a/app/src/main/res/layout/activity_home.xml
+++ b/app/src/main/res/layout/activity_home.xml
@@ -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" />
diff --git a/app/src/main/res/layout/activity_pay_vip.xml b/app/src/main/res/layout/activity_pay_vip.xml
new file mode 100644
index 0000000..0f5142c
--- /dev/null
+++ b/app/src/main/res/layout/activity_pay_vip.xml
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_selecte_grade.xml b/app/src/main/res/layout/activity_selecte_grade.xml
index 0c3a8a1..f1385ee 100644
--- a/app/src/main/res/layout/activity_selecte_grade.xml
+++ b/app/src/main/res/layout/activity_selecte_grade.xml
@@ -18,7 +18,7 @@
android:onClick="@{click::exit}">
+ android:scaleType="centerCrop"
+ android:src="@drawable/icon_close"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintTop_toTopOf="parent" />
@@ -73,8 +73,8 @@
@@ -113,7 +113,7 @@
android:layout_marginTop="8dp"
android:text="@{appUpdateInfo.app_version_name}"
android:textColor="@color/contact_text_color"
- android:textSize="16sp" />
+ android:textSize="10sp" />
@@ -121,7 +121,7 @@
android:id="@+id/linearLayout3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_marginBottom="32dp"
+ android:layout_marginBottom="16dp"
app:layout_constraintBottom_toBottomOf="parent">
@@ -153,7 +153,7 @@
android:singleLine="true"
android:text="更新"
android:textColor="@color/white"
- android:textSize="16sp"
+ android:textSize="10sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
diff --git a/app/src/main/res/layout/activity_user.xml b/app/src/main/res/layout/activity_user.xml
index 96320d9..c738e9b 100644
--- a/app/src/main/res/layout/activity_user.xml
+++ b/app/src/main/res/layout/activity_user.xml
@@ -215,6 +215,7 @@
android:layout_marginTop="4dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="4dp"
+ android:visibility="gone"
android:layout_weight="1"
android:background="@drawable/rb_card_selector"
android:button="@null"
@@ -223,6 +224,22 @@
android:textColor="@drawable/rb_text_selector"
android:textSize="9sp" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fg_content_ddyfz.xml b/app/src/main/res/layout/fg_content_ddyfz.xml
index 62c14fa..fc3c363 100644
--- a/app/src/main/res/layout/fg_content_ddyfz.xml
+++ b/app/src/main/res/layout/fg_content_ddyfz.xml
@@ -254,7 +254,7 @@
android:layout_width="166dp"
android:layout_height="238dp"
android:layout_marginStart="12dp"
- android:background="@drawable/icon_yw_aidyfxl_bg"
+ android:background="@drawable/icon_wl_aidyfxl_bg"
android:onClick="onGoJzx"
android:tag="9|道德与法治" />
diff --git a/app/src/main/res/layout/fg_content_dl.xml b/app/src/main/res/layout/fg_content_dl.xml
index b249a84..3334acf 100644
--- a/app/src/main/res/layout/fg_content_dl.xml
+++ b/app/src/main/res/layout/fg_content_dl.xml
@@ -254,7 +254,7 @@
android:layout_width="166dp"
android:layout_height="238dp"
android:layout_marginStart="12dp"
- android:background="@drawable/icon_yw_aidyfxl_bg"
+ android:background="@drawable/icon_wl_aidyfxl_bg"
android:onClick="onGoJzx"
android:tag="9|地理" />
diff --git a/app/src/main/res/layout/fg_content_hx.xml b/app/src/main/res/layout/fg_content_hx.xml
index b207666..197a7cf 100644
--- a/app/src/main/res/layout/fg_content_hx.xml
+++ b/app/src/main/res/layout/fg_content_hx.xml
@@ -254,7 +254,7 @@
android:layout_width="166dp"
android:layout_height="238dp"
android:layout_marginStart="12dp"
- android:background="@drawable/icon_yw_aidyfxl_bg"
+ android:background="@drawable/icon_wl_aidyfxl_bg"
android:onClick="onGoJzx"
android:tag="9|化学" />
diff --git a/app/src/main/res/layout/fg_content_kx.xml b/app/src/main/res/layout/fg_content_kx.xml
index d38b4f8..848ca54 100644
--- a/app/src/main/res/layout/fg_content_kx.xml
+++ b/app/src/main/res/layout/fg_content_kx.xml
@@ -254,7 +254,7 @@
android:layout_width="166dp"
android:layout_height="238dp"
android:layout_marginStart="12dp"
- android:background="@drawable/icon_yw_aidyfxl_bg"
+ android:background="@drawable/icon_wl_aidyfxl_bg"
android:onClick="onGoJzx"
android:tag="9|科学" />
diff --git a/app/src/main/res/layout/fg_content_ls.xml b/app/src/main/res/layout/fg_content_ls.xml
index 97e5622..c9a34db 100644
--- a/app/src/main/res/layout/fg_content_ls.xml
+++ b/app/src/main/res/layout/fg_content_ls.xml
@@ -254,7 +254,7 @@
android:layout_width="166dp"
android:layout_height="238dp"
android:layout_marginStart="12dp"
- android:background="@drawable/icon_yw_aidyfxl_bg"
+ android:background="@drawable/icon_wl_aidyfxl_bg"
android:onClick="onGoJzx"
android:tag="9|历史" />
diff --git a/app/src/main/res/layout/fg_content_sw.xml b/app/src/main/res/layout/fg_content_sw.xml
index 60c8370..6847378 100644
--- a/app/src/main/res/layout/fg_content_sw.xml
+++ b/app/src/main/res/layout/fg_content_sw.xml
@@ -254,7 +254,7 @@
android:layout_width="166dp"
android:layout_height="238dp"
android:layout_marginStart="12dp"
- android:background="@drawable/icon_yw_aidyfxl_bg"
+ android:background="@drawable/icon_wl_aidyfxl_bg"
android:onClick="onGoJzx"
android:tag="9|生物" />
diff --git a/app/src/main/res/layout/fg_content_wl.xml b/app/src/main/res/layout/fg_content_wl.xml
index 2be5f29..9a96789 100644
--- a/app/src/main/res/layout/fg_content_wl.xml
+++ b/app/src/main/res/layout/fg_content_wl.xml
@@ -254,7 +254,7 @@
android:layout_width="166dp"
android:layout_height="238dp"
android:layout_marginStart="12dp"
- android:background="@drawable/icon_yw_aidyfxl_bg"
+ android:background="@drawable/icon_wl_aidyfxl_bg"
android:onClick="onGoJzx"
android:tag="9|物理" />
diff --git a/app/src/main/res/layout/fg_content_zz.xml b/app/src/main/res/layout/fg_content_zz.xml
index b043d78..73d1750 100644
--- a/app/src/main/res/layout/fg_content_zz.xml
+++ b/app/src/main/res/layout/fg_content_zz.xml
@@ -254,7 +254,7 @@
android:layout_width="166dp"
android:layout_height="238dp"
android:layout_marginStart="12dp"
- android:background="@drawable/icon_yw_aidyfxl_bg"
+ android:background="@drawable/icon_wl_aidyfxl_bg"
android:onClick="onGoJzx"
android:tag="9|政治" />
diff --git a/app/src/main/res/layout/fragment_account.xml b/app/src/main/res/layout/fragment_account.xml
new file mode 100644
index 0000000..e7d8c34
--- /dev/null
+++ b/app/src/main/res/layout/fragment_account.xml
@@ -0,0 +1,309 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_device.xml b/app/src/main/res/layout/fragment_device.xml
index bf88300..757b4ee 100644
--- a/app/src/main/res/layout/fragment_device.xml
+++ b/app/src/main/res/layout/fragment_device.xml
@@ -226,7 +226,7 @@
android:id="@+id/tv_service"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginEnd="8dp"
+ android:layout_marginEnd="16dp"
android:ellipsize="end"
android:maxLength="30"
android:singleLine="true"
diff --git a/app/src/main/res/layout/fragment_dialog_account_login.xml b/app/src/main/res/layout/fragment_dialog_account_login.xml
new file mode 100644
index 0000000..19ebdfc
--- /dev/null
+++ b/app/src/main/res/layout/fragment_dialog_account_login.xml
@@ -0,0 +1,183 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_dialog_code_login.xml b/app/src/main/res/layout/fragment_dialog_code_login.xml
new file mode 100644
index 0000000..a1514a5
--- /dev/null
+++ b/app/src/main/res/layout/fragment_dialog_code_login.xml
@@ -0,0 +1,196 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_dialog_login_statu.xml b/app/src/main/res/layout/fragment_dialog_login_statu.xml
new file mode 100644
index 0000000..a0f11cc
--- /dev/null
+++ b/app/src/main/res/layout/fragment_dialog_login_statu.xml
@@ -0,0 +1,143 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_dialog_logout.xml b/app/src/main/res/layout/fragment_dialog_logout.xml
new file mode 100644
index 0000000..a1eb491
--- /dev/null
+++ b/app/src/main/res/layout/fragment_dialog_logout.xml
@@ -0,0 +1,140 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_dialog_passwd.xml b/app/src/main/res/layout/fragment_dialog_passwd.xml
new file mode 100644
index 0000000..9a05fe8
--- /dev/null
+++ b/app/src/main/res/layout/fragment_dialog_passwd.xml
@@ -0,0 +1,179 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_dialog_vip_list.xml b/app/src/main/res/layout/fragment_dialog_vip_list.xml
new file mode 100644
index 0000000..358de33
--- /dev/null
+++ b/app/src/main/res/layout/fragment_dialog_vip_list.xml
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_mine.xml b/app/src/main/res/layout/fragment_mine.xml
index 0097e14..2c48c14 100644
--- a/app/src/main/res/layout/fragment_mine.xml
+++ b/app/src/main/res/layout/fragment_mine.xml
@@ -59,7 +59,7 @@
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_marginStart="16dp"
- android:src="@drawable/icon_tx1"
+ android:src="@drawable/default_avatar"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
@@ -99,7 +99,7 @@
android:layout_height="wrap_content"
android:ellipsize="marquee"
android:singleLine="true"
- android:text="小九"
+ android:text="@string/default_nickname"
android:textColor="@color/white"
android:textSize="9sp" />
@@ -231,7 +231,7 @@
android:onClick="onClick"
android:scaleType="centerCrop"
android:src="@drawable/icon_szzs"
- android:tag="@string/tag_args_new_hemo"
+ android:tag="@string/tag_args_new_msfc"
app:layout_constraintStart_toEndOf="@+id/iv_sjzx"
app:layout_constraintTop_toTopOf="parent" />
@@ -249,7 +249,7 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index ea1091a..791f647 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -67,4 +67,7 @@
#ffffff
#656565
+ #888888
+ #919090
+ #434343
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
index 24b58a6..28204b3 100644
--- a/app/src/main/res/values/dimens.xml
+++ b/app/src/main/res/values/dimens.xml
@@ -3290,7 +3290,8 @@
997px
998px
999px
- 40dp
- 52dp
- 10sp
+
+ 36dp
+ 44dp
+ 8sp
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 46a5b05..45a2687 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -7,7 +7,7 @@
未绑定
未设置
设备未经授权
- 小酷
+ 小学王
七年级
@@ -22,5 +22,6 @@
如果您已经订购实体包装版,您可以在包装盒内找到“许可证”贴纸,\n请刮开涂层,将密钥输入在下面的对话框内
许可证验证成功,本账户已可长期使用,\n点击开启学习之旅!
-
+ 有效期:%d年
+ 二维码过期时间%s