version:1.1.3

fix:
update:优化支付问题,增加九学王激活逻辑
This commit is contained in:
2025-12-29 09:35:24 +08:00
parent a66b04083d
commit ee4c05b438
18 changed files with 307 additions and 21 deletions

View File

@@ -16,8 +16,8 @@ android {
minSdkVersion 24 minSdkVersion 24
targetSdkVersion 29 targetSdkVersion 29
versionCode 13 versionCode 14
versionName "1.1.2" versionName "1.1.3"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

View File

@@ -5,7 +5,6 @@ import android.text.Editable;
import android.text.InputFilter; import android.text.InputFilter;
import android.text.Spanned; import android.text.Spanned;
import android.text.TextUtils; import android.text.TextUtils;
import android.text.method.DigitsKeyListener;
import android.view.View; import android.view.View;
import androidx.lifecycle.Observer; import androidx.lifecycle.Observer;
@@ -17,6 +16,7 @@ import com.xwad.os.bean.OrderInfo;
import com.xwad.os.bean.PayInfo; import com.xwad.os.bean.PayInfo;
import com.xwad.os.bean.VipInfo; import com.xwad.os.bean.VipInfo;
import com.xwad.os.databinding.ActivityActivationBinding; import com.xwad.os.databinding.ActivityActivationBinding;
import com.xwad.os.utils.ActivationUtil;
import com.xwad.os.utils.BitmapUtils; import com.xwad.os.utils.BitmapUtils;
import java.util.List; import java.util.List;
@@ -83,7 +83,9 @@ public class ActivationActivity extends BaseMvvmActivity<ActivationViewModel, Ac
Optional<VipInfo> optional = vipInfos.stream().findFirst(); Optional<VipInfo> optional = vipInfos.stream().findFirst();
if (optional.isPresent()) { if (optional.isPresent()) {
VipInfo vipInfo = optional.get(); VipInfo vipInfo = optional.get();
mViewDataBinding.tvPrice.setText(vipInfo.getPrice()); mViewDataBinding.tvPrice.setText("" + vipInfo.getPrice());
mViewDataBinding.tvVipName.setText(vipInfo.getName());
mViewDataBinding.tvVipPrice.setText("" + vipInfo.getPrice());
mViewModel.getPayInfo(vipInfo.getId()); mViewModel.getPayInfo(vipInfo.getId());
} }
} }
@@ -112,6 +114,25 @@ public class ActivationActivity extends BaseMvvmActivity<ActivationViewModel, Ac
} }
}); });
mViewModel.mCodeActivationData.observe(this, new Observer<Boolean>() {
@Override
public void onChanged(Boolean aBoolean) {
if (aBoolean) {
mViewModel.getActivation();
}
}
});
mViewModel.mGetCodeData.observe(this, new Observer<Boolean>() {
@Override
public void onChanged(Boolean aBoolean) {
if (aBoolean) {
ActivationUtil.getInstance().startJxwLauncher();
finish();
}
}
});
} }
public class BtnClick { public class BtnClick {

View File

@@ -5,15 +5,19 @@ import android.util.Log;
import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.MutableLiveData;
import com.hjq.toast.Toaster; import com.hjq.toast.Toaster;
import com.tencent.mmkv.MMKV;
import com.trello.rxlifecycle4.RxLifecycle; import com.trello.rxlifecycle4.RxLifecycle;
import com.trello.rxlifecycle4.android.ActivityEvent; import com.trello.rxlifecycle4.android.ActivityEvent;
import com.xwad.os.base.mvvm.BaseViewModel; import com.xwad.os.base.mvvm.BaseViewModel;
import com.xwad.os.bean.BaseResponse; import com.xwad.os.bean.BaseResponse;
import com.xwad.os.bean.CodeBean;
import com.xwad.os.bean.OrderInfo; import com.xwad.os.bean.OrderInfo;
import com.xwad.os.bean.PayInfo; import com.xwad.os.bean.PayInfo;
import com.xwad.os.bean.VipInfo; import com.xwad.os.bean.VipInfo;
import com.xwad.os.config.CommonConfig;
import com.xwad.os.databinding.ActivityActivationBinding; import com.xwad.os.databinding.ActivityActivationBinding;
import com.xwad.os.network.NetInterfaceManager; import com.xwad.os.network.NetInterfaceManager;
import com.xwad.os.utils.ActivationUtil;
import java.util.List; import java.util.List;
@@ -23,6 +27,8 @@ import io.reactivex.rxjava3.disposables.Disposable;
public class ActivationViewModel extends BaseViewModel<ActivityActivationBinding, ActivityEvent> { public class ActivationViewModel extends BaseViewModel<ActivityActivationBinding, ActivityEvent> {
private MMKV mMMKV = MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE);
@Override @Override
public ActivityActivationBinding getVDBinding() { public ActivityActivationBinding getVDBinding() {
return binding; return binding;
@@ -135,6 +141,8 @@ public class ActivationViewModel extends BaseViewModel<ActivityActivationBinding
}); });
} }
public MutableLiveData<Boolean> mCodeActivationData = new MutableLiveData<>();
public void codeActivation(String code) { public void codeActivation(String code) {
NetInterfaceManager.getInstance().getCodeActivationControl(code) NetInterfaceManager.getInstance().getCodeActivationControl(code)
.compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY)) .compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY))
@@ -147,6 +155,11 @@ public class ActivationViewModel extends BaseViewModel<ActivityActivationBinding
@Override @Override
public void onNext(@NonNull BaseResponse baseResponse) { public void onNext(@NonNull BaseResponse baseResponse) {
Log.e("codeActivation", "onNext: " + baseResponse); Log.e("codeActivation", "onNext: " + baseResponse);
if (baseResponse.code == 200) {
mCodeActivationData.setValue(true);
} else {
Toaster.show(baseResponse.msg);
}
} }
@Override @Override
@@ -160,4 +173,39 @@ public class ActivationViewModel extends BaseViewModel<ActivityActivationBinding
} }
}); });
} }
public MutableLiveData<Boolean> mGetCodeData = new MutableLiveData<>();
public void getActivation() {
NetInterfaceManager.getInstance().getActivationCodeControl()
.compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY))
.subscribe(new Observer<BaseResponse<CodeBean>>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
Log.e("getActivation", "onSubscribe: ");
}
@Override
public void onNext(@NonNull BaseResponse<CodeBean> baseResponse) {
if (baseResponse.code == 200) {
CodeBean codeBean = baseResponse.data;
mMMKV.encode(CommonConfig.ACTIVATIONBEAN_CODE_KEY, codeBean.getCode());
mGetCodeData.setValue(true);
ActivationUtil.getInstance().setActivation(1);
} else {
ActivationUtil.getInstance().setActivation(0);
}
}
@Override
public void onError(@NonNull Throwable e) {
Log.e("getActivation", "onError: " + e.getMessage());
}
@Override
public void onComplete() {
Log.e("getActivation", "onComplete: ");
}
});
}
} }

View File

@@ -40,6 +40,7 @@ import com.xwad.os.activity.permission.PermissionActivity;
import com.xwad.os.activity.update.UpdateActivity; import com.xwad.os.activity.update.UpdateActivity;
import com.xwad.os.base.mvvm.BaseMvvmActivity; import com.xwad.os.base.mvvm.BaseMvvmActivity;
import com.xwad.os.bean.AppUpdateInfo; import com.xwad.os.bean.AppUpdateInfo;
import com.xwad.os.bean.UserInfo;
import com.xwad.os.bean.jxw.TabBean; import com.xwad.os.bean.jxw.TabBean;
import com.xwad.os.config.CommonConfig; import com.xwad.os.config.CommonConfig;
import com.xwad.os.databinding.ActivityHomeBinding; import com.xwad.os.databinding.ActivityHomeBinding;
@@ -64,6 +65,7 @@ import com.xwad.os.jxw.event.UpdateGradeEvent;
import com.xwad.os.jxw.fragment.SztzFragment; import com.xwad.os.jxw.fragment.SztzFragment;
import com.xwad.os.manager.DeviceSNManager; import com.xwad.os.manager.DeviceSNManager;
import com.xwad.os.manager.RemoteManager; import com.xwad.os.manager.RemoteManager;
import com.xwad.os.utils.ActivationUtil;
import com.xwad.os.utils.ApkUtils; import com.xwad.os.utils.ApkUtils;
import com.xwad.os.utils.DataUtil; import com.xwad.os.utils.DataUtil;
import com.xwad.os.utils.OpenApkUtils; import com.xwad.os.utils.OpenApkUtils;
@@ -217,7 +219,22 @@ public class HomeActivity extends BaseMvvmActivity<HomeViewModel, ActivityHomeBi
} }
}); });
mViewModel.checkUpdate(); mViewModel.checkUpdate();
mViewModel.mGetCodeData.observe(this, new Observer<Boolean>() {
@Override
public void onChanged(Boolean aBoolean) {
if (aBoolean) {
ActivationUtil.getInstance().startJxwLauncher();
}
}
});
mViewModel.getActivation();
mViewModel.mUserInfoData.observe(this, new Observer<UserInfo>() {
@Override
public void onChanged(UserInfo userInfo) {
}
});
mViewModel.getUserInfo();
initDatas(); initDatas();
} }

View File

@@ -10,13 +10,16 @@ import com.hjq.toast.Toaster;
import com.tencent.mmkv.MMKV; import com.tencent.mmkv.MMKV;
import com.trello.rxlifecycle4.RxLifecycle; import com.trello.rxlifecycle4.RxLifecycle;
import com.trello.rxlifecycle4.android.ActivityEvent; import com.trello.rxlifecycle4.android.ActivityEvent;
import com.trello.rxlifecycle4.android.FragmentEvent;
import com.xwad.os.BuildConfig; import com.xwad.os.BuildConfig;
import com.xwad.os.R; import com.xwad.os.R;
import com.xwad.os.base.mvvm.BaseViewModel; import com.xwad.os.base.mvvm.BaseViewModel;
import com.xwad.os.bean.AppUpdateInfo; import com.xwad.os.bean.AppUpdateInfo;
import com.xwad.os.bean.BaseResponse; import com.xwad.os.bean.BaseResponse;
import com.xwad.os.bean.CodeBean;
import com.xwad.os.bean.SnInfo; import com.xwad.os.bean.SnInfo;
import com.xwad.os.bean.SystemSettings; import com.xwad.os.bean.SystemSettings;
import com.xwad.os.bean.UserInfo;
import com.xwad.os.config.CommonConfig; import com.xwad.os.config.CommonConfig;
import com.xwad.os.databinding.ActivityHomeBinding; import com.xwad.os.databinding.ActivityHomeBinding;
import com.xwad.os.jxw.SPUtils; import com.xwad.os.jxw.SPUtils;
@@ -232,4 +235,73 @@ public class HomeViewModel extends BaseViewModel<ActivityHomeBinding, ActivityEv
} }
}); });
} }
public MutableLiveData<Boolean> mGetCodeData = new MutableLiveData<>();
public void getActivation() {
NetInterfaceManager.getInstance().getActivationCodeControl()
.compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY))
.subscribe(new Observer<BaseResponse<CodeBean>>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
Log.e("getActivation", "onSubscribe: ");
}
@Override
public void onNext(@NonNull BaseResponse<CodeBean> baseResponse) {
if (baseResponse.code == 200) {
CodeBean codeBean = baseResponse.data;
mMMKV.encode(CommonConfig.ACTIVATIONBEAN_CODE_KEY, codeBean.getCode());
mGetCodeData.setValue(true);
ActivationUtil.getInstance().setActivation(1);
} else {
ActivationUtil.getInstance().setActivation(0);
}
}
@Override
public void onError(@NonNull Throwable e) {
Log.e("getActivation", "onError: " + e.getMessage());
}
@Override
public void onComplete() {
Log.e("getActivation", "onComplete: ");
}
});
}
public MutableLiveData<UserInfo> mUserInfoData = new MutableLiveData<>();
public void getUserInfo() {
NetInterfaceManager.getInstance().getUserInfoControl()
.compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY))
.subscribe(new Observer<BaseResponse<UserInfo>>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
Log.e("getUserInfo", "onSubscribe: ");
}
@Override
public void onNext(@NonNull BaseResponse<UserInfo> userInfoBaseResponse) {
Log.e("getUserInfo", "onNext: " + userInfoBaseResponse);
if (userInfoBaseResponse.code == 200) {
UserInfo userInfo = userInfoBaseResponse.data;
mUserInfoData.setValue(userInfo);
}
}
@Override
public void onError(@NonNull Throwable e) {
Log.e("getUserInfo", "onError: " + e.getMessage());
}
@Override
public void onComplete() {
Log.e("getUserInfo", "onComplete: ");
}
});
}
} }

View File

@@ -14,6 +14,7 @@ import com.xwad.os.bean.LoginInfo;
import com.xwad.os.bean.LoginInfoDevice; import com.xwad.os.bean.LoginInfoDevice;
import com.xwad.os.config.CommonConfig; import com.xwad.os.config.CommonConfig;
import com.xwad.os.databinding.ActivityLoginBinding; import com.xwad.os.databinding.ActivityLoginBinding;
import com.xwad.os.manager.DeviceSNManager;
import com.xwad.os.network.NetInterfaceManager; import com.xwad.os.network.NetInterfaceManager;
import io.reactivex.rxjava3.annotations.NonNull; import io.reactivex.rxjava3.annotations.NonNull;
@@ -67,7 +68,7 @@ public class LoginViewModel extends BaseViewModel<ActivityLoginBinding, Activity
public MutableLiveData<LoginInfo> mLoginInfoData = new MutableLiveData<>(); public MutableLiveData<LoginInfo> mLoginInfoData = new MutableLiveData<>();
public void codeLogin(String mobile, String code) { public void codeLogin(String mobile, String code) {
NetInterfaceManager.getInstance().getCodeLoginObservable(mobile, code) NetInterfaceManager.getInstance().getNewCodeLoginObservable(mobile, code)
.compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY)) .compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY))
.subscribe(new Observer<BaseResponse<LoginInfo>>() { .subscribe(new Observer<BaseResponse<LoginInfo>>() {
@Override @Override
@@ -85,6 +86,7 @@ public class LoginViewModel extends BaseViewModel<ActivityLoginBinding, Activity
mMMKV.encode(CommonConfig.ACCOUNT_LOGIN_MOBILE, loginInfo.getMobile()); mMMKV.encode(CommonConfig.ACCOUNT_LOGIN_MOBILE, loginInfo.getMobile());
mMMKV.encode(CommonConfig.ACCOUNT_LOGIN_ID, loginInfo.getId()); mMMKV.encode(CommonConfig.ACCOUNT_LOGIN_ID, loginInfo.getId());
LoginInfoDevice loginInfoDevice = loginInfo.getDevice(); LoginInfoDevice loginInfoDevice = loginInfo.getDevice();
DeviceSNManager.saveDeviceSN(loginInfoDevice.getSn());
mMMKV.encode(CommonConfig.ACCOUNT_DEVICE_ID, loginInfoDevice.getId()); mMMKV.encode(CommonConfig.ACCOUNT_DEVICE_ID, loginInfoDevice.getId());
mMMKV.encode(CommonConfig.ACCOUNT_DEVICE_SN, loginInfoDevice.getSn()); mMMKV.encode(CommonConfig.ACCOUNT_DEVICE_SN, loginInfoDevice.getSn());
mLoginInfoData.setValue(loginInfo); mLoginInfoData.setValue(loginInfo);

View File

@@ -0,0 +1,17 @@
package com.xwad.os.bean;
import java.io.Serializable;
public class CodeBean implements Serializable {
private static final long serialVersionUID = -611537935984225372L;
String code;
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
}

View File

@@ -38,6 +38,9 @@ public class CommonConfig {
public static final String UIUI_CODE_TYPE_KEY = "iflytek_uiui_code_type"; public static final String UIUI_CODE_TYPE_KEY = "iflytek_uiui_code_type";
/*体验到期时间戳*/ /*体验到期时间戳*/
public static final String UIUI_EXPIRE_TIME_KEY = "iflytek_uiui_expire_time"; public static final String UIUI_EXPIRE_TIME_KEY = "iflytek_uiui_expire_time";
/*保存激活码*/
public static final String ACTIVATIONBEAN_CODE_KEY = "UIUI_ACTIVATIONBEAN_CODE";
/*是否显示返回Android按钮*/ /*是否显示返回Android按钮*/
public static final String UIUI_RETURN_ANDROID_KEY = "iflytek_uiui_is_return_android"; public static final String UIUI_RETURN_ANDROID_KEY = "iflytek_uiui_is_return_android";

View File

@@ -27,14 +27,20 @@ public class DeviceSNManager {
public static String getDeviceSN() { public static String getDeviceSN() {
String existingSN = mMMKV.decodeString(SN_KEY, ""); String existingSN = mMMKV.decodeString(SN_KEY, "");
if (!TextUtils.isEmpty(existingSN)) { // if (!TextUtils.isEmpty(existingSN)) {
return existingSN; return existingSN;
// }
// String newSN = generateNewSN();
// mMMKV.encode(SN_KEY, newSN);
// return newSN;
} }
String newSN = generateNewSN();
mMMKV.encode(SN_KEY, newSN); public static void saveDeviceSN(String sn) {
return newSN; mMMKV.encode(SN_KEY, sn);
} }
/** /**
* 生成新的设备SN * 生成新的设备SN
* 格式CDSN202511T923852225 * 格式CDSN202511T923852225

View File

@@ -16,6 +16,7 @@ import com.xwad.os.bean.AlarmClockData;
import com.xwad.os.bean.AppInfo; import com.xwad.os.bean.AppInfo;
import com.xwad.os.bean.AppUpdateInfo; import com.xwad.os.bean.AppUpdateInfo;
import com.xwad.os.bean.BaseResponse; import com.xwad.os.bean.BaseResponse;
import com.xwad.os.bean.CodeBean;
import com.xwad.os.bean.GuideBean; import com.xwad.os.bean.GuideBean;
import com.xwad.os.bean.HomeworkBean; import com.xwad.os.bean.HomeworkBean;
import com.xwad.os.bean.LessonApp; import com.xwad.os.bean.LessonApp;
@@ -381,6 +382,13 @@ public class NetInterfaceManager {
.observeOn(AndroidSchedulers.mainThread()); .observeOn(AndroidSchedulers.mainThread());
} }
public Observable<BaseResponse<LoginInfo>> getNewCodeLoginObservable(String mobile, String code) {
return mRetrofit.create(LoginApi.class)
.newCodeLogin(mobile, code)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
public Observable<BaseResponse> getUserLoginObservable(String mobile, String password) { public Observable<BaseResponse> getUserLoginObservable(String mobile, String password) {
return mRetrofit.create(LoginApi.class) return mRetrofit.create(LoginApi.class)
.userLogin(mobile, password, DeviceSNManager.getDeviceSN()) .userLogin(mobile, password, DeviceSNManager.getDeviceSN())
@@ -416,6 +424,13 @@ public class NetInterfaceManager {
.observeOn(AndroidSchedulers.mainThread()); .observeOn(AndroidSchedulers.mainThread());
} }
public Observable<BaseResponse<CodeBean>> getActivationCodeControl() {
return mRetrofit.create(UserApi.class)
.getActivationCode(getToken(), DeviceSNManager.getDeviceSN())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
public Observable<BaseResponse<PayInfo>> getPayQrcodeControl(String orderSn) { public Observable<BaseResponse<PayInfo>> getPayQrcodeControl(String orderSn) {
return mRetrofit.create(UserApi.class) return mRetrofit.create(UserApi.class)
.payQrcode(getToken(), DeviceSNManager.getDeviceSN(), orderSn) .payQrcode(getToken(), DeviceSNManager.getDeviceSN(), orderSn)

View File

@@ -7,10 +7,14 @@ public class UrlAddress {
/*发送登录验证码*/ /*发送登录验证码*/
public final static String LOGIN_GET_CODE = "login/get-code"; public final static String LOGIN_GET_CODE = "login/get-code";
/*验证码登录*/ /*验证码登录*/
@Deprecated
public final static String CODE_LOGIN = "login/code-login"; public final static String CODE_LOGIN = "login/code-login";
/*账号密码登录*/ /*账号密码登录*/
public final static String USER_LOGIN = "login/user-login"; public final static String USER_LOGIN = "login/user-login";
public final static String NEW_CODE_LOGIN = "login/new-login";
/*用户会员信息(用于判断是否有VIP)*/ /*用户会员信息(用于判断是否有VIP)*/
public static final String USER_INFO = "user/info"; public static final String USER_INFO = "user/info";
/*套餐可选列表*/ /*套餐可选列表*/
@@ -19,6 +23,8 @@ public class UrlAddress {
public static final String BUY = "user/buy"; public static final String BUY = "user/buy";
/*激活码激活*/ /*激活码激活*/
public static final String activation_code = "activation/code"; public static final String activation_code = "activation/code";
/*获取激活码(激活成功后才有)*/
public static final String get_activation_code = "activation/get-code";
/*发起支付*/ /*发起支付*/
public static final String PAY_QRCODE = "pay/qrcode"; public static final String PAY_QRCODE = "pay/qrcode";
/*续费购买(已经是VIP过期或没过期)*/ /*续费购买(已经是VIP过期或没过期)*/

View File

@@ -32,4 +32,11 @@ public interface LoginApi {
@Query("password") String password, @Query("password") String password,
@Field("sn") String sn @Field("sn") String sn
); );
@FormUrlEncoded
@POST(UrlAddress.NEW_CODE_LOGIN)
Observable<BaseResponse<LoginInfo>> newCodeLogin(
@Field("mobile") String mobile,
@Field("code") String code
);
} }

View File

@@ -1,6 +1,7 @@
package com.xwad.os.network.api; package com.xwad.os.network.api;
import com.xwad.os.bean.BaseResponse; import com.xwad.os.bean.BaseResponse;
import com.xwad.os.bean.CodeBean;
import com.xwad.os.bean.OrderInfo; import com.xwad.os.bean.OrderInfo;
import com.xwad.os.bean.PayInfo; import com.xwad.os.bean.PayInfo;
import com.xwad.os.bean.UserInfo; import com.xwad.os.bean.UserInfo;
@@ -45,6 +46,12 @@ public interface UserApi {
@Field("code") String code @Field("code") String code
); );
@GET(UrlAddress.get_activation_code)
Observable<BaseResponse<CodeBean>> getActivationCode(
@Header("token") String token,
@Query("sn") String sn
);
@FormUrlEncoded @FormUrlEncoded
@POST(UrlAddress.PAY_QRCODE) @POST(UrlAddress.PAY_QRCODE)
Observable<BaseResponse<PayInfo>> payQrcode( Observable<BaseResponse<PayInfo>> payQrcode(

View File

@@ -9,10 +9,12 @@ import android.text.TextUtils;
import android.util.Log; import android.util.Log;
import com.blankj.utilcode.util.NetworkUtils; import com.blankj.utilcode.util.NetworkUtils;
import com.tencent.mmkv.MMKV;
import com.xwad.os.activity.NoticeActivity; import com.xwad.os.activity.NoticeActivity;
import com.xwad.os.alarm.AlarmUtils; import com.xwad.os.alarm.AlarmUtils;
import com.xwad.os.base.rx.BaseRxService; import com.xwad.os.base.rx.BaseRxService;
import com.xwad.os.bean.AlarmClockData; import com.xwad.os.bean.AlarmClockData;
import com.xwad.os.config.CommonConfig;
import java.util.Calendar; import java.util.Calendar;
import java.util.HashMap; import java.util.HashMap;
@@ -20,6 +22,8 @@ import java.util.HashMap;
public class MainService extends BaseRxService implements MainSContact.MainSView, NetworkUtils.OnNetworkStatusChangedListener { public class MainService extends BaseRxService implements MainSContact.MainSView, NetworkUtils.OnNetworkStatusChangedListener {
private static final String TAG = "MainService"; private static final String TAG = "MainService";
private MMKV mMMKV = MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE);
public MainSPresenter mPresenter; public MainSPresenter mPresenter;
public MainService() { public MainService() {
@@ -53,7 +57,7 @@ public class MainService extends BaseRxService implements MainSContact.MainSView
mPresenter.attachView(this); mPresenter.attachView(this);
mPresenter.setLifecycle(getLifecycleSubject()); mPresenter.setLifecycle(getLifecycleSubject());
mPresenter.getCloudLessonSettings(); mPresenter.getCloudLessonSettings();
// registerAlarmReceiver(); registerReceivers();
NetworkUtils.registerNetworkStatusChangedListener(this); NetworkUtils.registerNetworkStatusChangedListener(this);
startJxwLauncher(); startJxwLauncher();
} }
@@ -83,10 +87,18 @@ public class MainService extends BaseRxService implements MainSContact.MainSView
// } // }
} }
private void registerReceivers() {
// registerAlarmReceiver();
registerJxwRegisterRefreshReceiver();
}
private void unregisterReceiver() { private void unregisterReceiver() {
// if (alarmReceiver != null) { // if (alarmReceiver != null) {
// unregisterReceiver(alarmReceiver); // unregisterReceiver(alarmReceiver);
// } // }
if (null != mJxwRegisterReceiver) {
unregisterReceiver(mJxwRegisterReceiver);
}
} }
public static final String ALARMWAKEUP = "ALARM_WAKEUP"; public static final String ALARMWAKEUP = "ALARM_WAKEUP";
@@ -155,4 +167,28 @@ public class MainService extends BaseRxService implements MainSContact.MainSView
} }
public static final String JXW_REGISTER_SUCCESS = "com.zzj.regist_success";
private JxwRegisterReceiver mJxwRegisterReceiver;
private void registerJxwRegisterRefreshReceiver() {
if (mJxwRegisterReceiver == null) {
mJxwRegisterReceiver = new JxwRegisterReceiver();
}
IntentFilter filter = new IntentFilter();
filter.addAction(JXW_REGISTER_SUCCESS);
registerReceiver(mJxwRegisterReceiver, filter);
}
public class JxwRegisterReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
Log.e("JxwRegisterReceiver", "onReceive: " + action);
if (JXW_REGISTER_SUCCESS.equals(action)) {
mMMKV.encode(JXW_REGISTER_SUCCESS, true);
}
}
}
} }

View File

@@ -1,10 +1,14 @@
package com.xwad.os.utils; package com.xwad.os.utils;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.content.ComponentName;
import android.content.Context; import android.content.Context;
import android.content.Intent;
import android.util.Log;
import com.tencent.mmkv.MMKV; import com.tencent.mmkv.MMKV;
import com.xwad.os.config.CommonConfig; import com.xwad.os.config.CommonConfig;
import com.xwad.os.service.main.MainService;
public class ActivationUtil { public class ActivationUtil {
/*写入1为激活*/ /*写入1为激活*/
@@ -15,6 +19,8 @@ public class ActivationUtil {
/*默认过期时间*/ /*默认过期时间*/
public static final int DEFAULT_EXPIRE_TIME = -1; public static final int DEFAULT_EXPIRE_TIME = -1;
private static final String TAG = "ActivationUtil";
private MMKV mMMKV = MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE); private MMKV mMMKV = MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE);
@SuppressLint("StaticFieldLeak") @SuppressLint("StaticFieldLeak")
@@ -110,4 +116,24 @@ public class ActivationUtil {
return mMMKV.decodeInt(CommonConfig.ACCOUNT_LOGIN_STATU, 0) == 1; return mMMKV.decodeInt(CommonConfig.ACCOUNT_LOGIN_STATU, 0) == 1;
} }
public void startJxwLauncher() {
String code = mMMKV.decodeString(CommonConfig.ACTIVATIONBEAN_CODE_KEY, "");
boolean regist_success = mMMKV.decodeBool(MainService.JXW_REGISTER_SUCCESS, false);
if (!regist_success) {
Intent intent = new Intent("UIUI_ACTIVATION");
ComponentName componentName = new ComponentName("com.jxw.launcher", "com.jxw.engine.platsign.MainActivity");
intent.setComponent(componentName);
intent.putExtra("uiui_activation_code", code);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
try {
mContext.startActivity(intent);
} catch (Exception e) {
Log.e("getEBagCode", "startActivity: " + e.getMessage());
}
} else {
Log.e("getEBagCode", "onNext: com.zzj.regist_success is true");
}
}
} }

View File

@@ -55,7 +55,7 @@ public class QhbzDialog extends Dialog {
super.onCreate(bundle); super.onCreate(bundle);
setContentView(R.layout.dialog_qhbz); setContentView(R.layout.dialog_qhbz);
WindowManager windowManager = getWindow().getWindowManager(); WindowManager windowManager = getWindow().getWindowManager();
getWindow().setBackgroundDrawableResource(R.drawable.bg_shape_ffffff_40); // getWindow().setBackgroundDrawableResource(R.drawable.bg_shape_ffffff_40);
Display defaultDisplay = windowManager.getDefaultDisplay(); Display defaultDisplay = windowManager.getDefaultDisplay();
WindowManager.LayoutParams attributes = getWindow().getAttributes(); WindowManager.LayoutParams attributes = getWindow().getAttributes();
defaultDisplay.getSize(new Point()); defaultDisplay.getSize(new Point());

View File

@@ -258,6 +258,7 @@
android:textSize="9sp" /> android:textSize="9sp" />
<TextView <TextView
android:id="@+id/tv_vip_name"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:gravity="end" android:gravity="end"
@@ -290,17 +291,18 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:maxLines="1" android:maxLines="1"
android:singleLine="true" android:singleLine="true"
android:text="商品名称" android:text="商品价格"
android:textColor="@color/activation_text_color" android:textColor="@color/activation_text_color"
android:textSize="9sp" /> android:textSize="9sp" />
<TextView <TextView
android:id="@+id/tv_vip_price"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:gravity="end" android:gravity="end"
android:maxLines="1" android:maxLines="1"
android:singleLine="true" android:singleLine="true"
android:text="软件终端许可证-AI旗舰版" android:text="¥980.00"
android:textColor="#000000" android:textColor="#000000"
android:textSize="9sp" /> android:textSize="9sp" />
@@ -561,7 +563,7 @@
android:layout_marginStart="16dp" android:layout_marginStart="16dp"
android:layout_marginEnd="16dp" android:layout_marginEnd="16dp"
android:gravity="center" android:gravity="center"
android:text="@string/license_notice" android:text="@string/license_hint"
android:textColor="#9bb2cc" android:textColor="#9bb2cc"
android:textSize="7sp" android:textSize="7sp"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
@@ -585,6 +587,7 @@
android:gravity="center" android:gravity="center"
android:maxLines="1" android:maxLines="1"
android:singleLine="true" android:singleLine="true"
android:inputType="text"
android:textColor="@color/black" android:textColor="@color/black"
android:textSize="12sp" android:textSize="12sp"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
@@ -603,10 +606,9 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:gravity="center" android:gravity="center"
android:maxLines="1" android:maxLines="2"
android:singleLine="true" android:text="@string/license_notice"
android:text="注意:涂层刮开视为使用,无法退换货" android:textColor="#D01D27"
android:textColor="@color/red"
android:textSize="7sp" android:textSize="7sp"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
@@ -624,8 +626,8 @@
android:layout_width="110dp" android:layout_width="110dp"
android:layout_height="25dp" android:layout_height="25dp"
android:adjustViewBounds="true" android:adjustViewBounds="true"
android:scaleType="centerCrop"
android:onClick="@{click::keyConfirm}" android:onClick="@{click::keyConfirm}"
android:scaleType="centerCrop"
android:src="@drawable/icon_activation_confirm" android:src="@drawable/icon_activation_confirm"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"

View File

@@ -19,7 +19,8 @@
<string name="desktop_permission">桌面运行需授予权限,点击设置</string> <string name="desktop_permission">桌面运行需授予权限,点击设置</string>
<string name="privacy_statement">本服务需获取网络、账号、设备、应用、交易信息以及您主动上传的数据,用于提供应用内支付服务。同时为了提升您的使用体验,基于您的“同意"为您启个性化服务。\n使用本服务即表示您已满 14 周岁并同意上述内容及学王365软终端内支付用户协议关于学王365软终端内支付与隐私的声明。 <string name="privacy_statement">本服务需获取网络、账号、设备、应用、交易信息以及您主动上传的数据,用于提供应用内支付服务。同时为了提升您的使用体验,基于您的“同意"为您启个性化服务。\n使用本服务即表示您已满 14 周岁并同意上述内容及学王365软终端内支付用户协议关于学王365软终端内支付与隐私的声明。
</string> </string>
<string name="license_notice">如果您已经订购实体包装版,您可以在包装盒内找到“许可证”贴纸,\n请刮开涂层将密钥输入在下面的对话框内</string> <string name="license_hint">如果您的许可证从经销商手中获得,您可以在本页下方的对话框中输入许可证密钥,验证成功后,即可实现许可证的开通绑定,无需重复支付</string>
<string name="license_notice">注意:请妥善保管您的许可证密钥,切勿遗失;\n许可证属于数字化虚拟商品暂不支持退换感谢您的理解与支持</string>
<string name="license_verification_successful">许可证验证成功,本账户已可长期使用,\n点击开启学习之旅</string> <string name="license_verification_successful">许可证验证成功,本账户已可长期使用,\n点击开启学习之旅</string>
<string name="validity_period">有效期:%d年</string> <string name="validity_period">有效期:%d年</string>