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/baseFun/UpdateApp.java b/app/src/main/java/top/yvyan/guettable/baseFun/UpdateApp.java
index a3dd7e8fe35cf66993fd25b05abe5e5119b65272..a88248e9842e9aa9b92d5c8d3142d0c2d4aec503 100644
--- a/app/src/main/java/top/yvyan/guettable/baseFun/UpdateApp.java
+++ b/app/src/main/java/top/yvyan/guettable/baseFun/UpdateApp.java
@@ -35,7 +35,7 @@ public class UpdateApp {
ToastUtil.showToast(activity, error.toString());
}
})
- .supportSilentInstall(true) //设置是否支持静默安装,默认是true
+ .supportSilentInstall(false) //设置是否支持静默安装,默认是true
.setIUpdateHttpService(new OKHttpUpdateHttpService()) //这个必须设置!实现网络请求功能。
.init(activity.getApplication());
}
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/GeneralData.java b/app/src/main/java/top/yvyan/guettable/data/GeneralData.java
index a4d2db7eb2516b1684843f01ec2efcd754051a12..76dd8c2d2543aedcbae52fd0223890022c402c26 100644
--- a/app/src/main/java/top/yvyan/guettable/data/GeneralData.java
+++ b/app/src/main/java/top/yvyan/guettable/data/GeneralData.java
@@ -18,9 +18,7 @@ public class GeneralData {
private static final String TIME = "time";
private static final String GRADE = "grade";
private static final String TERM = "term";
- private static final String IS_INTERNATIONAL = "isInternational";
private static final String LAST_UPDATE_TIME = "lastUpdateTime";
- private static final String APP_LAST_UPDATE_TIME = "appLastUpdateTime";
private static final String APPLY_PRIVACY = "applyPrivacy";
private static final String WIDGET_THEME = "widget_theme";
private static final String WIDGET_ALPHA = "widget_alpha";
@@ -34,10 +32,7 @@ public class GeneralData {
private long time;
private String grade;
private String term;
- private boolean isInternational;
private long lastUpdateTime;
- //控制检查更新频率
- private long appLastUpdateTime;
//隐私协议
private boolean applyPrivacy;
@@ -59,9 +54,7 @@ public class GeneralData {
time = sharedPreferences.getLong(TIME, System.currentTimeMillis());
grade = sharedPreferences.getString(GRADE, null);
term = sharedPreferences.getString(TERM, null);
- isInternational = sharedPreferences.getBoolean(IS_INTERNATIONAL, false);
lastUpdateTime = sharedPreferences.getLong(LAST_UPDATE_TIME, -1);
- appLastUpdateTime = sharedPreferences.getLong(APP_LAST_UPDATE_TIME, -1);
applyPrivacy = sharedPreferences.getBoolean(APPLY_PRIVACY, false);
widget_theme = sharedPreferences.getString(WIDGET_THEME, "black");
widget_alpha = sharedPreferences.getInt(WIDGET_ALPHA, 255);
@@ -138,16 +131,6 @@ public class GeneralData {
editor.apply();
}
- public boolean isInternational() {
- return isInternational;
- }
-
- public void setInternational(boolean international) {
- isInternational = international;
- editor.putBoolean(IS_INTERNATIONAL, isInternational);
- editor.apply();
- }
-
public long getLastUpdateTime() {
return lastUpdateTime;
}
@@ -159,16 +142,6 @@ public class GeneralData {
editor.apply();
}
- public long getAppLastUpdateTime() {
- return appLastUpdateTime;
- }
-
- public void setAppLastUpdateTime(long appLastUpdateTime) {
- this.appLastUpdateTime = appLastUpdateTime;
- editor.putLong(APP_LAST_UPDATE_TIME, appLastUpdateTime);
- editor.apply();
- }
-
public boolean isApplyPrivacy() {
return applyPrivacy;
}
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 d5abe6b0711b4e9f3ac3c55bc80f40e26a517010..272896aeeb9723ff84e0459175d6ec314a70a75f 100644
--- a/app/src/main/java/top/yvyan/guettable/data/TokenData.java
+++ b/app/src/main/java/top/yvyan/guettable/data/TokenData.java
@@ -16,24 +16,27 @@ public class TokenData {
private static final String SHP_NAME = "tokenData";
- private static final String CAS_Cookie = "CASCookie";
+ private static final String CAS_TGTToken = "TGTToken";
+
private static final String VPN_TOKEN = "VPNToken";
private static final String BKJW_COOKIE = "bkjwCookie";
private static final String IS_DEVELOP = "isDevelop";
-
+ private static final String MULTIFACTOR_USERS = "MFACookie";
private final AccountData accountData;
- public static boolean isVPN = true;
+ private static boolean isVPN = true;
//开发者调试
private boolean isDevelop;
//强制获取vpn
private boolean forceVPN = false;
- private String CASCookie; // 新版CAS认证Cookie; CASTGT/JSESSION
+ private String TGTToken; // CAS-TGT
private String VPNToken; //VPN认证Token
private String bkjwCookie; //教务系统认证Cookie
+ private String MFACookie;
+
public String getCookie() {
if (isVPN) {
return VPNToken;
@@ -42,8 +45,12 @@ public class TokenData {
}
}
- public boolean isVPN() {
- return !isVPN;
+ public static boolean isVPN() {
+ return isVPN;
+ }
+
+ public static void setIsVPN(boolean isVPN) {
+ TokenData.isVPN = isVPN;
}
/**
@@ -68,7 +75,8 @@ public class TokenData {
VPNToken = sharedPreferences.getString(VPN_TOKEN, null);
bkjwCookie = sharedPreferences.getString(BKJW_COOKIE, null);
isDevelop = sharedPreferences.getBoolean(IS_DEVELOP, false);
- CASCookie = sharedPreferences.getString(CAS_Cookie, "");
+ TGTToken = sharedPreferences.getString(CAS_TGTToken, null);
+ MFACookie = sharedPreferences.getString(MULTIFACTOR_USERS, null);
}
public static TokenData newInstance(Context context) {
@@ -110,6 +118,20 @@ public class TokenData {
* @return 登录结果
*/
private int loginBySmart() {
+ //尝试获取教务系统ST
+ int n;
+ String ST_BKJW = StaticService.SSOGetST(context, TGTToken, context.getResources().getString(R.string.service_bkjw), MFACookie);
+ if (!ST_BKJW.contains("ST-")) { // TGT失效
+ n = refreshTGT();
+ if (n != 0) {
+ return n;
+ }
+ ST_BKJW = StaticService.SSOGetST(context, TGTToken, context.getResources().getString(R.string.service_bkjw), MFACookie);
+ if (!ST_BKJW.contains("ST-")) {
+ return -2;
+ }
+ }
+
if (isVPN) { //外网
//获取VPN的token
String VPNTokenStr = Net.getVPNToken(context);
@@ -118,42 +140,26 @@ public class TokenData {
} else {
return -2;
}
- int n = loginVpnByCAS(VPNTokenStr);
- //登录教务
- if (n == 0) {
- String ST_BKJW = StaticService.SSOGetST(context, CASCookie, context.getResources().getString(R.string.service_bkjw), VPNTokenStr);
- if (ST_BKJW.equals("ERROR0")) {
- return -2;
- } else if (ST_BKJW.equals("ERROR1")) { //TGT失效
- n = refreshTGT(VPNTokenStr);
- if (n == 0) {
- ST_BKJW = StaticService.SSOGetST(context, CASCookie, context.getResources().getString(R.string.service_bkjw), VPNTokenStr);
- if (!ST_BKJW.contains("ST-")) {
- return -2;
- }
- } else {
- return n;
- }
- }
- n = StaticService.loginBkjwVPNST(ST_BKJW, VPNToken);
- if (n != 0) {
- n = StaticService.loginBkjwVPNST(ST_BKJW, VPNToken);
- }
+ //获取VPN-ST
+ String ST_VPN = StaticService.SSOGetST(context, TGTToken, context.getResources().getString(R.string.service_vpn), MFACookie);
+ if (!ST_VPN.contains("ST-")) {
+ return -2;
+ }
+ n = StaticService.loginVPNST(context, ST_VPN, VPNTokenStr);
+ if (n != 0) {
+ n = StaticService.loginVPNST(context, ST_VPN, VPNTokenStr);
+ }
+ if (n != 0) {
+ return n;
+ }
+ n = StaticService.loginBkjwVPNST(context, ST_BKJW, VPNToken);
+ if (n != 0) {
+ n = StaticService.loginBkjwVPNST(context, ST_BKJW, VPNToken);
}
return n;
- } else { // 内网
+
+ } else { //内网
StringBuilder cookie_builder = new StringBuilder();
- String ST_BKJW = StaticService.SSOGetST(context, CASCookie, context.getResources().getString(R.string.service_bkjw), null);
- if (!ST_BKJW.contains("ST-")) { // TGT失效
- int n = refreshTGT(null);
- if (n != 0) {
- return n;
- }
- ST_BKJW = StaticService.SSOGetST(context, CASCookie, context.getResources().getString(R.string.service_bkjw), null);
- if (!ST_BKJW.contains("ST-")) { // 网络错误,切换为外网模式
- return -2;
- }
- }
int state = StaticService.loginBkjw(context, ST_BKJW, cookie_builder);
if (state == 0) {
setBkjwCookie(cookie_builder.toString());
@@ -165,61 +171,76 @@ public class TokenData {
}
/**
- * 使用CAS登录VPN
+ * 刷新TGT令牌
*
- * @param VPNTokenStr vpn的Token
- * @return 登录结果
+ * @return 操作结果
*/
- private int loginVpnByCAS(String VPNTokenStr) {
- int n;
- String ST_VPN = StaticService.SSOGetST(context, CASCookie, context.getResources().getString(R.string.service_vpn), VPNTokenStr);
- if (ST_VPN.equals("ERROR0")) {
+ public int refreshTGT() {
+ String TGTTokenStr = StaticService.SSOLogin(context, accountData.getUsername(), accountData.getPwd(),TGTToken, MFACookie);
+ if (TGTTokenStr.equals("ERROR2") || TGTTokenStr.equals("ERROR0")) {
return -2;
- } else if (ST_VPN.equals("ERROR1")) { //TGT失效
- n = refreshTGT(VPNTokenStr); //刷新TGT
- if (n == 0) {
- //重新获取登录vpn的st令牌
- ST_VPN = StaticService.SSOGetST(context, CASCookie, context.getResources().getString(R.string.service_vpn), VPNTokenStr);
- if (!ST_VPN.contains("ST-")) {
- return -2;
- }
- if (StaticService.loginVPNST(ST_VPN, VPNTokenStr) != 0) {
- return StaticService.loginVPNST(ST_VPN, VPNTokenStr);
- }
- return 0;
+ }
+ if (TGTTokenStr.contains("TGT-")) {
+ if (TGTTokenStr.contains("ERROR5")) {
+ setTGTToken(TGTTokenStr.substring(TGTTokenStr.indexOf(";") + 1));
+ return bypass2FA(accountData.getPwd(), TGTTokenStr.substring(TGTTokenStr.indexOf(";") + 1));
} else {
- return n;
- }
- } else {
- if (StaticService.loginVPNST(ST_VPN, VPNTokenStr) != 0) {
- return StaticService.loginVPNST(ST_VPN, VPNTokenStr);
+ setTGTToken(TGTTokenStr);
}
return 0;
+ } else {
+ return -1;
}
}
/**
- * 刷新TGT令牌
- *
- * @param VPNToken VPNToken
- * @return 操作结果
+ * bypass 2FA
*/
- public int refreshTGT(String VPNToken) {
- String CASCookieStr = StaticService.SSOLogin(context, accountData.getUsername(), accountData.getVPNPwd(), VPNToken);
- if (CASCookieStr.equals("ERROR2") || CASCookieStr.equals("ERROR0")) {
- return -2;
- }
- if (CASCookieStr.contains("TGT-")) {
- setCASCookie(CASCookieStr);
+ private int bypass2FA(String password, String CASCookie) {
+ try {
+ String MultiFactorAuth = StaticService.bypass2FA(context, password, CASCookie);
+ if (MultiFactorAuth.contains("ERROR")) {
+ return -1;
+ } else {
+ setMFACookie(MultiFactorAuth);
+ }
+ return 0;
+ } catch (Exception ignore) {
return 0;
+ }
+ }
+
+ public int setVPNCASCookie() {
+ return (MFACookie != null ? StaticService.CookieSet(context, "cas.guet.edu.cn", "/authserver/login", MFACookie, VPNToken) : 0) | StaticService.CookieSet(context, "cas.guet.edu.cn", "/authserver/login", TGTToken, VPNToken);
+ }
+
+ public String getCASCookie() {
+ return (MFACookie != null ? MFACookie : "") + (TGTToken != null ? ((MFACookie!=null ? "; " : "")+TGTToken) : "");
+ }
+
+ public String getTGTToken() {
+ return TGTToken;
+ }
+
+ public String getMFACookie() {
+ return MFACookie;
+ }
+
+ public void setTGTToken(String CASCookie) {
+ String tTGTToken = CASCookie.substring(CASCookie.indexOf("CASTGC="));
+ int TGTTokenEndIndex = tTGTToken.indexOf(";");
+ if (TGTTokenEndIndex >= 0) {
+ TGTToken = tTGTToken.substring(0, TGTTokenEndIndex);
} else {
- return -1;
+ TGTToken = tTGTToken;
}
+ editor.putString(CAS_TGTToken, TGTToken);
+ editor.apply();
}
- public void setCASCookie(String CASCookie) {
- this.CASCookie = CASCookie;
- editor.putString(CAS_Cookie, CASCookie);
+ public void setMFACookie(String MFACookie) {
+ this.MFACookie = MFACookie;
+ editor.putString(MULTIFACTOR_USERS, MFACookie);
editor.apply();
}
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 ff5b36929ca9f9d44aa4a62ea9d53e08f3d2a003..e5dbcdb06b820ef8f0e683cee4c261d26a963de1 100644
--- a/app/src/main/java/top/yvyan/guettable/fragment/DayClassFragment.java
+++ b/app/src/main/java/top/yvyan/guettable/fragment/DayClassFragment.java
@@ -28,7 +28,6 @@ import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
-import java.util.Objects;
import top.yvyan.guettable.MainActivity;
import top.yvyan.guettable.R;
@@ -47,7 +46,6 @@ import top.yvyan.guettable.service.AutoUpdate;
import top.yvyan.guettable.service.CommFunc;
import top.yvyan.guettable.util.AppUtil;
import top.yvyan.guettable.util.BackgroundUtil;
-import top.yvyan.guettable.util.DialogUtil;
import top.yvyan.guettable.util.CourseUtil;
import top.yvyan.guettable.util.TimeUtil;
import top.yvyan.guettable.util.ToastUtil;
@@ -70,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();
@@ -88,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);
}
}
@@ -105,7 +102,7 @@ public class DayClassFragment extends Fragment implements View.OnClickListener {
initData();
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);
textView = view.findViewById(R.id.day_class_hint);
@@ -134,13 +131,12 @@ public class DayClassFragment extends Fragment implements View.OnClickListener {
accountData = AccountData.newInstance(getActivity());
generalData = GeneralData.newInstance(getActivity());
settingData = SettingData.newInstance(getActivity());
- scheduleData = ScheduleData.newInstance(getActivity());
}
/**
* 更新日课表视图
*/
- @SuppressLint("SetTextI18n")
+ @SuppressLint({"SetTextI18n", "NotifyDataSetChanged"})
public void updateView(int... order) {
List allClass = getData();
List todayList, tomorrowList;
@@ -174,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) {
@@ -244,12 +240,8 @@ public class DayClassFragment extends Fragment implements View.OnClickListener {
startActivity(intent);
break;
case R.id.day_credits:
- if (generalData.isInternational()) {
- DialogUtil.showTextDialog(getContext(), "国际学院教务系统暂无此功能");
- } else {
- intent = new Intent(getContext(), GradesActivity.class);
- startActivity(intent);
- }
+ intent = new Intent(getContext(), GradesActivity.class);
+ startActivity(intent);
break;
default:
ToastUtil.showToast(getContext(), "敬请期待!");
@@ -267,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());
}
@@ -297,7 +285,7 @@ public class DayClassFragment extends Fragment implements View.OnClickListener {
public void onStart() {
try {
super.onStart();
- setBackground(BackgroundUtil.isSetBackground(Objects.requireNonNull(getContext())));
+ setBackground(BackgroundUtil.isSetBackground(requireContext()));
initData();
autoUpdate.updateView();
try {
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 21b689127947194e527127f1612d888b7268c202..a876d3146b0308d0a8d04adea47f5bf728ff75a7 100644
--- a/app/src/main/java/top/yvyan/guettable/fragment/MoreFragment.java
+++ b/app/src/main/java/top/yvyan/guettable/fragment/MoreFragment.java
@@ -12,7 +12,6 @@ import androidx.fragment.app.Fragment;
import com.umeng.cconfig.UMRemoteConfig;
import top.yvyan.guettable.R;
-import top.yvyan.guettable.data.GeneralData;
import top.yvyan.guettable.data.SingleSettingData;
import top.yvyan.guettable.moreFun.CETActivity;
import top.yvyan.guettable.moreFun.ExamActivity;
@@ -28,7 +27,6 @@ import top.yvyan.guettable.moreFun.SelectedCourseActivity;
import top.yvyan.guettable.service.CommFunc;
import top.yvyan.guettable.util.AppUtil;
import top.yvyan.guettable.util.BackgroundUtil;
-import top.yvyan.guettable.util.DialogUtil;
import top.yvyan.guettable.util.ToastUtil;
public class MoreFragment extends Fragment implements View.OnClickListener {
@@ -36,7 +34,6 @@ public class MoreFragment extends Fragment implements View.OnClickListener {
private View view;
private SingleSettingData singleSettingData;
- private GeneralData generalData;
public static MoreFragment newInstance() {
return new MoreFragment();
@@ -47,7 +44,6 @@ public class MoreFragment extends Fragment implements View.OnClickListener {
Bundle savedInstanceState) {
view = inflater.inflate(R.layout.fragement_more, container, false);
- generalData = GeneralData.newInstance(getContext());
singleSettingData = SingleSettingData.newInstance(getContext());
//透明状态栏
View addStatus = view.findViewById(R.id.add_status);
@@ -81,10 +77,6 @@ public class MoreFragment extends Fragment implements View.OnClickListener {
return view;
}
- private void initData() {
- generalData = GeneralData.newInstance(getContext());
- }
-
/**
* 设置背景
*
@@ -106,7 +98,6 @@ public class MoreFragment extends Fragment implements View.OnClickListener {
public void onStart() {
super.onStart();
setBackground(BackgroundUtil.isSetBackground(requireContext()));
- initData();
}
@SuppressLint("NonConstantResourceId")
@@ -119,12 +110,8 @@ public class MoreFragment extends Fragment implements View.OnClickListener {
startActivity(intent);
break;
case R.id.more_credits:
- if (generalData.isInternational()) {
- DialogUtil.showTextDialog(getContext(), "国际学院教务系统暂无此功能");
- } else {
- intent = new Intent(getContext(), GradesActivity.class);
- startActivity(intent);
- }
+ intent = new Intent(getContext(), GradesActivity.class);
+ startActivity(intent);
break;
case R.id.more_test_scores:
intent = new Intent(getContext(), ExamScoreActivity.class);
@@ -143,12 +130,8 @@ public class MoreFragment extends Fragment implements View.OnClickListener {
startActivity(intent);
break;
case R.id.more_selected_course:
- if (generalData.isInternational()) {
- DialogUtil.showTextDialog(getContext(), "国际学院教务系统暂无此功能");
- } else {
- intent = new Intent(getContext(), SelectedCourseActivity.class);
- startActivity(intent);
- }
+ intent = new Intent(getContext(), SelectedCourseActivity.class);
+ startActivity(intent);
break;
@@ -169,7 +152,7 @@ public class MoreFragment extends Fragment implements View.OnClickListener {
CommFunc.noLoginWebVPN(getActivity());
break;
case R.id.more_url_campus:
- openBrowser(requireContext().getResources().getString(R.string.url_smart_campus));
+ CommFunc.noLoginWebICampus(getActivity());
break;
case R.id.more_url_lijiang:
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/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..e91f570bbb04e09e7118b95e33b1739fe2a0701d 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,7 +39,6 @@ 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);
settingData = SettingData.newInstance(activity);
@@ -153,7 +151,7 @@ public class AutoUpdate {
);
if (getClass != null) {
courseBeans = getClass;
- scheduleData.setCourseBeans(courseBeans);
+ ScheduleData.setCourseBeans(courseBeans);
} else {
updateView(92);
state = tokenData.refresh();
@@ -170,7 +168,7 @@ public class AutoUpdate {
);
if (getClass != null) {
courseBeans = getClass;
- scheduleData.setCourseBeans(courseBeans);
+ ScheduleData.setCourseBeans(courseBeans);
} else {
updateView(3);
return;
@@ -186,7 +184,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 +198,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 0924ad39c38acfd4df96c0a7a0b8dd9e2913d2b0..f6fa2cfb20ad01ef399357a57bdb1396f16d5f16 100644
--- a/app/src/main/java/top/yvyan/guettable/service/CommFunc.java
+++ b/app/src/main/java/top/yvyan/guettable/service/CommFunc.java
@@ -14,7 +14,6 @@ import java.util.Objects;
import top.yvyan.guettable.R;
import top.yvyan.guettable.activity.WebViewActivity;
-import top.yvyan.guettable.data.GeneralData;
import top.yvyan.guettable.data.TokenData;
import top.yvyan.guettable.util.AppUtil;
import top.yvyan.guettable.util.DialogUtil;
@@ -90,8 +89,8 @@ public class CommFunc {
final boolean[] noLogin = {false};
TokenData tokenData = TokenData.newInstance(activity);
Intent intent = new Intent(activity, WebViewActivity.class);
- intent.putExtra(WebViewActivity.WEB_URL, UrlReplaceUtil.getUrlByVPN(TokenData.isVPN, UrlReplaceUtil.getUrlByInternational(GeneralData.newInstance(activity).isInternational(), "/Login/MainDesktop")));
- intent.putExtra(WebViewActivity.WEB_SHARE_URL, UrlReplaceUtil.getUrlByVPN(TokenData.isVPN, UrlReplaceUtil.getUrlByInternational(GeneralData.newInstance(activity).isInternational(), "/")));
+ intent.putExtra(WebViewActivity.WEB_URL, UrlReplaceUtil.getBkjwUrlByVPN(TokenData.isVPN(), "/Login/MainDesktop"));
+ intent.putExtra(WebViewActivity.WEB_SHARE_URL, UrlReplaceUtil.getBkjwUrlByVPN(TokenData.isVPN(), "/"));
DialogUtil.IDialogService iDialogService = new DialogUtil.IDialogService() {
@Override
public void onClickYes() {
@@ -105,7 +104,7 @@ public class CommFunc {
}
};
final AlertDialog[] dialog = new AlertDialog[1];
- activity.runOnUiThread(() -> dialog[0] = DialogUtil.setTextDialog(activity, "自动登录中...(最长需要20s)", "跳过", iDialogService, true));
+ activity.runOnUiThread(() -> dialog[0] = DialogUtil.setTextDialog(activity, "自动登录中...(最长需要15s)", "跳过", iDialogService, true));
tokenData.refresh();
if (!noLogin[0]) {
@@ -115,9 +114,9 @@ public class CommFunc {
}
WebViewActivity.cleanCash(Objects.requireNonNull(activity));
});
- intent.putExtra(WebViewActivity.WEB_URL, UrlReplaceUtil.getUrlByVPN(TokenData.isVPN, UrlReplaceUtil.getUrlByInternational(GeneralData.newInstance(activity).isInternational(), "/Login/MainDesktop")));
- intent.putExtra(WebViewActivity.WEB_SHARE_URL, UrlReplaceUtil.getUrlByVPN(TokenData.isVPN, UrlReplaceUtil.getUrlByInternational(GeneralData.newInstance(activity).isInternational(), "/")));
- intent.putExtra(WebViewActivity.WEB_REFERER, UrlReplaceUtil.getUrlByVPN(TokenData.isVPN, UrlReplaceUtil.getUrlByInternational(GeneralData.newInstance(activity).isInternational(), "/")));
+ intent.putExtra(WebViewActivity.WEB_URL, UrlReplaceUtil.getBkjwUrlByVPN(TokenData.isVPN(), "/Login/MainDesktop"));
+ intent.putExtra(WebViewActivity.WEB_SHARE_URL, UrlReplaceUtil.getBkjwUrlByVPN(TokenData.isVPN(), "/"));
+ intent.putExtra(WebViewActivity.WEB_REFERER, UrlReplaceUtil.getBkjwUrlByVPN(TokenData.isVPN(), "/"));
intent.putExtra(WebViewActivity.WEB_COOKIE, tokenData.getCookie());
AppUtil.reportFunc(activity, "登录教务-免登录");
activity.startActivity(intent);
@@ -125,6 +124,61 @@ public class CommFunc {
}).start();
}
+ /**
+ * 自动登录智慧校园
+ *
+ * @param activity activity
+ */
+ public static void noLoginWebICampus(Activity activity) {
+ new Thread(() -> {
+ final boolean[] noLogin = {false};
+ TokenData tokenData = TokenData.newInstance(activity);
+ Intent intent = new Intent(activity, WebViewActivity.class);
+ intent.putExtra(WebViewActivity.WEB_URL, activity.getResources().getString(R.string.url_smart_campus));
+ intent.putExtra(WebViewActivity.WEB_SHARE_URL, activity.getResources().getString(R.string.url_smart_campus));
+ DialogUtil.IDialogService iDialogService = new DialogUtil.IDialogService() {
+ @Override
+ public void onClickYes() {
+ AppUtil.reportFunc(activity, "智慧校园-跳过");
+ activity.startActivity(intent);
+ noLogin[0] = true;
+ }
+
+ @Override
+ public void onClickBack() {
+ }
+ };
+ final AlertDialog[] dialog = new AlertDialog[1];
+ activity.runOnUiThread(() -> dialog[0] = DialogUtil.setTextDialog(activity, "自动登录中...(最长需要15s)", "跳过", iDialogService, true));
+
+ tokenData.refresh();
+ if (TokenData.isVPN()) {
+ tokenData.setVPNCASCookie();
+ }
+ if (!noLogin[0]) {
+ activity.runOnUiThread(() -> {
+ if (dialog[0] != null && dialog[0].isShowing()) {
+ dialog[0].dismiss();
+ }
+ WebViewActivity.cleanCash(Objects.requireNonNull(activity));
+ });
+ intent.putExtra(WebViewActivity.WEB_URL, activity.getResources().getString(R.string.url_smart_campus));
+ intent.putExtra(WebViewActivity.WEB_SHARE_URL, activity.getResources().getString(R.string.url_smart_campus));
+ intent.putExtra(WebViewActivity.WEB_REFERER, activity.getResources().getString(R.string.url_smart_campus));
+ //设置cookie
+ if (TokenData.isVPN()) {
+ intent.putExtra(WebViewActivity.WEB_COOKIE_URL, activity.getResources().getString(R.string.url_vpn));
+ intent.putExtra(WebViewActivity.WEB_COOKIE, tokenData.getCookie());
+ } else {
+ intent.putExtra(WebViewActivity.WEB_COOKIE_URL, activity.getResources().getString(R.string.url_Authserver));
+ intent.putExtra(WebViewActivity.WEB_COOKIE, tokenData.getCASCookie());
+ }
+ AppUtil.reportFunc(activity, "智慧校园-免登录");
+ activity.startActivity(intent);
+ }
+ }).start();
+ }
+
/**
* 自动登录VPN
*
@@ -152,12 +206,13 @@ public class CommFunc {
activity.runOnUiThread(() -> dialog[0] = DialogUtil.setTextDialog(activity, "自动建立连接中...(最长需要15s)", "跳过", iDialogService, true));
String token = tokenData.getVpnToken();
+ tokenData.setVPNCASCookie();
if (!noLogin[0]) {
activity.runOnUiThread(() -> {
dialog[0].dismiss();
WebViewActivity.cleanCash(Objects.requireNonNull(activity));
});
- intent.putExtra(WebViewActivity.WEB_REFERER, "https://v.guet.edu.cn/login");
+ intent.putExtra(WebViewActivity.WEB_REFERER, activity.getResources().getString(R.string.vpn_url));
if (token != null) {
intent.putExtra(WebViewActivity.WEB_COOKIE, token);
}
@@ -176,11 +231,10 @@ public class CommFunc {
* @param hint 提示信息
*/
public static void checkVpn(Activity activity, String web, String vpnWeb, String hint) {
- TokenData tokenData = TokenData.newInstance(activity);
if (hint != null) {
ToastUtil.showLongToast(activity, hint);
}
- if (tokenData.isVPN()) { //内网直接打开对应网址
+ if (!TokenData.isVPN()) { //内网直接打开对应网址
openBrowser(activity, web);
} else { //外网登录vpn后打开对应网址
openBrowser(activity, vpnWeb);
@@ -196,7 +250,7 @@ public class CommFunc {
*/
public static void noLoginWebVPN(Activity activity, String web, String vpnWeb) {
TokenData tokenData = TokenData.newInstance(activity);
- if (tokenData.isVPN()) { //内网直接打开对应网址
+ if (!TokenData.isVPN()) { //内网直接打开对应网址
openUrl(activity, null, web, true);
} else { //外网登录vpn后打开对应网址
new Thread(() -> {
@@ -220,6 +274,7 @@ public class CommFunc {
activity.runOnUiThread(() -> dialog[0] = DialogUtil.setTextDialog(activity, "自动建立连接中...(最长需要15s)", "跳过", iDialogService, true));
String token = tokenData.getVpnToken();
+ tokenData.setVPNCASCookie();
if (!noLogin[0]) {
activity.runOnUiThread(() -> {
dialog[0].dismiss();
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 02ac9e5851f040f91740242635122432dcbce09d..88066b6f1d88a8ee5deef0aa05cdb8b382feb471 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
@@ -6,7 +6,6 @@ import android.content.res.Resources;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.ArrayList;
-import java.util.Date;
import java.util.List;
import java.util.concurrent.TimeUnit;
@@ -18,7 +17,6 @@ import top.yvyan.guettable.Http.Get;
import top.yvyan.guettable.Http.HttpConnectionAndCode;
import top.yvyan.guettable.Http.Post;
import top.yvyan.guettable.R;
-import top.yvyan.guettable.data.GeneralData;
import top.yvyan.guettable.util.AESUtil;
import top.yvyan.guettable.util.RegularUtil;
import top.yvyan.guettable.util.UrlReplaceUtil;
@@ -34,8 +32,8 @@ public class Net {
public static int testNet() {
String url = "http://10.0.1.5/";
OkHttpClient okHttpClient = new OkHttpClient.Builder()
- .connectTimeout(3, TimeUnit.SECONDS)//设置连接超时时间
- .readTimeout(3, TimeUnit.SECONDS)//设置读取超时时间
+ .connectTimeout(1, TimeUnit.SECONDS)//设置连接超时时间
+ .readTimeout(1, TimeUnit.SECONDS)//设置读取超时时间
.build();
final Request request = new Request.Builder()
.url(url)
@@ -82,28 +80,34 @@ public class Net {
* @param context context
* @param account 学号
* @param password 密码
- * @param VPNToken VPNToken
- * @return CAS服务Cookie *请求
+ * @param TGTToken CAS-TGT
+ * @param MFACookie 2FA二次验证Cookie
+ * @return CAS-TGT;
*/
- public static HttpConnectionAndCode getCASToken(Context context, String account, String password, String VPNToken) {
+ public static HttpConnectionAndCode getCASToken(Context context, String account, String password, String TGTToken, String MFACookie) {
StringBuilder cookie_builder = new StringBuilder();
+ String AuthCookie = (MFACookie != null ? MFACookie : "") + (TGTToken != null ? ((MFACookie!=null ? "; " : "")+TGTToken) : "");
try {
Resources resources = context.getResources();
HttpConnectionAndCode loginParams = Get.get(
- VPNToken != null ? resources.getString(R.string.url_Authserver_VPN) : resources.getString(R.string.url_Authserver),
+ resources.getString(R.string.url_Authserver),
null,
resources.getString(R.string.user_agent),
resources.getString(R.string.SSO_referer),
- VPNToken,
+ !AuthCookie.equals("") ? AuthCookie : null,
null,
resources.getString(R.string.cookie_delimiter),
null,
null,
- null,
+ false,
null,
10000,
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);
}
cookie_builder.append(loginParams.cookie);
@@ -113,49 +117,34 @@ public class Net {
String execution = listExp.get(0);
String body = "username=" + account + "&password=" + URLEncoder.encode(AESUtil.CASEncryption(password, AESKey), "UTF-8") + "&captcha=&_eventId=submit&cllt=userNameLogin&dllt=generalLogin<=&execution=" + URLEncoder.encode(execution, "UTF-8");
HttpConnectionAndCode LoginRequest = Post.post(
- VPNToken != null ? resources.getString(R.string.url_Authserver_VPN) : resources.getString(R.string.url_Authserver),
+ resources.getString(R.string.url_Authserver),
null,
resources.getString(R.string.user_agent),
resources.getString(R.string.SSO_referer),
body,
- VPNToken == null ? cookie_builder.toString() : VPNToken ,
+ cookie_builder + (MFACookie != null ? ("; " + MFACookie) : ""),
"}",
resources.getString(R.string.cookie_delimiter),
null,
null,
false,
resources.getString(R.string.SSO_context_type));
- if (VPNToken==null && LoginRequest.code == -7) {
+ if( LoginRequest.resp_code == 401 ) {
+ return new HttpConnectionAndCode(-8); //密码错误
+ }
+ if (LoginRequest.code == -7) {
List cookies = LoginRequest.c.getHeaderFields().get("Set-Cookie");
if (cookies != null) {
cookie_builder.append("; ");
for (String cookie_resp : cookies) {
- cookie_builder.append(cookie_resp.substring(0, cookie_resp.indexOf(";") + 1)).append(" ");
+ 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.code=0;
+ LoginRequest.cookie = cookie_builder.toString();
+ LoginRequest.cookie = LoginRequest.cookie.substring(0, LoginRequest.cookie.length() - 2);
+ LoginRequest.code = 0;
return LoginRequest;
}
- if(VPNToken != null) {
- //获取 Cookie 判断是否登录成功
- HttpConnectionAndCode VPNGetCookieRequest = Get.get(
- resources.getString(R.string.vpn_get_cookie) + "&vpn_timestamp=" + new Date().getTime(),
- null,
- resources.getString(R.string.user_agent),
- resources.getString(R.string.url_Authserver_VPN),
- VPNToken,
- null,
- resources.getString(R.string.cookie_delimiter),
- null,
- null,
- null,
- null,
- 10000,
- null);
- return new HttpConnectionAndCode(LoginRequest.c,VPNGetCookieRequest.code,VPNGetCookieRequest.comment);
- }
return LoginRequest;
} catch (Exception ignored) {
@@ -168,19 +157,18 @@ public class Net {
*
* @param context context
* @param CASCookie CAS Cookie
- * @param account
- * @param VPNToken VPNToken
+ * @param account account
* @return Response
*/
- public static HttpConnectionAndCode sendPhoneOTP(Context context, String CASCookie,String account, String VPNToken) {
+ public static HttpConnectionAndCode sendPhoneOTP(Context context, String account, String CASCookie) {
Resources resources = context.getResources();
return Post.post(
- (VPNToken != null ? resources.getString(R.string.url_SendPhoneOTP_VPN) : resources.getString(R.string.url_SendPhoneOTP)),
+ resources.getString(R.string.url_SendPhoneOTP),
null,
resources.getString(R.string.user_agent),
resources.getString(R.string.SSO_referer),
- "userName="+account+"&authCodeTypeName=reAuthDynamicCodeType",
- VPNToken == null ? CASCookie : VPNToken ,
+ "userName=" + account + "&authCodeTypeName=reAuthDynamicCodeType",
+ CASCookie,
null,
resources.getString(R.string.cookie_delimiter),
null,
@@ -194,34 +182,42 @@ public class Net {
*
* @param context context
* @param CASCookie CAS Cookie
- * @param OTP
- * @param VPNToken VPNToken
+ * @param OTP OTP
* @return Response
*/
- public static HttpConnectionAndCode verifyPhoneOTP(Context context, String CASCookie,String OTP, String VPNToken) {
+ public static HttpConnectionAndCode verifyPhoneOTP(Context context, String OTP, String CASCookie) {
Resources resources = context.getResources();
- HttpConnectionAndCode VerifyRequest = Post.post(
- (VPNToken != null ? resources.getString(R.string.url_ReAuth_VPN) : resources.getString(R.string.url_ReAuth)),
+ return Post.post(
+ resources.getString(R.string.url_ReAuth),
null,
resources.getString(R.string.user_agent),
resources.getString(R.string.SSO_referer),
- "service=http%3A%2F%2Ficampus.guet.edu.cn%2FGuetAccount%2FCasLogin&reAuthType=3&isMultifactor=true&password=&dynamicCode="+OTP+"&uuid=&answer1=&answer2=&otpCode=",
- VPNToken == null ? CASCookie : VPNToken ,
+ "service=http%3A%2F%2Ficampus.guet.edu.cn%2FGuetAccount%2FCasLogin&reAuthType=3&isMultifactor=true&password=&dynamicCode=" + OTP + "&uuid=&answer1=&answer2=&otpCode=",
+ CASCookie,
null,
resources.getString(R.string.cookie_delimiter),
null,
null,
false,
resources.getString(R.string.SSO_context_type));
- if(VPNToken == null) {
- return VerifyRequest;
- } else {
- HttpConnectionAndCode VPNGetCookieRequest = Get.get(
- resources.getString(R.string.vpn_get_cookie) + "&vpn_timestamp=" + new Date().getTime(),
+ }
+
+ /**
+ * 认证手机验证码
+ *
+ * @param context context
+ * @param CASCookie CAS Cookie
+ * @return Response
+ */
+ public static HttpConnectionAndCode bypass2FA(Context context, String password, String CASCookie) {
+ Resources resources = context.getResources();
+ try {
+ HttpConnectionAndCode MFAParams = Get.get(
+ resources.getString(R.string.url_ReAuth_Param),
null,
resources.getString(R.string.user_agent),
- resources.getString(R.string.url_Authserver_VPN),
- VPNToken,
+ resources.getString(R.string.SSO_referer),
+ CASCookie,
null,
resources.getString(R.string.cookie_delimiter),
null,
@@ -230,8 +226,97 @@ public class Net {
null,
10000,
null);
- return new HttpConnectionAndCode(VerifyRequest.c,VerifyRequest.code,VerifyRequest.comment,VPNGetCookieRequest.comment, VerifyRequest.resp_code);
+ if (MFAParams.code != 0) {
+ return new HttpConnectionAndCode(0);
+ }
+ ArrayList listExp = RegularUtil.getAllSatisfyStr(MFAParams.comment, "(?<=\"pwdEncryptSalt\":\")(\\w+)(?=\")");
+ String AESKey = listExp.get(0);
+
+ return Post.post(
+ resources.getString(R.string.url_ReAuth),
+ null,
+ resources.getString(R.string.user_agent),
+ resources.getString(R.string.SSO_referer),
+ "service=http%3A%2F%2Ficampus.guet.edu.cn%2FGuetAccount%2FCasLogin&reAuthType=2&isMultifactor=true&password=" + URLEncoder.encode(AESUtil.CASEncryption(password, AESKey), "UTF-8") + "&dynamicCode=&uuid=&answer1=&answer2=&otpCode=",
+ CASCookie,
+ null,
+ resources.getString(R.string.cookie_delimiter),
+ null,
+ null,
+ false,
+ resources.getString(R.string.SSO_context_type));
+ } catch (Exception ignored) {
+ }
+ return new HttpConnectionAndCode(0);
+ }
+
+ public static HttpConnectionAndCode loginVPNST(Context context, String ST, String VPNToken) {
+ Resources resources = context.getResources();
+ return Get.get(
+ "https://v.guet.edu.cn/login?cas_login=true&ticket=" + ST,
+ null,
+ resources.getString(R.string.user_agent),
+ resources.getString(R.string.SSO_referer),
+ VPNToken,
+ null,
+ resources.getString(R.string.cookie_delimiter),
+ null,
+ null,
+ null,
+ null,
+ 3000,
+ null);
+ }
+
+ /**
+ * 向VPN添加Cookie
+ *
+ * @param host 域
+ * @param path 路径
+ * @param cookie cookie
+ * @param VPNToken VPN Token
+ * @return 0 成功
+ */
+ public static HttpConnectionAndCode CookieSet(Context context, String host, String path, String cookie, String VPNToken) {
+ Resources resources = context.getResources();
+ try {
+ return Get.get(
+ "https://v.guet.edu.cn/wengine-vpn/cookie?method=set" + "&host=" + host +
+ "&path=" + path +
+ "&scheme=https&ck_data=" + URLEncoder.encode(cookie, "UTF-8"),
+ null,
+ resources.getString(R.string.user_agent),
+ "https://v.guet.edu.cn",
+ VPNToken,
+ null,
+ resources.getString(R.string.cookie_delimiter),
+ null,
+ null,
+ false,
+ null,
+ 3000,
+ null);
+ } catch (Exception ignore) {
}
+ return new HttpConnectionAndCode(-1);
+ }
+
+ public static HttpConnectionAndCode loginBkjwVPNST(Context context, String ST, String VPNToken) {
+ Resources resources = context.getResources();
+ return Get.get(
+ "https://v.guet.edu.cn/http/77726476706e69737468656265737421f2fc4b8b69377d556a468ca88d1b203b?ticket=" + ST,
+ null,
+ resources.getString(R.string.user_agent),
+ "https://v.guet.edu.cn",
+ VPNToken,
+ null,
+ resources.getString(R.string.cookie_delimiter),
+ null,
+ null,
+ true,
+ null,
+ 3000,
+ null);
}
/**
@@ -240,17 +325,16 @@ public class Net {
* @param context context
* @param CASCookie CAS Cookie
* @param service ST令牌的服务端
- * @param VPNToken VPNToken
* @return ST令牌
*/
- public static HttpConnectionAndCode getSTbyCas(Context context, String CASCookie, String service, String VPNToken) {
+ public static HttpConnectionAndCode getSTbyCas(Context context, String CASCookie, String service, String MFACookie) {
Resources resources = context.getResources();
return Get.get(
- (VPNToken != null ? resources.getString(R.string.url_Authserver_VPN) : resources.getString(R.string.url_Authserver)) + "?" + service,
+ resources.getString(R.string.url_Authserver) + "?" + service,
null,
resources.getString(R.string.user_agent),
resources.getString(R.string.SSO_referer),
- VPNToken == null ? CASCookie : VPNToken,
+ CASCookie + (MFACookie != null ? ("; " + MFACookie) : ""),
null,
resources.getString(R.string.cookie_delimiter),
null,
@@ -305,10 +389,10 @@ public class Net {
public static HttpConnectionAndCode studentInfo(Context context, String cookie, boolean isVPN) {
Resources resources = context.getResources();
return Post.post(
- UrlReplaceUtil.getUrlByVPN(isVPN, UrlReplaceUtil.getUrlByInternational(GeneralData.newInstance(context).isInternational(), resources.getString(R.string.lan_get_student_url))),
+ UrlReplaceUtil.getBkjwUrlByVPN(isVPN, resources.getString(R.string.lan_get_student_url)),
null,
resources.getString(R.string.user_agent),
- UrlReplaceUtil.getUrlByVPN(isVPN, UrlReplaceUtil.getUrlByInternational(GeneralData.newInstance(context).isInternational(), resources.getString(R.string.lan_referer))),
+ UrlReplaceUtil.getBkjwUrlByVPN(isVPN, resources.getString(R.string.lan_referer)),
null,
cookie,
"}",
@@ -332,10 +416,10 @@ public class Net {
Resources resources = context.getResources();
String[] param = {"term=" + term};
return Get.get(
- UrlReplaceUtil.getUrlByVPN(isVPN, UrlReplaceUtil.getUrlByInternational(GeneralData.newInstance(context).isInternational(), resources.getString(R.string.lan_get_table_url))),
+ UrlReplaceUtil.getBkjwUrlByVPN(isVPN, resources.getString(R.string.lan_get_table_url)),
param,
resources.getString(R.string.user_agent),
- UrlReplaceUtil.getUrlByVPN(isVPN, UrlReplaceUtil.getUrlByInternational(GeneralData.newInstance(context).isInternational(), resources.getString(R.string.lan_referer))),
+ UrlReplaceUtil.getBkjwUrlByVPN(isVPN, resources.getString(R.string.lan_referer)),
cookie,
"]}",
null,
@@ -361,10 +445,10 @@ public class Net {
Resources resources = context.getResources();
String[] param = {"term=" + term};
return Get.get(
- UrlReplaceUtil.getUrlByVPN(isVPN, UrlReplaceUtil.getUrlByInternational(GeneralData.newInstance(context).isInternational(), resources.getString(R.string.lan_get_lab_table_url))),
+ UrlReplaceUtil.getBkjwUrlByVPN(isVPN, resources.getString(R.string.lan_get_lab_table_url)),
param,
resources.getString(R.string.user_agent),
- UrlReplaceUtil.getUrlByVPN(isVPN, UrlReplaceUtil.getUrlByInternational(GeneralData.newInstance(context).isInternational(), resources.getString(R.string.lan_referer))),
+ UrlReplaceUtil.getBkjwUrlByVPN(isVPN, resources.getString(R.string.lan_referer)),
cookie,
"]}",
null,
@@ -390,10 +474,10 @@ public class Net {
Resources resources = context.getResources();
String[] param = {"term=" + term};
return Get.get(
- UrlReplaceUtil.getUrlByVPN(isVPN, UrlReplaceUtil.getUrlByInternational(GeneralData.newInstance(context).isInternational(), resources.getString(R.string.lan_get_exam_url))),
+ UrlReplaceUtil.getBkjwUrlByVPN(isVPN, resources.getString(R.string.lan_get_exam_url)),
param,
resources.getString(R.string.user_agent),
- UrlReplaceUtil.getUrlByVPN(isVPN, UrlReplaceUtil.getUrlByInternational(GeneralData.newInstance(context).isInternational(), resources.getString(R.string.lan_referer))),
+ UrlReplaceUtil.getBkjwUrlByVPN(isVPN, resources.getString(R.string.lan_referer)),
cookie,
"]}",
null,
@@ -417,10 +501,10 @@ public class Net {
public static HttpConnectionAndCode getResit(Context context, String cookie, boolean isVPN) {
Resources resources = context.getResources();
return Get.get(
- UrlReplaceUtil.getUrlByVPN(isVPN, UrlReplaceUtil.getUrlByInternational(GeneralData.newInstance(context).isInternational(), resources.getString(R.string.lan_get_resit_url))),
+ UrlReplaceUtil.getBkjwUrlByVPN(isVPN, resources.getString(R.string.lan_get_resit_url)),
null,
resources.getString(R.string.user_agent),
- UrlReplaceUtil.getUrlByVPN(isVPN, UrlReplaceUtil.getUrlByInternational(GeneralData.newInstance(context).isInternational(), resources.getString(R.string.lan_referer))),
+ UrlReplaceUtil.getBkjwUrlByVPN(isVPN, resources.getString(R.string.lan_referer)),
cookie,
"]}",
null,
@@ -444,10 +528,10 @@ public class Net {
public static HttpConnectionAndCode getCET(Context context, String cookie, boolean isVPN) {
Resources resources = context.getResources();
return Get.get(
- UrlReplaceUtil.getUrlByVPN(isVPN, UrlReplaceUtil.getUrlByInternational(GeneralData.newInstance(context).isInternational(), resources.getString(R.string.lan_get_cet_url))),
+ UrlReplaceUtil.getBkjwUrlByVPN(isVPN, resources.getString(R.string.lan_get_cet_url)),
null,
resources.getString(R.string.user_agent),
- UrlReplaceUtil.getUrlByVPN(isVPN, UrlReplaceUtil.getUrlByInternational(GeneralData.newInstance(context).isInternational(), resources.getString(R.string.lan_referer))),
+ UrlReplaceUtil.getBkjwUrlByVPN(isVPN, resources.getString(R.string.lan_referer)),
cookie,
"]}",
null,
@@ -471,10 +555,10 @@ public class Net {
public static HttpConnectionAndCode getExamScore(Context context, String cookie, boolean isVPN) {
Resources resources = context.getResources();
return Get.get(
- UrlReplaceUtil.getUrlByVPN(isVPN, UrlReplaceUtil.getUrlByInternational(GeneralData.newInstance(context).isInternational(), resources.getString(R.string.lan_get_examscore_url))),
+ UrlReplaceUtil.getBkjwUrlByVPN(isVPN, resources.getString(R.string.lan_get_examscore_url)),
null,
resources.getString(R.string.user_agent),
- UrlReplaceUtil.getUrlByVPN(isVPN, UrlReplaceUtil.getUrlByInternational(GeneralData.newInstance(context).isInternational(), resources.getString(R.string.lan_referer))),
+ UrlReplaceUtil.getBkjwUrlByVPN(isVPN, resources.getString(R.string.lan_referer)),
cookie,
"]}",
null,
@@ -498,10 +582,10 @@ public class Net {
public static HttpConnectionAndCode getExperimentScore(Context context, String cookie, boolean isVPN) {
Resources resources = context.getResources();
return Get.get(
- UrlReplaceUtil.getUrlByVPN(isVPN, UrlReplaceUtil.getUrlByInternational(GeneralData.newInstance(context).isInternational(), resources.getString(R.string.lan_get_experimentscore_url))),
+ UrlReplaceUtil.getBkjwUrlByVPN(isVPN, resources.getString(R.string.lan_get_experimentscore_url)),
null,
resources.getString(R.string.user_agent),
- UrlReplaceUtil.getUrlByVPN(isVPN, UrlReplaceUtil.getUrlByInternational(GeneralData.newInstance(context).isInternational(), resources.getString(R.string.lan_referer))),
+ UrlReplaceUtil.getBkjwUrlByVPN(isVPN, resources.getString(R.string.lan_referer)),
cookie,
"]}",
null,
@@ -515,7 +599,7 @@ public class Net {
}
/**
- * 同步有效课程
+ * 同步有效学分
*
* @param context context
* @param cookie 登录后的cookie
@@ -525,10 +609,10 @@ public class Net {
public static HttpConnectionAndCode updateEffectiveCredits(Context context, String cookie, boolean isVPN) {
Resources resources = context.getResources();
return Post.post(
- UrlReplaceUtil.getUrlByVPN(isVPN, UrlReplaceUtil.getUrlByInternational(GeneralData.newInstance(context).isInternational(), resources.getString(R.string.lan_update_effective_credits))),
+ UrlReplaceUtil.getBkjwUrlByVPN(isVPN, resources.getString(R.string.lan_update_effective_credits)),
null,
resources.getString(R.string.user_agent),
- UrlReplaceUtil.getUrlByVPN(isVPN, UrlReplaceUtil.getUrlByInternational(GeneralData.newInstance(context).isInternational(), resources.getString(R.string.lan_referer))),
+ UrlReplaceUtil.getBkjwUrlByVPN(isVPN, resources.getString(R.string.lan_referer)),
null,
cookie,
"}",
@@ -551,10 +635,10 @@ public class Net {
public static HttpConnectionAndCode getEffectiveCredits(Context context, String cookie, boolean isVPN) {
Resources resources = context.getResources();
return Get.get(
- UrlReplaceUtil.getUrlByVPN(isVPN, UrlReplaceUtil.getUrlByInternational(GeneralData.newInstance(context).isInternational(), resources.getString(R.string.lan_get_effective_credits))),
+ UrlReplaceUtil.getBkjwUrlByVPN(isVPN, resources.getString(R.string.lan_get_effective_credits)),
null,
resources.getString(R.string.user_agent),
- UrlReplaceUtil.getUrlByVPN(isVPN, UrlReplaceUtil.getUrlByInternational(GeneralData.newInstance(context).isInternational(), resources.getString(R.string.lan_referer))),
+ UrlReplaceUtil.getBkjwUrlByVPN(isVPN, resources.getString(R.string.lan_referer)),
cookie,
"]}",
null,
@@ -578,10 +662,10 @@ public class Net {
public static HttpConnectionAndCode getPlannedCourses(Context context, String cookie, boolean isVPN) {
Resources resources = context.getResources();
return Get.get(
- UrlReplaceUtil.getUrlByVPN(isVPN, UrlReplaceUtil.getUrlByInternational(GeneralData.newInstance(context).isInternational(), resources.getString(R.string.lan_get_planned_credits))),
+ UrlReplaceUtil.getBkjwUrlByVPN(isVPN, resources.getString(R.string.lan_get_planned_credits)),
null,
resources.getString(R.string.user_agent),
- UrlReplaceUtil.getUrlByVPN(isVPN, UrlReplaceUtil.getUrlByInternational(GeneralData.newInstance(context).isInternational(), resources.getString(R.string.lan_referer))),
+ UrlReplaceUtil.getBkjwUrlByVPN(isVPN, resources.getString(R.string.lan_referer)),
cookie,
"]}",
null,
@@ -607,10 +691,10 @@ public class Net {
Resources resources = context.getResources();
String[] param = {"comm=1%401", "term=".concat(term)};
return Get.get(
- UrlReplaceUtil.getUrlByVPN(isVPN, resources.getString(R.string.lan_get_selected_course)),
+ UrlReplaceUtil.getBkjwUrlByVPN(isVPN, resources.getString(R.string.lan_get_selected_course)),
param,
resources.getString(R.string.user_agent),
- UrlReplaceUtil.getUrlByVPN(isVPN, UrlReplaceUtil.getUrlByInternational(GeneralData.newInstance(context).isInternational(), resources.getString(R.string.lan_referer))),
+ UrlReplaceUtil.getBkjwUrlByVPN(isVPN, resources.getString(R.string.lan_referer)),
cookie,
"]}",
null,
@@ -634,10 +718,10 @@ public class Net {
public static HttpConnectionAndCode getGrades(Context context, String cookie, boolean isVPN) {
Resources resources = context.getResources();
return Get.get(
- UrlReplaceUtil.getUrlByVPN(isVPN, UrlReplaceUtil.getUrlByInternational(false, resources.getString(R.string.lan_get_grades_url))),
+ UrlReplaceUtil.getBkjwUrlByVPN(isVPN, resources.getString(R.string.lan_get_grades_url)),
null,
resources.getString(R.string.user_agent),
- UrlReplaceUtil.getUrlByVPN(isVPN, UrlReplaceUtil.getUrlByInternational(GeneralData.newInstance(context).isInternational(), resources.getString(R.string.lan_referer))),
+ UrlReplaceUtil.getBkjwUrlByVPN(isVPN, resources.getString(R.string.lan_referer)),
cookie,
"]}",
null,
@@ -661,10 +745,10 @@ public class Net {
public static HttpConnectionAndCode getAllTerms(Context context, String cookie, boolean isVPN) {
Resources resources = context.getResources();
return Get.get(
- UrlReplaceUtil.getUrlByVPN(isVPN, UrlReplaceUtil.getUrlByInternational(false, resources.getString(R.string.lan_get_terms_url))),
+ UrlReplaceUtil.getBkjwUrlByVPN(isVPN, resources.getString(R.string.lan_get_terms_url)),
null,
resources.getString(R.string.user_agent),
- UrlReplaceUtil.getUrlByVPN(isVPN, UrlReplaceUtil.getUrlByInternational(GeneralData.newInstance(context).isInternational(), resources.getString(R.string.lan_referer))),
+ UrlReplaceUtil.getBkjwUrlByVPN(isVPN, resources.getString(R.string.lan_referer)),
cookie,
"]}",
null,
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 1d0856189b562025661fc3542c33d76c4b72a4c2..5d9b6e86694f49fa0e1228537bd1df5308b1599d 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
@@ -5,16 +5,10 @@ import android.content.Context;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
-import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
-import java.util.Objects;
-import okhttp3.Call;
-import okhttp3.OkHttpClient;
-import okhttp3.Request;
-import okhttp3.Response;
import top.yvyan.guettable.Gson.BaseResponse;
import top.yvyan.guettable.Gson.CET;
import top.yvyan.guettable.Gson.ClassTable;
@@ -46,22 +40,20 @@ public class StaticService {
* 发送手机验证码
*
* @param context context
- * @param CASCookie
+ * @param CASCookie CAS Cookie
* @param account 学号
- * @param VPNToken VPNToken
* @return Phone Number
* ERROR0 : 网络错误
* ERROR1 : 密码错误
* ERROR2 : 需要使用外网网址进行访问
* ERROR3 : 验证码发送CD
*/
- public static String SendPhoneOTP(Context context, String CASCookie, String account, String VPNToken) {
- HttpConnectionAndCode response = Net.sendPhoneOTP(context, CASCookie, account, VPNToken);
+ public static String SendPhoneOTP(Context context, String account, String CASCookie) {
+ HttpConnectionAndCode response = Net.sendPhoneOTP(context, account, CASCookie);
if (response.code != 0) {
if (response.code == -5) {
return "ERROR2";
}
- return "ERROR0";
} else {
if (response.comment.contains("success")) {
int PhoneIndex = response.comment.indexOf("\"mobile\":\"") + 10;
@@ -72,7 +64,22 @@ public class StaticService {
String ErrorMessage = response.comment.substring(MessageIndex);
return "ERROR3;" + ErrorMessage.substring(0, ErrorMessage.indexOf("\""));
}
+ }
+ return "ERROR0";
+ }
+
+ public static String bypass2FA(Context context, String Password, String CASCookie) {
+ HttpConnectionAndCode response = Net.bypass2FA(context, Password, CASCookie);
+ if (response.code != 0) {
+ if (response.code == -5) {
+ return "ERROR2";
+ }
return "ERROR0";
+ } else {
+ if (response.comment.contains("reAuth_success")) {
+ return response.cookie;
+ }
+ return "ERROR1";
}
}
@@ -80,16 +87,15 @@ public class StaticService {
* 发送手机验证码
*
* @param context context
- * @param CASCookie
+ * @param CASCookie CAS Cookie
* @param OTP OTP手机验证码
- * @param VPNToken VPNToken
* @return 多因素身份验证令牌Cookie
* ERROR0 : 网络错误
* ERROR1 : 密码错误
* ERROR2 : 需要使用外网网址进行访问
*/
- public static String VerifyPhoneOTP(Context context, String CASCookie, String OTP, String VPNToken) {
- HttpConnectionAndCode response = Net.verifyPhoneOTP(context, CASCookie, OTP, VPNToken);
+ public static String VerifyPhoneOTP(Context context, String OTP, String CASCookie) {
+ HttpConnectionAndCode response = Net.verifyPhoneOTP(context, OTP, CASCookie);
if (response.code != 0) {
if (response.code == -5) {
return "ERROR2";
@@ -97,17 +103,7 @@ public class StaticService {
return "ERROR0";
} else {
if (response.comment.contains("reAuth_success")) {
- if (VPNToken == null) {
- return response.cookie;
- } else {
- String MultiFactorCookie = response.cookie.substring(response.cookie.indexOf("MULTIFACTOR_USERS"));
- int CookieEnd = MultiFactorCookie.indexOf(";");
- if (CookieEnd >= 0) {
- return MultiFactorCookie.substring(0, CookieEnd);
- } else {
- return MultiFactorCookie;
- }
- }
+ return response.cookie;
}
return "ERROR1";
}
@@ -116,46 +112,45 @@ public class StaticService {
/**
* 获取SSO登录CasCookie
*
- * @param context context
- * @param account 学号
- * @param password 密码
- * @param VPNToken VPNToken
+ * @param context context
+ * @param account 学号
+ * @param password 密码
+ * @param MFACookie MFA Cookie
+ * @param TGTToken TGTToken
* @return CAS Cookie
* ERROR0 : 网络错误
* ERROR1 : 密码错误
* ERROR2 : 需要使用外网网址进行访问
* ERROR5 : 2FA Needed
*/
- public static String SSOLogin(Context context, String account, String password, String VPNToken) {
- HttpConnectionAndCode response = Net.getCASToken(context, account, password, VPNToken);
+ public static String SSOLogin(Context context, String account, String password, String TGTToken, String MFACookie) {
+ HttpConnectionAndCode response = Net.getCASToken(context, account, password, TGTToken, MFACookie);
if (response.code != 0) {
- if (response.code == -5) {
- return "ERROR2";
+ 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) {
+ return "ERROR1";
}
return "ERROR0";
} else {
- if (VPNToken == null) {
- String Cookie = response.cookie;
- if (Cookie.contains("TGT-")) {
- String Location = response.c.getHeaderField("location");
- if (Location.contains("reAuthLoginView.do")) {
- return "ERROR5;" + Cookie;
- }
- return Cookie;
- } else {
- return "ERROR1";
+ String Cookie = response.cookie;
+ if (Cookie.contains("TGT-")) {
+ String Location = response.c.getHeaderField("location");
+ if (Location.contains("reAuthLoginView.do")) {
+ return "ERROR5;" + Cookie;
}
+ return Cookie;
} else {
- String Cookie = response.comment;
- if (Cookie.contains("TGT-")) {
- String Location = response.c.getHeaderField("location");
- if (Location.contains("reAuthLoginView.do")) {
- return "ERROR5;" + Cookie;
- }
- return Cookie;
- } else {
- return "ERROR1";
- }
+ return "ERROR1";
}
}
}
@@ -166,25 +161,18 @@ public class StaticService {
* @param context context
* @param CASCookie CAS Cookie
* @param service ST令牌的服务端
- * @param VPNToken VPNToken
* @return ST令牌
* ERROR0 : 网络错误
* ERROR1 : TGT失效
* ERROR2 : 需要使用外网网址进行访问 或 TGT失效(上层调用时,若内网返回此错误,
* 则先尝试外网,若是TGT失效,则重新获取;若正常获取,则需要将全局网络设置为外网)
*/
- public static String SSOGetST(Context context, String CASCookie, String service, String VPNToken) {
- HttpConnectionAndCode response = Net.getSTbyCas(context, CASCookie, service, VPNToken);
+ public static String SSOGetST(Context context, String CASCookie, String service, String MFACookie) {
+ HttpConnectionAndCode response = Net.getSTbyCas(context, CASCookie, service, MFACookie);
if (response.code != -7) {
if (response.code == -5) {
- if (VPNToken != null) {
- return "ERROR1";
- }
return "ERROR2";
}
- if (response.cookie.contains("refresh")) {
- return "ERROR1";
- }
return "ERROR0";
} else {
String Location = response.c.getHeaderField("location");
@@ -198,39 +186,41 @@ public class StaticService {
/**
* 通过ST令牌登录VPN
*
- * @param ST ST令牌
- * @param token 用于接收登录后的cookie
+ * @param context context
+ * @param ST ST令牌
+ * @param VPNToken 用于接收登录后的cookie
* @return 登录结果
* 0 -- 登录成功
* -1 -- 登录失败
* -2 -- 发生异常
*/
- public static int loginVPNST(String ST, String token) {
-
- String url = "https://v.guet.edu.cn/https/77726476706e69737468656265737421e6b94689222426557a1dc7af96/login?cas_login=true&ticket=";
- url = url + ST;
- OkHttpClient okHttpClient = new OkHttpClient();
- if (token == null) {
- token = "";
+ 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;
+ }
}
- final Request request = new Request.Builder()
- .url(url)
- .addHeader("Cookie", token)
- .build();
- final Call call = okHttpClient.newCall(request);
+ return -1;
+ }
- try {
- Response response = call.execute();
- response.close();
- if (response.body() == null || Objects.requireNonNull(response.body()).toString().contains("html lang=\"zh-cmn\"")) {
- return -1;
- } else {
+ /**
+ * 向VPN添加Cookie
+ *
+ * @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")) {
return 0;
}
- } catch (IOException e) {
- e.printStackTrace();
- return -2;
}
+ return -1;
}
/**
@@ -244,34 +234,12 @@ public class StaticService {
* -2 -- 教务登录失败
* -3 -- 发生异常
*/
- public static int loginBkjwVPNST(String ST, String VPNToken) {
-
- String url = "https://v.guet.edu.cn/http/77726476706e69737468656265737421f2fc4b8b69377d556a468ca88d1b203b/?ticket=";
- url = url + ST;
- if (VPNToken == null) {
- VPNToken = "";
- }
- OkHttpClient okHttpClient = new OkHttpClient();
- final Request request = new Request.Builder()
- .url(url)
- .addHeader("Cookie", VPNToken)
- .build();
- final Call call = okHttpClient.newCall(request);
-
- try {
- Response response = call.execute();
- response.close();
- if (response.body() == null || Objects.requireNonNull(response.body()).toString().contains("html lang=\"zh-cmn\"")) {
- return -1;
- } else if (response.body() == null || Objects.requireNonNull(response.body()).toString().contains("统一身份认证平台")) {
- return -2;
- } else {
- return 0;
- }
- } catch (IOException e) {
- e.printStackTrace();
- return -3;
+ 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;
}
/**
@@ -310,7 +278,7 @@ public class StaticService {
*/
public static List getResit(Context context, String cookie) {
List resitBeans = new ArrayList<>();
- HttpConnectionAndCode resitInfo = Net.getResit(context, cookie, TokenData.isVPN);
+ HttpConnectionAndCode resitInfo = Net.getResit(context, cookie, TokenData.isVPN());
if (resitInfo.code == 0) {
BaseResponse> baseResponse = new Gson().fromJson(resitInfo.comment, new TypeToken>>() {
}.getType());
@@ -331,7 +299,7 @@ public class StaticService {
* @return 基本学生信息
*/
public static StudentInfo getStudentInfo(Context context, String cookie) {
- HttpConnectionAndCode studentInfo = Net.studentInfo(context, cookie, TokenData.isVPN);
+ HttpConnectionAndCode studentInfo = Net.studentInfo(context, cookie, TokenData.isVPN());
if (studentInfo.code == 0) {
return new Gson().fromJson(studentInfo.comment, StudentInfo.class);
} else {
@@ -348,7 +316,7 @@ public class StaticService {
* @return 理论课程列表
*/
public static List getClass(Context context, String cookie, String term) {
- HttpConnectionAndCode classTable = Net.getClassTable(context, cookie, term, TokenData.isVPN);
+ HttpConnectionAndCode classTable = Net.getClassTable(context, cookie, term, TokenData.isVPN());
if (classTable.code == 0) {
List courseBeans = new ArrayList<>();
BaseResponse> baseResponse = new Gson().fromJson(classTable.comment, new TypeToken>>() {
@@ -371,7 +339,7 @@ public class StaticService {
* @return 课内实验列表
*/
public static List getLab(Context context, String cookie, String term) {
- HttpConnectionAndCode labTable = Net.getLabTable(context, cookie, term, TokenData.isVPN);
+ HttpConnectionAndCode labTable = Net.getLabTable(context, cookie, term, TokenData.isVPN());
if (labTable.code == 0) {
List courseBeans = new ArrayList<>();
BaseResponse> baseResponse = new Gson().fromJson(labTable.comment, new TypeToken>>() {
@@ -399,7 +367,7 @@ public class StaticService {
*/
public static List getExam(Context context, String cookie, String term) {
List examBeans = new ArrayList<>();
- HttpConnectionAndCode examInfo = Net.getExam(context, cookie, term, TokenData.isVPN);
+ HttpConnectionAndCode examInfo = Net.getExam(context, cookie, term, TokenData.isVPN());
if (examInfo.code == 0) {
BaseResponse> baseResponse = new Gson().fromJson(examInfo.comment, new TypeToken>>() {
}.getType());
@@ -421,7 +389,7 @@ public class StaticService {
*/
public static List getCET(Context context, String cookie) {
List cetBeans = new ArrayList<>();
- HttpConnectionAndCode cetInfo = Net.getCET(context, cookie, TokenData.isVPN);
+ HttpConnectionAndCode cetInfo = Net.getCET(context, cookie, TokenData.isVPN());
if (cetInfo.code == 0) {
BaseResponse> baseResponse = new Gson().fromJson(cetInfo.comment, new TypeToken>>() {
}.getType());
@@ -443,7 +411,7 @@ public class StaticService {
*/
public static List getExamScore(Context context, String cookie) {
List examScoreBeans = new ArrayList<>();
- HttpConnectionAndCode examScoreInfo = Net.getExamScore(context, cookie, TokenData.isVPN);
+ HttpConnectionAndCode examScoreInfo = Net.getExamScore(context, cookie, TokenData.isVPN());
if (examScoreInfo.code == 0) {
BaseResponse> baseResponse = new Gson().fromJson(examScoreInfo.comment, new TypeToken>>() {
}.getType());
@@ -465,7 +433,7 @@ public class StaticService {
*/
public static List getExperimentScore(Context context, String cookie) {
List experimentScoreBeans = new ArrayList<>();
- HttpConnectionAndCode experimentScoreInfo = Net.getExperimentScore(context, cookie, TokenData.isVPN);
+ HttpConnectionAndCode experimentScoreInfo = Net.getExperimentScore(context, cookie, TokenData.isVPN());
if (experimentScoreInfo.code == 0) {
BaseResponse> baseResponse = new Gson().fromJson(experimentScoreInfo.comment, new TypeToken>>() {
}.getType());
@@ -486,9 +454,9 @@ public class StaticService {
* @return 有效学分列表
*/
public static List getEffectiveCredits(Context context, String cookie) {
- HttpConnectionAndCode updateResult = Net.updateEffectiveCredits(context, cookie, TokenData.isVPN);
+ HttpConnectionAndCode updateResult = Net.updateEffectiveCredits(context, cookie, TokenData.isVPN());
if (updateResult.comment != null && updateResult.comment.contains("提取成功")) { //更新成功
- HttpConnectionAndCode getResult = Net.getEffectiveCredits(context, cookie, TokenData.isVPN);
+ HttpConnectionAndCode getResult = Net.getEffectiveCredits(context, cookie, TokenData.isVPN());
if (getResult.code == 0) {
BaseResponse> baseResponse = new Gson().fromJson(getResult.comment, new TypeToken>>() {
}.getType());
@@ -509,9 +477,9 @@ public class StaticService {
* @return 计划课程列表
*/
public static List getPlannedCourses(Context context, String cookie) {
- HttpConnectionAndCode updateResult = Net.updateEffectiveCredits(context, cookie, TokenData.isVPN);
+ HttpConnectionAndCode updateResult = Net.updateEffectiveCredits(context, cookie, TokenData.isVPN());
if (updateResult.comment != null && updateResult.comment.contains("提取成功")) { //更新成功
- HttpConnectionAndCode getResult = Net.getPlannedCourses(context, cookie, TokenData.isVPN);
+ HttpConnectionAndCode getResult = Net.getPlannedCourses(context, cookie, TokenData.isVPN());
if (getResult.code == 0) {
BaseResponse> baseResponse = new Gson().fromJson(getResult.comment, new TypeToken>>() {
}.getType());
@@ -656,7 +624,7 @@ public class StaticService {
y++;
}
//教务总学分绩替换
- HttpConnectionAndCode httpConnectionAndCode = Net.getGrades(context, cookie, TokenData.isVPN);
+ HttpConnectionAndCode httpConnectionAndCode = Net.getGrades(context, cookie, TokenData.isVPN());
if (httpConnectionAndCode.code == 0) {
try {
BaseResponse> baseResponse = new Gson().fromJson(httpConnectionAndCode.comment, new TypeToken>>() {
@@ -683,7 +651,7 @@ public class StaticService {
*/
public static List getSelectedCourse(Context context, String cookie, String term) {
try {
- HttpConnectionAndCode httpConnectionAndCode = Net.getSelectedCourse(context, cookie, term, TokenData.isVPN);
+ HttpConnectionAndCode httpConnectionAndCode = Net.getSelectedCourse(context, cookie, term, TokenData.isVPN());
String comment = httpConnectionAndCode.comment;
List list;
BaseResponse> result = new Gson().fromJson(comment, new TypeToken>>() {
@@ -708,7 +676,7 @@ public class StaticService {
*/
public static List getTerms(Context context, String cookie) {
try {
- HttpConnectionAndCode httpConnectionAndCode = Net.getAllTerms(context, cookie, TokenData.isVPN);
+ HttpConnectionAndCode httpConnectionAndCode = Net.getAllTerms(context, cookie, TokenData.isVPN());
String comment = httpConnectionAndCode.comment;
BaseResponse> baseResponse = new Gson().fromJson(comment, new TypeToken>>() {
}.getType());
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/util/UrlReplaceUtil.java b/app/src/main/java/top/yvyan/guettable/util/UrlReplaceUtil.java
index c860b071d65957781e10339c92d61635a632ed39..b71038b8844a2c415e517796642cc4d6f5fa2491 100644
--- a/app/src/main/java/top/yvyan/guettable/util/UrlReplaceUtil.java
+++ b/app/src/main/java/top/yvyan/guettable/util/UrlReplaceUtil.java
@@ -2,36 +2,13 @@ package top.yvyan.guettable.util;
public class UrlReplaceUtil {
- /**
- * URL替换(使国院教务系统可以和通用教务系统共同使用)
- *
- * @param isInternational 是否为国院账号
- * @param url URL后接内容(https://gyjxgl.guet.edu.cn/Login/SubmitLogin -> /Login/SubmitLogin)
- * @return 完整的URL(https://gyjxgl.guet.edu.cn/Login/SubmitLogin)
- */
- public static String getUrlByInternational(boolean isInternational, String url) {
- String path = "https://bkjw.guet.edu.cn";
- String internationalPath = "https://gyjxgl.guet.edu.cn";
- if (isInternational) {
- return internationalPath + url;
- } else {
- return path + url;
- }
- }
-
- public static String getUrlByVPN(boolean isVPN, String url) {
+ public static String getBkjwUrlByVPN(boolean isVPN, String url) {
String bkjwPath = "https://bkjw.guet.edu.cn";
- String internationalPath = "https://gyjxgl.guet.edu.cn";
String bkjwVPNPath = "https://v.guet.edu.cn/https/77726476706e69737468656265737421f2fc4b8b69377d556a468ca88d1b203b";
- String internationalBkjwVPNPath = "https://v.guet.edu.cn/https/77726476706e69737468656265737421f7ee4b84203c26576b0d9de29d51367b8932";
- if (url.contains(bkjwPath)) {
- if (isVPN) {
- url = url.replace(bkjwPath, bkjwVPNPath);
- }
- } else if (url.contains(internationalPath)) {
- if (isVPN) {
- url = url.replace(internationalPath, internationalBkjwVPNPath);
- }
+ if (isVPN) {
+ url = bkjwVPNPath + url;
+ } else {
+ url = bkjwPath + url;
}
return url;
}
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 23b6942b0fffb034696417784a7c68b04eb9bb26..ad01191d6e003393f16374dcd22b825fb624fd65 100644
--- a/app/src/main/res/layout/activity_about.xml
+++ b/app/src/main/res/layout/activity_about.xml
@@ -50,9 +50,11 @@
android:layout_height="wrap_content"
android:layout_below="@+id/about_picture"
android:layout_centerInParent="true"
+ android:textStyle="bold"
+ android:letterSpacing="0.2"
android:text="@string/app_name"
- android:textColor="@color/tab_unchecked"
- android:textSize="20sp" />
+ android:textColor="@color/app_black"
+ android:textSize="24sp" />
@@ -76,7 +78,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="5dp"
- android:text="版本"
+ android:text="@string/version_hint"
android:textColor="@color/app_black"
android:textSize="16sp" />
@@ -104,7 +106,8 @@
android:orientation="vertical"
android:background="?attr/selectableItemBackground"
android:clickable="true"
- android:focusable="true">
+ android:focusable="true"
+ tools:ignore="UsingOnClickInXml">
@@ -136,7 +139,8 @@
android:orientation="vertical"
android:background="?attr/selectableItemBackground"
android:clickable="true"
- android:focusable="true">
+ android:focusable="true"
+ tools:ignore="UsingOnClickInXml">
@@ -183,7 +187,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="5dp"
- android:text="作者"
+ android:text="@string/author_hint"
android:textColor="@color/app_black"
android:textSize="16sp" />
@@ -220,7 +224,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="5dp"
- android:text="特别鸣谢"
+ android:text="@string/thinks_hint"
android:textColor="@color/app_black"
android:textSize="16sp" />
@@ -248,7 +252,8 @@
android:orientation="vertical"
android:background="?attr/selectableItemBackground"
android:clickable="true"
- android:focusable="true">
+ android:focusable="true"
+ tools:ignore="UsingOnClickInXml">
+ android:focusable="true"
+ tools:ignore="UsingOnClickInXml">
@@ -312,7 +318,8 @@
android:orientation="vertical"
android:background="?attr/selectableItemBackground"
android:clickable="true"
- android:focusable="true">
+ android:focusable="true"
+ tools:ignore="UsingOnClickInXml">
@@ -344,7 +351,8 @@
android:orientation="vertical"
android:background="?attr/selectableItemBackground"
android:clickable="true"
- android:focusable="true">
+ android:focusable="true"
+ tools:ignore="UsingOnClickInXml">
@@ -376,7 +384,8 @@
android:orientation="vertical"
android:background="?attr/selectableItemBackground"
android:clickable="true"
- android:focusable="true">
+ android:focusable="true"
+ tools:ignore="UsingOnClickInXml">
@@ -408,7 +417,8 @@
android:orientation="vertical"
android:background="?attr/selectableItemBackground"
android:clickable="true"
- android:focusable="true">
+ android:focusable="true"
+ tools:ignore="UsingOnClickInXml">
diff --git a/app/src/main/res/layout/activity_launch.xml b/app/src/main/res/layout/activity_launch.xml
index 8aa31953dda8c9e1b7ca19f373c0c632db09025d..529bddb071f2a0a0630eb32084938d68fdacc6c7 100644
--- a/app/src/main/res/layout/activity_launch.xml
+++ b/app/src/main/res/layout/activity_launch.xml
@@ -13,9 +13,9 @@
tools:ignore="UselessParent">
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" />
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -33,6 +33,9 @@
android:id="@+id/detail_text_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
+ android:typeface="serif"
+ android:textStyle="bold"
+ android:letterSpacing="0.1"
android:layout_marginTop="3dp"
android:textColor="#000000"
android:textSize="18sp" />
@@ -41,7 +44,7 @@
android:id="@+id/detail_text_2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginTop="3dp" />
+ android:layout_marginTop="8dp" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragement_person.xml b/app/src/main/res/layout/fragement_person.xml
index 17bce337432bff856a013a654c91b6b6b171b6fa..62b67a36081ba1e6461e40ed7edb6d1e774a421c 100644
--- a/app/src/main/res/layout/fragement_person.xml
+++ b/app/src/main/res/layout/fragement_person.xml
@@ -108,7 +108,6 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
- android:text=""
android:textColor="@color/app_black"
android:textSize="18sp" />
@@ -117,9 +116,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
- android:text=""
- android:textColor="@color/app_black"
- android:textSize="18sp" />
+ android:textSize="16sp" />
diff --git a/app/src/main/res/layout/planned_course_cardview.xml b/app/src/main/res/layout/planned_course_cardview.xml
index 82d2e306da4299967ead4b3da4ae4bf128158ac5..928e5eab926a880ba5a0386eec47d0d8bd14f213 100644
--- a/app/src/main/res/layout/planned_course_cardview.xml
+++ b/app/src/main/res/layout/planned_course_cardview.xml
@@ -50,10 +50,13 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
- android:layout_marginTop="3dp"
- android:layout_marginBottom="3dp"
- android:textColor="#ff000000"
+ android:layout_marginTop="5dp"
+ android:layout_marginBottom="5dp"
+ android:textColor="#000000"
android:textSize="16sp"
+ android:typeface="serif"
+ android:textStyle="bold"
+ android:letterSpacing="0.1"
app:layout_constraintEnd_toStartOf="@+id/guideline2"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
diff --git a/app/src/main/res/layout/score_cardview.xml b/app/src/main/res/layout/score_cardview.xml
index 8b1bcd4b95b5c2975974885bf7babd3de6ebe1b9..9f74fdeefd300634f6c6e3dd6ff4994e319742f4 100644
--- a/app/src/main/res/layout/score_cardview.xml
+++ b/app/src/main/res/layout/score_cardview.xml
@@ -59,7 +59,10 @@
android:layout_marginStart="10dp"
android:layout_marginTop="4dp"
android:textColor="#000000"
- android:textSize="14sp"
+ android:textSize="16sp"
+ android:typeface="serif"
+ android:textStyle="bold"
+ android:letterSpacing="0.1"
app:layout_constraintEnd_toStartOf="@+id/guideline2"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
@@ -71,7 +74,7 @@
android:layout_marginStart="10dp"
android:layout_marginTop="1dp"
android:layout_marginBottom="4dp"
- android:textSize="13sp"
+ android:textSize="14sp"
app:layout_constraintEnd_toStartOf="@+id/guideline2"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/course_name" />
diff --git a/app/src/main/res/layout/teacher_cardview.xml b/app/src/main/res/layout/teacher_cardview.xml
deleted file mode 100644
index 37d47fb68f824e6cb27582ab2898bf02cdd4a153..0000000000000000000000000000000000000000
--- a/app/src/main/res/layout/teacher_cardview.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/layout/textbook_cardview.xml b/app/src/main/res/layout/textbook_cardview.xml
deleted file mode 100644
index 3d9b8bacfe2770bdc1786991441e38d166627b79..0000000000000000000000000000000000000000
--- a/app/src/main/res/layout/textbook_cardview.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index c1bf31e041d1ce5fe5d22364d90c3a3e767c7858..b1cba403653eddb4befa6dd813eb444ec73a9f60 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -14,4 +14,9 @@
#FB7299
#FF6705
#06C160
+
+ #3396D8
+ #7F4073
+
+ #FFF1F1F1
\ No newline at end of file
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
index 4db8c59062cb60bac199917d01af9728a1772c39..cd2711c27876cb797f7e68e11a7318c0fb1829c9 100644
--- a/app/src/main/res/values/dimens.xml
+++ b/app/src/main/res/values/dimens.xml
@@ -7,4 +7,10 @@ http://developer.android.com/guide/topics/appwidgets/index.html#CreatingLayout
-->
0dp
+ 5dp
+ 8dp
+ 10dp
+ 16dp
+ 20dp
+
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 5030f0befdad69841cbd77d16e62d1619785a254..b590f01a35379a119b5fefcac43aa0de13835ffc 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -4,13 +4,10 @@
https://v.guet.edu.cn/login
https://v.guet.edu.cn
- https://v.guet.edu.cn/wengine-vpn/cookie?method=get&host=cas.guet.edu.cn&scheme=https&path=/authserver/login
https://cas.guet.edu.cn/authserver/login
- https://v.guet.edu.cn/https/77726476706e69737468656265737421f3f652d220256d44300d8db9d6562d/authserver/login
https://cas.guet.edu.cn/authserver/dynamicCode/getDynamicCodeByReauth.do
- https://v.guet.edu.cn/https/77726476706e69737468656265737421f3f652d220256d44300d8db9d6562d/authserver/dynamicCode/getDynamicCodeByReauth.do
https://cas.guet.edu.cn/authserver/reAuthCheck/reAuthSubmit.do
- https://v.guet.edu.cn/https/77726476706e69737468656265737421f3f652d220256d44300d8db9d6562d/authserver/reAuthCheck/reAuthSubmit.do
+ https://cas.guet.edu.cn/authserver/reAuthCheck/reAuthLoginView.do?isMultifactor=true&service=http%3A%2F%2Ficampus.guet.edu.cn%2FGuetAccount%2FCasLogin
application/x-www-form-urlencoded;charset=UTF-8
https://cas.guet.edu.cn/
service=https%3A%2F%2Fbkjw.guet.edu.cn
@@ -80,10 +77,6 @@
https://v.guet.edu.cn/http/77726476706e69737468656265737421e5e3529f69377d556a468ca88d1b203b/CourseArrange.aspx?wrdrecordvisit=1640584485000
http://utsc.guet.edu.cn/EmptyClassRoom.aspx
https://v.guet.edu.cn/http/77726476706e69737468656265737421e5e3529f69377d556a468ca88d1b203b/EmptyClassRoom.aspx?mCode=001503
- 校内公告
- http://weixin.guet.edu.cn/News?type=0
- 校内通知
- http://weixin.guet.edu.cn/News?type=4
桂电课程表交流群
b6B5JNbpsHV0scWnS1amN7NH3Ry-LlrP
@@ -134,7 +127,7 @@
Casual | 就这 | ୧⍤⃝ⓍⓅ乏了 | 我终究不是个好人 | 🍓 | sin² | 沉山浮阳 | 迷 | 稚隳
- https://bkjw.guet.edu.cn/student/GetSctCourse
+ /student/GetSctCourse
@@ -203,5 +196,15 @@
0
学分绩查询属于公测阶段,正在逐步优化,目前计算方法为只统计对应年度及格的必修和限选课程,若您有更好的计算方法,欢迎进群反馈,我们一起让它变好!(V4)
wing | ssbird | tank | uuin | bbaa
+ 官方QQ交流群(点击加群)
+ 版本
+ 加入我们
+ 作者
+ 特别鸣谢
+ 开发者自语
+ 项目开源
+ 开源引用
+ 隐私政策
+ 声明
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
index 37c1339644996f62b4fde4970f590fcf8fcfe623..f1b3e5eb59c65b1caee35961b8509b6a91133a62 100644
--- a/build.gradle
+++ b/build.gradle
@@ -2,7 +2,15 @@
buildscript {
repositories {
google()
- jcenter()
+ // 阿里云云效仓库:https://maven.aliyun.com/mvn/guide
+ maven { url 'https://maven.aliyun.com/repository/jcenter' }
+ maven { url 'https://maven.aliyun.com/repository/google' }
+ // 华为开源镜像:https://mirrors.huaweicloud.com
+ maven { url 'https://repo.huaweicloud.com/repository/maven' }
+ // JitPack 远程仓库:https://jitpack.io
+ maven { url 'https://jitpack.io' }
+ // MavenCentral 远程仓库:https://mvnrepository.com
+ mavenCentral()
maven { url 'https://dl.bintray.com/umsdk/release' }
}
dependencies {
@@ -16,7 +24,9 @@ buildscript {
allprojects {
repositories {
google()
- jcenter()
+ maven { url 'https://maven.aliyun.com/repository/jcenter' }
+ maven { url 'https://maven.aliyun.com/repository/google' }
+ maven { url 'https://repo.huaweicloud.com/repository/maven' }
maven { url 'https://jitpack.io' }
maven { url 'https://repo1.maven.org/maven2/' }
maven { url "http://maven.aliyun.com/nexus/content/repositories/releases" }