From 8e50ab0d34ca778e2775676cc26de73a3805b2be Mon Sep 17 00:00:00 2001 From: wing <843862803@qq.com> Date: Wed, 20 Jul 2022 20:01:32 +0800 Subject: [PATCH 01/24] =?UTF-8?q?perf:=E9=83=A8=E5=88=86=E5=BA=8F=E5=88=97?= =?UTF-8?q?=E5=8C=96=E6=94=B9=E4=B8=BAjson=E6=A0=BC=E5=BC=8F=20perf:?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 2 + .../main/java/top/yvyan/guettable/MyApp.java | 3 + .../guettable/activity/AddCourseActivity.java | 7 +- .../guettable/activity/LoginActivity.java | 4 +- .../guettable/activity/SetTermActivity.java | 17 +- .../guettable/adapter/ClassDetailAdapter.java | 2 +- .../yvyan/guettable/baseFun/FirstLoad.java | 5 +- .../top/yvyan/guettable/data/BaseData.java | 31 ++ .../top/yvyan/guettable/data/MoreData.java | 120 ++++++ .../top/yvyan/guettable/data/MoreDate.java | 352 ------------------ .../yvyan/guettable/data/ScheduleData.java | 309 +++++---------- .../fragment/CourseTableFragment.java | 24 +- .../guettable/fragment/DayClassFragment.java | 22 +- .../yvyan/guettable/moreFun/CETActivity.java | 12 +- .../yvyan/guettable/moreFun/ExamActivity.java | 10 +- .../guettable/moreFun/ExamScoreActivity.java | 10 +- .../moreFun/ExperimentScoreActivity.java | 10 +- .../guettable/moreFun/GradesActivity.java | 9 +- .../yvyan/guettable/moreFun/LibActivity.java | 8 +- .../moreFun/PlannedCoursesActivity.java | 10 +- .../guettable/moreFun/ResitActivity.java | 12 +- .../moreFun/SelectedCourseActivity.java | 12 +- .../yvyan/guettable/service/AutoUpdate.java | 14 +- .../yvyan/guettable/widget/WidgetService.java | 12 +- .../widget/WidgetServiceFactory.java | 14 +- build.gradle | 14 +- 26 files changed, 339 insertions(+), 706 deletions(-) create mode 100644 app/src/main/java/top/yvyan/guettable/data/BaseData.java create mode 100644 app/src/main/java/top/yvyan/guettable/data/MoreData.java delete mode 100644 app/src/main/java/top/yvyan/guettable/data/MoreDate.java diff --git a/app/build.gradle b/app/build.gradle index 339a04b..b259694 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -70,4 +70,6 @@ dependencies { //update implementation 'com.tencent.bugly:crashreport_upgrade:1.5.1' implementation 'com.tencent.bugly:nativecrashreport:3.9.1' + //键值对存储 + implementation 'com.tencent:mmkv:1.2.13' } \ No newline at end of file diff --git a/app/src/main/java/top/yvyan/guettable/MyApp.java b/app/src/main/java/top/yvyan/guettable/MyApp.java index 0c1687c..05ec3a6 100644 --- a/app/src/main/java/top/yvyan/guettable/MyApp.java +++ b/app/src/main/java/top/yvyan/guettable/MyApp.java @@ -2,6 +2,7 @@ package top.yvyan.guettable; import android.app.Application; +import com.tencent.mmkv.MMKV; import com.xuexiang.xui.XUI; public class MyApp extends Application { @@ -21,6 +22,8 @@ public class MyApp extends Application { private void init() { XUI.init(this); //初始化UI框架 XUI.debug(true); //开启UI框架调试日志 + + MMKV.initialize(this); //MMKV初始化 } } diff --git a/app/src/main/java/top/yvyan/guettable/activity/AddCourseActivity.java b/app/src/main/java/top/yvyan/guettable/activity/AddCourseActivity.java index 84732a3..c2d58e4 100644 --- a/app/src/main/java/top/yvyan/guettable/activity/AddCourseActivity.java +++ b/app/src/main/java/top/yvyan/guettable/activity/AddCourseActivity.java @@ -183,8 +183,7 @@ public class AddCourseActivity extends AppCompatActivity { if (courseName.isEmpty()) { ToastUtil.showToast(getApplicationContext(), "课程名称不能为空!"); } else { - ScheduleData scheduleData = ScheduleData.newInstance(getApplicationContext()); - List courseBeans = scheduleData.getUserCourseBeans(); + List courseBeans = ScheduleData.getUserCourseBeans(); CourseBean courseBean = new CourseBean(); courseBean.userAdd( (courseNumberEditText.getText().toString().isEmpty() ? null : courseNumberEditText.getText().toString()), @@ -196,7 +195,7 @@ public class AddCourseActivity extends AppCompatActivity { (courseStartSeekBar.getProgress() == 0 ? 7 : courseStartSeekBar.getProgress()), (courseTeacherEditText.getText().toString().isEmpty() ? null : courseTeacherEditText.getText().toString()), (courseCommEditText.getText().toString().isEmpty() ? null : courseCommEditText.getText().toString()), - scheduleData.getUserCourseNo() + ScheduleData.getUserCourseNo() ); try { courseBeans.add(courseBean); @@ -204,7 +203,7 @@ public class AddCourseActivity extends AppCompatActivity { e.printStackTrace(); } - scheduleData.setUserCourseBeans(courseBeans); + ScheduleData.setUserCourseBeans(courseBeans); WidgetUtil.notifyWidgetUpdate(this); ToastUtil.showToast(getApplicationContext(), "添加成功!"); diff --git a/app/src/main/java/top/yvyan/guettable/activity/LoginActivity.java b/app/src/main/java/top/yvyan/guettable/activity/LoginActivity.java index a30f143..9fdb00f 100644 --- a/app/src/main/java/top/yvyan/guettable/activity/LoginActivity.java +++ b/app/src/main/java/top/yvyan/guettable/activity/LoginActivity.java @@ -31,7 +31,7 @@ import top.yvyan.guettable.R; import top.yvyan.guettable.bean.TermBean; import top.yvyan.guettable.data.AccountData; import top.yvyan.guettable.data.GeneralData; -import top.yvyan.guettable.data.MoreDate; +import top.yvyan.guettable.data.MoreData; import top.yvyan.guettable.data.TokenData; import top.yvyan.guettable.service.fetch.Net; import top.yvyan.guettable.service.fetch.StaticService; @@ -406,7 +406,7 @@ public class LoginActivity extends Activity implements View.OnClickListener { if (!generalData.isInternational()) { List allTerm = StaticService.getTerms(this, tokenData.getCookie()); if (allTerm != null) { - MoreDate.newInstance(this).setTermBeans(allTerm); + MoreData.setTermBeans(allTerm); } } } catch (Exception e) { diff --git a/app/src/main/java/top/yvyan/guettable/activity/SetTermActivity.java b/app/src/main/java/top/yvyan/guettable/activity/SetTermActivity.java index 094300d..92f125f 100644 --- a/app/src/main/java/top/yvyan/guettable/activity/SetTermActivity.java +++ b/app/src/main/java/top/yvyan/guettable/activity/SetTermActivity.java @@ -18,7 +18,7 @@ import top.yvyan.guettable.R; import top.yvyan.guettable.bean.TermBean; import top.yvyan.guettable.data.AccountData; import top.yvyan.guettable.data.GeneralData; -import top.yvyan.guettable.data.MoreDate; +import top.yvyan.guettable.data.MoreData; import top.yvyan.guettable.data.ScheduleData; import top.yvyan.guettable.util.DialogUtil; import top.yvyan.guettable.util.ToastUtil; @@ -36,7 +36,6 @@ public class SetTermActivity extends AppCompatActivity implements View.OnClickLi private XSeekBar seekBar; private GeneralData generalData; - private ScheduleData scheduleData; @Override protected void onCreate(Bundle savedInstanceState) { @@ -66,7 +65,6 @@ public class SetTermActivity extends AppCompatActivity implements View.OnClickLi back.setOnClickListener(this); input.setOnClickListener(this); generalData = GeneralData.newInstance(this); - scheduleData = ScheduleData.newInstance(this); } @SuppressLint("SetTextI18n") @@ -131,19 +129,18 @@ public class SetTermActivity extends AppCompatActivity implements View.OnClickLi break; case R.id.input: //保存学年 - ScheduleData scheduleData = ScheduleData.newInstance(getApplicationContext()); int year = Integer.parseInt(generalData.getGrade()) + (int) spinnerYear.getSelectedItemId(); int num = (int) spinnerTerm.getSelectedItemId() + 1; boolean changeTerm = false; if (generalData.isInternational()) { if (!(year + "" + num).equals(generalData.getTerm())) { - scheduleData.deleteInputCourse(); + ScheduleData.deleteInputCourse(); changeTerm = true; } generalData.setTerm(year + "" + num); } else { String term_1 = year + "-" + (year + 1) + "_" + num; - for (TermBean termBean : MoreDate.newInstance(this).getTermBeans()) { + for (TermBean termBean : MoreData.getTermBeans()) { String termString = termBean.getTerm(); if (termString != null && termString.length() >= 11 @@ -154,10 +151,10 @@ public class SetTermActivity extends AppCompatActivity implements View.OnClickLi } } generalData.setTerm(term_1); - scheduleData.deleteInputCourse(); + ScheduleData.deleteInputCourse(); changeTerm = true; } - if (changeTerm && scheduleData.getUserCourseBeans().size() != 0) { + if (changeTerm && ScheduleData.getUserCourseBeans().size() != 0) { DialogUtil.IDialogService service = new DialogUtil.IDialogService() { @Override public void onClickYes() { @@ -166,7 +163,7 @@ public class SetTermActivity extends AppCompatActivity implements View.OnClickLi @Override public void onClickBack() { - scheduleData.deleteUserCourse(); + ScheduleData.deleteUserCourse(); importCourse(); } }; @@ -183,7 +180,7 @@ public class SetTermActivity extends AppCompatActivity implements View.OnClickLi int week = seekBar.getSelectedNumber() / 10; generalData.setWeek(week); generalData.setLastUpdateTime(-1); - scheduleData.setUpdate(true); + ScheduleData.setUpdate(true); ToastUtil.showToast(getApplicationContext(), "正在导入课表,受教务系统影响,最长需要约30秒,请耐心等待,不要滑动页面"); Intent intent = getIntent(); setResult(OK, intent); diff --git a/app/src/main/java/top/yvyan/guettable/adapter/ClassDetailAdapter.java b/app/src/main/java/top/yvyan/guettable/adapter/ClassDetailAdapter.java index ea57c74..e156a5b 100644 --- a/app/src/main/java/top/yvyan/guettable/adapter/ClassDetailAdapter.java +++ b/app/src/main/java/top/yvyan/guettable/adapter/ClassDetailAdapter.java @@ -110,7 +110,7 @@ public class ClassDetailAdapter extends RecyclerView.Adapter { - ScheduleData.newInstance(activity).deleteUserCourse(courseBean.getId()); + ScheduleData.deleteUserCourse(courseBean.getId()); schedules.remove(position); //删除动画 notifyItemRemoved(position); diff --git a/app/src/main/java/top/yvyan/guettable/baseFun/FirstLoad.java b/app/src/main/java/top/yvyan/guettable/baseFun/FirstLoad.java index 5307ae2..55f2d02 100644 --- a/app/src/main/java/top/yvyan/guettable/baseFun/FirstLoad.java +++ b/app/src/main/java/top/yvyan/guettable/baseFun/FirstLoad.java @@ -67,14 +67,13 @@ public class FirstLoad { * 40->41需要进行的操作 */ private void update_40() { - ScheduleData scheduleData = ScheduleData.newInstance(context); - List examBeans = scheduleData.getExamBeans(); + List examBeans = ScheduleData.getExamBeans(); for (ExamBean examBean : examBeans) { if (examBean.getClassNum() < 1) { examBean.setClassNum(1); } } - scheduleData.setExamBeans(examBeans); + ScheduleData.setExamBeans(examBeans); } /** 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 0000000..e8f323e --- /dev/null +++ b/app/src/main/java/top/yvyan/guettable/data/BaseData.java @@ -0,0 +1,31 @@ +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; + +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/MoreData.java b/app/src/main/java/top/yvyan/guettable/data/MoreData.java new file mode 100644 index 0000000..82c9546 --- /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 86eaa64..0000000 --- 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 bead51d..136dbf9 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,92 @@ 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); + if (userCourseNo == 0) { + userCourseNo = 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 +96,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/fragment/CourseTableFragment.java b/app/src/main/java/top/yvyan/guettable/fragment/CourseTableFragment.java index 96e229c..8ca99e4 100644 --- a/app/src/main/java/top/yvyan/guettable/fragment/CourseTableFragment.java +++ b/app/src/main/java/top/yvyan/guettable/fragment/CourseTableFragment.java @@ -38,8 +38,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,7 +53,6 @@ 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; @@ -91,7 +90,6 @@ public class CourseTableFragment extends Fragment implements View.OnClickListene private void initData() { generalData = GeneralData.newInstance(getActivity()); - scheduleData = ScheduleData.newInstance(getActivity()); singleSettingData = SingleSettingData.newInstance(getActivity()); detailClassData = DetailClassData.newInstance(); settingData = SettingData.newInstance(getActivity()); @@ -138,8 +136,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(Objects.requireNonNull(this.getActivity())); ToastUtil.showToast(getActivity(), "设置第" + target + "周为当前周"); mTimetableView.changeWeekForce(target); } @@ -208,27 +206,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()); } @@ -269,10 +267,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); } } 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 ff5b369..bea36ec 100644 --- a/app/src/main/java/top/yvyan/guettable/fragment/DayClassFragment.java +++ b/app/src/main/java/top/yvyan/guettable/fragment/DayClassFragment.java @@ -70,7 +70,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 +87,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); } } @@ -134,7 +133,6 @@ public class DayClassFragment extends Fragment implements View.OnClickListener { accountData = AccountData.newInstance(getActivity()); generalData = GeneralData.newInstance(getActivity()); settingData = SettingData.newInstance(getActivity()); - scheduleData = ScheduleData.newInstance(getActivity()); } /** @@ -174,7 +172,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) { @@ -267,24 +265,20 @@ public class DayClassFragment extends Fragment implements View.OnClickListener { */ private List getData() { List list; - //防止出现空指针闪退 - if (scheduleData == null) { - initData(); - } - if (!scheduleData.getCourseBeans().isEmpty()) { - list = ScheduleSupport.transform(scheduleData.getCourseBeans()); + if (!ScheduleData.getCourseBeans().isEmpty()) { + list = ScheduleSupport.transform(ScheduleData.getCourseBeans()); } else { list = new ArrayList<>(); } - for (CourseBean courseBean : scheduleData.getUserCourseBeans()) { + for (CourseBean courseBean : ScheduleData.getUserCourseBeans()) { list.add(courseBean.getSchedule()); } if (settingData.getShowLibOnTable()) { - List labList = ScheduleSupport.transform(scheduleData.getLibBeans()); + List labList = ScheduleSupport.transform(ScheduleData.getLibBeans()); list.addAll(labList); } if (settingData.getShowExamOnTable()) { - for (ExamBean examBean : CourseUtil.combineExam(scheduleData.getExamBeans())) { + for (ExamBean examBean : CourseUtil.combineExam(ScheduleData.getExamBeans())) { if (examBean != null && examBean.getWeek() != 0) { list.add(examBean.getSchedule()); } diff --git a/app/src/main/java/top/yvyan/guettable/moreFun/CETActivity.java b/app/src/main/java/top/yvyan/guettable/moreFun/CETActivity.java index 7d169f8..d2d7c85 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 3086f24..fb74955 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 1a82385..3ee922b 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 301fcab..76eb4c4 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 4e04b0b..519f268 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 d7b3c92..3484ba1 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/PlannedCoursesActivity.java b/app/src/main/java/top/yvyan/guettable/moreFun/PlannedCoursesActivity.java index b413ee4..6632af2 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 72b9811..c091072 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 99f6b9d..58a7124 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 28f7b6d..e91f570 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/widget/WidgetService.java b/app/src/main/java/top/yvyan/guettable/widget/WidgetService.java index d0ee303..001d598 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 2c0a872..118d6d4 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/build.gradle b/build.gradle index 37c1339..f1b3e5e 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" } -- Gitee From 7c5fe4e1ab63c2aedbdce195f63359b3378aeb33 Mon Sep 17 00:00:00 2001 From: wing <843862803@qq.com> Date: Wed, 20 Jul 2022 20:22:07 +0800 Subject: [PATCH 02/24] =?UTF-8?q?perf:=E7=AE=80=E5=8C=96=E7=B1=BB=20perf:?= =?UTF-8?q?=E7=A7=BB=E9=99=A4=E6=97=A0=E6=95=88=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../guettable/activity/DetailActivity.java | 2 +- .../yvyan/guettable/data/DetailClassData.java | 20 ++------ .../yvyan/guettable/data/ScheduleData.java | 5 +- .../fragment/CourseTableFragment.java | 4 +- .../guettable/moreFun/MoreUrlActivity.java | 8 ---- app/src/main/res/layout/activity_more_url.xml | 48 ------------------- app/src/main/res/values/strings.xml | 4 -- 7 files changed, 7 insertions(+), 84 deletions(-) diff --git a/app/src/main/java/top/yvyan/guettable/activity/DetailActivity.java b/app/src/main/java/top/yvyan/guettable/activity/DetailActivity.java index b1a482e..b1bbcb3 100644 --- a/app/src/main/java/top/yvyan/guettable/activity/DetailActivity.java +++ b/app/src/main/java/top/yvyan/guettable/activity/DetailActivity.java @@ -44,7 +44,7 @@ public class DetailActivity extends AppCompatActivity { SingleSettingData singleSettingData = SingleSettingData.newInstance(getApplicationContext()); BackgroundUtil.setPageTheme(this, singleSettingData.getThemeId()); setContentView(R.layout.activity_detail); - schedules = DetailClassData.newInstance().getCourseBeans(); + schedules = DetailClassData.getCourseBeans(); //透明状态栏 Window window = this.getWindow(); window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); diff --git a/app/src/main/java/top/yvyan/guettable/data/DetailClassData.java b/app/src/main/java/top/yvyan/guettable/data/DetailClassData.java index 19ad022..19d17d8 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/ScheduleData.java b/app/src/main/java/top/yvyan/guettable/data/ScheduleData.java index 136dbf9..505b1dd 100644 --- a/app/src/main/java/top/yvyan/guettable/data/ScheduleData.java +++ b/app/src/main/java/top/yvyan/guettable/data/ScheduleData.java @@ -72,10 +72,7 @@ public class ScheduleData extends BaseData { public static long getUserCourseNo() { MMKV mmkv = MMKV.defaultMMKV(); - long userCourseNo = mmkv.decodeLong(USER_COURSE_NO); - if (userCourseNo == 0) { - userCourseNo = 1; - } + long userCourseNo = mmkv.decodeLong(USER_COURSE_NO, 1); setUserCourseNo(userCourseNo + 1); return userCourseNo; } 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 8ca99e4..e02d9b0 100644 --- a/app/src/main/java/top/yvyan/guettable/fragment/CourseTableFragment.java +++ b/app/src/main/java/top/yvyan/guettable/fragment/CourseTableFragment.java @@ -54,7 +54,6 @@ public class CourseTableFragment extends Fragment implements View.OnClickListene private GeneralData generalData; private SingleSettingData singleSettingData; - private DetailClassData detailClassData; private SettingData settingData; //记录切换的周次,不一定是当前周 int target; @@ -91,7 +90,6 @@ public class CourseTableFragment extends Fragment implements View.OnClickListene private void initData() { generalData = GeneralData.newInstance(getActivity()); singleSettingData = SingleSettingData.newInstance(getActivity()); - detailClassData = DetailClassData.newInstance(); settingData = SettingData.newInstance(getActivity()); } @@ -248,7 +246,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); 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 59c5c6c..ff06c64 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/res/layout/activity_more_url.xml b/app/src/main/res/layout/activity_more_url.xml index 0148ddd..078a13e 100644 --- a/app/src/main/res/layout/activity_more_url.xml +++ b/app/src/main/res/layout/activity_more_url.xml @@ -52,54 +52,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 -- Gitee From c84d53801ce0537889d2e531d9766317a0586c57 Mon Sep 17 00:00:00 2001 From: wing <843862803@qq.com> Date: Thu, 21 Jul 2022 20:57:22 +0800 Subject: [PATCH 03/24] =?UTF-8?q?feat:=E5=9F=BA=E4=BA=8Egitee=E7=9A=84?= =?UTF-8?q?=E6=B6=88=E6=81=AF=E6=8E=A8=E9=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 7 + .../guettable/Http/entity/ApiResult.java | 91 +++++++++ .../top/yvyan/guettable/bean/TipInfo.java | 59 ++++++ .../yvyan/guettable/util/GuideTipsDialog.java | 190 ++++++++++++++++++ .../bg_dialog_common_tip_corner_white.xml | 9 + .../res/drawable/ic_action_close_white.xml | 22 ++ .../main/res/drawable/img_guide_tip_top.xml | 36 ++++ app/src/main/res/layout/dialog_guide.xml | 115 +++++++++++ app/src/main/res/values/colors.xml | 2 + app/src/main/res/values/dimens.xml | 13 ++ 10 files changed, 544 insertions(+) create mode 100644 app/src/main/java/top/yvyan/guettable/Http/entity/ApiResult.java create mode 100644 app/src/main/java/top/yvyan/guettable/bean/TipInfo.java create mode 100644 app/src/main/java/top/yvyan/guettable/util/GuideTipsDialog.java create mode 100644 app/src/main/res/drawable/bg_dialog_common_tip_corner_white.xml create mode 100644 app/src/main/res/drawable/ic_action_close_white.xml create mode 100644 app/src/main/res/drawable/img_guide_tip_top.xml create mode 100644 app/src/main/res/layout/dialog_guide.xml diff --git a/app/build.gradle b/app/build.gradle index b259694..ee7cc2f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -72,4 +72,11 @@ dependencies { implementation 'com.tencent.bugly:nativecrashreport:3.9.1' //键值对存储 implementation 'com.tencent:mmkv:1.2.13' + //富文本 + implementation 'com.zzhoujay.richtext:richtext:3.0.8' + //工具类 + implementation 'com.github.xuexiangjys.XUtil:xutil-core:2.0.0' + implementation 'com.github.xuexiangjys.XUtil:xutil-sub:2.0.0' + + implementation 'com.zhy:okhttputils:2.6.2' } \ No newline at end of file diff --git a/app/src/main/java/top/yvyan/guettable/Http/entity/ApiResult.java b/app/src/main/java/top/yvyan/guettable/Http/entity/ApiResult.java new file mode 100644 index 0000000..bd8b2e9 --- /dev/null +++ b/app/src/main/java/top/yvyan/guettable/Http/entity/ApiResult.java @@ -0,0 +1,91 @@ +/* + * Copyright (C) 2018 xuexiangjys(xuexiangjys@163.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package top.yvyan.guettable.Http.entity; + +import androidx.annotation.Keep; + +import com.google.gson.annotations.SerializedName; + +/** + * 提供的默认的标注返回api + * + * @author xuexiang + * @since 2018/5/22 下午4:22 + */ +@Keep +public class ApiResult { + public final static String CODE = "Code"; + public final static String MSG = "Msg"; + public final static String DATA = "Data"; + + @SerializedName(value = CODE, alternate = {"code"}) + private int Code; + @SerializedName(value = MSG, alternate = {"msg"}) + private String Msg; + @SerializedName(value = DATA, alternate = {"data"}) + private T Data; + + public int getCode() { + return Code; + } + + public ApiResult setCode(int code) { + Code = code; + return this; + } + + public String getMsg() { + return Msg; + } + + public ApiResult setMsg(String msg) { + Msg = msg; + return this; + } + + public ApiResult setData(T data) { + Data = data; + return this; + } + + /** + * 获取请求响应的数据,自定义api的时候需要重写【很关键】 + * + * @return + */ + public T getData() { + return Data; + } + + /** + * 是否请求成功,自定义api的时候需要重写【很关键】 + * + * @return + */ + public boolean isSuccess() { + return getCode() == 0; + } + + @Override + public String toString() { + return "ApiResult{" + + "Code='" + Code + '\'' + + ", Msg='" + Msg + '\'' + + ", Data=" + Data + + '}'; + } +} diff --git a/app/src/main/java/top/yvyan/guettable/bean/TipInfo.java b/app/src/main/java/top/yvyan/guettable/bean/TipInfo.java new file mode 100644 index 0000000..f408148 --- /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/util/GuideTipsDialog.java b/app/src/main/java/top/yvyan/guettable/util/GuideTipsDialog.java new file mode 100644 index 0000000..548c64f --- /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/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 0000000..dbcadad --- /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 0000000..75c5dee --- /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 0000000..f684094 --- /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/dialog_guide.xml b/app/src/main/res/layout/dialog_guide.xml new file mode 100644 index 0000000..aeeb1d1 --- /dev/null +++ b/app/src/main/res/layout/dialog_guide.xml @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index c1bf31e..04abb58 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -14,4 +14,6 @@ #FB7299 #FF6705 #06C160 + + #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 4db8c59..88fc619 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -7,4 +7,17 @@ http://developer.android.com/guide/topics/appwidgets/index.html#CreatingLayout --> 0dp + 4dp + 5dp + 6dp + 8dp + 10dp + 12dp + 14dp + 16dp + 18dp + 20dp + 24dp + 30dp + \ No newline at end of file -- Gitee From 19b3ec2f91d1582f17d705ed7252e7f4115f9ea9 Mon Sep 17 00:00:00 2001 From: bbaa Date: Wed, 8 Mar 2023 13:38:36 +0800 Subject: [PATCH 04/24] =?UTF-8?q?feat:=20=E7=A0=B4=E8=A7=A32fa?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/runConfigurations.xml | 12 --- .../guettable/activity/LoginActivity.java | 54 +++++++--- .../top/yvyan/guettable/data/TokenData.java | 22 +++- .../yvyan/guettable/service/fetch/Net.java | 101 +++++++++++++++--- .../service/fetch/StaticService.java | 25 +++++ app/src/main/res/values/strings.xml | 2 + 6 files changed, 173 insertions(+), 43 deletions(-) delete mode 100644 .idea/runConfigurations.xml diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml deleted file mode 100644 index 7f68460..0000000 --- a/.idea/runConfigurations.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/java/top/yvyan/guettable/activity/LoginActivity.java b/app/src/main/java/top/yvyan/guettable/activity/LoginActivity.java index ebf40e2..8004acc 100644 --- a/app/src/main/java/top/yvyan/guettable/activity/LoginActivity.java +++ b/app/src/main/java/top/yvyan/guettable/activity/LoginActivity.java @@ -178,23 +178,26 @@ public class LoginActivity extends Activity implements View.OnClickListener { if(CasCookie.contains("ERROR5")) { tokenData.setCASCookie(CasCookie.substring(CasCookie.indexOf(";")+1)); tokenData.setBkjwCookie(null); - String phoneNumber = StaticService.SendPhoneOTP(this,CasCookie.substring(CasCookie.indexOf(";")+1), account, VPNToken); - if (!phoneNumber.contains("ERROR")) { - runOnUiThread(() -> { - showPhoneOtpDialog(phoneNumber,CasCookie.substring(CasCookie.indexOf(";")+1),VPNToken,tokenData); - }); - } else { - if (phoneNumber.equals("ERROR1")) { - showErrorToast(-4); - } else if (phoneNumber.equals("ERROR2")) { - showErrorToast(-2); - } else if(phoneNumber.contains("ERROR3")) { + fuck2FA(account,password,CasCookie.substring(CasCookie.indexOf(";")+1),VPNToken,tokenData); + if(false) { + String phoneNumber = StaticService.SendPhoneOTP(this, CasCookie.substring(CasCookie.indexOf(";") + 1), account, VPNToken); + if (!phoneNumber.contains("ERROR")) { runOnUiThread(() -> { - setEnClick(); - ToastUtil.showToast(this, getResources().getString(R.string.login_fail_phoneOTPSend)+phoneNumber.substring(7)); + showPhoneOtpDialog(phoneNumber, CasCookie.substring(CasCookie.indexOf(";") + 1), VPNToken, tokenData); }); } else { - showErrorToast(-8); + if (phoneNumber.equals("ERROR1")) { + showErrorToast(-4); + } else if (phoneNumber.equals("ERROR2")) { + showErrorToast(-2); + } else if (phoneNumber.contains("ERROR3")) { + runOnUiThread(() -> { + setEnClick(); + ToastUtil.showToast(this, getResources().getString(R.string.login_fail_phoneOTPSend) + phoneNumber.substring(7)); + }); + } else { + showErrorToast(-8); + } } } } else { @@ -216,6 +219,29 @@ public class LoginActivity extends Activity implements View.OnClickListener { } + private void fuck2FA(String account,String password,String CASCookie,String VPNToken,TokenData tokenData) { + try{ + runOnUiThread(() -> button.setText("正在尝试绕过二步验证")); + String MulitFactorAuth = StaticService.fuck2FA(this,password,CASCookie,VPNToken); + if(MulitFactorAuth.contains("ERROR")) { + if (MulitFactorAuth.equals("ERROR1")) { + showErrorToast(-4); + } else if (MulitFactorAuth.equals("ERROR2")) { + showErrorToast(-2); + } else { + showErrorToast(-8); + } + } else { + tokenData.setCASCookie(CASCookie + "; " + MulitFactorAuth); + tokenData.setBkjwCookie(null); + accountData.setUser(account, null, password, cbRememberPwd.isChecked()); + getInfo(); + } + + } catch (Exception ignore) { + return; + } + } /** * 显示手机验证码2FA */ 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 d5abe6b..9d38596 100644 --- a/app/src/main/java/top/yvyan/guettable/data/TokenData.java +++ b/app/src/main/java/top/yvyan/guettable/data/TokenData.java @@ -7,6 +7,7 @@ import android.content.SharedPreferences; import top.yvyan.guettable.R; import top.yvyan.guettable.service.fetch.Net; import top.yvyan.guettable.service.fetch.StaticService; +import top.yvyan.guettable.util.ToastUtil; public class TokenData { @SuppressLint("StaticFieldLeak") @@ -210,13 +211,32 @@ public class TokenData { return -2; } if (CASCookieStr.contains("TGT-")) { - setCASCookie(CASCookieStr); + if(CASCookieStr.contains("ERROR5")) { + setCASCookie(CASCookieStr.substring(CASCookieStr.indexOf(";")+1)); + return fuck2FA(accountData.getUsername(),accountData.getVPNPwd(),CASCookieStr.substring(CASCookieStr.indexOf(";")+1),VPNToken); + } else { + setCASCookie(CASCookieStr); + } return 0; } else { return -1; } } + private int fuck2FA(String account,String password,String CASCookie,String VPNToken) { + try{ + String MulitFactorAuth = StaticService.fuck2FA(context,password,CASCookie,VPNToken); + if(MulitFactorAuth.contains("ERROR")) { + return -1; + } else { + setCASCookie(CASCookie + "; " + MulitFactorAuth); + } + return 0; + } catch (Exception ignore) { + return 0; + } + } + public void setCASCookie(String CASCookie) { this.CASCookie = CASCookie; editor.putString(CAS_Cookie, CASCookie); 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 02ac9e5..86ae9c0 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 @@ -118,14 +118,14 @@ public class Net { resources.getString(R.string.user_agent), resources.getString(R.string.SSO_referer), body, - VPNToken == null ? cookie_builder.toString() : VPNToken , + VPNToken == null ? cookie_builder.toString() : VPNToken, "}", resources.getString(R.string.cookie_delimiter), null, null, false, resources.getString(R.string.SSO_context_type)); - if (VPNToken==null && LoginRequest.code == -7) { + if (VPNToken == null && LoginRequest.code == -7) { List cookies = LoginRequest.c.getHeaderFields().get("Set-Cookie"); if (cookies != null) { cookie_builder.append("; "); @@ -133,12 +133,12 @@ public class Net { cookie_builder.append(cookie_resp.substring(0, cookie_resp.indexOf(";") + 1)).append(" "); } } - 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) { + if (VPNToken != null) { //获取 Cookie 判断是否登录成功 HttpConnectionAndCode VPNGetCookieRequest = Get.get( resources.getString(R.string.vpn_get_cookie) + "&vpn_timestamp=" + new Date().getTime(), @@ -154,7 +154,7 @@ public class Net { null, 10000, null); - return new HttpConnectionAndCode(LoginRequest.c,VPNGetCookieRequest.code,VPNGetCookieRequest.comment); + return new HttpConnectionAndCode(LoginRequest.c, VPNGetCookieRequest.code, VPNGetCookieRequest.comment); } return LoginRequest; } catch (Exception ignored) { @@ -172,15 +172,15 @@ public class Net { * @param VPNToken VPNToken * @return Response */ - public static HttpConnectionAndCode sendPhoneOTP(Context context, String CASCookie,String account, String VPNToken) { + public static HttpConnectionAndCode sendPhoneOTP(Context context, String CASCookie, String account, String VPNToken) { Resources resources = context.getResources(); return Post.post( (VPNToken != null ? resources.getString(R.string.url_SendPhoneOTP_VPN) : 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", + VPNToken == null ? CASCookie : VPNToken, null, resources.getString(R.string.cookie_delimiter), null, @@ -198,24 +198,24 @@ public class Net { * @param VPNToken VPNToken * @return Response */ - public static HttpConnectionAndCode verifyPhoneOTP(Context context, String CASCookie,String OTP, String VPNToken) { + public static HttpConnectionAndCode verifyPhoneOTP(Context context, String CASCookie, String OTP, String VPNToken) { Resources resources = context.getResources(); HttpConnectionAndCode VerifyRequest = Post.post( (VPNToken != null ? resources.getString(R.string.url_ReAuth_VPN) : 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=", + VPNToken == null ? CASCookie : VPNToken, null, resources.getString(R.string.cookie_delimiter), null, null, false, resources.getString(R.string.SSO_context_type)); - if(VPNToken == null) { + if (VPNToken == null) { return VerifyRequest; - } else { + } else { HttpConnectionAndCode VPNGetCookieRequest = Get.get( resources.getString(R.string.vpn_get_cookie) + "&vpn_timestamp=" + new Date().getTime(), null, @@ -230,8 +230,77 @@ public class Net { null, 10000, null); - return new HttpConnectionAndCode(VerifyRequest.c,VerifyRequest.code,VerifyRequest.comment,VPNGetCookieRequest.comment, VerifyRequest.resp_code); + return new HttpConnectionAndCode(VerifyRequest.c, VerifyRequest.code, VerifyRequest.comment, VPNGetCookieRequest.comment, VerifyRequest.resp_code); + } + } + + /** + * 认证手机验证码 + * + * @param context context + * @param CASCookie CAS Cookie + * @param OTP + * @param VPNToken VPNToken + * @return Response + */ + public static HttpConnectionAndCode fuck2FA(Context context, String password, String CASCookie, String VPNToken) { + Resources resources = context.getResources(); + try { + HttpConnectionAndCode MFAParams = Get.get( + (VPNToken != null ? resources.getString(R.string.url_ReAuth_Param_VPN) : resources.getString(R.string.url_ReAuth_Param)), + null, + resources.getString(R.string.user_agent), + resources.getString(R.string.SSO_referer), + VPNToken == null ? CASCookie : VPNToken, + null, + resources.getString(R.string.cookie_delimiter), + null, + null, + null, + null, + 10000, + null); + if (MFAParams.code != 0) { + return new HttpConnectionAndCode(0); + } + ArrayList listExp = RegularUtil.getAllSatisfyStr(MFAParams.comment, "(?<=\"pwdEncryptSalt\":\")(\\w+)(?=\")"); + String AESKey = listExp.get(0); + HttpConnectionAndCode VerifyRequest = Post.post( + (VPNToken != null ? resources.getString(R.string.url_ReAuth_VPN) : 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=", + VPNToken == null ? CASCookie : VPNToken, + 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(), + 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(VerifyRequest.c, VerifyRequest.code, VerifyRequest.comment, VPNGetCookieRequest.comment, VerifyRequest.resp_code); + } + } catch (Exception ignored) { + } + return new HttpConnectionAndCode(0); } /** 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 1d08561..2a8c22c 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 @@ -76,6 +76,31 @@ public class StaticService { } } + public static String fuck2FA(Context context, String Password,String CASCookie, String VPNToken) { + HttpConnectionAndCode response = Net.fuck2FA(context, Password,CASCookie, VPNToken); + if (response.code != 0) { + if (response.code == -5) { + return "ERROR2"; + } + 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 "ERROR1"; + } + } + /** * 发送手机验证码 * diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5030f0b..0303ebe 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -11,6 +11,8 @@ 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 + https://v.guet.edu.cn/https/77726476706e69737468656265737421f3f652d220256d44300d8db9d6562d/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 -- Gitee From e0b802552fabff7f743261d1d499c45643f78fb3 Mon Sep 17 00:00:00 2001 From: wing <843862803@qq.com> Date: Wed, 8 Mar 2023 14:07:09 +0800 Subject: [PATCH 05/24] =?UTF-8?q?=E6=9B=B4=E6=96=B04.6.0(51)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 4 +- .../guettable/activity/LoginActivity.java | 59 +++++++++---------- 2 files changed, 30 insertions(+), 33 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 5e6c6b0..4984ce9 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -7,8 +7,8 @@ android { applicationId "top.yvyan.guettable" minSdkVersion 21 targetSdkVersion 30 - versionCode 50 //记得补丁版本号归零(patch_version) - versionName "4.5.1" + versionCode 51 //记得补丁版本号归零(patch_version) + versionName "4.6.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" android.buildFeatures.dataBinding = true diff --git a/app/src/main/java/top/yvyan/guettable/activity/LoginActivity.java b/app/src/main/java/top/yvyan/guettable/activity/LoginActivity.java index 8004acc..bf2d907 100644 --- a/app/src/main/java/top/yvyan/guettable/activity/LoginActivity.java +++ b/app/src/main/java/top/yvyan/guettable/activity/LoginActivity.java @@ -17,7 +17,6 @@ import android.widget.Button; import android.widget.CheckBox; import android.widget.EditText; import android.widget.ImageView; -import android.widget.ProgressBar; import android.widget.TextView; import androidx.annotation.Nullable; @@ -138,15 +137,14 @@ public class LoginActivity extends Activity implements View.OnClickListener { /** * 验证智慧校园密码 OTP Version - * */ - private void testCASWithOTP(String OTP,String CASCookie, String VPNToken,TokenData tokenData) { + private void testCASWithOTP(String OTP, String CASCookie, String VPNToken, TokenData tokenData) { String account = etAccount.getText().toString(); String pwd2 = etPwd2.getText().toString(); new Thread(() -> { runOnUiThread(() -> button.setText("正在认证-手机验证码")); - String MulitFactorAuth = StaticService.VerifyPhoneOTP(this, CASCookie,OTP, VPNToken); - if(MulitFactorAuth.contains("ERROR")) { + String MulitFactorAuth = StaticService.VerifyPhoneOTP(this, CASCookie, OTP, VPNToken); + if (MulitFactorAuth.contains("ERROR")) { if (MulitFactorAuth.equals("ERROR1")) { showErrorToast(-4); } else if (MulitFactorAuth.equals("ERROR2")) { @@ -155,7 +153,7 @@ public class LoginActivity extends Activity implements View.OnClickListener { showErrorToast(-8); } } else { - tokenData.setCASCookie(CASCookie+"; "+MulitFactorAuth); + tokenData.setCASCookie(CASCookie + "; " + MulitFactorAuth); tokenData.setBkjwCookie(null); accountData.setUser(account, null, pwd2, cbRememberPwd.isChecked()); getInfo(); @@ -175,11 +173,11 @@ public class LoginActivity extends Activity implements View.OnClickListener { String CasCookie = StaticService.SSOLogin(this, account, password, VPNToken); if (CasCookie.contains("TGT-")) { TokenData tokenData = TokenData.newInstance(this); - if(CasCookie.contains("ERROR5")) { - tokenData.setCASCookie(CasCookie.substring(CasCookie.indexOf(";")+1)); + if (CasCookie.contains("ERROR5")) { + tokenData.setCASCookie(CasCookie.substring(CasCookie.indexOf(";") + 1)); tokenData.setBkjwCookie(null); - fuck2FA(account,password,CasCookie.substring(CasCookie.indexOf(";")+1),VPNToken,tokenData); - if(false) { + fuck2FA(account, password, CasCookie.substring(CasCookie.indexOf(";") + 1), VPNToken, tokenData); + if (false) { String phoneNumber = StaticService.SendPhoneOTP(this, CasCookie.substring(CasCookie.indexOf(";") + 1), account, VPNToken); if (!phoneNumber.contains("ERROR")) { runOnUiThread(() -> { @@ -219,33 +217,33 @@ public class LoginActivity extends Activity implements View.OnClickListener { } - private void fuck2FA(String account,String password,String CASCookie,String VPNToken,TokenData tokenData) { - try{ - runOnUiThread(() -> button.setText("正在尝试绕过二步验证")); - String MulitFactorAuth = StaticService.fuck2FA(this,password,CASCookie,VPNToken); - if(MulitFactorAuth.contains("ERROR")) { - if (MulitFactorAuth.equals("ERROR1")) { - showErrorToast(-4); - } else if (MulitFactorAuth.equals("ERROR2")) { - showErrorToast(-2); - } else { - showErrorToast(-8); - } + private void fuck2FA(String account, String password, String CASCookie, String VPNToken, TokenData tokenData) { + try { + runOnUiThread(() -> button.setText("正在尝试绕过二步验证")); + String MulitFactorAuth = StaticService.fuck2FA(this, password, CASCookie, VPNToken); + if (MulitFactorAuth.contains("ERROR")) { + if (MulitFactorAuth.equals("ERROR1")) { + showErrorToast(-4); + } else if (MulitFactorAuth.equals("ERROR2")) { + showErrorToast(-2); } else { - tokenData.setCASCookie(CASCookie + "; " + MulitFactorAuth); - tokenData.setBkjwCookie(null); - accountData.setUser(account, null, password, cbRememberPwd.isChecked()); - getInfo(); + showErrorToast(-8); } + } else { + tokenData.setCASCookie(CASCookie + "; " + MulitFactorAuth); + tokenData.setBkjwCookie(null); + accountData.setUser(account, null, password, cbRememberPwd.isChecked()); + getInfo(); + } } catch (Exception ignore) { - return; } } + /** * 显示手机验证码2FA */ - private void showPhoneOtpDialog(String phoneNumber,String CasCookie,String VPNToken,TokenData tokenData) { + private void showPhoneOtpDialog(String phoneNumber, String CasCookie, String VPNToken, TokenData tokenData) { try { AlertDialog dialog; AlertDialog.Builder builder = new AlertDialog.Builder(this); @@ -264,12 +262,11 @@ public class LoginActivity extends Activity implements View.OnClickListener { buttonYes.setOnClickListener(view -> { TextView phoneOTP = window .findViewById(R.id.et_phoneotp); - String OTP=phoneOTP.getText().toString(); + String OTP = phoneOTP.getText().toString(); dialog.dismiss(); - testCASWithOTP(OTP,CasCookie,VPNToken,tokenData); + testCASWithOTP(OTP, CasCookie, VPNToken, tokenData); }); } catch (Exception ignore) { - return; } } -- Gitee From 809708d9ba6620297f30031e8791f8809fc58c75 Mon Sep 17 00:00:00 2001 From: bbaa Date: Thu, 9 Mar 2023 23:14:06 +0800 Subject: [PATCH 06/24] =?UTF-8?q?chore:=20=E7=A7=BB=E9=99=A4WebVPN?= =?UTF-8?q?=E7=99=BB=E5=BD=95CAS=E9=83=A8=E5=88=86,=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E7=99=BB=E5=BD=95=E9=80=9F=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../guettable/activity/LoginActivity.java | 32 +++--- .../top/yvyan/guettable/data/TokenData.java | 50 +++++---- .../yvyan/guettable/service/fetch/Net.java | 103 ++++-------------- .../service/fetch/StaticService.java | 86 ++++----------- 4 files changed, 90 insertions(+), 181 deletions(-) diff --git a/app/src/main/java/top/yvyan/guettable/activity/LoginActivity.java b/app/src/main/java/top/yvyan/guettable/activity/LoginActivity.java index bf2d907..5c69a19 100644 --- a/app/src/main/java/top/yvyan/guettable/activity/LoginActivity.java +++ b/app/src/main/java/top/yvyan/guettable/activity/LoginActivity.java @@ -117,11 +117,7 @@ public class LoginActivity extends Activity implements View.OnClickListener { String account = etAccount.getText().toString(); String pwd2 = etPwd2.getText().toString(); new Thread(() -> { - String VPNToken = null; - if (Net.testNet() != 200) { - VPNToken = Net.getVPNToken(this); - } - testCAS(account, pwd2, VPNToken); + testCAS(account, pwd2); }).start(); } @@ -138,12 +134,12 @@ public class LoginActivity extends Activity implements View.OnClickListener { /** * 验证智慧校园密码 OTP Version */ - private void testCASWithOTP(String OTP, String CASCookie, String VPNToken, TokenData tokenData) { + private void testCASWithOTP(String OTP, String CASCookie, TokenData tokenData) { String account = etAccount.getText().toString(); String pwd2 = etPwd2.getText().toString(); new Thread(() -> { runOnUiThread(() -> button.setText("正在认证-手机验证码")); - String MulitFactorAuth = StaticService.VerifyPhoneOTP(this, CASCookie, OTP, VPNToken); + String MulitFactorAuth = StaticService.VerifyPhoneOTP(this, OTP, CASCookie); if (MulitFactorAuth.contains("ERROR")) { if (MulitFactorAuth.equals("ERROR1")) { showErrorToast(-4); @@ -153,7 +149,7 @@ public class LoginActivity extends Activity implements View.OnClickListener { showErrorToast(-8); } } else { - tokenData.setCASCookie(CASCookie + "; " + MulitFactorAuth); + tokenData.setMFACookie(MulitFactorAuth); tokenData.setBkjwCookie(null); accountData.setUser(account, null, pwd2, cbRememberPwd.isChecked()); getInfo(); @@ -167,21 +163,21 @@ public class LoginActivity extends Activity implements View.OnClickListener { * @param account 学号 * @param password 智慧校园/VPN密码 */ - private void testCAS(String account, String password, String VPNToken) { + private void testCAS(String account, String password) { new Thread(() -> { runOnUiThread(() -> button.setText("正在认证")); - String CasCookie = StaticService.SSOLogin(this, account, password, VPNToken); + String CasCookie = StaticService.SSOLogin(this, account, password, null); if (CasCookie.contains("TGT-")) { TokenData tokenData = TokenData.newInstance(this); if (CasCookie.contains("ERROR5")) { tokenData.setCASCookie(CasCookie.substring(CasCookie.indexOf(";") + 1)); tokenData.setBkjwCookie(null); - fuck2FA(account, password, CasCookie.substring(CasCookie.indexOf(";") + 1), VPNToken, tokenData); + fuck2FA(account, password, CasCookie.substring(CasCookie.indexOf(";") + 1), tokenData); if (false) { - String phoneNumber = StaticService.SendPhoneOTP(this, CasCookie.substring(CasCookie.indexOf(";") + 1), account, VPNToken); + String phoneNumber = StaticService.SendPhoneOTP(this, account, CasCookie.substring(CasCookie.indexOf(";") + 1)); if (!phoneNumber.contains("ERROR")) { runOnUiThread(() -> { - showPhoneOtpDialog(phoneNumber, CasCookie.substring(CasCookie.indexOf(";") + 1), VPNToken, tokenData); + showPhoneOtpDialog(phoneNumber, CasCookie.substring(CasCookie.indexOf(";") + 1), tokenData); }); } else { if (phoneNumber.equals("ERROR1")) { @@ -217,10 +213,10 @@ public class LoginActivity extends Activity implements View.OnClickListener { } - private void fuck2FA(String account, String password, String CASCookie, String VPNToken, TokenData tokenData) { + private void fuck2FA(String account, String password, String CASCookie, TokenData tokenData) { try { runOnUiThread(() -> button.setText("正在尝试绕过二步验证")); - String MulitFactorAuth = StaticService.fuck2FA(this, password, CASCookie, VPNToken); + String MulitFactorAuth = StaticService.fuck2FA(this, password, CASCookie); if (MulitFactorAuth.contains("ERROR")) { if (MulitFactorAuth.equals("ERROR1")) { showErrorToast(-4); @@ -230,7 +226,7 @@ public class LoginActivity extends Activity implements View.OnClickListener { showErrorToast(-8); } } else { - tokenData.setCASCookie(CASCookie + "; " + MulitFactorAuth); + tokenData.setMFACookie(MulitFactorAuth); tokenData.setBkjwCookie(null); accountData.setUser(account, null, password, cbRememberPwd.isChecked()); getInfo(); @@ -243,7 +239,7 @@ public class LoginActivity extends Activity implements View.OnClickListener { /** * 显示手机验证码2FA */ - private void showPhoneOtpDialog(String phoneNumber, String CasCookie, String VPNToken, TokenData tokenData) { + private void showPhoneOtpDialog(String phoneNumber, String CasCookie, TokenData tokenData) { try { AlertDialog dialog; AlertDialog.Builder builder = new AlertDialog.Builder(this); @@ -264,7 +260,7 @@ public class LoginActivity extends Activity implements View.OnClickListener { .findViewById(R.id.et_phoneotp); String OTP = phoneOTP.getText().toString(); dialog.dismiss(); - testCASWithOTP(OTP, CasCookie, VPNToken, tokenData); + testCASWithOTP(OTP, CasCookie, tokenData); }); } catch (Exception ignore) { } 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 9d38596..548b737 100644 --- a/app/src/main/java/top/yvyan/guettable/data/TokenData.java +++ b/app/src/main/java/top/yvyan/guettable/data/TokenData.java @@ -21,7 +21,7 @@ public class TokenData { 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; @@ -35,6 +35,8 @@ public class TokenData { private String VPNToken; //VPN认证Token private String bkjwCookie; //教务系统认证Cookie + private String MFACookie; + public String getCookie() { if (isVPN) { return VPNToken; @@ -70,6 +72,7 @@ public class TokenData { bkjwCookie = sharedPreferences.getString(BKJW_COOKIE, null); isDevelop = sharedPreferences.getBoolean(IS_DEVELOP, false); CASCookie = sharedPreferences.getString(CAS_Cookie, ""); + MFACookie = sharedPreferences.getString(MULTIFACTOR_USERS, null); } public static TokenData newInstance(Context context) { @@ -122,13 +125,13 @@ public class TokenData { int n = loginVpnByCAS(VPNTokenStr); //登录教务 if (n == 0) { - String ST_BKJW = StaticService.SSOGetST(context, CASCookie, context.getResources().getString(R.string.service_bkjw), VPNTokenStr); + String ST_BKJW = StaticService.SSOGetST(context, CASCookie, context.getResources().getString(R.string.service_bkjw), MFACookie); if (ST_BKJW.equals("ERROR0")) { return -2; } else if (ST_BKJW.equals("ERROR1")) { //TGT失效 - n = refreshTGT(VPNTokenStr); + n = refreshTGT(); if (n == 0) { - ST_BKJW = StaticService.SSOGetST(context, CASCookie, context.getResources().getString(R.string.service_bkjw), VPNTokenStr); + ST_BKJW = StaticService.SSOGetST(context, CASCookie, context.getResources().getString(R.string.service_bkjw), MFACookie); if (!ST_BKJW.contains("ST-")) { return -2; } @@ -144,13 +147,13 @@ public class TokenData { return n; } else { // 内网 StringBuilder cookie_builder = new StringBuilder(); - String ST_BKJW = StaticService.SSOGetST(context, CASCookie, context.getResources().getString(R.string.service_bkjw), null); + String ST_BKJW = StaticService.SSOGetST(context, CASCookie, context.getResources().getString(R.string.service_bkjw), MFACookie); if (!ST_BKJW.contains("ST-")) { // TGT失效 - int n = refreshTGT(null); + int n = refreshTGT(); if (n != 0) { return n; } - ST_BKJW = StaticService.SSOGetST(context, CASCookie, context.getResources().getString(R.string.service_bkjw), null); + ST_BKJW = StaticService.SSOGetST(context, CASCookie, context.getResources().getString(R.string.service_bkjw), MFACookie); if (!ST_BKJW.contains("ST-")) { // 网络错误,切换为外网模式 return -2; } @@ -173,14 +176,14 @@ public class TokenData { */ private int loginVpnByCAS(String VPNTokenStr) { int n; - String ST_VPN = StaticService.SSOGetST(context, CASCookie, context.getResources().getString(R.string.service_vpn), VPNTokenStr); + String ST_VPN = StaticService.SSOGetST(context, CASCookie, context.getResources().getString(R.string.service_vpn), MFACookie); if (ST_VPN.equals("ERROR0")) { return -2; } else if (ST_VPN.equals("ERROR1")) { //TGT失效 - n = refreshTGT(VPNTokenStr); //刷新TGT + n = refreshTGT(); //刷新TGT if (n == 0) { //重新获取登录vpn的st令牌 - ST_VPN = StaticService.SSOGetST(context, CASCookie, context.getResources().getString(R.string.service_vpn), VPNTokenStr); + ST_VPN = StaticService.SSOGetST(context, CASCookie, context.getResources().getString(R.string.service_vpn), MFACookie); if (!ST_VPN.contains("ST-")) { return -2; } @@ -202,18 +205,17 @@ public class TokenData { /** * 刷新TGT令牌 * - * @param VPNToken VPNToken * @return 操作结果 */ - public int refreshTGT(String VPNToken) { - String CASCookieStr = StaticService.SSOLogin(context, accountData.getUsername(), accountData.getVPNPwd(), VPNToken); + public int refreshTGT() { + String CASCookieStr = StaticService.SSOLogin(context, accountData.getUsername(), accountData.getVPNPwd(), MFACookie); if (CASCookieStr.equals("ERROR2") || CASCookieStr.equals("ERROR0")) { return -2; } if (CASCookieStr.contains("TGT-")) { - if(CASCookieStr.contains("ERROR5")) { - setCASCookie(CASCookieStr.substring(CASCookieStr.indexOf(";")+1)); - return fuck2FA(accountData.getUsername(),accountData.getVPNPwd(),CASCookieStr.substring(CASCookieStr.indexOf(";")+1),VPNToken); + if (CASCookieStr.contains("ERROR5")) { + setCASCookie(CASCookieStr.substring(CASCookieStr.indexOf(";") + 1)); + return fuck2FA(accountData.getVPNPwd(), CASCookieStr.substring(CASCookieStr.indexOf(";") + 1)); } else { setCASCookie(CASCookieStr); } @@ -223,13 +225,13 @@ public class TokenData { } } - private int fuck2FA(String account,String password,String CASCookie,String VPNToken) { - try{ - String MulitFactorAuth = StaticService.fuck2FA(context,password,CASCookie,VPNToken); - if(MulitFactorAuth.contains("ERROR")) { + private int fuck2FA(String password, String CASCookie) { + try { + String MulitFactorAuth = StaticService.fuck2FA(context, password, CASCookie); + if (MulitFactorAuth.contains("ERROR")) { return -1; } else { - setCASCookie(CASCookie + "; " + MulitFactorAuth); + setMFACookie(MulitFactorAuth); } return 0; } catch (Exception ignore) { @@ -243,6 +245,12 @@ public class TokenData { editor.apply(); } + public void setMFACookie(String MFACookie) { + this.MFACookie = MFACookie; + editor.putString(CAS_Cookie, MFACookie); + editor.apply(); + } + public void setVPNToken(String VPNToken) { this.VPNToken = VPNToken; editor.putString(VPN_TOKEN, VPNToken); 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 86ae9c0..0dee692 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 @@ -82,19 +82,18 @@ public class Net { * @param context context * @param account 学号 * @param password 密码 - * @param VPNToken VPNToken * @return CAS服务Cookie *请求 */ - public static HttpConnectionAndCode getCASToken(Context context, String account, String password, String VPNToken) { + public static HttpConnectionAndCode getCASToken(Context context, String account, String password, String MFACookie) { StringBuilder cookie_builder = new StringBuilder(); 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, + (MFACookie != null ? ("; " + MFACookie) : null), null, resources.getString(R.string.cookie_delimiter), null, @@ -113,19 +112,19 @@ 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.toString() + (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.code == -7) { List cookies = LoginRequest.c.getHeaderFields().get("Set-Cookie"); if (cookies != null) { cookie_builder.append("; "); @@ -138,24 +137,6 @@ public class Net { 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) { @@ -172,15 +153,15 @@ public class Net { * @param VPNToken VPNToken * @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, + CASCookie, null, resources.getString(R.string.cookie_delimiter), null, @@ -198,40 +179,22 @@ public class Net { * @param VPNToken VPNToken * @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)), + 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, + 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(), - 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(VerifyRequest.c, VerifyRequest.code, VerifyRequest.comment, VPNGetCookieRequest.comment, VerifyRequest.resp_code); - } + return VerifyRequest; } /** @@ -239,19 +202,17 @@ public class Net { * * @param context context * @param CASCookie CAS Cookie - * @param OTP - * @param VPNToken VPNToken * @return Response */ - public static HttpConnectionAndCode fuck2FA(Context context, String password, String CASCookie, String VPNToken) { + public static HttpConnectionAndCode fuck2FA(Context context, String password, String CASCookie) { Resources resources = context.getResources(); try { HttpConnectionAndCode MFAParams = Get.get( - (VPNToken != null ? resources.getString(R.string.url_ReAuth_Param_VPN) : resources.getString(R.string.url_ReAuth_Param)), + resources.getString(R.string.url_ReAuth_Param), null, resources.getString(R.string.user_agent), resources.getString(R.string.SSO_referer), - VPNToken == null ? CASCookie : VPNToken, + CASCookie, null, resources.getString(R.string.cookie_delimiter), null, @@ -266,37 +227,20 @@ public class Net { ArrayList listExp = RegularUtil.getAllSatisfyStr(MFAParams.comment, "(?<=\"pwdEncryptSalt\":\")(\\w+)(?=\")"); String AESKey = listExp.get(0); HttpConnectionAndCode VerifyRequest = Post.post( - (VPNToken != null ? resources.getString(R.string.url_ReAuth_VPN) : resources.getString(R.string.url_ReAuth)), + 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=", - VPNToken == null ? CASCookie : VPNToken, + 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(), - 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(VerifyRequest.c, VerifyRequest.code, VerifyRequest.comment, VPNGetCookieRequest.comment, VerifyRequest.resp_code); - } + + return VerifyRequest; } catch (Exception ignored) { } @@ -309,17 +253,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, 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 2a8c22c..1a9b070 100644 --- a/app/src/main/java/top/yvyan/guettable/service/fetch/StaticService.java +++ b/app/src/main/java/top/yvyan/guettable/service/fetch/StaticService.java @@ -48,15 +48,14 @@ public class StaticService { * @param context context * @param CASCookie * @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"; @@ -76,8 +75,8 @@ public class StaticService { } } - public static String fuck2FA(Context context, String Password,String CASCookie, String VPNToken) { - HttpConnectionAndCode response = Net.fuck2FA(context, Password,CASCookie, VPNToken); + public static String fuck2FA(Context context, String Password, String CASCookie) { + HttpConnectionAndCode response = Net.fuck2FA(context, Password, CASCookie); if (response.code != 0) { if (response.code == -5) { return "ERROR2"; @@ -85,17 +84,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"; } @@ -107,14 +96,13 @@ public class StaticService { * @param context context * @param CASCookie * @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"; @@ -122,17 +110,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"; } @@ -144,43 +122,29 @@ public class StaticService { * @param context context * @param account 学号 * @param password 密码 - * @param VPNToken VPNToken * @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 MFACoookie) { + HttpConnectionAndCode response = Net.getCASToken(context, account, password, MFACoookie); if (response.code != 0) { if (response.code == -5) { return "ERROR2"; } 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"; } } } @@ -191,25 +155,23 @@ 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 MFACoookie) { + HttpConnectionAndCode response = Net.getSTbyCas(context, CASCookie, service, MFACoookie); if (response.code != -7) { if (response.code == -5) { - if (VPNToken != null) { - return "ERROR1"; - } return "ERROR2"; } - if (response.cookie.contains("refresh")) { - return "ERROR1"; - } + /* + if (response.cookie.contains("refresh")) { + return "ERROR1"; + } + */ return "ERROR0"; } else { String Location = response.c.getHeaderField("location"); -- Gitee From d6faad252e4838053ab9d876ea3a0ac2fcca1c3d Mon Sep 17 00:00:00 2001 From: wing <843862803@qq.com> Date: Fri, 10 Mar 2023 19:28:19 +0800 Subject: [PATCH 07/24] =?UTF-8?q?refactor:=20=E4=BC=98=E5=8C=96=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E7=9B=B8=E5=85=B3=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../guettable/activity/LoginActivity.java | 57 ++++----- .../top/yvyan/guettable/data/TokenData.java | 112 ++++++------------ .../yvyan/guettable/service/fetch/Net.java | 22 ++-- .../service/fetch/StaticService.java | 60 +++++++--- 4 files changed, 113 insertions(+), 138 deletions(-) diff --git a/app/src/main/java/top/yvyan/guettable/activity/LoginActivity.java b/app/src/main/java/top/yvyan/guettable/activity/LoginActivity.java index 5c69a19..a113b12 100644 --- a/app/src/main/java/top/yvyan/guettable/activity/LoginActivity.java +++ b/app/src/main/java/top/yvyan/guettable/activity/LoginActivity.java @@ -37,7 +37,6 @@ import top.yvyan.guettable.data.AccountData; import top.yvyan.guettable.data.GeneralData; import top.yvyan.guettable.data.MoreDate; import top.yvyan.guettable.data.TokenData; -import top.yvyan.guettable.service.fetch.Net; import top.yvyan.guettable.service.fetch.StaticService; import top.yvyan.guettable.util.AppUtil; import top.yvyan.guettable.util.DialogUtil; @@ -116,9 +115,7 @@ public class LoginActivity extends Activity implements View.OnClickListener { setUnClick(); String account = etAccount.getText().toString(); String pwd2 = etPwd2.getText().toString(); - new Thread(() -> { - testCAS(account, pwd2); - }).start(); + new Thread(() -> testCAS(account, pwd2)).start(); } @Override @@ -139,17 +136,17 @@ public class LoginActivity extends Activity implements View.OnClickListener { String pwd2 = etPwd2.getText().toString(); new Thread(() -> { runOnUiThread(() -> button.setText("正在认证-手机验证码")); - String MulitFactorAuth = StaticService.VerifyPhoneOTP(this, OTP, CASCookie); - if (MulitFactorAuth.contains("ERROR")) { - if (MulitFactorAuth.equals("ERROR1")) { + String MultiFactorAuth = StaticService.VerifyPhoneOTP(this, OTP, CASCookie); + if (MultiFactorAuth.contains("ERROR")) { + if (MultiFactorAuth.equals("ERROR1")) { showErrorToast(-4); - } else if (MulitFactorAuth.equals("ERROR2")) { + } else if (MultiFactorAuth.equals("ERROR2")) { showErrorToast(-2); } else { showErrorToast(-8); } } else { - tokenData.setMFACookie(MulitFactorAuth); + tokenData.setMFACookie(MultiFactorAuth); tokenData.setBkjwCookie(null); accountData.setUser(account, null, pwd2, cbRememberPwd.isChecked()); getInfo(); @@ -161,7 +158,7 @@ public class LoginActivity extends Activity implements View.OnClickListener { * 验证智慧校园密码 * * @param account 学号 - * @param password 智慧校园/VPN密码 + * @param password 密码 */ private void testCAS(String account, String password) { new Thread(() -> { @@ -173,27 +170,6 @@ public class LoginActivity extends Activity implements View.OnClickListener { tokenData.setCASCookie(CasCookie.substring(CasCookie.indexOf(";") + 1)); tokenData.setBkjwCookie(null); fuck2FA(account, password, CasCookie.substring(CasCookie.indexOf(";") + 1), tokenData); - if (false) { - String phoneNumber = StaticService.SendPhoneOTP(this, account, CasCookie.substring(CasCookie.indexOf(";") + 1)); - if (!phoneNumber.contains("ERROR")) { - runOnUiThread(() -> { - showPhoneOtpDialog(phoneNumber, CasCookie.substring(CasCookie.indexOf(";") + 1), tokenData); - }); - } else { - if (phoneNumber.equals("ERROR1")) { - showErrorToast(-4); - } else if (phoneNumber.equals("ERROR2")) { - showErrorToast(-2); - } else if (phoneNumber.contains("ERROR3")) { - runOnUiThread(() -> { - setEnClick(); - ToastUtil.showToast(this, getResources().getString(R.string.login_fail_phoneOTPSend) + phoneNumber.substring(7)); - }); - } else { - showErrorToast(-8); - } - } - } } else { tokenData.setCASCookie(CasCookie); tokenData.setBkjwCookie(null); @@ -212,21 +188,28 @@ public class LoginActivity extends Activity implements View.OnClickListener { }).start(); } - + /** + * 跳过二步认证 + * + * @param account 学号 + * @param password 密码 + * @param CASCookie CAS Cookie + * @param tokenData tokenData + */ private void fuck2FA(String account, String password, String CASCookie, TokenData tokenData) { try { runOnUiThread(() -> button.setText("正在尝试绕过二步验证")); - String MulitFactorAuth = StaticService.fuck2FA(this, password, CASCookie); - if (MulitFactorAuth.contains("ERROR")) { - if (MulitFactorAuth.equals("ERROR1")) { + String MultiFactorAuth = StaticService.fuck2FA(this, password, CASCookie); + if (MultiFactorAuth.contains("ERROR")) { + if (MultiFactorAuth.equals("ERROR1")) { showErrorToast(-4); - } else if (MulitFactorAuth.equals("ERROR2")) { + } else if (MultiFactorAuth.equals("ERROR2")) { showErrorToast(-2); } else { showErrorToast(-8); } } else { - tokenData.setMFACookie(MulitFactorAuth); + tokenData.setMFACookie(MultiFactorAuth); tokenData.setBkjwCookie(null); accountData.setUser(account, null, password, cbRememberPwd.isChecked()); getInfo(); 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 548b737..fb80ffb 100644 --- a/app/src/main/java/top/yvyan/guettable/data/TokenData.java +++ b/app/src/main/java/top/yvyan/guettable/data/TokenData.java @@ -7,7 +7,6 @@ import android.content.SharedPreferences; import top.yvyan.guettable.R; import top.yvyan.guettable.service.fetch.Net; import top.yvyan.guettable.service.fetch.StaticService; -import top.yvyan.guettable.util.ToastUtil; public class TokenData { @SuppressLint("StaticFieldLeak") @@ -21,7 +20,7 @@ public class TokenData { 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 static final String MULTIFACTORIAL_USERS = "MFACookie"; private final AccountData accountData; public static boolean isVPN = true; @@ -31,7 +30,7 @@ public class TokenData { //强制获取vpn private boolean forceVPN = false; - private String CASCookie; // 新版CAS认证Cookie; CASTGT/JSESSION + private String CASCookie; // 新版CAS认证Cookie; CASTGT/JSESSIONID private String VPNToken; //VPN认证Token private String bkjwCookie; //教务系统认证Cookie @@ -72,7 +71,7 @@ public class TokenData { bkjwCookie = sharedPreferences.getString(BKJW_COOKIE, null); isDevelop = sharedPreferences.getBoolean(IS_DEVELOP, false); CASCookie = sharedPreferences.getString(CAS_Cookie, ""); - MFACookie = sharedPreferences.getString(MULTIFACTOR_USERS, null); + MFACookie = sharedPreferences.getString(MULTIFACTORIAL_USERS, null); } public static TokenData newInstance(Context context) { @@ -114,6 +113,20 @@ public class TokenData { * @return 登录结果 */ private int loginBySmart() { + //尝试获取教务系统ST + int n; + String ST_BKJW = StaticService.SSOGetST(context, CASCookie, 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, CASCookie, context.getResources().getString(R.string.service_bkjw), MFACookie); + if (!ST_BKJW.contains("ST-")) { + return -2; + } + } + if (isVPN) { //外网 //获取VPN的token String VPNTokenStr = Net.getVPNToken(context); @@ -122,42 +135,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), MFACookie); - if (ST_BKJW.equals("ERROR0")) { - return -2; - } else if (ST_BKJW.equals("ERROR1")) { //TGT失效 - n = refreshTGT(); - if (n == 0) { - ST_BKJW = StaticService.SSOGetST(context, CASCookie, context.getResources().getString(R.string.service_bkjw), MFACookie); - if (!ST_BKJW.contains("ST-")) { - return -2; - } - } else { - return n; - } - } + //获取VPN-ST + String ST_VPN = StaticService.SSOGetST(context, CASCookie, context.getResources().getString(R.string.service_vpn), MFACookie); + if (!ST_VPN.contains("ST-")) { + return -2; + } + n = StaticService.loginVPNST(ST_VPN, VPNTokenStr); + if (n != 0) { + n = StaticService.loginVPNST(ST_VPN, VPNTokenStr); + } + if (n != 0) { + return n; + } + n = StaticService.loginBkjwVPNST(ST_BKJW, VPNToken); + if (n != 0) { n = StaticService.loginBkjwVPNST(ST_BKJW, VPNToken); - if (n != 0) { - n = StaticService.loginBkjwVPNST(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), MFACookie); - if (!ST_BKJW.contains("ST-")) { // TGT失效 - int n = refreshTGT(); - if (n != 0) { - return n; - } - ST_BKJW = StaticService.SSOGetST(context, CASCookie, context.getResources().getString(R.string.service_bkjw), MFACookie); - if (!ST_BKJW.contains("ST-")) { // 网络错误,切换为外网模式 - return -2; - } - } int state = StaticService.loginBkjw(context, ST_BKJW, cookie_builder); if (state == 0) { setBkjwCookie(cookie_builder.toString()); @@ -168,40 +165,6 @@ public class TokenData { } } - /** - * 使用CAS登录VPN - * - * @param VPNTokenStr vpn的Token - * @return 登录结果 - */ - private int loginVpnByCAS(String VPNTokenStr) { - int n; - String ST_VPN = StaticService.SSOGetST(context, CASCookie, context.getResources().getString(R.string.service_vpn), MFACookie); - if (ST_VPN.equals("ERROR0")) { - return -2; - } else if (ST_VPN.equals("ERROR1")) { //TGT失效 - n = refreshTGT(); //刷新TGT - if (n == 0) { - //重新获取登录vpn的st令牌 - ST_VPN = StaticService.SSOGetST(context, CASCookie, context.getResources().getString(R.string.service_vpn), MFACookie); - if (!ST_VPN.contains("ST-")) { - return -2; - } - if (StaticService.loginVPNST(ST_VPN, VPNTokenStr) != 0) { - return StaticService.loginVPNST(ST_VPN, VPNTokenStr); - } - return 0; - } else { - return n; - } - } else { - if (StaticService.loginVPNST(ST_VPN, VPNTokenStr) != 0) { - return StaticService.loginVPNST(ST_VPN, VPNTokenStr); - } - return 0; - } - } - /** * 刷新TGT令牌 * @@ -225,13 +188,16 @@ public class TokenData { } } + /** + * pass 2FA + */ private int fuck2FA(String password, String CASCookie) { try { - String MulitFactorAuth = StaticService.fuck2FA(context, password, CASCookie); - if (MulitFactorAuth.contains("ERROR")) { + String MultiFactorAuth = StaticService.fuck2FA(context, password, CASCookie); + if (MultiFactorAuth.contains("ERROR")) { return -1; } else { - setMFACookie(MulitFactorAuth); + setMFACookie(MultiFactorAuth); } return 0; } catch (Exception ignore) { 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 0dee692..4b001e5 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; @@ -34,8 +33,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) @@ -117,7 +116,7 @@ public class Net { resources.getString(R.string.user_agent), resources.getString(R.string.SSO_referer), body, - cookie_builder.toString() + (MFACookie != null ? ("; " + MFACookie) : ""), + cookie_builder + (MFACookie != null ? ("; " + MFACookie) : ""), "}", resources.getString(R.string.cookie_delimiter), null, @@ -149,8 +148,7 @@ 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 account, String CASCookie) { @@ -175,13 +173,12 @@ 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 OTP, String CASCookie) { Resources resources = context.getResources(); - HttpConnectionAndCode VerifyRequest = Post.post( + return Post.post( resources.getString(R.string.url_ReAuth), null, resources.getString(R.string.user_agent), @@ -194,7 +191,6 @@ public class Net { null, false, resources.getString(R.string.SSO_context_type)); - return VerifyRequest; } /** @@ -226,7 +222,8 @@ public class Net { } ArrayList listExp = RegularUtil.getAllSatisfyStr(MFAParams.comment, "(?<=\"pwdEncryptSalt\":\")(\\w+)(?=\")"); String AESKey = listExp.get(0); - HttpConnectionAndCode VerifyRequest = Post.post( + + return Post.post( resources.getString(R.string.url_ReAuth), null, resources.getString(R.string.user_agent), @@ -239,10 +236,7 @@ public class Net { null, false, resources.getString(R.string.SSO_context_type)); - - return VerifyRequest; } catch (Exception ignored) { - } return new HttpConnectionAndCode(0); } 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 1a9b070..a41e3d0 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 @@ -14,6 +14,7 @@ import java.util.Objects; import okhttp3.Call; import okhttp3.OkHttpClient; import okhttp3.Request; +import okhttp3.RequestBody; import okhttp3.Response; import top.yvyan.guettable.Gson.BaseResponse; import top.yvyan.guettable.Gson.CET; @@ -46,7 +47,7 @@ public class StaticService { * 发送手机验证码 * * @param context context - * @param CASCookie + * @param CASCookie CAS Cookie * @param account 学号 * @return Phone Number * ERROR0 : 网络错误 @@ -60,7 +61,6 @@ public class StaticService { if (response.code == -5) { return "ERROR2"; } - return "ERROR0"; } else { if (response.comment.contains("success")) { int PhoneIndex = response.comment.indexOf("\"mobile\":\"") + 10; @@ -71,8 +71,8 @@ public class StaticService { String ErrorMessage = response.comment.substring(MessageIndex); return "ERROR3;" + ErrorMessage.substring(0, ErrorMessage.indexOf("\"")); } - return "ERROR0"; } + return "ERROR0"; } public static String fuck2FA(Context context, String Password, String CASCookie) { @@ -94,7 +94,7 @@ public class StaticService { * 发送手机验证码 * * @param context context - * @param CASCookie + * @param CASCookie CAS Cookie * @param OTP OTP手机验证码 * @return 多因素身份验证令牌Cookie * ERROR0 : 网络错误 @@ -119,17 +119,18 @@ public class StaticService { /** * 获取SSO登录CasCookie * - * @param context context - * @param account 学号 - * @param password 密码 + * @param context context + * @param account 学号 + * @param password 密码 + * @param MFACookie MFA Cookie * @return CAS Cookie * ERROR0 : 网络错误 * ERROR1 : 密码错误 * ERROR2 : 需要使用外网网址进行访问 * ERROR5 : 2FA Needed */ - public static String SSOLogin(Context context, String account, String password, String MFACoookie) { - HttpConnectionAndCode response = Net.getCASToken(context, account, password, MFACoookie); + public static String SSOLogin(Context context, String account, String password, String MFACookie) { + HttpConnectionAndCode response = Net.getCASToken(context, account, password, MFACookie); if (response.code != 0) { if (response.code == -5) { return "ERROR2"; @@ -167,11 +168,6 @@ public class StaticService { if (response.code == -5) { return "ERROR2"; } - /* - if (response.cookie.contains("refresh")) { - return "ERROR1"; - } - */ return "ERROR0"; } else { String Location = response.c.getHeaderField("location"); @@ -220,6 +216,42 @@ public class StaticService { } } + /** + * 向VPN添加Cookie + * + * @param host 域 + * @param path 路径 + * @param cookie cookie + * @param token VPN Token + * @return 0 成功 + */ + public static int CookieSet(String host, String path, String cookie, String token) { + String url = "https://v.guet.edu.cn/wengine-vpn/cookie?method=set" + "&host=" + host + + "&path=" + path + + "&scheme=https&ck_data=" + cookie; + OkHttpClient okHttpClient = new OkHttpClient(); + final Request request = new Request.Builder() + .url(url) + .post(RequestBody.create("",null)) + .addHeader("Cookie", token) + .build(); + final Call call = okHttpClient.newCall(request); + + try { + Response response = call.execute(); + response.close(); + if (Objects.requireNonNull(response.body()).toString().contains("success")) { + return 0; + } else { + return -1; + } + } catch (IOException e) { + e.printStackTrace(); + return -2; + } + + } + /** * 通过ST令牌登录教务系统(VPN) * -- Gitee From 5b7ce24af345c8851533d5dae38fbdd0813cfff2 Mon Sep 17 00:00:00 2001 From: bbaa Date: Fri, 10 Mar 2023 11:57:38 +0000 Subject: [PATCH 08/24] fix: typo --- app/src/main/java/top/yvyan/guettable/data/TokenData.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 fb80ffb..4f3ae36 100644 --- a/app/src/main/java/top/yvyan/guettable/data/TokenData.java +++ b/app/src/main/java/top/yvyan/guettable/data/TokenData.java @@ -213,7 +213,7 @@ public class TokenData { public void setMFACookie(String MFACookie) { this.MFACookie = MFACookie; - editor.putString(CAS_Cookie, MFACookie); + editor.putString(MULTIFACTORIAL_USERS, MFACookie); editor.apply(); } -- Gitee From 91a4a7aa463fe3ea5f25def1145e055cb7c7744b Mon Sep 17 00:00:00 2001 From: bbaa Date: Sat, 11 Mar 2023 11:59:56 +0800 Subject: [PATCH 09/24] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8DGet.get=E6=96=B9?= =?UTF-8?q?=E6=B3=95=E5=8F=91=E5=87=BAPOST=E8=AF=B7=E6=B1=82=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98=20=E6=AD=A4=E4=BF=AE=E5=A4=8D=E5=80=BC?= =?UTF-8?q?=E5=BE=97=E5=8D=95=E5=BC=80=E4=B8=AAcommit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/top/yvyan/guettable/Http/Get.java | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/java/top/yvyan/guettable/Http/Get.java b/app/src/main/java/top/yvyan/guettable/Http/Get.java index 8af0733..37455d4 100644 --- a/app/src/main/java/top/yvyan/guettable/Http/Get.java +++ b/app/src/main/java/top/yvyan/guettable/Http/Get.java @@ -57,7 +57,6 @@ public class Get { } url = new URL(u_bulider.toString()); cnt = (HttpURLConnection) url.openConnection(); - cnt.setDoOutput(true); cnt.setDoInput(true); cnt.setRequestProperty("User-Agent", user_agent); if (accept_encodings != null && accept_encodings.length > 0) { -- Gitee From a8117ae37eee9a85ac0d11faf4036dbde6c91cd7 Mon Sep 17 00:00:00 2001 From: bbaa Date: Sat, 11 Mar 2023 12:40:20 +0800 Subject: [PATCH 10/24] =?UTF-8?q?refactor:=20=E6=B8=85=E7=90=86=E5=A4=A7?= =?UTF-8?q?=E9=83=A8=E5=88=86=E5=8E=86=E5=8F=B2=E9=81=97=E7=95=99=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=EF=BC=8C=E6=8F=90=E5=8D=87=E7=99=BB=E5=BD=95=E9=80=9F?= =?UTF-8?q?=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../guettable/activity/LoginActivity.java | 10 +- .../top/yvyan/guettable/data/TokenData.java | 68 +++++++------ .../top/yvyan/guettable/service/CommFunc.java | 7 +- .../yvyan/guettable/service/fetch/Net.java | 76 ++++++++++++++- .../service/fetch/StaticService.java | 96 ++++--------------- app/src/main/res/values/strings.xml | 4 - 6 files changed, 144 insertions(+), 117 deletions(-) diff --git a/app/src/main/java/top/yvyan/guettable/activity/LoginActivity.java b/app/src/main/java/top/yvyan/guettable/activity/LoginActivity.java index a113b12..578217a 100644 --- a/app/src/main/java/top/yvyan/guettable/activity/LoginActivity.java +++ b/app/src/main/java/top/yvyan/guettable/activity/LoginActivity.java @@ -167,11 +167,11 @@ public class LoginActivity extends Activity implements View.OnClickListener { if (CasCookie.contains("TGT-")) { TokenData tokenData = TokenData.newInstance(this); if (CasCookie.contains("ERROR5")) { - tokenData.setCASCookie(CasCookie.substring(CasCookie.indexOf(";") + 1)); + tokenData.setTGTToken(CasCookie.substring(CasCookie.indexOf(";") + 1)); tokenData.setBkjwCookie(null); - fuck2FA(account, password, CasCookie.substring(CasCookie.indexOf(";") + 1), tokenData); + bypass2FA(account, password, CasCookie.substring(CasCookie.indexOf(";") + 1), tokenData); } else { - tokenData.setCASCookie(CasCookie); + tokenData.setTGTToken(CasCookie); tokenData.setBkjwCookie(null); accountData.setUser(account, null, password, cbRememberPwd.isChecked()); getInfo(); @@ -196,10 +196,10 @@ public class LoginActivity extends Activity implements View.OnClickListener { * @param CASCookie CAS Cookie * @param tokenData tokenData */ - private void fuck2FA(String account, String password, String CASCookie, TokenData tokenData) { + private void bypass2FA(String account, String password, String CASCookie, TokenData tokenData) { try { runOnUiThread(() -> button.setText("正在尝试绕过二步验证")); - String MultiFactorAuth = StaticService.fuck2FA(this, password, CASCookie); + String MultiFactorAuth = StaticService.bypass2FA(this, password, CASCookie); if (MultiFactorAuth.contains("ERROR")) { if (MultiFactorAuth.equals("ERROR1")) { showErrorToast(-4); 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 4f3ae36..8d30c1e 100644 --- a/app/src/main/java/top/yvyan/guettable/data/TokenData.java +++ b/app/src/main/java/top/yvyan/guettable/data/TokenData.java @@ -16,11 +16,12 @@ 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 MULTIFACTORIAL_USERS = "MFACookie"; + private static final String MULTIFACTOR_USERS = "MFACookie"; private final AccountData accountData; public static boolean isVPN = true; @@ -30,7 +31,7 @@ public class TokenData { //强制获取vpn private boolean forceVPN = false; - private String CASCookie; // 新版CAS认证Cookie; CASTGT/JSESSIONID + private String TGTToken; // CAS-TGT private String VPNToken; //VPN认证Token private String bkjwCookie; //教务系统认证Cookie @@ -45,7 +46,7 @@ public class TokenData { } public boolean isVPN() { - return !isVPN; + return isVPN; } /** @@ -70,8 +71,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, ""); - MFACookie = sharedPreferences.getString(MULTIFACTORIAL_USERS, null); + TGTToken = sharedPreferences.getString(CAS_TGTToken, ""); + MFACookie = sharedPreferences.getString(MULTIFACTOR_USERS, null); } public static TokenData newInstance(Context context) { @@ -99,7 +100,8 @@ public class TokenData { isVPN = true; forceVPN = false; } else { - isVPN = Net.testNet() != 200; + isVPN =true; + //isVPN = Net.testNet() != 200; } return loginBySmart(); } else { @@ -115,13 +117,13 @@ public class TokenData { private int loginBySmart() { //尝试获取教务系统ST int n; - String ST_BKJW = StaticService.SSOGetST(context, CASCookie, context.getResources().getString(R.string.service_bkjw), MFACookie); + 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, CASCookie, context.getResources().getString(R.string.service_bkjw), MFACookie); + ST_BKJW = StaticService.SSOGetST(context, TGTToken, context.getResources().getString(R.string.service_bkjw), MFACookie); if (!ST_BKJW.contains("ST-")) { return -2; } @@ -136,20 +138,20 @@ public class TokenData { return -2; } //获取VPN-ST - String ST_VPN = StaticService.SSOGetST(context, CASCookie, context.getResources().getString(R.string.service_vpn), MFACookie); + 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(ST_VPN, VPNTokenStr); + n = StaticService.loginVPNST(context, ST_VPN, VPNTokenStr); if (n != 0) { - n = StaticService.loginVPNST(ST_VPN, VPNTokenStr); + n = StaticService.loginVPNST(context, ST_VPN, VPNTokenStr); } if (n != 0) { return n; } - n = StaticService.loginBkjwVPNST(ST_BKJW, VPNToken); + n = StaticService.loginBkjwVPNST(context, ST_BKJW, VPNToken); if (n != 0) { - n = StaticService.loginBkjwVPNST(ST_BKJW, VPNToken); + n = StaticService.loginBkjwVPNST(context, ST_BKJW, VPNToken); } return n; @@ -171,16 +173,16 @@ public class TokenData { * @return 操作结果 */ public int refreshTGT() { - String CASCookieStr = StaticService.SSOLogin(context, accountData.getUsername(), accountData.getVPNPwd(), MFACookie); - if (CASCookieStr.equals("ERROR2") || CASCookieStr.equals("ERROR0")) { + String TGTTokenStr = StaticService.SSOLogin(context, accountData.getUsername(), accountData.getVPNPwd(), MFACookie); + if (TGTTokenStr.equals("ERROR2") || TGTTokenStr.equals("ERROR0")) { return -2; } - if (CASCookieStr.contains("TGT-")) { - if (CASCookieStr.contains("ERROR5")) { - setCASCookie(CASCookieStr.substring(CASCookieStr.indexOf(";") + 1)); - return fuck2FA(accountData.getVPNPwd(), CASCookieStr.substring(CASCookieStr.indexOf(";") + 1)); + if (TGTTokenStr.contains("TGT-")) { + if (TGTTokenStr.contains("ERROR5")) { + setTGTToken(TGTTokenStr.substring(TGTTokenStr.indexOf(";") + 1)); + return bypass2FA(accountData.getVPNPwd(), TGTTokenStr.substring(TGTTokenStr.indexOf(";") + 1)); } else { - setCASCookie(CASCookieStr); + setTGTToken(TGTTokenStr); } return 0; } else { @@ -189,11 +191,11 @@ public class TokenData { } /** - * pass 2FA + * bypass 2FA */ - private int fuck2FA(String password, String CASCookie) { + private int bypass2FA(String password, String CASCookie) { try { - String MultiFactorAuth = StaticService.fuck2FA(context, password, CASCookie); + String MultiFactorAuth = StaticService.bypass2FA(context, password, CASCookie); if (MultiFactorAuth.contains("ERROR")) { return -1; } else { @@ -205,15 +207,25 @@ public class TokenData { } } - public void setCASCookie(String CASCookie) { - this.CASCookie = CASCookie; - editor.putString(CAS_Cookie, CASCookie); + public int setVPNCASCookie() { + return StaticService.CookieSet(context, "cas.guet.edu.cn", "/authserver/login", MFACookie, VPNToken) | StaticService.CookieSet(context, "cas.guet.edu.cn", "/authserver/login", TGTToken, VPNToken); + } + + 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 { + TGTToken = tTGTToken; + } + editor.putString(CAS_TGTToken, TGTToken); editor.apply(); } public void setMFACookie(String MFACookie) { this.MFACookie = MFACookie; - editor.putString(MULTIFACTORIAL_USERS, MFACookie); + editor.putString(MULTIFACTOR_USERS, MFACookie); editor.apply(); } 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 0924ad3..6c57af0 100644 --- a/app/src/main/java/top/yvyan/guettable/service/CommFunc.java +++ b/app/src/main/java/top/yvyan/guettable/service/CommFunc.java @@ -108,6 +108,7 @@ public class CommFunc { activity.runOnUiThread(() -> dialog[0] = DialogUtil.setTextDialog(activity, "自动登录中...(最长需要20s)", "跳过", iDialogService, true)); tokenData.refresh(); + tokenData.setVPNCASCookie(); if (!noLogin[0]) { activity.runOnUiThread(() -> { if (dialog[0] != null && dialog[0].isShowing()) { @@ -152,6 +153,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(); @@ -180,7 +182,7 @@ public class CommFunc { if (hint != null) { ToastUtil.showLongToast(activity, hint); } - if (tokenData.isVPN()) { //内网直接打开对应网址 + if (!tokenData.isVPN()) { //内网直接打开对应网址 openBrowser(activity, web); } else { //外网登录vpn后打开对应网址 openBrowser(activity, vpnWeb); @@ -196,7 +198,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 +222,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 4b001e5..e384fba 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 @@ -81,7 +81,7 @@ public class Net { * @param context context * @param account 学号 * @param password 密码 - * @return CAS服务Cookie *请求 + * @return CAS-TGT; */ public static HttpConnectionAndCode getCASToken(Context context, String account, String password, String MFACookie) { StringBuilder cookie_builder = new StringBuilder(); @@ -200,7 +200,7 @@ public class Net { * @param CASCookie CAS Cookie * @return Response */ - public static HttpConnectionAndCode fuck2FA(Context context, String password, String CASCookie) { + public static HttpConnectionAndCode bypass2FA(Context context, String password, String CASCookie) { Resources resources = context.getResources(); try { HttpConnectionAndCode MFAParams = Get.get( @@ -241,6 +241,78 @@ public class Net { return new HttpConnectionAndCode(0); } + public static HttpConnectionAndCode loginVPNST(Context context, String ST, String VPNToken) { + Resources resources = context.getResources(); + HttpConnectionAndCode LoginVPNRequset = Get.get( + "https://v.guet.edu.cn/login?cas_login=true&ticket=" + ST, + null, + resources.getString(R.string.user_agent), + null, + VPNToken, + null, + resources.getString(R.string.cookie_delimiter), + null, + null, + null, + null, + 3000, + null); + return LoginVPNRequset; + } + + /** + * 向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 { + HttpConnectionAndCode SetCookieRequset = 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); + return SetCookieRequset; + } catch (Exception ignore) { + } + return new HttpConnectionAndCode(-1); + } + + public static HttpConnectionAndCode loginBkjwVPNST(Context context, String ST, String VPNToken) { + Resources resources = context.getResources(); + HttpConnectionAndCode LoginBkjwVPNRequset = 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); + return LoginBkjwVPNRequset; + } + /** * 获取SSO ST令牌 新版CAS * 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 a41e3d0..f0f80c5 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 @@ -6,6 +6,7 @@ import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import java.io.IOException; +import java.net.URLEncoder; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -75,8 +76,8 @@ public class StaticService { return "ERROR0"; } - public static String fuck2FA(Context context, String Password, String CASCookie) { - HttpConnectionAndCode response = Net.fuck2FA(context, Password, CASCookie); + 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"; @@ -180,7 +181,7 @@ public class StaticService { /** * 通过ST令牌登录VPN - * + * @param context context * @param ST ST令牌 * @param token 用于接收登录后的cookie * @return 登录结果 @@ -188,32 +189,14 @@ public class StaticService { * -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 = ""; - } - final Request request = new Request.Builder() - .url(url) - .addHeader("Cookie", token) - .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 { + 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; } - } catch (IOException e) { - e.printStackTrace(); - return -2; } + return -1; } /** @@ -222,34 +205,17 @@ public class StaticService { * @param host 域 * @param path 路径 * @param cookie cookie - * @param token VPN Token + * @param VPNToken VPN Token * @return 0 成功 */ - public static int CookieSet(String host, String path, String cookie, String token) { - String url = "https://v.guet.edu.cn/wengine-vpn/cookie?method=set" + "&host=" + host + - "&path=" + path + - "&scheme=https&ck_data=" + cookie; - OkHttpClient okHttpClient = new OkHttpClient(); - final Request request = new Request.Builder() - .url(url) - .post(RequestBody.create("",null)) - .addHeader("Cookie", token) - .build(); - final Call call = okHttpClient.newCall(request); - - try { - Response response = call.execute(); - response.close(); - if (Objects.requireNonNull(response.body()).toString().contains("success")) { + public static int CookieSet(Context context,String host, String path, String cookie, String VPNToken) { + HttpConnectionAndCode response = Net.CookieSet(context,host,path,cookie,VPNToken); + if(response.code == 0 ) { + if(response.comment.contains("success")) { return 0; - } else { - return -1; } - } catch (IOException e) { - e.printStackTrace(); - return -2; } - + return -1; } /** @@ -263,34 +229,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; } /** diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0303ebe..49d78e6 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -6,13 +6,9 @@ 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 - https://v.guet.edu.cn/https/77726476706e69737468656265737421f3f652d220256d44300d8db9d6562d/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 -- Gitee From 4dfd1fa5fb3fb4d2918e0d26f1dff539026a8cf9 Mon Sep 17 00:00:00 2001 From: bbaa Date: Sat, 11 Mar 2023 12:55:05 +0800 Subject: [PATCH 11/24] chore: remove debug code --- app/src/main/java/top/yvyan/guettable/data/TokenData.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) 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 8d30c1e..bf26db7 100644 --- a/app/src/main/java/top/yvyan/guettable/data/TokenData.java +++ b/app/src/main/java/top/yvyan/guettable/data/TokenData.java @@ -100,8 +100,7 @@ public class TokenData { isVPN = true; forceVPN = false; } else { - isVPN =true; - //isVPN = Net.testNet() != 200; + isVPN = Net.testNet() != 200; } return loginBySmart(); } else { -- Gitee From fda9861d66259b90d727c0a8ccad570cb8b91066 Mon Sep 17 00:00:00 2001 From: wing <843862803@qq.com> Date: Sat, 11 Mar 2023 21:44:57 +0800 Subject: [PATCH 12/24] =?UTF-8?q?feat:=E6=99=BA=E6=85=A7=E6=A0=A1=E5=9B=AD?= =?UTF-8?q?/VPN=E8=87=AA=E5=8A=A8=E7=99=BB=E5=BD=95=20perf:=E7=AE=80?= =?UTF-8?q?=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../guettable/activity/LaunchActivity.java | 5 +- .../guettable/activity/LoginActivity.java | 11 +-- .../guettable/activity/SetTermActivity.java | 42 ++++------ .../guettable/activity/WebViewActivity.java | 8 +- .../top/yvyan/guettable/data/GeneralData.java | 27 ------- .../top/yvyan/guettable/data/TokenData.java | 12 ++- .../guettable/fragment/DayClassFragment.java | 16 ++-- .../guettable/fragment/MoreFragment.java | 27 ++----- .../top/yvyan/guettable/service/CommFunc.java | 76 ++++++++++++++++--- .../yvyan/guettable/service/fetch/Net.java | 68 ++++++++--------- .../service/fetch/StaticService.java | 48 +++++------- .../yvyan/guettable/util/UrlReplaceUtil.java | 33 ++------ app/src/main/res/values/strings.xml | 3 +- 13 files changed, 170 insertions(+), 206 deletions(-) diff --git a/app/src/main/java/top/yvyan/guettable/activity/LaunchActivity.java b/app/src/main/java/top/yvyan/guettable/activity/LaunchActivity.java index 82399f9..0ffc089 100644 --- a/app/src/main/java/top/yvyan/guettable/activity/LaunchActivity.java +++ b/app/src/main/java/top/yvyan/guettable/activity/LaunchActivity.java @@ -92,10 +92,11 @@ public class LaunchActivity extends AppCompatActivity { switch (type2) { case 0://移动 网络 - TokenData.isVPN = true; + TokenData.setIsVPN(true); + break; case 1: //wifi网络 - new Thread(() -> TokenData.isVPN = Net.testNet() != 200).start(); + new Thread(() -> TokenData.setIsVPN(Net.testNet() != 200)).start(); break; } } diff --git a/app/src/main/java/top/yvyan/guettable/activity/LoginActivity.java b/app/src/main/java/top/yvyan/guettable/activity/LoginActivity.java index 578217a..247cee8 100644 --- a/app/src/main/java/top/yvyan/guettable/activity/LoginActivity.java +++ b/app/src/main/java/top/yvyan/guettable/activity/LoginActivity.java @@ -56,7 +56,6 @@ public class LoginActivity extends Activity implements View.OnClickListener { private View progressBar; private AccountData accountData; - private GeneralData generalData; @Override protected void onCreate(Bundle savedInstanceState) { @@ -64,7 +63,6 @@ public class LoginActivity extends Activity implements View.OnClickListener { setContentView(R.layout.activity_login); accountData = AccountData.newInstance(getContext()); - generalData = GeneralData.newInstance(getContext()); ivPwdSwitch2 = findViewById(R.id.iv_pwd_switch_2); button = findViewById(R.id.login); @@ -286,11 +284,10 @@ public class LoginActivity extends Activity implements View.OnClickListener { StudentInfo studentInfo = null; try { studentInfo = StaticService.getStudentInfo(this, tokenData.getCookie()); - if (!generalData.isInternational()) { - List allTerm = StaticService.getTerms(this, tokenData.getCookie()); - if (allTerm != null) { - MoreDate.newInstance(this).setTermBeans(allTerm); - } + + List allTerm = StaticService.getTerms(this, tokenData.getCookie()); + if (allTerm != null) { + MoreDate.newInstance(this).setTermBeans(allTerm); } } catch (Exception e) { UMCrash.generateCustomLog(e, "getInfo"); diff --git a/app/src/main/java/top/yvyan/guettable/activity/SetTermActivity.java b/app/src/main/java/top/yvyan/guettable/activity/SetTermActivity.java index 094300d..d3a0b16 100644 --- a/app/src/main/java/top/yvyan/guettable/activity/SetTermActivity.java +++ b/app/src/main/java/top/yvyan/guettable/activity/SetTermActivity.java @@ -88,11 +88,7 @@ public class SetTermActivity extends AppCompatActivity implements View.OnClickLi spinnerYear.setSelection(nowYear); //自动选择学期 int nowTerm; - if (generalData.isInternational()) { //国院系统 - nowTerm = Integer.parseInt(term.substring(4, 5)); - } else { - nowTerm = Integer.parseInt(term.substring(10, 11)); - } + nowTerm = Integer.parseInt(term.substring(10, 11)); spinnerTerm.setSelection(nowTerm - 1); //自动选择星期 int week = generalData.getWeek(); @@ -134,30 +130,20 @@ public class SetTermActivity extends AppCompatActivity implements View.OnClickLi ScheduleData scheduleData = ScheduleData.newInstance(getApplicationContext()); int year = Integer.parseInt(generalData.getGrade()) + (int) spinnerYear.getSelectedItemId(); int num = (int) spinnerTerm.getSelectedItemId() + 1; - boolean changeTerm = false; - if (generalData.isInternational()) { - if (!(year + "" + num).equals(generalData.getTerm())) { - scheduleData.deleteInputCourse(); - changeTerm = true; - } - generalData.setTerm(year + "" + num); - } else { - String term_1 = year + "-" + (year + 1) + "_" + num; - for (TermBean termBean : MoreDate.newInstance(this).getTermBeans()) { - String termString = termBean.getTerm(); - if (termString != null - && termString.length() >= 11 - && termString.substring(0, 4).equals(String.valueOf(year)) - && termString.substring(10, 11).equals(String.valueOf(num))) { - term_1 = termString; - break; - } + String term_1 = year + "-" + (year + 1) + "_" + num; + for (TermBean termBean : MoreDate.newInstance(this).getTermBeans()) { + String termString = termBean.getTerm(); + if (termString != null + && termString.length() >= 11 + && termString.substring(0, 4).equals(String.valueOf(year)) + && termString.substring(10, 11).equals(String.valueOf(num))) { + term_1 = termString; + break; } - generalData.setTerm(term_1); - scheduleData.deleteInputCourse(); - changeTerm = true; } - if (changeTerm && scheduleData.getUserCourseBeans().size() != 0) { + generalData.setTerm(term_1); + scheduleData.deleteInputCourse(); + if (scheduleData.getUserCourseBeans().size() != 0) { DialogUtil.IDialogService service = new DialogUtil.IDialogService() { @Override public void onClickYes() { @@ -184,7 +170,7 @@ public class SetTermActivity extends AppCompatActivity implements View.OnClickLi generalData.setWeek(week); generalData.setLastUpdateTime(-1); scheduleData.setUpdate(true); - ToastUtil.showToast(getApplicationContext(), "正在导入课表,受教务系统影响,最长需要约30秒,请耐心等待,不要滑动页面"); + ToastUtil.showToast(getApplicationContext(), "正在导入课表,受教务系统影响,最长需要约10秒,请耐心等待,不要滑动页面"); Intent intent = getIntent(); setResult(OK, intent); finish(); diff --git a/app/src/main/java/top/yvyan/guettable/activity/WebViewActivity.java b/app/src/main/java/top/yvyan/guettable/activity/WebViewActivity.java index efe3dac..c18ce9a 100644 --- a/app/src/main/java/top/yvyan/guettable/activity/WebViewActivity.java +++ b/app/src/main/java/top/yvyan/guettable/activity/WebViewActivity.java @@ -40,6 +40,7 @@ public class WebViewActivity extends AppCompatActivity { public static String WEB_URL = "webURL"; public static String WEB_TITLE = "webTitle"; public static String WEB_COOKIE = "webCookie"; + public static String WEB_COOKIE_URL = "webCookieUrl"; public static String WEB_REFERER = "webReferer"; public static String WEB_SHARE = "webShare"; public static String WEB_SHARE_URL = "webShareText"; @@ -69,6 +70,7 @@ public class WebViewActivity extends AppCompatActivity { final String url = intent.getStringExtra(WEB_URL); String title = intent.getStringExtra(WEB_TITLE); String cookie = intent.getStringExtra(WEB_COOKIE); + String cookieUrl = intent.getStringExtra(WEB_COOKIE_URL); String referer = intent.getStringExtra(WEB_REFERER); boolean share = intent.getBooleanExtra(WEB_SHARE, true); shareUrl = intent.getStringExtra(WEB_SHARE_URL); @@ -76,7 +78,11 @@ public class WebViewActivity extends AppCompatActivity { shareUrl = url; } if (cookie != null) { - setCookies(url, cookie); + if (cookieUrl == null) { + setCookies(url, cookie); + } else { + setCookies(cookieUrl, cookie); + } } if (title == null) { title = "正在加载..."; 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 a4d2db7..76dd8c2 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/TokenData.java b/app/src/main/java/top/yvyan/guettable/data/TokenData.java index bf26db7..778014f 100644 --- a/app/src/main/java/top/yvyan/guettable/data/TokenData.java +++ b/app/src/main/java/top/yvyan/guettable/data/TokenData.java @@ -24,7 +24,7 @@ public class TokenData { private static final String MULTIFACTOR_USERS = "MFACookie"; private final AccountData accountData; - public static boolean isVPN = true; + private static boolean isVPN = true; //开发者调试 private boolean isDevelop; @@ -45,10 +45,14 @@ public class TokenData { } } - public boolean isVPN() { + public static boolean isVPN() { return isVPN; } + public static void setIsVPN(boolean isVPN) { + TokenData.isVPN = isVPN; + } + /** * 获取最新的VPNToken * @@ -210,6 +214,10 @@ public class TokenData { return StaticService.CookieSet(context, "cas.guet.edu.cn", "/authserver/login", MFACookie, VPNToken) | StaticService.CookieSet(context, "cas.guet.edu.cn", "/authserver/login", TGTToken, VPNToken); } + public String getCASCookie() { + return tokenData.MFACookie + "; " + tokenData.TGTToken; + } + public void setTGTToken(String CASCookie) { String tTGTToken = CASCookie.substring(CASCookie.indexOf("CASTGC=")); int TGTTokenEndIndex = tTGTToken.indexOf(";"); 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 ff5b369..5ead452 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; @@ -105,7 +103,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); @@ -140,7 +138,7 @@ public class DayClassFragment extends Fragment implements View.OnClickListener { /** * 更新日课表视图 */ - @SuppressLint("SetTextI18n") + @SuppressLint({"SetTextI18n", "NotifyDataSetChanged"}) public void updateView(int... order) { List allClass = getData(); List todayList, tomorrowList; @@ -244,12 +242,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(), "敬请期待!"); @@ -297,7 +291,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 21b6891..a876d31 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/service/CommFunc.java b/app/src/main/java/top/yvyan/guettable/service/CommFunc.java index 6c57af0..f6fa2cf 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,10 +104,9 @@ 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(); - tokenData.setVPNCASCookie(); if (!noLogin[0]) { activity.runOnUiThread(() -> { if (dialog[0] != null && dialog[0].isShowing()) { @@ -116,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); @@ -126,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 * @@ -159,7 +212,7 @@ public class CommFunc { 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); } @@ -178,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); @@ -198,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(() -> { 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 e384fba..ee010c4 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 @@ -17,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; @@ -243,11 +242,11 @@ public class Net { public static HttpConnectionAndCode loginVPNST(Context context, String ST, String VPNToken) { Resources resources = context.getResources(); - HttpConnectionAndCode LoginVPNRequset = Get.get( + return Get.get( "https://v.guet.edu.cn/login?cas_login=true&ticket=" + ST, null, resources.getString(R.string.user_agent), - null, + resources.getString(R.string.SSO_referer), VPNToken, null, resources.getString(R.string.cookie_delimiter), @@ -257,7 +256,6 @@ public class Net { null, 3000, null); - return LoginVPNRequset; } /** @@ -272,7 +270,7 @@ public class Net { public static HttpConnectionAndCode CookieSet(Context context, String host, String path, String cookie, String VPNToken) { Resources resources = context.getResources(); try { - HttpConnectionAndCode SetCookieRequset = Get.get( + 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"), @@ -288,7 +286,6 @@ public class Net { null, 3000, null); - return SetCookieRequset; } catch (Exception ignore) { } return new HttpConnectionAndCode(-1); @@ -296,7 +293,7 @@ public class Net { public static HttpConnectionAndCode loginBkjwVPNST(Context context, String ST, String VPNToken) { Resources resources = context.getResources(); - HttpConnectionAndCode LoginBkjwVPNRequset = Get.get( + return Get.get( "https://v.guet.edu.cn/http/77726476706e69737468656265737421f2fc4b8b69377d556a468ca88d1b203b?ticket=" + ST, null, resources.getString(R.string.user_agent), @@ -310,7 +307,6 @@ public class Net { null, 3000, null); - return LoginBkjwVPNRequset; } /** @@ -383,10 +379,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, "}", @@ -410,10 +406,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, @@ -439,10 +435,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, @@ -468,10 +464,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, @@ -495,10 +491,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, @@ -522,10 +518,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, @@ -549,10 +545,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, @@ -576,10 +572,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, @@ -603,10 +599,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, "}", @@ -629,10 +625,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, @@ -656,10 +652,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, @@ -685,10 +681,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, @@ -712,10 +708,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, @@ -739,10 +735,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 f0f80c5..3ab8aca 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,18 +5,10 @@ import android.content.Context; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; -import java.io.IOException; -import java.net.URLEncoder; 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.RequestBody; -import okhttp3.Response; import top.yvyan.guettable.Gson.BaseResponse; import top.yvyan.guettable.Gson.CET; import top.yvyan.guettable.Gson.ClassTable; @@ -163,8 +155,8 @@ public class StaticService { * ERROR2 : 需要使用外网网址进行访问 或 TGT失效(上层调用时,若内网返回此错误, * 则先尝试外网,若是TGT失效,则重新获取;若正常获取,则需要将全局网络设置为外网) */ - public static String SSOGetST(Context context, String CASCookie, String service, String MFACoookie) { - HttpConnectionAndCode response = Net.getSTbyCas(context, CASCookie, service, MFACoookie); + 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) { return "ERROR2"; @@ -181,9 +173,9 @@ public class StaticService { /** * 通过ST令牌登录VPN - * @param context context - * @param ST ST令牌 - * @param token 用于接收登录后的cookie + * @param context context + * @param ST ST令牌 + * @param VPNToken 用于接收登录后的cookie * @return 登录结果 * 0 -- 登录成功 * -1 -- 登录失败 @@ -273,7 +265,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()); @@ -294,7 +286,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 { @@ -311,7 +303,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>>() { @@ -334,7 +326,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>>() { @@ -362,7 +354,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()); @@ -384,7 +376,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()); @@ -406,7 +398,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()); @@ -428,7 +420,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()); @@ -449,9 +441,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()); @@ -472,9 +464,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()); @@ -619,7 +611,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>>() { @@ -646,7 +638,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>>() { @@ -671,7 +663,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/UrlReplaceUtil.java b/app/src/main/java/top/yvyan/guettable/util/UrlReplaceUtil.java index c860b07..b71038b 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/res/values/strings.xml b/app/src/main/res/values/strings.xml index 49d78e6..6b03f79 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -4,7 +4,6 @@ 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://cas.guet.edu.cn/authserver/dynamicCode/getDynamicCodeByReauth.do https://cas.guet.edu.cn/authserver/reAuthCheck/reAuthSubmit.do @@ -132,7 +131,7 @@ Casual | 就这 | ୧⍤⃝ⓍⓅ乏了 | 我终究不是个好人 | 🍓 | sin² | 沉山浮阳 | 迷 | 稚隳 - https://bkjw.guet.edu.cn/student/GetSctCourse + /student/GetSctCourse -- Gitee From 5242af5c0c451f92b00808463d37fa6acbc5f49a Mon Sep 17 00:00:00 2001 From: wing <843862803@qq.com> Date: Sat, 11 Mar 2023 22:33:32 +0800 Subject: [PATCH 13/24] =?UTF-8?q?=E6=9B=B4=E6=96=B05.0.0(52)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 4984ce9..d596257 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -7,8 +7,8 @@ android { applicationId "top.yvyan.guettable" minSdkVersion 21 targetSdkVersion 30 - versionCode 51 //记得补丁版本号归零(patch_version) - versionName "4.6.0" + versionCode 52 //记得补丁版本号归零(patch_version) + versionName "5.0.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" android.buildFeatures.dataBinding = true -- Gitee From 5cbd186a2df413c8d63aafcbed7447ea588934fa Mon Sep 17 00:00:00 2001 From: wing <843862803@qq.com> Date: Sat, 11 Mar 2023 22:34:05 +0800 Subject: [PATCH 14/24] =?UTF-8?q?fix:=E8=AF=B7=E6=B1=82su=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/top/yvyan/guettable/baseFun/UpdateApp.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 a3dd7e8..a88248e 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()); } -- Gitee From fa1bcabaa27273e7a63b35ba921d064b11fe2426 Mon Sep 17 00:00:00 2001 From: bbaa Date: Mon, 13 Mar 2023 20:57:24 +0800 Subject: [PATCH 15/24] =?UTF-8?q?chore:=20=E5=A2=9E=E5=8A=A0=E5=AF=86?= =?UTF-8?q?=E7=A0=81=E9=94=99=E8=AF=AF=E6=8A=A5=E9=94=99=E4=BF=A1=E6=81=AF?= =?UTF-8?q?;=20=E7=99=BB=E5=BD=95=E6=97=B6=E6=A3=80=E6=9F=A5=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E7=8A=B6=E6=80=81=E9=98=B2=E6=AD=A2=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E7=99=BB=E5=BD=95=E5=86=BB=E7=BB=93=E8=B4=A6=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/top/yvyan/guettable/Http/Get.java | 16 ++++++++++++---- .../java/top/yvyan/guettable/Http/Post.java | 14 +++++++++----- .../guettable/activity/LoginActivity.java | 4 ++-- .../top/yvyan/guettable/data/TokenData.java | 14 +++++++++++--- .../yvyan/guettable/service/fetch/Net.java | 19 +++++++++++++++---- .../service/fetch/StaticService.java | 12 ++++++++---- 6 files changed, 57 insertions(+), 22 deletions(-) diff --git a/app/src/main/java/top/yvyan/guettable/Http/Get.java b/app/src/main/java/top/yvyan/guettable/Http/Get.java index 37455d4..703f555 100644 --- a/app/src/main/java/top/yvyan/guettable/Http/Get.java +++ b/app/src/main/java/top/yvyan/guettable/Http/Get.java @@ -104,14 +104,22 @@ public class Get { } try { resp_code = cnt.getResponseCode(); - if (redirect != null && !redirect && resp_code == 302) { + if (redirect != null && !redirect && (resp_code >=300 && resp_code <400)) { return new HttpConnectionAndCode(cnt, -7, ""); } List encodings = cnt.getHeaderFields().get("content-encoding"); - if (encodings != null && encodings.get(0).equals("gzip")) { - in = new InputStreamReader(new GZIPInputStream(cnt.getInputStream())); + if(resp_code < 400) { + if (encodings != null && encodings.get(0).equals("gzip")) { + in = new InputStreamReader(new GZIPInputStream(cnt.getInputStream())); + } else { + in = new InputStreamReader(cnt.getInputStream()); + } } else { - in = new InputStreamReader(cnt.getInputStream()); + if (encodings != null && encodings.get(0).equals("gzip")) { + in = new InputStreamReader(new GZIPInputStream(cnt.getErrorStream())); + } else { + in = new InputStreamReader(cnt.getErrorStream()); + } } StringBuilder response_builder = new StringBuilder(); char read_char; diff --git a/app/src/main/java/top/yvyan/guettable/Http/Post.java b/app/src/main/java/top/yvyan/guettable/Http/Post.java index 3344ea3..b3d8c85 100644 --- a/app/src/main/java/top/yvyan/guettable/Http/Post.java +++ b/app/src/main/java/top/yvyan/guettable/Http/Post.java @@ -121,19 +121,23 @@ public class Post { return new HttpConnectionAndCode(-4); } try { - resp_code = cnt.getResponseCode(); - if (redirect != null && !redirect && resp_code == 302) { + resp_code = cnt.getResponseCode(); + if (redirect != null && !redirect && (resp_code >=300 && resp_code <400)) { return new HttpConnectionAndCode(cnt, -7, ""); } List encodings = cnt.getHeaderFields().get("content-encoding"); - if (encodings != null) { - if (encodings.get(0).equals("gzip")) { + if(resp_code < 400) { + if (encodings != null && encodings.get(0).equals("gzip")) { in = new InputStreamReader(new GZIPInputStream(cnt.getInputStream())); } else { in = new InputStreamReader(cnt.getInputStream()); } } else { - in = new InputStreamReader(cnt.getInputStream()); + if (encodings != null && encodings.get(0).equals("gzip")) { + in = new InputStreamReader(new GZIPInputStream(cnt.getErrorStream())); + } else { + in = new InputStreamReader(cnt.getErrorStream()); + } } StringBuilder response_builder = new StringBuilder(); char read_char; diff --git a/app/src/main/java/top/yvyan/guettable/activity/LoginActivity.java b/app/src/main/java/top/yvyan/guettable/activity/LoginActivity.java index 247cee8..e1239b4 100644 --- a/app/src/main/java/top/yvyan/guettable/activity/LoginActivity.java +++ b/app/src/main/java/top/yvyan/guettable/activity/LoginActivity.java @@ -160,10 +160,10 @@ public class LoginActivity extends Activity implements View.OnClickListener { */ private void testCAS(String account, String password) { new Thread(() -> { + TokenData tokenData = TokenData.newInstance(this); runOnUiThread(() -> button.setText("正在认证")); - String CasCookie = StaticService.SSOLogin(this, account, password, null); + String CasCookie = StaticService.SSOLogin(this, account, password, accountData.getVPNPwd() == password ? tokenData.getTGTToken() : null, tokenData.getMFACookie()); if (CasCookie.contains("TGT-")) { - TokenData tokenData = TokenData.newInstance(this); if (CasCookie.contains("ERROR5")) { tokenData.setTGTToken(CasCookie.substring(CasCookie.indexOf(";") + 1)); tokenData.setBkjwCookie(null); 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 778014f..a785771 100644 --- a/app/src/main/java/top/yvyan/guettable/data/TokenData.java +++ b/app/src/main/java/top/yvyan/guettable/data/TokenData.java @@ -75,7 +75,7 @@ public class TokenData { VPNToken = sharedPreferences.getString(VPN_TOKEN, null); bkjwCookie = sharedPreferences.getString(BKJW_COOKIE, null); isDevelop = sharedPreferences.getBoolean(IS_DEVELOP, false); - TGTToken = sharedPreferences.getString(CAS_TGTToken, ""); + TGTToken = sharedPreferences.getString(CAS_TGTToken, null); MFACookie = sharedPreferences.getString(MULTIFACTOR_USERS, null); } @@ -176,7 +176,7 @@ public class TokenData { * @return 操作结果 */ public int refreshTGT() { - String TGTTokenStr = StaticService.SSOLogin(context, accountData.getUsername(), accountData.getVPNPwd(), MFACookie); + String TGTTokenStr = StaticService.SSOLogin(context, accountData.getUsername(), accountData.getVPNPwd(),TGTToken, MFACookie); if (TGTTokenStr.equals("ERROR2") || TGTTokenStr.equals("ERROR0")) { return -2; } @@ -215,7 +215,15 @@ public class TokenData { } public String getCASCookie() { - return tokenData.MFACookie + "; " + tokenData.TGTToken; + return (MFACookie != null ? MFACookie : "") + (TGTToken != null ? ((MFACookie!=null ? "; " : "")+TGTToken) : ""); + } + + public String getTGTToken() { + return TGTToken; + } + + public String getMFACookie() { + return MFACookie; } public void setTGTToken(String CASCookie) { 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 ee010c4..8e81693 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,6 +6,7 @@ import android.content.res.Resources; import java.io.IOException; import java.net.URLEncoder; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.concurrent.TimeUnit; @@ -80,10 +81,13 @@ public class Net { * @param context context * @param account 学号 * @param password 密码 + * @param TGTToken CAS-TGT + * @param MFACookie 2FA二次验证Cookie * @return CAS-TGT; */ - public static HttpConnectionAndCode getCASToken(Context context, String account, String password, String MFACookie) { + 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( @@ -91,16 +95,20 @@ public class Net { null, resources.getString(R.string.user_agent), resources.getString(R.string.SSO_referer), - (MFACookie != null ? ("; " + MFACookie) : null), + AuthCookie!="" ? 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); @@ -122,12 +130,15 @@ public class Net { null, false, resources.getString(R.string.SSO_context_type)); + 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(); 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 3ab8aca..367f136 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 @@ -116,17 +116,21 @@ public class StaticService { * @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 MFACookie) { - HttpConnectionAndCode response = Net.getCASToken(context, account, password, MFACookie); + 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 ) { + return (MFACookie != null ? (MFACookie + "; "+TGTToken) : "ERROR1"); + } + if(response.code == -8) { + return "ERROR1"; } return "ERROR0"; } else { -- Gitee From 4afb17a595aa2218682570b94f6fcf3f50af5776 Mon Sep 17 00:00:00 2001 From: bbaa Date: Tue, 14 Mar 2023 18:48:53 +0800 Subject: [PATCH 16/24] =?UTF-8?q?fix:=20=E5=A2=9E=E5=8A=A0=E6=9C=AA?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE=E4=BA=8C=E6=AD=A5=E9=AA=8C=E8=AF=81=E6=97=B6?= =?UTF-8?q?=E7=9A=84=E5=BF=AB=E9=80=9F=E7=99=BB=E5=BD=95Cookie=E5=88=A4?= =?UTF-8?q?=E6=96=AD=EF=BC=8C=E5=A4=84=E7=90=86=E8=BE=B9=E7=BC=98=E6=83=85?= =?UTF-8?q?=E5=86=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/top/yvyan/guettable/data/TokenData.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 a785771..3eb0d0e 100644 --- a/app/src/main/java/top/yvyan/guettable/data/TokenData.java +++ b/app/src/main/java/top/yvyan/guettable/data/TokenData.java @@ -211,7 +211,7 @@ public class TokenData { } public int setVPNCASCookie() { - return StaticService.CookieSet(context, "cas.guet.edu.cn", "/authserver/login", MFACookie, VPNToken) | StaticService.CookieSet(context, "cas.guet.edu.cn", "/authserver/login", TGTToken, VPNToken); + 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() { -- Gitee From bf16ebdd4071ed3abc41282a3813b9f1cfa214b2 Mon Sep 17 00:00:00 2001 From: wing <843862803@qq.com> Date: Fri, 17 Mar 2023 20:43:11 +0800 Subject: [PATCH 17/24] =?UTF-8?q?perf:=E8=B0=83=E6=95=B4=E9=83=A8=E5=88=86?= =?UTF-8?q?=E5=86=85=E5=AE=B9=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../guettable/adapter/DayClassAdapter.java | 35 ++++++++++--- app/src/main/res/layout/activity_about.xml | 50 +++++++++++-------- app/src/main/res/layout/activity_launch.xml | 6 +-- app/src/main/res/layout/detail_cardview.xml | 7 ++- app/src/main/res/layout/fragement_person.xml | 5 +- app/src/main/res/values/colors.xml | 3 ++ app/src/main/res/values/strings.xml | 10 ++++ 7 files changed, 81 insertions(+), 35 deletions(-) diff --git a/app/src/main/java/top/yvyan/guettable/adapter/DayClassAdapter.java b/app/src/main/java/top/yvyan/guettable/adapter/DayClassAdapter.java index a90f880..2298163 100644 --- a/app/src/main/java/top/yvyan/guettable/adapter/DayClassAdapter.java +++ b/app/src/main/java/top/yvyan/guettable/adapter/DayClassAdapter.java @@ -2,6 +2,11 @@ package top.yvyan.guettable.adapter; import android.annotation.SuppressLint; import android.content.Context; +import android.graphics.Typeface; +import android.text.Spannable; +import android.text.SpannableString; +import android.text.style.ForegroundColorSpan; +import android.text.style.StyleSpan; import android.util.TypedValue; import android.view.LayoutInflater; import android.view.View; @@ -20,6 +25,7 @@ import top.yvyan.guettable.bean.CourseBean; import top.yvyan.guettable.bean.ExamBean; import top.yvyan.guettable.util.TimeUtil; +@SuppressWarnings("ALL") public class DayClassAdapter extends RecyclerView.Adapter { private final List todayList; private final List tomorrowList; @@ -82,6 +88,7 @@ public class DayClassAdapter extends RecyclerView.Adapter + 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 8aa3195..529bddb 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/detail_cardview.xml b/app/src/main/res/layout/detail_cardview.xml index 837bb93..51bbe9c 100644 --- a/app/src/main/res/layout/detail_cardview.xml +++ b/app/src/main/res/layout/detail_cardview.xml @@ -25,7 +25,7 @@ @@ -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" /> @@ -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/values/colors.xml b/app/src/main/res/values/colors.xml index c1bf31e..d8a4a3a 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -14,4 +14,7 @@ #FB7299 #FF6705 #06C160 + + #3396D8 + #7F4073 \ 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 6b03f79..226bac8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -200,5 +200,15 @@ 0 学分绩查询属于公测阶段,正在逐步优化,目前计算方法为只统计对应年度及格的必修和限选课程,若您有更好的计算方法,欢迎进群反馈,我们一起让它变好!(V4) wing | ssbird | tank | uuin | bbaa + 官方QQ交流群(点击加群) + 版本 + 加入我们 + 作者 + 特别鸣谢 + 开发者自语 + 项目开源 + 开源引用 + 隐私政策 + 声明 \ No newline at end of file -- Gitee From 87b535d186690ae1ceb7e424d910056419155ee6 Mon Sep 17 00:00:00 2001 From: wing <843862803@qq.com> Date: Fri, 17 Mar 2023 20:57:36 +0800 Subject: [PATCH 18/24] =?UTF-8?q?fix:=E8=AF=AD=E6=B3=95=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/top/yvyan/guettable/service/fetch/Net.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) 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 8e81693..7916678 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.Arrays; import java.util.List; import java.util.concurrent.TimeUnit; @@ -95,7 +94,7 @@ public class Net { null, resources.getString(R.string.user_agent), resources.getString(R.string.SSO_referer), - AuthCookie!="" ? AuthCookie : null, + !AuthCookie.equals("") ? AuthCookie : null, null, resources.getString(R.string.cookie_delimiter), null, -- Gitee From a90bef760a31e400a350d102d0afe1dfe7b21ecd Mon Sep 17 00:00:00 2001 From: wing <843862803@qq.com> Date: Fri, 17 Mar 2023 21:49:00 +0800 Subject: [PATCH 19/24] =?UTF-8?q?fix:=E5=90=88=E5=B9=B6=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/top/yvyan/guettable/activity/LoginActivity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/top/yvyan/guettable/activity/LoginActivity.java b/app/src/main/java/top/yvyan/guettable/activity/LoginActivity.java index 92d42e5..5996b73 100644 --- a/app/src/main/java/top/yvyan/guettable/activity/LoginActivity.java +++ b/app/src/main/java/top/yvyan/guettable/activity/LoginActivity.java @@ -287,7 +287,7 @@ public class LoginActivity extends Activity implements View.OnClickListener { List allTerm = StaticService.getTerms(this, tokenData.getCookie()); if (allTerm != null) { - MoreData.newInstance(this).setTermBeans(allTerm); + MoreData.setTermBeans(allTerm); } } catch (Exception e) { UMCrash.generateCustomLog(e, "getInfo"); -- Gitee From 54a9e8936421acb908890738af30a8282ea20364 Mon Sep 17 00:00:00 2001 From: wing <843862803@qq.com> Date: Fri, 17 Mar 2023 22:34:27 +0800 Subject: [PATCH 20/24] =?UTF-8?q?fix:=E8=BF=81=E7=A7=BB=E4=B9=8B=E5=90=8E?= =?UTF-8?q?=E6=97=A0=E6=95=B0=E6=8D=AE=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yvyan/guettable/baseFun/FirstLoad.java | 30 +++++++------------ 1 file changed, 10 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/top/yvyan/guettable/baseFun/FirstLoad.java b/app/src/main/java/top/yvyan/guettable/baseFun/FirstLoad.java index 55f2d02..f24a16c 100644 --- a/app/src/main/java/top/yvyan/guettable/baseFun/FirstLoad.java +++ b/app/src/main/java/top/yvyan/guettable/baseFun/FirstLoad.java @@ -9,7 +9,7 @@ import java.util.List; import top.yvyan.guettable.activity.SettingActivity; import top.yvyan.guettable.bean.ExamBean; -import top.yvyan.guettable.data.AccountData; +import top.yvyan.guettable.data.GeneralData; import top.yvyan.guettable.data.ScheduleData; import top.yvyan.guettable.util.AppUtil; @@ -51,18 +51,24 @@ public class FirstLoad { */ private void updateDate(int i) { switch (i) { - case 36: - update_36(); - break; case 40: //修复考试安排信息错误导致的闪退问题 update_40(); break; + case 52: + update_52(); default: break; } } + /** + * 52->53需要进行的操作 + */ + private void update_52() { + GeneralData.newInstance(context).setLastUpdateTime(-1); + } + /** * 40->41需要进行的操作 */ @@ -76,22 +82,6 @@ public class FirstLoad { 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(); - } - } - } - private void openUpdate() { //打开检查更新 SharedPreferences.Editor mEditor = PreferenceManager.getDefaultSharedPreferences(context).edit(); -- Gitee From a0b89b9357dde12189782e36e1ac06ecfc819d3b Mon Sep 17 00:00:00 2001 From: wing <843862803@qq.com> Date: Fri, 17 Mar 2023 22:51:15 +0800 Subject: [PATCH 21/24] =?UTF-8?q?perf:=E8=B0=83=E8=8A=82=E6=96=87=E5=AD=97?= =?UTF-8?q?=E9=97=B4=E8=B7=9D=EF=BC=8C=E5=A4=A7=E5=B0=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/planned_course_cardview.xml | 9 ++++++--- app/src/main/res/layout/score_cardview.xml | 7 +++++-- app/src/main/res/values/dimens.xml | 7 ------- 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/app/src/main/res/layout/planned_course_cardview.xml b/app/src/main/res/layout/planned_course_cardview.xml index 82d2e30..928e5ea 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 8b1bcd4..9f74fde 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/values/dimens.xml b/app/src/main/res/values/dimens.xml index 88fc619..cd2711c 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -7,17 +7,10 @@ http://developer.android.com/guide/topics/appwidgets/index.html#CreatingLayout --> 0dp - 4dp 5dp - 6dp 8dp 10dp - 12dp - 14dp 16dp - 18dp 20dp - 24dp - 30dp \ No newline at end of file -- Gitee From 4e75827c9de0e679cc72d25c13455ac5751d5dfb Mon Sep 17 00:00:00 2001 From: wing <843862803@qq.com> Date: Sat, 18 Mar 2023 16:45:21 +0800 Subject: [PATCH 22/24] =?UTF-8?q?perf:=E5=8E=BB=E6=8E=89=E6=97=A0=E7=94=A8?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../top/yvyan/guettable/Gson/AvgTeacher.java | 99 --------- .../guettable/Gson/AvgTeacherFormGet.java | 189 ------------------ .../guettable/Gson/AvgTeacherFormSend.java | 119 ----------- .../top/yvyan/guettable/Gson/AvgTextbook.java | 58 ------ .../yvyan/guettable/Gson/AvgTextbookData.java | 85 -------- .../guettable/Gson/AvgTextbookFormGet.java | 180 ----------------- .../yvyan/guettable/Gson/LoginResponse.java | 22 -- .../top/yvyan/guettable/Http/GetBitmap.java | 118 ----------- .../guettable/activity/LoginActivity.java | 40 ++-- .../guettable/adapter/AvgTeacherAdapter.java | 54 ----- .../guettable/adapter/AvgTextbookAdapter.java | 54 ----- .../yvyan/guettable/bean/AvgTeacherBean.java | 29 --- .../yvyan/guettable/bean/AvgTextbookBean.java | 29 --- .../top/yvyan/guettable/data/AccountData.java | 27 +-- .../top/yvyan/guettable/data/BaseData.java | 3 + .../yvyan/guettable/data/ScheduleData.java | 2 +- .../top/yvyan/guettable/data/TokenData.java | 4 +- .../fragment/CourseTableFragment.java | 11 +- .../yvyan/guettable/service/fetch/Net.java | 2 +- .../top/yvyan/guettable/util/RSAUtil.java | 60 ------ .../yvyan/guettable/util/SerializeUtil.java | 45 ----- app/src/main/res/layout/activity_login.xml | 4 +- app/src/main/res/layout/teacher_cardview.xml | 44 ---- app/src/main/res/layout/textbook_cardview.xml | 44 ---- 24 files changed, 42 insertions(+), 1280 deletions(-) delete mode 100644 app/src/main/java/top/yvyan/guettable/Gson/AvgTeacher.java delete mode 100644 app/src/main/java/top/yvyan/guettable/Gson/AvgTeacherFormGet.java delete mode 100644 app/src/main/java/top/yvyan/guettable/Gson/AvgTeacherFormSend.java delete mode 100644 app/src/main/java/top/yvyan/guettable/Gson/AvgTextbook.java delete mode 100644 app/src/main/java/top/yvyan/guettable/Gson/AvgTextbookData.java delete mode 100644 app/src/main/java/top/yvyan/guettable/Gson/AvgTextbookFormGet.java delete mode 100644 app/src/main/java/top/yvyan/guettable/Gson/LoginResponse.java delete mode 100644 app/src/main/java/top/yvyan/guettable/Http/GetBitmap.java delete mode 100644 app/src/main/java/top/yvyan/guettable/adapter/AvgTeacherAdapter.java delete mode 100644 app/src/main/java/top/yvyan/guettable/adapter/AvgTextbookAdapter.java delete mode 100644 app/src/main/java/top/yvyan/guettable/bean/AvgTeacherBean.java delete mode 100644 app/src/main/java/top/yvyan/guettable/bean/AvgTextbookBean.java delete mode 100644 app/src/main/java/top/yvyan/guettable/util/RSAUtil.java delete mode 100644 app/src/main/java/top/yvyan/guettable/util/SerializeUtil.java delete mode 100644 app/src/main/res/layout/teacher_cardview.xml delete mode 100644 app/src/main/res/layout/textbook_cardview.xml diff --git a/app/src/main/java/top/yvyan/guettable/Gson/AvgTeacher.java b/app/src/main/java/top/yvyan/guettable/Gson/AvgTeacher.java deleted file mode 100644 index 8ff700c..0000000 --- a/app/src/main/java/top/yvyan/guettable/Gson/AvgTeacher.java +++ /dev/null @@ -1,99 +0,0 @@ -package top.yvyan.guettable.Gson; - -public class AvgTeacher { - private String term; - private String stid; - private String courseid; - private String teacherno; - private String courseno; - private String cname; - private String name; - private int lb; - private int chk; - private boolean can; - public void setTerm(String term) { - this.term = term; - } - public String getTerm() { - return term; - } - - public void setStid(String stid) { - this.stid = stid; - } - public String getStid() { - return stid; - } - - public void setCourseid(String courseid) { - this.courseid = courseid; - } - public String getCourseid() { - return courseid; - } - - public void setTeacherno(String teacherno) { - this.teacherno = teacherno; - } - public String getTeacherno() { - return teacherno; - } - - public void setCourseno(String courseno) { - this.courseno = courseno; - } - public String getCourseno() { - return courseno; - } - - public void setCname(String cname) { - this.cname = cname; - } - public String getCname() { - return cname; - } - - public void setName(String name) { - this.name = name; - } - public String getName() { - return name; - } - - public void setLb(int lb) { - this.lb = lb; - } - public int getLb() { - return lb; - } - - public void setChk(int chk) { - this.chk = chk; - } - public int getChk() { - return chk; - } - - public void setCan(boolean can) { - this.can = can; - } - public boolean getCan() { - return can; - } - - @Override - public String toString() { - return "AvgTeacher{" + - "term='" + term + '\'' + - ", stid='" + stid + '\'' + - ", courseid='" + courseid + '\'' + - ", teacherno='" + teacherno + '\'' + - ", courseno='" + courseno + '\'' + - ", cname='" + cname + '\'' + - ", name='" + name + '\'' + - ", lb=" + lb + - ", chk='" + chk + '\'' + - ", can=" + can + - '}'; - } -} diff --git a/app/src/main/java/top/yvyan/guettable/Gson/AvgTeacherFormGet.java b/app/src/main/java/top/yvyan/guettable/Gson/AvgTeacherFormGet.java deleted file mode 100644 index f9a3e3c..0000000 --- a/app/src/main/java/top/yvyan/guettable/Gson/AvgTeacherFormGet.java +++ /dev/null @@ -1,189 +0,0 @@ -package top.yvyan.guettable.Gson; - -public class AvgTeacherFormGet { - private int lsh; - private String term; - private String mc; - private String nr; - private int xh; - private String lb; - private double qz; - private String zbnh; - private String dja; - private int afz; - private String djb; - private int bfz; - private String djc; - private int cfz; - private String djd; - private int dfz; - private String dje; - private int efz; - private int zt; - private String score; - public void setLsh(int lsh) { - this.lsh = lsh; - } - public int getLsh() { - return lsh; - } - - public void setTerm(String term) { - this.term = term; - } - public String getTerm() { - return term; - } - - public void setMc(String mc) { - this.mc = mc; - } - public String getMc() { - return mc; - } - - public void setNr(String nr) { - this.nr = nr; - } - public String getNr() { - return nr; - } - - public void setXh(int xh) { - this.xh = xh; - } - public int getXh() { - return xh; - } - - public void setLb(String lb) { - this.lb = lb; - } - public String getLb() { - return lb; - } - - public void setQz(double qz) { - this.qz = qz; - } - public double getQz() { - return qz; - } - - public void setZbnh(String zbnh) { - this.zbnh = zbnh; - } - public String getZbnh() { - return zbnh; - } - - public void setDja(String dja) { - this.dja = dja; - } - public String getDja() { - return dja; - } - - public void setAfz(int afz) { - this.afz = afz; - } - public int getAfz() { - return afz; - } - - public void setDjb(String djb) { - this.djb = djb; - } - public String getDjb() { - return djb; - } - - public void setBfz(int bfz) { - this.bfz = bfz; - } - public int getBfz() { - return bfz; - } - - public void setDjc(String djc) { - this.djc = djc; - } - public String getDjc() { - return djc; - } - - public void setCfz(int cfz) { - this.cfz = cfz; - } - public int getCfz() { - return cfz; - } - - public void setDjd(String djd) { - this.djd = djd; - } - public String getDjd() { - return djd; - } - - public void setDfz(int dfz) { - this.dfz = dfz; - } - public int getDfz() { - return dfz; - } - - public void setDje(String dje) { - this.dje = dje; - } - public String getDje() { - return dje; - } - - public void setEfz(int efz) { - this.efz = efz; - } - public int getEfz() { - return efz; - } - - public void setZt(int zt) { - this.zt = zt; - } - public int getZt() { - return zt; - } - - public void setScore(String score) { - this.score = score; - } - public String getScore() { - return score; - } - - @Override - public String toString() { - return "AvgTeacherFormGet{" + - "lsh=" + lsh + - ", term='" + term + '\'' + - ", mc='" + mc + '\'' + - ", nr='" + nr + '\'' + - ", xh=" + xh + - ", lb='" + lb + '\'' + - ", qz=" + qz + - ", zbnh='" + zbnh + '\'' + - ", dja='" + dja + '\'' + - ", afz=" + afz + - ", djb='" + djb + '\'' + - ", bfz=" + bfz + - ", djc='" + djc + '\'' + - ", cfz=" + cfz + - ", djd='" + djd + '\'' + - ", dfz=" + dfz + - ", dje='" + dje + '\'' + - ", efz=" + efz + - ", zt=" + zt + - ", score='" + score + '\'' + - '}'; - } -} diff --git a/app/src/main/java/top/yvyan/guettable/Gson/AvgTeacherFormSend.java b/app/src/main/java/top/yvyan/guettable/Gson/AvgTeacherFormSend.java deleted file mode 100644 index 16e35bf..0000000 --- a/app/src/main/java/top/yvyan/guettable/Gson/AvgTeacherFormSend.java +++ /dev/null @@ -1,119 +0,0 @@ -package top.yvyan.guettable.Gson; - -import android.util.Log; - -import top.yvyan.guettable.util.AppUtil; - -public class AvgTeacherFormSend { - private int afz; - private int bfz; - private int cfz; - private int dfz; - private int efz; - private String courseid; - private String courseno; - private String dja; - private String djb; - private String djc; - private String djd; - private String dje; - private int lb = 1; - private int lsh; - private String nr; - private double qz; - private int score = 100; - private String teacherno; - private String term; - private String zbnh; - private int zp = 0; - - public AvgTeacherFormSend(AvgTeacherFormGet avgTeacherFormGet, String courseId, String courseNo, String teacherNo, String term) { - this.afz = avgTeacherFormGet.getAfz(); - this.bfz = avgTeacherFormGet.getBfz(); - this.cfz = avgTeacherFormGet.getCfz(); - this.dfz = avgTeacherFormGet.getDfz(); - this.efz = avgTeacherFormGet.getEfz(); - this.courseid = courseId; - this.courseno = courseNo; - this.dja = AppUtil.encode(avgTeacherFormGet.getDja()); - this.djb = AppUtil.encode(avgTeacherFormGet.getDjb()); - this.djc = AppUtil.encode(avgTeacherFormGet.getDjc()); - this.djd = AppUtil.encode(avgTeacherFormGet.getDjd()); - this.dje = AppUtil.encode(avgTeacherFormGet.getDje()); - this.lsh = avgTeacherFormGet.getLsh(); - String str = avgTeacherFormGet.getNr(); - if (str.contains("(")) { - str = str.substring(1, str.length() - 1); - } - this.nr = str; - this.qz = avgTeacherFormGet.getQz(); - this.teacherno = teacherNo; - this.term = term; - this.zbnh = AppUtil.encode(avgTeacherFormGet.getZbnh()); - Log.d("testNr", nr); - } - - public AvgTeacherFormSend(int afz, int bfz, int cfz, int dfz, int efz, String courseid, String courseno, String dja, String djb, String djc, String djd, String dje, int lsh, String nr, double qz, String teacherno, String term, String zbnh) { - this.afz = afz; - this.bfz = bfz; - this.cfz = cfz; - this.dfz = dfz; - this.efz = efz; - this.courseid = courseid; - this.courseno = courseno; - this.dja = dja; - this.djb = djb; - this.djc = djc; - this.djd = djd; - this.dje = dje; - this.lsh = lsh; - this.nr = nr; - this.qz = qz; - this.teacherno = teacherno; - this.term = term; - this.zbnh = zbnh; - } - - public String getTerm() { - return term; - } - - public String getCourseno() { - return courseno; - } - - public String getTeacherno() { - return teacherno; - } - - public String getCourseid() { - return courseid; - } - - @Override - public String toString() { - return "AvgTeacherFormSend{" + - "afz=" + afz + - ", bfz=" + bfz + - ", cfz=" + cfz + - ", dfz=" + dfz + - ", efz=" + efz + - ", courseid='" + courseid + '\'' + - ", courseno='" + courseno + '\'' + - ", dja='" + dja + '\'' + - ", djb='" + djb + '\'' + - ", djc='" + djc + '\'' + - ", djd='" + djd + '\'' + - ", dje='" + dje + '\'' + - ", lb=" + lb + - ", lsh=" + lsh + - ", nr='" + nr + '\'' + - ", qz=" + qz + - ", score=" + score + - ", teacherno='" + teacherno + '\'' + - ", term='" + term + '\'' + - ", zbnh='" + zbnh + '\'' + - ", zp=" + zp + - '}'; - } -} diff --git a/app/src/main/java/top/yvyan/guettable/Gson/AvgTextbook.java b/app/src/main/java/top/yvyan/guettable/Gson/AvgTextbook.java deleted file mode 100644 index 3b1786c..0000000 --- a/app/src/main/java/top/yvyan/guettable/Gson/AvgTextbook.java +++ /dev/null @@ -1,58 +0,0 @@ -package top.yvyan.guettable.Gson; - -public class AvgTextbook { - private String term; - private String courseid; - private String cname; - private int lsh; - private String name; - private String dptno; - - public String getTerm() { - return term; - } - - public void setTerm(String term) { - this.term = term; - } - - public String getCourseid() { - return courseid; - } - - public void setCourseid(String courseid) { - this.courseid = courseid; - } - - public String getCname() { - return cname; - } - - public void setCname(String cname) { - this.cname = cname; - } - - public int getLsh() { - return lsh; - } - - public void setLsh(int lsh) { - this.lsh = lsh; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getDptno() { - return dptno; - } - - public void setDptno(String dptno) { - this.dptno = dptno; - } -} diff --git a/app/src/main/java/top/yvyan/guettable/Gson/AvgTextbookData.java b/app/src/main/java/top/yvyan/guettable/Gson/AvgTextbookData.java deleted file mode 100644 index 4ce5000..0000000 --- a/app/src/main/java/top/yvyan/guettable/Gson/AvgTextbookData.java +++ /dev/null @@ -1,85 +0,0 @@ -package top.yvyan.guettable.Gson; - -public class AvgTextbookData { - private String term; - private String userid; - private String type; - private int checked; - private int lsh; - private String courseid; - private String dptno; - private double score; - private String comm; - - public String getTerm() { - return term; - } - - public void setTerm(String term) { - this.term = term; - } - - public String getUserid() { - return userid; - } - - public void setUserid(String userid) { - this.userid = userid; - } - - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - - public int getChecked() { - return checked; - } - - public void setChecked(int checked) { - this.checked = checked; - } - - public int getLsh() { - return lsh; - } - - public void setLsh(int lsh) { - this.lsh = lsh; - } - - public String getCourseid() { - return courseid; - } - - public void setCourseid(String courseid) { - this.courseid = courseid; - } - - public String getDptno() { - return dptno; - } - - public void setDptno(String dptno) { - this.dptno = dptno; - } - - public double getScore() { - return score; - } - - public void setScore(double score) { - this.score = score; - } - - public String getComm() { - return comm; - } - - public void setComm(String comm) { - this.comm = comm; - } -} diff --git a/app/src/main/java/top/yvyan/guettable/Gson/AvgTextbookFormGet.java b/app/src/main/java/top/yvyan/guettable/Gson/AvgTextbookFormGet.java deleted file mode 100644 index 00d6c2a..0000000 --- a/app/src/main/java/top/yvyan/guettable/Gson/AvgTextbookFormGet.java +++ /dev/null @@ -1,180 +0,0 @@ -package top.yvyan.guettable.Gson; - -public class AvgTextbookFormGet { - private String term; - private String courseid; - private int lsh; - private int pjno; - private String type; - private String pzjb; - private String zbnr; - private double qz; - private double score; - private String dja; - private String djb; - private String djc; - private String djd; - private String a; - private String b; - private String c; - private String d; - - public String getTerm() { - return term; - } - - public void setTerm(String term) { - this.term = term; - } - - public String getCourseid() { - return courseid; - } - - public void setCourseid(String courseid) { - this.courseid = courseid; - } - - public int getLsh() { - return lsh; - } - - public void setLsh(int lsh) { - this.lsh = lsh; - } - - public int getPjno() { - return pjno; - } - - public void setPjno(int pjno) { - this.pjno = pjno; - } - - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - - public String getPzjb() { - return pzjb; - } - - public void setPzjb(String pzjb) { - this.pzjb = pzjb; - } - - public String getZbnr() { - return zbnr; - } - - public void setZbnr(String zbnr) { - this.zbnr = zbnr; - } - - public double getQz() { - return qz; - } - - public void setQz(double qz) { - this.qz = qz; - } - - public double getScore() { - return score; - } - - public void setScore(double score) { - this.score = score; - } - - public String getDja() { - return dja; - } - - public void setDja(String dja) { - this.dja = dja; - } - - public String getDjb() { - return djb; - } - - public void setDjb(String djb) { - this.djb = djb; - } - - public String getDjc() { - return djc; - } - - public void setDjc(String djc) { - this.djc = djc; - } - - public String getDjd() { - return djd; - } - - public void setDjd(String djd) { - this.djd = djd; - } - - public String getA() { - return a; - } - - public void setA(String a) { - this.a = a; - } - - public String getB() { - return b; - } - - public void setB(String b) { - this.b = b; - } - - public String getC() { - return c; - } - - public void setC(String c) { - this.c = c; - } - - public String getD() { - return d; - } - - public void setD(String d) { - this.d = d; - } - - @Override - public String toString() { - return "AvgTextbookFormGet{" + - "term='" + term + '\'' + - ", courseid='" + courseid + '\'' + - ", lsh=" + lsh + - ", pjno=" + pjno + - ", type='" + type + '\'' + - ", pzjb='" + pzjb + '\'' + - ", zbnr='" + zbnr + '\'' + - ", qz=" + qz + - ", score=" + score + - ", dja='" + dja + '\'' + - ", djb='" + djb + '\'' + - ", djc='" + djc + '\'' + - ", djd='" + djd + '\'' + - ", a='" + a + '\'' + - ", b='" + b + '\'' + - ", c='" + c + '\'' + - ", d='" + d + '\'' + - '}'; - } -} diff --git a/app/src/main/java/top/yvyan/guettable/Gson/LoginResponse.java b/app/src/main/java/top/yvyan/guettable/Gson/LoginResponse.java deleted file mode 100644 index a20f58a..0000000 --- a/app/src/main/java/top/yvyan/guettable/Gson/LoginResponse.java +++ /dev/null @@ -1,22 +0,0 @@ -package top.yvyan.guettable.Gson; - -/** - * @clear - */ -public class LoginResponse { - private boolean success; - private String msg; - private String data; - - public boolean isSuccess() { - return success; - } - - public String getMsg() { - return msg; - } - - public String getData() { - return data; - } -} diff --git a/app/src/main/java/top/yvyan/guettable/Http/GetBitmap.java b/app/src/main/java/top/yvyan/guettable/Http/GetBitmap.java deleted file mode 100644 index dd50eb4..0000000 --- a/app/src/main/java/top/yvyan/guettable/Http/GetBitmap.java +++ /dev/null @@ -1,118 +0,0 @@ -package top.yvyan.guettable.Http; - -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.text.TextUtils; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -import java.net.CookieManager; -import java.net.HttpCookie; -import java.net.HttpURLConnection; -import java.net.URL; -import java.util.LinkedList; -import java.util.List; - -import javax.net.ssl.HttpsURLConnection; -import javax.net.ssl.SSLContext; -import javax.net.ssl.SSLSocketFactory; - -import top.yvyan.guettable.util.SSLUtils; - - -public class GetBitmap { - /** - * @return - * - 0 GET success - * - -1 cannot open url - * - -5 cannot get response - * - -6 response check fail - * - -7 302 - */ - public static HttpConnectionAndCode get(@NonNull final String u, - @Nullable final String[] parms, - @NonNull final String user_agent, - @NonNull final String referer, - @Nullable final String cookie, - @Nullable final String cookie_delimiter){ - URL url; - HttpURLConnection cnt; - String response; - Bitmap bmp; - int resp_code; - try { - StringBuilder u_bulider = new StringBuilder(); - u_bulider.append(u); - if (parms != null && parms.length > 0) { - u_bulider.append("?").append(TextUtils.join("&", parms)); - } - url = new URL(u_bulider.toString()); - cnt = (HttpURLConnection) url.openConnection(); - cnt.setDoOutput(true); - cnt.setDoInput(true); - cnt.setRequestProperty("User-Agent", user_agent); - cnt.setRequestProperty("Referer", referer); - if (cookie != null){ - cnt.setRequestProperty("Cookie", cookie); - } - cnt.setRequestMethod("GET"); - cnt.setInstanceFollowRedirects(false); - cnt.setReadTimeout(4000); - cnt.setConnectTimeout(2000); - if (cnt instanceof HttpsURLConnection) { // 判断是否为https请求 - SSLContext sslContext = SSLUtils.getSSLContextWithoutCer(); - SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory(); - ((HttpsURLConnection) cnt).setSSLSocketFactory(sslSocketFactory); - ((HttpsURLConnection) cnt).setHostnameVerifier(SSLUtils.hostnameVerifier); - } - cnt.connect(); - } catch (Exception e) { - e.printStackTrace(); - return new HttpConnectionAndCode(-1); - } - try { - resp_code = cnt.getResponseCode(); - if (resp_code == 302){ - return new HttpConnectionAndCode(cnt, -7, ""); - } - response = ""; - bmp = BitmapFactory.decodeStream(cnt.getInputStream()); - } catch (Exception e) { - e.printStackTrace(); - return new HttpConnectionAndCode(-5); - } - - //get cookie from server - String set_cookie = null; - if (cookie_delimiter != null) { - CookieManager cookieman = new CookieManager(); - StringBuilder cookie_builder = new StringBuilder(); - //getHeaderFields() returns the header fields of response - List cookies = cnt.getHeaderFields().get("Set-Cookie"); - if (cookies != null) { - for (String cookie_resp : cookies) { - cookieman.getCookieStore().add(null, HttpCookie.parse(cookie_resp).get(0)); - } - } - if (cookieman.getCookieStore().getCookies().size() > 0) { - List cookieList = cookieman.getCookieStore().getCookies(); - List cookieStringList = new LinkedList<>(); - for (HttpCookie httpCookie : cookieList){ - String str = httpCookie.getName() + "=" + httpCookie.getValue(); - cookieStringList.add(str); - } - String cookie_join = TextUtils.join(cookie_delimiter, cookieStringList); - cookie_builder.append(cookie_join); - } - set_cookie = cookie_builder.toString(); - } - - //do not disconnect, keep alive - //if cookie_delimiter != null but no server cookie, set_cookie = "" - //if no response, response = "" - HttpConnectionAndCode res = new HttpConnectionAndCode(cnt, 0, response, set_cookie, resp_code); - res.obj = bmp; - return res; - } -} diff --git a/app/src/main/java/top/yvyan/guettable/activity/LoginActivity.java b/app/src/main/java/top/yvyan/guettable/activity/LoginActivity.java index 5996b73..d4c51ee 100644 --- a/app/src/main/java/top/yvyan/guettable/activity/LoginActivity.java +++ b/app/src/main/java/top/yvyan/guettable/activity/LoginActivity.java @@ -51,8 +51,8 @@ public class LoginActivity extends Activity implements View.OnClickListener { private EditText etAccount; private CheckBox cbRememberPwd; private SuperButton button; - private EditText etPwd2; - private ImageView ivPwdSwitch2; + private EditText etPwd; + private ImageView ivPwdSwitch; private View progressBar; private AccountData accountData; @@ -64,21 +64,21 @@ public class LoginActivity extends Activity implements View.OnClickListener { accountData = AccountData.newInstance(getContext()); - ivPwdSwitch2 = findViewById(R.id.iv_pwd_switch_2); + ivPwdSwitch = findViewById(R.id.iv_pwd_switch); button = findViewById(R.id.login); button.setOnClickListener(this); - etPwd2 = findViewById(R.id.et_pwd2); + etPwd = findViewById(R.id.et_pwd); etAccount = findViewById(R.id.et_account); cbRememberPwd = findViewById(R.id.cb_remember_pwd); cbRememberPwd.setChecked(true); - ivPwdSwitch2.setOnClickListener(showPwdClickListener()); + ivPwdSwitch.setOnClickListener(showPwdClickListener()); progressBar = findViewById(R.id.progressBar2); TextView profileVersion = findViewById(R.id.tv_profile_version); profileVersion.setText(AppUtil.getAppVersionName(Objects.requireNonNull(getContext()))); //获取账号密码 if (accountData.getIsSave()) { etAccount.setText(accountData.getUsername()); - etPwd2.setText(accountData.getVPNPwd()); + etPwd.setText(accountData.getPwd()); } } @@ -93,12 +93,12 @@ public class LoginActivity extends Activity implements View.OnClickListener { bPwdSwitch = !bPwdSwitch; bPwdSwitch2 = !bPwdSwitch2; if (bPwdSwitch) { - ivPwdSwitch2.setImageResource(R.drawable.ic_baseline_visibility_24); - etPwd2.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD); + ivPwdSwitch.setImageResource(R.drawable.ic_baseline_visibility_24); + etPwd.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD); } else { - ivPwdSwitch2.setImageResource(R.drawable.ic_baseline_visibility_off_24); - etPwd2.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD | InputType.TYPE_CLASS_TEXT); - etPwd2.setTypeface(Typeface.DEFAULT); + ivPwdSwitch.setImageResource(R.drawable.ic_baseline_visibility_off_24); + etPwd.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD | InputType.TYPE_CLASS_TEXT); + etPwd.setTypeface(Typeface.DEFAULT); } }; } @@ -112,8 +112,8 @@ public class LoginActivity extends Activity implements View.OnClickListener { public void onClick(View view) { setUnClick(); String account = etAccount.getText().toString(); - String pwd2 = etPwd2.getText().toString(); - new Thread(() -> testCAS(account, pwd2)).start(); + String pwd = etPwd.getText().toString(); + new Thread(() -> testCAS(account, pwd)).start(); } @Override @@ -131,7 +131,7 @@ public class LoginActivity extends Activity implements View.OnClickListener { */ private void testCASWithOTP(String OTP, String CASCookie, TokenData tokenData) { String account = etAccount.getText().toString(); - String pwd2 = etPwd2.getText().toString(); + String pwd = etPwd.getText().toString(); new Thread(() -> { runOnUiThread(() -> button.setText("正在认证-手机验证码")); String MultiFactorAuth = StaticService.VerifyPhoneOTP(this, OTP, CASCookie); @@ -146,7 +146,7 @@ public class LoginActivity extends Activity implements View.OnClickListener { } else { tokenData.setMFACookie(MultiFactorAuth); tokenData.setBkjwCookie(null); - accountData.setUser(account, null, pwd2, cbRememberPwd.isChecked()); + accountData.setUser(account, pwd, cbRememberPwd.isChecked()); getInfo(); } }).start(); @@ -162,7 +162,7 @@ public class LoginActivity extends Activity implements View.OnClickListener { new Thread(() -> { TokenData tokenData = TokenData.newInstance(this); runOnUiThread(() -> button.setText("正在认证")); - String CasCookie = StaticService.SSOLogin(this, account, password, accountData.getVPNPwd() == password ? tokenData.getTGTToken() : null, tokenData.getMFACookie()); + String CasCookie = StaticService.SSOLogin(this, account, password, accountData.getPwd().equals(password) ? tokenData.getTGTToken() : null, tokenData.getMFACookie()); if (CasCookie.contains("TGT-")) { if (CasCookie.contains("ERROR5")) { tokenData.setTGTToken(CasCookie.substring(CasCookie.indexOf(";") + 1)); @@ -171,7 +171,7 @@ public class LoginActivity extends Activity implements View.OnClickListener { } else { tokenData.setTGTToken(CasCookie); tokenData.setBkjwCookie(null); - accountData.setUser(account, null, password, cbRememberPwd.isChecked()); + accountData.setUser(account, password, cbRememberPwd.isChecked()); getInfo(); } } else { @@ -209,7 +209,7 @@ public class LoginActivity extends Activity implements View.OnClickListener { } else { tokenData.setMFACookie(MultiFactorAuth); tokenData.setBkjwCookie(null); - accountData.setUser(account, null, password, cbRememberPwd.isChecked()); + accountData.setUser(account, password, cbRememberPwd.isChecked()); getInfo(); } @@ -318,7 +318,7 @@ public class LoginActivity extends Activity implements View.OnClickListener { button.setText("登录"); button.setEnabled(true); etAccount.setEnabled(true); - etPwd2.setEnabled(true); + etPwd.setEnabled(true); progressBar.setVisibility(View.GONE); } @@ -329,7 +329,7 @@ public class LoginActivity extends Activity implements View.OnClickListener { button.setText("网络初始化"); button.setEnabled(false); etAccount.setEnabled(false); - etPwd2.setEnabled(false); + etPwd.setEnabled(false); progressBar.setVisibility(View.VISIBLE); } diff --git a/app/src/main/java/top/yvyan/guettable/adapter/AvgTeacherAdapter.java b/app/src/main/java/top/yvyan/guettable/adapter/AvgTeacherAdapter.java deleted file mode 100644 index f0d6383..0000000 --- a/app/src/main/java/top/yvyan/guettable/adapter/AvgTeacherAdapter.java +++ /dev/null @@ -1,54 +0,0 @@ -package top.yvyan.guettable.adapter; - -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.recyclerview.widget.RecyclerView; - -import java.util.List; - -import top.yvyan.guettable.R; -import top.yvyan.guettable.bean.AvgTeacherBean; - -public class AvgTeacherAdapter extends RecyclerView.Adapter { - private final List avgTeacherBeans; - - public AvgTeacherAdapter(List avgTeacherBeans) { - this.avgTeacherBeans = avgTeacherBeans; - } - - @NonNull - @Override - public AvgTeacherViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext()); - View itemView = layoutInflater.inflate(R.layout.teacher_cardview,parent,false); - return new AvgTeacherViewHolder(itemView); - } - - @Override - public void onBindViewHolder(@NonNull AvgTeacherViewHolder holder, int position) { - holder.courseName.setText(avgTeacherBeans.get(position).getCourseName()); - holder.teacherName.setText(avgTeacherBeans.get(position).getTeacherName()); - holder.teacherHint.setText(avgTeacherBeans.get(position).getHint()); - } - - @Override - public int getItemCount() { - return avgTeacherBeans.size(); - } - - public static class AvgTeacherViewHolder extends RecyclerView.ViewHolder { - TextView courseName, teacherName, teacherHint; - - public AvgTeacherViewHolder(@NonNull View itemView) { - super(itemView); - courseName = itemView.findViewById(R.id.course_Name); - teacherName = itemView.findViewById(R.id.teacher_name); - teacherHint = itemView.findViewById(R.id.teacher_hint); - } - } - -} diff --git a/app/src/main/java/top/yvyan/guettable/adapter/AvgTextbookAdapter.java b/app/src/main/java/top/yvyan/guettable/adapter/AvgTextbookAdapter.java deleted file mode 100644 index d98fcdd..0000000 --- a/app/src/main/java/top/yvyan/guettable/adapter/AvgTextbookAdapter.java +++ /dev/null @@ -1,54 +0,0 @@ -package top.yvyan.guettable.adapter; - -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.recyclerview.widget.RecyclerView; - -import java.util.List; - -import top.yvyan.guettable.R; -import top.yvyan.guettable.bean.AvgTextbookBean; - -public class AvgTextbookAdapter extends RecyclerView.Adapter { - - private final List avgTextbookBeans; - - public AvgTextbookAdapter(List avgTextbookBeans) { - this.avgTextbookBeans = avgTextbookBeans; - } - - @NonNull - @Override - public AvgTextbookAdapter.AvgTextbookViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext()); - View itemView = layoutInflater.inflate(R.layout.textbook_cardview, parent, false); - return new AvgTextbookViewHolder(itemView); - } - - @Override - public void onBindViewHolder(@NonNull AvgTextbookAdapter.AvgTextbookViewHolder holder, int position) { - holder.courseName.setText(avgTextbookBeans.get(position).getCourseName()); - holder.textbookName.setText(avgTextbookBeans.get(position).getTextbookName()); - holder.textbookHint.setText(avgTextbookBeans.get(position).getHint()); - } - - @Override - public int getItemCount() { - return avgTextbookBeans.size(); - } - - static class AvgTextbookViewHolder extends RecyclerView.ViewHolder { - TextView courseName, textbookName, textbookHint; - - public AvgTextbookViewHolder(@NonNull View itemView) { - super(itemView); - courseName = itemView.findViewById(R.id.textbook_course_Name); - textbookName = itemView.findViewById(R.id.textbook_name); - textbookHint = itemView.findViewById(R.id.textbook_hint); - } - } -} diff --git a/app/src/main/java/top/yvyan/guettable/bean/AvgTeacherBean.java b/app/src/main/java/top/yvyan/guettable/bean/AvgTeacherBean.java deleted file mode 100644 index 153ecdf..0000000 --- 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 9e51ced..0000000 --- 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/data/AccountData.java b/app/src/main/java/top/yvyan/guettable/data/AccountData.java index 60733a2..f7afa7d 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 index e8f323e..d8a27c1 100644 --- a/app/src/main/java/top/yvyan/guettable/data/BaseData.java +++ b/app/src/main/java/top/yvyan/guettable/data/BaseData.java @@ -7,6 +7,9 @@ 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); 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 505b1dd..e328c0c 100644 --- a/app/src/main/java/top/yvyan/guettable/data/ScheduleData.java +++ b/app/src/main/java/top/yvyan/guettable/data/ScheduleData.java @@ -10,7 +10,7 @@ import top.yvyan.guettable.bean.CourseBean; import top.yvyan.guettable.bean.ExamBean; public class ScheduleData extends BaseData { - private static final String MAIN_KEY = "ScheduleData"; + 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"; 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 3eb0d0e..272896a 100644 --- a/app/src/main/java/top/yvyan/guettable/data/TokenData.java +++ b/app/src/main/java/top/yvyan/guettable/data/TokenData.java @@ -176,14 +176,14 @@ public class TokenData { * @return 操作结果 */ public int refreshTGT() { - String TGTTokenStr = StaticService.SSOLogin(context, accountData.getUsername(), accountData.getVPNPwd(),TGTToken, MFACookie); + String TGTTokenStr = StaticService.SSOLogin(context, accountData.getUsername(), accountData.getPwd(),TGTToken, MFACookie); if (TGTTokenStr.equals("ERROR2") || TGTTokenStr.equals("ERROR0")) { return -2; } if (TGTTokenStr.contains("TGT-")) { if (TGTTokenStr.contains("ERROR5")) { setTGTToken(TGTTokenStr.substring(TGTTokenStr.indexOf(";") + 1)); - return bypass2FA(accountData.getVPNPwd(), TGTTokenStr.substring(TGTTokenStr.indexOf(";") + 1)); + return bypass2FA(accountData.getPwd(), TGTTokenStr.substring(TGTTokenStr.indexOf(";") + 1)); } else { setTGTToken(TGTTokenStr); } 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 e02d9b0..07d69ae 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; @@ -71,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(); @@ -82,7 +81,7 @@ 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; } @@ -135,7 +134,7 @@ public class CourseTableFragment extends Fragment implements View.OnClickListene generalData.setWeek(target); mWeekView.curWeek(target).updateView(); ScheduleData.setUpdate(true); - WidgetUtil.notifyWidgetUpdate(Objects.requireNonNull(this.getActivity())); + WidgetUtil.notifyWidgetUpdate(this.requireActivity()); ToastUtil.showToast(getActivity(), "设置第" + target + "周为当前周"); mTimetableView.changeWeekForce(target); } @@ -147,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) { @@ -276,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/service/fetch/Net.java b/app/src/main/java/top/yvyan/guettable/service/fetch/Net.java index 7916678..88066b6 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 @@ -599,7 +599,7 @@ public class Net { } /** - * 同步有效课程 + * 同步有效学分 * * @param context context * @param cookie 登录后的cookie 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 171abf2..0000000 --- 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 61abbee..0000000 --- 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/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index 1488252..74fab16 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -91,7 +91,7 @@ tools:ignore="ContentDescription" /> - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/textbook_cardview.xml b/app/src/main/res/layout/textbook_cardview.xml deleted file mode 100644 index 3d9b8ba..0000000 --- a/app/src/main/res/layout/textbook_cardview.xml +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - - - - - - - - - -- Gitee From 32f176cec11f9f199911b942bcf397228b7bba31 Mon Sep 17 00:00:00 2001 From: wing <843862803@qq.com> Date: Sat, 18 Mar 2023 17:20:40 +0800 Subject: [PATCH 23/24] =?UTF-8?q?fix:=E7=89=B9=E6=AE=8A=E6=83=85=E5=86=B5?= =?UTF-8?q?=E4=B8=8B=E6=97=A0=E6=B3=95=E7=99=BB=E5=BD=95=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/fetch/StaticService.java | 45 ++++++++++--------- 1 file changed, 25 insertions(+), 20 deletions(-) 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 367f136..4f31e18 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 @@ -116,7 +116,7 @@ public class StaticService { * @param account 学号 * @param password 密码 * @param MFACookie MFA Cookie - * @param TGTToken TGTToken + * @param TGTToken TGTToken * @return CAS Cookie * ERROR0 : 网络错误 * ERROR1 : 密码错误 @@ -124,12 +124,16 @@ public class StaticService { * ERROR5 : 2FA Needed */ public static String SSOLogin(Context context, String account, String password, String TGTToken, String MFACookie) { - HttpConnectionAndCode response = Net.getCASToken(context, account, password,TGTToken, MFACookie); + HttpConnectionAndCode response = Net.getCASToken(context, account, password, TGTToken, MFACookie); if (response.code != 0) { - if(response.code == 1 ) { - return (MFACookie != null ? (MFACookie + "; "+TGTToken) : "ERROR1"); + if (response.code == 1) { + if (MFACookie != null) { + return MFACookie + "; " + TGTToken; + } else { + return TGTToken; + } } - if(response.code == -8) { + if (response.code == -8) { return "ERROR1"; } return "ERROR0"; @@ -177,6 +181,7 @@ public class StaticService { /** * 通过ST令牌登录VPN + * * @param context context * @param ST ST令牌 * @param VPNToken 用于接收登录后的cookie @@ -185,10 +190,10 @@ public class StaticService { * -1 -- 登录失败 * -2 -- 发生异常 */ - public static int loginVPNST(Context context,String ST, String VPNToken) { - HttpConnectionAndCode response = Net.loginVPNST(context,ST,VPNToken); - if(response.code == 0 ) { - if(response.c.getURL().toString().contains("wengine-vpn-token-login")) { + public static int loginVPNST(Context context, String ST, String VPNToken) { + HttpConnectionAndCode response = Net.loginVPNST(context, ST, VPNToken); + if (response.code == 0) { + if (response.c.getURL().toString().contains("wengine-vpn-token-login")) { return 0; } } @@ -198,16 +203,16 @@ public class StaticService { /** * 向VPN添加Cookie * - * @param host 域 - * @param path 路径 - * @param cookie cookie - * @param VPNToken VPN Token + * @param host 域 + * @param path 路径 + * @param cookie cookie + * @param VPNToken VPN Token * @return 0 成功 */ - public static int CookieSet(Context context,String host, String path, String cookie, String VPNToken) { - HttpConnectionAndCode response = Net.CookieSet(context,host,path,cookie,VPNToken); - if(response.code == 0 ) { - if(response.comment.contains("success")) { + public static int CookieSet(Context context, String host, String path, String cookie, String VPNToken) { + HttpConnectionAndCode response = Net.CookieSet(context, host, path, cookie, VPNToken); + if (response.code == 0) { + if (response.comment.contains("success")) { return 0; } } @@ -225,9 +230,9 @@ public class StaticService { * -2 -- 教务登录失败 * -3 -- 发生异常 */ - public static int loginBkjwVPNST(Context context,String ST, String VPNToken) { - HttpConnectionAndCode response = Net.loginBkjwVPNST(context,ST,VPNToken); - if(response.code == 0 ) { + public static int loginBkjwVPNST(Context context, String ST, String VPNToken) { + HttpConnectionAndCode response = Net.loginBkjwVPNST(context, ST, VPNToken); + if (response.code == 0) { return 0; } return -1; -- Gitee From b39504e63de860a244252ddc0ffae34e48207aa8 Mon Sep 17 00:00:00 2001 From: wing <843862803@qq.com> Date: Sat, 18 Mar 2023 17:37:08 +0800 Subject: [PATCH 24/24] =?UTF-8?q?fix:=E7=89=B9=E6=AE=8A=E6=83=85=E5=86=B5?= =?UTF-8?q?=E4=B8=8B=E6=97=A0=E6=B3=95=E7=99=BB=E5=BD=95=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/top/yvyan/guettable/service/fetch/StaticService.java | 4 ++++ 1 file changed, 4 insertions(+) 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 4f31e18..5d9b6e8 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 @@ -127,6 +127,10 @@ public class StaticService { HttpConnectionAndCode response = Net.getCASToken(context, account, password, TGTToken, MFACookie); if (response.code != 0) { 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 { -- Gitee