diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml deleted file mode 100644 index 7f68460d8b38ac04e3a3224d7c79ef719b1991a9..0000000000000000000000000000000000000000 --- a/.idea/runConfigurations.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 5e6c6b07d91046138dd2922db355a06aeb9161fd..7648e70ad3f57bb88f8a658d176e874d70b8dd38 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 52 //记得补丁版本号归零(patch_version) + versionName "5.0.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" android.buildFeatures.dataBinding = true @@ -71,4 +71,13 @@ dependencies { implementation 'com.github.xuexiangjys:XUpdate:2.1.3' implementation 'com.zhy:okhttputils:2.6.2' implementation 'com.github.xuexiangjys.XUtil:xutil-core:2.0.0' + //键值对存储 + implementation 'com.tencent:mmkv:1.2.13' + //富文本 + implementation 'com.zzhoujay.richtext:richtext:3.0.8' + //工具类 + implementation 'com.github.xuexiangjys.XUtil:xutil-core:2.0.0' + implementation 'com.github.xuexiangjys.XUtil:xutil-sub:2.0.0' + + implementation 'com.zhy:okhttputils:2.6.2' } \ No newline at end of file diff --git a/app/src/main/java/top/yvyan/guettable/Gson/AvgTeacher.java b/app/src/main/java/top/yvyan/guettable/Gson/AvgTeacher.java deleted file mode 100644 index 8ff700cb9b7e6a402785058340b2889eaaa5ab08..0000000000000000000000000000000000000000 --- 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 f9a3e3c1e6111ab8e03bf2a61e55a5c3fd27d94c..0000000000000000000000000000000000000000 --- 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 16e35bf3ed12968f3a7129cdd0918cd241841f1e..0000000000000000000000000000000000000000 --- 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 3b1786c1a9245be7ce6bf28adb15f65f5b84cd80..0000000000000000000000000000000000000000 --- 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 4ce500080c9d0fba228f23e4bb8abcacfb3a1d5d..0000000000000000000000000000000000000000 --- 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 00d6c2af02c783db5af5aba58c11bc502808bade..0000000000000000000000000000000000000000 --- 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 a20f58ab37637783c483eedfed8eefc81078d31a..0000000000000000000000000000000000000000 --- 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/Get.java b/app/src/main/java/top/yvyan/guettable/Http/Get.java index 8af0733deea2d28918274de3ade790cc394645b4..703f555054324365a0c9153352b0e7de3c8c637b 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) { @@ -105,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/GetBitmap.java b/app/src/main/java/top/yvyan/guettable/Http/GetBitmap.java deleted file mode 100644 index dd50eb40137ff74f6337c025a238440fec704cfa..0000000000000000000000000000000000000000 --- a/app/src/main/java/top/yvyan/guettable/Http/GetBitmap.java +++ /dev/null @@ -1,118 +0,0 @@ -package top.yvyan.guettable.Http; - -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.text.TextUtils; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -import java.net.CookieManager; -import java.net.HttpCookie; -import java.net.HttpURLConnection; -import java.net.URL; -import java.util.LinkedList; -import java.util.List; - -import javax.net.ssl.HttpsURLConnection; -import javax.net.ssl.SSLContext; -import javax.net.ssl.SSLSocketFactory; - -import top.yvyan.guettable.util.SSLUtils; - - -public class GetBitmap { - /** - * @return - * - 0 GET success - * - -1 cannot open url - * - -5 cannot get response - * - -6 response check fail - * - -7 302 - */ - public static HttpConnectionAndCode get(@NonNull final String u, - @Nullable final String[] parms, - @NonNull final String user_agent, - @NonNull final String referer, - @Nullable final String cookie, - @Nullable final String cookie_delimiter){ - URL url; - HttpURLConnection cnt; - String response; - Bitmap bmp; - int resp_code; - try { - StringBuilder u_bulider = new StringBuilder(); - u_bulider.append(u); - if (parms != null && parms.length > 0) { - u_bulider.append("?").append(TextUtils.join("&", parms)); - } - url = new URL(u_bulider.toString()); - cnt = (HttpURLConnection) url.openConnection(); - cnt.setDoOutput(true); - cnt.setDoInput(true); - cnt.setRequestProperty("User-Agent", user_agent); - cnt.setRequestProperty("Referer", referer); - if (cookie != null){ - cnt.setRequestProperty("Cookie", cookie); - } - cnt.setRequestMethod("GET"); - cnt.setInstanceFollowRedirects(false); - cnt.setReadTimeout(4000); - cnt.setConnectTimeout(2000); - if (cnt instanceof HttpsURLConnection) { // 判断是否为https请求 - SSLContext sslContext = SSLUtils.getSSLContextWithoutCer(); - SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory(); - ((HttpsURLConnection) cnt).setSSLSocketFactory(sslSocketFactory); - ((HttpsURLConnection) cnt).setHostnameVerifier(SSLUtils.hostnameVerifier); - } - cnt.connect(); - } catch (Exception e) { - e.printStackTrace(); - return new HttpConnectionAndCode(-1); - } - try { - resp_code = cnt.getResponseCode(); - if (resp_code == 302){ - return new HttpConnectionAndCode(cnt, -7, ""); - } - response = ""; - bmp = BitmapFactory.decodeStream(cnt.getInputStream()); - } catch (Exception e) { - e.printStackTrace(); - return new HttpConnectionAndCode(-5); - } - - //get cookie from server - String set_cookie = null; - if (cookie_delimiter != null) { - CookieManager cookieman = new CookieManager(); - StringBuilder cookie_builder = new StringBuilder(); - //getHeaderFields() returns the header fields of response - List cookies = cnt.getHeaderFields().get("Set-Cookie"); - if (cookies != null) { - for (String cookie_resp : cookies) { - cookieman.getCookieStore().add(null, HttpCookie.parse(cookie_resp).get(0)); - } - } - if (cookieman.getCookieStore().getCookies().size() > 0) { - List cookieList = cookieman.getCookieStore().getCookies(); - List cookieStringList = new LinkedList<>(); - for (HttpCookie httpCookie : cookieList){ - String str = httpCookie.getName() + "=" + httpCookie.getValue(); - cookieStringList.add(str); - } - String cookie_join = TextUtils.join(cookie_delimiter, cookieStringList); - cookie_builder.append(cookie_join); - } - set_cookie = cookie_builder.toString(); - } - - //do not disconnect, keep alive - //if cookie_delimiter != null but no server cookie, set_cookie = "" - //if no response, response = "" - HttpConnectionAndCode res = new HttpConnectionAndCode(cnt, 0, response, set_cookie, resp_code); - res.obj = bmp; - return res; - } -} diff --git a/app/src/main/java/top/yvyan/guettable/Http/Post.java b/app/src/main/java/top/yvyan/guettable/Http/Post.java index 3344ea3df686dfc7672decd2288267aaa7f667a6..b3d8c85e397c6fe4885a317b9c028ce480b80412 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/Http/entity/ApiResult.java b/app/src/main/java/top/yvyan/guettable/Http/entity/ApiResult.java new file mode 100644 index 0000000000000000000000000000000000000000..bd8b2e9a54db9139cd34d6a833bfe81df724d4c5 --- /dev/null +++ b/app/src/main/java/top/yvyan/guettable/Http/entity/ApiResult.java @@ -0,0 +1,91 @@ +/* + * Copyright (C) 2018 xuexiangjys(xuexiangjys@163.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package top.yvyan.guettable.Http.entity; + +import androidx.annotation.Keep; + +import com.google.gson.annotations.SerializedName; + +/** + * 提供的默认的标注返回api + * + * @author xuexiang + * @since 2018/5/22 下午4:22 + */ +@Keep +public class ApiResult { + public final static String CODE = "Code"; + public final static String MSG = "Msg"; + public final static String DATA = "Data"; + + @SerializedName(value = CODE, alternate = {"code"}) + private int Code; + @SerializedName(value = MSG, alternate = {"msg"}) + private String Msg; + @SerializedName(value = DATA, alternate = {"data"}) + private T Data; + + public int getCode() { + return Code; + } + + public ApiResult setCode(int code) { + Code = code; + return this; + } + + public String getMsg() { + return Msg; + } + + public ApiResult setMsg(String msg) { + Msg = msg; + return this; + } + + public ApiResult setData(T data) { + Data = data; + return this; + } + + /** + * 获取请求响应的数据,自定义api的时候需要重写【很关键】 + * + * @return + */ + public T getData() { + return Data; + } + + /** + * 是否请求成功,自定义api的时候需要重写【很关键】 + * + * @return + */ + public boolean isSuccess() { + return getCode() == 0; + } + + @Override + public String toString() { + return "ApiResult{" + + "Code='" + Code + '\'' + + ", Msg='" + Msg + '\'' + + ", Data=" + Data + + '}'; + } +} diff --git a/app/src/main/java/top/yvyan/guettable/MyApp.java b/app/src/main/java/top/yvyan/guettable/MyApp.java index 0c1687c1c5886d71193ec77d590ff1b5a441f894..05ec3a6b2e411649f60e10e9bb851603b48af5fc 100644 --- a/app/src/main/java/top/yvyan/guettable/MyApp.java +++ b/app/src/main/java/top/yvyan/guettable/MyApp.java @@ -2,6 +2,7 @@ package top.yvyan.guettable; import android.app.Application; +import com.tencent.mmkv.MMKV; import com.xuexiang.xui.XUI; public class MyApp extends Application { @@ -21,6 +22,8 @@ public class MyApp extends Application { private void init() { XUI.init(this); //初始化UI框架 XUI.debug(true); //开启UI框架调试日志 + + MMKV.initialize(this); //MMKV初始化 } } diff --git a/app/src/main/java/top/yvyan/guettable/activity/AddCourseActivity.java b/app/src/main/java/top/yvyan/guettable/activity/AddCourseActivity.java index 84732a3bc94f42571e4eb844ace80d18897a5e62..c2d58e4c83564a74075f8f081c83dbc1bc7fdbc6 100644 --- a/app/src/main/java/top/yvyan/guettable/activity/AddCourseActivity.java +++ b/app/src/main/java/top/yvyan/guettable/activity/AddCourseActivity.java @@ -183,8 +183,7 @@ public class AddCourseActivity extends AppCompatActivity { if (courseName.isEmpty()) { ToastUtil.showToast(getApplicationContext(), "课程名称不能为空!"); } else { - ScheduleData scheduleData = ScheduleData.newInstance(getApplicationContext()); - List courseBeans = scheduleData.getUserCourseBeans(); + List courseBeans = ScheduleData.getUserCourseBeans(); CourseBean courseBean = new CourseBean(); courseBean.userAdd( (courseNumberEditText.getText().toString().isEmpty() ? null : courseNumberEditText.getText().toString()), @@ -196,7 +195,7 @@ public class AddCourseActivity extends AppCompatActivity { (courseStartSeekBar.getProgress() == 0 ? 7 : courseStartSeekBar.getProgress()), (courseTeacherEditText.getText().toString().isEmpty() ? null : courseTeacherEditText.getText().toString()), (courseCommEditText.getText().toString().isEmpty() ? null : courseCommEditText.getText().toString()), - scheduleData.getUserCourseNo() + ScheduleData.getUserCourseNo() ); try { courseBeans.add(courseBean); @@ -204,7 +203,7 @@ public class AddCourseActivity extends AppCompatActivity { e.printStackTrace(); } - scheduleData.setUserCourseBeans(courseBeans); + ScheduleData.setUserCourseBeans(courseBeans); WidgetUtil.notifyWidgetUpdate(this); ToastUtil.showToast(getApplicationContext(), "添加成功!"); diff --git a/app/src/main/java/top/yvyan/guettable/activity/DetailActivity.java b/app/src/main/java/top/yvyan/guettable/activity/DetailActivity.java index b1a482e91b6bde268b43f8918b8fa66b96cd4b76..b1bbcb38f72597ba1c927383139a08bab883c7c8 100644 --- a/app/src/main/java/top/yvyan/guettable/activity/DetailActivity.java +++ b/app/src/main/java/top/yvyan/guettable/activity/DetailActivity.java @@ -44,7 +44,7 @@ public class DetailActivity extends AppCompatActivity { SingleSettingData singleSettingData = SingleSettingData.newInstance(getApplicationContext()); BackgroundUtil.setPageTheme(this, singleSettingData.getThemeId()); setContentView(R.layout.activity_detail); - schedules = DetailClassData.newInstance().getCourseBeans(); + schedules = DetailClassData.getCourseBeans(); //透明状态栏 Window window = this.getWindow(); window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); diff --git a/app/src/main/java/top/yvyan/guettable/activity/LaunchActivity.java b/app/src/main/java/top/yvyan/guettable/activity/LaunchActivity.java index 82399f99e89966c9366141543f61e65ef443b64b..0ffc0895df67006c4f84b07da99143597a23116d 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 ebf40e2d4205cb32c8503c346ed55711adac6731..d4c51ee9c3a50e9df694808033b717c52529aa00 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; @@ -36,9 +35,8 @@ 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; import top.yvyan.guettable.util.AppUtil; import top.yvyan.guettable.util.DialogUtil; @@ -53,12 +51,11 @@ 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; - private GeneralData generalData; @Override protected void onCreate(Bundle savedInstanceState) { @@ -66,23 +63,22 @@ 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); + 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()); } } @@ -97,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); } }; } @@ -116,14 +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(() -> { - String VPNToken = null; - if (Net.testNet() != 200) { - VPNToken = Net.getVPNToken(this); - } - testCAS(account, pwd2, VPNToken); - }).start(); + String pwd = etPwd.getText().toString(); + new Thread(() -> testCAS(account, pwd)).start(); } @Override @@ -138,26 +128,25 @@ 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(); + String pwd = etPwd.getText().toString(); new Thread(() -> { runOnUiThread(() -> button.setText("正在认证-手机验证码")); - String MulitFactorAuth = StaticService.VerifyPhoneOTP(this, CASCookie,OTP, VPNToken); - 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.setCASCookie(CASCookie+"; "+MulitFactorAuth); + tokenData.setMFACookie(MultiFactorAuth); tokenData.setBkjwCookie(null); - accountData.setUser(account, null, pwd2, cbRememberPwd.isChecked()); + accountData.setUser(account, pwd, cbRememberPwd.isChecked()); getInfo(); } }).start(); @@ -167,40 +156,22 @@ public class LoginActivity extends Activity implements View.OnClickListener { * 验证智慧校园密码 * * @param account 学号 - * @param password 智慧校园/VPN密码 + * @param password 密码 */ - private void testCAS(String account, String password, String VPNToken) { + private void testCAS(String account, String password) { new Thread(() -> { + TokenData tokenData = TokenData.newInstance(this); runOnUiThread(() -> button.setText("正在认证")); - String CasCookie = StaticService.SSOLogin(this, account, password, VPNToken); + String CasCookie = StaticService.SSOLogin(this, account, password, accountData.getPwd().equals(password) ? tokenData.getTGTToken() : null, tokenData.getMFACookie()); 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.setTGTToken(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")) { - runOnUiThread(() -> { - setEnClick(); - ToastUtil.showToast(this, getResources().getString(R.string.login_fail_phoneOTPSend)+phoneNumber.substring(7)); - }); - } else { - showErrorToast(-8); - } - } + 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()); + accountData.setUser(account, password, cbRememberPwd.isChecked()); getInfo(); } } else { @@ -215,11 +186,41 @@ public class LoginActivity extends Activity implements View.OnClickListener { }).start(); } + /** + * 跳过二步认证 + * + * @param account 学号 + * @param password 密码 + * @param CASCookie CAS Cookie + * @param tokenData tokenData + */ + private void bypass2FA(String account, String password, String CASCookie, TokenData tokenData) { + try { + runOnUiThread(() -> button.setText("正在尝试绕过二步验证")); + String MultiFactorAuth = StaticService.bypass2FA(this, password, CASCookie); + if (MultiFactorAuth.contains("ERROR")) { + if (MultiFactorAuth.equals("ERROR1")) { + showErrorToast(-4); + } else if (MultiFactorAuth.equals("ERROR2")) { + showErrorToast(-2); + } else { + showErrorToast(-8); + } + } else { + tokenData.setMFACookie(MultiFactorAuth); + tokenData.setBkjwCookie(null); + accountData.setUser(account, password, cbRememberPwd.isChecked()); + getInfo(); + } + + } catch (Exception ignore) { + } + } /** * 显示手机验证码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); @@ -238,12 +239,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, tokenData); }); } catch (Exception ignore) { - return; } } @@ -284,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) { + MoreData.setTermBeans(allTerm); } } catch (Exception e) { UMCrash.generateCustomLog(e, "getInfo"); @@ -319,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); } @@ -330,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/activity/SetTermActivity.java b/app/src/main/java/top/yvyan/guettable/activity/SetTermActivity.java index 094300d867605b713db1843330d5b2bd3d9422f3..286fad69ce41751ba48c8b955a20b3a280abcfa0 100644 --- a/app/src/main/java/top/yvyan/guettable/activity/SetTermActivity.java +++ b/app/src/main/java/top/yvyan/guettable/activity/SetTermActivity.java @@ -18,7 +18,7 @@ import top.yvyan.guettable.R; import top.yvyan.guettable.bean.TermBean; import top.yvyan.guettable.data.AccountData; import top.yvyan.guettable.data.GeneralData; -import top.yvyan.guettable.data.MoreDate; +import top.yvyan.guettable.data.MoreData; import top.yvyan.guettable.data.ScheduleData; import top.yvyan.guettable.util.DialogUtil; import top.yvyan.guettable.util.ToastUtil; @@ -36,7 +36,6 @@ public class SetTermActivity extends AppCompatActivity implements View.OnClickLi private XSeekBar seekBar; private GeneralData generalData; - private ScheduleData scheduleData; @Override protected void onCreate(Bundle savedInstanceState) { @@ -66,7 +65,6 @@ public class SetTermActivity extends AppCompatActivity implements View.OnClickLi back.setOnClickListener(this); input.setOnClickListener(this); generalData = GeneralData.newInstance(this); - scheduleData = ScheduleData.newInstance(this); } @SuppressLint("SetTextI18n") @@ -88,11 +86,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(); @@ -131,33 +125,22 @@ 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(); - 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 : MoreData.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() { @@ -166,7 +149,7 @@ public class SetTermActivity extends AppCompatActivity implements View.OnClickLi @Override public void onClickBack() { - scheduleData.deleteUserCourse(); + ScheduleData.deleteUserCourse(); importCourse(); } }; @@ -183,8 +166,8 @@ public class SetTermActivity extends AppCompatActivity implements View.OnClickLi int week = seekBar.getSelectedNumber() / 10; generalData.setWeek(week); generalData.setLastUpdateTime(-1); - scheduleData.setUpdate(true); - ToastUtil.showToast(getApplicationContext(), "正在导入课表,受教务系统影响,最长需要约30秒,请耐心等待,不要滑动页面"); + ScheduleData.setUpdate(true); + 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 efe3daccc2514d376fb4b05ab4abf92fc13eb26c..c18ce9a07122b50a2c175b823a3197bd4419a825 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/adapter/AvgTeacherAdapter.java b/app/src/main/java/top/yvyan/guettable/adapter/AvgTeacherAdapter.java deleted file mode 100644 index f0d63833e66b989a86bd0c144afafd70530c970d..0000000000000000000000000000000000000000 --- a/app/src/main/java/top/yvyan/guettable/adapter/AvgTeacherAdapter.java +++ /dev/null @@ -1,54 +0,0 @@ -package top.yvyan.guettable.adapter; - -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.recyclerview.widget.RecyclerView; - -import java.util.List; - -import top.yvyan.guettable.R; -import top.yvyan.guettable.bean.AvgTeacherBean; - -public class AvgTeacherAdapter extends RecyclerView.Adapter { - private final List avgTeacherBeans; - - public AvgTeacherAdapter(List avgTeacherBeans) { - this.avgTeacherBeans = avgTeacherBeans; - } - - @NonNull - @Override - public AvgTeacherViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext()); - View itemView = layoutInflater.inflate(R.layout.teacher_cardview,parent,false); - return new AvgTeacherViewHolder(itemView); - } - - @Override - public void onBindViewHolder(@NonNull AvgTeacherViewHolder holder, int position) { - holder.courseName.setText(avgTeacherBeans.get(position).getCourseName()); - holder.teacherName.setText(avgTeacherBeans.get(position).getTeacherName()); - holder.teacherHint.setText(avgTeacherBeans.get(position).getHint()); - } - - @Override - public int getItemCount() { - return avgTeacherBeans.size(); - } - - public static class AvgTeacherViewHolder extends RecyclerView.ViewHolder { - TextView courseName, teacherName, teacherHint; - - public AvgTeacherViewHolder(@NonNull View itemView) { - super(itemView); - courseName = itemView.findViewById(R.id.course_Name); - teacherName = itemView.findViewById(R.id.teacher_name); - teacherHint = itemView.findViewById(R.id.teacher_hint); - } - } - -} diff --git a/app/src/main/java/top/yvyan/guettable/adapter/AvgTextbookAdapter.java b/app/src/main/java/top/yvyan/guettable/adapter/AvgTextbookAdapter.java deleted file mode 100644 index d98fcdd1c8c174b8034ab095783bb6747f578da7..0000000000000000000000000000000000000000 --- a/app/src/main/java/top/yvyan/guettable/adapter/AvgTextbookAdapter.java +++ /dev/null @@ -1,54 +0,0 @@ -package top.yvyan.guettable.adapter; - -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.recyclerview.widget.RecyclerView; - -import java.util.List; - -import top.yvyan.guettable.R; -import top.yvyan.guettable.bean.AvgTextbookBean; - -public class AvgTextbookAdapter extends RecyclerView.Adapter { - - private final List avgTextbookBeans; - - public AvgTextbookAdapter(List avgTextbookBeans) { - this.avgTextbookBeans = avgTextbookBeans; - } - - @NonNull - @Override - public AvgTextbookAdapter.AvgTextbookViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext()); - View itemView = layoutInflater.inflate(R.layout.textbook_cardview, parent, false); - return new AvgTextbookViewHolder(itemView); - } - - @Override - public void onBindViewHolder(@NonNull AvgTextbookAdapter.AvgTextbookViewHolder holder, int position) { - holder.courseName.setText(avgTextbookBeans.get(position).getCourseName()); - holder.textbookName.setText(avgTextbookBeans.get(position).getTextbookName()); - holder.textbookHint.setText(avgTextbookBeans.get(position).getHint()); - } - - @Override - public int getItemCount() { - return avgTextbookBeans.size(); - } - - static class AvgTextbookViewHolder extends RecyclerView.ViewHolder { - TextView courseName, textbookName, textbookHint; - - public AvgTextbookViewHolder(@NonNull View itemView) { - super(itemView); - courseName = itemView.findViewById(R.id.textbook_course_Name); - textbookName = itemView.findViewById(R.id.textbook_name); - textbookHint = itemView.findViewById(R.id.textbook_hint); - } - } -} diff --git a/app/src/main/java/top/yvyan/guettable/adapter/ClassDetailAdapter.java b/app/src/main/java/top/yvyan/guettable/adapter/ClassDetailAdapter.java index ea57c74bdd984553f9a02ddcebbf348afe0949bf..e156a5bb1e7778ad291d501d7535de6975c98268 100644 --- a/app/src/main/java/top/yvyan/guettable/adapter/ClassDetailAdapter.java +++ b/app/src/main/java/top/yvyan/guettable/adapter/ClassDetailAdapter.java @@ -110,7 +110,7 @@ public class ClassDetailAdapter extends RecyclerView.Adapter { - ScheduleData.newInstance(activity).deleteUserCourse(courseBean.getId()); + ScheduleData.deleteUserCourse(courseBean.getId()); schedules.remove(position); //删除动画 notifyItemRemoved(position); diff --git a/app/src/main/java/top/yvyan/guettable/adapter/DayClassAdapter.java b/app/src/main/java/top/yvyan/guettable/adapter/DayClassAdapter.java index a90f88024b0d3b60dd16884051cbfebf2b94294a..2298163385c29ef3d1bffc17073dd51eb6c446d9 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.Adapter53需要进行的操作 + */ + private void update_52() { + GeneralData.newInstance(context).setLastUpdateTime(-1); + } + /** * 40->41需要进行的操作 */ private void update_40() { - ScheduleData scheduleData = ScheduleData.newInstance(context); - List examBeans = scheduleData.getExamBeans(); + List examBeans = ScheduleData.getExamBeans(); for (ExamBean examBean : examBeans) { if (examBean.getClassNum() < 1) { examBean.setClassNum(1); } } - scheduleData.setExamBeans(examBeans); - } - - /** - * 36->37需要进行的操作 - */ - private void update_36() { - //修复密码丢失导致的登录错误 - AccountData accountData = AccountData.newInstance(context); - if (accountData.getIsLogin()) { - if (accountData.getVPNPwd() == null || accountData.getVPNPwd().isEmpty()) { - accountData.logoff(); - } - if (accountData.getBkjwPwd() == null || accountData.getBkjwPwd().isEmpty()) { - accountData.logoff(); - } - } + ScheduleData.setExamBeans(examBeans); } private void openUpdate() { diff --git a/app/src/main/java/top/yvyan/guettable/baseFun/UpdateApp.java b/app/src/main/java/top/yvyan/guettable/baseFun/UpdateApp.java index a3dd7e8fe35cf66993fd25b05abe5e5119b65272..a88248e9842e9aa9b92d5c8d3142d0c2d4aec503 100644 --- a/app/src/main/java/top/yvyan/guettable/baseFun/UpdateApp.java +++ b/app/src/main/java/top/yvyan/guettable/baseFun/UpdateApp.java @@ -35,7 +35,7 @@ public class UpdateApp { ToastUtil.showToast(activity, error.toString()); } }) - .supportSilentInstall(true) //设置是否支持静默安装,默认是true + .supportSilentInstall(false) //设置是否支持静默安装,默认是true .setIUpdateHttpService(new OKHttpUpdateHttpService()) //这个必须设置!实现网络请求功能。 .init(activity.getApplication()); } diff --git a/app/src/main/java/top/yvyan/guettable/bean/AvgTeacherBean.java b/app/src/main/java/top/yvyan/guettable/bean/AvgTeacherBean.java deleted file mode 100644 index 153ecdfc818be28df200b4260376841e059a9b61..0000000000000000000000000000000000000000 --- a/app/src/main/java/top/yvyan/guettable/bean/AvgTeacherBean.java +++ /dev/null @@ -1,29 +0,0 @@ -package top.yvyan.guettable.bean; - -public class AvgTeacherBean { - String courseName; - String teacherName; - String hint; - - public AvgTeacherBean(String courseName, String teacherName, String hint) { - this.courseName = courseName; - this.teacherName = teacherName; - this.hint = hint; - } - - public String getCourseName() { - return courseName; - } - - public void setHint(String hint) { - this.hint = hint; - } - - public String getHint() { - return hint; - } - - public String getTeacherName() { - return teacherName; - } -} diff --git a/app/src/main/java/top/yvyan/guettable/bean/AvgTextbookBean.java b/app/src/main/java/top/yvyan/guettable/bean/AvgTextbookBean.java deleted file mode 100644 index 9e51ced4da68d38a3089cdd8b4a3237aebda524e..0000000000000000000000000000000000000000 --- a/app/src/main/java/top/yvyan/guettable/bean/AvgTextbookBean.java +++ /dev/null @@ -1,29 +0,0 @@ -package top.yvyan.guettable.bean; - -public class AvgTextbookBean { - private final String courseName; - private final String textbookName; - private String hint; - - public AvgTextbookBean(String courseName, String textbookName, String hint) { - this.courseName = courseName; - this.textbookName = textbookName; - this.hint = hint; - } - - public String getCourseName() { - return courseName; - } - - public String getTextbookName() { - return textbookName; - } - - public String getHint() { - return hint; - } - - public void setHint(String hint) { - this.hint = hint; - } -} diff --git a/app/src/main/java/top/yvyan/guettable/bean/TipInfo.java b/app/src/main/java/top/yvyan/guettable/bean/TipInfo.java new file mode 100644 index 0000000000000000000000000000000000000000..f4081481880c2b0607b6f78196fadb55623f7a2c --- /dev/null +++ b/app/src/main/java/top/yvyan/guettable/bean/TipInfo.java @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2021 xuexiangjys(xuexiangjys@163.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package top.yvyan.guettable.bean; + +import androidx.annotation.Keep; + +/** + * @author xuexiang + * @since 2019-08-28 15:35 + */ +@Keep +public class TipInfo { + /** + * title : 小贴士3 + * content :

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


+ */ + + private String title; + private String content; + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + @Override + public String toString() { + return "TipInfo{" + + "title='" + title + '\'' + + ", content='" + content + '\'' + + '}'; + } +} diff --git a/app/src/main/java/top/yvyan/guettable/data/AccountData.java b/app/src/main/java/top/yvyan/guettable/data/AccountData.java index 60733a277d0fa47062a8044ce444b15c425291fc..f7afa7d265c8bd4c05900e258077c97dad1eca2f 100644 --- a/app/src/main/java/top/yvyan/guettable/data/AccountData.java +++ b/app/src/main/java/top/yvyan/guettable/data/AccountData.java @@ -9,15 +9,13 @@ public class AccountData { private static final String IS_SAVE = "isSave"; private static final String IS_LOGIN = "isLogin"; private static final String USERNAME = "username"; - private static final String PASSWORD = "password"; - private static final String PASSWORD2 = "password2"; + private static final String PASSWORD = "password2"; SharedPreferences sharedPreferences; private boolean isSave; private boolean isLogin; private String username; - private String bkjwPwd; - private String VPNPwd; + private String Pwd; private AccountData(Context context) { sharedPreferences = context.getSharedPreferences(SHP_NAME, Context.MODE_PRIVATE); @@ -43,12 +41,9 @@ public class AccountData { return username; } - public void setUser(String username, String bkjwPwd, String VPNPwd, boolean isSave) { - if (bkjwPwd != null) { - this.bkjwPwd = bkjwPwd; - } + public void setUser(String username, String Pwd, boolean isSave) { this.username = username; - this.VPNPwd = VPNPwd; + this.Pwd = Pwd; this.isSave = isSave; this.isLogin = true; saveUser(); @@ -63,8 +58,7 @@ public class AccountData { isSave = sharedPreferences.getBoolean(IS_SAVE, false); isLogin = sharedPreferences.getBoolean(IS_LOGIN, false); username = sharedPreferences.getString(USERNAME, ""); - bkjwPwd = sharedPreferences.getString(PASSWORD, ""); - VPNPwd = sharedPreferences.getString(PASSWORD2, ""); + Pwd = sharedPreferences.getString(PASSWORD, ""); } private void saveUser() { @@ -72,16 +66,11 @@ public class AccountData { editor.putBoolean(IS_SAVE, isSave); editor.putBoolean(IS_LOGIN, isLogin); editor.putString(USERNAME, username); - editor.putString(PASSWORD, bkjwPwd); - editor.putString(PASSWORD2, VPNPwd); + editor.putString(PASSWORD, Pwd); editor.apply(); } - public String getBkjwPwd() { - return bkjwPwd; - } - - public String getVPNPwd() { - return VPNPwd; + public String getPwd() { + return Pwd; } } diff --git a/app/src/main/java/top/yvyan/guettable/data/BaseData.java b/app/src/main/java/top/yvyan/guettable/data/BaseData.java new file mode 100644 index 0000000000000000000000000000000000000000..d8a27c1fa7d69b56bcae5f95b81fe02d8c2b14de --- /dev/null +++ b/app/src/main/java/top/yvyan/guettable/data/BaseData.java @@ -0,0 +1,34 @@ +package top.yvyan.guettable.data; + +import com.google.gson.Gson; +import com.tencent.mmkv.MMKV; + +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.List; + +/** + * List转码存储,用于存储课程列表等信息 + */ +public class BaseData { + public static void set(String key, List Beans) { + String str = new Gson().toJson(Beans); + MMKV mmkv = MMKV.defaultMMKV(); + mmkv.encode(key, str); + } + + public static List get(String key, Type type) { + List list = null; + MMKV mmkv = MMKV.defaultMMKV(); + try { + String str = mmkv.decodeString(key); + list = new Gson().fromJson(str, type); + } catch (Exception e) { + mmkv.remove(key); + } + if (list == null) { + list = new ArrayList<>(); + } + return list; + } +} diff --git a/app/src/main/java/top/yvyan/guettable/data/DetailClassData.java b/app/src/main/java/top/yvyan/guettable/data/DetailClassData.java index 19ad022dd8fec50cab5e5903f70a7dccdfef578c..19d17d8deeab41234906a64c9ee58565d9339c3b 100644 --- a/app/src/main/java/top/yvyan/guettable/data/DetailClassData.java +++ b/app/src/main/java/top/yvyan/guettable/data/DetailClassData.java @@ -5,25 +5,13 @@ import com.zhuangfei.timetable.model.Schedule; import java.util.List; public class DetailClassData { - private static DetailClassData detailClassData; + private static List schedules; - private List schedules; - - private DetailClassData() { - } - - public static DetailClassData newInstance() { - if (detailClassData == null) { - detailClassData = new DetailClassData(); - } - return detailClassData; - } - - public List getCourseBeans() { + public static List getCourseBeans() { return schedules; } - public void setCourseBeans(List schedules) { - this.schedules = schedules; + public static void setCourseBeans(List schedules) { + DetailClassData.schedules = schedules; } } diff --git a/app/src/main/java/top/yvyan/guettable/data/GeneralData.java b/app/src/main/java/top/yvyan/guettable/data/GeneralData.java index a4d2db7eb2516b1684843f01ec2efcd754051a12..76dd8c2d2543aedcbae52fd0223890022c402c26 100644 --- a/app/src/main/java/top/yvyan/guettable/data/GeneralData.java +++ b/app/src/main/java/top/yvyan/guettable/data/GeneralData.java @@ -18,9 +18,7 @@ public class GeneralData { private static final String TIME = "time"; private static final String GRADE = "grade"; private static final String TERM = "term"; - private static final String IS_INTERNATIONAL = "isInternational"; private static final String LAST_UPDATE_TIME = "lastUpdateTime"; - private static final String APP_LAST_UPDATE_TIME = "appLastUpdateTime"; private static final String APPLY_PRIVACY = "applyPrivacy"; private static final String WIDGET_THEME = "widget_theme"; private static final String WIDGET_ALPHA = "widget_alpha"; @@ -34,10 +32,7 @@ public class GeneralData { private long time; private String grade; private String term; - private boolean isInternational; private long lastUpdateTime; - //控制检查更新频率 - private long appLastUpdateTime; //隐私协议 private boolean applyPrivacy; @@ -59,9 +54,7 @@ public class GeneralData { time = sharedPreferences.getLong(TIME, System.currentTimeMillis()); grade = sharedPreferences.getString(GRADE, null); term = sharedPreferences.getString(TERM, null); - isInternational = sharedPreferences.getBoolean(IS_INTERNATIONAL, false); lastUpdateTime = sharedPreferences.getLong(LAST_UPDATE_TIME, -1); - appLastUpdateTime = sharedPreferences.getLong(APP_LAST_UPDATE_TIME, -1); applyPrivacy = sharedPreferences.getBoolean(APPLY_PRIVACY, false); widget_theme = sharedPreferences.getString(WIDGET_THEME, "black"); widget_alpha = sharedPreferences.getInt(WIDGET_ALPHA, 255); @@ -138,16 +131,6 @@ public class GeneralData { editor.apply(); } - public boolean isInternational() { - return isInternational; - } - - public void setInternational(boolean international) { - isInternational = international; - editor.putBoolean(IS_INTERNATIONAL, isInternational); - editor.apply(); - } - public long getLastUpdateTime() { return lastUpdateTime; } @@ -159,16 +142,6 @@ public class GeneralData { editor.apply(); } - public long getAppLastUpdateTime() { - return appLastUpdateTime; - } - - public void setAppLastUpdateTime(long appLastUpdateTime) { - this.appLastUpdateTime = appLastUpdateTime; - editor.putLong(APP_LAST_UPDATE_TIME, appLastUpdateTime); - editor.apply(); - } - public boolean isApplyPrivacy() { return applyPrivacy; } diff --git a/app/src/main/java/top/yvyan/guettable/data/MoreData.java b/app/src/main/java/top/yvyan/guettable/data/MoreData.java new file mode 100644 index 0000000000000000000000000000000000000000..82c954602866e244c8212c5eb00a850edad3a534 --- /dev/null +++ b/app/src/main/java/top/yvyan/guettable/data/MoreData.java @@ -0,0 +1,120 @@ +package top.yvyan.guettable.data; + +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import com.tencent.mmkv.MMKV; + +import java.util.List; + +import top.yvyan.guettable.bean.CETBean; +import top.yvyan.guettable.bean.ExamScoreBean; +import top.yvyan.guettable.bean.ExperimentScoreBean; +import top.yvyan.guettable.bean.PlannedCourseBean; +import top.yvyan.guettable.bean.ResitBean; +import top.yvyan.guettable.bean.SelectedCourseBean; +import top.yvyan.guettable.bean.TermBean; + +public class MoreData extends BaseData { + private static final String MAIN_KEY = "MoreData"; + private static final String CET_STRING = MAIN_KEY + "CET_STRING"; + private static final String EXAM_SCORE_STRING = MAIN_KEY + "EXAM_SCORE_STRING"; + private static final String RESIT_STRING = MAIN_KEY + "resitString"; + private static final String EXPERIMENT_SCORE_STRING = MAIN_KEY + "EXPERIMENT_SCORE_STRING"; + private static final String PLANNED_COURSE_STRING = MAIN_KEY + "plannedCourseString"; + private static final String GRADES_STRING = MAIN_KEY + "gradesString"; + private static final String SELECTED_COURSE = MAIN_KEY + "selectedCourses"; + private static final String ALL_TERM = MAIN_KEY + "allTerms"; + + //CET成绩 + public static List getCetBeans() { + return get(CET_STRING, new TypeToken>() { + }.getType()); + } + + public static void setCetBeans(List cetBeans) { + set(CET_STRING, cetBeans); + } + + //考试成绩 + public static List getExamScoreBeans() { + return get(EXAM_SCORE_STRING, new TypeToken>() { + }.getType()); + } + + public static void setExamScoreBeans(List examScoreBeans) { + set(EXAM_SCORE_STRING, examScoreBeans); + } + + //补考成绩 + public static List getResitBeans() { + return get(RESIT_STRING, new TypeToken>() { + }.getType()); + } + + public static void setResitBeans(List resitBeans) { + set(RESIT_STRING, resitBeans); + } + + //实验成绩 + public static List getExperimentScoreBeans() { + return get(EXPERIMENT_SCORE_STRING, new TypeToken>() { + }.getType()); + } + + public static void setExperimentScoreBeans(List experimentScoreBeans) { + set(EXPERIMENT_SCORE_STRING, experimentScoreBeans); + } + + //计划课程 + public static List getPlannedCourseBeans() { + return get(PLANNED_COURSE_STRING, new TypeToken>() { + }.getType()); + } + + public static void setPlannedCourseBeans(List plannedCourseBeans) { + set(PLANNED_COURSE_STRING, plannedCourseBeans); + } + + //已选课程 + public static List getSelectedCourseBeans() { + return get(SELECTED_COURSE, new TypeToken>() { + }.getType()); + } + + public static void setSelectedCoursesBeans(List selectedCoursesBeans) { + set(SELECTED_COURSE, selectedCoursesBeans); + } + + //学期列表 + public static List getTermBeans() { + return get(ALL_TERM, new TypeToken>() { + }.getType()); + } + + public static void setTermBeans(List termBeans) { + set(ALL_TERM, termBeans); + } + + //学分绩 + public static float[] getGrades() { + float[] grades = null; + MMKV mmkv = MMKV.defaultMMKV(); + try { + String str = mmkv.decodeString(GRADES_STRING); + grades = new Gson().fromJson(str, new TypeToken() { + }.getType()); + } catch (Exception e) { + mmkv.remove(GRADES_STRING); + } + if (grades == null) { + grades = new float[]{100, 100, 100, 100, 100, 100, 100}; + } + return grades; + } + + public static void setGrades(float[] grades) { + String str = new Gson().toJson(grades); + MMKV mmkv = MMKV.defaultMMKV(); + mmkv.encode(GRADES_STRING, str); + } +} diff --git a/app/src/main/java/top/yvyan/guettable/data/MoreDate.java b/app/src/main/java/top/yvyan/guettable/data/MoreDate.java deleted file mode 100644 index 86eaa643846d498dc70f0bc238e64299becfbb28..0000000000000000000000000000000000000000 --- a/app/src/main/java/top/yvyan/guettable/data/MoreDate.java +++ /dev/null @@ -1,352 +0,0 @@ -package top.yvyan.guettable.data; - -import android.content.Context; -import android.content.SharedPreferences; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import top.yvyan.guettable.bean.CETBean; -import top.yvyan.guettable.bean.ExamScoreBean; -import top.yvyan.guettable.bean.ExperimentScoreBean; -import top.yvyan.guettable.bean.PlannedCourseBean; -import top.yvyan.guettable.bean.ResitBean; -import top.yvyan.guettable.bean.SelectedCourseBean; -import top.yvyan.guettable.bean.TermBean; -import top.yvyan.guettable.util.SerializeUtil; - -public class MoreDate { - private static MoreDate moreDate; - private static final String SHP_NAME = "MoreDate"; - private static final String RESIT_STRING = "resitString"; - private static final String CET_STRING = "CET_STRING"; - private static final String EXAM_SCORE_STRING = "EXAM_SCORE_STRING"; - private static final String EXPERIMENT_SCORE_STRING = "EXPERIMENT_SCORE_STRING"; - private static final String PLANNED_COURSE_STRING = "plannedCourseString"; - private static final String GRADES_STRING = "gradesString"; - private static final String SELECTED_COURSE = "selectedCourses"; - private static final String ALL_TERM = "allTerms"; - - private final SharedPreferences sharedPreferences; - private final SharedPreferences.Editor editor; - - private List resitBeans; - private List cetBeans; - private List examScoreBeans; - private List experimentScoreBeans; - private List plannedCourseBeans; - private List selectedCoursesBeans; - private List termBeans; - private float[] grades; - - private MoreDate(Context context) { - sharedPreferences = context.getSharedPreferences(SHP_NAME, Context.MODE_PRIVATE); - editor = sharedPreferences.edit(); - editor.apply(); - load(); - } - - private void load() { - ResitBean[] resitBeans1 = null; - CETBean[] cetBeans1 = null; - ExamScoreBean[] examScoreBeans1 = null; - ExperimentScoreBean[] experimentScoreBeans1 = null; - PlannedCourseBean[] plannedCourseBeans1 = null; - SelectedCourseBean[] selectedCourseBeans1 = null; - TermBean[] termBeans1 = null; - - - String resitString = sharedPreferences.getString(RESIT_STRING, null); - String cetString = sharedPreferences.getString(CET_STRING, null); - String examScoreString = sharedPreferences.getString(EXAM_SCORE_STRING, null); - String experimentScoreString = sharedPreferences.getString(EXPERIMENT_SCORE_STRING, null); - String plannedCourseString = sharedPreferences.getString(PLANNED_COURSE_STRING, null); - String gradesString = sharedPreferences.getString(GRADES_STRING, null); - String selectedCourseString = sharedPreferences.getString(SELECTED_COURSE, null); - String termString = sharedPreferences.getString(ALL_TERM, null); - - if (resitString != null) { - try { - resitBeans1 = (ResitBean[]) SerializeUtil.serializeToObject(resitString); - } catch (IOException | ClassNotFoundException e) { - e.printStackTrace(); - } - if (resitBeans1 != null) { - resitBeans = Arrays.asList(resitBeans1); - } - } - if (cetString != null) { - try { - cetBeans1 = (CETBean[]) SerializeUtil.serializeToObject(cetString); - } catch (IOException | ClassNotFoundException e) { - e.printStackTrace(); - } - if (cetBeans1 != null) { - cetBeans = Arrays.asList(cetBeans1); - } - } - if (examScoreString != null) { - try { - examScoreBeans1 = (ExamScoreBean[]) SerializeUtil.serializeToObject(examScoreString); - } catch (IOException | ClassNotFoundException e) { - e.printStackTrace(); - } - if (examScoreBeans1 != null) { - examScoreBeans = Arrays.asList(examScoreBeans1); - } - } - if (experimentScoreString != null) { - try { - experimentScoreBeans1 = (ExperimentScoreBean[]) SerializeUtil.serializeToObject(experimentScoreString); - } catch (IOException | ClassNotFoundException e) { - e.printStackTrace(); - } - if (experimentScoreBeans1 != null) { - experimentScoreBeans = Arrays.asList(experimentScoreBeans1); - } - } - if (plannedCourseString != null) { - try { - plannedCourseBeans1 = (PlannedCourseBean[]) SerializeUtil.serializeToObject(plannedCourseString); - } catch (IOException | ClassNotFoundException e) { - e.printStackTrace(); - } - if (plannedCourseBeans1 != null) { - plannedCourseBeans = Arrays.asList(plannedCourseBeans1); - } - } - if (gradesString != null) { - try { - grades = (float[]) SerializeUtil.serializeToObject(gradesString); - } catch (IOException | ClassNotFoundException e) { - e.printStackTrace(); - } - } - if (selectedCourseString != null) { - try { - selectedCourseBeans1 = (SelectedCourseBean[]) SerializeUtil.serializeToObject(selectedCourseString); - } catch (IOException | ClassNotFoundException e) { - e.printStackTrace(); - } - if (selectedCourseBeans1 != null) { - selectedCoursesBeans = Arrays.asList(selectedCourseBeans1); - } - } - if (termString != null) { - try { - termBeans1 = (TermBean[]) SerializeUtil.serializeToObject(termString); - } catch (IOException | ClassNotFoundException e) { - e.printStackTrace(); - } - if (termBeans1 != null) { - termBeans = Arrays.asList(termBeans1); - } - } - } - - public static MoreDate newInstance(Context context) { - if (moreDate == null) { - moreDate = new MoreDate(context); - } - return moreDate; - } - - public List getResitBeans() { - if (resitBeans == null) { - resitBeans = new ArrayList<>(); - } - return resitBeans; - } - - public void setResitBeans(List resitBeans) { - this.resitBeans = resitBeans; - String resitString = null; - ResitBean[] resitBeans1 = new ResitBean[resitBeans.size()]; - resitBeans.toArray(resitBeans1); - try { - resitString = SerializeUtil.serialize(resitBeans1); - } catch (IOException e) { - e.printStackTrace(); - } - if (resitString != null) { - editor.putString(RESIT_STRING, resitString); - editor.apply(); - } - } - - //CET成绩 - public List getCetBeans() { - if (cetBeans == null) { - cetBeans = new ArrayList<>(); - } - return cetBeans; - } - - public void setCetBeans(List cetBeans) { - this.cetBeans = cetBeans; - String cetString = null; - CETBean[] cetBeans1 = new CETBean[cetBeans.size()]; - cetBeans.toArray(cetBeans1); - try { - cetString = SerializeUtil.serialize(cetBeans1); - } catch (IOException e) { - e.printStackTrace(); - } - if (cetString != null) { - editor.putString(CET_STRING, cetString); - editor.apply(); - } - } - - //考试成绩 - public List getExamScoreBeans() { - if (examScoreBeans == null) { - examScoreBeans = new ArrayList<>(); - } - return examScoreBeans; - } - - public void setExamScoreBeans(List examScoreBeans) { - this.examScoreBeans = examScoreBeans; - String examScoreString = null; - ExamScoreBean[] examScoreBeans1 = new ExamScoreBean[examScoreBeans.size()]; - examScoreBeans.toArray(examScoreBeans1); - try { - examScoreString = SerializeUtil.serialize(examScoreBeans1); - } catch (IOException e) { - e.printStackTrace(); - } - if (examScoreString != null) { - editor.putString(EXAM_SCORE_STRING, examScoreString); - editor.apply(); - } - } - - //实验成绩 - public List getExperimentScoreBeans() { - if (experimentScoreBeans == null) { - experimentScoreBeans = new ArrayList<>(); - } - return experimentScoreBeans; - } - - public void setExperimentScoreBeans(List experimentScoreBeans) { - this.experimentScoreBeans = experimentScoreBeans; - String experimentScoreString = null; - ExperimentScoreBean[] experimentScoreBeans1 = new ExperimentScoreBean[experimentScoreBeans.size()]; - experimentScoreBeans.toArray(experimentScoreBeans1); - try { - experimentScoreString = SerializeUtil.serialize(experimentScoreBeans1); - } catch (IOException e) { - e.printStackTrace(); - } - if (experimentScoreString != null) { - editor.putString(EXPERIMENT_SCORE_STRING, experimentScoreString); - editor.apply(); - } - } - - //计划课程 - public List getPlannedCourseBeans() { - if (plannedCourseBeans == null) { - plannedCourseBeans = new ArrayList<>(); - } - return plannedCourseBeans; - } - - public void setPlannedCourseBeans(List plannedCourseBeans) { - this.plannedCourseBeans = plannedCourseBeans; - String plannedCourseString = null; - PlannedCourseBean[] plannedCourseBeans1 = new PlannedCourseBean[plannedCourseBeans.size()]; - plannedCourseBeans.toArray(plannedCourseBeans1); - try { - plannedCourseString = SerializeUtil.serialize(plannedCourseBeans1); - } catch (IOException e) { - e.printStackTrace(); - } - if (plannedCourseString != null) { - editor.putString(PLANNED_COURSE_STRING, plannedCourseString); - editor.apply(); - } - } - - //已选课程 - public List getSelectedCourseBeans() { - if (selectedCoursesBeans == null) { - selectedCoursesBeans = new ArrayList<>(); - } - return selectedCoursesBeans; - } - - public void setSelectedCoursesBeans(List selectedCoursesBeans) { - this.selectedCoursesBeans = selectedCoursesBeans; - String selectCourseString = null; - SelectedCourseBean[] selectedCourseBeans1 = new SelectedCourseBean[selectedCoursesBeans.size()]; - selectedCoursesBeans.toArray(selectedCourseBeans1); - try { - selectCourseString = SerializeUtil.serialize(selectedCourseBeans1); - } catch (IOException e) { - e.printStackTrace(); - } - if (selectCourseString != null) { - editor.putString(SELECTED_COURSE, selectCourseString); - editor.apply(); - } - } - - public List getTermBeans() { - if (termBeans == null) { - termBeans = new ArrayList<>(); - } - return termBeans; - } - - public void setTermBeans(List termBeans) { - this.termBeans = termBeans; - String termString = null; - TermBean[] termBeans1 = new TermBean[termBeans.size()]; - termBeans.toArray(termBeans1); - try { - termString = SerializeUtil.serialize(termBeans1); - } catch (Exception e) { - e.printStackTrace(); - } - if (termString != null) { - editor.putString(ALL_TERM, termString); - editor.apply(); - } - } - - public float[] getGrades() { - if (grades == null) { - grades = new float[]{100, 100, 100, 100, 100, 100, 100}; - } - return grades; - } - - public void setGrades(float[] grades) { - this.grades = grades; - String gradesString = null; - try { - gradesString = SerializeUtil.serialize(grades); - } catch (IOException e) { - e.printStackTrace(); - } - if (gradesString != null) { - editor.putString(GRADES_STRING, gradesString); - editor.apply(); - } - } - - /** - * 清除数据 - * - * @param name 空间名称 - */ - public void deleteData(String name) { - editor.putString(name, null); - editor.apply(); - } -} diff --git a/app/src/main/java/top/yvyan/guettable/data/ScheduleData.java b/app/src/main/java/top/yvyan/guettable/data/ScheduleData.java index bead51de1b5c06478ed2f4134d9790f5228dceb4..e328c0c847ed7394d2b1d92c885ec768e1bd17e3 100644 --- a/app/src/main/java/top/yvyan/guettable/data/ScheduleData.java +++ b/app/src/main/java/top/yvyan/guettable/data/ScheduleData.java @@ -1,270 +1,89 @@ package top.yvyan.guettable.data; -import android.annotation.SuppressLint; -import android.content.Context; -import android.content.SharedPreferences; +import com.google.gson.reflect.TypeToken; +import com.tencent.mmkv.MMKV; -import java.io.IOException; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import top.yvyan.guettable.bean.CourseBean; import top.yvyan.guettable.bean.ExamBean; -import top.yvyan.guettable.util.SerializeUtil; -public class ScheduleData { - private static ScheduleData scheduleData; - private static final String SHP_NAME = "ClassData"; - private static final String CLASS_STRING = "classString"; - private static final String LIB_STRING = "libString"; - private static final String EXAM_STRING = "examString"; - private static final String USER_COURSE_NO = "userCourseNo"; - private static final String USER_COURSE_BEANS = "userCourseBeans"; - private final SharedPreferences sharedPreferences; - private final SharedPreferences.Editor editor; +public class ScheduleData extends BaseData { + private static final String MAIN_KEY = "ScheduleData."; + private static final String CLASS_STRING = MAIN_KEY + "classString"; + private static final String LIB_STRING = MAIN_KEY + "libString"; + private static final String EXAM_STRING = MAIN_KEY + "examString"; + private static final String USER_COURSE_NO = MAIN_KEY + "userCourseNo"; + private static final String USER_COURSE_BEANS = MAIN_KEY + "userCourseBeans"; - private List courseBeans; - private List libBeans; - private List examBeans; - private long userCourseNo; - private List userCourseBeans; - private boolean isUpdate = false; //用于同步数据后周课表继续刷新 - - @SuppressLint("CommitPrefEdits") - private ScheduleData(Context context) { - sharedPreferences = context.getSharedPreferences(SHP_NAME, Context.MODE_PRIVATE); - editor = sharedPreferences.edit(); - load(); - } - - private void load() { - CourseBean[] courseBeans1 = null; - CourseBean[] libBeans1 = null; - ExamBean[] examBeans1 = null; - CourseBean[] userCourseBeans1 = null; - String classString = sharedPreferences.getString(CLASS_STRING, null); - String libString = sharedPreferences.getString(LIB_STRING, null); - String examString = sharedPreferences.getString(EXAM_STRING, null); - String userCourseString = sharedPreferences.getString(USER_COURSE_BEANS, null); - if (classString != null) { - try { - courseBeans1 = (CourseBean[]) SerializeUtil.serializeToObject(classString); - } catch (IOException | ClassNotFoundException e) { - e.printStackTrace(); - } - if (courseBeans1 != null) { - courseBeans = Arrays.asList(courseBeans1); - courseBeans = new ArrayList<>(courseBeans); - } - } - if (libString != null) { - try { - libBeans1 = (CourseBean[]) SerializeUtil.serializeToObject(libString); - } catch (IOException | ClassNotFoundException e) { - e.printStackTrace(); - } - if (libBeans1 != null) { - libBeans = Arrays.asList(libBeans1); - libBeans = new ArrayList<>(libBeans); - } - } - if (examString != null) { - try { - examBeans1 = (ExamBean[]) SerializeUtil.serializeToObject(examString); - } catch (IOException | ClassNotFoundException e) { - e.printStackTrace(); - } - if (examBeans1 != null) { - examBeans = Arrays.asList(examBeans1); - examBeans = new ArrayList<>(examBeans); - } - } - if (userCourseString != null) { - try { - userCourseBeans1 = (CourseBean[]) SerializeUtil.serializeToObject(userCourseString); - } catch (IOException | ClassNotFoundException e) { - e.printStackTrace(); - } - if (userCourseBeans1 != null) { - userCourseBeans = Arrays.asList(userCourseBeans1); - userCourseBeans = new ArrayList<>(userCourseBeans); - } - } - userCourseNo = sharedPreferences.getLong(USER_COURSE_NO, 1); - } - - public static ScheduleData newInstance(Context context) { - if (scheduleData == null) { - scheduleData = new ScheduleData(context); - } - return scheduleData; - } + private static boolean isUpdate = false; //用于同步数据后周课表继续刷新 //课程信息 - public List getCourseBeans() { - if (courseBeans == null) { - courseBeans = new ArrayList<>(); - } - return courseBeans; + public static List getCourseBeans() { + return get(CLASS_STRING, new TypeToken>() { + }.getType()); } - public void setCourseBeans(List courseBeans) { - this.courseBeans = courseBeans; - String classString = null; - CourseBean[] courseBeans1 = new CourseBean[courseBeans.size()]; - courseBeans.toArray(courseBeans1); - try { - classString = SerializeUtil.serialize(courseBeans1); - } catch (IOException e) { - e.printStackTrace(); - } - if (classString != null) { - editor.putString(CLASS_STRING, classString); - editor.apply(); - } + public static void setCourseBeans(List courseBeans) { + set(CLASS_STRING, courseBeans); } //实验信息 - public List getLibBeans() { - if (libBeans == null) { - libBeans = new ArrayList<>(); - } - return libBeans; + public static List getLibBeans() { + return get(LIB_STRING, new TypeToken>() { + }.getType()); } - public void setLibBeans(List libBeans) { - this.libBeans = libBeans; - String libString = null; - CourseBean[] libBean1 = new CourseBean[libBeans.size()]; - libBeans.toArray(libBean1); - try { - libString = SerializeUtil.serialize(libBean1); - } catch (IOException e) { - e.printStackTrace(); - } - if (libString != null) { - editor.putString(LIB_STRING, libString); - editor.apply(); - } + public static void setLibBeans(List libBeans) { + set(LIB_STRING, libBeans); } //考试安排 - public List getExamBeans() { - if (examBeans == null) { - examBeans = new ArrayList<>(); - } - return examBeans; + public static List getExamBeans() { + return get(EXAM_STRING, new TypeToken>() { + }.getType()); } - public void setExamBeans(List examBeans) { - this.examBeans = examBeans; - String examString = null; - ExamBean[] examBeans1 = new ExamBean[examBeans.size()]; - examBeans.toArray(examBeans1); - try { - examString = SerializeUtil.serialize(examBeans1); - } catch (IOException e) { - e.printStackTrace(); - } - if (examString != null) { - editor.putString(EXAM_STRING, examString); - editor.apply(); - } - } - - /** - * 通过现有课程数据计算最大周数 - * - * @return 最大周数 - */ - public int getMaxWeek() { - int maxWeek = 0; - try { - if (courseBeans != null) { - for (CourseBean courseBean : courseBeans) { - if (courseBean.getWeekEnd() > maxWeek) { - maxWeek = courseBean.getWeekEnd(); - } - } - } - if (libBeans != null) { - for (CourseBean courseBean : libBeans) { - if (courseBean.getWeekEnd() > maxWeek) { - maxWeek = courseBean.getWeekEnd(); - } - } - } - if (userCourseBeans != null) { - for (CourseBean courseBean : userCourseBeans) { - if (courseBean.getWeekEnd() > maxWeek) { - maxWeek = courseBean.getWeekEnd(); - } - } - } - if (examBeans != null) { - for (ExamBean examBean : examBeans) { - if (examBean.getWeek() > maxWeek) { - maxWeek = examBean.getWeek(); - } - } - } - if (maxWeek > 25) { - maxWeek = 25; - } - return maxWeek; - } catch (Exception e) { - return 0; - } + public static void setExamBeans(List examBeans) { + set(EXAM_STRING, examBeans); } //用户自定义课程 - public List getUserCourseBeans() { - if (userCourseBeans == null) { - userCourseBeans = new ArrayList<>(); - } - return userCourseBeans; + public static List getUserCourseBeans() { + return get(USER_COURSE_BEANS, new TypeToken>() { + }.getType()); } - public void setUserCourseBeans(List userCourseBeans) { - this.userCourseBeans = userCourseBeans; - String userCourseString = null; - CourseBean[] userCourseBeans1 = new CourseBean[userCourseBeans.size()]; - userCourseBeans.toArray(userCourseBeans1); - try { - userCourseString = SerializeUtil.serialize(userCourseBeans1); - } catch (IOException e) { - e.printStackTrace(); - } - if (userCourseString != null) { - editor.putString(USER_COURSE_BEANS, userCourseString); - editor.apply(); - } + public static void setUserCourseBeans(List userCourseBeans) { + set(USER_COURSE_BEANS, userCourseBeans); } - public void deleteInputCourse() { + public static void deleteInputCourse() { setCourseBeans(new ArrayList<>()); setLibBeans(new ArrayList<>()); setExamBeans(new ArrayList<>()); } - public void deleteUserCourse() { + public static void deleteUserCourse() { setUserCourseNo(1); setUserCourseBeans(new ArrayList<>()); } - public long getUserCourseNo() { + public static long getUserCourseNo() { + MMKV mmkv = MMKV.defaultMMKV(); + long userCourseNo = mmkv.decodeLong(USER_COURSE_NO, 1); setUserCourseNo(userCourseNo + 1); return userCourseNo; } - public void setUserCourseNo(long userCourseNo) { - this.userCourseNo = userCourseNo; - editor.putLong(USER_COURSE_NO, userCourseNo); - editor.apply(); + public static void setUserCourseNo(long userCourseNo) { + MMKV mmkv = MMKV.defaultMMKV(); + mmkv.encode(USER_COURSE_NO, userCourseNo); } - public void deleteUserCourse(long id) { + public static void deleteUserCourse(long id) { + List userCourseBeans = getUserCourseBeans(); for (int i = 0; i < userCourseBeans.size(); i++) { if (userCourseBeans.get(i).getId() == id) { userCourseBeans.remove(i); @@ -274,11 +93,52 @@ public class ScheduleData { } } - public boolean isUpdate() { + /** + * 通过现有课程数据计算最大周数 + * + * @return 最大周数 + */ + public static int getMaxWeek() { + int maxWeek = 0; + List courseBeans = getCourseBeans(); + List libBeans = getLibBeans(); + List userCourseBeans = getUserCourseBeans(); + List examBeans = getExamBeans(); + try { + for (CourseBean courseBean : courseBeans) { + if (courseBean.getWeekEnd() > maxWeek) { + maxWeek = courseBean.getWeekEnd(); + } + } + for (CourseBean courseBean : libBeans) { + if (courseBean.getWeekEnd() > maxWeek) { + maxWeek = courseBean.getWeekEnd(); + } + } + for (CourseBean courseBean : userCourseBeans) { + if (courseBean.getWeekEnd() > maxWeek) { + maxWeek = courseBean.getWeekEnd(); + } + } + for (ExamBean examBean : examBeans) { + if (examBean.getWeek() > maxWeek) { + maxWeek = examBean.getWeek(); + } + } + if (maxWeek > 25) { + maxWeek = 25; + } + return maxWeek; + } catch (Exception e) { + return 0; + } + } + + public static boolean isUpdate() { return isUpdate; } - public void setUpdate(boolean update) { + public static void setUpdate(boolean update) { isUpdate = update; } } diff --git a/app/src/main/java/top/yvyan/guettable/data/TokenData.java b/app/src/main/java/top/yvyan/guettable/data/TokenData.java index d5abe6b0711b4e9f3ac3c55bc80f40e26a517010..272896aeeb9723ff84e0459175d6ec314a70a75f 100644 --- a/app/src/main/java/top/yvyan/guettable/data/TokenData.java +++ b/app/src/main/java/top/yvyan/guettable/data/TokenData.java @@ -16,24 +16,27 @@ public class TokenData { private static final String SHP_NAME = "tokenData"; - private static final String CAS_Cookie = "CASCookie"; + private static final String CAS_TGTToken = "TGTToken"; + private static final String VPN_TOKEN = "VPNToken"; private static final String BKJW_COOKIE = "bkjwCookie"; private static final String IS_DEVELOP = "isDevelop"; - + private static final String MULTIFACTOR_USERS = "MFACookie"; private final AccountData accountData; - public static boolean isVPN = true; + private static boolean isVPN = true; //开发者调试 private boolean isDevelop; //强制获取vpn private boolean forceVPN = false; - private String CASCookie; // 新版CAS认证Cookie; CASTGT/JSESSION + private String TGTToken; // CAS-TGT private String VPNToken; //VPN认证Token private String bkjwCookie; //教务系统认证Cookie + private String MFACookie; + public String getCookie() { if (isVPN) { return VPNToken; @@ -42,8 +45,12 @@ public class TokenData { } } - public boolean isVPN() { - return !isVPN; + public static boolean isVPN() { + return isVPN; + } + + public static void setIsVPN(boolean isVPN) { + TokenData.isVPN = isVPN; } /** @@ -68,7 +75,8 @@ public class TokenData { VPNToken = sharedPreferences.getString(VPN_TOKEN, null); bkjwCookie = sharedPreferences.getString(BKJW_COOKIE, null); isDevelop = sharedPreferences.getBoolean(IS_DEVELOP, false); - CASCookie = sharedPreferences.getString(CAS_Cookie, ""); + TGTToken = sharedPreferences.getString(CAS_TGTToken, null); + MFACookie = sharedPreferences.getString(MULTIFACTOR_USERS, null); } public static TokenData newInstance(Context context) { @@ -110,6 +118,20 @@ public class TokenData { * @return 登录结果 */ private int loginBySmart() { + //尝试获取教务系统ST + int n; + String ST_BKJW = StaticService.SSOGetST(context, TGTToken, context.getResources().getString(R.string.service_bkjw), MFACookie); + if (!ST_BKJW.contains("ST-")) { // TGT失效 + n = refreshTGT(); + if (n != 0) { + return n; + } + ST_BKJW = StaticService.SSOGetST(context, TGTToken, context.getResources().getString(R.string.service_bkjw), MFACookie); + if (!ST_BKJW.contains("ST-")) { + return -2; + } + } + if (isVPN) { //外网 //获取VPN的token String VPNTokenStr = Net.getVPNToken(context); @@ -118,42 +140,26 @@ public class TokenData { } else { return -2; } - int n = loginVpnByCAS(VPNTokenStr); - //登录教务 - if (n == 0) { - String ST_BKJW = StaticService.SSOGetST(context, CASCookie, context.getResources().getString(R.string.service_bkjw), VPNTokenStr); - if (ST_BKJW.equals("ERROR0")) { - return -2; - } else if (ST_BKJW.equals("ERROR1")) { //TGT失效 - n = refreshTGT(VPNTokenStr); - if (n == 0) { - ST_BKJW = StaticService.SSOGetST(context, CASCookie, context.getResources().getString(R.string.service_bkjw), VPNTokenStr); - if (!ST_BKJW.contains("ST-")) { - return -2; - } - } else { - return n; - } - } - n = StaticService.loginBkjwVPNST(ST_BKJW, VPNToken); - if (n != 0) { - n = StaticService.loginBkjwVPNST(ST_BKJW, VPNToken); - } + //获取VPN-ST + String ST_VPN = StaticService.SSOGetST(context, TGTToken, context.getResources().getString(R.string.service_vpn), MFACookie); + if (!ST_VPN.contains("ST-")) { + return -2; + } + n = StaticService.loginVPNST(context, ST_VPN, VPNTokenStr); + if (n != 0) { + n = StaticService.loginVPNST(context, ST_VPN, VPNTokenStr); + } + if (n != 0) { + return n; + } + n = StaticService.loginBkjwVPNST(context, ST_BKJW, VPNToken); + if (n != 0) { + n = StaticService.loginBkjwVPNST(context, ST_BKJW, VPNToken); } return n; - } else { // 内网 + + } else { //内网 StringBuilder cookie_builder = new StringBuilder(); - String ST_BKJW = StaticService.SSOGetST(context, CASCookie, context.getResources().getString(R.string.service_bkjw), null); - if (!ST_BKJW.contains("ST-")) { // TGT失效 - int n = refreshTGT(null); - if (n != 0) { - return n; - } - ST_BKJW = StaticService.SSOGetST(context, CASCookie, context.getResources().getString(R.string.service_bkjw), null); - if (!ST_BKJW.contains("ST-")) { // 网络错误,切换为外网模式 - return -2; - } - } int state = StaticService.loginBkjw(context, ST_BKJW, cookie_builder); if (state == 0) { setBkjwCookie(cookie_builder.toString()); @@ -165,61 +171,76 @@ public class TokenData { } /** - * 使用CAS登录VPN + * 刷新TGT令牌 * - * @param VPNTokenStr vpn的Token - * @return 登录结果 + * @return 操作结果 */ - private int loginVpnByCAS(String VPNTokenStr) { - int n; - String ST_VPN = StaticService.SSOGetST(context, CASCookie, context.getResources().getString(R.string.service_vpn), VPNTokenStr); - if (ST_VPN.equals("ERROR0")) { + public int refreshTGT() { + String TGTTokenStr = StaticService.SSOLogin(context, accountData.getUsername(), accountData.getPwd(),TGTToken, MFACookie); + if (TGTTokenStr.equals("ERROR2") || TGTTokenStr.equals("ERROR0")) { return -2; - } else if (ST_VPN.equals("ERROR1")) { //TGT失效 - n = refreshTGT(VPNTokenStr); //刷新TGT - if (n == 0) { - //重新获取登录vpn的st令牌 - ST_VPN = StaticService.SSOGetST(context, CASCookie, context.getResources().getString(R.string.service_vpn), VPNTokenStr); - if (!ST_VPN.contains("ST-")) { - return -2; - } - if (StaticService.loginVPNST(ST_VPN, VPNTokenStr) != 0) { - return StaticService.loginVPNST(ST_VPN, VPNTokenStr); - } - return 0; + } + if (TGTTokenStr.contains("TGT-")) { + if (TGTTokenStr.contains("ERROR5")) { + setTGTToken(TGTTokenStr.substring(TGTTokenStr.indexOf(";") + 1)); + return bypass2FA(accountData.getPwd(), TGTTokenStr.substring(TGTTokenStr.indexOf(";") + 1)); } else { - return n; - } - } else { - if (StaticService.loginVPNST(ST_VPN, VPNTokenStr) != 0) { - return StaticService.loginVPNST(ST_VPN, VPNTokenStr); + setTGTToken(TGTTokenStr); } return 0; + } else { + return -1; } } /** - * 刷新TGT令牌 - * - * @param VPNToken VPNToken - * @return 操作结果 + * bypass 2FA */ - public int refreshTGT(String VPNToken) { - String CASCookieStr = StaticService.SSOLogin(context, accountData.getUsername(), accountData.getVPNPwd(), VPNToken); - if (CASCookieStr.equals("ERROR2") || CASCookieStr.equals("ERROR0")) { - return -2; - } - if (CASCookieStr.contains("TGT-")) { - setCASCookie(CASCookieStr); + private int bypass2FA(String password, String CASCookie) { + try { + String MultiFactorAuth = StaticService.bypass2FA(context, password, CASCookie); + if (MultiFactorAuth.contains("ERROR")) { + return -1; + } else { + setMFACookie(MultiFactorAuth); + } + return 0; + } catch (Exception ignore) { return 0; + } + } + + public int setVPNCASCookie() { + return (MFACookie != null ? StaticService.CookieSet(context, "cas.guet.edu.cn", "/authserver/login", MFACookie, VPNToken) : 0) | StaticService.CookieSet(context, "cas.guet.edu.cn", "/authserver/login", TGTToken, VPNToken); + } + + public String getCASCookie() { + return (MFACookie != null ? MFACookie : "") + (TGTToken != null ? ((MFACookie!=null ? "; " : "")+TGTToken) : ""); + } + + public String getTGTToken() { + return TGTToken; + } + + public String getMFACookie() { + return MFACookie; + } + + public void setTGTToken(String CASCookie) { + String tTGTToken = CASCookie.substring(CASCookie.indexOf("CASTGC=")); + int TGTTokenEndIndex = tTGTToken.indexOf(";"); + if (TGTTokenEndIndex >= 0) { + TGTToken = tTGTToken.substring(0, TGTTokenEndIndex); } else { - return -1; + TGTToken = tTGTToken; } + editor.putString(CAS_TGTToken, TGTToken); + editor.apply(); } - public void setCASCookie(String CASCookie) { - this.CASCookie = CASCookie; - editor.putString(CAS_Cookie, CASCookie); + public void setMFACookie(String MFACookie) { + this.MFACookie = MFACookie; + editor.putString(MULTIFACTOR_USERS, MFACookie); editor.apply(); } diff --git a/app/src/main/java/top/yvyan/guettable/fragment/CourseTableFragment.java b/app/src/main/java/top/yvyan/guettable/fragment/CourseTableFragment.java index 96e229c0d2c2766b3247a1d615cc4c5b714e98bf..07d69ae5ab5d8f32c3609a5f5b356aebae2153d0 100644 --- a/app/src/main/java/top/yvyan/guettable/fragment/CourseTableFragment.java +++ b/app/src/main/java/top/yvyan/guettable/fragment/CourseTableFragment.java @@ -23,7 +23,6 @@ import com.zhuangfei.timetable.view.WeekView; import java.util.ArrayList; import java.util.List; -import java.util.Objects; import top.yvyan.guettable.R; import top.yvyan.guettable.activity.AddCourseActivity; @@ -38,8 +37,8 @@ import top.yvyan.guettable.data.SingleSettingData; import top.yvyan.guettable.service.MyOperator; import top.yvyan.guettable.util.AppUtil; import top.yvyan.guettable.util.BackgroundUtil; -import top.yvyan.guettable.util.DensityUtil; import top.yvyan.guettable.util.CourseUtil; +import top.yvyan.guettable.util.DensityUtil; import top.yvyan.guettable.util.ToastUtil; import top.yvyan.guettable.widget.WidgetUtil; @@ -53,9 +52,7 @@ public class CourseTableFragment extends Fragment implements View.OnClickListene private View view; private GeneralData generalData; - private ScheduleData scheduleData; private SingleSettingData singleSettingData; - private DetailClassData detailClassData; private SettingData settingData; //记录切换的周次,不一定是当前周 int target; @@ -73,7 +70,7 @@ public class CourseTableFragment extends Fragment implements View.OnClickListene View addStatus = view.findViewById(R.id.add_status); ViewGroup.LayoutParams lp = addStatus.getLayoutParams(); - lp.height = lp.height + AppUtil.getStatusBarHeight(Objects.requireNonNull(getContext())); + lp.height = lp.height + AppUtil.getStatusBarHeight(requireContext()); addStatus.setLayoutParams(lp); initData(); @@ -84,16 +81,14 @@ public class CourseTableFragment extends Fragment implements View.OnClickListene mWeekView = view.findViewById(R.id.id_weekview); mWeekView.setVisibility(View.VISIBLE); mTimetableView = view.findViewById(R.id.id_timetableView); - setBackground(BackgroundUtil.isSetBackground(getContext())); + setBackground(BackgroundUtil.isSetBackground(requireContext())); initTimetableView(); return view; } private void initData() { generalData = GeneralData.newInstance(getActivity()); - scheduleData = ScheduleData.newInstance(getActivity()); singleSettingData = SingleSettingData.newInstance(getActivity()); - detailClassData = DetailClassData.newInstance(); settingData = SettingData.newInstance(getActivity()); } @@ -138,8 +133,8 @@ public class CourseTableFragment extends Fragment implements View.OnClickListene } else { generalData.setWeek(target); mWeekView.curWeek(target).updateView(); - scheduleData.setUpdate(true); - WidgetUtil.notifyWidgetUpdate(this.getActivity()); + ScheduleData.setUpdate(true); + WidgetUtil.notifyWidgetUpdate(this.requireActivity()); ToastUtil.showToast(getActivity(), "设置第" + target + "周为当前周"); mTimetableView.changeWeekForce(target); } @@ -151,7 +146,7 @@ public class CourseTableFragment extends Fragment implements View.OnClickListene .curWeek(generalData.getWeek()) .maxSlideItem(12) .monthWidthDp(18) - .itemHeight(DensityUtil.dip2px(Objects.requireNonNull(getContext()), singleSettingData.getItemLength())) + .itemHeight(DensityUtil.dip2px(requireContext(), singleSettingData.getItemLength())) .callback(new OnItemBuildAdapter() { @Override public String getItemText(Schedule schedule, boolean isThisWeek) { @@ -208,27 +203,27 @@ public class CourseTableFragment extends Fragment implements View.OnClickListene @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); - if (isVisibleToUser && scheduleData != null && scheduleData.isUpdate()) { + if (isVisibleToUser && ScheduleData.isUpdate()) { updateTable(); - scheduleData.setUpdate(false); + ScheduleData.setUpdate(false); } } public void updateTable() { List schedules = new ArrayList<>(); - for (CourseBean courseBean : scheduleData.getCourseBeans()) { + for (CourseBean courseBean : ScheduleData.getCourseBeans()) { schedules.add(courseBean.getSchedule()); } - for (CourseBean courseBean : scheduleData.getUserCourseBeans()) { + for (CourseBean courseBean : ScheduleData.getUserCourseBeans()) { schedules.add(courseBean.getSchedule()); } if (settingData.getShowLibOnTable()) { - for (CourseBean courseBean : scheduleData.getLibBeans()) { + for (CourseBean courseBean : ScheduleData.getLibBeans()) { schedules.add(courseBean.getSchedule()); } } if (settingData.getShowExamOnTable()) { - for (ExamBean examBean : CourseUtil.combineExam(scheduleData.getExamBeans())) { + for (ExamBean examBean : CourseUtil.combineExam(ScheduleData.getExamBeans())) { if (examBean != null && examBean.getWeek() != 0) { schedules.add(examBean.getSchedule()); } @@ -250,7 +245,7 @@ public class CourseTableFragment extends Fragment implements View.OnClickListene * @param beans beans */ protected void display(List beans) { - detailClassData.setCourseBeans(beans); + DetailClassData.setCourseBeans(beans); Intent intent = new Intent(getContext(), DetailActivity.class); intent.putExtra("week", target); startActivityForResult(intent, DetailActivity.REQUEST_CODE); @@ -269,10 +264,10 @@ public class CourseTableFragment extends Fragment implements View.OnClickListene super.onActivityResult(requestCode, resultCode, data); if (requestCode == AddCourseActivity.REQUEST_CODE && resultCode == AddCourseActivity.ADD) { updateTable(); - scheduleData.setUpdate(true); + ScheduleData.setUpdate(true); } else if (requestCode == DetailActivity.REQUEST_CODE && resultCode == DetailActivity.ALTER) { updateTable(); - scheduleData.setUpdate(true); + ScheduleData.setUpdate(true); } } @@ -280,7 +275,7 @@ public class CourseTableFragment extends Fragment implements View.OnClickListene * 显示弹出菜单 */ public void showPopMenu() { - PopupMenu popup = new PopupMenu(Objects.requireNonNull(getActivity()), moreButton); + PopupMenu popup = new PopupMenu(requireActivity(), moreButton); popup.getMenuInflater().inflate(R.menu.course_table_popmenu, popup.getMenu()); if (singleSettingData.isHideOtherWeek()) { popup.getMenu().findItem(R.id.course_tab_top1).setTitle("显示非本周课程"); diff --git a/app/src/main/java/top/yvyan/guettable/fragment/DayClassFragment.java b/app/src/main/java/top/yvyan/guettable/fragment/DayClassFragment.java index ff5b36929ca9f9d44aa4a62ea9d53e08f3d2a003..e5dbcdb06b820ef8f0e683cee4c261d26a963de1 100644 --- a/app/src/main/java/top/yvyan/guettable/fragment/DayClassFragment.java +++ b/app/src/main/java/top/yvyan/guettable/fragment/DayClassFragment.java @@ -28,7 +28,6 @@ import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; -import java.util.Objects; import top.yvyan.guettable.MainActivity; import top.yvyan.guettable.R; @@ -47,7 +46,6 @@ import top.yvyan.guettable.service.AutoUpdate; import top.yvyan.guettable.service.CommFunc; import top.yvyan.guettable.util.AppUtil; import top.yvyan.guettable.util.BackgroundUtil; -import top.yvyan.guettable.util.DialogUtil; import top.yvyan.guettable.util.CourseUtil; import top.yvyan.guettable.util.TimeUtil; import top.yvyan.guettable.util.ToastUtil; @@ -70,7 +68,6 @@ public class DayClassFragment extends Fragment implements View.OnClickListener { private AccountData accountData; private GeneralData generalData; private SettingData settingData; - private ScheduleData scheduleData; public static DayClassFragment newInstance() { return new DayClassFragment(); @@ -88,9 +85,9 @@ public class DayClassFragment extends Fragment implements View.OnClickListener { @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); - if (isVisibleToUser && scheduleData != null && scheduleData.isUpdate()) { + if (isVisibleToUser && ScheduleData.isUpdate()) { onStart(); - scheduleData.setUpdate(false); + ScheduleData.setUpdate(false); } } @@ -105,7 +102,7 @@ public class DayClassFragment extends Fragment implements View.OnClickListener { initData(); View addStatus = view.findViewById(R.id.add_status); ViewGroup.LayoutParams lp = addStatus.getLayoutParams(); - lp.height = lp.height + AppUtil.getStatusBarHeight(Objects.requireNonNull(getContext())); + lp.height = lp.height + AppUtil.getStatusBarHeight(requireContext()); addStatus.setLayoutParams(lp); textView = view.findViewById(R.id.day_class_hint); @@ -134,13 +131,12 @@ public class DayClassFragment extends Fragment implements View.OnClickListener { accountData = AccountData.newInstance(getActivity()); generalData = GeneralData.newInstance(getActivity()); settingData = SettingData.newInstance(getActivity()); - scheduleData = ScheduleData.newInstance(getActivity()); } /** * 更新日课表视图 */ - @SuppressLint("SetTextI18n") + @SuppressLint({"SetTextI18n", "NotifyDataSetChanged"}) public void updateView(int... order) { List allClass = getData(); List todayList, tomorrowList; @@ -174,7 +170,7 @@ public class DayClassFragment extends Fragment implements View.OnClickListener { //更新考试剩余时间信息 try { - List examBeans = scheduleData.getExamBeans(); + List examBeans = ScheduleData.getExamBeans(); examBeans = CourseUtil.combineExam(examBeans); examBeans = CourseUtil.ridOfOutdatedExam(examBeans); if (examBeans.size() != 0) { @@ -244,12 +240,8 @@ public class DayClassFragment extends Fragment implements View.OnClickListener { startActivity(intent); break; case R.id.day_credits: - if (generalData.isInternational()) { - DialogUtil.showTextDialog(getContext(), "国际学院教务系统暂无此功能"); - } else { - intent = new Intent(getContext(), GradesActivity.class); - startActivity(intent); - } + intent = new Intent(getContext(), GradesActivity.class); + startActivity(intent); break; default: ToastUtil.showToast(getContext(), "敬请期待!"); @@ -267,24 +259,20 @@ public class DayClassFragment extends Fragment implements View.OnClickListener { */ private List getData() { List list; - //防止出现空指针闪退 - if (scheduleData == null) { - initData(); - } - if (!scheduleData.getCourseBeans().isEmpty()) { - list = ScheduleSupport.transform(scheduleData.getCourseBeans()); + if (!ScheduleData.getCourseBeans().isEmpty()) { + list = ScheduleSupport.transform(ScheduleData.getCourseBeans()); } else { list = new ArrayList<>(); } - for (CourseBean courseBean : scheduleData.getUserCourseBeans()) { + for (CourseBean courseBean : ScheduleData.getUserCourseBeans()) { list.add(courseBean.getSchedule()); } if (settingData.getShowLibOnTable()) { - List labList = ScheduleSupport.transform(scheduleData.getLibBeans()); + List labList = ScheduleSupport.transform(ScheduleData.getLibBeans()); list.addAll(labList); } if (settingData.getShowExamOnTable()) { - for (ExamBean examBean : CourseUtil.combineExam(scheduleData.getExamBeans())) { + for (ExamBean examBean : CourseUtil.combineExam(ScheduleData.getExamBeans())) { if (examBean != null && examBean.getWeek() != 0) { list.add(examBean.getSchedule()); } @@ -297,7 +285,7 @@ public class DayClassFragment extends Fragment implements View.OnClickListener { public void onStart() { try { super.onStart(); - setBackground(BackgroundUtil.isSetBackground(Objects.requireNonNull(getContext()))); + setBackground(BackgroundUtil.isSetBackground(requireContext())); initData(); autoUpdate.updateView(); try { diff --git a/app/src/main/java/top/yvyan/guettable/fragment/MoreFragment.java b/app/src/main/java/top/yvyan/guettable/fragment/MoreFragment.java index 21b689127947194e527127f1612d888b7268c202..a876d3146b0308d0a8d04adea47f5bf728ff75a7 100644 --- a/app/src/main/java/top/yvyan/guettable/fragment/MoreFragment.java +++ b/app/src/main/java/top/yvyan/guettable/fragment/MoreFragment.java @@ -12,7 +12,6 @@ import androidx.fragment.app.Fragment; import com.umeng.cconfig.UMRemoteConfig; import top.yvyan.guettable.R; -import top.yvyan.guettable.data.GeneralData; import top.yvyan.guettable.data.SingleSettingData; import top.yvyan.guettable.moreFun.CETActivity; import top.yvyan.guettable.moreFun.ExamActivity; @@ -28,7 +27,6 @@ import top.yvyan.guettable.moreFun.SelectedCourseActivity; import top.yvyan.guettable.service.CommFunc; import top.yvyan.guettable.util.AppUtil; import top.yvyan.guettable.util.BackgroundUtil; -import top.yvyan.guettable.util.DialogUtil; import top.yvyan.guettable.util.ToastUtil; public class MoreFragment extends Fragment implements View.OnClickListener { @@ -36,7 +34,6 @@ public class MoreFragment extends Fragment implements View.OnClickListener { private View view; private SingleSettingData singleSettingData; - private GeneralData generalData; public static MoreFragment newInstance() { return new MoreFragment(); @@ -47,7 +44,6 @@ public class MoreFragment extends Fragment implements View.OnClickListener { Bundle savedInstanceState) { view = inflater.inflate(R.layout.fragement_more, container, false); - generalData = GeneralData.newInstance(getContext()); singleSettingData = SingleSettingData.newInstance(getContext()); //透明状态栏 View addStatus = view.findViewById(R.id.add_status); @@ -81,10 +77,6 @@ public class MoreFragment extends Fragment implements View.OnClickListener { return view; } - private void initData() { - generalData = GeneralData.newInstance(getContext()); - } - /** * 设置背景 * @@ -106,7 +98,6 @@ public class MoreFragment extends Fragment implements View.OnClickListener { public void onStart() { super.onStart(); setBackground(BackgroundUtil.isSetBackground(requireContext())); - initData(); } @SuppressLint("NonConstantResourceId") @@ -119,12 +110,8 @@ public class MoreFragment extends Fragment implements View.OnClickListener { startActivity(intent); break; case R.id.more_credits: - if (generalData.isInternational()) { - DialogUtil.showTextDialog(getContext(), "国际学院教务系统暂无此功能"); - } else { - intent = new Intent(getContext(), GradesActivity.class); - startActivity(intent); - } + intent = new Intent(getContext(), GradesActivity.class); + startActivity(intent); break; case R.id.more_test_scores: intent = new Intent(getContext(), ExamScoreActivity.class); @@ -143,12 +130,8 @@ public class MoreFragment extends Fragment implements View.OnClickListener { startActivity(intent); break; case R.id.more_selected_course: - if (generalData.isInternational()) { - DialogUtil.showTextDialog(getContext(), "国际学院教务系统暂无此功能"); - } else { - intent = new Intent(getContext(), SelectedCourseActivity.class); - startActivity(intent); - } + intent = new Intent(getContext(), SelectedCourseActivity.class); + startActivity(intent); break; @@ -169,7 +152,7 @@ public class MoreFragment extends Fragment implements View.OnClickListener { CommFunc.noLoginWebVPN(getActivity()); break; case R.id.more_url_campus: - openBrowser(requireContext().getResources().getString(R.string.url_smart_campus)); + CommFunc.noLoginWebICampus(getActivity()); break; case R.id.more_url_lijiang: diff --git a/app/src/main/java/top/yvyan/guettable/moreFun/CETActivity.java b/app/src/main/java/top/yvyan/guettable/moreFun/CETActivity.java index 7d169f8dc0d2c52c3f26cd59849b562b2484dc17..d2d7c8535e71b3fdcd359aa4be4d822b19a45ae2 100644 --- a/app/src/main/java/top/yvyan/guettable/moreFun/CETActivity.java +++ b/app/src/main/java/top/yvyan/guettable/moreFun/CETActivity.java @@ -9,7 +9,7 @@ import java.util.List; import top.yvyan.guettable.R; import top.yvyan.guettable.adapter.CETAdapter; import top.yvyan.guettable.bean.CETBean; -import top.yvyan.guettable.data.MoreDate; +import top.yvyan.guettable.data.MoreData; import top.yvyan.guettable.service.fetch.StaticService; import top.yvyan.guettable.util.AppUtil; import top.yvyan.guettable.util.CourseUtil; @@ -18,22 +18,18 @@ import static com.xuexiang.xui.XUI.getContext; public class CETActivity extends BaseFuncActivity { - private MoreDate moreDate; - @Override protected void childInit() { setTitle(getResources().getString(R.string.moreFun_cet)); setShowMore(false); AppUtil.reportFunc(getApplicationContext(), getString(R.string.moreFun_cet)); - - moreDate = MoreDate.newInstance(getApplicationContext()); } @Override protected void showContent() { baseSetContentView(R.layout.recycler_view); RecyclerView recyclerView = findViewById(R.id.recycler_view_info); - List cetBeans = moreDate.getCetBeans(); + List cetBeans = MoreData.getCetBeans(); if (cetBeans.size() == 0) { showEmptyPage(); } else { @@ -50,8 +46,8 @@ public class CETActivity extends BaseFuncActivity { if (cetBeans != null) { CourseUtil.BeanAttributeUtil beanAttributeUtil = new CourseUtil.BeanAttributeUtil(); Collections.sort(cetBeans, beanAttributeUtil); - if (!AppUtil.equalList(cetBeans, moreDate.getCetBeans())) { - moreDate.setCetBeans(cetBeans); + if (!AppUtil.equalList(cetBeans, MoreData.getCetBeans())) { + MoreData.setCetBeans(cetBeans); } return 5; } diff --git a/app/src/main/java/top/yvyan/guettable/moreFun/ExamActivity.java b/app/src/main/java/top/yvyan/guettable/moreFun/ExamActivity.java index 3086f2438c5b9b37f9e57eb5e55c188dcd36950e..fb74955db6bd5991ca25081b2c7bc099140eccc6 100644 --- a/app/src/main/java/top/yvyan/guettable/moreFun/ExamActivity.java +++ b/app/src/main/java/top/yvyan/guettable/moreFun/ExamActivity.java @@ -27,7 +27,6 @@ import static com.xuexiang.xui.XUI.getContext; public class ExamActivity extends BaseFuncActivity { private GeneralData generalData; - private ScheduleData scheduleData; private SingleSettingData singleSettingData; @Override @@ -38,7 +37,6 @@ public class ExamActivity extends BaseFuncActivity { AppUtil.reportFunc(getApplicationContext(), getString(R.string.moreFun_test_schedule)); generalData = GeneralData.newInstance(this); - scheduleData = ScheduleData.newInstance(this); singleSettingData = SingleSettingData.newInstance(this); } @@ -46,7 +44,7 @@ public class ExamActivity extends BaseFuncActivity { protected void showContent() { baseSetContentView(R.layout.recycler_view); RecyclerView recyclerView = findViewById(R.id.recycler_view_info); - List examBeans = scheduleData.getExamBeans(); + List examBeans = ScheduleData.getExamBeans(); if (singleSettingData.isCombineExam()) { examBeans = CourseUtil.combineExam(examBeans); } @@ -118,10 +116,10 @@ public class ExamActivity extends BaseFuncActivity { if (examBeans != null) { CourseUtil.BeanAttributeUtil beanAttributeUtil = new CourseUtil.BeanAttributeUtil(); Collections.sort(examBeans, beanAttributeUtil); - if (!AppUtil.equalList(examBeans, scheduleData.getExamBeans())) { - scheduleData.setExamBeans(examBeans); + if (!AppUtil.equalList(examBeans, ScheduleData.getExamBeans())) { + ScheduleData.setExamBeans(examBeans); update = true; - scheduleData.setUpdate(true); + ScheduleData.setUpdate(true); } return 5; } diff --git a/app/src/main/java/top/yvyan/guettable/moreFun/ExamScoreActivity.java b/app/src/main/java/top/yvyan/guettable/moreFun/ExamScoreActivity.java index 1a82385305737808d8c73950769078d59533baf4..3ee922b6b449f97829b8ac7dcf9f9f5c0e7791da 100644 --- a/app/src/main/java/top/yvyan/guettable/moreFun/ExamScoreActivity.java +++ b/app/src/main/java/top/yvyan/guettable/moreFun/ExamScoreActivity.java @@ -13,7 +13,7 @@ import top.yvyan.guettable.R; import top.yvyan.guettable.adapter.ExamScoreAdapter; import top.yvyan.guettable.bean.ExamScoreBean; import top.yvyan.guettable.data.GeneralData; -import top.yvyan.guettable.data.MoreDate; +import top.yvyan.guettable.data.MoreData; import top.yvyan.guettable.data.SingleSettingData; import top.yvyan.guettable.service.fetch.StaticService; import top.yvyan.guettable.util.AppUtil; @@ -23,7 +23,6 @@ import static com.xuexiang.xui.XUI.getContext; public class ExamScoreActivity extends BaseFuncActivity { - private MoreDate moreDate; private GeneralData generalData; private SingleSettingData singleSettingData; @@ -34,7 +33,6 @@ public class ExamScoreActivity extends BaseFuncActivity { openUpdate(); AppUtil.reportFunc(getApplicationContext(), getString(R.string.moreFun_test_scores)); - moreDate = MoreDate.newInstance(this); generalData = GeneralData.newInstance(this); singleSettingData = SingleSettingData.newInstance(this); } @@ -43,7 +41,7 @@ public class ExamScoreActivity extends BaseFuncActivity { protected void showContent() { baseSetContentView(R.layout.activity_exam_score); RecyclerView recyclerView = findViewById(R.id.exam_score_info_recycler_view); - List examScoreBeans = moreDate.getExamScoreBeans(); + List examScoreBeans = MoreData.getExamScoreBeans(); if (singleSettingData.isHideOtherTermExamScore()) { examScoreBeans = CourseUtil.BeanAttributeUtil.hideOtherTerm(examScoreBeans, generalData.getTerm()); } @@ -88,8 +86,8 @@ public class ExamScoreActivity extends BaseFuncActivity { if (examScoreBeans != null) { CourseUtil.BeanAttributeUtil beanAttributeUtil = new CourseUtil.BeanAttributeUtil(); Collections.sort(examScoreBeans, beanAttributeUtil); - if (!AppUtil.equalList(examScoreBeans, moreDate.getExamScoreBeans())) { - moreDate.setExamScoreBeans(examScoreBeans); + if (!AppUtil.equalList(examScoreBeans, MoreData.getExamScoreBeans())) { + MoreData.setExamScoreBeans(examScoreBeans); update = true; } return 5; diff --git a/app/src/main/java/top/yvyan/guettable/moreFun/ExperimentScoreActivity.java b/app/src/main/java/top/yvyan/guettable/moreFun/ExperimentScoreActivity.java index 301fcab0e8362bc84e8b666979d1a4fe26c5b38a..76eb4c436a03d723cee1a980290bd5d75c5647f1 100644 --- a/app/src/main/java/top/yvyan/guettable/moreFun/ExperimentScoreActivity.java +++ b/app/src/main/java/top/yvyan/guettable/moreFun/ExperimentScoreActivity.java @@ -13,7 +13,7 @@ import top.yvyan.guettable.R; import top.yvyan.guettable.adapter.ExperimentScoreAdapter; import top.yvyan.guettable.bean.ExperimentScoreBean; import top.yvyan.guettable.data.GeneralData; -import top.yvyan.guettable.data.MoreDate; +import top.yvyan.guettable.data.MoreData; import top.yvyan.guettable.data.SingleSettingData; import top.yvyan.guettable.service.fetch.StaticService; import top.yvyan.guettable.util.AppUtil; @@ -23,7 +23,6 @@ import static com.xuexiang.xui.XUI.getContext; public class ExperimentScoreActivity extends BaseFuncActivity { - private MoreDate moreDate; private GeneralData generalData; private SingleSettingData singleSettingData; @@ -34,7 +33,6 @@ public class ExperimentScoreActivity extends BaseFuncActivity { openUpdate(); AppUtil.reportFunc(getApplicationContext(), getString(R.string.moreFun_lib_scores)); - moreDate = MoreDate.newInstance(this); generalData = GeneralData.newInstance(this); singleSettingData = SingleSettingData.newInstance(this); } @@ -43,7 +41,7 @@ public class ExperimentScoreActivity extends BaseFuncActivity { protected void showContent() { baseSetContentView(R.layout.activity_experiment_score); RecyclerView recyclerView = findViewById(R.id.experiment_score_info_recycler_view); - List experimentScoreBeans = moreDate.getExperimentScoreBeans(); + List experimentScoreBeans = MoreData.getExperimentScoreBeans(); if (singleSettingData.isHideOtherTermExamScore()) { experimentScoreBeans = CourseUtil.BeanAttributeUtil.hideOtherTerm(experimentScoreBeans, generalData.getTerm()); } @@ -88,8 +86,8 @@ public class ExperimentScoreActivity extends BaseFuncActivity { if (experimentScoreBeans != null) { CourseUtil.BeanAttributeUtil beanAttributeUtil = new CourseUtil.BeanAttributeUtil(); Collections.sort(experimentScoreBeans, beanAttributeUtil); - if (!AppUtil.equalList(experimentScoreBeans, moreDate.getExperimentScoreBeans())) { - moreDate.setExperimentScoreBeans(experimentScoreBeans); + if (!AppUtil.equalList(experimentScoreBeans, MoreData.getExperimentScoreBeans())) { + MoreData.setExperimentScoreBeans(experimentScoreBeans); update = true; } return 5; diff --git a/app/src/main/java/top/yvyan/guettable/moreFun/GradesActivity.java b/app/src/main/java/top/yvyan/guettable/moreFun/GradesActivity.java index 4e04b0b3c60306a93316c52a28a4a667b9b6f9da..519f2680f7d8a51182e37136782f677601572cea 100644 --- a/app/src/main/java/top/yvyan/guettable/moreFun/GradesActivity.java +++ b/app/src/main/java/top/yvyan/guettable/moreFun/GradesActivity.java @@ -6,15 +6,13 @@ import java.text.DecimalFormat; import top.yvyan.guettable.R; import top.yvyan.guettable.data.GeneralData; -import top.yvyan.guettable.data.MoreDate; +import top.yvyan.guettable.data.MoreData; import top.yvyan.guettable.service.fetch.StaticService; import top.yvyan.guettable.util.AppUtil; public class GradesActivity extends BaseFuncActivity { private GeneralData generalData; - private MoreDate moreDate; - @Override protected void childInit() { @@ -23,7 +21,6 @@ public class GradesActivity extends BaseFuncActivity { AppUtil.reportFunc(getApplicationContext(), getString(R.string.moreFun_credits)); generalData = GeneralData.newInstance(this); - moreDate = MoreDate.newInstance(this); } @Override @@ -37,7 +34,7 @@ public class GradesActivity extends BaseFuncActivity { TextView gradesYear5 = findViewById(R.id.grades_year_5); TextView gradesYear6 = findViewById(R.id.grades_year_6); - float[] grades = moreDate.getGrades(); + float[] grades = MoreData.getGrades(); DecimalFormat format = new DecimalFormat("0.00"); gradesMain.setText(format.format(grades[0])); gradesYear1.setText(format.format(grades[1])); @@ -52,7 +49,7 @@ public class GradesActivity extends BaseFuncActivity { public int updateData(String cookie) { float[] grades = StaticService.calculateGrades(this, cookie, Integer.parseInt(generalData.getGrade())); if (grades != null) { - moreDate.setGrades(grades); + MoreData.setGrades(grades); return 5; } else { return 1; diff --git a/app/src/main/java/top/yvyan/guettable/moreFun/LibActivity.java b/app/src/main/java/top/yvyan/guettable/moreFun/LibActivity.java index d7b3c927ce374a5fd1fbe9cf0a339d8f7fdee1f5..3484ba1abd2c9b2e22adc417e90063bb160e87f7 100644 --- a/app/src/main/java/top/yvyan/guettable/moreFun/LibActivity.java +++ b/app/src/main/java/top/yvyan/guettable/moreFun/LibActivity.java @@ -20,7 +20,6 @@ import static com.xuexiang.xui.XUI.getContext; public class LibActivity extends BaseFuncActivity { - private ScheduleData scheduleData; private GeneralData generalData; @Override @@ -28,7 +27,6 @@ public class LibActivity extends BaseFuncActivity { setTitle(getResources().getString(R.string.moreFun_lib_schedule)); AppUtil.reportFunc(getApplicationContext(), getString(R.string.moreFun_lib_schedule)); - scheduleData = ScheduleData.newInstance(this); generalData = GeneralData.newInstance(this); } @@ -36,7 +34,7 @@ public class LibActivity extends BaseFuncActivity { protected void showContent() { baseSetContentView(R.layout.recycler_view); RecyclerView recyclerView = findViewById(R.id.recycler_view_info); - List libBeans = scheduleData.getLibBeans(); + List libBeans = ScheduleData.getLibBeans(); if (libBeans.size() == 0) { showEmptyPage(); } else { @@ -51,8 +49,8 @@ public class LibActivity extends BaseFuncActivity { public int updateData(String cookie) { List libBeans = StaticService.getLab(this, cookie, generalData.getTerm()); if (libBeans != null) { - scheduleData.setLibBeans(libBeans); - scheduleData.setUpdate(true); + ScheduleData.setLibBeans(libBeans); + ScheduleData.setUpdate(true); return 5; } return 1; diff --git a/app/src/main/java/top/yvyan/guettable/moreFun/MoreUrlActivity.java b/app/src/main/java/top/yvyan/guettable/moreFun/MoreUrlActivity.java index 59c5c6cb8c827f114a0c642384e2809e9410304d..ff06c642d587df2f6528b4cef14f805fd18dc4d3 100644 --- a/app/src/main/java/top/yvyan/guettable/moreFun/MoreUrlActivity.java +++ b/app/src/main/java/top/yvyan/guettable/moreFun/MoreUrlActivity.java @@ -88,12 +88,4 @@ public class MoreUrlActivity extends AppCompatActivity { getResources().getString(R.string.url_staff_vpn), null); } - - public void news1(View view) { - openBrowser(getResources().getString(R.string.url_news_1)); - } - - public void news2(View view) { - openBrowser(getResources().getString(R.string.url_new_2)); - } } \ No newline at end of file diff --git a/app/src/main/java/top/yvyan/guettable/moreFun/PlannedCoursesActivity.java b/app/src/main/java/top/yvyan/guettable/moreFun/PlannedCoursesActivity.java index b413ee4fb808306d01f752e4b90619e8b6a227b8..6632af2611f297ecb2dabe6bf8b4cb3fa40746b0 100644 --- a/app/src/main/java/top/yvyan/guettable/moreFun/PlannedCoursesActivity.java +++ b/app/src/main/java/top/yvyan/guettable/moreFun/PlannedCoursesActivity.java @@ -11,7 +11,7 @@ import java.util.List; import top.yvyan.guettable.R; import top.yvyan.guettable.adapter.PlannedCourseAdapter; import top.yvyan.guettable.bean.PlannedCourseBean; -import top.yvyan.guettable.data.MoreDate; +import top.yvyan.guettable.data.MoreData; import top.yvyan.guettable.data.SingleSettingData; import top.yvyan.guettable.service.fetch.StaticService; import top.yvyan.guettable.util.AppUtil; @@ -21,7 +21,6 @@ import static com.xuexiang.xui.XUI.getContext; public class PlannedCoursesActivity extends BaseFuncActivity { - private MoreDate moreDate; private SingleSettingData singleSettingData; @Override @@ -31,7 +30,6 @@ public class PlannedCoursesActivity extends BaseFuncActivity { openUpdate(); AppUtil.reportFunc(getApplicationContext(), getString(R.string.moreFun_plan_courses)); - moreDate = MoreDate.newInstance(this); singleSettingData = SingleSettingData.newInstance(this); } @@ -39,7 +37,7 @@ public class PlannedCoursesActivity extends BaseFuncActivity { protected void showContent() { baseSetContentView(R.layout.activity_planned_courses); RecyclerView recyclerView = findViewById(R.id.planned_course_info_recycler_view); - List plannedCourseBeans = moreDate.getPlannedCourseBeans(); + List plannedCourseBeans = MoreData.getPlannedCourseBeans(); if (singleSettingData.isHideRepeatScore()) { plannedCourseBeans = CourseUtil.ridRepeatScore(plannedCourseBeans); } @@ -81,8 +79,8 @@ public class PlannedCoursesActivity extends BaseFuncActivity { public int updateData(String cookie) { List plannedCourseBeans = StaticService.getPlannedCourseBeans(this, cookie); if (plannedCourseBeans != null) { - if (!AppUtil.equalList(plannedCourseBeans, moreDate.getPlannedCourseBeans())) { - moreDate.setPlannedCourseBeans(plannedCourseBeans); + if (!AppUtil.equalList(plannedCourseBeans, MoreData.getPlannedCourseBeans())) { + MoreData.setPlannedCourseBeans(plannedCourseBeans); update = true; } return 5; diff --git a/app/src/main/java/top/yvyan/guettable/moreFun/ResitActivity.java b/app/src/main/java/top/yvyan/guettable/moreFun/ResitActivity.java index 72b9811764d122049d187fbbaa62bb636d08e240..c09107233c5c928f6aebd173186d6fdbfaa04124 100644 --- a/app/src/main/java/top/yvyan/guettable/moreFun/ResitActivity.java +++ b/app/src/main/java/top/yvyan/guettable/moreFun/ResitActivity.java @@ -8,7 +8,7 @@ import java.util.List; import top.yvyan.guettable.R; import top.yvyan.guettable.adapter.ResitAdapter; import top.yvyan.guettable.bean.ResitBean; -import top.yvyan.guettable.data.MoreDate; +import top.yvyan.guettable.data.MoreData; import top.yvyan.guettable.service.fetch.StaticService; import top.yvyan.guettable.util.AppUtil; @@ -16,22 +16,18 @@ import static com.xuexiang.xui.XUI.getContext; public class ResitActivity extends BaseFuncActivity { - private MoreDate moreDate; - @Override protected void childInit() { setTitle(getResources().getString(R.string.moreFun_resit_schedule)); openUpdate(); AppUtil.reportFunc(getApplicationContext(), getString(R.string.moreFun_resit_schedule)); - - moreDate = MoreDate.newInstance(getApplicationContext()); } @Override protected void showContent() { baseSetContentView(R.layout.recycler_view); RecyclerView recyclerView = findViewById(R.id.recycler_view_info); - List resitBeans = moreDate.getResitBeans(); + List resitBeans = MoreData.getResitBeans(); if (resitBeans.size() == 0) { showEmptyPage(); } else { @@ -45,8 +41,8 @@ public class ResitActivity extends BaseFuncActivity { public int updateData(String cookie) { List resitBeans = StaticService.getResit(this, cookie); if (resitBeans != null) { - if (!AppUtil.equalList(resitBeans, moreDate.getResitBeans())) { - moreDate.setResitBeans(resitBeans); + if (!AppUtil.equalList(resitBeans, MoreData.getResitBeans())) { + MoreData.setResitBeans(resitBeans); update = true; } return 5; diff --git a/app/src/main/java/top/yvyan/guettable/moreFun/SelectedCourseActivity.java b/app/src/main/java/top/yvyan/guettable/moreFun/SelectedCourseActivity.java index 99f6b9d128a2d6ad3c882a5ea9b2a1b5af8d550f..58a7124e64608fd661e3740e0a64e7b5f1fafd5a 100644 --- a/app/src/main/java/top/yvyan/guettable/moreFun/SelectedCourseActivity.java +++ b/app/src/main/java/top/yvyan/guettable/moreFun/SelectedCourseActivity.java @@ -15,7 +15,7 @@ import top.yvyan.guettable.adapter.SelectedCourseAdapter; import top.yvyan.guettable.bean.SelectedCourseBean; import top.yvyan.guettable.bean.TermBean; import top.yvyan.guettable.data.GeneralData; -import top.yvyan.guettable.data.MoreDate; +import top.yvyan.guettable.data.MoreData; import top.yvyan.guettable.data.TokenData; import top.yvyan.guettable.service.IMoreFun; import top.yvyan.guettable.service.fetch.StaticService; @@ -26,7 +26,6 @@ public class SelectedCourseActivity extends BaseFuncActivity implements IMoreFun private GeneralData generalData; private TokenData tokenData; - private MoreDate moreDate; private MaterialSpinner spinner; private SelectedCourseAdapter adapter; private List terms; @@ -40,7 +39,6 @@ public class SelectedCourseActivity extends BaseFuncActivity implements IMoreFun setShowMore(false); generalData = GeneralData.newInstance(this); tokenData = TokenData.newInstance(this); - moreDate = MoreDate.newInstance(this); terms = new ArrayList<>(); curTerm = generalData.getTerm(); } @@ -48,7 +46,7 @@ public class SelectedCourseActivity extends BaseFuncActivity implements IMoreFun @Override protected void showContent() { baseSetContentView(R.layout.activity_selected_course); - List selectedCourseBeans = moreDate.getSelectedCourseBeans(); + List selectedCourseBeans = MoreData.getSelectedCourseBeans(); spinner = findViewById(R.id.spinner_course_term); rv = findViewById(R.id.rv_selected_course); rv.setLayoutManager(new LinearLayoutManager(this)); @@ -85,7 +83,7 @@ public class SelectedCourseActivity extends BaseFuncActivity implements IMoreFun if (selectedCourseBeans != null) { CourseUtil.BeanAttributeUtil beanAttributeUtil = new CourseUtil.BeanAttributeUtil(); Collections.sort(selectedCourseBeans, beanAttributeUtil); - moreDate.setSelectedCoursesBeans(selectedCourseBeans); + MoreData.setSelectedCoursesBeans(selectedCourseBeans); update = true; return 5; } @@ -121,7 +119,7 @@ public class SelectedCourseActivity extends BaseFuncActivity implements IMoreFun // 初始化学期集合 private void initTerm() { - List termBeans = moreDate.getTermBeans(); + List termBeans = MoreData.getTermBeans(); String grade = generalData.getGrade(); if (grade == null) { return; @@ -139,7 +137,7 @@ public class SelectedCourseActivity extends BaseFuncActivity implements IMoreFun new Thread(() -> { List allTerm = StaticService.getTerms(this, tokenData.getCookie()); if (allTerm != null) { - moreDate.setTermBeans(allTerm); + MoreData.setTermBeans(allTerm); terms.clear(); for (int i = 0; i < allTerm.size(); i++) { String substring = allTerm.get(i).getTerm().substring(0, 4); diff --git a/app/src/main/java/top/yvyan/guettable/service/AutoUpdate.java b/app/src/main/java/top/yvyan/guettable/service/AutoUpdate.java index 28f7b6df858bb4c56848ce7a6530236110481acc..e91f570bbb04e09e7118b95e33b1739fe2a0701d 100644 --- a/app/src/main/java/top/yvyan/guettable/service/AutoUpdate.java +++ b/app/src/main/java/top/yvyan/guettable/service/AutoUpdate.java @@ -29,7 +29,6 @@ public class AutoUpdate { private final DayClassFragment fragment; private final AccountData accountData; - private final ScheduleData scheduleData; private final GeneralData generalData; private final TokenData tokenData; private final SettingData settingData; @@ -40,7 +39,6 @@ public class AutoUpdate { this.fragment = fragment; this.activity = fragment.getActivity(); accountData = AccountData.newInstance(activity); - scheduleData = ScheduleData.newInstance(activity); generalData = GeneralData.newInstance(activity); tokenData = TokenData.newInstance(activity); settingData = SettingData.newInstance(activity); @@ -153,7 +151,7 @@ public class AutoUpdate { ); if (getClass != null) { courseBeans = getClass; - scheduleData.setCourseBeans(courseBeans); + ScheduleData.setCourseBeans(courseBeans); } else { updateView(92); state = tokenData.refresh(); @@ -170,7 +168,7 @@ public class AutoUpdate { ); if (getClass != null) { courseBeans = getClass; - scheduleData.setCourseBeans(courseBeans); + ScheduleData.setCourseBeans(courseBeans); } else { updateView(3); return; @@ -186,7 +184,7 @@ public class AutoUpdate { if (examBeans != null) { CourseUtil.BeanAttributeUtil beanAttributeUtil = new CourseUtil.BeanAttributeUtil(); Collections.sort(examBeans, beanAttributeUtil); - scheduleData.setExamBeans(examBeans); + ScheduleData.setExamBeans(examBeans); } else { updateView(3); return; @@ -200,10 +198,10 @@ public class AutoUpdate { ); if (getLab != null) { updateView(5); - scheduleData.setLibBeans(getLab); - scheduleData.setUpdate(true); + ScheduleData.setLibBeans(getLab); + ScheduleData.setUpdate(true); generalData.setLastUpdateTime(System.currentTimeMillis()); - int maxWeek = scheduleData.getMaxWeek(); + int maxWeek = ScheduleData.getMaxWeek(); if (maxWeek > generalData.getMaxWeek()) { generalData.setMaxWeek(maxWeek); } diff --git a/app/src/main/java/top/yvyan/guettable/service/CommFunc.java b/app/src/main/java/top/yvyan/guettable/service/CommFunc.java index 0924ad39c38acfd4df96c0a7a0b8dd9e2913d2b0..f6fa2cfb20ad01ef399357a57bdb1396f16d5f16 100644 --- a/app/src/main/java/top/yvyan/guettable/service/CommFunc.java +++ b/app/src/main/java/top/yvyan/guettable/service/CommFunc.java @@ -14,7 +14,6 @@ import java.util.Objects; import top.yvyan.guettable.R; import top.yvyan.guettable.activity.WebViewActivity; -import top.yvyan.guettable.data.GeneralData; import top.yvyan.guettable.data.TokenData; import top.yvyan.guettable.util.AppUtil; import top.yvyan.guettable.util.DialogUtil; @@ -90,8 +89,8 @@ public class CommFunc { final boolean[] noLogin = {false}; TokenData tokenData = TokenData.newInstance(activity); Intent intent = new Intent(activity, WebViewActivity.class); - intent.putExtra(WebViewActivity.WEB_URL, UrlReplaceUtil.getUrlByVPN(TokenData.isVPN, UrlReplaceUtil.getUrlByInternational(GeneralData.newInstance(activity).isInternational(), "/Login/MainDesktop"))); - intent.putExtra(WebViewActivity.WEB_SHARE_URL, UrlReplaceUtil.getUrlByVPN(TokenData.isVPN, UrlReplaceUtil.getUrlByInternational(GeneralData.newInstance(activity).isInternational(), "/"))); + intent.putExtra(WebViewActivity.WEB_URL, UrlReplaceUtil.getBkjwUrlByVPN(TokenData.isVPN(), "/Login/MainDesktop")); + intent.putExtra(WebViewActivity.WEB_SHARE_URL, UrlReplaceUtil.getBkjwUrlByVPN(TokenData.isVPN(), "/")); DialogUtil.IDialogService iDialogService = new DialogUtil.IDialogService() { @Override public void onClickYes() { @@ -105,7 +104,7 @@ public class CommFunc { } }; final AlertDialog[] dialog = new AlertDialog[1]; - activity.runOnUiThread(() -> dialog[0] = DialogUtil.setTextDialog(activity, "自动登录中...(最长需要20s)", "跳过", iDialogService, true)); + activity.runOnUiThread(() -> dialog[0] = DialogUtil.setTextDialog(activity, "自动登录中...(最长需要15s)", "跳过", iDialogService, true)); tokenData.refresh(); if (!noLogin[0]) { @@ -115,9 +114,9 @@ public class CommFunc { } WebViewActivity.cleanCash(Objects.requireNonNull(activity)); }); - intent.putExtra(WebViewActivity.WEB_URL, UrlReplaceUtil.getUrlByVPN(TokenData.isVPN, UrlReplaceUtil.getUrlByInternational(GeneralData.newInstance(activity).isInternational(), "/Login/MainDesktop"))); - intent.putExtra(WebViewActivity.WEB_SHARE_URL, UrlReplaceUtil.getUrlByVPN(TokenData.isVPN, UrlReplaceUtil.getUrlByInternational(GeneralData.newInstance(activity).isInternational(), "/"))); - intent.putExtra(WebViewActivity.WEB_REFERER, UrlReplaceUtil.getUrlByVPN(TokenData.isVPN, UrlReplaceUtil.getUrlByInternational(GeneralData.newInstance(activity).isInternational(), "/"))); + intent.putExtra(WebViewActivity.WEB_URL, UrlReplaceUtil.getBkjwUrlByVPN(TokenData.isVPN(), "/Login/MainDesktop")); + intent.putExtra(WebViewActivity.WEB_SHARE_URL, UrlReplaceUtil.getBkjwUrlByVPN(TokenData.isVPN(), "/")); + intent.putExtra(WebViewActivity.WEB_REFERER, UrlReplaceUtil.getBkjwUrlByVPN(TokenData.isVPN(), "/")); intent.putExtra(WebViewActivity.WEB_COOKIE, tokenData.getCookie()); AppUtil.reportFunc(activity, "登录教务-免登录"); activity.startActivity(intent); @@ -125,6 +124,61 @@ public class CommFunc { }).start(); } + /** + * 自动登录智慧校园 + * + * @param activity activity + */ + public static void noLoginWebICampus(Activity activity) { + new Thread(() -> { + final boolean[] noLogin = {false}; + TokenData tokenData = TokenData.newInstance(activity); + Intent intent = new Intent(activity, WebViewActivity.class); + intent.putExtra(WebViewActivity.WEB_URL, activity.getResources().getString(R.string.url_smart_campus)); + intent.putExtra(WebViewActivity.WEB_SHARE_URL, activity.getResources().getString(R.string.url_smart_campus)); + DialogUtil.IDialogService iDialogService = new DialogUtil.IDialogService() { + @Override + public void onClickYes() { + AppUtil.reportFunc(activity, "智慧校园-跳过"); + activity.startActivity(intent); + noLogin[0] = true; + } + + @Override + public void onClickBack() { + } + }; + final AlertDialog[] dialog = new AlertDialog[1]; + activity.runOnUiThread(() -> dialog[0] = DialogUtil.setTextDialog(activity, "自动登录中...(最长需要15s)", "跳过", iDialogService, true)); + + tokenData.refresh(); + if (TokenData.isVPN()) { + tokenData.setVPNCASCookie(); + } + if (!noLogin[0]) { + activity.runOnUiThread(() -> { + if (dialog[0] != null && dialog[0].isShowing()) { + dialog[0].dismiss(); + } + WebViewActivity.cleanCash(Objects.requireNonNull(activity)); + }); + intent.putExtra(WebViewActivity.WEB_URL, activity.getResources().getString(R.string.url_smart_campus)); + intent.putExtra(WebViewActivity.WEB_SHARE_URL, activity.getResources().getString(R.string.url_smart_campus)); + intent.putExtra(WebViewActivity.WEB_REFERER, activity.getResources().getString(R.string.url_smart_campus)); + //设置cookie + if (TokenData.isVPN()) { + intent.putExtra(WebViewActivity.WEB_COOKIE_URL, activity.getResources().getString(R.string.url_vpn)); + intent.putExtra(WebViewActivity.WEB_COOKIE, tokenData.getCookie()); + } else { + intent.putExtra(WebViewActivity.WEB_COOKIE_URL, activity.getResources().getString(R.string.url_Authserver)); + intent.putExtra(WebViewActivity.WEB_COOKIE, tokenData.getCASCookie()); + } + AppUtil.reportFunc(activity, "智慧校园-免登录"); + activity.startActivity(intent); + } + }).start(); + } + /** * 自动登录VPN * @@ -152,12 +206,13 @@ public class CommFunc { activity.runOnUiThread(() -> dialog[0] = DialogUtil.setTextDialog(activity, "自动建立连接中...(最长需要15s)", "跳过", iDialogService, true)); String token = tokenData.getVpnToken(); + tokenData.setVPNCASCookie(); if (!noLogin[0]) { activity.runOnUiThread(() -> { dialog[0].dismiss(); WebViewActivity.cleanCash(Objects.requireNonNull(activity)); }); - intent.putExtra(WebViewActivity.WEB_REFERER, "https://v.guet.edu.cn/login"); + intent.putExtra(WebViewActivity.WEB_REFERER, activity.getResources().getString(R.string.vpn_url)); if (token != null) { intent.putExtra(WebViewActivity.WEB_COOKIE, token); } @@ -176,11 +231,10 @@ public class CommFunc { * @param hint 提示信息 */ public static void checkVpn(Activity activity, String web, String vpnWeb, String hint) { - TokenData tokenData = TokenData.newInstance(activity); if (hint != null) { ToastUtil.showLongToast(activity, hint); } - if (tokenData.isVPN()) { //内网直接打开对应网址 + if (!TokenData.isVPN()) { //内网直接打开对应网址 openBrowser(activity, web); } else { //外网登录vpn后打开对应网址 openBrowser(activity, vpnWeb); @@ -196,7 +250,7 @@ public class CommFunc { */ public static void noLoginWebVPN(Activity activity, String web, String vpnWeb) { TokenData tokenData = TokenData.newInstance(activity); - if (tokenData.isVPN()) { //内网直接打开对应网址 + if (!TokenData.isVPN()) { //内网直接打开对应网址 openUrl(activity, null, web, true); } else { //外网登录vpn后打开对应网址 new Thread(() -> { @@ -220,6 +274,7 @@ public class CommFunc { activity.runOnUiThread(() -> dialog[0] = DialogUtil.setTextDialog(activity, "自动建立连接中...(最长需要15s)", "跳过", iDialogService, true)); String token = tokenData.getVpnToken(); + tokenData.setVPNCASCookie(); if (!noLogin[0]) { activity.runOnUiThread(() -> { dialog[0].dismiss(); diff --git a/app/src/main/java/top/yvyan/guettable/service/fetch/Net.java b/app/src/main/java/top/yvyan/guettable/service/fetch/Net.java index 02ac9e5851f040f91740242635122432dcbce09d..88066b6f1d88a8ee5deef0aa05cdb8b382feb471 100644 --- a/app/src/main/java/top/yvyan/guettable/service/fetch/Net.java +++ b/app/src/main/java/top/yvyan/guettable/service/fetch/Net.java @@ -6,7 +6,6 @@ import android.content.res.Resources; import java.io.IOException; import java.net.URLEncoder; import java.util.ArrayList; -import java.util.Date; import java.util.List; import java.util.concurrent.TimeUnit; @@ -18,7 +17,6 @@ import top.yvyan.guettable.Http.Get; import top.yvyan.guettable.Http.HttpConnectionAndCode; import top.yvyan.guettable.Http.Post; import top.yvyan.guettable.R; -import top.yvyan.guettable.data.GeneralData; import top.yvyan.guettable.util.AESUtil; import top.yvyan.guettable.util.RegularUtil; import top.yvyan.guettable.util.UrlReplaceUtil; @@ -34,8 +32,8 @@ public class Net { public static int testNet() { String url = "http://10.0.1.5/"; OkHttpClient okHttpClient = new OkHttpClient.Builder() - .connectTimeout(3, TimeUnit.SECONDS)//设置连接超时时间 - .readTimeout(3, TimeUnit.SECONDS)//设置读取超时时间 + .connectTimeout(1, TimeUnit.SECONDS)//设置连接超时时间 + .readTimeout(1, TimeUnit.SECONDS)//设置读取超时时间 .build(); final Request request = new Request.Builder() .url(url) @@ -82,28 +80,34 @@ public class Net { * @param context context * @param account 学号 * @param password 密码 - * @param VPNToken VPNToken - * @return CAS服务Cookie *请求 + * @param TGTToken CAS-TGT + * @param MFACookie 2FA二次验证Cookie + * @return CAS-TGT; */ - public static HttpConnectionAndCode getCASToken(Context context, String account, String password, String VPNToken) { + public static HttpConnectionAndCode getCASToken(Context context, String account, String password, String TGTToken, String MFACookie) { StringBuilder cookie_builder = new StringBuilder(); + String AuthCookie = (MFACookie != null ? MFACookie : "") + (TGTToken != null ? ((MFACookie!=null ? "; " : "")+TGTToken) : ""); try { Resources resources = context.getResources(); HttpConnectionAndCode loginParams = Get.get( - VPNToken != null ? resources.getString(R.string.url_Authserver_VPN) : resources.getString(R.string.url_Authserver), + resources.getString(R.string.url_Authserver), null, resources.getString(R.string.user_agent), resources.getString(R.string.SSO_referer), - VPNToken, + !AuthCookie.equals("") ? AuthCookie : null, null, resources.getString(R.string.cookie_delimiter), null, null, - null, + false, null, 10000, null); if (loginParams.code != 0) { + if(loginParams.code == -7) { + // 已登录 + return new HttpConnectionAndCode(loginParams.c,1,loginParams.comment,loginParams.cookie,loginParams.resp_code); + } return new HttpConnectionAndCode(-5); } cookie_builder.append(loginParams.cookie); @@ -113,49 +117,34 @@ public class Net { String execution = listExp.get(0); String body = "username=" + account + "&password=" + URLEncoder.encode(AESUtil.CASEncryption(password, AESKey), "UTF-8") + "&captcha=&_eventId=submit&cllt=userNameLogin&dllt=generalLogin<=&execution=" + URLEncoder.encode(execution, "UTF-8"); HttpConnectionAndCode LoginRequest = Post.post( - VPNToken != null ? resources.getString(R.string.url_Authserver_VPN) : resources.getString(R.string.url_Authserver), + resources.getString(R.string.url_Authserver), null, resources.getString(R.string.user_agent), resources.getString(R.string.SSO_referer), body, - VPNToken == null ? cookie_builder.toString() : VPNToken , + cookie_builder + (MFACookie != null ? ("; " + MFACookie) : ""), "}", resources.getString(R.string.cookie_delimiter), null, null, false, resources.getString(R.string.SSO_context_type)); - if (VPNToken==null && LoginRequest.code == -7) { + if( LoginRequest.resp_code == 401 ) { + return new HttpConnectionAndCode(-8); //密码错误 + } + if (LoginRequest.code == -7) { List cookies = LoginRequest.c.getHeaderFields().get("Set-Cookie"); if (cookies != null) { cookie_builder.append("; "); for (String cookie_resp : cookies) { - cookie_builder.append(cookie_resp.substring(0, cookie_resp.indexOf(";") + 1)).append(" "); + cookie_builder.append(cookie_resp.substring(0, cookie_resp.indexOf(";") + 1)+" "); } } - LoginRequest.cookie=cookie_builder.toString(); - LoginRequest.cookie=LoginRequest.cookie.substring(0,LoginRequest.cookie.length()-2); - LoginRequest.code=0; + LoginRequest.cookie = cookie_builder.toString(); + LoginRequest.cookie = LoginRequest.cookie.substring(0, LoginRequest.cookie.length() - 2); + LoginRequest.code = 0; return LoginRequest; } - if(VPNToken != null) { - //获取 Cookie 判断是否登录成功 - HttpConnectionAndCode VPNGetCookieRequest = Get.get( - resources.getString(R.string.vpn_get_cookie) + "&vpn_timestamp=" + new Date().getTime(), - null, - resources.getString(R.string.user_agent), - resources.getString(R.string.url_Authserver_VPN), - VPNToken, - null, - resources.getString(R.string.cookie_delimiter), - null, - null, - null, - null, - 10000, - null); - return new HttpConnectionAndCode(LoginRequest.c,VPNGetCookieRequest.code,VPNGetCookieRequest.comment); - } return LoginRequest; } catch (Exception ignored) { @@ -168,19 +157,18 @@ public class Net { * * @param context context * @param CASCookie CAS Cookie - * @param account - * @param VPNToken VPNToken + * @param account account * @return Response */ - public static HttpConnectionAndCode sendPhoneOTP(Context context, String CASCookie,String account, String VPNToken) { + public static HttpConnectionAndCode sendPhoneOTP(Context context, String account, String CASCookie) { Resources resources = context.getResources(); return Post.post( - (VPNToken != null ? resources.getString(R.string.url_SendPhoneOTP_VPN) : resources.getString(R.string.url_SendPhoneOTP)), + resources.getString(R.string.url_SendPhoneOTP), null, resources.getString(R.string.user_agent), resources.getString(R.string.SSO_referer), - "userName="+account+"&authCodeTypeName=reAuthDynamicCodeType", - VPNToken == null ? CASCookie : VPNToken , + "userName=" + account + "&authCodeTypeName=reAuthDynamicCodeType", + CASCookie, null, resources.getString(R.string.cookie_delimiter), null, @@ -194,34 +182,42 @@ public class Net { * * @param context context * @param CASCookie CAS Cookie - * @param OTP - * @param VPNToken VPNToken + * @param OTP OTP * @return Response */ - public static HttpConnectionAndCode verifyPhoneOTP(Context context, String CASCookie,String OTP, String VPNToken) { + public static HttpConnectionAndCode verifyPhoneOTP(Context context, String OTP, String CASCookie) { Resources resources = context.getResources(); - HttpConnectionAndCode VerifyRequest = Post.post( - (VPNToken != null ? resources.getString(R.string.url_ReAuth_VPN) : resources.getString(R.string.url_ReAuth)), + return Post.post( + resources.getString(R.string.url_ReAuth), null, resources.getString(R.string.user_agent), resources.getString(R.string.SSO_referer), - "service=http%3A%2F%2Ficampus.guet.edu.cn%2FGuetAccount%2FCasLogin&reAuthType=3&isMultifactor=true&password=&dynamicCode="+OTP+"&uuid=&answer1=&answer2=&otpCode=", - VPNToken == null ? CASCookie : VPNToken , + "service=http%3A%2F%2Ficampus.guet.edu.cn%2FGuetAccount%2FCasLogin&reAuthType=3&isMultifactor=true&password=&dynamicCode=" + OTP + "&uuid=&answer1=&answer2=&otpCode=", + CASCookie, null, resources.getString(R.string.cookie_delimiter), null, null, false, resources.getString(R.string.SSO_context_type)); - if(VPNToken == null) { - return VerifyRequest; - } else { - HttpConnectionAndCode VPNGetCookieRequest = Get.get( - resources.getString(R.string.vpn_get_cookie) + "&vpn_timestamp=" + new Date().getTime(), + } + + /** + * 认证手机验证码 + * + * @param context context + * @param CASCookie CAS Cookie + * @return Response + */ + public static HttpConnectionAndCode bypass2FA(Context context, String password, String CASCookie) { + Resources resources = context.getResources(); + try { + HttpConnectionAndCode MFAParams = Get.get( + resources.getString(R.string.url_ReAuth_Param), null, resources.getString(R.string.user_agent), - resources.getString(R.string.url_Authserver_VPN), - VPNToken, + resources.getString(R.string.SSO_referer), + CASCookie, null, resources.getString(R.string.cookie_delimiter), null, @@ -230,8 +226,97 @@ public class Net { null, 10000, null); - return new HttpConnectionAndCode(VerifyRequest.c,VerifyRequest.code,VerifyRequest.comment,VPNGetCookieRequest.comment, VerifyRequest.resp_code); + if (MFAParams.code != 0) { + return new HttpConnectionAndCode(0); + } + ArrayList listExp = RegularUtil.getAllSatisfyStr(MFAParams.comment, "(?<=\"pwdEncryptSalt\":\")(\\w+)(?=\")"); + String AESKey = listExp.get(0); + + return Post.post( + resources.getString(R.string.url_ReAuth), + null, + resources.getString(R.string.user_agent), + resources.getString(R.string.SSO_referer), + "service=http%3A%2F%2Ficampus.guet.edu.cn%2FGuetAccount%2FCasLogin&reAuthType=2&isMultifactor=true&password=" + URLEncoder.encode(AESUtil.CASEncryption(password, AESKey), "UTF-8") + "&dynamicCode=&uuid=&answer1=&answer2=&otpCode=", + CASCookie, + null, + resources.getString(R.string.cookie_delimiter), + null, + null, + false, + resources.getString(R.string.SSO_context_type)); + } catch (Exception ignored) { + } + return new HttpConnectionAndCode(0); + } + + public static HttpConnectionAndCode loginVPNST(Context context, String ST, String VPNToken) { + Resources resources = context.getResources(); + return Get.get( + "https://v.guet.edu.cn/login?cas_login=true&ticket=" + ST, + null, + resources.getString(R.string.user_agent), + resources.getString(R.string.SSO_referer), + VPNToken, + null, + resources.getString(R.string.cookie_delimiter), + null, + null, + null, + null, + 3000, + null); + } + + /** + * 向VPN添加Cookie + * + * @param host 域 + * @param path 路径 + * @param cookie cookie + * @param VPNToken VPN Token + * @return 0 成功 + */ + public static HttpConnectionAndCode CookieSet(Context context, String host, String path, String cookie, String VPNToken) { + Resources resources = context.getResources(); + try { + return Get.get( + "https://v.guet.edu.cn/wengine-vpn/cookie?method=set" + "&host=" + host + + "&path=" + path + + "&scheme=https&ck_data=" + URLEncoder.encode(cookie, "UTF-8"), + null, + resources.getString(R.string.user_agent), + "https://v.guet.edu.cn", + VPNToken, + null, + resources.getString(R.string.cookie_delimiter), + null, + null, + false, + null, + 3000, + null); + } catch (Exception ignore) { } + return new HttpConnectionAndCode(-1); + } + + public static HttpConnectionAndCode loginBkjwVPNST(Context context, String ST, String VPNToken) { + Resources resources = context.getResources(); + return Get.get( + "https://v.guet.edu.cn/http/77726476706e69737468656265737421f2fc4b8b69377d556a468ca88d1b203b?ticket=" + ST, + null, + resources.getString(R.string.user_agent), + "https://v.guet.edu.cn", + VPNToken, + null, + resources.getString(R.string.cookie_delimiter), + null, + null, + true, + null, + 3000, + null); } /** @@ -240,17 +325,16 @@ public class Net { * @param context context * @param CASCookie CAS Cookie * @param service ST令牌的服务端 - * @param VPNToken VPNToken * @return ST令牌 */ - public static HttpConnectionAndCode getSTbyCas(Context context, String CASCookie, String service, String VPNToken) { + public static HttpConnectionAndCode getSTbyCas(Context context, String CASCookie, String service, String MFACookie) { Resources resources = context.getResources(); return Get.get( - (VPNToken != null ? resources.getString(R.string.url_Authserver_VPN) : resources.getString(R.string.url_Authserver)) + "?" + service, + resources.getString(R.string.url_Authserver) + "?" + service, null, resources.getString(R.string.user_agent), resources.getString(R.string.SSO_referer), - VPNToken == null ? CASCookie : VPNToken, + CASCookie + (MFACookie != null ? ("; " + MFACookie) : ""), null, resources.getString(R.string.cookie_delimiter), null, @@ -305,10 +389,10 @@ public class Net { public static HttpConnectionAndCode studentInfo(Context context, String cookie, boolean isVPN) { Resources resources = context.getResources(); return Post.post( - UrlReplaceUtil.getUrlByVPN(isVPN, UrlReplaceUtil.getUrlByInternational(GeneralData.newInstance(context).isInternational(), resources.getString(R.string.lan_get_student_url))), + UrlReplaceUtil.getBkjwUrlByVPN(isVPN, resources.getString(R.string.lan_get_student_url)), null, resources.getString(R.string.user_agent), - UrlReplaceUtil.getUrlByVPN(isVPN, UrlReplaceUtil.getUrlByInternational(GeneralData.newInstance(context).isInternational(), resources.getString(R.string.lan_referer))), + UrlReplaceUtil.getBkjwUrlByVPN(isVPN, resources.getString(R.string.lan_referer)), null, cookie, "}", @@ -332,10 +416,10 @@ public class Net { Resources resources = context.getResources(); String[] param = {"term=" + term}; return Get.get( - UrlReplaceUtil.getUrlByVPN(isVPN, UrlReplaceUtil.getUrlByInternational(GeneralData.newInstance(context).isInternational(), resources.getString(R.string.lan_get_table_url))), + UrlReplaceUtil.getBkjwUrlByVPN(isVPN, resources.getString(R.string.lan_get_table_url)), param, resources.getString(R.string.user_agent), - UrlReplaceUtil.getUrlByVPN(isVPN, UrlReplaceUtil.getUrlByInternational(GeneralData.newInstance(context).isInternational(), resources.getString(R.string.lan_referer))), + UrlReplaceUtil.getBkjwUrlByVPN(isVPN, resources.getString(R.string.lan_referer)), cookie, "]}", null, @@ -361,10 +445,10 @@ public class Net { Resources resources = context.getResources(); String[] param = {"term=" + term}; return Get.get( - UrlReplaceUtil.getUrlByVPN(isVPN, UrlReplaceUtil.getUrlByInternational(GeneralData.newInstance(context).isInternational(), resources.getString(R.string.lan_get_lab_table_url))), + UrlReplaceUtil.getBkjwUrlByVPN(isVPN, resources.getString(R.string.lan_get_lab_table_url)), param, resources.getString(R.string.user_agent), - UrlReplaceUtil.getUrlByVPN(isVPN, UrlReplaceUtil.getUrlByInternational(GeneralData.newInstance(context).isInternational(), resources.getString(R.string.lan_referer))), + UrlReplaceUtil.getBkjwUrlByVPN(isVPN, resources.getString(R.string.lan_referer)), cookie, "]}", null, @@ -390,10 +474,10 @@ public class Net { Resources resources = context.getResources(); String[] param = {"term=" + term}; return Get.get( - UrlReplaceUtil.getUrlByVPN(isVPN, UrlReplaceUtil.getUrlByInternational(GeneralData.newInstance(context).isInternational(), resources.getString(R.string.lan_get_exam_url))), + UrlReplaceUtil.getBkjwUrlByVPN(isVPN, resources.getString(R.string.lan_get_exam_url)), param, resources.getString(R.string.user_agent), - UrlReplaceUtil.getUrlByVPN(isVPN, UrlReplaceUtil.getUrlByInternational(GeneralData.newInstance(context).isInternational(), resources.getString(R.string.lan_referer))), + UrlReplaceUtil.getBkjwUrlByVPN(isVPN, resources.getString(R.string.lan_referer)), cookie, "]}", null, @@ -417,10 +501,10 @@ public class Net { public static HttpConnectionAndCode getResit(Context context, String cookie, boolean isVPN) { Resources resources = context.getResources(); return Get.get( - UrlReplaceUtil.getUrlByVPN(isVPN, UrlReplaceUtil.getUrlByInternational(GeneralData.newInstance(context).isInternational(), resources.getString(R.string.lan_get_resit_url))), + UrlReplaceUtil.getBkjwUrlByVPN(isVPN, resources.getString(R.string.lan_get_resit_url)), null, resources.getString(R.string.user_agent), - UrlReplaceUtil.getUrlByVPN(isVPN, UrlReplaceUtil.getUrlByInternational(GeneralData.newInstance(context).isInternational(), resources.getString(R.string.lan_referer))), + UrlReplaceUtil.getBkjwUrlByVPN(isVPN, resources.getString(R.string.lan_referer)), cookie, "]}", null, @@ -444,10 +528,10 @@ public class Net { public static HttpConnectionAndCode getCET(Context context, String cookie, boolean isVPN) { Resources resources = context.getResources(); return Get.get( - UrlReplaceUtil.getUrlByVPN(isVPN, UrlReplaceUtil.getUrlByInternational(GeneralData.newInstance(context).isInternational(), resources.getString(R.string.lan_get_cet_url))), + UrlReplaceUtil.getBkjwUrlByVPN(isVPN, resources.getString(R.string.lan_get_cet_url)), null, resources.getString(R.string.user_agent), - UrlReplaceUtil.getUrlByVPN(isVPN, UrlReplaceUtil.getUrlByInternational(GeneralData.newInstance(context).isInternational(), resources.getString(R.string.lan_referer))), + UrlReplaceUtil.getBkjwUrlByVPN(isVPN, resources.getString(R.string.lan_referer)), cookie, "]}", null, @@ -471,10 +555,10 @@ public class Net { public static HttpConnectionAndCode getExamScore(Context context, String cookie, boolean isVPN) { Resources resources = context.getResources(); return Get.get( - UrlReplaceUtil.getUrlByVPN(isVPN, UrlReplaceUtil.getUrlByInternational(GeneralData.newInstance(context).isInternational(), resources.getString(R.string.lan_get_examscore_url))), + UrlReplaceUtil.getBkjwUrlByVPN(isVPN, resources.getString(R.string.lan_get_examscore_url)), null, resources.getString(R.string.user_agent), - UrlReplaceUtil.getUrlByVPN(isVPN, UrlReplaceUtil.getUrlByInternational(GeneralData.newInstance(context).isInternational(), resources.getString(R.string.lan_referer))), + UrlReplaceUtil.getBkjwUrlByVPN(isVPN, resources.getString(R.string.lan_referer)), cookie, "]}", null, @@ -498,10 +582,10 @@ public class Net { public static HttpConnectionAndCode getExperimentScore(Context context, String cookie, boolean isVPN) { Resources resources = context.getResources(); return Get.get( - UrlReplaceUtil.getUrlByVPN(isVPN, UrlReplaceUtil.getUrlByInternational(GeneralData.newInstance(context).isInternational(), resources.getString(R.string.lan_get_experimentscore_url))), + UrlReplaceUtil.getBkjwUrlByVPN(isVPN, resources.getString(R.string.lan_get_experimentscore_url)), null, resources.getString(R.string.user_agent), - UrlReplaceUtil.getUrlByVPN(isVPN, UrlReplaceUtil.getUrlByInternational(GeneralData.newInstance(context).isInternational(), resources.getString(R.string.lan_referer))), + UrlReplaceUtil.getBkjwUrlByVPN(isVPN, resources.getString(R.string.lan_referer)), cookie, "]}", null, @@ -515,7 +599,7 @@ public class Net { } /** - * 同步有效课程 + * 同步有效学分 * * @param context context * @param cookie 登录后的cookie @@ -525,10 +609,10 @@ public class Net { public static HttpConnectionAndCode updateEffectiveCredits(Context context, String cookie, boolean isVPN) { Resources resources = context.getResources(); return Post.post( - UrlReplaceUtil.getUrlByVPN(isVPN, UrlReplaceUtil.getUrlByInternational(GeneralData.newInstance(context).isInternational(), resources.getString(R.string.lan_update_effective_credits))), + UrlReplaceUtil.getBkjwUrlByVPN(isVPN, resources.getString(R.string.lan_update_effective_credits)), null, resources.getString(R.string.user_agent), - UrlReplaceUtil.getUrlByVPN(isVPN, UrlReplaceUtil.getUrlByInternational(GeneralData.newInstance(context).isInternational(), resources.getString(R.string.lan_referer))), + UrlReplaceUtil.getBkjwUrlByVPN(isVPN, resources.getString(R.string.lan_referer)), null, cookie, "}", @@ -551,10 +635,10 @@ public class Net { public static HttpConnectionAndCode getEffectiveCredits(Context context, String cookie, boolean isVPN) { Resources resources = context.getResources(); return Get.get( - UrlReplaceUtil.getUrlByVPN(isVPN, UrlReplaceUtil.getUrlByInternational(GeneralData.newInstance(context).isInternational(), resources.getString(R.string.lan_get_effective_credits))), + UrlReplaceUtil.getBkjwUrlByVPN(isVPN, resources.getString(R.string.lan_get_effective_credits)), null, resources.getString(R.string.user_agent), - UrlReplaceUtil.getUrlByVPN(isVPN, UrlReplaceUtil.getUrlByInternational(GeneralData.newInstance(context).isInternational(), resources.getString(R.string.lan_referer))), + UrlReplaceUtil.getBkjwUrlByVPN(isVPN, resources.getString(R.string.lan_referer)), cookie, "]}", null, @@ -578,10 +662,10 @@ public class Net { public static HttpConnectionAndCode getPlannedCourses(Context context, String cookie, boolean isVPN) { Resources resources = context.getResources(); return Get.get( - UrlReplaceUtil.getUrlByVPN(isVPN, UrlReplaceUtil.getUrlByInternational(GeneralData.newInstance(context).isInternational(), resources.getString(R.string.lan_get_planned_credits))), + UrlReplaceUtil.getBkjwUrlByVPN(isVPN, resources.getString(R.string.lan_get_planned_credits)), null, resources.getString(R.string.user_agent), - UrlReplaceUtil.getUrlByVPN(isVPN, UrlReplaceUtil.getUrlByInternational(GeneralData.newInstance(context).isInternational(), resources.getString(R.string.lan_referer))), + UrlReplaceUtil.getBkjwUrlByVPN(isVPN, resources.getString(R.string.lan_referer)), cookie, "]}", null, @@ -607,10 +691,10 @@ public class Net { Resources resources = context.getResources(); String[] param = {"comm=1%401", "term=".concat(term)}; return Get.get( - UrlReplaceUtil.getUrlByVPN(isVPN, resources.getString(R.string.lan_get_selected_course)), + UrlReplaceUtil.getBkjwUrlByVPN(isVPN, resources.getString(R.string.lan_get_selected_course)), param, resources.getString(R.string.user_agent), - UrlReplaceUtil.getUrlByVPN(isVPN, UrlReplaceUtil.getUrlByInternational(GeneralData.newInstance(context).isInternational(), resources.getString(R.string.lan_referer))), + UrlReplaceUtil.getBkjwUrlByVPN(isVPN, resources.getString(R.string.lan_referer)), cookie, "]}", null, @@ -634,10 +718,10 @@ public class Net { public static HttpConnectionAndCode getGrades(Context context, String cookie, boolean isVPN) { Resources resources = context.getResources(); return Get.get( - UrlReplaceUtil.getUrlByVPN(isVPN, UrlReplaceUtil.getUrlByInternational(false, resources.getString(R.string.lan_get_grades_url))), + UrlReplaceUtil.getBkjwUrlByVPN(isVPN, resources.getString(R.string.lan_get_grades_url)), null, resources.getString(R.string.user_agent), - UrlReplaceUtil.getUrlByVPN(isVPN, UrlReplaceUtil.getUrlByInternational(GeneralData.newInstance(context).isInternational(), resources.getString(R.string.lan_referer))), + UrlReplaceUtil.getBkjwUrlByVPN(isVPN, resources.getString(R.string.lan_referer)), cookie, "]}", null, @@ -661,10 +745,10 @@ public class Net { public static HttpConnectionAndCode getAllTerms(Context context, String cookie, boolean isVPN) { Resources resources = context.getResources(); return Get.get( - UrlReplaceUtil.getUrlByVPN(isVPN, UrlReplaceUtil.getUrlByInternational(false, resources.getString(R.string.lan_get_terms_url))), + UrlReplaceUtil.getBkjwUrlByVPN(isVPN, resources.getString(R.string.lan_get_terms_url)), null, resources.getString(R.string.user_agent), - UrlReplaceUtil.getUrlByVPN(isVPN, UrlReplaceUtil.getUrlByInternational(GeneralData.newInstance(context).isInternational(), resources.getString(R.string.lan_referer))), + UrlReplaceUtil.getBkjwUrlByVPN(isVPN, resources.getString(R.string.lan_referer)), cookie, "]}", null, diff --git a/app/src/main/java/top/yvyan/guettable/service/fetch/StaticService.java b/app/src/main/java/top/yvyan/guettable/service/fetch/StaticService.java index 1d0856189b562025661fc3542c33d76c4b72a4c2..5d9b6e86694f49fa0e1228537bd1df5308b1599d 100644 --- a/app/src/main/java/top/yvyan/guettable/service/fetch/StaticService.java +++ b/app/src/main/java/top/yvyan/guettable/service/fetch/StaticService.java @@ -5,16 +5,10 @@ import android.content.Context; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; -import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.Objects; -import okhttp3.Call; -import okhttp3.OkHttpClient; -import okhttp3.Request; -import okhttp3.Response; import top.yvyan.guettable.Gson.BaseResponse; import top.yvyan.guettable.Gson.CET; import top.yvyan.guettable.Gson.ClassTable; @@ -46,22 +40,20 @@ public class StaticService { * 发送手机验证码 * * @param context context - * @param CASCookie + * @param CASCookie CAS Cookie * @param account 学号 - * @param VPNToken VPNToken * @return Phone Number * ERROR0 : 网络错误 * ERROR1 : 密码错误 * ERROR2 : 需要使用外网网址进行访问 * ERROR3 : 验证码发送CD */ - public static String SendPhoneOTP(Context context, String CASCookie, String account, String VPNToken) { - HttpConnectionAndCode response = Net.sendPhoneOTP(context, CASCookie, account, VPNToken); + public static String SendPhoneOTP(Context context, String account, String CASCookie) { + HttpConnectionAndCode response = Net.sendPhoneOTP(context, account, CASCookie); if (response.code != 0) { if (response.code == -5) { return "ERROR2"; } - return "ERROR0"; } else { if (response.comment.contains("success")) { int PhoneIndex = response.comment.indexOf("\"mobile\":\"") + 10; @@ -72,7 +64,22 @@ public class StaticService { String ErrorMessage = response.comment.substring(MessageIndex); return "ERROR3;" + ErrorMessage.substring(0, ErrorMessage.indexOf("\"")); } + } + return "ERROR0"; + } + + public static String bypass2FA(Context context, String Password, String CASCookie) { + HttpConnectionAndCode response = Net.bypass2FA(context, Password, CASCookie); + if (response.code != 0) { + if (response.code == -5) { + return "ERROR2"; + } return "ERROR0"; + } else { + if (response.comment.contains("reAuth_success")) { + return response.cookie; + } + return "ERROR1"; } } @@ -80,16 +87,15 @@ public class StaticService { * 发送手机验证码 * * @param context context - * @param CASCookie + * @param CASCookie CAS Cookie * @param OTP OTP手机验证码 - * @param VPNToken VPNToken * @return 多因素身份验证令牌Cookie * ERROR0 : 网络错误 * ERROR1 : 密码错误 * ERROR2 : 需要使用外网网址进行访问 */ - public static String VerifyPhoneOTP(Context context, String CASCookie, String OTP, String VPNToken) { - HttpConnectionAndCode response = Net.verifyPhoneOTP(context, CASCookie, OTP, VPNToken); + public static String VerifyPhoneOTP(Context context, String OTP, String CASCookie) { + HttpConnectionAndCode response = Net.verifyPhoneOTP(context, OTP, CASCookie); if (response.code != 0) { if (response.code == -5) { return "ERROR2"; @@ -97,17 +103,7 @@ public class StaticService { return "ERROR0"; } else { if (response.comment.contains("reAuth_success")) { - if (VPNToken == null) { - return response.cookie; - } else { - String MultiFactorCookie = response.cookie.substring(response.cookie.indexOf("MULTIFACTOR_USERS")); - int CookieEnd = MultiFactorCookie.indexOf(";"); - if (CookieEnd >= 0) { - return MultiFactorCookie.substring(0, CookieEnd); - } else { - return MultiFactorCookie; - } - } + return response.cookie; } return "ERROR1"; } @@ -116,46 +112,45 @@ public class StaticService { /** * 获取SSO登录CasCookie * - * @param context context - * @param account 学号 - * @param password 密码 - * @param VPNToken VPNToken + * @param context context + * @param account 学号 + * @param password 密码 + * @param MFACookie MFA Cookie + * @param TGTToken TGTToken * @return CAS Cookie * ERROR0 : 网络错误 * ERROR1 : 密码错误 * ERROR2 : 需要使用外网网址进行访问 * ERROR5 : 2FA Needed */ - public static String SSOLogin(Context context, String account, String password, String VPNToken) { - HttpConnectionAndCode response = Net.getCASToken(context, account, password, VPNToken); + public static String SSOLogin(Context context, String account, String password, String TGTToken, String MFACookie) { + HttpConnectionAndCode response = Net.getCASToken(context, account, password, TGTToken, MFACookie); if (response.code != 0) { - if (response.code == -5) { - return "ERROR2"; + if (response.code == 1) { + String Location = response.c.getHeaderField("location"); + if (Location.contains("reAuthLoginView.do")) { + return "ERROR5;" + TGTToken + "; " + response.cookie; + } + if (MFACookie != null) { + return MFACookie + "; " + TGTToken; + } else { + return TGTToken; + } + } + if (response.code == -8) { + return "ERROR1"; } return "ERROR0"; } else { - if (VPNToken == null) { - String Cookie = response.cookie; - if (Cookie.contains("TGT-")) { - String Location = response.c.getHeaderField("location"); - if (Location.contains("reAuthLoginView.do")) { - return "ERROR5;" + Cookie; - } - return Cookie; - } else { - return "ERROR1"; + String Cookie = response.cookie; + if (Cookie.contains("TGT-")) { + String Location = response.c.getHeaderField("location"); + if (Location.contains("reAuthLoginView.do")) { + return "ERROR5;" + Cookie; } + return Cookie; } else { - String Cookie = response.comment; - if (Cookie.contains("TGT-")) { - String Location = response.c.getHeaderField("location"); - if (Location.contains("reAuthLoginView.do")) { - return "ERROR5;" + Cookie; - } - return Cookie; - } else { - return "ERROR1"; - } + return "ERROR1"; } } } @@ -166,25 +161,18 @@ public class StaticService { * @param context context * @param CASCookie CAS Cookie * @param service ST令牌的服务端 - * @param VPNToken VPNToken * @return ST令牌 * ERROR0 : 网络错误 * ERROR1 : TGT失效 * ERROR2 : 需要使用外网网址进行访问 或 TGT失效(上层调用时,若内网返回此错误, * 则先尝试外网,若是TGT失效,则重新获取;若正常获取,则需要将全局网络设置为外网) */ - public static String SSOGetST(Context context, String CASCookie, String service, String VPNToken) { - HttpConnectionAndCode response = Net.getSTbyCas(context, CASCookie, service, VPNToken); + public static String SSOGetST(Context context, String CASCookie, String service, String MFACookie) { + HttpConnectionAndCode response = Net.getSTbyCas(context, CASCookie, service, MFACookie); if (response.code != -7) { if (response.code == -5) { - if (VPNToken != null) { - return "ERROR1"; - } return "ERROR2"; } - if (response.cookie.contains("refresh")) { - return "ERROR1"; - } return "ERROR0"; } else { String Location = response.c.getHeaderField("location"); @@ -198,39 +186,41 @@ public class StaticService { /** * 通过ST令牌登录VPN * - * @param ST ST令牌 - * @param token 用于接收登录后的cookie + * @param context context + * @param ST ST令牌 + * @param VPNToken 用于接收登录后的cookie * @return 登录结果 * 0 -- 登录成功 * -1 -- 登录失败 * -2 -- 发生异常 */ - public static int loginVPNST(String ST, String token) { - - String url = "https://v.guet.edu.cn/https/77726476706e69737468656265737421e6b94689222426557a1dc7af96/login?cas_login=true&ticket="; - url = url + ST; - OkHttpClient okHttpClient = new OkHttpClient(); - if (token == null) { - token = ""; + public static int loginVPNST(Context context, String ST, String VPNToken) { + HttpConnectionAndCode response = Net.loginVPNST(context, ST, VPNToken); + if (response.code == 0) { + if (response.c.getURL().toString().contains("wengine-vpn-token-login")) { + return 0; + } } - final Request request = new Request.Builder() - .url(url) - .addHeader("Cookie", token) - .build(); - final Call call = okHttpClient.newCall(request); + return -1; + } - try { - Response response = call.execute(); - response.close(); - if (response.body() == null || Objects.requireNonNull(response.body()).toString().contains("html lang=\"zh-cmn\"")) { - return -1; - } else { + /** + * 向VPN添加Cookie + * + * @param host 域 + * @param path 路径 + * @param cookie cookie + * @param VPNToken VPN Token + * @return 0 成功 + */ + public static int CookieSet(Context context, String host, String path, String cookie, String VPNToken) { + HttpConnectionAndCode response = Net.CookieSet(context, host, path, cookie, VPNToken); + if (response.code == 0) { + if (response.comment.contains("success")) { return 0; } - } catch (IOException e) { - e.printStackTrace(); - return -2; } + return -1; } /** @@ -244,34 +234,12 @@ public class StaticService { * -2 -- 教务登录失败 * -3 -- 发生异常 */ - public static int loginBkjwVPNST(String ST, String VPNToken) { - - String url = "https://v.guet.edu.cn/http/77726476706e69737468656265737421f2fc4b8b69377d556a468ca88d1b203b/?ticket="; - url = url + ST; - if (VPNToken == null) { - VPNToken = ""; - } - OkHttpClient okHttpClient = new OkHttpClient(); - final Request request = new Request.Builder() - .url(url) - .addHeader("Cookie", VPNToken) - .build(); - final Call call = okHttpClient.newCall(request); - - try { - Response response = call.execute(); - response.close(); - if (response.body() == null || Objects.requireNonNull(response.body()).toString().contains("html lang=\"zh-cmn\"")) { - return -1; - } else if (response.body() == null || Objects.requireNonNull(response.body()).toString().contains("统一身份认证平台")) { - return -2; - } else { - return 0; - } - } catch (IOException e) { - e.printStackTrace(); - return -3; + public static int loginBkjwVPNST(Context context, String ST, String VPNToken) { + HttpConnectionAndCode response = Net.loginBkjwVPNST(context, ST, VPNToken); + if (response.code == 0) { + return 0; } + return -1; } /** @@ -310,7 +278,7 @@ public class StaticService { */ public static List getResit(Context context, String cookie) { List resitBeans = new ArrayList<>(); - HttpConnectionAndCode resitInfo = Net.getResit(context, cookie, TokenData.isVPN); + HttpConnectionAndCode resitInfo = Net.getResit(context, cookie, TokenData.isVPN()); if (resitInfo.code == 0) { BaseResponse> baseResponse = new Gson().fromJson(resitInfo.comment, new TypeToken>>() { }.getType()); @@ -331,7 +299,7 @@ public class StaticService { * @return 基本学生信息 */ public static StudentInfo getStudentInfo(Context context, String cookie) { - HttpConnectionAndCode studentInfo = Net.studentInfo(context, cookie, TokenData.isVPN); + HttpConnectionAndCode studentInfo = Net.studentInfo(context, cookie, TokenData.isVPN()); if (studentInfo.code == 0) { return new Gson().fromJson(studentInfo.comment, StudentInfo.class); } else { @@ -348,7 +316,7 @@ public class StaticService { * @return 理论课程列表 */ public static List getClass(Context context, String cookie, String term) { - HttpConnectionAndCode classTable = Net.getClassTable(context, cookie, term, TokenData.isVPN); + HttpConnectionAndCode classTable = Net.getClassTable(context, cookie, term, TokenData.isVPN()); if (classTable.code == 0) { List courseBeans = new ArrayList<>(); BaseResponse> baseResponse = new Gson().fromJson(classTable.comment, new TypeToken>>() { @@ -371,7 +339,7 @@ public class StaticService { * @return 课内实验列表 */ public static List getLab(Context context, String cookie, String term) { - HttpConnectionAndCode labTable = Net.getLabTable(context, cookie, term, TokenData.isVPN); + HttpConnectionAndCode labTable = Net.getLabTable(context, cookie, term, TokenData.isVPN()); if (labTable.code == 0) { List courseBeans = new ArrayList<>(); BaseResponse> baseResponse = new Gson().fromJson(labTable.comment, new TypeToken>>() { @@ -399,7 +367,7 @@ public class StaticService { */ public static List getExam(Context context, String cookie, String term) { List examBeans = new ArrayList<>(); - HttpConnectionAndCode examInfo = Net.getExam(context, cookie, term, TokenData.isVPN); + HttpConnectionAndCode examInfo = Net.getExam(context, cookie, term, TokenData.isVPN()); if (examInfo.code == 0) { BaseResponse> baseResponse = new Gson().fromJson(examInfo.comment, new TypeToken>>() { }.getType()); @@ -421,7 +389,7 @@ public class StaticService { */ public static List getCET(Context context, String cookie) { List cetBeans = new ArrayList<>(); - HttpConnectionAndCode cetInfo = Net.getCET(context, cookie, TokenData.isVPN); + HttpConnectionAndCode cetInfo = Net.getCET(context, cookie, TokenData.isVPN()); if (cetInfo.code == 0) { BaseResponse> baseResponse = new Gson().fromJson(cetInfo.comment, new TypeToken>>() { }.getType()); @@ -443,7 +411,7 @@ public class StaticService { */ public static List getExamScore(Context context, String cookie) { List examScoreBeans = new ArrayList<>(); - HttpConnectionAndCode examScoreInfo = Net.getExamScore(context, cookie, TokenData.isVPN); + HttpConnectionAndCode examScoreInfo = Net.getExamScore(context, cookie, TokenData.isVPN()); if (examScoreInfo.code == 0) { BaseResponse> baseResponse = new Gson().fromJson(examScoreInfo.comment, new TypeToken>>() { }.getType()); @@ -465,7 +433,7 @@ public class StaticService { */ public static List getExperimentScore(Context context, String cookie) { List experimentScoreBeans = new ArrayList<>(); - HttpConnectionAndCode experimentScoreInfo = Net.getExperimentScore(context, cookie, TokenData.isVPN); + HttpConnectionAndCode experimentScoreInfo = Net.getExperimentScore(context, cookie, TokenData.isVPN()); if (experimentScoreInfo.code == 0) { BaseResponse> baseResponse = new Gson().fromJson(experimentScoreInfo.comment, new TypeToken>>() { }.getType()); @@ -486,9 +454,9 @@ public class StaticService { * @return 有效学分列表 */ public static List getEffectiveCredits(Context context, String cookie) { - HttpConnectionAndCode updateResult = Net.updateEffectiveCredits(context, cookie, TokenData.isVPN); + HttpConnectionAndCode updateResult = Net.updateEffectiveCredits(context, cookie, TokenData.isVPN()); if (updateResult.comment != null && updateResult.comment.contains("提取成功")) { //更新成功 - HttpConnectionAndCode getResult = Net.getEffectiveCredits(context, cookie, TokenData.isVPN); + HttpConnectionAndCode getResult = Net.getEffectiveCredits(context, cookie, TokenData.isVPN()); if (getResult.code == 0) { BaseResponse> baseResponse = new Gson().fromJson(getResult.comment, new TypeToken>>() { }.getType()); @@ -509,9 +477,9 @@ public class StaticService { * @return 计划课程列表 */ public static List getPlannedCourses(Context context, String cookie) { - HttpConnectionAndCode updateResult = Net.updateEffectiveCredits(context, cookie, TokenData.isVPN); + HttpConnectionAndCode updateResult = Net.updateEffectiveCredits(context, cookie, TokenData.isVPN()); if (updateResult.comment != null && updateResult.comment.contains("提取成功")) { //更新成功 - HttpConnectionAndCode getResult = Net.getPlannedCourses(context, cookie, TokenData.isVPN); + HttpConnectionAndCode getResult = Net.getPlannedCourses(context, cookie, TokenData.isVPN()); if (getResult.code == 0) { BaseResponse> baseResponse = new Gson().fromJson(getResult.comment, new TypeToken>>() { }.getType()); @@ -656,7 +624,7 @@ public class StaticService { y++; } //教务总学分绩替换 - HttpConnectionAndCode httpConnectionAndCode = Net.getGrades(context, cookie, TokenData.isVPN); + HttpConnectionAndCode httpConnectionAndCode = Net.getGrades(context, cookie, TokenData.isVPN()); if (httpConnectionAndCode.code == 0) { try { BaseResponse> baseResponse = new Gson().fromJson(httpConnectionAndCode.comment, new TypeToken>>() { @@ -683,7 +651,7 @@ public class StaticService { */ public static List getSelectedCourse(Context context, String cookie, String term) { try { - HttpConnectionAndCode httpConnectionAndCode = Net.getSelectedCourse(context, cookie, term, TokenData.isVPN); + HttpConnectionAndCode httpConnectionAndCode = Net.getSelectedCourse(context, cookie, term, TokenData.isVPN()); String comment = httpConnectionAndCode.comment; List list; BaseResponse> result = new Gson().fromJson(comment, new TypeToken>>() { @@ -708,7 +676,7 @@ public class StaticService { */ public static List getTerms(Context context, String cookie) { try { - HttpConnectionAndCode httpConnectionAndCode = Net.getAllTerms(context, cookie, TokenData.isVPN); + HttpConnectionAndCode httpConnectionAndCode = Net.getAllTerms(context, cookie, TokenData.isVPN()); String comment = httpConnectionAndCode.comment; BaseResponse> baseResponse = new Gson().fromJson(comment, new TypeToken>>() { }.getType()); diff --git a/app/src/main/java/top/yvyan/guettable/util/GuideTipsDialog.java b/app/src/main/java/top/yvyan/guettable/util/GuideTipsDialog.java new file mode 100644 index 0000000000000000000000000000000000000000..548c64fda4b6b7814728e2f3b18c30c5dd76b491 --- /dev/null +++ b/app/src/main/java/top/yvyan/guettable/util/GuideTipsDialog.java @@ -0,0 +1,190 @@ +package top.yvyan.guettable.util; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; + +import com.google.gson.Gson; +import com.xuexiang.xui.widget.dialog.BaseDialog; +import com.xuexiang.xutil.common.ObjectUtils; +import com.xuexiang.xutil.net.type.TypeBuilder; +import com.zhy.http.okhttp.OkHttpUtils; +import com.zhy.http.okhttp.callback.StringCallback; +import com.zzhoujay.richtext.RichText; + +import java.lang.reflect.Type; +import java.util.List; + +import okhttp3.Call; +import top.yvyan.guettable.Http.entity.ApiResult; +import top.yvyan.guettable.R; +import top.yvyan.guettable.bean.TipInfo; + +public class GuideTipsDialog extends BaseDialog implements View.OnClickListener { + private static final String TIPS_URL = "https://gitee.com/fireworkwing/resource/raw/master/GuetTable/tips.json"; + + private List mTips; + private int mIndex = -1; + + private TextView mTvPrevious; + private TextView mTvNext; + + private TextView mTvTitle; + private TextView mTvContent; + + /** + * 显示提示 + * + * @param context 上下文 + */ + public static void showTips(final Context context) { + showTipsForce(context); + } + + /** + * 强制显示提示 + * + * @param context 上下文 + */ + public static void showTipsForce(Context context) { + OkHttpUtils.get() + .url(TIPS_URL) + .build() + .execute(new StringCallback() { + @Override + public void onError(Call call, Exception e, int id) { + + } + + @Override + public void onResponse(String response, int id) { + showTips(context, response); + } + }); + } + + + private static void showTips(Context context, String response) { + Type type = TypeBuilder.newInstance(ApiResult.class) + .beginSubType(List.class) + .addTypeParam(TipInfo.class) + .endSubType() + .build(); + + ApiResult> apiResult = new Gson().fromJson(response, type); + if (apiResult != null) { + List tips = apiResult.getData(); + if (ObjectUtils.isNotEmpty(tips)) { + new GuideTipsDialog(context, tips).show(); + } + } + } + + public GuideTipsDialog(Context context, @NonNull List tips) { + super(context, R.layout.dialog_guide); + initViews(); + updateTips(tips); + } + + /** + * 初始化弹窗 + */ + private void initViews() { + mTvTitle = findViewById(R.id.tv_title); + mTvContent = findViewById(R.id.tv_content); + ImageView ivClose = findViewById(R.id.iv_close); + + mTvPrevious = findViewById(R.id.tv_previous); + mTvNext = findViewById(R.id.tv_next); + + if (ivClose != null) { + ivClose.setOnClickListener(this); + } + mTvPrevious.setOnClickListener(this); + mTvNext.setOnClickListener(this); + mTvPrevious.setEnabled(false); + mTvNext.setEnabled(true); + setCancelable(false); + setCanceledOnTouchOutside(true); + } + + /** + * 更新提示信息 + * + * @param tips 提示信息 + */ + private void updateTips(List tips) { + mTips = tips; + if (mTips != null && mTips.size() > 0 && mTvContent != null) { + mIndex = 0; + showRichText(mTips.get(mIndex)); + } + } + + /** + * 切换提示信息 + * + * @param index 索引 + */ + private void switchTipInfo(int index) { + if (mTips != null && mTips.size() > 0 && mTvContent != null) { + if (index >= 0 && index <= mTips.size() - 1) { + showRichText(mTips.get(index)); + if (index == 0) { + mTvPrevious.setEnabled(false); + mTvNext.setEnabled(true); + } else if (index == mTips.size() - 1) { + mTvPrevious.setEnabled(true); + mTvNext.setEnabled(false); + } else { + mTvPrevious.setEnabled(true); + mTvNext.setEnabled(true); + } + } + } + } + + /** + * 显示富文本 + * + * @param tipInfo 提示信息 + */ + private void showRichText(TipInfo tipInfo) { + mTvTitle.setText(tipInfo.getTitle()); + RichText.fromHtml(tipInfo.getContent()) + .bind(this) + .into(mTvContent); + } + + @SuppressLint("NonConstantResourceId") + @Override + public void onClick(View view) { + switch (view.getId()) { + case R.id.iv_close: + dismiss(); + break; + case R.id.tv_previous: + if (mIndex > 0) { + mIndex--; + switchTipInfo(mIndex); + } + break; + case R.id.tv_next: + if (mIndex < mTips.size() - 1) { + mIndex++; + switchTipInfo(mIndex); + } + break; + default: + break; + } + } + + @Override + public void onDetachedFromWindow() { + } +} diff --git a/app/src/main/java/top/yvyan/guettable/util/RSAUtil.java b/app/src/main/java/top/yvyan/guettable/util/RSAUtil.java deleted file mode 100644 index 171abf28390384bf88f4161cb2ad28ce8d332abd..0000000000000000000000000000000000000000 --- a/app/src/main/java/top/yvyan/guettable/util/RSAUtil.java +++ /dev/null @@ -1,60 +0,0 @@ -package top.yvyan.guettable.util; - -import java.math.BigInteger; -import java.security.KeyFactory; -import java.security.PublicKey; -import java.security.spec.RSAPublicKeySpec; - -import javax.crypto.Cipher; - -public class RSAUtil { - private static final String publicExponentStr = "010001"; - private static final String modulusStr = "00b5eeb166e069920e80bebd1fea4829d3d1f3216f2aabe79b6c47a3c18dcee5fd22c2e7ac519cab59198ece036dcf289ea8201e2a0b9ded307f8fb704136eaeb670286f5ad44e691005ba9ea5af04ada5367cd724b5a26fdb5120cc95b6431604bd219c6b7d83a6f8f24b43918ea988a76f93c333aa5a20991493d4eb1117e7b1"; - - /** - * CAS登录RSA公钥加密 - * - * @param text 未加密字符串 - * @return RSA加密后的字符串(16进制字符串) - */ - public static String CASEncryption(String text) { - try { - //公钥加密 - KeyFactory keyFactory = KeyFactory.getInstance("RSA"); - BigInteger modulus = new BigInteger(modulusStr, 16); - BigInteger publicExponent = new BigInteger(publicExponentStr, 16); - RSAPublicKeySpec rsaPublicKeySpec = new RSAPublicKeySpec(modulus, publicExponent); - PublicKey publicKey = keyFactory.generatePublic(rsaPublicKeySpec); - Cipher cipher = Cipher.getInstance("RSA"); - cipher.init(Cipher.ENCRYPT_MODE, publicKey); - byte[] encryptData = cipher.doFinal(text.getBytes()); - return byte2hex(encryptData); - } catch (Exception ignored) { - } - return null; - } - - /** - * 字节数组转换为十六进制字符串 - * - * @param b 需要转换的字节数组 - * @return String 十六进制字符串 - */ - public static String byte2hex(byte[] b) { - if (b == null) { - throw new IllegalArgumentException( - "Argument b ( byte array ) is null! "); - } - StringBuilder hs = new StringBuilder(); - String stmp; - for (byte value : b) { - stmp = Integer.toHexString(value & 0xff); - if (stmp.length() == 1) { - hs.append("0").append(stmp); - } else { - hs.append(stmp); - } - } - return hs.toString(); - } -} diff --git a/app/src/main/java/top/yvyan/guettable/util/SerializeUtil.java b/app/src/main/java/top/yvyan/guettable/util/SerializeUtil.java deleted file mode 100644 index 61abbee8d4f99e93f32f14f37858315f476c45ae..0000000000000000000000000000000000000000 --- a/app/src/main/java/top/yvyan/guettable/util/SerializeUtil.java +++ /dev/null @@ -1,45 +0,0 @@ -package top.yvyan.guettable.util; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.nio.charset.StandardCharsets; - -public class SerializeUtil { - /** - * 对象 -> 字符串 - * - * @param obj 对象 - * @return 序列化的字符串 - * @throws IOException IOException - */ - public static String serialize(Object obj) throws IOException { - ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); - ObjectOutputStream objectOutputStream; - objectOutputStream = new ObjectOutputStream(byteArrayOutputStream); - objectOutputStream.writeObject(obj); - String string = byteArrayOutputStream.toString("ISO-8859-1"); - objectOutputStream.close(); - byteArrayOutputStream.close(); - return string; - } - - /** - * 字符串 -> 对象 - * - * @param str 序列化的字符串 - * @return 对象 - * @throws IOException IOException - * @throws ClassNotFoundException ClassNotFoundException - */ - public static Object serializeToObject(String str) throws IOException, ClassNotFoundException { - ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(str.getBytes(StandardCharsets.ISO_8859_1)); - ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream); - Object object = objectInputStream.readObject(); - objectInputStream.close(); - byteArrayInputStream.close(); - return object; - } -} diff --git a/app/src/main/java/top/yvyan/guettable/util/UrlReplaceUtil.java b/app/src/main/java/top/yvyan/guettable/util/UrlReplaceUtil.java index c860b071d65957781e10339c92d61635a632ed39..b71038b8844a2c415e517796642cc4d6f5fa2491 100644 --- a/app/src/main/java/top/yvyan/guettable/util/UrlReplaceUtil.java +++ b/app/src/main/java/top/yvyan/guettable/util/UrlReplaceUtil.java @@ -2,36 +2,13 @@ package top.yvyan.guettable.util; public class UrlReplaceUtil { - /** - * URL替换(使国院教务系统可以和通用教务系统共同使用) - * - * @param isInternational 是否为国院账号 - * @param url URL后接内容(https://gyjxgl.guet.edu.cn/Login/SubmitLogin -> /Login/SubmitLogin) - * @return 完整的URL(https://gyjxgl.guet.edu.cn/Login/SubmitLogin) - */ - public static String getUrlByInternational(boolean isInternational, String url) { - String path = "https://bkjw.guet.edu.cn"; - String internationalPath = "https://gyjxgl.guet.edu.cn"; - if (isInternational) { - return internationalPath + url; - } else { - return path + url; - } - } - - public static String getUrlByVPN(boolean isVPN, String url) { + public static String getBkjwUrlByVPN(boolean isVPN, String url) { String bkjwPath = "https://bkjw.guet.edu.cn"; - String internationalPath = "https://gyjxgl.guet.edu.cn"; String bkjwVPNPath = "https://v.guet.edu.cn/https/77726476706e69737468656265737421f2fc4b8b69377d556a468ca88d1b203b"; - String internationalBkjwVPNPath = "https://v.guet.edu.cn/https/77726476706e69737468656265737421f7ee4b84203c26576b0d9de29d51367b8932"; - if (url.contains(bkjwPath)) { - if (isVPN) { - url = url.replace(bkjwPath, bkjwVPNPath); - } - } else if (url.contains(internationalPath)) { - if (isVPN) { - url = url.replace(internationalPath, internationalBkjwVPNPath); - } + if (isVPN) { + url = bkjwVPNPath + url; + } else { + url = bkjwPath + url; } return url; } diff --git a/app/src/main/java/top/yvyan/guettable/widget/WidgetService.java b/app/src/main/java/top/yvyan/guettable/widget/WidgetService.java index d0ee3036dcf0205cfb626edeb4121286da3e2d77..001d598a9df2ea6b3cf8422a536a72872b593b86 100644 --- a/app/src/main/java/top/yvyan/guettable/widget/WidgetService.java +++ b/app/src/main/java/top/yvyan/guettable/widget/WidgetService.java @@ -22,7 +22,6 @@ public class WidgetService extends RemoteViewsService { private GeneralData generalData; private SettingData settingData; - private ScheduleData scheduleData; private static final String TAG = "RemoteViewsService"; @Override @@ -32,7 +31,6 @@ public class WidgetService extends RemoteViewsService { try { generalData = GeneralData.newInstance(getApplicationContext()); settingData = SettingData.newInstance(getApplicationContext()); - scheduleData = ScheduleData.newInstance(getApplicationContext()); todayList = new ArrayList<>(getTodayList()); } catch (Exception e) { Log.d(TAG, "Exception: " + e.getMessage()); @@ -44,20 +42,20 @@ public class WidgetService extends RemoteViewsService { // 日课表的获取当日课程方法 private List getTodayList() { List list; - if (!scheduleData.getCourseBeans().isEmpty()) { - list = ScheduleSupport.transform(scheduleData.getCourseBeans()); + if (!ScheduleData.getCourseBeans().isEmpty()) { + list = ScheduleSupport.transform(ScheduleData.getCourseBeans()); } else { list = new ArrayList<>(); } - for (CourseBean courseBean : scheduleData.getUserCourseBeans()) { + for (CourseBean courseBean : ScheduleData.getUserCourseBeans()) { list.add(courseBean.getSchedule()); } if (settingData.getShowLibOnTable()) { - List labList = ScheduleSupport.transform(scheduleData.getLibBeans()); + List labList = ScheduleSupport.transform(ScheduleData.getLibBeans()); list.addAll(labList); } if (settingData.getShowExamOnTable()) { - for (ExamBean examBean : CourseUtil.combineExam(scheduleData.getExamBeans())) { + for (ExamBean examBean : CourseUtil.combineExam(ScheduleData.getExamBeans())) { if (examBean != null && examBean.getWeek() != 0) { list.add(examBean.getSchedule()); } diff --git a/app/src/main/java/top/yvyan/guettable/widget/WidgetServiceFactory.java b/app/src/main/java/top/yvyan/guettable/widget/WidgetServiceFactory.java index 2c0a8721f3af2c64c401b3bede7ebaf988fbb9dc..118d6d42ea7d556b8c6860391b630653bac4e6e2 100644 --- a/app/src/main/java/top/yvyan/guettable/widget/WidgetServiceFactory.java +++ b/app/src/main/java/top/yvyan/guettable/widget/WidgetServiceFactory.java @@ -29,7 +29,6 @@ public class WidgetServiceFactory implements RemoteViewsService.RemoteViewsFacto private List dataList; private GeneralData generalData; private SettingData settingData; - private ScheduleData scheduleData; private static final String TAG = "WidgetServiceFactory"; @@ -52,9 +51,6 @@ public class WidgetServiceFactory implements RemoteViewsService.RemoteViewsFacto if (settingData == null) { settingData = SettingData.newInstance(context); } - if (scheduleData == null) { - scheduleData = ScheduleData.newInstance(context); - } dataList = getTodayList(); } @@ -124,20 +120,20 @@ public class WidgetServiceFactory implements RemoteViewsService.RemoteViewsFacto // 日课表的获取当日课程方法 private List getTodayList() { List list; - if (!scheduleData.getCourseBeans().isEmpty()) { - list = ScheduleSupport.transform(scheduleData.getCourseBeans()); + if (!ScheduleData.getCourseBeans().isEmpty()) { + list = ScheduleSupport.transform(ScheduleData.getCourseBeans()); } else { list = new ArrayList<>(); } - for (CourseBean courseBean : scheduleData.getUserCourseBeans()) { + for (CourseBean courseBean : ScheduleData.getUserCourseBeans()) { list.add(courseBean.getSchedule()); } if (settingData.getShowLibOnTable()) { - List labList = ScheduleSupport.transform(scheduleData.getLibBeans()); + List labList = ScheduleSupport.transform(ScheduleData.getLibBeans()); list.addAll(labList); } if (settingData.getShowExamOnTable()) { - for (ExamBean examBean : CourseUtil.combineExam(scheduleData.getExamBeans())) { + for (ExamBean examBean : CourseUtil.combineExam(ScheduleData.getExamBeans())) { if (examBean != null && examBean.getWeek() != 0) { list.add(examBean.getSchedule()); } diff --git a/app/src/main/res/drawable/bg_dialog_common_tip_corner_white.xml b/app/src/main/res/drawable/bg_dialog_common_tip_corner_white.xml new file mode 100644 index 0000000000000000000000000000000000000000..dbcadadd6578a6eb1c0a354d4cb5d5e49ef24db1 --- /dev/null +++ b/app/src/main/res/drawable/bg_dialog_common_tip_corner_white.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_action_close_white.xml b/app/src/main/res/drawable/ic_action_close_white.xml new file mode 100644 index 0000000000000000000000000000000000000000..75c5deed14b3a58716b95495144689a82d4a2820 --- /dev/null +++ b/app/src/main/res/drawable/ic_action_close_white.xml @@ -0,0 +1,22 @@ + + + + diff --git a/app/src/main/res/drawable/img_guide_tip_top.xml b/app/src/main/res/drawable/img_guide_tip_top.xml new file mode 100644 index 0000000000000000000000000000000000000000..f684094994d7b52a7a4383a0342a6b3e6fbe1756 --- /dev/null +++ b/app/src/main/res/drawable/img_guide_tip_top.xml @@ -0,0 +1,36 @@ + + + + + + + diff --git a/app/src/main/res/layout/activity_about.xml b/app/src/main/res/layout/activity_about.xml index 23b6942b0fffb034696417784a7c68b04eb9bb26..ad01191d6e003393f16374dcd22b825fb624fd65 100644 --- a/app/src/main/res/layout/activity_about.xml +++ b/app/src/main/res/layout/activity_about.xml @@ -50,9 +50,11 @@ android:layout_height="wrap_content" android:layout_below="@+id/about_picture" android:layout_centerInParent="true" + android:textStyle="bold" + android:letterSpacing="0.2" android:text="@string/app_name" - android:textColor="@color/tab_unchecked" - android:textSize="20sp" /> + android:textColor="@color/app_black" + android:textSize="24sp" /> @@ -76,7 +78,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="5dp" - android:text="版本" + android:text="@string/version_hint" android:textColor="@color/app_black" android:textSize="16sp" /> @@ -104,7 +106,8 @@ android:orientation="vertical" android:background="?attr/selectableItemBackground" android:clickable="true" - android:focusable="true"> + android:focusable="true" + tools:ignore="UsingOnClickInXml"> @@ -136,7 +139,8 @@ android:orientation="vertical" android:background="?attr/selectableItemBackground" android:clickable="true" - android:focusable="true"> + android:focusable="true" + tools:ignore="UsingOnClickInXml"> @@ -183,7 +187,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="5dp" - android:text="作者" + android:text="@string/author_hint" android:textColor="@color/app_black" android:textSize="16sp" /> @@ -220,7 +224,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="5dp" - android:text="特别鸣谢" + android:text="@string/thinks_hint" android:textColor="@color/app_black" android:textSize="16sp" /> @@ -248,7 +252,8 @@ android:orientation="vertical" android:background="?attr/selectableItemBackground" android:clickable="true" - android:focusable="true"> + android:focusable="true" + tools:ignore="UsingOnClickInXml"> + android:focusable="true" + tools:ignore="UsingOnClickInXml"> @@ -312,7 +318,8 @@ android:orientation="vertical" android:background="?attr/selectableItemBackground" android:clickable="true" - android:focusable="true"> + android:focusable="true" + tools:ignore="UsingOnClickInXml"> @@ -344,7 +351,8 @@ android:orientation="vertical" android:background="?attr/selectableItemBackground" android:clickable="true" - android:focusable="true"> + android:focusable="true" + tools:ignore="UsingOnClickInXml"> @@ -376,7 +384,8 @@ android:orientation="vertical" android:background="?attr/selectableItemBackground" android:clickable="true" - android:focusable="true"> + android:focusable="true" + tools:ignore="UsingOnClickInXml"> @@ -408,7 +417,8 @@ android:orientation="vertical" android:background="?attr/selectableItemBackground" android:clickable="true" - android:focusable="true"> + android:focusable="true" + tools:ignore="UsingOnClickInXml"> diff --git a/app/src/main/res/layout/activity_launch.xml b/app/src/main/res/layout/activity_launch.xml index 8aa31953dda8c9e1b7ca19f373c0c632db09025d..529bddb071f2a0a0630eb32084938d68fdacc6c7 100644 --- a/app/src/main/res/layout/activity_launch.xml +++ b/app/src/main/res/layout/activity_launch.xml @@ -13,9 +13,9 @@ tools:ignore="UselessParent"> diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index 1488252857b117e4efe5aa126190410e5969bbe0..74fab167392ee6c09d791fb6ca59ee760535828e 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -91,7 +91,7 @@ tools:ignore="ContentDescription" /> - - - - - - - - - - - - - - - - @@ -33,6 +33,9 @@ android:id="@+id/detail_text_1" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:typeface="serif" + android:textStyle="bold" + android:letterSpacing="0.1" android:layout_marginTop="3dp" android:textColor="#000000" android:textSize="18sp" /> @@ -41,7 +44,7 @@ android:id="@+id/detail_text_2" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginTop="3dp" /> + android:layout_marginTop="8dp" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragement_person.xml b/app/src/main/res/layout/fragement_person.xml index 17bce337432bff856a013a654c91b6b6b171b6fa..62b67a36081ba1e6461e40ed7edb6d1e774a421c 100644 --- a/app/src/main/res/layout/fragement_person.xml +++ b/app/src/main/res/layout/fragement_person.xml @@ -108,7 +108,6 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="8dp" - android:text="" android:textColor="@color/app_black" android:textSize="18sp" /> @@ -117,9 +116,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="4dp" - android:text="" - android:textColor="@color/app_black" - android:textSize="18sp" /> + android:textSize="16sp" /> diff --git a/app/src/main/res/layout/planned_course_cardview.xml b/app/src/main/res/layout/planned_course_cardview.xml index 82d2e306da4299967ead4b3da4ae4bf128158ac5..928e5eab926a880ba5a0386eec47d0d8bd14f213 100644 --- a/app/src/main/res/layout/planned_course_cardview.xml +++ b/app/src/main/res/layout/planned_course_cardview.xml @@ -50,10 +50,13 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="10dp" - android:layout_marginTop="3dp" - android:layout_marginBottom="3dp" - android:textColor="#ff000000" + android:layout_marginTop="5dp" + android:layout_marginBottom="5dp" + android:textColor="#000000" android:textSize="16sp" + android:typeface="serif" + android:textStyle="bold" + android:letterSpacing="0.1" app:layout_constraintEnd_toStartOf="@+id/guideline2" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> diff --git a/app/src/main/res/layout/score_cardview.xml b/app/src/main/res/layout/score_cardview.xml index 8b1bcd4b95b5c2975974885bf7babd3de6ebe1b9..9f74fdeefd300634f6c6e3dd6ff4994e319742f4 100644 --- a/app/src/main/res/layout/score_cardview.xml +++ b/app/src/main/res/layout/score_cardview.xml @@ -59,7 +59,10 @@ android:layout_marginStart="10dp" android:layout_marginTop="4dp" android:textColor="#000000" - android:textSize="14sp" + android:textSize="16sp" + android:typeface="serif" + android:textStyle="bold" + android:letterSpacing="0.1" app:layout_constraintEnd_toStartOf="@+id/guideline2" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -71,7 +74,7 @@ android:layout_marginStart="10dp" android:layout_marginTop="1dp" android:layout_marginBottom="4dp" - android:textSize="13sp" + android:textSize="14sp" app:layout_constraintEnd_toStartOf="@+id/guideline2" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/course_name" /> diff --git a/app/src/main/res/layout/teacher_cardview.xml b/app/src/main/res/layout/teacher_cardview.xml deleted file mode 100644 index 37d47fb68f824e6cb27582ab2898bf02cdd4a153..0000000000000000000000000000000000000000 --- a/app/src/main/res/layout/teacher_cardview.xml +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/textbook_cardview.xml b/app/src/main/res/layout/textbook_cardview.xml deleted file mode 100644 index 3d9b8bacfe2770bdc1786991441e38d166627b79..0000000000000000000000000000000000000000 --- a/app/src/main/res/layout/textbook_cardview.xml +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index c1bf31e041d1ce5fe5d22364d90c3a3e767c7858..b1cba403653eddb4befa6dd813eb444ec73a9f60 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -14,4 +14,9 @@ #FB7299 #FF6705 #06C160 + + #3396D8 + #7F4073 + + #FFF1F1F1 \ No newline at end of file diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 4db8c59062cb60bac199917d01af9728a1772c39..cd2711c27876cb797f7e68e11a7318c0fb1829c9 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -7,4 +7,10 @@ http://developer.android.com/guide/topics/appwidgets/index.html#CreatingLayout --> 0dp + 5dp + 8dp + 10dp + 16dp + 20dp + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5030f0befdad69841cbd77d16e62d1619785a254..b590f01a35379a119b5fefcac43aa0de13835ffc 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -4,13 +4,10 @@ https://v.guet.edu.cn/login https://v.guet.edu.cn - https://v.guet.edu.cn/wengine-vpn/cookie?method=get&host=cas.guet.edu.cn&scheme=https&path=/authserver/login https://cas.guet.edu.cn/authserver/login - https://v.guet.edu.cn/https/77726476706e69737468656265737421f3f652d220256d44300d8db9d6562d/authserver/login https://cas.guet.edu.cn/authserver/dynamicCode/getDynamicCodeByReauth.do - https://v.guet.edu.cn/https/77726476706e69737468656265737421f3f652d220256d44300d8db9d6562d/authserver/dynamicCode/getDynamicCodeByReauth.do https://cas.guet.edu.cn/authserver/reAuthCheck/reAuthSubmit.do - https://v.guet.edu.cn/https/77726476706e69737468656265737421f3f652d220256d44300d8db9d6562d/authserver/reAuthCheck/reAuthSubmit.do + https://cas.guet.edu.cn/authserver/reAuthCheck/reAuthLoginView.do?isMultifactor=true&service=http%3A%2F%2Ficampus.guet.edu.cn%2FGuetAccount%2FCasLogin application/x-www-form-urlencoded;charset=UTF-8 https://cas.guet.edu.cn/ service=https%3A%2F%2Fbkjw.guet.edu.cn @@ -80,10 +77,6 @@ https://v.guet.edu.cn/http/77726476706e69737468656265737421e5e3529f69377d556a468ca88d1b203b/CourseArrange.aspx?wrdrecordvisit=1640584485000 http://utsc.guet.edu.cn/EmptyClassRoom.aspx https://v.guet.edu.cn/http/77726476706e69737468656265737421e5e3529f69377d556a468ca88d1b203b/EmptyClassRoom.aspx?mCode=001503 - 校内公告 - http://weixin.guet.edu.cn/News?type=0 - 校内通知 - http://weixin.guet.edu.cn/News?type=4 桂电课程表交流群 b6B5JNbpsHV0scWnS1amN7NH3Ry-LlrP @@ -134,7 +127,7 @@ Casual | 就这 | ୧⍤⃝ⓍⓅ乏了 | 我终究不是个好人 | 🍓 | sin² | 沉山浮阳 | 迷 | 稚隳 - https://bkjw.guet.edu.cn/student/GetSctCourse + /student/GetSctCourse @@ -203,5 +196,15 @@ 0 学分绩查询属于公测阶段,正在逐步优化,目前计算方法为只统计对应年度及格的必修和限选课程,若您有更好的计算方法,欢迎进群反馈,我们一起让它变好!(V4) wing | ssbird | tank | uuin | bbaa + 官方QQ交流群(点击加群) + 版本 + 加入我们 + 作者 + 特别鸣谢 + 开发者自语 + 项目开源 + 开源引用 + 隐私政策 + 声明 \ No newline at end of file diff --git a/build.gradle b/build.gradle index 37c1339644996f62b4fde4970f590fcf8fcfe623..f1b3e5eb59c65b1caee35961b8509b6a91133a62 100644 --- a/build.gradle +++ b/build.gradle @@ -2,7 +2,15 @@ buildscript { repositories { google() - jcenter() + // 阿里云云效仓库:https://maven.aliyun.com/mvn/guide + maven { url 'https://maven.aliyun.com/repository/jcenter' } + maven { url 'https://maven.aliyun.com/repository/google' } + // 华为开源镜像:https://mirrors.huaweicloud.com + maven { url 'https://repo.huaweicloud.com/repository/maven' } + // JitPack 远程仓库:https://jitpack.io + maven { url 'https://jitpack.io' } + // MavenCentral 远程仓库:https://mvnrepository.com + mavenCentral() maven { url 'https://dl.bintray.com/umsdk/release' } } dependencies { @@ -16,7 +24,9 @@ buildscript { allprojects { repositories { google() - jcenter() + maven { url 'https://maven.aliyun.com/repository/jcenter' } + maven { url 'https://maven.aliyun.com/repository/google' } + maven { url 'https://repo.huaweicloud.com/repository/maven' } maven { url 'https://jitpack.io' } maven { url 'https://repo1.maven.org/maven2/' } maven { url "http://maven.aliyun.com/nexus/content/repositories/releases" }