diff --git a/app/build.gradle b/app/build.gradle index 3c64ccb82c67c752fa5dbe8724d9a843e1189517..3c67f76453db2acfe4236fa4d3b13de774e9c978 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,13 +2,13 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' android { - compileSdkVersion 29 - buildToolsVersion "30.0.2" + compileSdkVersion 30 + buildToolsVersion "30.0.3" defaultConfig { applicationId "fr.nitorac.aurionweb" minSdkVersion 19 - targetSdkVersion 29 + targetSdkVersion 30 versionCode 4 versionName "1.1.2" multiDexEnabled true @@ -33,18 +33,18 @@ android { dependencies { implementation fileTree(dir: "libs", include: ["*.jar"]) implementation 'androidx.appcompat:appcompat:1.2.0' - implementation 'com.google.android.material:material:1.2.1' - implementation 'androidx.constraintlayout:constraintlayout:2.0.1' + implementation 'com.google.android.material:material:1.3.0' + implementation 'androidx.constraintlayout:constraintlayout:2.0.4' implementation 'androidx.vectordrawable:vectordrawable:1.1.0' - implementation 'androidx.navigation:navigation-fragment:2.3.0' - implementation 'androidx.navigation:navigation-ui:2.3.0' + implementation 'androidx.navigation:navigation-fragment-ktx:2.3.5' + implementation 'androidx.navigation:navigation-ui-ktx:2.3.5' implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0' implementation 'org.jsoup:jsoup:1.13.1' implementation 'com.google.code.gson:gson:2.8.6' implementation 'org.projectlombok:lombok:1.18.12' annotationProcessor 'org.projectlombok:lombok:1.18.12' - implementation "androidx.webkit:webkit:1.4.0-alpha01" + implementation "androidx.webkit:webkit:1.4.0" implementation 'com.github.lzyzsd:circleprogress:1.2.1' implementation 'com.mindorks.android:prdownloader:0.6.0' @@ -57,9 +57,9 @@ dependencies { androidTestImplementation 'androidx.test.ext:junit:1.1.2' androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' - coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.10' + coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5' implementation "androidx.core:core-ktx:1.3.2" - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0" + implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1" implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" } repositories { diff --git a/app/src/main/java/fr/nitorac/aurionweb/MainActivity.java b/app/src/main/java/fr/nitorac/aurionweb/MainActivity.java index d1e48ada97f505d1d6d04627a3a2d7e48f51d35c..b1d52c654f44ccb35147a4f98422e63de21763be 100644 --- a/app/src/main/java/fr/nitorac/aurionweb/MainActivity.java +++ b/app/src/main/java/fr/nitorac/aurionweb/MainActivity.java @@ -56,17 +56,15 @@ public class MainActivity extends AppCompatActivity { @Override public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case R.id.connect_menuitem: - try{ - AurionManager.getInstance().spawnLoginDialog(this); - }catch (Exception e){ - Toast.makeText(this, "Impossible d'afficher la connexion (Erreur : " + e.getLocalizedMessage() + ")", Toast.LENGTH_LONG).show(); - } - return true; - default: - return super.onOptionsItemSelected(item); + if (item.getItemId() == R.id.connect_menuitem){ + try{ + AurionManager.getInstance().spawnLoginDialog(this); + }catch (Exception e){ + Toast.makeText(this, "Impossible d'afficher la connexion (Erreur : " + e.getLocalizedMessage() + ")", Toast.LENGTH_LONG).show(); + } + return true; } + return super.onOptionsItemSelected(item); } diff --git a/app/src/main/java/fr/nitorac/aurionweb/aurionweb/AurionManager.java b/app/src/main/java/fr/nitorac/aurionweb/aurionweb/AurionManager.java index d4f32c361c9b34d35b993498ce0a9e7ad9d21cba..3b99ec8c0899791adbdb852785f360e672056cf6 100644 --- a/app/src/main/java/fr/nitorac/aurionweb/aurionweb/AurionManager.java +++ b/app/src/main/java/fr/nitorac/aurionweb/aurionweb/AurionManager.java @@ -81,6 +81,33 @@ public class AurionManager { return respDoc; } + public Document reachMyResultsFromInit(AurionSession session) throws IOException, GeneralSecurityException { + // On charge une fois la page pour valider un affichage fictif (cote server aurion) + // Requête effective permettant la validation de l'authentification sur CAS + Connection.Response resp = Utils.wrapSSL("https://aurionweb.ensiie.fr/faces/MainMenuPage.xhtml") + .method(Connection.Method.POST) + .followRedirects(true) + .header("Cache-Control", "max-age=0") + .header("Content-Type", "application/x-www-form-urlencoded") + .header("Host", "aurionweb.ensiie.fr") + .header("Origin", "https://aurionweb.ensiie.fr") + .header("Referer", "https://aurionweb.ensiie.fr/") + .header("Upgrade-Insecure-Requests", "1") + .header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36") + .cookie("JSESSIONID", session.getJSESSIONID()) + .data("form", "form") + //.data("form:largeurDivCenter", "1219") + //.data("form:sauvegarde", "") + .data("form:sidebar", "form:sidebar") + .data("form:sidebar_menuid", session.getSubmenuResId()) + .data("javax.faces.ViewState", session.getViewState()) + .execute(); + Document respDoc = resp.parse(); + session.parseViewState(respDoc); + + return respDoc; + } + // Instancie une connection vers AurionWeb public Document initConnection(AurionSession session, String username, String pwd) throws IOException, GeneralSecurityException { session.clear(); @@ -91,7 +118,7 @@ public class AurionManager { .header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36") .execute(); String execution = initRes.parse().getElementsByAttributeValue("name", "execution").get(0).attr("value"); - //Requête effective permettant la validation de l'authentification sur CAS + Connection secConn = Utils.wrapSSL("https://cas.ensiie.fr/login?service=https%3A%2F%2Faurionweb.ensiie.fr%2F%2Flogin%2Fcas") .method(Connection.Method.POST) .followRedirects(true) @@ -117,6 +144,44 @@ public class AurionManager { session.parseConnectMenuFormId(doc1); //On trouve l'ID du bouton Emploi du temps (pour les requêtes) session.parseConnectMenuId(doc1); + //On trouve l'ID du bouton Resultats (pour les requêtes) + session.parseConnectMenuResId(doc1); + + return doc1; + } + + public Document initResultsSection(AurionSession session) throws GeneralSecurityException, IOException { + Connection.Response tmp = Utils.wrapSSL("https://aurionweb.ensiie.fr/faces/MainMenuPage.xhtml") + .method(Connection.Method.POST) + .followRedirects(true) + .header("Cache-Control", "max-age=0") + .header("Content-Type", "application/x-www-form-urlencoded") + .header("Host", "aurionweb.ensiie.fr") + .header("Origin", "https://aurionweb.ensiie.fr") + .header("Referer", "https://aurionweb.ensiie.fr/") + .header("Faces-Request", "partial/ajax") + .header("Upgrade-Insecure-Requests", "1") + .header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36") + .cookie("JSESSIONID", session.getJSESSIONID()) + .data("javax.faces.partial.ajax", "true") + .data("javax.faces.source", session.getMenuFormId()) + .data("javax.faces.partial.execute", session.getMenuFormId()) + .data("javax.faces.partial.render", "form:sidebar") + .data(session.getMenuFormId(), session.getMenuFormId()) + .data("webscolaapp.Sidebar.ID_SUBMENU", session.getMenuResId()) + .data("form", "form") + //.data("form:largeurDivCenter", "1219") + //.data("form:sauvegarde", "") + .data("javax.faces.ViewState", session.getViewState()) + .execute(); + Document doc2 = tmp.parse(); + session.parseViewState(doc2); + session.parseConnectSubmenuResId(doc2); + + return doc2; + } + + public Document initEdtSection(AurionSession session) throws GeneralSecurityException, IOException { //Requête effective permettant la validation de l'authentification sur CAS Connection.Response tmp = Utils.wrapSSL("https://aurionweb.ensiie.fr/faces/MainMenuPage.xhtml") .method(Connection.Method.POST) diff --git a/app/src/main/java/fr/nitorac/aurionweb/aurionweb/AurionSession.java b/app/src/main/java/fr/nitorac/aurionweb/aurionweb/AurionSession.java index a7db5bb43a5035e51708a231c538af4bba2594df..afa7e38ea7d841a6011a94a5a19b4d755d18c7f6 100644 --- a/app/src/main/java/fr/nitorac/aurionweb/aurionweb/AurionSession.java +++ b/app/src/main/java/fr/nitorac/aurionweb/aurionweb/AurionSession.java @@ -41,11 +41,17 @@ public class AurionSession { private String viewState = ""; @Setter(AccessLevel.NONE) private String menuFormId = ""; + + //Variables ID pour les Résultats @Setter(AccessLevel.NONE) - private String menuId = ""; + private String menuResId = ""; + @Setter(AccessLevel.NONE) + private String submenuResId = ""; //Variables ID pour le ChoixPlanning @Setter(AccessLevel.NONE) + private String menuId = ""; + @Setter(AccessLevel.NONE) private String submenuId = ""; @Setter(AccessLevel.NONE) private String choixpFormId = ""; @@ -95,7 +101,7 @@ public class AurionSession { doc = setLastDoc(doc); //Maintenant on va récupérer l'ID du menu qu'on souhaite, c'est à dire Emploi du temps // (Oui c'est bien un menu même si on cherche une balise avec submenu_... comme classe x) (c'est aurionweb) - Element menuClass = doc.getElementsByAttributeValueContaining("class", "submenu_").stream().filter(e -> e.text().contains("Emploi du temps")).findFirst().orElse(null); + Element menuClass = doc.getElementsByAttributeValueContaining("class", "submenu_").stream().filter(e -> Utils.stripAccents(e.text()).toLowerCase().contains("emploi du temps")).findFirst().orElse(null); menuId = menuClass != null ? menuClass.classNames().stream().filter(c -> c.startsWith("submenu_")).findFirst().orElse("") : null; if (menuId == null) { Log.e(TAG, "Impossible de trouver un menu avec 'Emploi du temps' comme texte !"); @@ -104,10 +110,23 @@ public class AurionSession { return true; } + public boolean parseConnectMenuResId(Document doc) { + doc = setLastDoc(doc); + //Maintenant on va récupérer l'ID du menu qu'on souhaite, c'est à dire Résultats + // (Oui c'est bien un menu même si on cherche une balise avec submenu_... comme classe x) (c'est aurionweb) + Element menuClass = doc.getElementsByAttributeValueContaining("class", "submenu_").stream().filter(e -> Utils.stripAccents(e.text()).toLowerCase().trim().contains("resultat")).findFirst().orElse(null); + menuResId = menuClass != null ? menuClass.classNames().stream().filter(c -> c.startsWith("submenu_")).findFirst().orElse("") : null; + if (menuResId == null) { + Log.e(TAG, "Impossible de trouver un menu avec 'Résultat' comme texte !"); + return false; + } + return true; + } + public boolean parseConnectSubmenuId(Document doc) { doc = setLastDoc(doc); //On va maintenant trouver un ID de la forme '2_1' qui correspond à l'ID du lien "Planning d'un étudiant au choix" - Element liSubmenuID = Jsoup.parse(doc.getElementById("form:sidebar").text()).getElementsByTag("li").stream().filter(e -> e.childNodeSize() == 1 && Utils.stripAccents(e.text()).contains("Mon planning")).findFirst().orElse(null); + Element liSubmenuID = Jsoup.parse(doc.getElementById("form:sidebar").text()).getElementsByTag("li").stream().filter(e -> e.childNodeSize() == 1 && Utils.stripAccents(e.text()).toLowerCase().contains("mon planning")).findFirst().orElse(null); if (liSubmenuID != null) { String onclickAttr = liSubmenuID.child(0).attr("onclick"); Matcher submenuMatcher = liSubmenuPattern.matcher(onclickAttr); @@ -115,7 +134,7 @@ public class AurionSession { submenuId = submenuMatcher.group(1); return true; }else{ - Log.e(TAG, "Impossible de trouver le submenuID dans l'attribut"); + Log.e(TAG, "Impossible de trouver le submenuID dans l'attribut (Section Planning)"); } } else { Log.e(TAG, "Impossible de trouver un sous menu de tag 'li' avec 'Mon planning' comme texte !"); @@ -123,6 +142,25 @@ public class AurionSession { return false; } + public boolean parseConnectSubmenuResId(Document doc) { + doc = setLastDoc(doc); + //On va maintenant trouver un ID de la forme '2_1' qui correspond à l'ID du lien "Planning d'un étudiant au choix" + String t = doc.getElementById("form:sidebar").text(); + Element liSubmenuID = Jsoup.parse(t).getElementsByTag("li").stream().filter(e -> e.childNodeSize() == 1 && Utils.stripAccents(e.text()).toLowerCase().trim().contains("epreuves annee en cours")).findFirst().orElse(null); + if (liSubmenuID != null) { + String onclickAttr = liSubmenuID.child(0).attr("onclick"); + Matcher submenuMatcher = liSubmenuPattern.matcher(onclickAttr); + if (submenuMatcher.find()) { + submenuResId = submenuMatcher.group(1); + return true; + }else{ + Log.e(TAG, "Impossible de trouver le submenuID dans l'attribut (Section annee en cours)"); + } + } else { + Log.e(TAG, "Impossible de trouver un sous menu de tag 'li' avec 'année en cours' comme texte !"); + } + return false; + } public boolean parseChoixPlanningFormId(Document doc) { doc = setLastDoc(doc); diff --git a/app/src/main/java/fr/nitorac/aurionweb/fragments/AurionViewFragment.java b/app/src/main/java/fr/nitorac/aurionweb/fragments/AurionViewFragment.java index a6bebd70b71c98e101228ae5d731858f32354b8b..447b54c960a5aa40baf30dd3369f1d57e2e76962 100644 --- a/app/src/main/java/fr/nitorac/aurionweb/fragments/AurionViewFragment.java +++ b/app/src/main/java/fr/nitorac/aurionweb/fragments/AurionViewFragment.java @@ -45,11 +45,11 @@ public abstract class AurionViewFragment extends Fragment { public abstract void preload(); public void pageFinished(WebView view, String url){ - + //Overridable empty func } public void networkInit(AurionSession session){ - + //Overridable empty func } protected void initLoad(){ diff --git a/app/src/main/java/fr/nitorac/aurionweb/fragments/calendar/CalendarFragment.java b/app/src/main/java/fr/nitorac/aurionweb/fragments/calendar/CalendarFragment.java index bcbb0b0c991521a8ee831847e4a7e9d41a5a334b..f2efe6091f54a0edf4ff991b809b9668a6435e2c 100644 --- a/app/src/main/java/fr/nitorac/aurionweb/fragments/calendar/CalendarFragment.java +++ b/app/src/main/java/fr/nitorac/aurionweb/fragments/calendar/CalendarFragment.java @@ -25,6 +25,7 @@ public class CalendarFragment extends AurionViewFragment { @Override public void networkInit(AurionSession session) { try { + AurionManager.getInstance().initEdtSection(currentSession); AurionManager.getInstance().reachMyEdtFromInit(currentSession); } catch (IOException | GeneralSecurityException e) { e.printStackTrace(); diff --git a/app/src/main/java/fr/nitorac/aurionweb/fragments/calendar/CalendarViewModel.java b/app/src/main/java/fr/nitorac/aurionweb/fragments/calendar/CalendarViewModel.java deleted file mode 100644 index a6ba66c31ffc2095e3012053e6fed54e66af153d..0000000000000000000000000000000000000000 --- a/app/src/main/java/fr/nitorac/aurionweb/fragments/calendar/CalendarViewModel.java +++ /dev/null @@ -1,19 +0,0 @@ -package fr.nitorac.aurionweb.fragments.calendar; - -import androidx.lifecycle.LiveData; -import androidx.lifecycle.MutableLiveData; -import androidx.lifecycle.ViewModel; - -public class CalendarViewModel extends ViewModel { - - private MutableLiveData<String> mText; - - public CalendarViewModel() { - mText = new MutableLiveData<>(); - mText.setValue("This is dashboard fragment"); - } - - public LiveData<String> getText() { - return mText; - } -} \ No newline at end of file diff --git a/app/src/main/java/fr/nitorac/aurionweb/fragments/home/HomeViewModel.java b/app/src/main/java/fr/nitorac/aurionweb/fragments/home/HomeViewModel.java deleted file mode 100644 index e0b9addb1d182ac89538654db7b46b0f2dba3ea1..0000000000000000000000000000000000000000 --- a/app/src/main/java/fr/nitorac/aurionweb/fragments/home/HomeViewModel.java +++ /dev/null @@ -1,19 +0,0 @@ -package fr.nitorac.aurionweb.fragments.home; - -import androidx.lifecycle.LiveData; -import androidx.lifecycle.MutableLiveData; -import androidx.lifecycle.ViewModel; - -public class HomeViewModel extends ViewModel { - - private MutableLiveData<String> mText; - - public HomeViewModel() { - mText = new MutableLiveData<>(); - mText.setValue("This is home fragment"); - } - - public LiveData<String> getText() { - return mText; - } -} \ No newline at end of file diff --git a/app/src/main/java/fr/nitorac/aurionweb/fragments/notifications/NotificationsFragment.java b/app/src/main/java/fr/nitorac/aurionweb/fragments/notifications/NotificationsFragment.java deleted file mode 100644 index fda5e95419c1c323a2a9489ef576a13d25ecf162..0000000000000000000000000000000000000000 --- a/app/src/main/java/fr/nitorac/aurionweb/fragments/notifications/NotificationsFragment.java +++ /dev/null @@ -1,11 +0,0 @@ -package fr.nitorac.aurionweb.fragments.notifications; - -import fr.nitorac.aurionweb.fragments.AurionViewFragment; - -public class NotificationsFragment extends AurionViewFragment { - - @Override - public void preload() { - - } -} \ No newline at end of file diff --git a/app/src/main/java/fr/nitorac/aurionweb/fragments/notifications/NotificationsViewModel.java b/app/src/main/java/fr/nitorac/aurionweb/fragments/notifications/NotificationsViewModel.java deleted file mode 100644 index 56008edaa57f35d808fdb10684de140ff770f5a1..0000000000000000000000000000000000000000 --- a/app/src/main/java/fr/nitorac/aurionweb/fragments/notifications/NotificationsViewModel.java +++ /dev/null @@ -1,19 +0,0 @@ -package fr.nitorac.aurionweb.fragments.notifications; - -import androidx.lifecycle.LiveData; -import androidx.lifecycle.MutableLiveData; -import androidx.lifecycle.ViewModel; - -public class NotificationsViewModel extends ViewModel { - - private MutableLiveData<String> mText; - - public NotificationsViewModel() { - mText = new MutableLiveData<>(); - mText.setValue("This is notifications fragment"); - } - - public LiveData<String> getText() { - return mText; - } -} \ No newline at end of file diff --git a/app/src/main/java/fr/nitorac/aurionweb/fragments/results/ResultsFragment.java b/app/src/main/java/fr/nitorac/aurionweb/fragments/results/ResultsFragment.java new file mode 100644 index 0000000000000000000000000000000000000000..180e6de39992cd2313eab07781699146c5fbe778 --- /dev/null +++ b/app/src/main/java/fr/nitorac/aurionweb/fragments/results/ResultsFragment.java @@ -0,0 +1,50 @@ +package fr.nitorac.aurionweb.fragments.results; + +import android.util.Log; +import android.webkit.WebView; +import android.widget.Toast; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import fr.nitorac.aurionweb.aurionweb.AurionManager; +import fr.nitorac.aurionweb.aurionweb.AurionSession; +import fr.nitorac.aurionweb.fragments.AurionViewFragment; +import fr.nitorac.aurionweb.fragments.home.HomeFragment; + +public class ResultsFragment extends AurionViewFragment { + + public static final String AURION_RES_URL = "https://aurionweb.ensiie.fr/faces/LearnerNotationListPage.xhtml"; + private boolean failed = false; + + @Override + public void pageFinished(WebView view, String url) { + view.evaluateJavascript("$('#form\\\\:headerSubview\\\\:header,.divCurrentUser,.CardBigTopic,.EmptyBox20.cacherImpression').remove();$('#layout-container').css('padding-top', '0rem');$('.CardBigTopic').remove();$('.ui-column-title:contains(Date)').map(function(){return $(this).parent();}).get().forEach(function(e){ $(e).remove();});$('head').append('<style type=\"text/css\">.learnerNotationListPage .dataTable td { white-space: initial; }</style>');var grades = $('td > .ui-column-title:contains(Code)').map(function(){return {'id':$(this).parent().contents().get(1).nodeValue, 'el':$(this).parent().parent()[0]};}).get().sort(function(a,b){var an = parseInt(a['id'].replace(/(^.+?)(\\d+).*$/i,'$2'));var bn = parseInt(b['id'].replace(/(^.+?)(\\d+).*$/i,'$2'));return an==bn?a['id'].localeCompare(b['id']):bn-an;});var table = $('tbody.ui-datatable-data')[0];table.innerHTML='';grades.forEach(function(e){table.append(e['el'])});", paRes -> {}); + } + + @Override + public void networkInit(AurionSession session) { + try { + AurionManager.getInstance().initResultsSection(currentSession); + AurionManager.getInstance().reachMyResultsFromInit(currentSession); + } catch (IOException | GeneralSecurityException e) { + e.printStackTrace(); + failed = true; + Log.e(getClass().getSimpleName(), "Impossible de charger le chemin vers les résultats (" + e.getLocalizedMessage() + ")"); + if(getActivity() != null){ + getActivity().runOnUiThread(() -> { + Toast.makeText(getContext(), "Impossible de charger le chemin vers les résultats (" + e.getLocalizedMessage() + ")", Toast.LENGTH_LONG).show(); + webView.loadUrl(HomeFragment.AURIONURL, getHeaders()); + }); + } + + } + } + + @Override + public void preload() { + if(!failed){ + webView.loadUrl(AURION_RES_URL, getHeaders()); + } + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-anydpi/ic_grade.xml b/app/src/main/res/drawable-anydpi/ic_grade.xml new file mode 100644 index 0000000000000000000000000000000000000000..3095df4cb4d776bf36acd742a99bb59f329894fb --- /dev/null +++ b/app/src/main/res/drawable-anydpi/ic_grade.xml @@ -0,0 +1,11 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24" + android:tint="#FFFFFF" + android:alpha="0.8"> + <path + android:fillColor="@android:color/white" + android:pathData="M5,13.18v4L12,21l7,-3.82v-4L12,17l-7,-3.82zM12,3L1,9l11,6 9,-4.91V17h2V9L12,3z"/> +</vector> diff --git a/app/src/main/res/drawable-hdpi/ic_grade.png b/app/src/main/res/drawable-hdpi/ic_grade.png new file mode 100644 index 0000000000000000000000000000000000000000..d9e980cc34cb411608d3e10b3761074413c6dbfd Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_grade.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_grade.png b/app/src/main/res/drawable-mdpi/ic_grade.png new file mode 100644 index 0000000000000000000000000000000000000000..78963b8a2b3d3669de42f08146116dae875e9dc2 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_grade.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_grade.png b/app/src/main/res/drawable-xhdpi/ic_grade.png new file mode 100644 index 0000000000000000000000000000000000000000..3a4eaa619c0d1b05d64ccff79f0953a90942fc03 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_grade.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_grade.png b/app/src/main/res/drawable-xxhdpi/ic_grade.png new file mode 100644 index 0000000000000000000000000000000000000000..c31eb310b82eca75573919d0e097ad84fc1c586c Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_grade.png differ diff --git a/app/src/main/res/layout/fragment_notifications.xml b/app/src/main/res/layout/fragment_results.xml similarity index 93% rename from app/src/main/res/layout/fragment_notifications.xml rename to app/src/main/res/layout/fragment_results.xml index 258653de4e44054c505565344b86901efe8e67c8..369ea471c0056c2d4175f23cb416ae581c1c2b8f 100644 --- a/app/src/main/res/layout/fragment_notifications.xml +++ b/app/src/main/res/layout/fragment_results.xml @@ -4,7 +4,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context=".fragments.notifications.NotificationsFragment"> + tools:context=".fragments.results.ResultsFragment"> <TextView android:id="@+id/text_notifications" diff --git a/app/src/main/res/menu/bottom_nav_menu.xml b/app/src/main/res/menu/bottom_nav_menu.xml index 994b53ab8483b5707f29268c95895c591b97013b..d5f74808868b993f20b1725e28ce74b68cc29ed3 100644 --- a/app/src/main/res/menu/bottom_nav_menu.xml +++ b/app/src/main/res/menu/bottom_nav_menu.xml @@ -13,7 +13,7 @@ <item android:id="@+id/navigation_notifications" - android:icon="@drawable/ic_notifications_black_24dp" - android:title="@string/title_notifications" /> + android:icon="@drawable/ic_grade" + android:title="@string/title_results" /> </menu> \ No newline at end of file diff --git a/app/src/main/res/navigation/mobile_navigation.xml b/app/src/main/res/navigation/mobile_navigation.xml index 75afbe936681c5a821b9d0db92382ded57a95d2c..d831d683c80f1dc0ba8b7eed08597013c419375f 100644 --- a/app/src/main/res/navigation/mobile_navigation.xml +++ b/app/src/main/res/navigation/mobile_navigation.xml @@ -19,7 +19,7 @@ <fragment android:id="@+id/navigation_notifications" - android:name="fr.nitorac.aurionweb.fragments.notifications.NotificationsFragment" - android:label="@string/title_notifications" - tools:layout="@layout/fragment_notifications" /> + android:name="fr.nitorac.aurionweb.fragments.results.ResultsFragment" + android:label="@string/title_results" + tools:layout="@layout/fragment_results" /> </navigation> \ No newline at end of file diff --git a/app/src/main/res/values-fr-rFR/strings.xml b/app/src/main/res/values-fr-rFR/strings.xml index 86ad9fe4787a22eebcd957e46c59e806f492a76d..4f308dca2189c3d6c37e347d81e2a32a30b750ca 100644 --- a/app/src/main/res/values-fr-rFR/strings.xml +++ b/app/src/main/res/values-fr-rFR/strings.xml @@ -2,6 +2,7 @@ <resources> <string name="app_name">AurionWeb</string> <string name="title_home">Accueil</string> + <string name="title_results">Notes</string> <string name="dialog_update_title">Mise à jour</string> <string name="dialog_update_msg">Une mise à jour est disponible !\n(%1$s -> %2$s)\n\nChangements :\n%3$s\n\nVoulez-vous mettre à jour ?</string> <string name="login_login">Nom d\'utilisateur</string> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6dd03453f84cb8545fa58bd7c0ad8ef7ef76b8cf..1bded9c7d94ab932d7956781c8b3bb146ea73764 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -2,7 +2,7 @@ <string name="app_name">AurionWeb</string> <string name="title_home">Home</string> <string name="title_calendar">Calendar</string> - <string name="title_notifications">Notifications</string> + <string name="title_results">Grades</string> <string name="dialog_update_title">Update</string> <string name="dialog_update_msg">An update is available !\n(%1$s -> %2$s)\n\nChangelogs:\n%3$s\n\nDo you want to update ?</string> <string name="login_login">Login</string> diff --git a/build.gradle b/build.gradle index bfb75dc907684dc261a7b8f6de4f6996df7dffd6..345ea8dc1469c868a2bf770eeed328125ba900b1 100644 --- a/build.gradle +++ b/build.gradle @@ -1,12 +1,12 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.4.10' + ext.kotlin_version = '1.4.32' repositories { google() - jcenter() + mavenCentral() } dependencies { - classpath "com.android.tools.build:gradle:4.0.1" + classpath 'com.android.tools.build:gradle:4.2.0' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // NOTE: Do not place your application dependencies here; they belong @@ -17,7 +17,12 @@ buildscript { allprojects { repositories { google() - jcenter() + mavenCentral() + jcenter() { + content { + includeModule("com.mindorks.android", "prdownloader") + } + } maven { url 'https://jitpack.io' } } } diff --git a/gradle.properties b/gradle.properties index c52ac9b79716c6c430b6ad840ffbafc9c3da528a..3ae7944d22bca736b2232032ba12f6377c91361c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,7 +6,7 @@ # http://www.gradle.org/docs/current/userguide/build_environment.html # Specifies the JVM arguments used for the daemon process. # The setting is particularly useful for tweaking memory settings. -org.gradle.jvmargs=-Xmx2048m +org.gradle.jvmargs=-Xmx4096m -XX:MaxPermSize=1024m # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects @@ -16,4 +16,6 @@ org.gradle.jvmargs=-Xmx2048m # https://developer.android.com/topic/libraries/support-library/androidx-rn android.useAndroidX=true # Automatically convert third-party libraries to use AndroidX -android.enableJetifier=true \ No newline at end of file +android.enableJetifier=true +org.gradle.daemon=true +org.gradle.parallel=true \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 919be2fe32fb04fb62bf796c7a98a3825419c2dd..63203a991a87ea7d9ad144cb624353dec47bcfea 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Fri Oct 02 17:31:26 CEST 2020 +#Sat Mar 13 22:36:21 CET 2021 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-bin.zip diff --git a/local.properties b/local.properties index ee4e8c4d1bbad491982b23a45f92b48a9a186cd8..a782750dac2c57607783058cbf1e32f47adea0f2 100644 --- a/local.properties +++ b/local.properties @@ -1,10 +1,8 @@ -## This file is automatically generated by Android Studio. -# Do not modify this file -- YOUR CHANGES WILL BE ERASED! -# -# This file should *NOT* be checked into Version Control Systems, +## This file must *NOT* be checked into Version Control Systems, # as it contains information specific to your local configuration. # # Location of the SDK. This is only used by Gradle. # For customization when using a Version Control System, please read the # header note. -sdk.dir=D\:\\Users\\Nitorac\\AppData\\Local\\sdk \ No newline at end of file +#Sat Mar 13 22:34:16 CET 2021 +sdk.dir=D\:\\Users\\Nitorac\\AppData\\Local\\Android\\sdk