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