Java tutorial
/* * This file is part of RSG-Wijzigingen. * * RSG-Wijzigingen is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * RSG-Wijzigingen is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with RSG-Wijzigingen. If not, see <http://www.gnu.org/licenses/>. */ package com.rickendirk.rsgwijzigingen; import android.app.AlarmManager; import android.app.IntentService; import android.app.Notification; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.os.SystemClock; import android.os.Vibrator; import android.preference.PreferenceManager; import android.support.v4.app.NotificationCompat; import android.support.v4.app.NotificationManagerCompat; import android.support.v4.app.TaskStackBuilder; import android.util.Log; import com.google.android.gms.analytics.HitBuilders; import com.google.android.gms.analytics.Tracker; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.Set; public class ZoekService extends IntentService { public static final int notifID = 3395; public static final String TAG = "RSG-Zoekservice"; public static final String TABLE_URL = "http://www.rsgtrompmeesters.nl/roosters/roosterwijzigingen/Lijsterbesstraat/subst_001.htm"; public ZoekService() { super("Zoekservice"); } @Override protected void onHandleIntent(Intent intent) { SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this); boolean clusters_enabled = sp.getBoolean("pref_cluster_enabled", true); boolean alleenBijWifi = sp.getBoolean("pref_auto_zoek_wifi", false); boolean isAchtergrond = intent.getBooleanExtra("isAchtergrond", false); if (alleenBijWifi && isAchtergrond) { ConnectivityManager conManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo nwInfo = conManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); if (!nwInfo.isConnectedOrConnecting()) { //Later weer proberen: nu geen wifi setAlarmIn20Min(); return; } } Wijzigingen wijzigingen = checkerNieuw(clusters_enabled); //Tracken dat er is gezocht OwnApplication application = (OwnApplication) getApplication(); Tracker tracker = application.getDefaultTracker(); if (isAchtergrond) { tracker.send( new HitBuilders.EventBuilder().setCategory("Acties").setAction("Zoeken_achtergrond").build()); sendNotification(wijzigingen); } else { tracker.send( new HitBuilders.EventBuilder().setCategory("Acties").setAction("Zoeken_voorgrond").build()); boolean isFoutMelding = wijzigingen.isFoutmelding(); if (!isFoutMelding) wijzigingen.saveToSP(this); broadcastResult(wijzigingen, clusters_enabled); } } private void setAlarmIn20Min() { Intent zoekIntent = new Intent(this, ZoekService.class); zoekIntent.putExtra("isAchtergrond", true); zoekIntent.addCategory("GeenWifiHerhaling"); //Categorie om andere intents cancelen te voorkomen PendingIntent pendingIntent = PendingIntent.getService(this, 3, zoekIntent, PendingIntent.FLAG_ONE_SHOT); AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); Long in20Min = SystemClock.elapsedRealtime() + 1200000; //20Min in milisec. manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, in20Min, pendingIntent); Log.i(TAG, "Nieuw alarm gezet in 20 min"); } private void sendNotification(Wijzigingen wijzigingen) { boolean isFoutMelding = wijzigingen.isFoutmelding(); boolean isVerbindFout; boolean isNieuw; //Tot tegendeel bewezen is if (isFoutMelding) { isVerbindFout = wijzigingen.isVerbindfout(); isNieuw = false; } else { isVerbindFout = false; isNieuw = wijzigingen.isNieuw(this); } if (!isFoutMelding) { wijzigingen.saveToSP(this); } if (!isFoutMelding && !isNieuw) { Log.i(TAG, "Geen nieuwe wijzigingen, geen notificatie"); return; } NotificationCompat.Builder builder = new NotificationCompat.Builder(this) .setSmallIcon(R.drawable.ic_rsg_notific).setContentTitle("Roosterwijzigingen") .setColor(getResources().getColor(R.color.lighter_blue)) .setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_LIGHTS); if (isFoutMelding) { if (isVerbindFout) { Log.i(TAG, "Er was geen internetverbinding bij het zoeken"); boolean moetHerhalen = PreferenceManager.getDefaultSharedPreferences(this) .getBoolean("pref_auto_herhaal_geenInternet", false); if (moetHerhalen) { setAlarmIn20Min(); Log.i(TAG, "Zal ivm geen internet in 20 minuten opnieuw zoeken"); return; } else { builder.setContentText("Er was geen internetverbinding. Probeer het handmatig opnieuw"); } } else { builder.setContentText("Er was een fout. Probeer het handmatig opnieuw"); } } else { boolean zijnWijzigingen = wijzigingen.zijnWijzigingen; ArrayList<String> wijzigingenList = wijzigingen.getWijzigingen(); addPossibleMessage(wijzigingen, wijzigingenList); if (zijnWijzigingen) { if (wijzigingenList.size() == 1) { builder.setContentText(wijzigingenList.get(0)); } else { builder.setContentText("Er zijn " + wijzigingenList.size() + " wijzigingen!"); NotificationCompat.InboxStyle inboxStyle = new NotificationCompat.InboxStyle(); inboxStyle.setBigContentTitle("De roosterwijzigingen zijn:"); for (int i = 0; i < wijzigingenList.size(); i++) { inboxStyle.addLine(wijzigingenList.get(i)); } builder.setStyle(inboxStyle); } } else { boolean alleenBijWijziging = PreferenceManager.getDefaultSharedPreferences(this) .getBoolean("pref_auto_zoek_alleenBijWijziging", true); if (!alleenBijWijziging) { //Dus ook bij geen-wijzigingen builder.setContentText("Er zijn geen roosterwijzigingen"); } else return; } } Intent resultIntent = new Intent(this, MainActivity.class); resultIntent.putExtra("isVanNotificatie", true); TaskStackBuilder stackBuilder = TaskStackBuilder.create(this); stackBuilder.addParentStack(MainActivity.class); stackBuilder.addNextIntent(resultIntent); PendingIntent pendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_CANCEL_CURRENT); builder.setContentIntent(pendingIntent); NotificationManagerCompat notifManager = NotificationManagerCompat.from(this); notifManager.notify(notifID, builder.build()); vibrate(); Log.i(TAG, "Nieuwe notificatie gemaakt"); } private void addPossibleMessage(Wijzigingen wijzigingen, ArrayList<String> wijzigingenList) { if (wijzigingen.hasMessage) { String msg = wijzigingen.getMessage(); String klas = corrigeerKlas(PreferenceManager.getDefaultSharedPreferences(getApplicationContext()) .getString("pref_klas", "")); if (msg.contains(klas)) { //Klassenlijst moet er nog tussenuitgeknipt String cleanmsg = wijzigingen.getCleanMSG(); wijzigingenList.add(0, cleanmsg); } else if (msg.contains("Let op") || msg.contains("blijvend")) { wijzigingenList.add(0, msg); } } } private void sPreferencesSaver(ArrayList<String> wijzigingen) { String standZin = "Stand van" + wijzigingen.get(wijzigingen.size() - 1); String dagEnDatum = wijzigingen.get(wijzigingen.size() - 2); //Mag originele lijst niet aanpassen ArrayList<String> wijzigingenNieuw = new ArrayList<>(wijzigingen); //Nu kunnen stand en datum eruit wijzigingenNieuw.remove(wijzigingenNieuw.size() - 1); wijzigingenNieuw.remove(wijzigingenNieuw.size() - 1); //Deze is nu de laatste, laatste 2 moeten eruit SharedPreferences.Editor spEditor = PreferenceManager.getDefaultSharedPreferences(this).edit(); Set<String> wijzigingenSet = new HashSet<>(); wijzigingenSet.addAll(wijzigingenNieuw); spEditor.putStringSet("last_wijzigingenList", wijzigingenSet); spEditor.putString("stand", standZin); spEditor.putString("dagEnDatum", dagEnDatum); spEditor.commit(); } private void vibrate() { Vibrator vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE); if (vibrator.hasVibrator()) { //Eerste waarde vertraging, 2e duur, 3e vertraging, 4e duur, etc long[] pattern = { 0, 250, 600, 250 }; vibrator.vibrate(pattern, -1); // -1 betekent geen herhaling } } private ArrayList<String> maakLijstSchoon(ArrayList<String> wijzigingen) { wijzigingen.remove(wijzigingen.size() - 1); wijzigingen.remove(wijzigingen.size() - 1); return wijzigingen; } private boolean zijnWijzigingen(ArrayList<String> wijzigingen) { String listLaatst = wijzigingen.get(wijzigingen.size() - 1); // Lijst is hier al opgeschoond if (listLaatst.equals("Er zijn geen roosterwijzigingen")) { return false; } else return true; } private boolean isFoutmelding(ArrayList<String> wijzigingen) { String listLaatst = wijzigingen.get(wijzigingen.size() - 1); if (listLaatst.equals("geenKlas") || listLaatst.equals("verbindFout") || listLaatst.equals("EersteTekenLetter") || listLaatst.equals("klasMeerDan4Tekens") || listLaatst.equals("geenTabel") || listLaatst.equals("andereFout") || listLaatst.equals("geenClusters")) { return true; } else { return false; } } private boolean isVerbindFout(ArrayList<String> wijzigingen) { String listLaatst = wijzigingen.get(wijzigingen.size() - 1); return listLaatst.equals("verbindFout"); } private void broadcastResult(Wijzigingen wijzigingen, Boolean clusters_enabled) { Intent broadcastIntent = new Intent(); broadcastIntent.addCategory(Intent.CATEGORY_DEFAULT); broadcastIntent.setAction(MainFragment.ZoekReceiver.ACTION_RESP); //Nodig voor intentfilter broadcastIntent.putExtra("wijzigingen", wijzigingen); if (clusters_enabled) { broadcastIntent.putExtra("clustersAan", true); } else { broadcastIntent.putExtra("clustersAan", false); } sendBroadcast(broadcastIntent); } public String getURL() { int nummerOud = PreferenceManager.getDefaultSharedPreferences(this).getInt("URLInt", 2); //Wisselen tussen URL's via even/oneven nummer: if is even, else is oneven String URLStr; if (nummerOud % 2 == 0) { URLStr = "https://raw.githubusercontent.com/Richyrick/RoosterwijzigingChecker/master/deps/example_website.htm"; } else { URLStr = "https://raw.githubusercontent.com/Richyrick/RoosterwijzigingChecker/master/deps/example_website_2.htm"; } int nummerNieuw = nummerOud + 1; //Nieuw nummer opslaan voor volgende keer SharedPreferences.Editor spEditor = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()) .edit(); spEditor.putInt("URLInt", nummerNieuw); spEditor.commit(); return URLStr; } private Wijzigingen checkerNieuw(boolean clusters_enabled) { Wijzigingen wijzigingen = new Wijzigingen(false, null); //String halen uit SP String klasTextS = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()) .getString("pref_klas", ""); //Checken of klas niet leeg is if (klasTextS.equals("")) { wijzigingen.setFout("geenKlas"); return wijzigingen; } //Eerste teken klas mag geen letter zijn if (Character.isLetter(klasTextS.charAt(0))) { wijzigingen.setFout("EersteTekenLetter"); return wijzigingen; } String klasGoed = corrigeerKlas(klasTextS); if (klasGoed.equals("TeLangeKlas")) { wijzigingen.setFout("klasMeerDan4Tekens"); return wijzigingen; } ArrayList<String> clusters = new ArrayList<>(); if (clusters_enabled) { clusters.addAll(getClusters()); //Lege clusters weghalen clusters.removeAll(Collections.singleton("")); //Clusters moeten aanwezig zijn if (clusters.isEmpty()) { wijzigingen.setFout("geenClusters"); return wijzigingen; } } Document doc; try { doc = Jsoup.connect(TABLE_URL).get(); } catch (java.io.IOException e) { wijzigingen.setFout("verbindFout"); return wijzigingen; } Elements tables = doc.select("table"); if (tables.size() < 2) { //Geen geschikte tabel aanwezig wijzigingen.setFout("geenTabel"); return wijzigingen; } Element table = tables.get(1); Elements rows = table.select("tr"); ArrayList<Element> rowsList; if (clusters_enabled) { rowsList = getWijzigingenListClusters(rows, klasGoed, clusters); } else { rowsList = getwijzigingenListKlas(rows, klasGoed); } if (rowsList.isEmpty()) { //Geen wijzigingen TODO: Onderstaande comment weghalen als alles werkt //list.add("Er zijn geen roosterwijzigingen"); wijzigingen.zijnWijzigingen = false; } else { maakWijzigingenKlas(rowsList, wijzigingen); } addDagEnDatum(wijzigingen, doc); addMessage(wijzigingen, doc); return wijzigingen; } private void addMessage(Wijzigingen wijzigingen, Document doc) { Elements messageSpan = doc.select("body > div > div > div > table > tbody > tr:nth-child(1)"); if (!messageSpan.isEmpty()) { String message = messageSpan.first().text(); wijzigingen.setMessage(message); } } private ArrayList<Element> getWijzigingenListClusters(Elements rows, String klas, ArrayList<String> clusters) { ArrayList<Element> list = new ArrayList<>(); //Dubbele loop, over zowel tabel als lijst met clusters for (int a = 0; a < clusters.size(); a++) { String cluster = clusters.get(a); for (int i = 2; i < rows.size(); i++) { Element row = rows.get(i); Elements cols = row.select("td"); String klasWijziging = cols.get(0).text(); String clusterWijziging = cols.get(2).text(); if (klasWijziging.contains(klas) && clusterWijziging.equals(cluster)) { list.add(row); } } } return list; } private ArrayList<String> getClusters() { SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); ArrayList<String> clusters = new ArrayList<>(); for (int i = 1; i < 15; i++) { //String initializen, anders kan hij hem niet toevoegen String clusterLowCase = ""; String cluster = sp.getString("pref_cluster" + i, ""); //If om nullpointer te voorkomen if (!cluster.equals("")) { clusterLowCase = cluster.substring(0, 1).toLowerCase() + cluster.substring(1); } clusters.add(clusterLowCase); } return clusters; } private void addDagEnDatum(Wijzigingen wijzigingen, Document doc) { //Dag waarvoor wijzigingen zijn ophalen Element dag = doc.select("body > div > div:nth-child(2) > p > b > span").first(); //Compatibiliteit met andere opmaak, om NPE te voorkomen if (dag == null) { dag = doc.select("body > center:nth-child(2) > div").first(); } String dagStr = dag.text().toLowerCase(); // Woorden staan verkeerd om: omwisselen int indexVanSpatie = dagStr.indexOf(" "); String datum = dagStr.substring(0, indexVanSpatie); String rest = dagStr.substring(indexVanSpatie + 1); String dagGoed = rest + " " + datum; wijzigingen.setDagEnDatum(dagGoed); //Stand ophalen: staat in 1e tabel van HTML Element tableDate = doc.select("table").get(0); String dateFullText = tableDate.getElementsContainingOwnText("Stand:").text(); //Deel achter "Stand:" pakken String FullTextSplit[] = dateFullText.split("Stand:"); wijzigingen.setStandZin("Stand van" + FullTextSplit[1]); } private void maakWijzigingenKlas(ArrayList<Element> rowsList, Wijzigingen wijzigingen) { for (int i = 0; i < rowsList.size(); i++) { Element row = rowsList.get(i); Elements cols = row.select("td"); String uur = Jsoup.parse(cols.get(1).toString()).text(); String vakOud = Jsoup.parse(cols.get(2).toString()).text(); String docentOud = Jsoup.parse(cols.get(3).toString()).text(); String vakNieuw = Jsoup.parse(cols.get(4).toString()).text(); String docentNieuw = Jsoup.parse(cols.get(5).toString()).text(); String lokaal = Jsoup.parse(cols.get(6).toString()).text(); String ipv = Jsoup.parse(cols.get(7).toString()).text(); String naar = Jsoup.parse(cols.get(8).toString()).text(); String opmerking = ""; if (cols.size() > 9) { opmerking = Jsoup.parse(cols.get(9).toString()).text(); } String wijzigingKaal; //5 opties: Uitval, uur verplaatst, lokaal verplaatst, docent vervangen of anders if (lokaal.contains("--")) { //2 Opties: Uur wordt verplaatst of valt uit if (naar.contains("Uitval")) { wijzigingKaal = uur + "e uur " + vakOud + " valt uit"; } else { wijzigingKaal = uur + "e uur wordt verplaatst"; //naar wordt later toegevoegd } } else if (vakOud.equals(vakNieuw) && docentOud.equals(docentNieuw)) { // Verplaatsing lokaal wijzigingKaal = uur + "e uur " + vakOud + " wordt verplaatst naar " + lokaal; } else if (vakOud.equals(vakNieuw) && !docentOud.equals(docentNieuw)) { //Opvang door andere docent wijzigingKaal = uur + "e uur " + docentOud + " wordt opgevangen door " + docentNieuw + " in " + lokaal; } else { //Andere, onbekende wijziging: dit is een "backup"-optie wijzigingKaal = uur + "e uur " + vakOud + " " + docentOud + " wordt " + vakNieuw + " " + docentNieuw + " in " + lokaal; } String ipvZin = ""; if (ipv.contains("/")) { ipvZin = " ipv " + ipv; } String naarZin = ""; if (naar.contains("/")) { naarZin = " naar " + naar; } String opmerkingZin = ""; if (!opmerking.equals("\u00a0") && cols.size() > 9) { //Opmerking mag niet leeg zijn en wel aanwezig opmerkingZin = " (" + opmerking + ")"; } String wijziging = wijzigingKaal + ipvZin + naarZin + opmerkingZin; wijzigingen.addWijziging(wijziging); } //Kunnen, vooral bij onderbouw, dubbele wijzigingen in zitten verwijderDubbeleWijzigingen(wijzigingen); } private void verwijderDubbeleWijzigingen(Wijzigingen wijzigingen) { for (int i = 0; i < wijzigingen.getSize(); i++) { String wijziging = wijzigingen.getWijzigingen().get(i); for (int a = i + 1; a < wijzigingen.getSize(); a++) { //Plus 1 zodat eerste niet wordt verwijderd String wijziging2 = wijzigingen.getWijzigingen().get(a); if (wijziging.equals(wijziging2)) wijzigingen.removeWijziging(a); } } } private ArrayList<Element> getwijzigingenListKlas(Elements rows, String klas) { ArrayList<Element> list = new ArrayList<>(); for (int i = 2; i < rows.size(); i++) { Element row = rows.get(i); Elements cols = row.select("td"); String klasWijziging = cols.get(0).text(); if (klasWijziging.contains(klas)) { list.add(row); } } return list; } private String corrigeerKlas(String klasTextS) { //String opsplitsen in 2 delen, om naar hoofdletters te converteren char charcijfer = klasTextS.charAt(0); String klascijfer = String.valueOf(charcijfer); char charafdeling = klasTextS.charAt(1); String klasafdelingBig = String.valueOf(charafdeling).toUpperCase(); String klasGoed; switch (klasTextS.length()) { case 2: klasGoed = klascijfer + klasafdelingBig; break; case 3: char klasabc = klasTextS.charAt(2); String klasabcSmall = String.valueOf(klasabc).toLowerCase(); klasGoed = klascijfer + klasafdelingBig + klasabcSmall; break; case 4: char klasafdeling2 = klasTextS.charAt(2); String klasafdeling2Big = String.valueOf(klasafdeling2).toUpperCase(); klasabc = klasTextS.charAt(3); klasabcSmall = String.valueOf(klasabc).toLowerCase(); klasGoed = klascijfer + klasafdelingBig + klasafdeling2Big + klasabcSmall; break; default: klasGoed = "TeLangeKlas"; } return klasGoed; } private ArrayList<String> checkerKlas() { ArrayList<String> tempList = new ArrayList<>(); //String halen uit SP String klasTextS = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()) .getString("pref_klas", ""); //Checken of klas niet leeg is if (klasTextS.equals("")) { tempList.add("geenKlas"); return tempList; } //Eerste teken klas mag geen letter zijn if (Character.isLetter(klasTextS.charAt(0))) { tempList.add("EersteTekenLetter"); return tempList; } //String opsplitsen in 2 delen, om naar hoofdletters te converteren char charcijfer = klasTextS.charAt(0); String klascijfer = String.valueOf(charcijfer); char charafdeling = klasTextS.charAt(1); String klasafdelingBig = String.valueOf(charafdeling).toUpperCase(); //Onderstaand voor hoofdlettercorrectie String klasCorrect; //KlasCorrect is klas na hoofdlettercorrectie switch (klasTextS.length()) { case 2: klasCorrect = klascijfer + klasafdelingBig; break; case 3: char klasabc = klasTextS.charAt(2); String klasabcSmall = String.valueOf(klasabc).toLowerCase(); klasCorrect = klascijfer + klasafdelingBig + klasabcSmall; break; case 4: char klasafdeling2 = klasTextS.charAt(2); String klasafdeling2Big = String.valueOf(klasafdeling2).toUpperCase(); klasabc = klasTextS.charAt(3); klasabcSmall = String.valueOf(klasabc).toLowerCase(); klasCorrect = klascijfer + klasafdelingBig + klasafdeling2Big + klasabcSmall; break; default: tempList.add("klasMeerDan4Tekens"); return tempList; } //Try en catch in het geval dat de internetverbinding mist try { String url = "http://www.rsgtrompmeesters.nl/roosters/roosterwijzigingen/Lijsterbesstraat/subst_001.htm"; Document doc = Jsoup.connect(url).get(); Elements tables = doc.select("table"); if (tables.size() < 2) { //Geen geschikte tabel aanwezig tempList.add("geenTabel"); return tempList; } Element table = tables.get(1); Elements rows = table.select("tr"); //Loop genereren, voor elke row kijken of het de goede tekst bevat //Beginnen bij 4e, bovenstaande is niet belangrijk for (int i = 2; i < rows.size(); i++) { Element row = rows.get(i); Elements cols = row.select("td"); if (cols.get(0).text().contains(klasCorrect)) { String vakOud = Jsoup.parse(cols.get(2).toString()).text(); String docentOud = Jsoup.parse(cols.get(3).toString()).text(); String vakNieuw = Jsoup.parse(cols.get(4).toString()).text(); String docentNieuw = Jsoup.parse(cols.get(5).toString()).text(); //If in geval van uitval, else ingeval van wijziging if (Jsoup.parse(cols.get(6).toString()).text().contains("--")) { //2 opties: wordt verplaatst of valt uit if (Jsoup.parse(cols.get(8).toString()).text().contains("Uitval")) { String wijziging = Jsoup.parse(cols.get(1).toString()).text() + "e uur " + Jsoup.parse(cols.get(2).toString()).text() + " valt uit"; tempList.add(wijziging); } else { //Uur wordt verplaatst String wijziging = Jsoup.parse(cols.get(1).toString()).text() + "e uur " + "wordt verplaatst naar " + Jsoup.parse(cols.get(8).toString()).text(); tempList.add(wijziging); } } else if (vakOud.equals(vakNieuw) && docentOud.equals(docentNieuw)) { String wijziging = Jsoup.parse(cols.get(1).toString()).text() + "e uur " + vakOud + " wordt verplaatst naar " + Jsoup.parse(cols.get(6).toString()).text(); tempList.add(wijziging); } else { String wijzigingKaal; if (vakOud.equals(vakNieuw) && !docentOud.equals(docentNieuw)) { // Opvang door andere docent: dit staat alleen bij klas omdat // dit amper gebeurt bij clusters wijzigingKaal = Jsoup.parse(cols.get(1).toString()).text() + "e uur " + docentOud + " wordt opgevangen door " + docentNieuw; } else { //Geen opvang door andere docent, lokaalwijziging oid wijzigingKaal = // Voegt alle kolommen samen tot 1 string // .text() zorgt voor leesbare text // Spaties voor leesbaarheid Jsoup.parse(cols.get(1).toString()).text() + "e uur " + Jsoup.parse(cols.get(2).toString()).text() + " " + Jsoup.parse(cols.get(3).toString()).text() + " wordt " + Jsoup.parse(cols.get(4).toString()).text() + " " + Jsoup.parse(cols.get(5).toString()).text() + " in " + Jsoup.parse(cols.get(6).toString()).text(); } //ipv en naar bevatten een "/" ivm uren (ma 12-04 / 4) String ipv = ""; if (Jsoup.parse(cols.get(7).toString()).text().contains("/")) { ipv = "ipv " + Jsoup.parse(cols.get(7).toString()).text(); } String naar = ""; if (Jsoup.parse(cols.get(8).toString()).text().contains("/")) { naar = "naar " + Jsoup.parse(cols.get(8).toString()).text() + " "; } String vervangingsTekst = ""; // staat in lege cell, encoding enz, zie volgende link: // http://stackoverflow.com/questions/26837034/how-to-tell-if-a-html-table-has-an-empty-cell-nbsp-using-jsoup //Soms veregeten ze de opmerkingen, dan krijg je size = 9 en error if (cols.size() > 9) { if (!Jsoup.parse(cols.get(9).toString()).text().equals("\u00a0")) { vervangingsTekst = "(" + Jsoup.parse(cols.get(9).toString()).text() + ")"; } } String wijziging = wijzigingKaal + " " + ipv + " " + naar + " " + vervangingsTekst; tempList.add(wijziging); } } //Geen wijzigingen pas bij laatste rij if (i == rows.size() - 1) { //Checken of tempList leeg is, zo ja 1 ding toevoegen if (tempList.isEmpty()) { tempList.add("Er zijn geen wijzigingen"); } //Dag waarvoor wijzigingen zijn ophalen Element dag = doc.select("body > div > div:nth-child(2) > p > b > span").first(); //Compatibiliteit met andere opmaak, om NPE te voorkomen if (dag == null) { dag = doc.select("body > center:nth-child(2) > div").first(); } String dagStr = dag.text().toLowerCase(); // Woorden staan verkeerd om: omwisselen int indexVanSpatie = dagStr.indexOf(" "); String datum = dagStr.substring(0, indexVanSpatie); String rest = dagStr.substring(indexVanSpatie + 1); String dagGoed = rest + " " + datum; tempList.add(dagGoed); //Stand ophalen: staat in 1e tabel van HTML Element tableDate = doc.select("table").get(0); String dateFullText = tableDate.getElementsContainingOwnText("Stand:").text(); //Deel achter "Stand:" pakken String FullTextSplit[] = dateFullText.split("Stand:"); tempList.add(FullTextSplit[1]); return tempList; } } } catch (java.io.IOException e) { //Error toevoegen aan tempList, dat wordt weergegeven in messagebox tempList.clear(); tempList.add("verbindFout"); return tempList; } //Zover hoort de method NOOIT te komen tempList.add("andereFout"); return tempList; } private ArrayList<String> checkerClusters() { ArrayList<String> tempList = new ArrayList<>(); //String van klas halen uit SP String klasTextS = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()) .getString("pref_klas", ""); String url = "http://www.rsgtrompmeesters.nl/roosters/roosterwijzigingen/Lijsterbesstraat/subst_001.htm"; SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); //Clusters ophalen uit SP ArrayList<String> clusters = new ArrayList<>(); for (int a = 1; a < 15; a++) { //String initializen, anders kan hij hem niet toevoegen String clusterLowCase = ""; String cluster = sp.getString("pref_cluster" + a, ""); //If om nullpointer te voorkomen if (!cluster.equals("")) { clusterLowCase = cluster.substring(0, 1).toLowerCase() + cluster.substring(1); } clusters.add(clusterLowCase); } //Lege clusters weghalen uit arraylist TODO: Kijken of singleton werkt/wat het is clusters.removeAll(Collections.singleton("")); //Er moeten wel clusters zijn ingevoerd: Zo nee, komt AlertDialog via onPostExecute if (clusters.isEmpty()) { tempList.add("geenClusters"); return tempList; } //Checken of klas niet leeg is if (klasTextS.equals("")) { tempList.add("geenKlas"); return tempList; } //Eerste teken klas mag geen letter zijn if (Character.isLetter(klasTextS.charAt(0))) { tempList.add("EersteTekenLetter"); return tempList; } //String opsplitsen in 2 delen, om naar hoofdletters te converteren char charcijfer = klasTextS.charAt(0); String klascijfer = String.valueOf(charcijfer); char charafdeling = klasTextS.charAt(1); String klasafdelingBig = String.valueOf(charafdeling).toUpperCase(); //Onderstaand voor hoofdlettercorrectie String klasCorrect; //KlasCorrect is klas na hoofdlettercorrectie switch (klasTextS.length()) { case 2: klasCorrect = klascijfer + klasafdelingBig; break; case 3: char klasabc = klasTextS.charAt(2); String klasabcSmall = String.valueOf(klasabc).toLowerCase(); klasCorrect = klascijfer + klasafdelingBig + klasabcSmall; break; case 4: char klasafdeling2 = klasTextS.charAt(2); String klasafdeling2Big = String.valueOf(klasafdeling2).toUpperCase(); klasabc = klasTextS.charAt(3); klasabcSmall = String.valueOf(klasabc).toLowerCase(); klasCorrect = klascijfer + klasafdelingBig + klasafdeling2Big + klasabcSmall; break; default: tempList.add("klasMeerDan4Tekens"); return tempList; } //Try en catch in het geval dat de internetverbinding mist try { Document doc = Jsoup.connect(url).get(); Elements tables = doc.select("table"); if (tables.size() < 1) { //Geen geschikte tabel aanwezig tempList.add("geenTabel"); return tempList; } Element table = tables.get(1); Elements rows = table.select("tr"); //Eerste loop is om 2e loop te herhalen voor iedere cluster, tweede loop //doorzoekt dan op zowel klas als cluster for (int b = 0; b < clusters.size(); b++) { for (int i = 2; i < rows.size(); i++) { Element row = rows.get(i); Elements cols = row.select("td"); if (cols.get(0).text().contains(klasCorrect) && cols.get(2).text().contains(clusters.get(b))) { String vakOud = Jsoup.parse(cols.get(2).toString()).text(); String docentOud = Jsoup.parse(cols.get(3).toString()).text(); String vakNieuw = Jsoup.parse(cols.get(4).toString()).text(); String docentNieuw = Jsoup.parse(cols.get(5).toString()).text(); //If in geval van uitval, else ingeval van wijziging if (Jsoup.parse(cols.get(6).toString()).text().contains("--")) { //2 opties: wordt verplaatst of valt uit if (Jsoup.parse(cols.get(8).toString()).text().contains("Uitval")) { String wijziging = Jsoup.parse(cols.get(1).toString()).text() + "e uur " + Jsoup.parse(cols.get(2).toString()).text() + " valt uit"; tempList.add(wijziging); } else { //Uur wordt verplaatst String wijziging = Jsoup.parse(cols.get(1).toString()).text() + "e uur " + "wordt verplaatst naar " + Jsoup.parse(cols.get(8).toString()).text(); tempList.add(wijziging); } } else if (vakOud.equals(vakNieuw) && docentOud.equals(docentNieuw)) { String wijziging = Jsoup.parse(cols.get(1).toString()).text() + "e uur " + vakOud + " wordt verplaatst naar " + Jsoup.parse(cols.get(6).toString()).text(); tempList.add(wijziging); } else { String wijzigingKaal = // Voegt alle kolommen samen tot 1 string // .text() zorgt voor leesbare text // Spaties voor leesbaarheid Jsoup.parse(cols.get(1).toString()).text() + "e uur " + Jsoup.parse(cols.get(2).toString()).text() + " " + Jsoup.parse(cols.get(3).toString()).text() + " wordt " + Jsoup.parse(cols.get(4).toString()).text() + " " + Jsoup.parse(cols.get(5).toString()).text() + " in " + Jsoup.parse(cols.get(6).toString()).text(); //ipv en naar bevatten een "/" ivm uren (ma 12-04 / 4) String ipv = ""; if (Jsoup.parse(cols.get(7).toString()).text().contains("/")) { ipv = "ipv " + Jsoup.parse(cols.get(7).toString()).text(); } String naar = ""; if (Jsoup.parse(cols.get(8).toString()).text().contains("/")) { naar = "naar " + Jsoup.parse(cols.get(8).toString()).text() + " "; } String vervangingsTekst = ""; // staat in lege cell, encoding enz, zie volgende link: // http://stackoverflow.com/questions/26837034/how-to-tell-if-a-html-table-has-an-empty-cell-nbsp-using-jsoup if (cols.size() > 9) { if (!Jsoup.parse(cols.get(9).toString()).text().equals("\u00a0")) { vervangingsTekst = "(" + Jsoup.parse(cols.get(9).toString()).text() + ")"; } } String wijziging = wijzigingKaal + " " + ipv + " " + naar + " " + vervangingsTekst; tempList.add(wijziging); } } //Geen wijzigingen pas bij laatste rij en de laatste cluster if (i == rows.size() - 1 && b == clusters.size() - 1) { //Checken of tempList leeg is, zo ja 1 ding toevoegen if (tempList.isEmpty()) { tempList.add("Er zijn geen wijzigingen"); } //Dag waarvoor wijzigingen zijn ophalen Element dag = doc.select("body > div > div:nth-child(2) > p > b > span").first(); //Compatibiliteit met andere opmaak, om NPE te voorkomen if (dag == null) { dag = doc.select("body > center:nth-child(2) > div").first(); } String dagStr = dag.text().toLowerCase(); // Woorden staan verkeerd om: omwisselen int indexVanSpatie = dagStr.indexOf(" "); String datum = dagStr.substring(0, indexVanSpatie); String rest = dagStr.substring(indexVanSpatie + 1); String dagGoed = rest + " " + datum; tempList.add(dagGoed); //Stand ophalen: staat in 1e tabel van HTML Element tableDate = doc.select("table").get(0); String dateFullText = tableDate.getElementsContainingOwnText("Stand:").text(); //Deel achter "Stand:" pakken String FullTextSplit[] = dateFullText.split("Stand:"); tempList.add(FullTextSplit[1]); return tempList; } } } } catch (java.io.IOException e) { //Error toevoegen aan tempList, dat wordt weergegeven in messagebox tempList.clear(); tempList.add("verbindFout"); return tempList; } //Zover hoort de method NOOIT te komen tempList.add("andereFout"); return tempList; } }