diff --git a/README.md b/README.md index 2e9ff83bfb85fcbf47058f33dfab895839e6c738..3223743a8fc16bd51b24c4193d01cc6c838f089a 100644 --- a/README.md +++ b/README.md @@ -10,15 +10,11 @@ ## APP目前已经上架: 酷安(最新):https://www.coolapk.com/apk/279989 -小米应用商店(不再提供更新支持):http://app.xiaomi.com/detail/1288502 - -vivo应用商店 - ## 已经实现的功能: - 课程表导入 - * 校园网导入(智慧校园 + 新版教务系统) - * 校外导入(智慧校园 + 新版教务系统) + * 校园网导入 + * 校外导入 - 日课表显示 * 显示两日信息 * 表示正在上课的课程 @@ -39,11 +35,7 @@ vivo应用商店 * 已选课程按学期查询 * 四六级成绩 * 计划课程查询 - * 创新积分查询 * 免登录打开教务系统 -- 评价 - * 评价教师 - * 评价教材 - 学分绩计算 - 自定义课程 * 快捷添加课程信息 @@ -64,7 +56,6 @@ vivo应用商店 * 常用链接 ## 计划功能: -- 代码优化 - 成绩查询 * 出成绩后发出推送 diff --git a/app/build.gradle b/app/build.gradle index d596257a6117e5086dda3e0bfc725c3554f7afdc..5c96bfa9cda23191562cd00774612f74fb462e74 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -7,8 +7,8 @@ android { applicationId "top.yvyan.guettable" minSdkVersion 21 targetSdkVersion 30 - versionCode 52 //记得补丁版本号归零(patch_version) - versionName "5.0.0" + versionCode 54 //记得补丁版本号归零(patch_version) + versionName "5.2.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" android.buildFeatures.dataBinding = true @@ -71,4 +71,13 @@ dependencies { implementation 'com.github.xuexiangjys:XUpdate:2.1.3' implementation 'com.zhy:okhttputils:2.6.2' implementation 'com.github.xuexiangjys.XUtil:xutil-core:2.0.0' + //键值对存储 + implementation 'com.tencent:mmkv:1.2.13' + //富文本 + implementation 'com.zzhoujay.richtext:richtext:3.0.8' + //工具类 + implementation 'com.github.xuexiangjys.XUtil:xutil-core:2.0.0' + implementation 'com.github.xuexiangjys.XUtil:xutil-sub:2.0.0' + + implementation 'com.zhy:okhttputils:2.6.2' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3ca2ab0df58778bcbdbe7ae759e3f404dff27fff..fe5cc664e23b26b09294a27a984a6e3315bfee81 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -46,7 +46,6 @@ - =300 && resp_code <400)) { - return new HttpConnectionAndCode(cnt, -7, ""); + if (redirect != null && !redirect && (resp_code >= 300 && resp_code < 400)) { + // 我们这里不考虑清除cookie的情况 (无视所有cookie参数) + StringBuilder cookie_builder = new StringBuilder(); + List cookies = cnt.getHeaderFields().get("Set-Cookie"); + if (cookies != null) { + for (String cookie_resp : cookies) { + cookie_builder.append(cookie_resp.substring(0, cookie_resp.indexOf(";") + 1) + " "); + } + } + return new HttpConnectionAndCode(cnt, -7, "", cookie_builder.substring(0, cookie_builder.length() - 2), resp_code); } List encodings = cnt.getHeaderFields().get("content-encoding"); - if(resp_code < 400) { + if (resp_code < 400) { if (encodings != null && encodings.get(0).equals("gzip")) { in = new InputStreamReader(new GZIPInputStream(cnt.getInputStream())); } else { diff --git a/app/src/main/java/top/yvyan/guettable/Http/GetBitmap.java b/app/src/main/java/top/yvyan/guettable/Http/GetBitmap.java deleted file mode 100644 index dd50eb40137ff74f6337c025a238440fec704cfa..0000000000000000000000000000000000000000 --- a/app/src/main/java/top/yvyan/guettable/Http/GetBitmap.java +++ /dev/null @@ -1,118 +0,0 @@ -package top.yvyan.guettable.Http; - -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.text.TextUtils; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -import java.net.CookieManager; -import java.net.HttpCookie; -import java.net.HttpURLConnection; -import java.net.URL; -import java.util.LinkedList; -import java.util.List; - -import javax.net.ssl.HttpsURLConnection; -import javax.net.ssl.SSLContext; -import javax.net.ssl.SSLSocketFactory; - -import top.yvyan.guettable.util.SSLUtils; - - -public class GetBitmap { - /** - * @return - * - 0 GET success - * - -1 cannot open url - * - -5 cannot get response - * - -6 response check fail - * - -7 302 - */ - public static HttpConnectionAndCode get(@NonNull final String u, - @Nullable final String[] parms, - @NonNull final String user_agent, - @NonNull final String referer, - @Nullable final String cookie, - @Nullable final String cookie_delimiter){ - URL url; - HttpURLConnection cnt; - String response; - Bitmap bmp; - int resp_code; - try { - StringBuilder u_bulider = new StringBuilder(); - u_bulider.append(u); - if (parms != null && parms.length > 0) { - u_bulider.append("?").append(TextUtils.join("&", parms)); - } - url = new URL(u_bulider.toString()); - cnt = (HttpURLConnection) url.openConnection(); - cnt.setDoOutput(true); - cnt.setDoInput(true); - cnt.setRequestProperty("User-Agent", user_agent); - cnt.setRequestProperty("Referer", referer); - if (cookie != null){ - cnt.setRequestProperty("Cookie", cookie); - } - cnt.setRequestMethod("GET"); - cnt.setInstanceFollowRedirects(false); - cnt.setReadTimeout(4000); - cnt.setConnectTimeout(2000); - if (cnt instanceof HttpsURLConnection) { // 判断是否为https请求 - SSLContext sslContext = SSLUtils.getSSLContextWithoutCer(); - SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory(); - ((HttpsURLConnection) cnt).setSSLSocketFactory(sslSocketFactory); - ((HttpsURLConnection) cnt).setHostnameVerifier(SSLUtils.hostnameVerifier); - } - cnt.connect(); - } catch (Exception e) { - e.printStackTrace(); - return new HttpConnectionAndCode(-1); - } - try { - resp_code = cnt.getResponseCode(); - if (resp_code == 302){ - return new HttpConnectionAndCode(cnt, -7, ""); - } - response = ""; - bmp = BitmapFactory.decodeStream(cnt.getInputStream()); - } catch (Exception e) { - e.printStackTrace(); - return new HttpConnectionAndCode(-5); - } - - //get cookie from server - String set_cookie = null; - if (cookie_delimiter != null) { - CookieManager cookieman = new CookieManager(); - StringBuilder cookie_builder = new StringBuilder(); - //getHeaderFields() returns the header fields of response - List cookies = cnt.getHeaderFields().get("Set-Cookie"); - if (cookies != null) { - for (String cookie_resp : cookies) { - cookieman.getCookieStore().add(null, HttpCookie.parse(cookie_resp).get(0)); - } - } - if (cookieman.getCookieStore().getCookies().size() > 0) { - List cookieList = cookieman.getCookieStore().getCookies(); - List cookieStringList = new LinkedList<>(); - for (HttpCookie httpCookie : cookieList){ - String str = httpCookie.getName() + "=" + httpCookie.getValue(); - cookieStringList.add(str); - } - String cookie_join = TextUtils.join(cookie_delimiter, cookieStringList); - cookie_builder.append(cookie_join); - } - set_cookie = cookie_builder.toString(); - } - - //do not disconnect, keep alive - //if cookie_delimiter != null but no server cookie, set_cookie = "" - //if no response, response = "" - HttpConnectionAndCode res = new HttpConnectionAndCode(cnt, 0, response, set_cookie, resp_code); - res.obj = bmp; - return res; - } -} diff --git a/app/src/main/java/top/yvyan/guettable/Http/Post.java b/app/src/main/java/top/yvyan/guettable/Http/Post.java index b3d8c85e397c6fe4885a317b9c028ce480b80412..a1db7744a20e4b7aba2272c82df76a843a57c7c3 100644 --- a/app/src/main/java/top/yvyan/guettable/Http/Post.java +++ b/app/src/main/java/top/yvyan/guettable/Http/Post.java @@ -123,7 +123,15 @@ public class Post { try { resp_code = cnt.getResponseCode(); if (redirect != null && !redirect && (resp_code >=300 && resp_code <400)) { - return new HttpConnectionAndCode(cnt, -7, ""); + // 我们这里不考虑清除cookie的情况 (无视所有cookie参数) + StringBuilder cookie_builder = new StringBuilder(); + List cookies = cnt.getHeaderFields().get("Set-Cookie"); + if (cookies != null) { + for (String cookie_resp : cookies) { + cookie_builder.append(cookie_resp.substring(0, cookie_resp.indexOf(";") + 1) + " "); + } + } + return new HttpConnectionAndCode(cnt, -7, "", cookie_builder.substring(0, cookie_builder.length() - 2), resp_code); } List encodings = cnt.getHeaderFields().get("content-encoding"); if(resp_code < 400) { diff --git a/app/src/main/java/top/yvyan/guettable/Http/entity/ApiResult.java b/app/src/main/java/top/yvyan/guettable/Http/entity/ApiResult.java new file mode 100644 index 0000000000000000000000000000000000000000..bd8b2e9a54db9139cd34d6a833bfe81df724d4c5 --- /dev/null +++ b/app/src/main/java/top/yvyan/guettable/Http/entity/ApiResult.java @@ -0,0 +1,91 @@ +/* + * Copyright (C) 2018 xuexiangjys(xuexiangjys@163.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package top.yvyan.guettable.Http.entity; + +import androidx.annotation.Keep; + +import com.google.gson.annotations.SerializedName; + +/** + * 提供的默认的标注返回api + * + * @author xuexiang + * @since 2018/5/22 下午4:22 + */ +@Keep +public class ApiResult { + public final static String CODE = "Code"; + public final static String MSG = "Msg"; + public final static String DATA = "Data"; + + @SerializedName(value = CODE, alternate = {"code"}) + private int Code; + @SerializedName(value = MSG, alternate = {"msg"}) + private String Msg; + @SerializedName(value = DATA, alternate = {"data"}) + private T Data; + + public int getCode() { + return Code; + } + + public ApiResult setCode(int code) { + Code = code; + return this; + } + + public String getMsg() { + return Msg; + } + + public ApiResult setMsg(String msg) { + Msg = msg; + return this; + } + + public ApiResult setData(T data) { + Data = data; + return this; + } + + /** + * 获取请求响应的数据,自定义api的时候需要重写【很关键】 + * + * @return + */ + public T getData() { + return Data; + } + + /** + * 是否请求成功,自定义api的时候需要重写【很关键】 + * + * @return + */ + public boolean isSuccess() { + return getCode() == 0; + } + + @Override + public String toString() { + return "ApiResult{" + + "Code='" + Code + '\'' + + ", Msg='" + Msg + '\'' + + ", Data=" + Data + + '}'; + } +} diff --git a/app/src/main/java/top/yvyan/guettable/MyApp.java b/app/src/main/java/top/yvyan/guettable/MyApp.java index 0c1687c1c5886d71193ec77d590ff1b5a441f894..05ec3a6b2e411649f60e10e9bb851603b48af5fc 100644 --- a/app/src/main/java/top/yvyan/guettable/MyApp.java +++ b/app/src/main/java/top/yvyan/guettable/MyApp.java @@ -2,6 +2,7 @@ package top.yvyan.guettable; import android.app.Application; +import com.tencent.mmkv.MMKV; import com.xuexiang.xui.XUI; public class MyApp extends Application { @@ -21,6 +22,8 @@ public class MyApp extends Application { private void init() { XUI.init(this); //初始化UI框架 XUI.debug(true); //开启UI框架调试日志 + + MMKV.initialize(this); //MMKV初始化 } } diff --git a/app/src/main/java/top/yvyan/guettable/activity/AboutActivity.java b/app/src/main/java/top/yvyan/guettable/activity/AboutActivity.java index 8ea3912a42f0096650c9dfb3972edbf7ab88064c..e10161770bc96e66bbb5915f99e4fec9f26849a8 100644 --- a/app/src/main/java/top/yvyan/guettable/activity/AboutActivity.java +++ b/app/src/main/java/top/yvyan/guettable/activity/AboutActivity.java @@ -8,6 +8,7 @@ import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.view.View; +import android.widget.LinearLayout; import android.widget.TextView; import androidx.appcompat.app.AppCompatActivity; @@ -32,12 +33,17 @@ public class AboutActivity extends AppCompatActivity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); SingleSettingData singleSettingData = SingleSettingData.newInstance(this); + SettingData Settings=SettingData.newInstance(getContext()); BackgroundUtil.setPageTheme(this, singleSettingData.getThemeId()); setContentView(R.layout.activity_about); BackgroundUtil.setFullAlphaStatus(this); TextView title = findViewById(R.id.title); title.setText(getString(R.string.person_about)); TextView profileVersion = findViewById(R.id.about_version); + LinearLayout debug_ClearMFACookie= findViewById(R.id.clear_mfa_cookie); + debug_ClearMFACookie.setVisibility(Settings.isDevelopMode() ? LinearLayout.VISIBLE : LinearLayout.GONE); + View debug_ClearMFACookie_spliter= findViewById(R.id.clear_mfa_cookie_spliter); + debug_ClearMFACookie_spliter.setVisibility(Settings.isDevelopMode() ? View.VISIBLE : View.GONE); profileVersion.setText(AppUtil.getAppVersionName(getContext())); } @@ -78,6 +84,13 @@ public class AboutActivity extends AppCompatActivity { helpTest(); } + public void clearMFACookie(View view) { + TokenData tokenData = TokenData.newInstance(getContext()); + tokenData.setMFACookie(null); + tokenData.setBkjwCookie(null); + ToastUtil.showToast(getContext(),"清除成功"); + } + /** * 协助测试 */ diff --git a/app/src/main/java/top/yvyan/guettable/activity/AddCourseActivity.java b/app/src/main/java/top/yvyan/guettable/activity/AddCourseActivity.java index 84732a3bc94f42571e4eb844ace80d18897a5e62..c2d58e4c83564a74075f8f081c83dbc1bc7fdbc6 100644 --- a/app/src/main/java/top/yvyan/guettable/activity/AddCourseActivity.java +++ b/app/src/main/java/top/yvyan/guettable/activity/AddCourseActivity.java @@ -183,8 +183,7 @@ public class AddCourseActivity extends AppCompatActivity { if (courseName.isEmpty()) { ToastUtil.showToast(getApplicationContext(), "课程名称不能为空!"); } else { - ScheduleData scheduleData = ScheduleData.newInstance(getApplicationContext()); - List courseBeans = scheduleData.getUserCourseBeans(); + List courseBeans = ScheduleData.getUserCourseBeans(); CourseBean courseBean = new CourseBean(); courseBean.userAdd( (courseNumberEditText.getText().toString().isEmpty() ? null : courseNumberEditText.getText().toString()), @@ -196,7 +195,7 @@ public class AddCourseActivity extends AppCompatActivity { (courseStartSeekBar.getProgress() == 0 ? 7 : courseStartSeekBar.getProgress()), (courseTeacherEditText.getText().toString().isEmpty() ? null : courseTeacherEditText.getText().toString()), (courseCommEditText.getText().toString().isEmpty() ? null : courseCommEditText.getText().toString()), - scheduleData.getUserCourseNo() + ScheduleData.getUserCourseNo() ); try { courseBeans.add(courseBean); @@ -204,7 +203,7 @@ public class AddCourseActivity extends AppCompatActivity { e.printStackTrace(); } - scheduleData.setUserCourseBeans(courseBeans); + ScheduleData.setUserCourseBeans(courseBeans); WidgetUtil.notifyWidgetUpdate(this); ToastUtil.showToast(getApplicationContext(), "添加成功!"); diff --git a/app/src/main/java/top/yvyan/guettable/activity/DetailActivity.java b/app/src/main/java/top/yvyan/guettable/activity/DetailActivity.java index b1a482e91b6bde268b43f8918b8fa66b96cd4b76..b1bbcb38f72597ba1c927383139a08bab883c7c8 100644 --- a/app/src/main/java/top/yvyan/guettable/activity/DetailActivity.java +++ b/app/src/main/java/top/yvyan/guettable/activity/DetailActivity.java @@ -44,7 +44,7 @@ public class DetailActivity extends AppCompatActivity { SingleSettingData singleSettingData = SingleSettingData.newInstance(getApplicationContext()); BackgroundUtil.setPageTheme(this, singleSettingData.getThemeId()); setContentView(R.layout.activity_detail); - schedules = DetailClassData.newInstance().getCourseBeans(); + schedules = DetailClassData.getCourseBeans(); //透明状态栏 Window window = this.getWindow(); window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); diff --git a/app/src/main/java/top/yvyan/guettable/activity/LoginActivity.java b/app/src/main/java/top/yvyan/guettable/activity/LoginActivity.java index e1239b41e8f2df3c566c7ab0428dfaeae1533047..90ca1894f71d7a85a0c657c8530c92f918fb74de 100644 --- a/app/src/main/java/top/yvyan/guettable/activity/LoginActivity.java +++ b/app/src/main/java/top/yvyan/guettable/activity/LoginActivity.java @@ -35,7 +35,7 @@ import top.yvyan.guettable.R; import top.yvyan.guettable.bean.TermBean; import top.yvyan.guettable.data.AccountData; import top.yvyan.guettable.data.GeneralData; -import top.yvyan.guettable.data.MoreDate; +import top.yvyan.guettable.data.MoreData; import top.yvyan.guettable.data.TokenData; import top.yvyan.guettable.service.fetch.StaticService; import top.yvyan.guettable.util.AppUtil; @@ -51,8 +51,8 @@ public class LoginActivity extends Activity implements View.OnClickListener { private EditText etAccount; private CheckBox cbRememberPwd; private SuperButton button; - private EditText etPwd2; - private ImageView ivPwdSwitch2; + private EditText etPwd; + private ImageView ivPwdSwitch; private View progressBar; private AccountData accountData; @@ -64,21 +64,21 @@ public class LoginActivity extends Activity implements View.OnClickListener { accountData = AccountData.newInstance(getContext()); - ivPwdSwitch2 = findViewById(R.id.iv_pwd_switch_2); + ivPwdSwitch = findViewById(R.id.iv_pwd_switch); button = findViewById(R.id.login); button.setOnClickListener(this); - etPwd2 = findViewById(R.id.et_pwd2); + etPwd = findViewById(R.id.et_pwd); etAccount = findViewById(R.id.et_account); cbRememberPwd = findViewById(R.id.cb_remember_pwd); cbRememberPwd.setChecked(true); - ivPwdSwitch2.setOnClickListener(showPwdClickListener()); + ivPwdSwitch.setOnClickListener(showPwdClickListener()); progressBar = findViewById(R.id.progressBar2); TextView profileVersion = findViewById(R.id.tv_profile_version); profileVersion.setText(AppUtil.getAppVersionName(Objects.requireNonNull(getContext()))); //获取账号密码 if (accountData.getIsSave()) { etAccount.setText(accountData.getUsername()); - etPwd2.setText(accountData.getVPNPwd()); + etPwd.setText(accountData.getPwd()); } } @@ -93,12 +93,12 @@ public class LoginActivity extends Activity implements View.OnClickListener { bPwdSwitch = !bPwdSwitch; bPwdSwitch2 = !bPwdSwitch2; if (bPwdSwitch) { - ivPwdSwitch2.setImageResource(R.drawable.ic_baseline_visibility_24); - etPwd2.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD); + ivPwdSwitch.setImageResource(R.drawable.ic_baseline_visibility_24); + etPwd.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD); } else { - ivPwdSwitch2.setImageResource(R.drawable.ic_baseline_visibility_off_24); - etPwd2.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD | InputType.TYPE_CLASS_TEXT); - etPwd2.setTypeface(Typeface.DEFAULT); + ivPwdSwitch.setImageResource(R.drawable.ic_baseline_visibility_off_24); + etPwd.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD | InputType.TYPE_CLASS_TEXT); + etPwd.setTypeface(Typeface.DEFAULT); } }; } @@ -112,8 +112,8 @@ public class LoginActivity extends Activity implements View.OnClickListener { public void onClick(View view) { setUnClick(); String account = etAccount.getText().toString(); - String pwd2 = etPwd2.getText().toString(); - new Thread(() -> testCAS(account, pwd2)).start(); + String pwd = etPwd.getText().toString(); + new Thread(() -> testCAS(account, pwd)).start(); } @Override @@ -127,17 +127,17 @@ public class LoginActivity extends Activity implements View.OnClickListener { } /** - * 验证智慧校园密码 OTP Version + * 验证智慧校园密码 SMSCode Version */ - private void testCASWithOTP(String OTP, String CASCookie, TokenData tokenData) { + private void testCASWithSMSCode(String SMSCode, String CASCookie, TokenData tokenData) { String account = etAccount.getText().toString(); - String pwd2 = etPwd2.getText().toString(); + String pwd = etPwd.getText().toString(); new Thread(() -> { runOnUiThread(() -> button.setText("正在认证-手机验证码")); - String MultiFactorAuth = StaticService.VerifyPhoneOTP(this, OTP, CASCookie); + String MultiFactorAuth = StaticService.reAuth_SMSCode(this, SMSCode, CASCookie); if (MultiFactorAuth.contains("ERROR")) { if (MultiFactorAuth.equals("ERROR1")) { - showErrorToast(-4); + showErrorToast(-3); } else if (MultiFactorAuth.equals("ERROR2")) { showErrorToast(-2); } else { @@ -146,7 +146,7 @@ public class LoginActivity extends Activity implements View.OnClickListener { } else { tokenData.setMFACookie(MultiFactorAuth); tokenData.setBkjwCookie(null); - accountData.setUser(account, null, pwd2, cbRememberPwd.isChecked()); + accountData.setUser(account, pwd, cbRememberPwd.isChecked()); getInfo(); } }).start(); @@ -162,16 +162,35 @@ public class LoginActivity extends Activity implements View.OnClickListener { new Thread(() -> { TokenData tokenData = TokenData.newInstance(this); runOnUiThread(() -> button.setText("正在认证")); - String CasCookie = StaticService.SSOLogin(this, account, password, accountData.getVPNPwd() == password ? tokenData.getTGTToken() : null, tokenData.getMFACookie()); + String CasCookie = StaticService.SSOLogin(this, account, password, accountData.getPwd().equals(password) ? tokenData.getTGTToken() : null, tokenData.getMFACookie()); if (CasCookie.contains("TGT-")) { if (CasCookie.contains("ERROR5")) { tokenData.setTGTToken(CasCookie.substring(CasCookie.indexOf(";") + 1)); tokenData.setBkjwCookie(null); - bypass2FA(account, password, CasCookie.substring(CasCookie.indexOf(";") + 1), tokenData); + String phoneNumber = StaticService.reAuth_sendSMSCode(this, account,CasCookie.substring(CasCookie.indexOf(";")+1)); + if (!phoneNumber.contains("ERROR")) { + runOnUiThread(() -> { + button.setText("正在二步验证"); + showSMSCodeDialog(phoneNumber,CasCookie.substring(CasCookie.indexOf(";")+1),tokenData); + }); + } else { + if (phoneNumber.equals("ERROR1")) { + showErrorToast(-4); + } else if (phoneNumber.equals("ERROR2")) { + showErrorToast(-2); + } else if(phoneNumber.contains("ERROR3")) { + runOnUiThread(() -> { + setEnClick(); + ToastUtil.showToast(this, getResources().getString(R.string.login_fail_SMSCodeSend)+phoneNumber.substring(7)); + }); + } else { + showErrorToast(-8); + } + } } else { tokenData.setTGTToken(CasCookie); tokenData.setBkjwCookie(null); - accountData.setUser(account, null, password, cbRememberPwd.isChecked()); + accountData.setUser(account, password, cbRememberPwd.isChecked()); getInfo(); } } else { @@ -187,17 +206,17 @@ public class LoginActivity extends Activity implements View.OnClickListener { } /** - * 跳过二步认证 + * 二步认证 - 密码 * * @param account 学号 * @param password 密码 * @param CASCookie CAS Cookie * @param tokenData tokenData */ - private void bypass2FA(String account, String password, String CASCookie, TokenData tokenData) { + private void reAuth_Password(String account, String password, String CASCookie, TokenData tokenData) { try { - runOnUiThread(() -> button.setText("正在尝试绕过二步验证")); - String MultiFactorAuth = StaticService.bypass2FA(this, password, CASCookie); + runOnUiThread(() -> button.setText("正在二步验证")); + String MultiFactorAuth = StaticService.reAuth_Password(this, password, CASCookie); if (MultiFactorAuth.contains("ERROR")) { if (MultiFactorAuth.equals("ERROR1")) { showErrorToast(-4); @@ -209,7 +228,7 @@ public class LoginActivity extends Activity implements View.OnClickListener { } else { tokenData.setMFACookie(MultiFactorAuth); tokenData.setBkjwCookie(null); - accountData.setUser(account, null, password, cbRememberPwd.isChecked()); + accountData.setUser(account, password, cbRememberPwd.isChecked()); getInfo(); } @@ -220,7 +239,7 @@ public class LoginActivity extends Activity implements View.OnClickListener { /** * 显示手机验证码2FA */ - private void showPhoneOtpDialog(String phoneNumber, String CasCookie, TokenData tokenData) { + private void showSMSCodeDialog(String phoneNumber, String CasCookie, TokenData tokenData) { try { AlertDialog dialog; AlertDialog.Builder builder = new AlertDialog.Builder(this); @@ -231,17 +250,17 @@ public class LoginActivity extends Activity implements View.OnClickListener { dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); Window window = dialog.getWindow(); - window.setContentView(R.layout.login_phoneotp); + window.setContentView(R.layout.login_smscode); TextView phoneNumberView = window .findViewById(R.id.et_phone); phoneNumberView.setText(phoneNumber); Button buttonYes = window.findViewById(R.id.btn_text_yes); buttonYes.setOnClickListener(view -> { - TextView phoneOTP = window - .findViewById(R.id.et_phoneotp); - String OTP = phoneOTP.getText().toString(); + TextView SMSCode = window + .findViewById(R.id.et_smscode); + String SMSCodeOTP = SMSCode.getText().toString(); + testCASWithSMSCode(SMSCodeOTP, CasCookie, tokenData); dialog.dismiss(); - testCASWithOTP(OTP, CasCookie, tokenData); }); } catch (Exception ignore) { } @@ -287,7 +306,7 @@ public class LoginActivity extends Activity implements View.OnClickListener { List allTerm = StaticService.getTerms(this, tokenData.getCookie()); if (allTerm != null) { - MoreDate.newInstance(this).setTermBeans(allTerm); + MoreData.setTermBeans(allTerm); } } catch (Exception e) { UMCrash.generateCustomLog(e, "getInfo"); @@ -318,7 +337,7 @@ public class LoginActivity extends Activity implements View.OnClickListener { button.setText("登录"); button.setEnabled(true); etAccount.setEnabled(true); - etPwd2.setEnabled(true); + etPwd.setEnabled(true); progressBar.setVisibility(View.GONE); } @@ -329,7 +348,7 @@ public class LoginActivity extends Activity implements View.OnClickListener { button.setText("网络初始化"); button.setEnabled(false); etAccount.setEnabled(false); - etPwd2.setEnabled(false); + etPwd.setEnabled(false); progressBar.setVisibility(View.VISIBLE); } diff --git a/app/src/main/java/top/yvyan/guettable/activity/SetTermActivity.java b/app/src/main/java/top/yvyan/guettable/activity/SetTermActivity.java index d3a0b16175c07e303a2a0c197fc45b1b889e88bb..286fad69ce41751ba48c8b955a20b3a280abcfa0 100644 --- a/app/src/main/java/top/yvyan/guettable/activity/SetTermActivity.java +++ b/app/src/main/java/top/yvyan/guettable/activity/SetTermActivity.java @@ -18,7 +18,7 @@ import top.yvyan.guettable.R; import top.yvyan.guettable.bean.TermBean; import top.yvyan.guettable.data.AccountData; import top.yvyan.guettable.data.GeneralData; -import top.yvyan.guettable.data.MoreDate; +import top.yvyan.guettable.data.MoreData; import top.yvyan.guettable.data.ScheduleData; import top.yvyan.guettable.util.DialogUtil; import top.yvyan.guettable.util.ToastUtil; @@ -36,7 +36,6 @@ public class SetTermActivity extends AppCompatActivity implements View.OnClickLi private XSeekBar seekBar; private GeneralData generalData; - private ScheduleData scheduleData; @Override protected void onCreate(Bundle savedInstanceState) { @@ -66,7 +65,6 @@ public class SetTermActivity extends AppCompatActivity implements View.OnClickLi back.setOnClickListener(this); input.setOnClickListener(this); generalData = GeneralData.newInstance(this); - scheduleData = ScheduleData.newInstance(this); } @SuppressLint("SetTextI18n") @@ -127,11 +125,10 @@ public class SetTermActivity extends AppCompatActivity implements View.OnClickLi break; case R.id.input: //保存学年 - ScheduleData scheduleData = ScheduleData.newInstance(getApplicationContext()); int year = Integer.parseInt(generalData.getGrade()) + (int) spinnerYear.getSelectedItemId(); int num = (int) spinnerTerm.getSelectedItemId() + 1; String term_1 = year + "-" + (year + 1) + "_" + num; - for (TermBean termBean : MoreDate.newInstance(this).getTermBeans()) { + for (TermBean termBean : MoreData.getTermBeans()) { String termString = termBean.getTerm(); if (termString != null && termString.length() >= 11 @@ -142,8 +139,8 @@ public class SetTermActivity extends AppCompatActivity implements View.OnClickLi } } generalData.setTerm(term_1); - scheduleData.deleteInputCourse(); - if (scheduleData.getUserCourseBeans().size() != 0) { + ScheduleData.deleteInputCourse(); + if (ScheduleData.getUserCourseBeans().size() != 0) { DialogUtil.IDialogService service = new DialogUtil.IDialogService() { @Override public void onClickYes() { @@ -152,7 +149,7 @@ public class SetTermActivity extends AppCompatActivity implements View.OnClickLi @Override public void onClickBack() { - scheduleData.deleteUserCourse(); + ScheduleData.deleteUserCourse(); importCourse(); } }; @@ -169,7 +166,7 @@ public class SetTermActivity extends AppCompatActivity implements View.OnClickLi int week = seekBar.getSelectedNumber() / 10; generalData.setWeek(week); generalData.setLastUpdateTime(-1); - scheduleData.setUpdate(true); + ScheduleData.setUpdate(true); ToastUtil.showToast(getApplicationContext(), "正在导入课表,受教务系统影响,最长需要约10秒,请耐心等待,不要滑动页面"); Intent intent = getIntent(); setResult(OK, intent); diff --git a/app/src/main/java/top/yvyan/guettable/activity/WebViewActivity.java b/app/src/main/java/top/yvyan/guettable/activity/WebViewActivity.java index c18ce9a07122b50a2c175b823a3197bd4419a825..626346f22a61ad4ad98143d63c235225db4efb2d 100644 --- a/app/src/main/java/top/yvyan/guettable/activity/WebViewActivity.java +++ b/app/src/main/java/top/yvyan/guettable/activity/WebViewActivity.java @@ -141,6 +141,13 @@ public class WebViewActivity extends AppCompatActivity { if (url.startsWith("http://") || url.startsWith("https://")) { view.loadUrl(url); return true; + } else if (url.startsWith("mqq")) { //仅允许QQ跳转 + try { + startActivity(Intent.parseUri(url, Intent.URI_INTENT_SCHEME)); + } catch (Exception ex) { + ex.printStackTrace(); + } + return true; } return false; } diff --git a/app/src/main/java/top/yvyan/guettable/adapter/AvgTeacherAdapter.java b/app/src/main/java/top/yvyan/guettable/adapter/AvgTeacherAdapter.java deleted file mode 100644 index f0d63833e66b989a86bd0c144afafd70530c970d..0000000000000000000000000000000000000000 --- a/app/src/main/java/top/yvyan/guettable/adapter/AvgTeacherAdapter.java +++ /dev/null @@ -1,54 +0,0 @@ -package top.yvyan.guettable.adapter; - -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.recyclerview.widget.RecyclerView; - -import java.util.List; - -import top.yvyan.guettable.R; -import top.yvyan.guettable.bean.AvgTeacherBean; - -public class AvgTeacherAdapter extends RecyclerView.Adapter { - private final List avgTeacherBeans; - - public AvgTeacherAdapter(List avgTeacherBeans) { - this.avgTeacherBeans = avgTeacherBeans; - } - - @NonNull - @Override - public AvgTeacherViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext()); - View itemView = layoutInflater.inflate(R.layout.teacher_cardview,parent,false); - return new AvgTeacherViewHolder(itemView); - } - - @Override - public void onBindViewHolder(@NonNull AvgTeacherViewHolder holder, int position) { - holder.courseName.setText(avgTeacherBeans.get(position).getCourseName()); - holder.teacherName.setText(avgTeacherBeans.get(position).getTeacherName()); - holder.teacherHint.setText(avgTeacherBeans.get(position).getHint()); - } - - @Override - public int getItemCount() { - return avgTeacherBeans.size(); - } - - public static class AvgTeacherViewHolder extends RecyclerView.ViewHolder { - TextView courseName, teacherName, teacherHint; - - public AvgTeacherViewHolder(@NonNull View itemView) { - super(itemView); - courseName = itemView.findViewById(R.id.course_Name); - teacherName = itemView.findViewById(R.id.teacher_name); - teacherHint = itemView.findViewById(R.id.teacher_hint); - } - } - -} diff --git a/app/src/main/java/top/yvyan/guettable/adapter/AvgTextbookAdapter.java b/app/src/main/java/top/yvyan/guettable/adapter/AvgTextbookAdapter.java deleted file mode 100644 index d98fcdd1c8c174b8034ab095783bb6747f578da7..0000000000000000000000000000000000000000 --- a/app/src/main/java/top/yvyan/guettable/adapter/AvgTextbookAdapter.java +++ /dev/null @@ -1,54 +0,0 @@ -package top.yvyan.guettable.adapter; - -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.recyclerview.widget.RecyclerView; - -import java.util.List; - -import top.yvyan.guettable.R; -import top.yvyan.guettable.bean.AvgTextbookBean; - -public class AvgTextbookAdapter extends RecyclerView.Adapter { - - private final List avgTextbookBeans; - - public AvgTextbookAdapter(List avgTextbookBeans) { - this.avgTextbookBeans = avgTextbookBeans; - } - - @NonNull - @Override - public AvgTextbookAdapter.AvgTextbookViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext()); - View itemView = layoutInflater.inflate(R.layout.textbook_cardview, parent, false); - return new AvgTextbookViewHolder(itemView); - } - - @Override - public void onBindViewHolder(@NonNull AvgTextbookAdapter.AvgTextbookViewHolder holder, int position) { - holder.courseName.setText(avgTextbookBeans.get(position).getCourseName()); - holder.textbookName.setText(avgTextbookBeans.get(position).getTextbookName()); - holder.textbookHint.setText(avgTextbookBeans.get(position).getHint()); - } - - @Override - public int getItemCount() { - return avgTextbookBeans.size(); - } - - static class AvgTextbookViewHolder extends RecyclerView.ViewHolder { - TextView courseName, textbookName, textbookHint; - - public AvgTextbookViewHolder(@NonNull View itemView) { - super(itemView); - courseName = itemView.findViewById(R.id.textbook_course_Name); - textbookName = itemView.findViewById(R.id.textbook_name); - textbookHint = itemView.findViewById(R.id.textbook_hint); - } - } -} diff --git a/app/src/main/java/top/yvyan/guettable/adapter/ClassDetailAdapter.java b/app/src/main/java/top/yvyan/guettable/adapter/ClassDetailAdapter.java index ea57c74bdd984553f9a02ddcebbf348afe0949bf..e156a5bb1e7778ad291d501d7535de6975c98268 100644 --- a/app/src/main/java/top/yvyan/guettable/adapter/ClassDetailAdapter.java +++ b/app/src/main/java/top/yvyan/guettable/adapter/ClassDetailAdapter.java @@ -110,7 +110,7 @@ public class ClassDetailAdapter extends RecyclerView.Adapter { - ScheduleData.newInstance(activity).deleteUserCourse(courseBean.getId()); + ScheduleData.deleteUserCourse(courseBean.getId()); schedules.remove(position); //删除动画 notifyItemRemoved(position); diff --git a/app/src/main/java/top/yvyan/guettable/baseFun/FirstLoad.java b/app/src/main/java/top/yvyan/guettable/baseFun/FirstLoad.java index 5307ae296dd1635e9ca4e8f330eed8b2803a932e..f24a16c6710ddcb2951cb1fdb8f48cb1bd404028 100644 --- a/app/src/main/java/top/yvyan/guettable/baseFun/FirstLoad.java +++ b/app/src/main/java/top/yvyan/guettable/baseFun/FirstLoad.java @@ -9,7 +9,7 @@ import java.util.List; import top.yvyan.guettable.activity.SettingActivity; import top.yvyan.guettable.bean.ExamBean; -import top.yvyan.guettable.data.AccountData; +import top.yvyan.guettable.data.GeneralData; import top.yvyan.guettable.data.ScheduleData; import top.yvyan.guettable.util.AppUtil; @@ -51,46 +51,35 @@ public class FirstLoad { */ private void updateDate(int i) { switch (i) { - case 36: - update_36(); - break; case 40: //修复考试安排信息错误导致的闪退问题 update_40(); break; + case 52: + update_52(); default: break; } } + /** + * 52->53需要进行的操作 + */ + private void update_52() { + GeneralData.newInstance(context).setLastUpdateTime(-1); + } + /** * 40->41需要进行的操作 */ private void update_40() { - ScheduleData scheduleData = ScheduleData.newInstance(context); - List examBeans = scheduleData.getExamBeans(); + List examBeans = ScheduleData.getExamBeans(); for (ExamBean examBean : examBeans) { if (examBean.getClassNum() < 1) { examBean.setClassNum(1); } } - scheduleData.setExamBeans(examBeans); - } - - /** - * 36->37需要进行的操作 - */ - private void update_36() { - //修复密码丢失导致的登录错误 - AccountData accountData = AccountData.newInstance(context); - if (accountData.getIsLogin()) { - if (accountData.getVPNPwd() == null || accountData.getVPNPwd().isEmpty()) { - accountData.logoff(); - } - if (accountData.getBkjwPwd() == null || accountData.getBkjwPwd().isEmpty()) { - accountData.logoff(); - } - } + ScheduleData.setExamBeans(examBeans); } private void openUpdate() { diff --git a/app/src/main/java/top/yvyan/guettable/bean/AvgTeacherBean.java b/app/src/main/java/top/yvyan/guettable/bean/AvgTeacherBean.java deleted file mode 100644 index 153ecdfc818be28df200b4260376841e059a9b61..0000000000000000000000000000000000000000 --- a/app/src/main/java/top/yvyan/guettable/bean/AvgTeacherBean.java +++ /dev/null @@ -1,29 +0,0 @@ -package top.yvyan.guettable.bean; - -public class AvgTeacherBean { - String courseName; - String teacherName; - String hint; - - public AvgTeacherBean(String courseName, String teacherName, String hint) { - this.courseName = courseName; - this.teacherName = teacherName; - this.hint = hint; - } - - public String getCourseName() { - return courseName; - } - - public void setHint(String hint) { - this.hint = hint; - } - - public String getHint() { - return hint; - } - - public String getTeacherName() { - return teacherName; - } -} diff --git a/app/src/main/java/top/yvyan/guettable/bean/AvgTextbookBean.java b/app/src/main/java/top/yvyan/guettable/bean/AvgTextbookBean.java deleted file mode 100644 index 9e51ced4da68d38a3089cdd8b4a3237aebda524e..0000000000000000000000000000000000000000 --- a/app/src/main/java/top/yvyan/guettable/bean/AvgTextbookBean.java +++ /dev/null @@ -1,29 +0,0 @@ -package top.yvyan.guettable.bean; - -public class AvgTextbookBean { - private final String courseName; - private final String textbookName; - private String hint; - - public AvgTextbookBean(String courseName, String textbookName, String hint) { - this.courseName = courseName; - this.textbookName = textbookName; - this.hint = hint; - } - - public String getCourseName() { - return courseName; - } - - public String getTextbookName() { - return textbookName; - } - - public String getHint() { - return hint; - } - - public void setHint(String hint) { - this.hint = hint; - } -} diff --git a/app/src/main/java/top/yvyan/guettable/bean/TipInfo.java b/app/src/main/java/top/yvyan/guettable/bean/TipInfo.java new file mode 100644 index 0000000000000000000000000000000000000000..f4081481880c2b0607b6f78196fadb55623f7a2c --- /dev/null +++ b/app/src/main/java/top/yvyan/guettable/bean/TipInfo.java @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2021 xuexiangjys(xuexiangjys@163.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package top.yvyan.guettable.bean; + +import androidx.annotation.Keep; + +/** + * @author xuexiang + * @since 2019-08-28 15:35 + */ +@Keep +public class TipInfo { + /** + * title : 小贴士3 + * content :

欢迎关注我的微信公众号:我的Android开源之旅。


+ */ + + private String title; + private String content; + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + @Override + public String toString() { + return "TipInfo{" + + "title='" + title + '\'' + + ", content='" + content + '\'' + + '}'; + } +} diff --git a/app/src/main/java/top/yvyan/guettable/data/AccountData.java b/app/src/main/java/top/yvyan/guettable/data/AccountData.java index 60733a277d0fa47062a8044ce444b15c425291fc..f7afa7d265c8bd4c05900e258077c97dad1eca2f 100644 --- a/app/src/main/java/top/yvyan/guettable/data/AccountData.java +++ b/app/src/main/java/top/yvyan/guettable/data/AccountData.java @@ -9,15 +9,13 @@ public class AccountData { private static final String IS_SAVE = "isSave"; private static final String IS_LOGIN = "isLogin"; private static final String USERNAME = "username"; - private static final String PASSWORD = "password"; - private static final String PASSWORD2 = "password2"; + private static final String PASSWORD = "password2"; SharedPreferences sharedPreferences; private boolean isSave; private boolean isLogin; private String username; - private String bkjwPwd; - private String VPNPwd; + private String Pwd; private AccountData(Context context) { sharedPreferences = context.getSharedPreferences(SHP_NAME, Context.MODE_PRIVATE); @@ -43,12 +41,9 @@ public class AccountData { return username; } - public void setUser(String username, String bkjwPwd, String VPNPwd, boolean isSave) { - if (bkjwPwd != null) { - this.bkjwPwd = bkjwPwd; - } + public void setUser(String username, String Pwd, boolean isSave) { this.username = username; - this.VPNPwd = VPNPwd; + this.Pwd = Pwd; this.isSave = isSave; this.isLogin = true; saveUser(); @@ -63,8 +58,7 @@ public class AccountData { isSave = sharedPreferences.getBoolean(IS_SAVE, false); isLogin = sharedPreferences.getBoolean(IS_LOGIN, false); username = sharedPreferences.getString(USERNAME, ""); - bkjwPwd = sharedPreferences.getString(PASSWORD, ""); - VPNPwd = sharedPreferences.getString(PASSWORD2, ""); + Pwd = sharedPreferences.getString(PASSWORD, ""); } private void saveUser() { @@ -72,16 +66,11 @@ public class AccountData { editor.putBoolean(IS_SAVE, isSave); editor.putBoolean(IS_LOGIN, isLogin); editor.putString(USERNAME, username); - editor.putString(PASSWORD, bkjwPwd); - editor.putString(PASSWORD2, VPNPwd); + editor.putString(PASSWORD, Pwd); editor.apply(); } - public String getBkjwPwd() { - return bkjwPwd; - } - - public String getVPNPwd() { - return VPNPwd; + public String getPwd() { + return Pwd; } } diff --git a/app/src/main/java/top/yvyan/guettable/data/BaseData.java b/app/src/main/java/top/yvyan/guettable/data/BaseData.java new file mode 100644 index 0000000000000000000000000000000000000000..d8a27c1fa7d69b56bcae5f95b81fe02d8c2b14de --- /dev/null +++ b/app/src/main/java/top/yvyan/guettable/data/BaseData.java @@ -0,0 +1,34 @@ +package top.yvyan.guettable.data; + +import com.google.gson.Gson; +import com.tencent.mmkv.MMKV; + +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.List; + +/** + * List转码存储,用于存储课程列表等信息 + */ +public class BaseData { + public static void set(String key, List Beans) { + String str = new Gson().toJson(Beans); + MMKV mmkv = MMKV.defaultMMKV(); + mmkv.encode(key, str); + } + + public static List get(String key, Type type) { + List list = null; + MMKV mmkv = MMKV.defaultMMKV(); + try { + String str = mmkv.decodeString(key); + list = new Gson().fromJson(str, type); + } catch (Exception e) { + mmkv.remove(key); + } + if (list == null) { + list = new ArrayList<>(); + } + return list; + } +} diff --git a/app/src/main/java/top/yvyan/guettable/data/DetailClassData.java b/app/src/main/java/top/yvyan/guettable/data/DetailClassData.java index 19ad022dd8fec50cab5e5903f70a7dccdfef578c..19d17d8deeab41234906a64c9ee58565d9339c3b 100644 --- a/app/src/main/java/top/yvyan/guettable/data/DetailClassData.java +++ b/app/src/main/java/top/yvyan/guettable/data/DetailClassData.java @@ -5,25 +5,13 @@ import com.zhuangfei.timetable.model.Schedule; import java.util.List; public class DetailClassData { - private static DetailClassData detailClassData; + private static List schedules; - private List schedules; - - private DetailClassData() { - } - - public static DetailClassData newInstance() { - if (detailClassData == null) { - detailClassData = new DetailClassData(); - } - return detailClassData; - } - - public List getCourseBeans() { + public static List getCourseBeans() { return schedules; } - public void setCourseBeans(List schedules) { - this.schedules = schedules; + public static void setCourseBeans(List schedules) { + DetailClassData.schedules = schedules; } } diff --git a/app/src/main/java/top/yvyan/guettable/data/MoreData.java b/app/src/main/java/top/yvyan/guettable/data/MoreData.java new file mode 100644 index 0000000000000000000000000000000000000000..82c954602866e244c8212c5eb00a850edad3a534 --- /dev/null +++ b/app/src/main/java/top/yvyan/guettable/data/MoreData.java @@ -0,0 +1,120 @@ +package top.yvyan.guettable.data; + +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import com.tencent.mmkv.MMKV; + +import java.util.List; + +import top.yvyan.guettable.bean.CETBean; +import top.yvyan.guettable.bean.ExamScoreBean; +import top.yvyan.guettable.bean.ExperimentScoreBean; +import top.yvyan.guettable.bean.PlannedCourseBean; +import top.yvyan.guettable.bean.ResitBean; +import top.yvyan.guettable.bean.SelectedCourseBean; +import top.yvyan.guettable.bean.TermBean; + +public class MoreData extends BaseData { + private static final String MAIN_KEY = "MoreData"; + private static final String CET_STRING = MAIN_KEY + "CET_STRING"; + private static final String EXAM_SCORE_STRING = MAIN_KEY + "EXAM_SCORE_STRING"; + private static final String RESIT_STRING = MAIN_KEY + "resitString"; + private static final String EXPERIMENT_SCORE_STRING = MAIN_KEY + "EXPERIMENT_SCORE_STRING"; + private static final String PLANNED_COURSE_STRING = MAIN_KEY + "plannedCourseString"; + private static final String GRADES_STRING = MAIN_KEY + "gradesString"; + private static final String SELECTED_COURSE = MAIN_KEY + "selectedCourses"; + private static final String ALL_TERM = MAIN_KEY + "allTerms"; + + //CET成绩 + public static List getCetBeans() { + return get(CET_STRING, new TypeToken>() { + }.getType()); + } + + public static void setCetBeans(List cetBeans) { + set(CET_STRING, cetBeans); + } + + //考试成绩 + public static List getExamScoreBeans() { + return get(EXAM_SCORE_STRING, new TypeToken>() { + }.getType()); + } + + public static void setExamScoreBeans(List examScoreBeans) { + set(EXAM_SCORE_STRING, examScoreBeans); + } + + //补考成绩 + public static List getResitBeans() { + return get(RESIT_STRING, new TypeToken>() { + }.getType()); + } + + public static void setResitBeans(List resitBeans) { + set(RESIT_STRING, resitBeans); + } + + //实验成绩 + public static List getExperimentScoreBeans() { + return get(EXPERIMENT_SCORE_STRING, new TypeToken>() { + }.getType()); + } + + public static void setExperimentScoreBeans(List experimentScoreBeans) { + set(EXPERIMENT_SCORE_STRING, experimentScoreBeans); + } + + //计划课程 + public static List getPlannedCourseBeans() { + return get(PLANNED_COURSE_STRING, new TypeToken>() { + }.getType()); + } + + public static void setPlannedCourseBeans(List plannedCourseBeans) { + set(PLANNED_COURSE_STRING, plannedCourseBeans); + } + + //已选课程 + public static List getSelectedCourseBeans() { + return get(SELECTED_COURSE, new TypeToken>() { + }.getType()); + } + + public static void setSelectedCoursesBeans(List selectedCoursesBeans) { + set(SELECTED_COURSE, selectedCoursesBeans); + } + + //学期列表 + public static List getTermBeans() { + return get(ALL_TERM, new TypeToken>() { + }.getType()); + } + + public static void setTermBeans(List termBeans) { + set(ALL_TERM, termBeans); + } + + //学分绩 + public static float[] getGrades() { + float[] grades = null; + MMKV mmkv = MMKV.defaultMMKV(); + try { + String str = mmkv.decodeString(GRADES_STRING); + grades = new Gson().fromJson(str, new TypeToken() { + }.getType()); + } catch (Exception e) { + mmkv.remove(GRADES_STRING); + } + if (grades == null) { + grades = new float[]{100, 100, 100, 100, 100, 100, 100}; + } + return grades; + } + + public static void setGrades(float[] grades) { + String str = new Gson().toJson(grades); + MMKV mmkv = MMKV.defaultMMKV(); + mmkv.encode(GRADES_STRING, str); + } +} diff --git a/app/src/main/java/top/yvyan/guettable/data/MoreDate.java b/app/src/main/java/top/yvyan/guettable/data/MoreDate.java deleted file mode 100644 index 86eaa643846d498dc70f0bc238e64299becfbb28..0000000000000000000000000000000000000000 --- a/app/src/main/java/top/yvyan/guettable/data/MoreDate.java +++ /dev/null @@ -1,352 +0,0 @@ -package top.yvyan.guettable.data; - -import android.content.Context; -import android.content.SharedPreferences; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import top.yvyan.guettable.bean.CETBean; -import top.yvyan.guettable.bean.ExamScoreBean; -import top.yvyan.guettable.bean.ExperimentScoreBean; -import top.yvyan.guettable.bean.PlannedCourseBean; -import top.yvyan.guettable.bean.ResitBean; -import top.yvyan.guettable.bean.SelectedCourseBean; -import top.yvyan.guettable.bean.TermBean; -import top.yvyan.guettable.util.SerializeUtil; - -public class MoreDate { - private static MoreDate moreDate; - private static final String SHP_NAME = "MoreDate"; - private static final String RESIT_STRING = "resitString"; - private static final String CET_STRING = "CET_STRING"; - private static final String EXAM_SCORE_STRING = "EXAM_SCORE_STRING"; - private static final String EXPERIMENT_SCORE_STRING = "EXPERIMENT_SCORE_STRING"; - private static final String PLANNED_COURSE_STRING = "plannedCourseString"; - private static final String GRADES_STRING = "gradesString"; - private static final String SELECTED_COURSE = "selectedCourses"; - private static final String ALL_TERM = "allTerms"; - - private final SharedPreferences sharedPreferences; - private final SharedPreferences.Editor editor; - - private List resitBeans; - private List cetBeans; - private List examScoreBeans; - private List experimentScoreBeans; - private List plannedCourseBeans; - private List selectedCoursesBeans; - private List termBeans; - private float[] grades; - - private MoreDate(Context context) { - sharedPreferences = context.getSharedPreferences(SHP_NAME, Context.MODE_PRIVATE); - editor = sharedPreferences.edit(); - editor.apply(); - load(); - } - - private void load() { - ResitBean[] resitBeans1 = null; - CETBean[] cetBeans1 = null; - ExamScoreBean[] examScoreBeans1 = null; - ExperimentScoreBean[] experimentScoreBeans1 = null; - PlannedCourseBean[] plannedCourseBeans1 = null; - SelectedCourseBean[] selectedCourseBeans1 = null; - TermBean[] termBeans1 = null; - - - String resitString = sharedPreferences.getString(RESIT_STRING, null); - String cetString = sharedPreferences.getString(CET_STRING, null); - String examScoreString = sharedPreferences.getString(EXAM_SCORE_STRING, null); - String experimentScoreString = sharedPreferences.getString(EXPERIMENT_SCORE_STRING, null); - String plannedCourseString = sharedPreferences.getString(PLANNED_COURSE_STRING, null); - String gradesString = sharedPreferences.getString(GRADES_STRING, null); - String selectedCourseString = sharedPreferences.getString(SELECTED_COURSE, null); - String termString = sharedPreferences.getString(ALL_TERM, null); - - if (resitString != null) { - try { - resitBeans1 = (ResitBean[]) SerializeUtil.serializeToObject(resitString); - } catch (IOException | ClassNotFoundException e) { - e.printStackTrace(); - } - if (resitBeans1 != null) { - resitBeans = Arrays.asList(resitBeans1); - } - } - if (cetString != null) { - try { - cetBeans1 = (CETBean[]) SerializeUtil.serializeToObject(cetString); - } catch (IOException | ClassNotFoundException e) { - e.printStackTrace(); - } - if (cetBeans1 != null) { - cetBeans = Arrays.asList(cetBeans1); - } - } - if (examScoreString != null) { - try { - examScoreBeans1 = (ExamScoreBean[]) SerializeUtil.serializeToObject(examScoreString); - } catch (IOException | ClassNotFoundException e) { - e.printStackTrace(); - } - if (examScoreBeans1 != null) { - examScoreBeans = Arrays.asList(examScoreBeans1); - } - } - if (experimentScoreString != null) { - try { - experimentScoreBeans1 = (ExperimentScoreBean[]) SerializeUtil.serializeToObject(experimentScoreString); - } catch (IOException | ClassNotFoundException e) { - e.printStackTrace(); - } - if (experimentScoreBeans1 != null) { - experimentScoreBeans = Arrays.asList(experimentScoreBeans1); - } - } - if (plannedCourseString != null) { - try { - plannedCourseBeans1 = (PlannedCourseBean[]) SerializeUtil.serializeToObject(plannedCourseString); - } catch (IOException | ClassNotFoundException e) { - e.printStackTrace(); - } - if (plannedCourseBeans1 != null) { - plannedCourseBeans = Arrays.asList(plannedCourseBeans1); - } - } - if (gradesString != null) { - try { - grades = (float[]) SerializeUtil.serializeToObject(gradesString); - } catch (IOException | ClassNotFoundException e) { - e.printStackTrace(); - } - } - if (selectedCourseString != null) { - try { - selectedCourseBeans1 = (SelectedCourseBean[]) SerializeUtil.serializeToObject(selectedCourseString); - } catch (IOException | ClassNotFoundException e) { - e.printStackTrace(); - } - if (selectedCourseBeans1 != null) { - selectedCoursesBeans = Arrays.asList(selectedCourseBeans1); - } - } - if (termString != null) { - try { - termBeans1 = (TermBean[]) SerializeUtil.serializeToObject(termString); - } catch (IOException | ClassNotFoundException e) { - e.printStackTrace(); - } - if (termBeans1 != null) { - termBeans = Arrays.asList(termBeans1); - } - } - } - - public static MoreDate newInstance(Context context) { - if (moreDate == null) { - moreDate = new MoreDate(context); - } - return moreDate; - } - - public List getResitBeans() { - if (resitBeans == null) { - resitBeans = new ArrayList<>(); - } - return resitBeans; - } - - public void setResitBeans(List resitBeans) { - this.resitBeans = resitBeans; - String resitString = null; - ResitBean[] resitBeans1 = new ResitBean[resitBeans.size()]; - resitBeans.toArray(resitBeans1); - try { - resitString = SerializeUtil.serialize(resitBeans1); - } catch (IOException e) { - e.printStackTrace(); - } - if (resitString != null) { - editor.putString(RESIT_STRING, resitString); - editor.apply(); - } - } - - //CET成绩 - public List getCetBeans() { - if (cetBeans == null) { - cetBeans = new ArrayList<>(); - } - return cetBeans; - } - - public void setCetBeans(List cetBeans) { - this.cetBeans = cetBeans; - String cetString = null; - CETBean[] cetBeans1 = new CETBean[cetBeans.size()]; - cetBeans.toArray(cetBeans1); - try { - cetString = SerializeUtil.serialize(cetBeans1); - } catch (IOException e) { - e.printStackTrace(); - } - if (cetString != null) { - editor.putString(CET_STRING, cetString); - editor.apply(); - } - } - - //考试成绩 - public List getExamScoreBeans() { - if (examScoreBeans == null) { - examScoreBeans = new ArrayList<>(); - } - return examScoreBeans; - } - - public void setExamScoreBeans(List examScoreBeans) { - this.examScoreBeans = examScoreBeans; - String examScoreString = null; - ExamScoreBean[] examScoreBeans1 = new ExamScoreBean[examScoreBeans.size()]; - examScoreBeans.toArray(examScoreBeans1); - try { - examScoreString = SerializeUtil.serialize(examScoreBeans1); - } catch (IOException e) { - e.printStackTrace(); - } - if (examScoreString != null) { - editor.putString(EXAM_SCORE_STRING, examScoreString); - editor.apply(); - } - } - - //实验成绩 - public List getExperimentScoreBeans() { - if (experimentScoreBeans == null) { - experimentScoreBeans = new ArrayList<>(); - } - return experimentScoreBeans; - } - - public void setExperimentScoreBeans(List experimentScoreBeans) { - this.experimentScoreBeans = experimentScoreBeans; - String experimentScoreString = null; - ExperimentScoreBean[] experimentScoreBeans1 = new ExperimentScoreBean[experimentScoreBeans.size()]; - experimentScoreBeans.toArray(experimentScoreBeans1); - try { - experimentScoreString = SerializeUtil.serialize(experimentScoreBeans1); - } catch (IOException e) { - e.printStackTrace(); - } - if (experimentScoreString != null) { - editor.putString(EXPERIMENT_SCORE_STRING, experimentScoreString); - editor.apply(); - } - } - - //计划课程 - public List getPlannedCourseBeans() { - if (plannedCourseBeans == null) { - plannedCourseBeans = new ArrayList<>(); - } - return plannedCourseBeans; - } - - public void setPlannedCourseBeans(List plannedCourseBeans) { - this.plannedCourseBeans = plannedCourseBeans; - String plannedCourseString = null; - PlannedCourseBean[] plannedCourseBeans1 = new PlannedCourseBean[plannedCourseBeans.size()]; - plannedCourseBeans.toArray(plannedCourseBeans1); - try { - plannedCourseString = SerializeUtil.serialize(plannedCourseBeans1); - } catch (IOException e) { - e.printStackTrace(); - } - if (plannedCourseString != null) { - editor.putString(PLANNED_COURSE_STRING, plannedCourseString); - editor.apply(); - } - } - - //已选课程 - public List getSelectedCourseBeans() { - if (selectedCoursesBeans == null) { - selectedCoursesBeans = new ArrayList<>(); - } - return selectedCoursesBeans; - } - - public void setSelectedCoursesBeans(List selectedCoursesBeans) { - this.selectedCoursesBeans = selectedCoursesBeans; - String selectCourseString = null; - SelectedCourseBean[] selectedCourseBeans1 = new SelectedCourseBean[selectedCoursesBeans.size()]; - selectedCoursesBeans.toArray(selectedCourseBeans1); - try { - selectCourseString = SerializeUtil.serialize(selectedCourseBeans1); - } catch (IOException e) { - e.printStackTrace(); - } - if (selectCourseString != null) { - editor.putString(SELECTED_COURSE, selectCourseString); - editor.apply(); - } - } - - public List getTermBeans() { - if (termBeans == null) { - termBeans = new ArrayList<>(); - } - return termBeans; - } - - public void setTermBeans(List termBeans) { - this.termBeans = termBeans; - String termString = null; - TermBean[] termBeans1 = new TermBean[termBeans.size()]; - termBeans.toArray(termBeans1); - try { - termString = SerializeUtil.serialize(termBeans1); - } catch (Exception e) { - e.printStackTrace(); - } - if (termString != null) { - editor.putString(ALL_TERM, termString); - editor.apply(); - } - } - - public float[] getGrades() { - if (grades == null) { - grades = new float[]{100, 100, 100, 100, 100, 100, 100}; - } - return grades; - } - - public void setGrades(float[] grades) { - this.grades = grades; - String gradesString = null; - try { - gradesString = SerializeUtil.serialize(grades); - } catch (IOException e) { - e.printStackTrace(); - } - if (gradesString != null) { - editor.putString(GRADES_STRING, gradesString); - editor.apply(); - } - } - - /** - * 清除数据 - * - * @param name 空间名称 - */ - public void deleteData(String name) { - editor.putString(name, null); - editor.apply(); - } -} diff --git a/app/src/main/java/top/yvyan/guettable/data/ScheduleData.java b/app/src/main/java/top/yvyan/guettable/data/ScheduleData.java index bead51de1b5c06478ed2f4134d9790f5228dceb4..e328c0c847ed7394d2b1d92c885ec768e1bd17e3 100644 --- a/app/src/main/java/top/yvyan/guettable/data/ScheduleData.java +++ b/app/src/main/java/top/yvyan/guettable/data/ScheduleData.java @@ -1,270 +1,89 @@ package top.yvyan.guettable.data; -import android.annotation.SuppressLint; -import android.content.Context; -import android.content.SharedPreferences; +import com.google.gson.reflect.TypeToken; +import com.tencent.mmkv.MMKV; -import java.io.IOException; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import top.yvyan.guettable.bean.CourseBean; import top.yvyan.guettable.bean.ExamBean; -import top.yvyan.guettable.util.SerializeUtil; -public class ScheduleData { - private static ScheduleData scheduleData; - private static final String SHP_NAME = "ClassData"; - private static final String CLASS_STRING = "classString"; - private static final String LIB_STRING = "libString"; - private static final String EXAM_STRING = "examString"; - private static final String USER_COURSE_NO = "userCourseNo"; - private static final String USER_COURSE_BEANS = "userCourseBeans"; - private final SharedPreferences sharedPreferences; - private final SharedPreferences.Editor editor; +public class ScheduleData extends BaseData { + private static final String MAIN_KEY = "ScheduleData."; + private static final String CLASS_STRING = MAIN_KEY + "classString"; + private static final String LIB_STRING = MAIN_KEY + "libString"; + private static final String EXAM_STRING = MAIN_KEY + "examString"; + private static final String USER_COURSE_NO = MAIN_KEY + "userCourseNo"; + private static final String USER_COURSE_BEANS = MAIN_KEY + "userCourseBeans"; - private List courseBeans; - private List libBeans; - private List examBeans; - private long userCourseNo; - private List userCourseBeans; - private boolean isUpdate = false; //用于同步数据后周课表继续刷新 - - @SuppressLint("CommitPrefEdits") - private ScheduleData(Context context) { - sharedPreferences = context.getSharedPreferences(SHP_NAME, Context.MODE_PRIVATE); - editor = sharedPreferences.edit(); - load(); - } - - private void load() { - CourseBean[] courseBeans1 = null; - CourseBean[] libBeans1 = null; - ExamBean[] examBeans1 = null; - CourseBean[] userCourseBeans1 = null; - String classString = sharedPreferences.getString(CLASS_STRING, null); - String libString = sharedPreferences.getString(LIB_STRING, null); - String examString = sharedPreferences.getString(EXAM_STRING, null); - String userCourseString = sharedPreferences.getString(USER_COURSE_BEANS, null); - if (classString != null) { - try { - courseBeans1 = (CourseBean[]) SerializeUtil.serializeToObject(classString); - } catch (IOException | ClassNotFoundException e) { - e.printStackTrace(); - } - if (courseBeans1 != null) { - courseBeans = Arrays.asList(courseBeans1); - courseBeans = new ArrayList<>(courseBeans); - } - } - if (libString != null) { - try { - libBeans1 = (CourseBean[]) SerializeUtil.serializeToObject(libString); - } catch (IOException | ClassNotFoundException e) { - e.printStackTrace(); - } - if (libBeans1 != null) { - libBeans = Arrays.asList(libBeans1); - libBeans = new ArrayList<>(libBeans); - } - } - if (examString != null) { - try { - examBeans1 = (ExamBean[]) SerializeUtil.serializeToObject(examString); - } catch (IOException | ClassNotFoundException e) { - e.printStackTrace(); - } - if (examBeans1 != null) { - examBeans = Arrays.asList(examBeans1); - examBeans = new ArrayList<>(examBeans); - } - } - if (userCourseString != null) { - try { - userCourseBeans1 = (CourseBean[]) SerializeUtil.serializeToObject(userCourseString); - } catch (IOException | ClassNotFoundException e) { - e.printStackTrace(); - } - if (userCourseBeans1 != null) { - userCourseBeans = Arrays.asList(userCourseBeans1); - userCourseBeans = new ArrayList<>(userCourseBeans); - } - } - userCourseNo = sharedPreferences.getLong(USER_COURSE_NO, 1); - } - - public static ScheduleData newInstance(Context context) { - if (scheduleData == null) { - scheduleData = new ScheduleData(context); - } - return scheduleData; - } + private static boolean isUpdate = false; //用于同步数据后周课表继续刷新 //课程信息 - public List getCourseBeans() { - if (courseBeans == null) { - courseBeans = new ArrayList<>(); - } - return courseBeans; + public static List getCourseBeans() { + return get(CLASS_STRING, new TypeToken>() { + }.getType()); } - public void setCourseBeans(List courseBeans) { - this.courseBeans = courseBeans; - String classString = null; - CourseBean[] courseBeans1 = new CourseBean[courseBeans.size()]; - courseBeans.toArray(courseBeans1); - try { - classString = SerializeUtil.serialize(courseBeans1); - } catch (IOException e) { - e.printStackTrace(); - } - if (classString != null) { - editor.putString(CLASS_STRING, classString); - editor.apply(); - } + public static void setCourseBeans(List courseBeans) { + set(CLASS_STRING, courseBeans); } //实验信息 - public List getLibBeans() { - if (libBeans == null) { - libBeans = new ArrayList<>(); - } - return libBeans; + public static List getLibBeans() { + return get(LIB_STRING, new TypeToken>() { + }.getType()); } - public void setLibBeans(List libBeans) { - this.libBeans = libBeans; - String libString = null; - CourseBean[] libBean1 = new CourseBean[libBeans.size()]; - libBeans.toArray(libBean1); - try { - libString = SerializeUtil.serialize(libBean1); - } catch (IOException e) { - e.printStackTrace(); - } - if (libString != null) { - editor.putString(LIB_STRING, libString); - editor.apply(); - } + public static void setLibBeans(List libBeans) { + set(LIB_STRING, libBeans); } //考试安排 - public List getExamBeans() { - if (examBeans == null) { - examBeans = new ArrayList<>(); - } - return examBeans; + public static List getExamBeans() { + return get(EXAM_STRING, new TypeToken>() { + }.getType()); } - public void setExamBeans(List examBeans) { - this.examBeans = examBeans; - String examString = null; - ExamBean[] examBeans1 = new ExamBean[examBeans.size()]; - examBeans.toArray(examBeans1); - try { - examString = SerializeUtil.serialize(examBeans1); - } catch (IOException e) { - e.printStackTrace(); - } - if (examString != null) { - editor.putString(EXAM_STRING, examString); - editor.apply(); - } - } - - /** - * 通过现有课程数据计算最大周数 - * - * @return 最大周数 - */ - public int getMaxWeek() { - int maxWeek = 0; - try { - if (courseBeans != null) { - for (CourseBean courseBean : courseBeans) { - if (courseBean.getWeekEnd() > maxWeek) { - maxWeek = courseBean.getWeekEnd(); - } - } - } - if (libBeans != null) { - for (CourseBean courseBean : libBeans) { - if (courseBean.getWeekEnd() > maxWeek) { - maxWeek = courseBean.getWeekEnd(); - } - } - } - if (userCourseBeans != null) { - for (CourseBean courseBean : userCourseBeans) { - if (courseBean.getWeekEnd() > maxWeek) { - maxWeek = courseBean.getWeekEnd(); - } - } - } - if (examBeans != null) { - for (ExamBean examBean : examBeans) { - if (examBean.getWeek() > maxWeek) { - maxWeek = examBean.getWeek(); - } - } - } - if (maxWeek > 25) { - maxWeek = 25; - } - return maxWeek; - } catch (Exception e) { - return 0; - } + public static void setExamBeans(List examBeans) { + set(EXAM_STRING, examBeans); } //用户自定义课程 - public List getUserCourseBeans() { - if (userCourseBeans == null) { - userCourseBeans = new ArrayList<>(); - } - return userCourseBeans; + public static List getUserCourseBeans() { + return get(USER_COURSE_BEANS, new TypeToken>() { + }.getType()); } - public void setUserCourseBeans(List userCourseBeans) { - this.userCourseBeans = userCourseBeans; - String userCourseString = null; - CourseBean[] userCourseBeans1 = new CourseBean[userCourseBeans.size()]; - userCourseBeans.toArray(userCourseBeans1); - try { - userCourseString = SerializeUtil.serialize(userCourseBeans1); - } catch (IOException e) { - e.printStackTrace(); - } - if (userCourseString != null) { - editor.putString(USER_COURSE_BEANS, userCourseString); - editor.apply(); - } + public static void setUserCourseBeans(List userCourseBeans) { + set(USER_COURSE_BEANS, userCourseBeans); } - public void deleteInputCourse() { + public static void deleteInputCourse() { setCourseBeans(new ArrayList<>()); setLibBeans(new ArrayList<>()); setExamBeans(new ArrayList<>()); } - public void deleteUserCourse() { + public static void deleteUserCourse() { setUserCourseNo(1); setUserCourseBeans(new ArrayList<>()); } - public long getUserCourseNo() { + public static long getUserCourseNo() { + MMKV mmkv = MMKV.defaultMMKV(); + long userCourseNo = mmkv.decodeLong(USER_COURSE_NO, 1); setUserCourseNo(userCourseNo + 1); return userCourseNo; } - public void setUserCourseNo(long userCourseNo) { - this.userCourseNo = userCourseNo; - editor.putLong(USER_COURSE_NO, userCourseNo); - editor.apply(); + public static void setUserCourseNo(long userCourseNo) { + MMKV mmkv = MMKV.defaultMMKV(); + mmkv.encode(USER_COURSE_NO, userCourseNo); } - public void deleteUserCourse(long id) { + public static void deleteUserCourse(long id) { + List userCourseBeans = getUserCourseBeans(); for (int i = 0; i < userCourseBeans.size(); i++) { if (userCourseBeans.get(i).getId() == id) { userCourseBeans.remove(i); @@ -274,11 +93,52 @@ public class ScheduleData { } } - public boolean isUpdate() { + /** + * 通过现有课程数据计算最大周数 + * + * @return 最大周数 + */ + public static int getMaxWeek() { + int maxWeek = 0; + List courseBeans = getCourseBeans(); + List libBeans = getLibBeans(); + List userCourseBeans = getUserCourseBeans(); + List examBeans = getExamBeans(); + try { + for (CourseBean courseBean : courseBeans) { + if (courseBean.getWeekEnd() > maxWeek) { + maxWeek = courseBean.getWeekEnd(); + } + } + for (CourseBean courseBean : libBeans) { + if (courseBean.getWeekEnd() > maxWeek) { + maxWeek = courseBean.getWeekEnd(); + } + } + for (CourseBean courseBean : userCourseBeans) { + if (courseBean.getWeekEnd() > maxWeek) { + maxWeek = courseBean.getWeekEnd(); + } + } + for (ExamBean examBean : examBeans) { + if (examBean.getWeek() > maxWeek) { + maxWeek = examBean.getWeek(); + } + } + if (maxWeek > 25) { + maxWeek = 25; + } + return maxWeek; + } catch (Exception e) { + return 0; + } + } + + public static boolean isUpdate() { return isUpdate; } - public void setUpdate(boolean update) { + public static void setUpdate(boolean update) { isUpdate = update; } } diff --git a/app/src/main/java/top/yvyan/guettable/data/TokenData.java b/app/src/main/java/top/yvyan/guettable/data/TokenData.java index 3eb0d0ee9012d47ed1bba7b3456d9ffebc92ecb3..100619f35bb69c14cd6f337fcccc9f77b53d2fc3 100644 --- a/app/src/main/java/top/yvyan/guettable/data/TokenData.java +++ b/app/src/main/java/top/yvyan/guettable/data/TokenData.java @@ -1,18 +1,33 @@ package top.yvyan.guettable.data; import android.annotation.SuppressLint; +import android.app.Activity; import android.content.Context; +import android.content.ContextWrapper; import android.content.SharedPreferences; +import android.graphics.Color; +import android.graphics.drawable.ColorDrawable; +import android.view.Window; +import android.view.WindowManager; +import android.widget.Button; +import android.widget.TextView; + +import java.lang.reflect.*; + +import androidx.appcompat.app.AlertDialog; import top.yvyan.guettable.R; import top.yvyan.guettable.service.fetch.Net; import top.yvyan.guettable.service.fetch.StaticService; +import top.yvyan.guettable.util.ToastUtil; public class TokenData { @SuppressLint("StaticFieldLeak") private static TokenData tokenData; private final SharedPreferences.Editor editor; - private final Context context; + private Context context; + + private Object Caller; private static final String SHP_NAME = "tokenData"; @@ -60,7 +75,6 @@ public class TokenData { */ public String getVpnToken() { forceVPN = true; - refresh(); //isVPN = Net.testNet(context) != 0; return VPNToken; } @@ -83,6 +97,17 @@ public class TokenData { if (tokenData == null) { tokenData = new TokenData(context); } + tokenData.context = context; // Update Context + tokenData.Caller = null; + return tokenData; + } + + public static TokenData newInstance(Context context, Object Caller) { + if (tokenData == null) { + tokenData = new TokenData(context); + } + tokenData.context = context; // Update Context + tokenData.Caller = Caller; return tokenData; } @@ -176,14 +201,31 @@ public class TokenData { * @return 操作结果 */ public int refreshTGT() { - String TGTTokenStr = StaticService.SSOLogin(context, accountData.getUsername(), accountData.getVPNPwd(),TGTToken, MFACookie); + String TGTTokenStr = StaticService.SSOLogin(context, accountData.getUsername(), accountData.getPwd(), TGTToken, MFACookie); if (TGTTokenStr.equals("ERROR2") || TGTTokenStr.equals("ERROR0")) { return -2; } if (TGTTokenStr.contains("TGT-")) { if (TGTTokenStr.contains("ERROR5")) { - setTGTToken(TGTTokenStr.substring(TGTTokenStr.indexOf(";") + 1)); - return bypass2FA(accountData.getVPNPwd(), TGTTokenStr.substring(TGTTokenStr.indexOf(";") + 1)); + String CASCookie = TGTTokenStr.substring(TGTTokenStr.indexOf(";") + 1); + setTGTToken(CASCookie); + Activity activity = this.getActivity(context); + if (activity == null) return -3; + String phoneNumber = StaticService.reAuth_sendSMSCode(context, accountData.getUsername(), CASCookie); + if (!phoneNumber.contains("ERROR")) { + reAuth_showSMSCodeDialog(activity, phoneNumber, CASCookie); + } else { + if (phoneNumber.contains("ERROR3")) { + activity.runOnUiThread(() -> { + ToastUtil.showToast(context, context.getResources().getString(R.string.login_fail_SMSCodeSend) + phoneNumber.substring(7)); + }); + } else { + activity.runOnUiThread(() -> { + ToastUtil.showToast(context, context.getResources().getString(R.string.login_fail_SMSCodeSend) + "未知错误"); + }); + } + } + return -3; } else { setTGTToken(TGTTokenStr); } @@ -193,12 +235,96 @@ public class TokenData { } } + public Activity getActivity(Context context) { + if (context == null) { + return null; + } else if (context instanceof ContextWrapper) { + if (context instanceof Activity) { + return (Activity) context; + } else { + return getActivity(((ContextWrapper) context).getBaseContext()); + } + } + + return null; + } + + private void reAuth_showSMSCodeDialog(Activity activity, String phoneNumber, String CasCookie) { + activity.runOnUiThread(() -> { + try { + AlertDialog dialog; + AlertDialog.Builder builder = new AlertDialog.Builder(activity); + dialog = builder.create(); + dialog.show(); + dialog.setCanceledOnTouchOutside(false); + dialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM); + dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); + dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); + Window window = dialog.getWindow(); + window.setContentView(R.layout.login_smscode); + TextView phoneNumberView = window + .findViewById(R.id.et_phone); + phoneNumberView.setText(phoneNumber); + Button buttonYes = window.findViewById(R.id.btn_text_yes); + Button buttonCancel = window.findViewById(R.id.btn_text_cancel); + buttonCancel.setOnClickListener(view -> { + dialog.cancel(); + }); + buttonYes.setOnClickListener(view -> { + TextView SMSCode = window + .findViewById(R.id.et_smscode); + String SMSCodeOTP = SMSCode.getText().toString(); + buttonYes.setText("正在登录"); + buttonYes.setEnabled(false); + new Thread(() -> { + int State = reAuth_SMSCode(SMSCodeOTP, CasCookie); + activity.runOnUiThread(() -> { + if (State == 0) { + dialog.dismiss(); + } else { + buttonYes.setText("登录"); + buttonYes.setEnabled(true); + } + ToastUtil.showToast(activity, State == 0 ? "验证成功" : "验证码有误"); + }); + }).start(); + }); + } catch (Exception ignore) { + + } + }); + } + + private int reAuth_SMSCode(String SMSCode, String CASCookie) { + try { + String MultiFactorAuth = StaticService.reAuth_SMSCode(context, SMSCode, CASCookie); + if (MultiFactorAuth.contains("ERROR")) { + return -1; + } else { + setMFACookie(MultiFactorAuth); + if (Caller != null) { + try { + // 反射尝试调用Update方法 (如果有) + Class ContextClass = Caller.getClass(); + Method Update = ContextClass.getMethod("update"); + Update.invoke(Caller); + } catch (Exception ignore) { + + } + } + return 0; + } + } catch (Exception ignore) { + return -1; + } + } + /** * bypass 2FA */ - private int bypass2FA(String password, String CASCookie) { + private int reAuth_Password(String password, String CASCookie) { try { - String MultiFactorAuth = StaticService.bypass2FA(context, password, CASCookie); + String MultiFactorAuth = StaticService.reAuth_Password(context, password, CASCookie); if (MultiFactorAuth.contains("ERROR")) { return -1; } else { @@ -215,7 +341,7 @@ public class TokenData { } public String getCASCookie() { - return (MFACookie != null ? MFACookie : "") + (TGTToken != null ? ((MFACookie!=null ? "; " : "")+TGTToken) : ""); + return (MFACookie != null ? MFACookie : "") + (TGTToken != null ? ((MFACookie != null ? "; " : "") + TGTToken) : ""); } public String getTGTToken() { diff --git a/app/src/main/java/top/yvyan/guettable/fragment/CourseTableFragment.java b/app/src/main/java/top/yvyan/guettable/fragment/CourseTableFragment.java index 96e229c0d2c2766b3247a1d615cc4c5b714e98bf..07d69ae5ab5d8f32c3609a5f5b356aebae2153d0 100644 --- a/app/src/main/java/top/yvyan/guettable/fragment/CourseTableFragment.java +++ b/app/src/main/java/top/yvyan/guettable/fragment/CourseTableFragment.java @@ -23,7 +23,6 @@ import com.zhuangfei.timetable.view.WeekView; import java.util.ArrayList; import java.util.List; -import java.util.Objects; import top.yvyan.guettable.R; import top.yvyan.guettable.activity.AddCourseActivity; @@ -38,8 +37,8 @@ import top.yvyan.guettable.data.SingleSettingData; import top.yvyan.guettable.service.MyOperator; import top.yvyan.guettable.util.AppUtil; import top.yvyan.guettable.util.BackgroundUtil; -import top.yvyan.guettable.util.DensityUtil; import top.yvyan.guettable.util.CourseUtil; +import top.yvyan.guettable.util.DensityUtil; import top.yvyan.guettable.util.ToastUtil; import top.yvyan.guettable.widget.WidgetUtil; @@ -53,9 +52,7 @@ public class CourseTableFragment extends Fragment implements View.OnClickListene private View view; private GeneralData generalData; - private ScheduleData scheduleData; private SingleSettingData singleSettingData; - private DetailClassData detailClassData; private SettingData settingData; //记录切换的周次,不一定是当前周 int target; @@ -73,7 +70,7 @@ public class CourseTableFragment extends Fragment implements View.OnClickListene View addStatus = view.findViewById(R.id.add_status); ViewGroup.LayoutParams lp = addStatus.getLayoutParams(); - lp.height = lp.height + AppUtil.getStatusBarHeight(Objects.requireNonNull(getContext())); + lp.height = lp.height + AppUtil.getStatusBarHeight(requireContext()); addStatus.setLayoutParams(lp); initData(); @@ -84,16 +81,14 @@ public class CourseTableFragment extends Fragment implements View.OnClickListene mWeekView = view.findViewById(R.id.id_weekview); mWeekView.setVisibility(View.VISIBLE); mTimetableView = view.findViewById(R.id.id_timetableView); - setBackground(BackgroundUtil.isSetBackground(getContext())); + setBackground(BackgroundUtil.isSetBackground(requireContext())); initTimetableView(); return view; } private void initData() { generalData = GeneralData.newInstance(getActivity()); - scheduleData = ScheduleData.newInstance(getActivity()); singleSettingData = SingleSettingData.newInstance(getActivity()); - detailClassData = DetailClassData.newInstance(); settingData = SettingData.newInstance(getActivity()); } @@ -138,8 +133,8 @@ public class CourseTableFragment extends Fragment implements View.OnClickListene } else { generalData.setWeek(target); mWeekView.curWeek(target).updateView(); - scheduleData.setUpdate(true); - WidgetUtil.notifyWidgetUpdate(this.getActivity()); + ScheduleData.setUpdate(true); + WidgetUtil.notifyWidgetUpdate(this.requireActivity()); ToastUtil.showToast(getActivity(), "设置第" + target + "周为当前周"); mTimetableView.changeWeekForce(target); } @@ -151,7 +146,7 @@ public class CourseTableFragment extends Fragment implements View.OnClickListene .curWeek(generalData.getWeek()) .maxSlideItem(12) .monthWidthDp(18) - .itemHeight(DensityUtil.dip2px(Objects.requireNonNull(getContext()), singleSettingData.getItemLength())) + .itemHeight(DensityUtil.dip2px(requireContext(), singleSettingData.getItemLength())) .callback(new OnItemBuildAdapter() { @Override public String getItemText(Schedule schedule, boolean isThisWeek) { @@ -208,27 +203,27 @@ public class CourseTableFragment extends Fragment implements View.OnClickListene @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); - if (isVisibleToUser && scheduleData != null && scheduleData.isUpdate()) { + if (isVisibleToUser && ScheduleData.isUpdate()) { updateTable(); - scheduleData.setUpdate(false); + ScheduleData.setUpdate(false); } } public void updateTable() { List schedules = new ArrayList<>(); - for (CourseBean courseBean : scheduleData.getCourseBeans()) { + for (CourseBean courseBean : ScheduleData.getCourseBeans()) { schedules.add(courseBean.getSchedule()); } - for (CourseBean courseBean : scheduleData.getUserCourseBeans()) { + for (CourseBean courseBean : ScheduleData.getUserCourseBeans()) { schedules.add(courseBean.getSchedule()); } if (settingData.getShowLibOnTable()) { - for (CourseBean courseBean : scheduleData.getLibBeans()) { + for (CourseBean courseBean : ScheduleData.getLibBeans()) { schedules.add(courseBean.getSchedule()); } } if (settingData.getShowExamOnTable()) { - for (ExamBean examBean : CourseUtil.combineExam(scheduleData.getExamBeans())) { + for (ExamBean examBean : CourseUtil.combineExam(ScheduleData.getExamBeans())) { if (examBean != null && examBean.getWeek() != 0) { schedules.add(examBean.getSchedule()); } @@ -250,7 +245,7 @@ public class CourseTableFragment extends Fragment implements View.OnClickListene * @param beans beans */ protected void display(List beans) { - detailClassData.setCourseBeans(beans); + DetailClassData.setCourseBeans(beans); Intent intent = new Intent(getContext(), DetailActivity.class); intent.putExtra("week", target); startActivityForResult(intent, DetailActivity.REQUEST_CODE); @@ -269,10 +264,10 @@ public class CourseTableFragment extends Fragment implements View.OnClickListene super.onActivityResult(requestCode, resultCode, data); if (requestCode == AddCourseActivity.REQUEST_CODE && resultCode == AddCourseActivity.ADD) { updateTable(); - scheduleData.setUpdate(true); + ScheduleData.setUpdate(true); } else if (requestCode == DetailActivity.REQUEST_CODE && resultCode == DetailActivity.ALTER) { updateTable(); - scheduleData.setUpdate(true); + ScheduleData.setUpdate(true); } } @@ -280,7 +275,7 @@ public class CourseTableFragment extends Fragment implements View.OnClickListene * 显示弹出菜单 */ public void showPopMenu() { - PopupMenu popup = new PopupMenu(Objects.requireNonNull(getActivity()), moreButton); + PopupMenu popup = new PopupMenu(requireActivity(), moreButton); popup.getMenuInflater().inflate(R.menu.course_table_popmenu, popup.getMenu()); if (singleSettingData.isHideOtherWeek()) { popup.getMenu().findItem(R.id.course_tab_top1).setTitle("显示非本周课程"); diff --git a/app/src/main/java/top/yvyan/guettable/fragment/DayClassFragment.java b/app/src/main/java/top/yvyan/guettable/fragment/DayClassFragment.java index 5ead4528e8777c5bd02875c0a70d8573a5d27b3b..e5dbcdb06b820ef8f0e683cee4c261d26a963de1 100644 --- a/app/src/main/java/top/yvyan/guettable/fragment/DayClassFragment.java +++ b/app/src/main/java/top/yvyan/guettable/fragment/DayClassFragment.java @@ -68,7 +68,6 @@ public class DayClassFragment extends Fragment implements View.OnClickListener { private AccountData accountData; private GeneralData generalData; private SettingData settingData; - private ScheduleData scheduleData; public static DayClassFragment newInstance() { return new DayClassFragment(); @@ -86,9 +85,9 @@ public class DayClassFragment extends Fragment implements View.OnClickListener { @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); - if (isVisibleToUser && scheduleData != null && scheduleData.isUpdate()) { + if (isVisibleToUser && ScheduleData.isUpdate()) { onStart(); - scheduleData.setUpdate(false); + ScheduleData.setUpdate(false); } } @@ -132,7 +131,6 @@ public class DayClassFragment extends Fragment implements View.OnClickListener { accountData = AccountData.newInstance(getActivity()); generalData = GeneralData.newInstance(getActivity()); settingData = SettingData.newInstance(getActivity()); - scheduleData = ScheduleData.newInstance(getActivity()); } /** @@ -172,7 +170,7 @@ public class DayClassFragment extends Fragment implements View.OnClickListener { //更新考试剩余时间信息 try { - List examBeans = scheduleData.getExamBeans(); + List examBeans = ScheduleData.getExamBeans(); examBeans = CourseUtil.combineExam(examBeans); examBeans = CourseUtil.ridOfOutdatedExam(examBeans); if (examBeans.size() != 0) { @@ -261,24 +259,20 @@ public class DayClassFragment extends Fragment implements View.OnClickListener { */ private List getData() { List list; - //防止出现空指针闪退 - if (scheduleData == null) { - initData(); - } - if (!scheduleData.getCourseBeans().isEmpty()) { - list = ScheduleSupport.transform(scheduleData.getCourseBeans()); + if (!ScheduleData.getCourseBeans().isEmpty()) { + list = ScheduleSupport.transform(ScheduleData.getCourseBeans()); } else { list = new ArrayList<>(); } - for (CourseBean courseBean : scheduleData.getUserCourseBeans()) { + for (CourseBean courseBean : ScheduleData.getUserCourseBeans()) { list.add(courseBean.getSchedule()); } if (settingData.getShowLibOnTable()) { - List labList = ScheduleSupport.transform(scheduleData.getLibBeans()); + List labList = ScheduleSupport.transform(ScheduleData.getLibBeans()); list.addAll(labList); } if (settingData.getShowExamOnTable()) { - for (ExamBean examBean : CourseUtil.combineExam(scheduleData.getExamBeans())) { + for (ExamBean examBean : CourseUtil.combineExam(ScheduleData.getExamBeans())) { if (examBean != null && examBean.getWeek() != 0) { list.add(examBean.getSchedule()); } diff --git a/app/src/main/java/top/yvyan/guettable/fragment/MoreFragment.java b/app/src/main/java/top/yvyan/guettable/fragment/MoreFragment.java index a876d3146b0308d0a8d04adea47f5bf728ff75a7..6cf9169c507d61c887be3b6558771c8ad443bb11 100644 --- a/app/src/main/java/top/yvyan/guettable/fragment/MoreFragment.java +++ b/app/src/main/java/top/yvyan/guettable/fragment/MoreFragment.java @@ -21,7 +21,6 @@ import top.yvyan.guettable.moreFun.GradesActivity; import top.yvyan.guettable.moreFun.LibActivity; import top.yvyan.guettable.moreFun.MoreUrlActivity; import top.yvyan.guettable.moreFun.PlannedCoursesActivity; -import top.yvyan.guettable.moreFun.QQGroupActivity; import top.yvyan.guettable.moreFun.ResitActivity; import top.yvyan.guettable.moreFun.SelectedCourseActivity; import top.yvyan.guettable.service.CommFunc; @@ -183,8 +182,7 @@ public class MoreFragment extends Fragment implements View.OnClickListener { requireContext().getResources().getString(R.string.url_empty_room_vpn)); break; case R.id.more_qq_group: - intent = new Intent(getContext(), QQGroupActivity.class); - startActivity(intent); + openBrowser(requireContext().getResources().getString(R.string.url_add_group)); break; diff --git a/app/src/main/java/top/yvyan/guettable/moreFun/BaseFuncActivity.java b/app/src/main/java/top/yvyan/guettable/moreFun/BaseFuncActivity.java index bc34d570464441052c51e202af9860803f0f2bcd..9ec51ad5dccf7f4e861fd91322550d09d04b1b80 100644 --- a/app/src/main/java/top/yvyan/guettable/moreFun/BaseFuncActivity.java +++ b/app/src/main/java/top/yvyan/guettable/moreFun/BaseFuncActivity.java @@ -23,6 +23,10 @@ import top.yvyan.guettable.util.BackgroundUtil; public abstract class BaseFuncActivity extends AppCompatActivity implements IMoreFun { @SuppressLint("NonConstantResourceId") + + protected boolean update = true; + protected int stateNum = -1; + @SuppressLint("NonConstantResourceId") @BindView(R.id.state) TextView state; @SuppressLint("NonConstantResourceId") @@ -34,9 +38,6 @@ public abstract class BaseFuncActivity extends AppCompatActivity implements IMor @SuppressLint("NonConstantResourceId") @BindView(R.id.func_base_constraintLayout) ConstraintLayout header; - @SuppressLint("NonConstantResourceId") - - protected boolean update = true; @Override protected void onCreate(Bundle savedInstanceState) { @@ -47,6 +48,7 @@ public abstract class BaseFuncActivity extends AppCompatActivity implements IMor ButterKnife.bind(this); more.setVisibility(View.GONE); more.setOnClickListener(this::showPopMenu); + state.setOnClickListener(this::stateOnClick); init(); header.getBackground().setAlpha(255); BackgroundUtil.setFullAlphaStatus(this); @@ -111,12 +113,21 @@ public abstract class BaseFuncActivity extends AppCompatActivity implements IMor @Override public void updateView(String hint, int stateNum) { + this.stateNum = stateNum; state.setText(hint); if (stateNum == 5 && update) { showContent(); } } + protected void stateOnClick(View view) { + if (this.stateNum != 5) { + if (this.stateNum == -3) { + this.init(); // 调用init方法重新获取验证码 + } + } + } + /** * 子类init (不包含设置内容视图) */ diff --git a/app/src/main/java/top/yvyan/guettable/moreFun/CETActivity.java b/app/src/main/java/top/yvyan/guettable/moreFun/CETActivity.java index 7d169f8dc0d2c52c3f26cd59849b562b2484dc17..d2d7c8535e71b3fdcd359aa4be4d822b19a45ae2 100644 --- a/app/src/main/java/top/yvyan/guettable/moreFun/CETActivity.java +++ b/app/src/main/java/top/yvyan/guettable/moreFun/CETActivity.java @@ -9,7 +9,7 @@ import java.util.List; import top.yvyan.guettable.R; import top.yvyan.guettable.adapter.CETAdapter; import top.yvyan.guettable.bean.CETBean; -import top.yvyan.guettable.data.MoreDate; +import top.yvyan.guettable.data.MoreData; import top.yvyan.guettable.service.fetch.StaticService; import top.yvyan.guettable.util.AppUtil; import top.yvyan.guettable.util.CourseUtil; @@ -18,22 +18,18 @@ import static com.xuexiang.xui.XUI.getContext; public class CETActivity extends BaseFuncActivity { - private MoreDate moreDate; - @Override protected void childInit() { setTitle(getResources().getString(R.string.moreFun_cet)); setShowMore(false); AppUtil.reportFunc(getApplicationContext(), getString(R.string.moreFun_cet)); - - moreDate = MoreDate.newInstance(getApplicationContext()); } @Override protected void showContent() { baseSetContentView(R.layout.recycler_view); RecyclerView recyclerView = findViewById(R.id.recycler_view_info); - List cetBeans = moreDate.getCetBeans(); + List cetBeans = MoreData.getCetBeans(); if (cetBeans.size() == 0) { showEmptyPage(); } else { @@ -50,8 +46,8 @@ public class CETActivity extends BaseFuncActivity { if (cetBeans != null) { CourseUtil.BeanAttributeUtil beanAttributeUtil = new CourseUtil.BeanAttributeUtil(); Collections.sort(cetBeans, beanAttributeUtil); - if (!AppUtil.equalList(cetBeans, moreDate.getCetBeans())) { - moreDate.setCetBeans(cetBeans); + if (!AppUtil.equalList(cetBeans, MoreData.getCetBeans())) { + MoreData.setCetBeans(cetBeans); } return 5; } diff --git a/app/src/main/java/top/yvyan/guettable/moreFun/ExamActivity.java b/app/src/main/java/top/yvyan/guettable/moreFun/ExamActivity.java index 3086f2438c5b9b37f9e57eb5e55c188dcd36950e..fb74955db6bd5991ca25081b2c7bc099140eccc6 100644 --- a/app/src/main/java/top/yvyan/guettable/moreFun/ExamActivity.java +++ b/app/src/main/java/top/yvyan/guettable/moreFun/ExamActivity.java @@ -27,7 +27,6 @@ import static com.xuexiang.xui.XUI.getContext; public class ExamActivity extends BaseFuncActivity { private GeneralData generalData; - private ScheduleData scheduleData; private SingleSettingData singleSettingData; @Override @@ -38,7 +37,6 @@ public class ExamActivity extends BaseFuncActivity { AppUtil.reportFunc(getApplicationContext(), getString(R.string.moreFun_test_schedule)); generalData = GeneralData.newInstance(this); - scheduleData = ScheduleData.newInstance(this); singleSettingData = SingleSettingData.newInstance(this); } @@ -46,7 +44,7 @@ public class ExamActivity extends BaseFuncActivity { protected void showContent() { baseSetContentView(R.layout.recycler_view); RecyclerView recyclerView = findViewById(R.id.recycler_view_info); - List examBeans = scheduleData.getExamBeans(); + List examBeans = ScheduleData.getExamBeans(); if (singleSettingData.isCombineExam()) { examBeans = CourseUtil.combineExam(examBeans); } @@ -118,10 +116,10 @@ public class ExamActivity extends BaseFuncActivity { if (examBeans != null) { CourseUtil.BeanAttributeUtil beanAttributeUtil = new CourseUtil.BeanAttributeUtil(); Collections.sort(examBeans, beanAttributeUtil); - if (!AppUtil.equalList(examBeans, scheduleData.getExamBeans())) { - scheduleData.setExamBeans(examBeans); + if (!AppUtil.equalList(examBeans, ScheduleData.getExamBeans())) { + ScheduleData.setExamBeans(examBeans); update = true; - scheduleData.setUpdate(true); + ScheduleData.setUpdate(true); } return 5; } diff --git a/app/src/main/java/top/yvyan/guettable/moreFun/ExamScoreActivity.java b/app/src/main/java/top/yvyan/guettable/moreFun/ExamScoreActivity.java index 1a82385305737808d8c73950769078d59533baf4..3ee922b6b449f97829b8ac7dcf9f9f5c0e7791da 100644 --- a/app/src/main/java/top/yvyan/guettable/moreFun/ExamScoreActivity.java +++ b/app/src/main/java/top/yvyan/guettable/moreFun/ExamScoreActivity.java @@ -13,7 +13,7 @@ import top.yvyan.guettable.R; import top.yvyan.guettable.adapter.ExamScoreAdapter; import top.yvyan.guettable.bean.ExamScoreBean; import top.yvyan.guettable.data.GeneralData; -import top.yvyan.guettable.data.MoreDate; +import top.yvyan.guettable.data.MoreData; import top.yvyan.guettable.data.SingleSettingData; import top.yvyan.guettable.service.fetch.StaticService; import top.yvyan.guettable.util.AppUtil; @@ -23,7 +23,6 @@ import static com.xuexiang.xui.XUI.getContext; public class ExamScoreActivity extends BaseFuncActivity { - private MoreDate moreDate; private GeneralData generalData; private SingleSettingData singleSettingData; @@ -34,7 +33,6 @@ public class ExamScoreActivity extends BaseFuncActivity { openUpdate(); AppUtil.reportFunc(getApplicationContext(), getString(R.string.moreFun_test_scores)); - moreDate = MoreDate.newInstance(this); generalData = GeneralData.newInstance(this); singleSettingData = SingleSettingData.newInstance(this); } @@ -43,7 +41,7 @@ public class ExamScoreActivity extends BaseFuncActivity { protected void showContent() { baseSetContentView(R.layout.activity_exam_score); RecyclerView recyclerView = findViewById(R.id.exam_score_info_recycler_view); - List examScoreBeans = moreDate.getExamScoreBeans(); + List examScoreBeans = MoreData.getExamScoreBeans(); if (singleSettingData.isHideOtherTermExamScore()) { examScoreBeans = CourseUtil.BeanAttributeUtil.hideOtherTerm(examScoreBeans, generalData.getTerm()); } @@ -88,8 +86,8 @@ public class ExamScoreActivity extends BaseFuncActivity { if (examScoreBeans != null) { CourseUtil.BeanAttributeUtil beanAttributeUtil = new CourseUtil.BeanAttributeUtil(); Collections.sort(examScoreBeans, beanAttributeUtil); - if (!AppUtil.equalList(examScoreBeans, moreDate.getExamScoreBeans())) { - moreDate.setExamScoreBeans(examScoreBeans); + if (!AppUtil.equalList(examScoreBeans, MoreData.getExamScoreBeans())) { + MoreData.setExamScoreBeans(examScoreBeans); update = true; } return 5; diff --git a/app/src/main/java/top/yvyan/guettable/moreFun/ExperimentScoreActivity.java b/app/src/main/java/top/yvyan/guettable/moreFun/ExperimentScoreActivity.java index 301fcab0e8362bc84e8b666979d1a4fe26c5b38a..76eb4c436a03d723cee1a980290bd5d75c5647f1 100644 --- a/app/src/main/java/top/yvyan/guettable/moreFun/ExperimentScoreActivity.java +++ b/app/src/main/java/top/yvyan/guettable/moreFun/ExperimentScoreActivity.java @@ -13,7 +13,7 @@ import top.yvyan.guettable.R; import top.yvyan.guettable.adapter.ExperimentScoreAdapter; import top.yvyan.guettable.bean.ExperimentScoreBean; import top.yvyan.guettable.data.GeneralData; -import top.yvyan.guettable.data.MoreDate; +import top.yvyan.guettable.data.MoreData; import top.yvyan.guettable.data.SingleSettingData; import top.yvyan.guettable.service.fetch.StaticService; import top.yvyan.guettable.util.AppUtil; @@ -23,7 +23,6 @@ import static com.xuexiang.xui.XUI.getContext; public class ExperimentScoreActivity extends BaseFuncActivity { - private MoreDate moreDate; private GeneralData generalData; private SingleSettingData singleSettingData; @@ -34,7 +33,6 @@ public class ExperimentScoreActivity extends BaseFuncActivity { openUpdate(); AppUtil.reportFunc(getApplicationContext(), getString(R.string.moreFun_lib_scores)); - moreDate = MoreDate.newInstance(this); generalData = GeneralData.newInstance(this); singleSettingData = SingleSettingData.newInstance(this); } @@ -43,7 +41,7 @@ public class ExperimentScoreActivity extends BaseFuncActivity { protected void showContent() { baseSetContentView(R.layout.activity_experiment_score); RecyclerView recyclerView = findViewById(R.id.experiment_score_info_recycler_view); - List experimentScoreBeans = moreDate.getExperimentScoreBeans(); + List experimentScoreBeans = MoreData.getExperimentScoreBeans(); if (singleSettingData.isHideOtherTermExamScore()) { experimentScoreBeans = CourseUtil.BeanAttributeUtil.hideOtherTerm(experimentScoreBeans, generalData.getTerm()); } @@ -88,8 +86,8 @@ public class ExperimentScoreActivity extends BaseFuncActivity { if (experimentScoreBeans != null) { CourseUtil.BeanAttributeUtil beanAttributeUtil = new CourseUtil.BeanAttributeUtil(); Collections.sort(experimentScoreBeans, beanAttributeUtil); - if (!AppUtil.equalList(experimentScoreBeans, moreDate.getExperimentScoreBeans())) { - moreDate.setExperimentScoreBeans(experimentScoreBeans); + if (!AppUtil.equalList(experimentScoreBeans, MoreData.getExperimentScoreBeans())) { + MoreData.setExperimentScoreBeans(experimentScoreBeans); update = true; } return 5; diff --git a/app/src/main/java/top/yvyan/guettable/moreFun/GradesActivity.java b/app/src/main/java/top/yvyan/guettable/moreFun/GradesActivity.java index 4e04b0b3c60306a93316c52a28a4a667b9b6f9da..519f2680f7d8a51182e37136782f677601572cea 100644 --- a/app/src/main/java/top/yvyan/guettable/moreFun/GradesActivity.java +++ b/app/src/main/java/top/yvyan/guettable/moreFun/GradesActivity.java @@ -6,15 +6,13 @@ import java.text.DecimalFormat; import top.yvyan.guettable.R; import top.yvyan.guettable.data.GeneralData; -import top.yvyan.guettable.data.MoreDate; +import top.yvyan.guettable.data.MoreData; import top.yvyan.guettable.service.fetch.StaticService; import top.yvyan.guettable.util.AppUtil; public class GradesActivity extends BaseFuncActivity { private GeneralData generalData; - private MoreDate moreDate; - @Override protected void childInit() { @@ -23,7 +21,6 @@ public class GradesActivity extends BaseFuncActivity { AppUtil.reportFunc(getApplicationContext(), getString(R.string.moreFun_credits)); generalData = GeneralData.newInstance(this); - moreDate = MoreDate.newInstance(this); } @Override @@ -37,7 +34,7 @@ public class GradesActivity extends BaseFuncActivity { TextView gradesYear5 = findViewById(R.id.grades_year_5); TextView gradesYear6 = findViewById(R.id.grades_year_6); - float[] grades = moreDate.getGrades(); + float[] grades = MoreData.getGrades(); DecimalFormat format = new DecimalFormat("0.00"); gradesMain.setText(format.format(grades[0])); gradesYear1.setText(format.format(grades[1])); @@ -52,7 +49,7 @@ public class GradesActivity extends BaseFuncActivity { public int updateData(String cookie) { float[] grades = StaticService.calculateGrades(this, cookie, Integer.parseInt(generalData.getGrade())); if (grades != null) { - moreDate.setGrades(grades); + MoreData.setGrades(grades); return 5; } else { return 1; diff --git a/app/src/main/java/top/yvyan/guettable/moreFun/LibActivity.java b/app/src/main/java/top/yvyan/guettable/moreFun/LibActivity.java index d7b3c927ce374a5fd1fbe9cf0a339d8f7fdee1f5..3484ba1abd2c9b2e22adc417e90063bb160e87f7 100644 --- a/app/src/main/java/top/yvyan/guettable/moreFun/LibActivity.java +++ b/app/src/main/java/top/yvyan/guettable/moreFun/LibActivity.java @@ -20,7 +20,6 @@ import static com.xuexiang.xui.XUI.getContext; public class LibActivity extends BaseFuncActivity { - private ScheduleData scheduleData; private GeneralData generalData; @Override @@ -28,7 +27,6 @@ public class LibActivity extends BaseFuncActivity { setTitle(getResources().getString(R.string.moreFun_lib_schedule)); AppUtil.reportFunc(getApplicationContext(), getString(R.string.moreFun_lib_schedule)); - scheduleData = ScheduleData.newInstance(this); generalData = GeneralData.newInstance(this); } @@ -36,7 +34,7 @@ public class LibActivity extends BaseFuncActivity { protected void showContent() { baseSetContentView(R.layout.recycler_view); RecyclerView recyclerView = findViewById(R.id.recycler_view_info); - List libBeans = scheduleData.getLibBeans(); + List libBeans = ScheduleData.getLibBeans(); if (libBeans.size() == 0) { showEmptyPage(); } else { @@ -51,8 +49,8 @@ public class LibActivity extends BaseFuncActivity { public int updateData(String cookie) { List libBeans = StaticService.getLab(this, cookie, generalData.getTerm()); if (libBeans != null) { - scheduleData.setLibBeans(libBeans); - scheduleData.setUpdate(true); + ScheduleData.setLibBeans(libBeans); + ScheduleData.setUpdate(true); return 5; } return 1; diff --git a/app/src/main/java/top/yvyan/guettable/moreFun/MoreUrlActivity.java b/app/src/main/java/top/yvyan/guettable/moreFun/MoreUrlActivity.java index 59c5c6cb8c827f114a0c642384e2809e9410304d..ff06c642d587df2f6528b4cef14f805fd18dc4d3 100644 --- a/app/src/main/java/top/yvyan/guettable/moreFun/MoreUrlActivity.java +++ b/app/src/main/java/top/yvyan/guettable/moreFun/MoreUrlActivity.java @@ -88,12 +88,4 @@ public class MoreUrlActivity extends AppCompatActivity { getResources().getString(R.string.url_staff_vpn), null); } - - public void news1(View view) { - openBrowser(getResources().getString(R.string.url_news_1)); - } - - public void news2(View view) { - openBrowser(getResources().getString(R.string.url_new_2)); - } } \ No newline at end of file diff --git a/app/src/main/java/top/yvyan/guettable/moreFun/PlannedCoursesActivity.java b/app/src/main/java/top/yvyan/guettable/moreFun/PlannedCoursesActivity.java index b413ee4fb808306d01f752e4b90619e8b6a227b8..6632af2611f297ecb2dabe6bf8b4cb3fa40746b0 100644 --- a/app/src/main/java/top/yvyan/guettable/moreFun/PlannedCoursesActivity.java +++ b/app/src/main/java/top/yvyan/guettable/moreFun/PlannedCoursesActivity.java @@ -11,7 +11,7 @@ import java.util.List; import top.yvyan.guettable.R; import top.yvyan.guettable.adapter.PlannedCourseAdapter; import top.yvyan.guettable.bean.PlannedCourseBean; -import top.yvyan.guettable.data.MoreDate; +import top.yvyan.guettable.data.MoreData; import top.yvyan.guettable.data.SingleSettingData; import top.yvyan.guettable.service.fetch.StaticService; import top.yvyan.guettable.util.AppUtil; @@ -21,7 +21,6 @@ import static com.xuexiang.xui.XUI.getContext; public class PlannedCoursesActivity extends BaseFuncActivity { - private MoreDate moreDate; private SingleSettingData singleSettingData; @Override @@ -31,7 +30,6 @@ public class PlannedCoursesActivity extends BaseFuncActivity { openUpdate(); AppUtil.reportFunc(getApplicationContext(), getString(R.string.moreFun_plan_courses)); - moreDate = MoreDate.newInstance(this); singleSettingData = SingleSettingData.newInstance(this); } @@ -39,7 +37,7 @@ public class PlannedCoursesActivity extends BaseFuncActivity { protected void showContent() { baseSetContentView(R.layout.activity_planned_courses); RecyclerView recyclerView = findViewById(R.id.planned_course_info_recycler_view); - List plannedCourseBeans = moreDate.getPlannedCourseBeans(); + List plannedCourseBeans = MoreData.getPlannedCourseBeans(); if (singleSettingData.isHideRepeatScore()) { plannedCourseBeans = CourseUtil.ridRepeatScore(plannedCourseBeans); } @@ -81,8 +79,8 @@ public class PlannedCoursesActivity extends BaseFuncActivity { public int updateData(String cookie) { List plannedCourseBeans = StaticService.getPlannedCourseBeans(this, cookie); if (plannedCourseBeans != null) { - if (!AppUtil.equalList(plannedCourseBeans, moreDate.getPlannedCourseBeans())) { - moreDate.setPlannedCourseBeans(plannedCourseBeans); + if (!AppUtil.equalList(plannedCourseBeans, MoreData.getPlannedCourseBeans())) { + MoreData.setPlannedCourseBeans(plannedCourseBeans); update = true; } return 5; diff --git a/app/src/main/java/top/yvyan/guettable/moreFun/QQGroupActivity.java b/app/src/main/java/top/yvyan/guettable/moreFun/QQGroupActivity.java deleted file mode 100644 index 0c4527cb3f48dc2b7ff1cc644ec54d32ad4c05f5..0000000000000000000000000000000000000000 --- a/app/src/main/java/top/yvyan/guettable/moreFun/QQGroupActivity.java +++ /dev/null @@ -1,80 +0,0 @@ -package top.yvyan.guettable.moreFun; - -import android.content.Context; -import android.os.Bundle; -import android.view.View; -import android.widget.TextView; - -import androidx.appcompat.app.AppCompatActivity; -import androidx.constraintlayout.widget.ConstraintLayout; - -import com.umeng.analytics.MobclickAgent; -import com.umeng.cconfig.UMRemoteConfig; - -import java.util.HashMap; -import java.util.Map; - -import top.yvyan.guettable.R; -import top.yvyan.guettable.data.SingleSettingData; -import top.yvyan.guettable.util.AppUtil; -import top.yvyan.guettable.util.BackgroundUtil; -import top.yvyan.guettable.util.DialogUtil; - -public class QQGroupActivity extends AppCompatActivity { - private String setting; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - SingleSettingData singleSettingData = SingleSettingData.newInstance(this); - BackgroundUtil.setPageTheme(this, singleSettingData.getThemeId()); - setContentView(R.layout.activity_q_q_group); - - ConstraintLayout header = findViewById(R.id.func_base_constraintLayout); - header.getBackground().setAlpha(255); - - BackgroundUtil.setFullAlphaStatus(this); - - TextView title = findViewById(R.id.title); - title.setText(getString(R.string.moreFun_qqGroup)); - AppUtil.reportFunc(getApplicationContext(), getString(R.string.moreFun_qqGroup)); - - setting = UMRemoteConfig.getInstance().getConfigValue("groupSetting"); - } - - public void doBack(View view) { - finish(); - } - - public void report(Context context, String funcName) { - Map funcMap = new HashMap<>(); - funcMap.put("name", funcName); - MobclickAgent.onEventObject(context, "addGroup", funcMap); - } - - public void addGroup(String name, String key, int num) { - report(this, name); - if (setting.charAt(num) == '1') { - DialogUtil.showTextDialog(this, "该群因违反协议,已被禁止!"); - } else { - AppUtil.joinQQGroup(key, this); - } - } - - public void guetClassTable(View view) { - addGroup(getResources().getString(R.string.text_guet_class_table), getResources().getString(R.string.key_guet_class_table), 0); - } - - public void guetClassTable2(View view) { - addGroup(getResources().getString(R.string.text_guet_class_table2), getResources().getString(R.string.key_guet_class_table2), 4); - } - - public void guetFind3(View view) { - addGroup(getResources().getString(R.string.text_guet_find_3), getResources().getString(R.string.key_guet_find_3), 1); - } - - public void stdioMusic(View view) { - addGroup(getResources().getString(R.string.text_stdio_music), getResources().getString(R.string.key_stdio_music), 3); - } - -} \ No newline at end of file diff --git a/app/src/main/java/top/yvyan/guettable/moreFun/ResitActivity.java b/app/src/main/java/top/yvyan/guettable/moreFun/ResitActivity.java index 72b9811764d122049d187fbbaa62bb636d08e240..c09107233c5c928f6aebd173186d6fdbfaa04124 100644 --- a/app/src/main/java/top/yvyan/guettable/moreFun/ResitActivity.java +++ b/app/src/main/java/top/yvyan/guettable/moreFun/ResitActivity.java @@ -8,7 +8,7 @@ import java.util.List; import top.yvyan.guettable.R; import top.yvyan.guettable.adapter.ResitAdapter; import top.yvyan.guettable.bean.ResitBean; -import top.yvyan.guettable.data.MoreDate; +import top.yvyan.guettable.data.MoreData; import top.yvyan.guettable.service.fetch.StaticService; import top.yvyan.guettable.util.AppUtil; @@ -16,22 +16,18 @@ import static com.xuexiang.xui.XUI.getContext; public class ResitActivity extends BaseFuncActivity { - private MoreDate moreDate; - @Override protected void childInit() { setTitle(getResources().getString(R.string.moreFun_resit_schedule)); openUpdate(); AppUtil.reportFunc(getApplicationContext(), getString(R.string.moreFun_resit_schedule)); - - moreDate = MoreDate.newInstance(getApplicationContext()); } @Override protected void showContent() { baseSetContentView(R.layout.recycler_view); RecyclerView recyclerView = findViewById(R.id.recycler_view_info); - List resitBeans = moreDate.getResitBeans(); + List resitBeans = MoreData.getResitBeans(); if (resitBeans.size() == 0) { showEmptyPage(); } else { @@ -45,8 +41,8 @@ public class ResitActivity extends BaseFuncActivity { public int updateData(String cookie) { List resitBeans = StaticService.getResit(this, cookie); if (resitBeans != null) { - if (!AppUtil.equalList(resitBeans, moreDate.getResitBeans())) { - moreDate.setResitBeans(resitBeans); + if (!AppUtil.equalList(resitBeans, MoreData.getResitBeans())) { + MoreData.setResitBeans(resitBeans); update = true; } return 5; diff --git a/app/src/main/java/top/yvyan/guettable/moreFun/SelectedCourseActivity.java b/app/src/main/java/top/yvyan/guettable/moreFun/SelectedCourseActivity.java index 99f6b9d128a2d6ad3c882a5ea9b2a1b5af8d550f..58a7124e64608fd661e3740e0a64e7b5f1fafd5a 100644 --- a/app/src/main/java/top/yvyan/guettable/moreFun/SelectedCourseActivity.java +++ b/app/src/main/java/top/yvyan/guettable/moreFun/SelectedCourseActivity.java @@ -15,7 +15,7 @@ import top.yvyan.guettable.adapter.SelectedCourseAdapter; import top.yvyan.guettable.bean.SelectedCourseBean; import top.yvyan.guettable.bean.TermBean; import top.yvyan.guettable.data.GeneralData; -import top.yvyan.guettable.data.MoreDate; +import top.yvyan.guettable.data.MoreData; import top.yvyan.guettable.data.TokenData; import top.yvyan.guettable.service.IMoreFun; import top.yvyan.guettable.service.fetch.StaticService; @@ -26,7 +26,6 @@ public class SelectedCourseActivity extends BaseFuncActivity implements IMoreFun private GeneralData generalData; private TokenData tokenData; - private MoreDate moreDate; private MaterialSpinner spinner; private SelectedCourseAdapter adapter; private List terms; @@ -40,7 +39,6 @@ public class SelectedCourseActivity extends BaseFuncActivity implements IMoreFun setShowMore(false); generalData = GeneralData.newInstance(this); tokenData = TokenData.newInstance(this); - moreDate = MoreDate.newInstance(this); terms = new ArrayList<>(); curTerm = generalData.getTerm(); } @@ -48,7 +46,7 @@ public class SelectedCourseActivity extends BaseFuncActivity implements IMoreFun @Override protected void showContent() { baseSetContentView(R.layout.activity_selected_course); - List selectedCourseBeans = moreDate.getSelectedCourseBeans(); + List selectedCourseBeans = MoreData.getSelectedCourseBeans(); spinner = findViewById(R.id.spinner_course_term); rv = findViewById(R.id.rv_selected_course); rv.setLayoutManager(new LinearLayoutManager(this)); @@ -85,7 +83,7 @@ public class SelectedCourseActivity extends BaseFuncActivity implements IMoreFun if (selectedCourseBeans != null) { CourseUtil.BeanAttributeUtil beanAttributeUtil = new CourseUtil.BeanAttributeUtil(); Collections.sort(selectedCourseBeans, beanAttributeUtil); - moreDate.setSelectedCoursesBeans(selectedCourseBeans); + MoreData.setSelectedCoursesBeans(selectedCourseBeans); update = true; return 5; } @@ -121,7 +119,7 @@ public class SelectedCourseActivity extends BaseFuncActivity implements IMoreFun // 初始化学期集合 private void initTerm() { - List termBeans = moreDate.getTermBeans(); + List termBeans = MoreData.getTermBeans(); String grade = generalData.getGrade(); if (grade == null) { return; @@ -139,7 +137,7 @@ public class SelectedCourseActivity extends BaseFuncActivity implements IMoreFun new Thread(() -> { List allTerm = StaticService.getTerms(this, tokenData.getCookie()); if (allTerm != null) { - moreDate.setTermBeans(allTerm); + MoreData.setTermBeans(allTerm); terms.clear(); for (int i = 0; i < allTerm.size(); i++) { String substring = allTerm.get(i).getTerm().substring(0, 4); diff --git a/app/src/main/java/top/yvyan/guettable/service/AutoUpdate.java b/app/src/main/java/top/yvyan/guettable/service/AutoUpdate.java index 28f7b6df858bb4c56848ce7a6530236110481acc..91316266a5de12f3002eb4d9bd8d6893e5a82432 100644 --- a/app/src/main/java/top/yvyan/guettable/service/AutoUpdate.java +++ b/app/src/main/java/top/yvyan/guettable/service/AutoUpdate.java @@ -29,7 +29,6 @@ public class AutoUpdate { private final DayClassFragment fragment; private final AccountData accountData; - private final ScheduleData scheduleData; private final GeneralData generalData; private final TokenData tokenData; private final SettingData settingData; @@ -40,9 +39,8 @@ public class AutoUpdate { this.fragment = fragment; this.activity = fragment.getActivity(); accountData = AccountData.newInstance(activity); - scheduleData = ScheduleData.newInstance(activity); generalData = GeneralData.newInstance(activity); - tokenData = TokenData.newInstance(activity); + tokenData = TokenData.newInstance(activity,this); settingData = SettingData.newInstance(activity); init(); } @@ -74,8 +72,8 @@ public class AutoUpdate { * 启动同步 */ public void update() { - // 判断状态是否符合;合适的状态:就绪 网络错误 同步成功(点击同步) - if (state == 0 || state == -2 || state == 5) { + // 判断状态是否符合;合适的状态:就绪 登录失效 网络错误 同步成功(点击同步) + if (state == 0 || state == -2 || state == -3 || state == 5) { update_thread(); } } @@ -104,6 +102,9 @@ public class AutoUpdate { case -2: text = "网络错误"; break; + case -3: + text = "登录失效(点击重试)"; + break; case 91: text = "尝试同步理论课"; break; @@ -153,7 +154,7 @@ public class AutoUpdate { ); if (getClass != null) { courseBeans = getClass; - scheduleData.setCourseBeans(courseBeans); + ScheduleData.setCourseBeans(courseBeans); } else { updateView(92); state = tokenData.refresh(); @@ -170,7 +171,7 @@ public class AutoUpdate { ); if (getClass != null) { courseBeans = getClass; - scheduleData.setCourseBeans(courseBeans); + ScheduleData.setCourseBeans(courseBeans); } else { updateView(3); return; @@ -186,7 +187,7 @@ public class AutoUpdate { if (examBeans != null) { CourseUtil.BeanAttributeUtil beanAttributeUtil = new CourseUtil.BeanAttributeUtil(); Collections.sort(examBeans, beanAttributeUtil); - scheduleData.setExamBeans(examBeans); + ScheduleData.setExamBeans(examBeans); } else { updateView(3); return; @@ -200,10 +201,10 @@ public class AutoUpdate { ); if (getLab != null) { updateView(5); - scheduleData.setLibBeans(getLab); - scheduleData.setUpdate(true); + ScheduleData.setLibBeans(getLab); + ScheduleData.setUpdate(true); generalData.setLastUpdateTime(System.currentTimeMillis()); - int maxWeek = scheduleData.getMaxWeek(); + int maxWeek = ScheduleData.getMaxWeek(); if (maxWeek > generalData.getMaxWeek()) { generalData.setMaxWeek(maxWeek); } diff --git a/app/src/main/java/top/yvyan/guettable/service/CommFunc.java b/app/src/main/java/top/yvyan/guettable/service/CommFunc.java index f6fa2cfb20ad01ef399357a57bdb1396f16d5f16..7db6624cd080a0b17020216b7c1de85dd87c1611 100644 --- a/app/src/main/java/top/yvyan/guettable/service/CommFunc.java +++ b/app/src/main/java/top/yvyan/guettable/service/CommFunc.java @@ -106,7 +106,16 @@ public class CommFunc { final AlertDialog[] dialog = new AlertDialog[1]; activity.runOnUiThread(() -> dialog[0] = DialogUtil.setTextDialog(activity, "自动登录中...(最长需要15s)", "跳过", iDialogService, true)); - tokenData.refresh(); + int LoginState = tokenData.refresh(); + if (LoginState == -3) { + activity.runOnUiThread(() -> { + if (dialog[0] != null && dialog[0].isShowing()) { + dialog[0].dismiss(); + } + ToastUtil.showToast(activity, "登录状态丢失,请输入验证码后稍后重试"); + }); + return; + } if (!noLogin[0]) { activity.runOnUiThread(() -> { if (dialog[0] != null && dialog[0].isShowing()) { @@ -151,7 +160,17 @@ public class CommFunc { final AlertDialog[] dialog = new AlertDialog[1]; activity.runOnUiThread(() -> dialog[0] = DialogUtil.setTextDialog(activity, "自动登录中...(最长需要15s)", "跳过", iDialogService, true)); - tokenData.refresh(); + int LoginState = tokenData.refresh(); + if (LoginState == -3) { + activity.runOnUiThread(() -> { + if (dialog[0] != null && dialog[0].isShowing()) { + dialog[0].dismiss(); + } + ToastUtil.showToast(activity, "登录状态丢失,请输入验证码后稍后重试"); + }); + return; + } + if (TokenData.isVPN()) { tokenData.setVPNCASCookie(); } @@ -204,7 +223,16 @@ public class CommFunc { }; final AlertDialog[] dialog = new AlertDialog[1]; activity.runOnUiThread(() -> dialog[0] = DialogUtil.setTextDialog(activity, "自动建立连接中...(最长需要15s)", "跳过", iDialogService, true)); - + int LoginState = tokenData.refresh(); + if (LoginState == -3) { + activity.runOnUiThread(() -> { + if (dialog[0] != null && dialog[0].isShowing()) { + dialog[0].dismiss(); + } + ToastUtil.showToast(activity, "登录状态丢失,请输入验证码后稍后重试"); + }); + return; + } String token = tokenData.getVpnToken(); tokenData.setVPNCASCookie(); if (!noLogin[0]) { @@ -272,7 +300,16 @@ public class CommFunc { }; final AlertDialog[] dialog = new AlertDialog[1]; activity.runOnUiThread(() -> dialog[0] = DialogUtil.setTextDialog(activity, "自动建立连接中...(最长需要15s)", "跳过", iDialogService, true)); - + int LoginState = tokenData.refresh(); + if (LoginState == -3) { + activity.runOnUiThread(() -> { + if (dialog[0] != null && dialog[0].isShowing()) { + dialog[0].dismiss(); + } + ToastUtil.showToast(activity, "登录状态丢失,请输入验证码后稍后重试"); + }); + return; + } String token = tokenData.getVpnToken(); tokenData.setVPNCASCookie(); if (!noLogin[0]) { diff --git a/app/src/main/java/top/yvyan/guettable/service/MoreFunService.java b/app/src/main/java/top/yvyan/guettable/service/MoreFunService.java index 62a69f88e992565092a88be4a06929069e3e4e6a..4d615af24040b7ef3b65e2b953fcc2164d071fd0 100644 --- a/app/src/main/java/top/yvyan/guettable/service/MoreFunService.java +++ b/app/src/main/java/top/yvyan/guettable/service/MoreFunService.java @@ -18,34 +18,34 @@ public class MoreFunService { this.activity = activity; this.iMoreFun = iMoreFun; accountData = AccountData.newInstance(activity); - tokenData = TokenData.newInstance(activity); + tokenData = TokenData.newInstance(activity,this); } public void update() { new Thread(() -> { try { if (accountData.getIsLogin()) { - setView(91); //显示:尝试同步 + updateView(91); //显示:尝试同步 int state; state = iMoreFun.updateData(tokenData.getCookie()); if (state == 5 || state == -2) { //同步成功或网络错误 - setView(state); + updateView(state); return; } - setView(92); //显示:正在登录 + updateView(92); //显示:正在登录 state = tokenData.refresh(); if (state == -2) { state = tokenData.refresh(); } if (state != 0) { - setView(state); + updateView(state); return; } - setView(93); //显示:正在同步 + updateView(93); //显示:正在同步 state = iMoreFun.updateData(tokenData.getCookie()); - setView(state); + updateView(state); } else { - setView(2); + updateView(2); } } catch (Exception e) { UMCrash.generateCustomLog(e, "MoreFunService"); @@ -69,7 +69,7 @@ public class MoreFunService { * 92 : 正在登录 * 93 : 正在同步 */ - private void setView(int state) { + private void updateView(int state) { String hint; switch (state) { case 2: @@ -81,6 +81,9 @@ public class MoreFunService { case -2: hint = "网络错误"; break; + case -3: + hint = "登录失效(点击重试)"; + break; case 91: hint = "尝试同步"; break; diff --git a/app/src/main/java/top/yvyan/guettable/service/fetch/Net.java b/app/src/main/java/top/yvyan/guettable/service/fetch/Net.java index 79166782124b59b01bacd6a1cbefaf83ad693f0b..1d9518f8bd8d8cd1113f3cfddcb8fb6981825da9 100644 --- a/app/src/main/java/top/yvyan/guettable/service/fetch/Net.java +++ b/app/src/main/java/top/yvyan/guettable/service/fetch/Net.java @@ -105,7 +105,7 @@ public class Net { null); if (loginParams.code != 0) { if(loginParams.code == -7) { - // 已登录 + // 已登录或多因子登录验证失效 return new HttpConnectionAndCode(loginParams.c,1,loginParams.comment,loginParams.cookie,loginParams.resp_code); } return new HttpConnectionAndCode(-5); @@ -140,8 +140,7 @@ public class Net { cookie_builder.append(cookie_resp.substring(0, cookie_resp.indexOf(";") + 1)+" "); } } - LoginRequest.cookie = cookie_builder.toString(); - LoginRequest.cookie = LoginRequest.cookie.substring(0, LoginRequest.cookie.length() - 2); + LoginRequest.cookie = cookie_builder.substring(0, cookie_builder.length() - 2); LoginRequest.code = 0; return LoginRequest; } @@ -160,10 +159,10 @@ public class Net { * @param account account * @return Response */ - public static HttpConnectionAndCode sendPhoneOTP(Context context, String account, String CASCookie) { + public static HttpConnectionAndCode reAuth_sendSMSCode(Context context, String account, String CASCookie) { Resources resources = context.getResources(); return Post.post( - resources.getString(R.string.url_SendPhoneOTP), + resources.getString(R.string.url_SendSMSCode), null, resources.getString(R.string.user_agent), resources.getString(R.string.SSO_referer), @@ -185,7 +184,7 @@ public class Net { * @param OTP OTP * @return Response */ - public static HttpConnectionAndCode verifyPhoneOTP(Context context, String OTP, String CASCookie) { + public static HttpConnectionAndCode reAuth_SMSCode(Context context, String OTP, String CASCookie) { Resources resources = context.getResources(); return Post.post( resources.getString(R.string.url_ReAuth), @@ -209,7 +208,7 @@ public class Net { * @param CASCookie CAS Cookie * @return Response */ - public static HttpConnectionAndCode bypass2FA(Context context, String password, String CASCookie) { + public static HttpConnectionAndCode reAuth_Password(Context context, String password, String CASCookie) { Resources resources = context.getResources(); try { HttpConnectionAndCode MFAParams = Get.get( @@ -599,7 +598,7 @@ public class Net { } /** - * 同步有效课程 + * 同步有效学分 * * @param context context * @param cookie 登录后的cookie diff --git a/app/src/main/java/top/yvyan/guettable/service/fetch/StaticService.java b/app/src/main/java/top/yvyan/guettable/service/fetch/StaticService.java index 367f13667146d22919e7d35e0356c988d3b468d1..9684425bb3d112a004dcefbf1463d379d2305d6b 100644 --- a/app/src/main/java/top/yvyan/guettable/service/fetch/StaticService.java +++ b/app/src/main/java/top/yvyan/guettable/service/fetch/StaticService.java @@ -48,8 +48,8 @@ public class StaticService { * ERROR2 : 需要使用外网网址进行访问 * ERROR3 : 验证码发送CD */ - public static String SendPhoneOTP(Context context, String account, String CASCookie) { - HttpConnectionAndCode response = Net.sendPhoneOTP(context, account, CASCookie); + public static String reAuth_sendSMSCode(Context context, String account, String CASCookie) { + HttpConnectionAndCode response = Net.reAuth_sendSMSCode(context, account, CASCookie); if (response.code != 0) { if (response.code == -5) { return "ERROR2"; @@ -68,8 +68,8 @@ public class StaticService { return "ERROR0"; } - public static String bypass2FA(Context context, String Password, String CASCookie) { - HttpConnectionAndCode response = Net.bypass2FA(context, Password, CASCookie); + public static String reAuth_Password(Context context, String Password, String CASCookie) { + HttpConnectionAndCode response = Net.reAuth_Password(context, Password, CASCookie); if (response.code != 0) { if (response.code == -5) { return "ERROR2"; @@ -84,18 +84,18 @@ public class StaticService { } /** - * 发送手机验证码 + * 验证手机验证码 * * @param context context * @param CASCookie CAS Cookie - * @param OTP OTP手机验证码 + * @param SMSCode OTP手机验证码 * @return 多因素身份验证令牌Cookie * ERROR0 : 网络错误 - * ERROR1 : 密码错误 + * ERROR1 : 验证码错误 * ERROR2 : 需要使用外网网址进行访问 */ - public static String VerifyPhoneOTP(Context context, String OTP, String CASCookie) { - HttpConnectionAndCode response = Net.verifyPhoneOTP(context, OTP, CASCookie); + public static String reAuth_SMSCode(Context context, String SMSCode, String CASCookie) { + HttpConnectionAndCode response = Net.reAuth_SMSCode(context, SMSCode, CASCookie); if (response.code != 0) { if (response.code == -5) { return "ERROR2"; @@ -116,7 +116,7 @@ public class StaticService { * @param account 学号 * @param password 密码 * @param MFACookie MFA Cookie - * @param TGTToken TGTToken + * @param TGTToken TGTToken * @return CAS Cookie * ERROR0 : 网络错误 * ERROR1 : 密码错误 @@ -124,12 +124,20 @@ public class StaticService { * ERROR5 : 2FA Needed */ public static String SSOLogin(Context context, String account, String password, String TGTToken, String MFACookie) { - HttpConnectionAndCode response = Net.getCASToken(context, account, password,TGTToken, MFACookie); + HttpConnectionAndCode response = Net.getCASToken(context, account, password, TGTToken, MFACookie); if (response.code != 0) { - if(response.code == 1 ) { - return (MFACookie != null ? (MFACookie + "; "+TGTToken) : "ERROR1"); + if (response.code == 1) { + String Location = response.c.getHeaderField("location"); + if (Location.contains("reAuthLoginView.do")) { + return "ERROR5;" + TGTToken + "; " + response.cookie; + } + if (MFACookie != null) { + return MFACookie + "; " + TGTToken; + } else { + return TGTToken; + } } - if(response.code == -8) { + if (response.code == -8) { return "ERROR1"; } return "ERROR0"; @@ -177,6 +185,7 @@ public class StaticService { /** * 通过ST令牌登录VPN + * * @param context context * @param ST ST令牌 * @param VPNToken 用于接收登录后的cookie @@ -185,10 +194,10 @@ public class StaticService { * -1 -- 登录失败 * -2 -- 发生异常 */ - public static int loginVPNST(Context context,String ST, String VPNToken) { - HttpConnectionAndCode response = Net.loginVPNST(context,ST,VPNToken); - if(response.code == 0 ) { - if(response.c.getURL().toString().contains("wengine-vpn-token-login")) { + public static int loginVPNST(Context context, String ST, String VPNToken) { + HttpConnectionAndCode response = Net.loginVPNST(context, ST, VPNToken); + if (response.code == 0) { + if (response.c.getURL().toString().contains("wengine-vpn-token-login")) { return 0; } } @@ -198,16 +207,16 @@ public class StaticService { /** * 向VPN添加Cookie * - * @param host 域 - * @param path 路径 - * @param cookie cookie - * @param VPNToken VPN Token + * @param host 域 + * @param path 路径 + * @param cookie cookie + * @param VPNToken VPN Token * @return 0 成功 */ - public static int CookieSet(Context context,String host, String path, String cookie, String VPNToken) { - HttpConnectionAndCode response = Net.CookieSet(context,host,path,cookie,VPNToken); - if(response.code == 0 ) { - if(response.comment.contains("success")) { + public static int CookieSet(Context context, String host, String path, String cookie, String VPNToken) { + HttpConnectionAndCode response = Net.CookieSet(context, host, path, cookie, VPNToken); + if (response.code == 0) { + if (response.comment.contains("success")) { return 0; } } @@ -225,9 +234,9 @@ public class StaticService { * -2 -- 教务登录失败 * -3 -- 发生异常 */ - public static int loginBkjwVPNST(Context context,String ST, String VPNToken) { - HttpConnectionAndCode response = Net.loginBkjwVPNST(context,ST,VPNToken); - if(response.code == 0 ) { + public static int loginBkjwVPNST(Context context, String ST, String VPNToken) { + HttpConnectionAndCode response = Net.loginBkjwVPNST(context, ST, VPNToken); + if (response.code == 0) { return 0; } return -1; diff --git a/app/src/main/java/top/yvyan/guettable/util/GuideTipsDialog.java b/app/src/main/java/top/yvyan/guettable/util/GuideTipsDialog.java new file mode 100644 index 0000000000000000000000000000000000000000..548c64fda4b6b7814728e2f3b18c30c5dd76b491 --- /dev/null +++ b/app/src/main/java/top/yvyan/guettable/util/GuideTipsDialog.java @@ -0,0 +1,190 @@ +package top.yvyan.guettable.util; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; + +import com.google.gson.Gson; +import com.xuexiang.xui.widget.dialog.BaseDialog; +import com.xuexiang.xutil.common.ObjectUtils; +import com.xuexiang.xutil.net.type.TypeBuilder; +import com.zhy.http.okhttp.OkHttpUtils; +import com.zhy.http.okhttp.callback.StringCallback; +import com.zzhoujay.richtext.RichText; + +import java.lang.reflect.Type; +import java.util.List; + +import okhttp3.Call; +import top.yvyan.guettable.Http.entity.ApiResult; +import top.yvyan.guettable.R; +import top.yvyan.guettable.bean.TipInfo; + +public class GuideTipsDialog extends BaseDialog implements View.OnClickListener { + private static final String TIPS_URL = "https://gitee.com/fireworkwing/resource/raw/master/GuetTable/tips.json"; + + private List mTips; + private int mIndex = -1; + + private TextView mTvPrevious; + private TextView mTvNext; + + private TextView mTvTitle; + private TextView mTvContent; + + /** + * 显示提示 + * + * @param context 上下文 + */ + public static void showTips(final Context context) { + showTipsForce(context); + } + + /** + * 强制显示提示 + * + * @param context 上下文 + */ + public static void showTipsForce(Context context) { + OkHttpUtils.get() + .url(TIPS_URL) + .build() + .execute(new StringCallback() { + @Override + public void onError(Call call, Exception e, int id) { + + } + + @Override + public void onResponse(String response, int id) { + showTips(context, response); + } + }); + } + + + private static void showTips(Context context, String response) { + Type type = TypeBuilder.newInstance(ApiResult.class) + .beginSubType(List.class) + .addTypeParam(TipInfo.class) + .endSubType() + .build(); + + ApiResult> apiResult = new Gson().fromJson(response, type); + if (apiResult != null) { + List tips = apiResult.getData(); + if (ObjectUtils.isNotEmpty(tips)) { + new GuideTipsDialog(context, tips).show(); + } + } + } + + public GuideTipsDialog(Context context, @NonNull List tips) { + super(context, R.layout.dialog_guide); + initViews(); + updateTips(tips); + } + + /** + * 初始化弹窗 + */ + private void initViews() { + mTvTitle = findViewById(R.id.tv_title); + mTvContent = findViewById(R.id.tv_content); + ImageView ivClose = findViewById(R.id.iv_close); + + mTvPrevious = findViewById(R.id.tv_previous); + mTvNext = findViewById(R.id.tv_next); + + if (ivClose != null) { + ivClose.setOnClickListener(this); + } + mTvPrevious.setOnClickListener(this); + mTvNext.setOnClickListener(this); + mTvPrevious.setEnabled(false); + mTvNext.setEnabled(true); + setCancelable(false); + setCanceledOnTouchOutside(true); + } + + /** + * 更新提示信息 + * + * @param tips 提示信息 + */ + private void updateTips(List tips) { + mTips = tips; + if (mTips != null && mTips.size() > 0 && mTvContent != null) { + mIndex = 0; + showRichText(mTips.get(mIndex)); + } + } + + /** + * 切换提示信息 + * + * @param index 索引 + */ + private void switchTipInfo(int index) { + if (mTips != null && mTips.size() > 0 && mTvContent != null) { + if (index >= 0 && index <= mTips.size() - 1) { + showRichText(mTips.get(index)); + if (index == 0) { + mTvPrevious.setEnabled(false); + mTvNext.setEnabled(true); + } else if (index == mTips.size() - 1) { + mTvPrevious.setEnabled(true); + mTvNext.setEnabled(false); + } else { + mTvPrevious.setEnabled(true); + mTvNext.setEnabled(true); + } + } + } + } + + /** + * 显示富文本 + * + * @param tipInfo 提示信息 + */ + private void showRichText(TipInfo tipInfo) { + mTvTitle.setText(tipInfo.getTitle()); + RichText.fromHtml(tipInfo.getContent()) + .bind(this) + .into(mTvContent); + } + + @SuppressLint("NonConstantResourceId") + @Override + public void onClick(View view) { + switch (view.getId()) { + case R.id.iv_close: + dismiss(); + break; + case R.id.tv_previous: + if (mIndex > 0) { + mIndex--; + switchTipInfo(mIndex); + } + break; + case R.id.tv_next: + if (mIndex < mTips.size() - 1) { + mIndex++; + switchTipInfo(mIndex); + } + break; + default: + break; + } + } + + @Override + public void onDetachedFromWindow() { + } +} diff --git a/app/src/main/java/top/yvyan/guettable/util/RSAUtil.java b/app/src/main/java/top/yvyan/guettable/util/RSAUtil.java deleted file mode 100644 index 171abf28390384bf88f4161cb2ad28ce8d332abd..0000000000000000000000000000000000000000 --- a/app/src/main/java/top/yvyan/guettable/util/RSAUtil.java +++ /dev/null @@ -1,60 +0,0 @@ -package top.yvyan.guettable.util; - -import java.math.BigInteger; -import java.security.KeyFactory; -import java.security.PublicKey; -import java.security.spec.RSAPublicKeySpec; - -import javax.crypto.Cipher; - -public class RSAUtil { - private static final String publicExponentStr = "010001"; - private static final String modulusStr = "00b5eeb166e069920e80bebd1fea4829d3d1f3216f2aabe79b6c47a3c18dcee5fd22c2e7ac519cab59198ece036dcf289ea8201e2a0b9ded307f8fb704136eaeb670286f5ad44e691005ba9ea5af04ada5367cd724b5a26fdb5120cc95b6431604bd219c6b7d83a6f8f24b43918ea988a76f93c333aa5a20991493d4eb1117e7b1"; - - /** - * CAS登录RSA公钥加密 - * - * @param text 未加密字符串 - * @return RSA加密后的字符串(16进制字符串) - */ - public static String CASEncryption(String text) { - try { - //公钥加密 - KeyFactory keyFactory = KeyFactory.getInstance("RSA"); - BigInteger modulus = new BigInteger(modulusStr, 16); - BigInteger publicExponent = new BigInteger(publicExponentStr, 16); - RSAPublicKeySpec rsaPublicKeySpec = new RSAPublicKeySpec(modulus, publicExponent); - PublicKey publicKey = keyFactory.generatePublic(rsaPublicKeySpec); - Cipher cipher = Cipher.getInstance("RSA"); - cipher.init(Cipher.ENCRYPT_MODE, publicKey); - byte[] encryptData = cipher.doFinal(text.getBytes()); - return byte2hex(encryptData); - } catch (Exception ignored) { - } - return null; - } - - /** - * 字节数组转换为十六进制字符串 - * - * @param b 需要转换的字节数组 - * @return String 十六进制字符串 - */ - public static String byte2hex(byte[] b) { - if (b == null) { - throw new IllegalArgumentException( - "Argument b ( byte array ) is null! "); - } - StringBuilder hs = new StringBuilder(); - String stmp; - for (byte value : b) { - stmp = Integer.toHexString(value & 0xff); - if (stmp.length() == 1) { - hs.append("0").append(stmp); - } else { - hs.append(stmp); - } - } - return hs.toString(); - } -} diff --git a/app/src/main/java/top/yvyan/guettable/util/SerializeUtil.java b/app/src/main/java/top/yvyan/guettable/util/SerializeUtil.java deleted file mode 100644 index 61abbee8d4f99e93f32f14f37858315f476c45ae..0000000000000000000000000000000000000000 --- a/app/src/main/java/top/yvyan/guettable/util/SerializeUtil.java +++ /dev/null @@ -1,45 +0,0 @@ -package top.yvyan.guettable.util; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.nio.charset.StandardCharsets; - -public class SerializeUtil { - /** - * 对象 -> 字符串 - * - * @param obj 对象 - * @return 序列化的字符串 - * @throws IOException IOException - */ - public static String serialize(Object obj) throws IOException { - ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); - ObjectOutputStream objectOutputStream; - objectOutputStream = new ObjectOutputStream(byteArrayOutputStream); - objectOutputStream.writeObject(obj); - String string = byteArrayOutputStream.toString("ISO-8859-1"); - objectOutputStream.close(); - byteArrayOutputStream.close(); - return string; - } - - /** - * 字符串 -> 对象 - * - * @param str 序列化的字符串 - * @return 对象 - * @throws IOException IOException - * @throws ClassNotFoundException ClassNotFoundException - */ - public static Object serializeToObject(String str) throws IOException, ClassNotFoundException { - ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(str.getBytes(StandardCharsets.ISO_8859_1)); - ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream); - Object object = objectInputStream.readObject(); - objectInputStream.close(); - byteArrayInputStream.close(); - return object; - } -} diff --git a/app/src/main/java/top/yvyan/guettable/widget/WidgetService.java b/app/src/main/java/top/yvyan/guettable/widget/WidgetService.java index d0ee3036dcf0205cfb626edeb4121286da3e2d77..001d598a9df2ea6b3cf8422a536a72872b593b86 100644 --- a/app/src/main/java/top/yvyan/guettable/widget/WidgetService.java +++ b/app/src/main/java/top/yvyan/guettable/widget/WidgetService.java @@ -22,7 +22,6 @@ public class WidgetService extends RemoteViewsService { private GeneralData generalData; private SettingData settingData; - private ScheduleData scheduleData; private static final String TAG = "RemoteViewsService"; @Override @@ -32,7 +31,6 @@ public class WidgetService extends RemoteViewsService { try { generalData = GeneralData.newInstance(getApplicationContext()); settingData = SettingData.newInstance(getApplicationContext()); - scheduleData = ScheduleData.newInstance(getApplicationContext()); todayList = new ArrayList<>(getTodayList()); } catch (Exception e) { Log.d(TAG, "Exception: " + e.getMessage()); @@ -44,20 +42,20 @@ public class WidgetService extends RemoteViewsService { // 日课表的获取当日课程方法 private List getTodayList() { List list; - if (!scheduleData.getCourseBeans().isEmpty()) { - list = ScheduleSupport.transform(scheduleData.getCourseBeans()); + if (!ScheduleData.getCourseBeans().isEmpty()) { + list = ScheduleSupport.transform(ScheduleData.getCourseBeans()); } else { list = new ArrayList<>(); } - for (CourseBean courseBean : scheduleData.getUserCourseBeans()) { + for (CourseBean courseBean : ScheduleData.getUserCourseBeans()) { list.add(courseBean.getSchedule()); } if (settingData.getShowLibOnTable()) { - List labList = ScheduleSupport.transform(scheduleData.getLibBeans()); + List labList = ScheduleSupport.transform(ScheduleData.getLibBeans()); list.addAll(labList); } if (settingData.getShowExamOnTable()) { - for (ExamBean examBean : CourseUtil.combineExam(scheduleData.getExamBeans())) { + for (ExamBean examBean : CourseUtil.combineExam(ScheduleData.getExamBeans())) { if (examBean != null && examBean.getWeek() != 0) { list.add(examBean.getSchedule()); } diff --git a/app/src/main/java/top/yvyan/guettable/widget/WidgetServiceFactory.java b/app/src/main/java/top/yvyan/guettable/widget/WidgetServiceFactory.java index 2c0a8721f3af2c64c401b3bede7ebaf988fbb9dc..118d6d42ea7d556b8c6860391b630653bac4e6e2 100644 --- a/app/src/main/java/top/yvyan/guettable/widget/WidgetServiceFactory.java +++ b/app/src/main/java/top/yvyan/guettable/widget/WidgetServiceFactory.java @@ -29,7 +29,6 @@ public class WidgetServiceFactory implements RemoteViewsService.RemoteViewsFacto private List dataList; private GeneralData generalData; private SettingData settingData; - private ScheduleData scheduleData; private static final String TAG = "WidgetServiceFactory"; @@ -52,9 +51,6 @@ public class WidgetServiceFactory implements RemoteViewsService.RemoteViewsFacto if (settingData == null) { settingData = SettingData.newInstance(context); } - if (scheduleData == null) { - scheduleData = ScheduleData.newInstance(context); - } dataList = getTodayList(); } @@ -124,20 +120,20 @@ public class WidgetServiceFactory implements RemoteViewsService.RemoteViewsFacto // 日课表的获取当日课程方法 private List getTodayList() { List list; - if (!scheduleData.getCourseBeans().isEmpty()) { - list = ScheduleSupport.transform(scheduleData.getCourseBeans()); + if (!ScheduleData.getCourseBeans().isEmpty()) { + list = ScheduleSupport.transform(ScheduleData.getCourseBeans()); } else { list = new ArrayList<>(); } - for (CourseBean courseBean : scheduleData.getUserCourseBeans()) { + for (CourseBean courseBean : ScheduleData.getUserCourseBeans()) { list.add(courseBean.getSchedule()); } if (settingData.getShowLibOnTable()) { - List labList = ScheduleSupport.transform(scheduleData.getLibBeans()); + List labList = ScheduleSupport.transform(ScheduleData.getLibBeans()); list.addAll(labList); } if (settingData.getShowExamOnTable()) { - for (ExamBean examBean : CourseUtil.combineExam(scheduleData.getExamBeans())) { + for (ExamBean examBean : CourseUtil.combineExam(ScheduleData.getExamBeans())) { if (examBean != null && examBean.getWeek() != 0) { list.add(examBean.getSchedule()); } diff --git a/app/src/main/res/drawable/bg_dialog_common_tip_corner_white.xml b/app/src/main/res/drawable/bg_dialog_common_tip_corner_white.xml new file mode 100644 index 0000000000000000000000000000000000000000..dbcadadd6578a6eb1c0a354d4cb5d5e49ef24db1 --- /dev/null +++ b/app/src/main/res/drawable/bg_dialog_common_tip_corner_white.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_action_close_white.xml b/app/src/main/res/drawable/ic_action_close_white.xml new file mode 100644 index 0000000000000000000000000000000000000000..75c5deed14b3a58716b95495144689a82d4a2820 --- /dev/null +++ b/app/src/main/res/drawable/ic_action_close_white.xml @@ -0,0 +1,22 @@ + + + + diff --git a/app/src/main/res/drawable/img_guide_tip_top.xml b/app/src/main/res/drawable/img_guide_tip_top.xml new file mode 100644 index 0000000000000000000000000000000000000000..f684094994d7b52a7a4383a0342a6b3e6fbe1756 --- /dev/null +++ b/app/src/main/res/drawable/img_guide_tip_top.xml @@ -0,0 +1,36 @@ + + + + + + + diff --git a/app/src/main/res/layout/activity_about.xml b/app/src/main/res/layout/activity_about.xml index ad01191d6e003393f16374dcd22b825fb624fd65..e20cfd2eff7b33ecf46ce1c076aaf293d758d573 100644 --- a/app/src/main/res/layout/activity_about.xml +++ b/app/src/main/res/layout/activity_about.xml @@ -443,6 +443,44 @@ android:layout_height="0.1dp" android:background="@color/xui_config_color_gray_9" /> + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index 1488252857b117e4efe5aa126190410e5969bbe0..74fab167392ee6c09d791fb6ca59ee760535828e 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -91,7 +91,7 @@ tools:ignore="ContentDescription" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_guide.xml b/app/src/main/res/layout/dialog_guide.xml new file mode 100644 index 0000000000000000000000000000000000000000..aeeb1d1eee84aead21810ec3daf12447530283bb --- /dev/null +++ b/app/src/main/res/layout/dialog_guide.xml @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/login_phoneotp.xml b/app/src/main/res/layout/login_smscode.xml similarity index 88% rename from app/src/main/res/layout/login_phoneotp.xml rename to app/src/main/res/layout/login_smscode.xml index ddf08e09df91c16ff2add6c2980efe3ad1a6e0a7..4fd9ef284f79a19409644f5671e58ab2152e6ec2 100644 --- a/app/src/main/res/layout/login_phoneotp.xml +++ b/app/src/main/res/layout/login_smscode.xml @@ -19,7 +19,7 @@ android:layout_height="wrap_content" android:layout_gravity="center" android:layout_margin="8dp" - android:text="@string/login_2fa_phoneotp" + android:text="@string/login_2fa_smscode" android:textSize="20sp" /> +