diff --git a/app/build.gradle b/app/build.gradle index 9cf1484..919afe4 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -16,8 +16,8 @@ android { minSdkVersion 24 targetSdkVersion 29 - versionCode 4 - versionName "1.0.3" + versionCode 5 + versionName "1.0.4" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 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 26e9c58..07cfad6 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 @@ -32,7 +32,6 @@ import com.hjq.toast.Toaster; import com.tencent.mmkv.MMKV; import com.xwad.os.BuildConfig; import com.xwad.os.R; -import com.xwad.os.activity.activation.ActivationActivity; import com.xwad.os.activity.login.LoginActivity; import com.xwad.os.activity.permission.PermissionActivity; import com.xwad.os.base.mvvm.BaseMvvmActivity; @@ -53,17 +52,24 @@ import com.xwad.os.jxw.JxwPackageConfig; import com.xwad.os.jxw.SPUtils; import com.xwad.os.jxw.StudyRecordAPKInfo; import com.xwad.os.jxw.TabAdapter; -import com.xwad.os.jxw.Util; +import com.xwad.os.jxw.util.Util; +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.DataUtil; import com.xwad.os.utils.OpenApkUtils; import com.xwad.os.utils.Utils; +import org.greenrobot.eventbus.EventBus; +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; + import java.util.ArrayList; import java.util.List; public class HomeActivity extends BaseMvvmActivity implements RemoteManager.ConnectedListener { - private static final String TAG = "MainActivity"; + private static final String TAG = "HomeActivity"; private MMKV mMMKV = MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE); @@ -72,6 +78,8 @@ public class HomeActivity extends BaseMvvmActivity { + + @Override + public ActivityLoginBinding getVDBinding() { + return binding; + } + @Override public void onDestroy() { } + + public MutableLiveData mSentSuccessfullyData = new MutableLiveData<>(); + + public void getPhoneCode(String mobile) { + NetInterfaceManager.getInstance().getPhoneCodeObservable(mobile) + .compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY)) + .subscribe(new Observer() { + @Override + public void onSubscribe(@NonNull Disposable d) { + Log.e("getPhoneCode", "onSubscribe: "); + } + + @Override + public void onNext(@NonNull BaseResponse baseResponse) { + Log.e("getPhoneCode", "onNext: "); + mSentSuccessfullyData.setValue(baseResponse.code == 200); + Toaster.show(baseResponse.msg); + } + + @Override + public void onError(@NonNull Throwable e) { + Log.e("getPhoneCode", "onError: " + e.getMessage()); + } + + @Override + public void onComplete() { + Log.e("getPhoneCode", "onComplete: "); + } + }); + } + + public MutableLiveData mLoginSuccessfullyData = new MutableLiveData<>(); + + public void codeLogin(String mobile, String code) { + NetInterfaceManager.getInstance().getCodeLoginObservable(mobile, code) + .compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY)) + .subscribe(new Observer() { + @Override + public void onSubscribe(@NonNull Disposable d) { + Log.e("codeLogin", "onSubscribe: "); + } + + @Override + public void onNext(@NonNull BaseResponse baseResponse) { + Log.e("codeLogin", "onNext: " + baseResponse); + if (baseResponse.code == 200) { + mLoginSuccessfullyData.setValue(true); + } else { + mLoginSuccessfullyData.setValue(false); + Toaster.show(baseResponse.msg); + } + } + + @Override + public void onError(@NonNull Throwable e) { + Log.e("codeLogin", "onError: " + e.getMessage()); + } + + @Override + public void onComplete() { + Log.e("codeLogin", "onComplete: "); + } + }); + } } diff --git a/app/src/main/java/com/xwad/os/activity/selectegrade/SelecteGradeActivity.java b/app/src/main/java/com/xwad/os/activity/selectegrade/SelecteGradeActivity.java index 8866141..b859b62 100644 --- a/app/src/main/java/com/xwad/os/activity/selectegrade/SelecteGradeActivity.java +++ b/app/src/main/java/com/xwad/os/activity/selectegrade/SelecteGradeActivity.java @@ -13,11 +13,15 @@ import com.xwad.os.R; import com.xwad.os.base.mvvm.BaseMvvmActivity; import com.xwad.os.config.CommonConfig; import com.xwad.os.databinding.ActivitySelecteGradeBinding; +import com.xwad.os.jxw.SPUtils; +import com.xwad.os.jxw.event.UpdateGradeEvent; import com.xwad.os.manager.RemoteManager; import com.xwad.os.utils.ActivationUtil; import com.xwad.os.utils.LenovoCsdkUtil; import com.xwad.os.utils.Utils; +import org.greenrobot.eventbus.EventBus; + import java.util.HashMap; import java.util.Map; @@ -74,7 +78,7 @@ public class SelecteGradeActivity extends BaseMvvmActivity() { - @Override - public void onChanged(Boolean aBoolean) { - if (aBoolean) { - Toaster.showLong("桌面调整,正在重启"); - Utils.triggerRebirth(SelecteGradeActivity.this); - finish(); - } - } - }); +// mViewModel.mSuccessfulData.observe(this, new Observer() { +// @Override +// public void onChanged(Boolean aBoolean) { +// if (aBoolean) { +// Toaster.showLong("桌面调整,正在重启"); +// Utils.triggerRebirth(SelecteGradeActivity.this); +// finish(); +// } +// } +// }); } public void setPrimary(View view) { @@ -167,12 +171,15 @@ public class SelecteGradeActivity extends BaseMvvmActivity params = new HashMap<>(); - params.put("sn", RemoteManager.getInstance().getSerial()); - params.put("sn_grade", grade); - mViewModel.updateInfo(params); - } +// if (ActivationUtil.getInstance().isActivation()) { +// Map 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(); } } diff --git a/app/src/main/java/com/xwad/os/bean/AppInfo.java b/app/src/main/java/com/xwad/os/bean/AppInfo.java new file mode 100644 index 0000000..7950f9f --- /dev/null +++ b/app/src/main/java/com/xwad/os/bean/AppInfo.java @@ -0,0 +1,218 @@ +package com.xwad.os.bean; + +import androidx.annotation.NonNull; + +import com.google.gson.Gson; +import com.google.gson.JsonParser; +import com.google.gson.annotations.SerializedName; + +import java.io.Serializable; + +public class AppInfo implements Serializable { + private static final long serialVersionUID = -3148862992697783934L; + + private int id; + private String app_name; + private String app_img; + private String app_developer; + private long app_size; + private String app_package; + private String app_version_name; + private int app_version_code; + private String app_md5; + private int app_score; + private String app_preview1; + private String app_preview2; + private String app_preview3; + private String app_url; + private String app_remarks; + private String app_desc; + private int is_promote; + private int weight; + private String discount; + private String use_type; + private int is_autodown; + private String third_url; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getApp_name() { + return app_name; + } + + public void setApp_name(String app_name) { + this.app_name = app_name; + } + + public String getApp_img() { + return app_img; + } + + public void setApp_img(String app_img) { + this.app_img = app_img; + } + + public String getApp_developer() { + return app_developer; + } + + public void setApp_developer(String app_developer) { + this.app_developer = app_developer; + } + + public long getApp_size() { + return app_size; + } + + public void setApp_size(long app_size) { + this.app_size = app_size; + } + + public String getApp_package() { + return app_package; + } + + public void setApp_package(String app_package) { + this.app_package = app_package; + } + + public String getApp_version_name() { + return app_version_name; + } + + public void setApp_version_name(String app_version_name) { + this.app_version_name = app_version_name; + } + + public int getApp_version_code() { + return app_version_code; + } + + public void setApp_version_code(int app_version_code) { + this.app_version_code = app_version_code; + } + + public String getApp_md5() { + return app_md5; + } + + public void setApp_md5(String app_md5) { + this.app_md5 = app_md5; + } + + public int getApp_score() { + return app_score; + } + + public void setApp_score(int app_score) { + this.app_score = app_score; + } + + public String getApp_preview1() { + return app_preview1; + } + + public void setApp_preview1(String app_preview1) { + this.app_preview1 = app_preview1; + } + + public String getApp_preview2() { + return app_preview2; + } + + public void setApp_preview2(String app_preview2) { + this.app_preview2 = app_preview2; + } + + public String getApp_preview3() { + return app_preview3; + } + + public void setApp_preview3(String app_preview3) { + this.app_preview3 = app_preview3; + } + + public String getApp_url() { + return app_url; + } + + public void setApp_url(String app_url) { + this.app_url = app_url; + } + + public String getApp_remarks() { + return app_remarks; + } + + public void setApp_remarks(String app_remarks) { + this.app_remarks = app_remarks; + } + + public String getApp_desc() { + return app_desc; + } + + public void setApp_desc(String app_desc) { + this.app_desc = app_desc; + } + + public int getIs_promote() { + return is_promote; + } + + public void setIs_promote(int is_promote) { + this.is_promote = is_promote; + } + + public int getWeight() { + return weight; + } + + public void setWeight(int weight) { + this.weight = weight; + } + + public String getDiscount() { + return discount; + } + + public void setDiscount(String discount) { + this.discount = discount; + } + + public String getUse_type() { + return use_type; + } + + public void setUse_type(String use_type) { + this.use_type = use_type; + } + + public int getIs_autodown() { + return is_autodown; + } + + public void setIs_autodown(int is_autodown) { + this.is_autodown = is_autodown; + } + + public String getThird_url() { + return third_url; + } + + public void setThird_url(String third_url) { + this.third_url = third_url; + } + + @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/AriaDownloadInfo.java b/app/src/main/java/com/xwad/os/bean/AriaDownloadInfo.java index fdf372a..7076cd3 100644 --- a/app/src/main/java/com/xwad/os/bean/AriaDownloadInfo.java +++ b/app/src/main/java/com/xwad/os/bean/AriaDownloadInfo.java @@ -123,6 +123,21 @@ public class AriaDownloadInfo implements Serializable { appUpdateInfo.getApp_md5() ); } + + public static AriaDownloadInfo toAriaDownloadInfo(AppInfo appInfo) { + return new AriaDownloadInfo( + appInfo.getId(), + appInfo.getApp_name(), + appInfo.getApp_package(), + appInfo.getApp_version_name(), + appInfo.getApp_version_code(), + appInfo.getApp_url(), + appInfo.getApp_img(), + appInfo.getApp_size(), + appInfo.getApp_md5() + ); + } + // // public static AriaDownloadInfo toAriaDownloadInfo(AppDetails appDetails) { // return new AriaDownloadInfo( diff --git a/app/src/main/java/com/xwad/os/fragment/ai/AiFragment.java b/app/src/main/java/com/xwad/os/fragment/ai/AiFragment.java index d1fdf4b..8b3414d 100644 --- a/app/src/main/java/com/xwad/os/fragment/ai/AiFragment.java +++ b/app/src/main/java/com/xwad/os/fragment/ai/AiFragment.java @@ -16,7 +16,7 @@ import com.xwad.os.R; import com.xwad.os.base.mvvm.fragment.BaseMvvmFragment; import com.xwad.os.config.CommonConfig; import com.xwad.os.databinding.FragmentAiBinding; -import com.xwad.os.jxw.Util; +import com.xwad.os.jxw.util.Util; import com.youth.banner.adapter.BannerAdapter; import com.youth.banner.listener.OnBannerListener; import com.youth.banner.transformer.ZoomOutPageTransformer; 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 18b58b0..653faed 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 @@ -25,7 +25,7 @@ import com.xwad.os.bean.jxw.ItemsBean; import com.xwad.os.databinding.FragmentChineseBinding; import com.xwad.os.jxw.AssertUtils; import com.xwad.os.jxw.SPUtils; -import com.xwad.os.jxw.Util; +import com.xwad.os.jxw.util.Util; import com.xwad.os.manager.AmapManager; import com.xwad.os.utils.OpenApkUtils; import com.xwad.os.view.jxw.widget.AppsDialog; @@ -51,7 +51,7 @@ public class ChineseFragment extends BaseMvvmFragment appList = new ArrayList(); + private List appList = new ArrayList<>(); private BaseQuickAdapter contentAdapter = new BaseQuickAdapter(R.layout.item_yw_app) { @Override public void convert(BaseViewHolder baseViewHolder, final ItemsBean itemsBean) { @@ -226,7 +226,7 @@ public class ChineseFragment extends BaseMvvmFragment appList = new ArrayList(); + private List appList = new ArrayList<>(); private BaseQuickAdapter contentAdapter = new BaseQuickAdapter(R.layout.item_yw_app) { @Override public void convert(BaseViewHolder baseViewHolder, final ItemsBean itemsBean) { @@ -124,7 +124,7 @@ public class EnglishFragment extends BaseMvvmFragment mlistAppInfo = new ArrayList<>(); + // private ZhMenuAdapter zhMenuAdapter; +// private List mlistAppInfo = new ArrayList<>(); private Handler mHandler = new Handler(); public String file_name = "app_list_6.0"; @@ -111,78 +113,80 @@ public class MineFragment extends BaseMvvmFragment bookBeans = new ArrayList(); ImageView iv_book_icon; diff --git a/app/src/main/java/com/xwad/os/jxw/fragment/HxFragment.java b/app/src/main/java/com/xwad/os/jxw/fragment/HxFragment.java index 00d87cc..fb0183f 100644 --- a/app/src/main/java/com/xwad/os/jxw/fragment/HxFragment.java +++ b/app/src/main/java/com/xwad/os/jxw/fragment/HxFragment.java @@ -9,8 +9,10 @@ import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; + import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; + import com.chad.library.adapter.base.BaseQuickAdapter; import com.chad.library.adapter.base.BaseViewHolder; import com.google.gson.Gson; @@ -49,7 +51,7 @@ public class HxFragment extends BaseNewFragment { TextView tv_tab_tbjzx; private BaseQuickAdapter contentAdapter = new BaseQuickAdapter(R.layout.item_wl_app) { - + @Override public void convert(BaseViewHolder baseViewHolder, final ItemsBean itemsBean) { RelativeLayout relativeLayout = baseViewHolder.getView(R.id.rl_root); @@ -69,21 +71,21 @@ public class HxFragment extends BaseNewFragment { }; List appList = new ArrayList<>(); - - @Override + + @Override public void initListener() { } - @Override + @Override protected void lazyLoad() { } - @Override + @Override protected View createView(LayoutInflater layoutInflater, ViewGroup viewGroup, Bundle bundle) { return layoutInflater.inflate(R.layout.fg_content_hx, viewGroup, false); } - @Override + @Override protected void initView() { initViews(); setListener(); @@ -214,7 +216,7 @@ public class HxFragment extends BaseNewFragment { contentAdapter.notifyDataSetChanged(); // MyApp.getInstance().mBottomBtnOnClickListener.setContext(getActivity()); // MyApp.getInstance().mBottomBtnOnClickListener.onClick(obj); - OpenApkUtils.getInstance().openJxwApp(obj); + OpenApkUtils.getInstance().openJxwApp(getActivity(), obj); } private void saveTag(ItemsBean itemsBean) { diff --git a/app/src/main/java/com/xwad/os/jxw/fragment/SwFragment.java b/app/src/main/java/com/xwad/os/jxw/fragment/SwFragment.java index 6c257b5..749e512 100644 --- a/app/src/main/java/com/xwad/os/jxw/fragment/SwFragment.java +++ b/app/src/main/java/com/xwad/os/jxw/fragment/SwFragment.java @@ -223,7 +223,7 @@ public class SwFragment extends BaseNewFragment { contentAdapter.notifyDataSetChanged(); // MyApp.getInstance().mBottomBtnOnClickListener.setContext(getActivity()); // MyApp.getInstance().mBottomBtnOnClickListener.onClick(obj); - OpenApkUtils.getInstance().openJxwApp(obj); + OpenApkUtils.getInstance().openJxwApp(getActivity(), obj); } private void saveTag(ItemsBean itemsBean) { diff --git a/app/src/main/java/com/xwad/os/jxw/fragment/SztzFragment.java b/app/src/main/java/com/xwad/os/jxw/fragment/SztzFragment.java new file mode 100644 index 0000000..ee3128a --- /dev/null +++ b/app/src/main/java/com/xwad/os/jxw/fragment/SztzFragment.java @@ -0,0 +1,28 @@ +package com.xwad.os.jxw.fragment; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import com.xwad.os.R; +import com.xwad.os.jxw.BaseNewFragment; + +public class SztzFragment extends BaseNewFragment { + @Override + public void initListener() { + } + + @Override + protected void initView() { + } + + @Override + protected void lazyLoad() { + } + + @Override + protected View createView(LayoutInflater layoutInflater, ViewGroup viewGroup, Bundle bundle) { + return layoutInflater.inflate(R.layout.fg_content_sztz, viewGroup, false); + } +} diff --git a/app/src/main/java/com/xwad/os/jxw/fragment/WlFragment.java b/app/src/main/java/com/xwad/os/jxw/fragment/WlFragment.java index 75e1d80..2ba29c5 100644 --- a/app/src/main/java/com/xwad/os/jxw/fragment/WlFragment.java +++ b/app/src/main/java/com/xwad/os/jxw/fragment/WlFragment.java @@ -222,7 +222,7 @@ public class WlFragment extends BaseNewFragment { contentAdapter.notifyDataSetChanged(); // MyApp.getInstance().mBottomBtnOnClickListener.setContext(getActivity()); // MyApp.getInstance().mBottomBtnOnClickListener.onClick(obj); - OpenApkUtils.getInstance().openJxwApp(obj); + OpenApkUtils.getInstance().openJxwApp(getActivity(), obj); } private void saveTag(ItemsBean itemsBean) { diff --git a/app/src/main/java/com/xwad/os/jxw/Util.java b/app/src/main/java/com/xwad/os/jxw/util/Util.java similarity index 89% rename from app/src/main/java/com/xwad/os/jxw/Util.java rename to app/src/main/java/com/xwad/os/jxw/util/Util.java index 15fcd3a..30e86d7 100644 --- a/app/src/main/java/com/xwad/os/jxw/Util.java +++ b/app/src/main/java/com/xwad/os/jxw/util/Util.java @@ -1,5 +1,6 @@ -package com.xwad.os.jxw; +package com.xwad.os.jxw.util; +import android.app.Activity; import android.content.Context; import android.net.ConnectivityManager; import android.net.NetworkInfo; @@ -54,8 +55,8 @@ public class Util { // } } - public static void downloadClickListener(Context context, String str, String str2, String str3, String str4) { - OpenApkUtils.getInstance().openJxwApp("" + str + "," + str2 + "," + str3 + "," + str.substring(str.lastIndexOf(".") + 1) + "," + str4); + public static void downloadClickListener(Activity activity, String str, String str2, String str3, String str4) { + OpenApkUtils.getInstance().openJxwApp(activity, "" + str + "," + str2 + "," + str3 + "," + str.substring(str.lastIndexOf(".") + 1) + "," + str4); } public static String checkGrade(String str) { diff --git a/app/src/main/java/com/xwad/os/manager/DeviceSNManager.java b/app/src/main/java/com/xwad/os/manager/DeviceSNManager.java new file mode 100644 index 0000000..6341a52 --- /dev/null +++ b/app/src/main/java/com/xwad/os/manager/DeviceSNManager.java @@ -0,0 +1,100 @@ +package com.xwad.os.manager; + +import android.text.TextUtils; + +import com.tencent.mmkv.MMKV; +import com.xwad.os.config.CommonConfig; + +import java.util.Random; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; + +public class DeviceSNManager { + private static final String SN_KEY = "device_sn"; + private static final String PREFIX = "CDSN"; + private static final int RANDOM_DIGITS = 9; + + private static MMKV mMMKV = MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE); + + public DeviceSNManager() { + + } + + /** + * 获取设备SN,如果不存在则创建新的 + */ + public static String getDeviceSN() { + String existingSN = mMMKV.decodeString(SN_KEY, ""); + + if (!TextUtils.isEmpty(existingSN)) { + return existingSN; + } + String newSN = generateNewSN(); + mMMKV.encode(SN_KEY, newSN); + return newSN; + } + + /** + * 生成新的设备SN + * 格式:CDSN202511T923852225 + */ + private static String generateNewSN() { + StringBuilder snBuilder = new StringBuilder(); + // 添加前缀 + snBuilder.append(PREFIX); + // 添加年份月份 + String timeYear = formatTimestamp(System.currentTimeMillis()); + snBuilder.append(timeYear); + + // 添加基于时间戳的9位随机数字 + snBuilder.append(generateRandomString(10)); + + return snBuilder.toString(); + } + + // 定义可供随机选择的字符池 + private static final String LETTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + private static final String LETTERS_AND_DIGITS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; + + public static String generateRandomString(int length) { + if (length < 1) { + throw new IllegalArgumentException("Length must be at least 1"); + } + + Random random = new Random(); + StringBuilder sb = new StringBuilder(length); + + // 第一位:确保是字母 + sb.append(LETTERS.charAt(random.nextInt(LETTERS.length()))); + + // 剩余位数:字母或数字 + for (int i = 1; i < length; i++) { + sb.append(LETTERS_AND_DIGITS.charAt(random.nextInt(LETTERS_AND_DIGITS.length()))); + } + + return sb.toString(); + } + + /** + * 删除已存储的SN(用于测试或重新生成) + */ + public static void clearDeviceSN() { + mMMKV.removeValueForKey(SN_KEY); + } + + /** + * 检查是否已存在SN + */ + public static boolean hasDeviceSN() { + return mMMKV.containsKey(SN_KEY) && !TextUtils.isEmpty(mMMKV.decodeString(SN_KEY, "")); + } + + public static String formatTimestamp(long timestamp) { + // 创建指定格式的格式化对象,"yyyyMM" 表示6位数字的年份和月份,"'T'" 表示字面量字符 T + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMM'T'"); + Date date = new Date(timestamp); + // 将 Date 对象格式化为字符串 + return sdf.format(date); + } +} 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 dca64e1..c0e2afc 100644 --- a/app/src/main/java/com/xwad/os/network/NetInterfaceManager.java +++ b/app/src/main/java/com/xwad/os/network/NetInterfaceManager.java @@ -10,8 +10,10 @@ import com.tencent.mmkv.MMKV; import com.trello.rxlifecycle4.RxLifecycle; import com.trello.rxlifecycle4.android.ActivityEvent; import com.trello.rxlifecycle4.android.FragmentEvent; +import com.xwad.os.BuildConfig; import com.xwad.os.alarm.AlarmUtils; import com.xwad.os.bean.AlarmClockData; +import com.xwad.os.bean.AppInfo; import com.xwad.os.bean.AppUpdateInfo; import com.xwad.os.bean.BaseResponse; import com.xwad.os.bean.GuideBean; @@ -27,11 +29,14 @@ import com.xwad.os.bean.UserAvatarInfo; import com.xwad.os.config.CommonConfig; import com.xwad.os.disklrucache.CacheHelper; import com.xwad.os.gson.GsonUtils; +import com.xwad.os.manager.DeviceSNManager; import com.xwad.os.manager.RemoteManager; import com.xwad.os.network.api.AlarmClockApi; +import com.xwad.os.network.api.AppApi; import com.xwad.os.network.api.AppUsageRecordApi; import com.xwad.os.network.api.FilesApi; import com.xwad.os.network.api.HomeworkApi; +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; @@ -345,6 +350,34 @@ public class NetInterfaceManager { .observeOn(AndroidSchedulers.mainThread()); } + public Observable> getAdminAppObservable(String app_package) { + return mRetrofit.create(AppApi.class) + .getAdminApp(BuildConfig.APPLICATION_ID, app_package) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + public Observable getPhoneCodeObservable(String mobile) { + return mRetrofit.create(LoginApi.class) + .getCode(mobile) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + public Observable getCodeLoginObservable(String mobile, String code) { + return mRetrofit.create(LoginApi.class) + .codeLogin(mobile, code, DeviceSNManager.getDeviceSN()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + public Observable getUserLoginObservable(String mobile, String password) { + return mRetrofit.create(LoginApi.class) + .userLogin(mobile, password, DeviceSNManager.getDeviceSN()) + .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 4513a08..70cf5eb 100644 --- a/app/src/main/java/com/xwad/os/network/UrlAddress.java +++ b/app/src/main/java/com/xwad/os/network/UrlAddress.java @@ -1,7 +1,22 @@ package com.xwad.os.network; public class UrlAddress { - public static final String ROOT_URL = "https://led.aolelearn.com/android/"; + public static final String ROOT_URL = "https://365api.uiuipad.com/android/"; + + + /*发送登录验证码*/ + public final static String LOGIN_GET_CODE = "login/get-code"; + /*验证码登录*/ + public final static String CODE_LOGIN = "login/code-login"; + /*账号密码登录*/ + public final static String USER_LOGIN = "login/user-login"; + + + /*获取管理员所有应用*/ + public final static String GET_ADMIN_APP = "getAdminApp"; + public final static String APP_FORCE_INSTALL = "app/force-install"; + + /*设备信息接口*/ public static final String SNINFO = "sn/getSnInfo"; diff --git a/app/src/main/java/com/xwad/os/network/api/AppApi.java b/app/src/main/java/com/xwad/os/network/api/AppApi.java new file mode 100644 index 0000000..38a6b9e --- /dev/null +++ b/app/src/main/java/com/xwad/os/network/api/AppApi.java @@ -0,0 +1,18 @@ +package com.xwad.os.network.api; + +import com.xwad.os.bean.AppInfo; +import com.xwad.os.bean.BaseResponse; +import com.xwad.os.network.UrlAddress; + +import io.reactivex.rxjava3.core.Observable; +import retrofit2.http.GET; +import retrofit2.http.Query; + +public interface AppApi { + @GET(UrlAddress.APP_FORCE_INSTALL) + Observable> getAdminApp( + @Query("desktop_app_package") String desktop_app_package, + @Query("app_package") String app_package + ); + +} 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 new file mode 100644 index 0000000..bfe5df8 --- /dev/null +++ b/app/src/main/java/com/xwad/os/network/api/LoginApi.java @@ -0,0 +1,34 @@ +package com.xwad.os.network.api; + +import com.xwad.os.bean.BaseResponse; +import com.xwad.os.network.UrlAddress; + +import io.reactivex.rxjava3.core.Observable; +import retrofit2.http.Field; +import retrofit2.http.FormUrlEncoded; +import retrofit2.http.GET; +import retrofit2.http.POST; +import retrofit2.http.Query; + +public interface LoginApi { + @GET(UrlAddress.LOGIN_GET_CODE) + Observable getCode( + @Query("mobile") String mobile + ); + + @FormUrlEncoded + @POST(UrlAddress.CODE_LOGIN) + Observable codeLogin( + @Field("mobile") String mobile, + @Field("code") String code, + @Field("sn") String sn + ); + + @FormUrlEncoded + @POST(UrlAddress.USER_LOGIN) + Observable userLogin( + @Query("mobile") String mobile, + @Query("password") String password, + @Field("sn") String sn + ); +} diff --git a/app/src/main/java/com/xwad/os/service/DownloadService.java b/app/src/main/java/com/xwad/os/service/DownloadService.java index 85b1089..2382dbf 100644 --- a/app/src/main/java/com/xwad/os/service/DownloadService.java +++ b/app/src/main/java/com/xwad/os/service/DownloadService.java @@ -48,6 +48,7 @@ public class DownloadService extends Service { mNotificationManagerCompat = NotificationManagerCompat.from(this); createNotificationChannel(); + createDownloadNotificationChannel(); } @Override @@ -63,9 +64,9 @@ public class DownloadService extends Service { private static final String CHANNEL_ID = "CHANNEL_ID"; private static final String CHANNEL_NAME = "系统通知"; - private static final String CHANNEL_DESCRIPTION = "关怀桌面通知"; + private static final String CHANNEL_DESCRIPTION = "学王365通知"; - private static final String CHANNEL_DOWNLOAD = "DOWNLOAD_CHANNEL"; + private static final String CHANNEL_DOWNLOAD_ID = "DOWNLOAD_CHANNEL"; private static final String CHANNEL_DOWNLOAD_NAME = "下载管理"; private static final String CHANNEL_DOWNLOAD_DESCRIPTION = "下载管理通知"; @@ -73,11 +74,8 @@ public class DownloadService extends Service { // Create the NotificationChannel, but only on API 26+ because // the NotificationChannel class is new and not in the support library if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - CharSequence name = CHANNEL_NAME; - String description = CHANNEL_DESCRIPTION; - int importance = NotificationManager.IMPORTANCE_DEFAULT; - NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance); - channel.setDescription(description); + NotificationChannel channel = new NotificationChannel(CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_DEFAULT); + channel.setDescription(CHANNEL_DESCRIPTION); // Register the channel with the system; you can't change the importance // or other notification behaviors after this NotificationManager notificationManager = getSystemService(NotificationManager.class); @@ -92,7 +90,7 @@ public class DownloadService extends Service { Intent intent = new Intent(this, DownloadService.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); - NotificationCompat.Builder builder = new NotificationCompat.Builder(this, "CHANNEL_ID") + NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID) .setSmallIcon(R.mipmap.ic_launcher) .setContentTitle("关怀系统正在运行") // .setContentText("测试内容") @@ -107,8 +105,21 @@ public class DownloadService extends Service { startForeground(NotificationID, builder.build()); } + private void createDownloadNotificationChannel() { + // Create the NotificationChannel, but only on API 26+ because + // the NotificationChannel class is new and not in the support library + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + NotificationChannel channel = new NotificationChannel(CHANNEL_DOWNLOAD_ID, CHANNEL_DOWNLOAD_NAME, NotificationManager.IMPORTANCE_DEFAULT); + channel.setDescription(CHANNEL_DOWNLOAD_DESCRIPTION); + // Register the channel with the system; you can't change the importance + // or other notification behaviors after this + NotificationManager notificationManager = getSystemService(NotificationManager.class); + notificationManager.createNotificationChannel(channel); + } + } + private void sendDownloadRunning(AriaDownloadInfo ariaDownloadInfo, int progress) { - NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_DOWNLOAD) + NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_DOWNLOAD_ID) .setSmallIcon(R.mipmap.ic_launcher) .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher)) .setContentTitle(ariaDownloadInfo.getAppName()) @@ -120,11 +131,12 @@ public class DownloadService extends Service { .setProgress(100, progress, false) .setPriority(NotificationCompat.PRIORITY_HIGH); // notificationId is a unique int for each notification that you must define - mNotificationManagerCompat.notify(ariaDownloadInfo.getAppId(), builder.build()); +// mNotificationManagerCompat.notify(ariaDownloadInfo.getAppId(), builder.build()); + startForeground(ariaDownloadInfo.getAppId(), builder.build()); } private void sendDownloadComplete(AriaDownloadInfo ariaDownloadInfo, String path) { - NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_DOWNLOAD) + NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_DOWNLOAD_ID) .setSmallIcon(R.mipmap.ic_launcher) .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher)) .setContentTitle(ariaDownloadInfo.getAppName()) @@ -163,7 +175,7 @@ public class DownloadService extends Service { } private void sendDownloadFail(AriaDownloadInfo ariaDownloadInfo) { - NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_DOWNLOAD) + NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_DOWNLOAD_ID) .setSmallIcon(R.mipmap.ic_launcher) .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher)) .setContentTitle(ariaDownloadInfo.getAppName()) diff --git a/app/src/main/java/com/xwad/os/utils/FileUtil.java b/app/src/main/java/com/xwad/os/utils/FileUtil.java index fefcdb5..82131be 100644 --- a/app/src/main/java/com/xwad/os/utils/FileUtil.java +++ b/app/src/main/java/com/xwad/os/utils/FileUtil.java @@ -14,6 +14,7 @@ import android.util.Log; import androidx.core.content.ContextCompat; import com.arialyy.aria.core.Aria; +import com.xwad.os.bean.AppInfo; import com.xwad.os.bean.AppUpdateInfo; import com.xwad.os.bean.AriaDownloadInfo; import com.xwad.os.bean.HomeworkBean; @@ -31,10 +32,10 @@ public class FileUtil { public static String getFileType(String url) { if (url.indexOf("/") == -1) { - return url.substring(url.indexOf("."), url.length()); + return url.substring(url.indexOf(".")); } else { String fileName = url.substring(url.lastIndexOf("/")); - return fileName.substring(fileName.indexOf("."), fileName.length()); + return fileName.substring(fileName.indexOf(".")); } } @@ -203,7 +204,7 @@ public class FileUtil { } MessageDigest digest = null; FileInputStream in = null; - byte buffer[] = new byte[1024]; + byte[] buffer = new byte[1024]; int len; try { digest = MessageDigest.getInstance("MD5"); @@ -231,6 +232,12 @@ public class FileUtil { // ariaDownload(context, url, ariaDownloadInfo); // } + public static void ariaDownload(Context context, String url, AppInfo appInfo) { + Log.e(TAG, "ariaDownload: " + appInfo); + AriaDownloadInfo ariaDownloadInfo = AriaDownloadInfo.toAriaDownloadInfo(appInfo); + ariaDownload(context, url, ariaDownloadInfo); + } + public static void ariaDownload(Context context, String url, AppUpdateInfo appUpdateInfo) { Log.e(TAG, "ariaDownload: " + appUpdateInfo); AriaDownloadInfo ariaDownloadInfo = AriaDownloadInfo.toAriaDownloadInfo(appUpdateInfo); 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 08e4e44..af6c643 100644 --- a/app/src/main/java/com/xwad/os/utils/OpenApkUtils.java +++ b/app/src/main/java/com/xwad/os/utils/OpenApkUtils.java @@ -1,6 +1,8 @@ package com.xwad.os.utils; import android.annotation.SuppressLint; +import android.app.Activity; +import android.app.Dialog; import android.content.ComponentName; import android.content.ContentResolver; import android.content.Context; @@ -10,15 +12,26 @@ import android.content.pm.PackageManager; import android.os.Build; import android.text.TextUtils; import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; +import android.view.WindowManager; +import android.widget.TextView; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; +import com.hjq.toast.Toaster; +import com.tencent.mmkv.MMKV; +import com.xwad.os.R; +import com.xwad.os.bean.AppInfo; +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.manager.RemoteManager; -import com.hjq.toast.Toaster; -import com.tencent.mmkv.MMKV; +import com.xwad.os.network.NetInterfaceManager; +import com.xwad.os.service.DownloadService; import java.lang.reflect.Type; import java.math.BigDecimal; @@ -27,6 +40,10 @@ import java.util.HashSet; import java.util.Set; import java.util.function.BiConsumer; +import io.reactivex.rxjava3.annotations.NonNull; +import io.reactivex.rxjava3.core.Observer; +import io.reactivex.rxjava3.disposables.Disposable; + public class OpenApkUtils { private static final String TAG = "OpenApkUtils"; @@ -636,7 +653,7 @@ public class OpenApkUtils { * * @param paramStr 参数字符串(格式:包名,类名,extra参数,第四项,第五项) */ - public void openJxwApp(String paramStr) { + public void openJxwApp(Activity context, String paramStr) { if (TextUtils.isEmpty(paramStr)) { Log.e(TAG, "context为空或参数字符串为空"); return; @@ -654,10 +671,15 @@ public class OpenApkUtils { String className = totalParts[1]; // 第二项:类名 String extraParamStr = totalParts.length > 2 ? totalParts[2] : ""; // 第三项:Intent Extra参数 String fourthParam = totalParts.length > 3 ? totalParts[3] : ""; // 第四项(自定义) - String fifthParam = totalParts.length > 4 ? totalParts[4] : ""; // 第五项(自定义) + String appName = totalParts.length > 4 ? totalParts[4] : ""; // 第五项(自定义) Log.d(TAG, "包名:" + packageName + "\n类名:" + className - + "\n第四项:" + fourthParam + "\n第五项:" + fifthParam); + + "\n第四项:" + fourthParam + "\n应用名:" + appName); + + if (!ApkUtils.isAvailable(mContext, packageName)) { + showDownloadDialog(context, packageName, appName); + return; + } // 2. 构建Intent并设置Component(包名+类名) Intent intent = new Intent(); @@ -689,7 +711,7 @@ public class OpenApkUtils { // 4. 启动Activity(处理异常) try { - mContext.startActivity(intent); + context.startActivity(intent); } catch (Exception e) { if (e instanceof android.content.ActivityNotFoundException) { Log.e(TAG, "未找到目标Activity:" + packageName + "/" + className); @@ -747,4 +769,77 @@ public class OpenApkUtils { break; } } + + public void showDownloadDialog(Activity context, String pkg, String appName) { + Dialog dialog = new Dialog(context, R.style.ActionSheet); + Window window = dialog.getWindow(); + View inflate = ((LayoutInflater) context.getSystemService("layout_inflater")).inflate(R.layout.download_dialog, (ViewGroup) null); + TextView textView = inflate.findViewById(R.id.download_cancel); + TextView textView2 = inflate.findViewById(R.id.tag_title); + if (!TextUtils.isEmpty(appName)) { + textView2.setText("未安装\"" + appName + "\"\n下载后可继续使用!"); + } + TextView textView3 = inflate.findViewById(R.id.download_ok); + textView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + dialog.dismiss(); + } + }); + textView3.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + getAppInfo(pkg); + Intent intent = new Intent(mContext, DownloadService.class); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + mContext.startForegroundService(intent); + } else { + mContext.startService(intent); + } + dialog.dismiss(); + } + }); + WindowManager.LayoutParams attributes = window.getAttributes(); + attributes.x = 0; + attributes.y = 0; + attributes.gravity = 17; + dialog.onWindowAttributesChanged(attributes); + dialog.setCanceledOnTouchOutside(true); + dialog.setContentView(inflate); + window.setDimAmount(0.6f); + dialog.show(); + window.setAttributes(attributes); + } + + public void getAppInfo(String pkg) { + NetInterfaceManager.getInstance().getAdminAppObservable(pkg) + .subscribe(new Observer>() { + @Override + public void onSubscribe(@NonNull Disposable d) { + Log.e("getAppInfo", "onSubscribe: "); + } + + @Override + public void onNext(@NonNull BaseResponse baseResponse) { + Log.e("getAppInfo", "onNext: " + baseResponse); + if (baseResponse.code == 200) { + AppInfo appInfo = baseResponse.data; + FileUtil.ariaDownload(mContext, appInfo.getApp_url(), appInfo); + } else { + Toaster.showLong("没有找到应用信息,请联系客服"); + } + } + + @Override + public void onError(@NonNull Throwable e) { + Log.e("getAppInfo", "onError: " + e.getMessage()); + } + + @Override + public void onComplete() { + Log.e("getAppInfo", "onComplete: "); + } + }); + } + } diff --git a/app/src/main/java/com/xwad/os/view/jxw/widget/AppsDialog.java b/app/src/main/java/com/xwad/os/view/jxw/widget/AppsDialog.java index a26dfb9..4807e50 100644 --- a/app/src/main/java/com/xwad/os/view/jxw/widget/AppsDialog.java +++ b/app/src/main/java/com/xwad/os/view/jxw/widget/AppsDialog.java @@ -24,6 +24,7 @@ import com.xwad.os.R; import com.xwad.os.base.BaseApplication; import com.xwad.os.bean.jxw.ItemsBean; import com.xwad.os.jxw.AssertUtils; +import com.xwad.os.jxw.SPUtils; import com.xwad.os.utils.OpenApkUtils; import java.io.BufferedReader; @@ -37,14 +38,17 @@ import java.util.List; public class AppsDialog extends Dialog { private String FILE_NAME; + private Activity activity; - AppAdapter appAdapter; - List appList; - int count; + private AppAdapter appAdapter; + + private List appList; + private int count; private Callback mCallback; - RecyclerView rv_apps; - TextView tv_title; - String type; + private String type; + + private RecyclerView rv_apps; + private TextView tv_title; public interface Callback { void onCallback(); @@ -52,7 +56,7 @@ public class AppsDialog extends Dialog { public AppsDialog(Context context, String str) { super(context, R.style.ActionSheetDialogStyle); - appList = new ArrayList(); + appList = new ArrayList<>(); FILE_NAME = "app_list_"; activity = (Activity) context; type = str; @@ -80,32 +84,40 @@ public class AppsDialog extends Dialog { rv_apps = findViewById(R.id.rv_apps); tv_title = findViewById(R.id.tv_title); appAdapter = new AppAdapter(getApps()); - if (type.equals("yw")) { - tv_title.setText("语文学习应用"); - gridLayoutManager = new GridLayoutManager(activity, 5); - count = 2; - } else if (type.equals("sx")) { - tv_title.setText("数学学习应用"); - gridLayoutManager = new GridLayoutManager(activity, 5); - count = 2; - } else if (type.equals("yy")) { - tv_title.setText("英语学习应用"); - gridLayoutManager = new GridLayoutManager(activity, 5); - count = 2; - } else if (type.equals("wl")) { - tv_title.setText("物理学习应用"); - gridLayoutManager = new GridLayoutManager(activity, 4); - count = 1; - } else if (type.equals("hx")) { - tv_title.setText("化学学习应用"); - gridLayoutManager = new GridLayoutManager(activity, 5); - count = 1; - } else if (type.equals("sw")) { - tv_title.setText("生物学习应用"); - gridLayoutManager = new GridLayoutManager(activity, 3); - count = 1; - } else { - gridLayoutManager = null; + switch (type) { + case "yw": + tv_title.setText("语文学习应用"); + gridLayoutManager = new GridLayoutManager(activity, 5); + count = 2; + break; + case "sx": + tv_title.setText("数学学习应用"); + gridLayoutManager = new GridLayoutManager(activity, 5); + count = 2; + break; + case "yy": + tv_title.setText("英语学习应用"); + gridLayoutManager = new GridLayoutManager(activity, 5); + count = 2; + break; + case "wl": + tv_title.setText("物理学习应用"); + gridLayoutManager = new GridLayoutManager(activity, 4); + count = 1; + break; + case "hx": + tv_title.setText("化学学习应用"); + gridLayoutManager = new GridLayoutManager(activity, 5); + count = 1; + break; + case "sw": + tv_title.setText("生物学习应用"); + gridLayoutManager = new GridLayoutManager(activity, 3); + count = 1; + break; + default: + gridLayoutManager = null; + break; } rv_apps.setLayoutManager(gridLayoutManager); rv_apps.setAdapter(appAdapter); @@ -146,7 +158,7 @@ public class AppsDialog extends Dialog { } private List getApps() { - String grade = "一年级"; + String grade = SPUtils.getGrade(); Gson gson = new Gson(); String jsonString = AssertUtils.getFromAssets(BaseApplication.getInstance(), "script/" + type + "_apps.json"); Type type = new TypeToken>() { @@ -176,7 +188,7 @@ public class AppsDialog extends Dialog { } // MyApp.getInstance().mBottomBtnOnClickListener.setContext(activity); // MyApp.getInstance().mBottomBtnOnClickListener.onClick(viewTag); - OpenApkUtils.getInstance().openJxwApp(viewTag); + OpenApkUtils.getInstance().openJxwApp(activity, viewTag); } } diff --git a/app/src/main/java/com/xwad/os/view/jxw/widget/DailyTasksView.java b/app/src/main/java/com/xwad/os/view/jxw/widget/DailyTasksView.java index 6fa2354..1e1d18d 100644 --- a/app/src/main/java/com/xwad/os/view/jxw/widget/DailyTasksView.java +++ b/app/src/main/java/com/xwad/os/view/jxw/widget/DailyTasksView.java @@ -15,7 +15,7 @@ import androidx.recyclerview.widget.RecyclerView; import com.xwad.os.R; import com.xwad.os.bean.jxw.TaskBean; import com.xwad.os.jxw.ToastUtil; -import com.xwad.os.jxw.Util; +import com.xwad.os.jxw.util.Util; import java.util.ArrayList; import java.util.List; diff --git a/app/src/main/java/com/xwad/os/view/jxw/widget/TreeView.java b/app/src/main/java/com/xwad/os/view/jxw/widget/TreeView.java index 32fd2b8..b423869 100644 --- a/app/src/main/java/com/xwad/os/view/jxw/widget/TreeView.java +++ b/app/src/main/java/com/xwad/os/view/jxw/widget/TreeView.java @@ -30,7 +30,7 @@ import com.xwad.os.jxw.Constant; import com.xwad.os.jxw.JiaoShuiDialog; import com.xwad.os.jxw.SPUtils; import com.xwad.os.jxw.StudyRecordAPKInfo; -import com.xwad.os.jxw.Util; +import com.xwad.os.jxw.util.Util; import org.libpag.PAGView; diff --git a/app/src/main/res/drawable-nodpi/icon_ai_aixxgj.png b/app/src/main/res/drawable-nodpi/icon_ai_aixxgj.png index ee0586b..dade2fb 100644 Binary files a/app/src/main/res/drawable-nodpi/icon_ai_aixxgj.png and b/app/src/main/res/drawable-nodpi/icon_ai_aixxgj.png differ diff --git a/app/src/main/res/drawable-nodpi/icon_ai_aiznxxt.png b/app/src/main/res/drawable-nodpi/icon_ai_aiznxxt.png index f919f4b..a19f822 100644 Binary files a/app/src/main/res/drawable-nodpi/icon_ai_aiznxxt.png and b/app/src/main/res/drawable-nodpi/icon_ai_aiznxxt.png differ diff --git a/app/src/main/res/drawable-xxhdpi/card_robot_background.png b/app/src/main/res/drawable-xxhdpi/card_robot_background.png new file mode 100644 index 0000000..46a9c83 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/card_robot_background.png differ diff --git a/app/src/main/res/drawable-xxhdpi/icon_mine_robot.png b/app/src/main/res/drawable-xxhdpi/icon_mine_robot.png index f546702..6c96360 100644 Binary files a/app/src/main/res/drawable-xxhdpi/icon_mine_robot.png and b/app/src/main/res/drawable-xxhdpi/icon_mine_robot.png differ diff --git a/app/src/main/res/drawable/bg_shape_tbdd_book_bg.xml b/app/src/main/res/drawable/bg_shape_tbdd_book_bg.xml index d0c2473..0295925 100644 --- a/app/src/main/res/drawable/bg_shape_tbdd_book_bg.xml +++ b/app/src/main/res/drawable/bg_shape_tbdd_book_bg.xml @@ -1,5 +1,5 @@ - + \ No newline at end of file diff --git a/app/src/main/res/drawable/download_ok_bg.xml b/app/src/main/res/drawable/download_ok_bg.xml new file mode 100644 index 0000000..42e6b72 --- /dev/null +++ b/app/src/main/res/drawable/download_ok_bg.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_radio_selected.xml b/app/src/main/res/drawable/ic_radio_selected.xml index de4c1de..0a5a8e7 100644 --- a/app/src/main/res/drawable/ic_radio_selected.xml +++ b/app/src/main/res/drawable/ic_radio_selected.xml @@ -1,6 +1,6 @@ @@ -145,8 +146,10 @@ diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index 561d702..4588653 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -18,7 +18,7 @@ + app:layout_constraintTop_toTopOf="parent"> + app:layout_constraintTop_toTopOf="parent"> @@ -87,9 +87,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" - android:maxLines="1" - android:singleLine="true" - android:text="本机已激活成功,系统终身免费,谢谢您的使用。" + android:text="@string/license_verification_successful" android:textColor="@color/black" android:textSize="12sp" app:layout_constraintBottom_toBottomOf="parent" diff --git a/app/src/main/res/layout/download_dialog.xml b/app/src/main/res/layout/download_dialog.xml new file mode 100644 index 0000000..6dd0d94 --- /dev/null +++ b/app/src/main/res/layout/download_dialog.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fg_content_example.xml b/app/src/main/res/layout/fg_content_example.xml new file mode 100644 index 0000000..38dcaa5 --- /dev/null +++ b/app/src/main/res/layout/fg_content_example.xml @@ -0,0 +1,538 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fg_content_example_after.xml b/app/src/main/res/layout/fg_content_example_after.xml new file mode 100644 index 0000000..73dc32a --- /dev/null +++ b/app/src/main/res/layout/fg_content_example_after.xml @@ -0,0 +1,538 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fg_content_sztz.xml b/app/src/main/res/layout/fg_content_sztz.xml new file mode 100644 index 0000000..cdf466f --- /dev/null +++ b/app/src/main/res/layout/fg_content_sztz.xml @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_complex.xml b/app/src/main/res/layout/fragment_complex.xml index 362c130..cca3c60 100644 --- a/app/src/main/res/layout/fragment_complex.xml +++ b/app/src/main/res/layout/fragment_complex.xml @@ -47,6 +47,10 @@ - + + + + + + + + + @@ -557,6 +565,9 @@ + + + \ 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 0bc7d81..bfdffd5 100644 --- a/app/src/main/res/layout/fragment_mine.xml +++ b/app/src/main/res/layout/fragment_mine.xml @@ -29,7 +29,7 @@ @@ -113,7 +113,7 @@ @@ -237,7 +237,6 @@ - + app:layout_constraintTop_toBottomOf="@+id/imageView6"> - + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintVertical_bias="1"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png index b5dad2a..c7ac20a 100644 Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher.png and b/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png index b5dad2a..c7ac20a 100644 Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher.png and b/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png index b5dad2a..c7ac20a 100644 Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png index b5dad2a..c7ac20a 100644 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png index b5dad2a..c7ac20a 100644 Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index a9f75fc..24b58a6 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -3290,4 +3290,7 @@ 997px 998px 999px + 40dp + 52dp + 10sp \ 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 5a8f089..46a5b05 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,5 +1,5 @@ - 学王365旗舰 + 学王365 隐私协议 服务协议和隐私政策 \t\t\t\t请你务必审慎阅读、充分理解“服务协议”和“隐私政策”各条款,包括但不限于:为了向你提供即时通讯,内容分享等服务, @@ -21,4 +21,6 @@ 如果您已经订购实体包装版,您可以在包装盒内找到“许可证”贴纸,\n请刮开涂层,将密钥输入在下面的对话框内 + 许可证验证成功,本账户已可长期使用,\n点击开启学习之旅! + diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index c35590c..ab89fa7 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -109,22 +109,4 @@ @drawable/custom_radio_selector - - - - - - diff --git a/app/src/main/res/values/styles_jxw.xml b/app/src/main/res/values/styles_jxw.xml new file mode 100644 index 0000000..da341c4 --- /dev/null +++ b/app/src/main/res/values/styles_jxw.xml @@ -0,0 +1,30 @@ + + + + + + + + + + \ No newline at end of file