code:
/*
 * DSBDirect
 * Copyright (C) 2019 Fynn Godau
 *
 * This program 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.
 *
 * This program 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 this program.  If not, see <https://www.gnu.org/licenses/>.
 *
 * This software is not affiliated with heinekingmedia GmbH, the
 * developer of the DSB platform.
 */

package godau.fynn.dsbdirect.table.reader;

import android.content.Context;
import android.util.Log;
import android.util.Xml;
import godau.fynn.dsbdirect.table.Entry;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;

import javax.annotation.Nullable;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Date;

public class Untis4 extends Reader {

    // Called Untis4 because it only works when there are four columns.

    /*
     * Let me help you understand the mess I created.
     *
     * Everything important (except for the "11.6.2018 Montag (Seite 1 / 4)", that is the only thing
     * in the whole file that is in a
 tag) is with in a  tag within a
 tag. Every
     *
 tag is used to read out the date which is marked within the table. Whenever a  tag
     * follows a
 tag, write mode is started. Whenever a
 tag follows a 	 tag, write
     * mode is stopped (a new line is also added).
     *
     * The interpreter creates an Entry every time there are four lines that are not blank within a
     * row as that is only the case with entries. The date marker is used to provide the date for
     * entries.
     *
     * <3
     *
     */

    private static final String DATEMARKER = "DATEMARKER::";
    private ArrayList<String> mTableStrings = new ArrayList<>();

    private XmlPullParser mParser;

    public Untis4(String html, Context context) {
        super(html, context);

        html = html.replaceAll("(\\d+\\w+, ?)+(\\d+\\w+,? ?)*(Q\\d+,? ?)*<\\/td>", ""); // we don't need "Betroffene Klassen" contents (though this regex is quite broken)
        html = html.replaceAll("
", " "); //
 tags confuse Reader
        html = html.replaceAll(".+", "---"); // strike tags also confuse Reader

        // get an InputStream that contains String
        InputStream in = null;
        try {
            in = new ByteArrayInputStream(html.getBytes("utf-8"));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            return;
        }

        // create parser
        try {
            mParser = Xml.newPullParser();
            mParser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);

            mParser.setFeature("http://xmlpull.org/v1/doc/features.html#relaxed", true); // because the meta tag is not closed
            mParser.setInput(in, null);
            mParser.nextTag();

            in.close();
        } catch (XmlPullParserException | IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void addEntries() {
        try {

            // just some initialising
            String previousStartTag = "null";
            String previousEndTag = "null";
            boolean writeBecauseTrtd = false;
            boolean insideDateTag = false;
            boolean blockWriteBecauseNoPage = false;
            String date;

            while (true) {

                switch (mParser.next()) {
                    case XmlPullParser.START_TAG:

                        if (previousStartTag.equals("tr") && mParser.getName().equals("td")) {
                            writeBecauseTrtd = true;
                        }

                        if (mParser.getName().equals("div")) {
                            insideDateTag = true;
                        }

                        previousStartTag = mParser.getName();

                        break;

                    case XmlPullParser.TEXT:

                        if (writeBecauseTrtd && !blockWriteBecauseNoPage) {
                            if (mParser.getText().equals("Untis")) {
                                // "Page" is over
                                date = "";

                                blockWriteBecauseNoPage = true;
                            } else {

                                addToTable(mParser.getText());
                            }
                        }

                        if (insideDateTag) {
                            // save date
                            date = mParser.getText();

                            // build nice-looking date
                            String weekday = date.replaceFirst("\\d+.\\d+.\\d+ ", "");
                            weekday = weekday.replaceFirst(" \\(Seite \\d+ / \\d+\\)", "");

                            date = date.replaceFirst(" \\w+( \\(Seite \\d+ / \\d+\\))*", "");

                            // save date in table
                            addToTable(DATEMARKER + date);

                            // entering page, unblock
                            blockWriteBecauseNoPage = false;
                        }

                        break;

                    case XmlPullParser.END_TAG:

                        if (previousEndTag.equals("td") && mParser.getName().equals("tr")) {
                            writeBecauseTrtd = false;
                            addToTable("");
                        }

                        if (mParser.getName().equals("div")) {
                            insideDateTag = false;
                        }

                        previousEndTag = mParser.getName();

                        break;
                    case XmlPullParser.END_DOCUMENT:
                        interpretTableStrings();
                }
            }

        } catch (XmlPullParserException | IOException e) {
            e.printStackTrace();
        }
    }

    @Nullable
    @Override
    public String getSchoolName() {
        return null;
    }

    private void interpretTableStrings() {

        int consecutiveFilledLines = 0;
        Date date = null; // this field is filled in before Entries are created

        for (int i = 0; i < mTableStrings.size(); i++) {
            String s = mTableStrings.get(i);

            if (s.contains(DATEMARKER)) { // check whether it is a date line
                String[] dateDigits = s.replace(DATEMARKER, "").split("\\.");
                date = new Date(Integer.parseInt(dateDigits[2]) - 1900 /* years start at 1900 */, Integer.parseInt(dateDigits[1]) - 1 /* months start with 0 */,
                        Integer.parseInt(dateDigits[0])); // because SimpleDateTime did deliver good results. oh why
            } else if (!s.contains(" ") && !s.equals("")) {
                consecutiveFilledLines++;

                if (consecutiveFilledLines == 4) {
                    // if this is the fourth consecutive line

                    // get all the fields
                    String affectedClass = mTableStrings.get(i - 3);
                    String lesson = mTableStrings.get(i - 2);
                    String replacement = mTableStrings.get(i - 1);
                    String info = mTableStrings.get(i);

                    // create Entry
                    addEntry(affectedClass, lesson, replacement, info, date);

                    consecutiveFilledLines = -1; // cooldown
                }
            } else {
                if (consecutiveFilledLines == 3) {
                    // previous line was the third consecutive line
                    // get all the fields
                    String affectedClass = mTableStrings.get(i - 3);
                    String lesson = mTableStrings.get(i - 2);
                    String replacement = mTableStrings.get(i - 1);
                    String info = "";

                    // create Entry
                    addEntry(affectedClass, lesson, replacement, info, date);

                } else if (consecutiveFilledLines == 1) {
                    // there was just one line
                    // get all the fields
                    String affectedClass = "";
                    String lesson = "";
                    String replacement = "";
                    String info = mTableStrings.get(i - 1);

                    // create Entry
                    addEntry(affectedClass, lesson, replacement, info, date);

                } else if (consecutiveFilledLines == 2) {
                    // two separate lines are required
                    // get all the fields

                    // create Entries
                    addEntry("", "", "", mTableStrings.get(i - 2), date);
                    //addEntry("", "", "", mTableStrings.get(i - 1), date);

                }

                consecutiveFilledLines = 0;
            }
        }

    }

    private void addToTable(String s) {
        mTableStrings.add(s);
    }

}


code:
package godau.fynn.dsbdirect.table.reader;

import android.content.Context;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import javax.annotation.Nullable;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import static godau.fynn.dsbdirect.table.reader.FlexibleReader.MasterTableColumn.*;

public class WhiteYellow extends FlexibleReader {

    public WhiteYellow(String html, Context context) {
        super(html, context);
    }

    public void addEntries() {
        Document d = Jsoup.parse(super.html);

        // Get date
        String titleString = d.getElementsByClass("TextUeberschrift").first().text();
        // "Vertretungsplan für Tag, DD.MM.YYYY (WocheX)"
        titleString = titleString.split(" ")[3];

        Date date;
        try {
            date = new SimpleDateFormat("dd.MM.yyyy").parse(titleString);
        } catch (ParseException e) {
            e.printStackTrace();
            date = null;
        }

        // Get info box – there is optionally a TabelleMitteilung in front of the main table
        Elements optionalTabelleMitteilung = d.getElementsByClass("TabelleMitteilung");

        if (optionalTabelleMitteilung.size() > 0) {
            Element tabelleMitteilung = optionalTabelleMitteilung.first();

            Elements trs = tabelleMitteilung.getElementsByTag("tr");

            for (Element tr :
                    trs) {
                addEntry(null, null, null, tr.text(), date);
            }
        }

        Element tabelleVertretungen = d.getElementsByClass("TabelleVertretungen").first();

        // Get definitions

        Element titelZeile = tabelleVertretungen.getElementsByClass("TitelZeileTabelleVertretungen").first();
        setMasterTableColumns(titelZeile.getElementsByTag("td"));

        // Get data from table

        Elements trs = tabelleVertretungen.getElementsByTag("tr");

        // Skip first row as it contains the definitions
        for (int i = 1; i < trs.size(); i++) {
            Element tr = trs.get(i);

            Elements tds = tr.getElementsByTag("td");

            constructEntry(tds, date);
        }
    }

    @Nullable
    @Override
    public String getSchoolName() {
        return null;
    }

    protected MasterTableColumn getMasterTableColumn(String definition) {

        switch (definition) {
            case "Klasse":
                return CLASS;
            case "Std":
                return LESSON;
            case "Fach":
                return SUBJECT;
            case "Lehrer":
            case "Vertretung":
                return TEACHER;
            case "Raum":
                return ROOM;
            case "Sonstiges":
                return INFO;
            default:
                return UNDEFINED;
        }
    }

}

repo_name: tomjschwanke/DSBDirect

license: mit


code:
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportWidth="24.0"
        android:viewportHeight="24.0">
    <path
        android:fillColor="#FF000000"
        android:pathData="M19,13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"/>
</vector>


code:
<!--
  ~ DSBDirect
  ~ Copyright (C) 2019 Fynn Godau
  ~
  ~ This program 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.
  ~
  ~ This program 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 this program.  If not, see <https://www.gnu.org/licenses/>.
  ~
  ~ This software is not affiliated with heinekingmedia GmbH, the
  ~ developer of the DSB platform.
  -->

<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportWidth="24.0"
        android:viewportHeight="24.0">
    <path
        android:fillColor="#FFFFFFFF"
        android:pathData="M12,6v3l4,-4 -4,-4v3c-4.42,0 -8,3.58 -8,8 0,1.57 0.46,3.03 1.24,4.26L6.7,14.8c-0.45,-0.83 -0.7,-1.79 -0.7,-2.8 0,-3.31 2.69,-6 6,-6zM18.76,7.74L17.3,9.2c0.44,0.84 0.7,1.79 0.7,2.8 0,3.31 -2.69,6 -6,6v-3l-4,4 4,4v-3c4.42,0 8,-3.58 8,-8 0,-1.57 -0.46,-3.03 -1.24,-4.26z"/>
</vector>


code:
<vector android:height="24dp" android:tint="#FFFFFF"
    android:viewportHeight="24.0" android:viewportWidth="24.0"
    android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
    <path android:fillColor="#FF000000" android:pathData="M19,6.41L17.59,5 12,10.59 6.41,5 5,6.41 10.59,12 5,17.59 6.41,19 12,13.41 17.59,19 19,17.59 13.41,12z"/>
</vector>


code:
<!--
  ~ DSBDirect
  ~ Copyright (C) 2019 Fynn Godau
  ~
  ~ This program 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.
  ~
  ~ This program 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 this program.  If not, see <https://www.gnu.org/licenses/>.
  ~
  ~ This software is not affiliated with heinekingmedia GmbH, the
  ~ developer of the DSB platform.
  -->

<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="108dp"
        android:height="108dp"
        android:viewportWidth="53.75661"
        android:viewportHeight="53.75662">
    <group android:translateX="9.944973"
            android:translateY="9.944975">
      <path
          android:pathData="m27.7059,22.2485c-0.9465,-2.2604 -19.9187,5.084 -19.9187,5.084 0,0 20.4149,-3.899 19.9187,-5.084z"
          android:strokeAlpha="1"
          android:strokeLineJoin="miter"
          android:strokeWidth="0.30385548"
          android:fillColor="#ffffff"
          android:strokeColor="#00000000"
          android:strokeLineCap="butt"/>
      <path
          android:pathData="m27.4998,20.5656c-0.8144,-2.5338 -19.0713,5.2881 -19.0713,5.2881 0,0 19.3155,-4.5284 19.0713,-5.2881z"
          android:strokeAlpha="1"
          android:strokeLineJoin="miter"
          android:strokeWidth="0.30385548"
          android:fillColor="#ffffff"
          android:strokeColor="#00000000"
          android:strokeLineCap="butt"/>
      <path
          android:pathData="m26.9209,18.7949c-0.679,-2.0597 -17.601,4.9872 -17.601,4.9872 0,0 17.9125,-4.0423 17.601,-4.9872z"
          android:strokeAlpha="1"
          android:strokeLineJoin="miter"
          android:strokeWidth="0.30385548"
          android:fillColor="#ffffff"
          android:strokeColor="#00000000"
          android:strokeLineCap="butt"/>
      <path
          android:pathData="m6.4317,27.9996c17.1596,-2.7991 21.5222,-4.9998 21.7303,-5.4547 0.2081,-0.4549 -0.7297,-4.5458 -1.001,-4.9643 -0.2713,-0.4186 -21.0466,5.6132 -21.3936,5.2894 -0.347,-0.3238 -0.9654,-0.4893 0.1901,-0.9638 1.1555,-0.4745 20.9543,-5.4373 21.5666,-5.0568 0.6123,0.3804 2.0982,5.659 1.0208,6.6773 -1.0775,1.0183 -22.5375,5.7901 -22.4084,4.8121 0.0495,-0.375 0.2951,-0.3391 0.2951,-0.3391z"
          android:strokeAlpha="1"
          android:strokeLineJoin="miter"
          android:strokeWidth="0.30385548"
          android:fillColor="#ffffff"
          android:strokeColor="#00000000"
          android:fillAlpha="1"
          android:strokeLineCap="butt"/>
      <path
          android:pathData="M4.865,21.4582C16.1067,7.9145 15.8765,3.0802 15.8765,3.0802l3.2229,14.7331c-0.6844,0.6083 -14.2344,3.6449 -14.2344,3.6449z"
          android:strokeAlpha="1"
          android:strokeLineJoin="miter"
          android:strokeWidth="0.30385548"
          android:fillColor="#fffffb"
          android:strokeColor="#00000000"
          android:fillAlpha="1"
          android:strokeLineCap="butt"/>
      <path
          android:pathData="m19.866,17.6334 l-3.338,-15.0401c0,0 4.9737,-0.1925 8.249,4.3739 1.8843,2.627 2.4555,9.4768 2.4555,9.4768 0,0 -4.4196,1.2522 -7.3666,1.1894z"
          android:strokeAlpha="1"
          android:strokeLineJoin="miter"
          android:strokeWidth="0.30385548"
          android:fillColor="#fffffb"
          android:strokeColor="#00000000"
          android:fillAlpha="1"
          android:strokeLineCap="butt"/>
    </group>
</vector>


code:
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:height="24dp"
    android:width="24dp"
    android:viewportWidth="24"
    android:viewportHeight="24">
    <path android:fillColor="#FFFFFF" android:pathData="M4 7V19H19V21H4C2 21 2 19 2 19V7H4M23 3V15C23 15 23 17 21 17H8C8 17 6 17 6 15V3H23M21 5H8V15H21V5M14 7H10V12H14V7M19 7H15V9H19V7M19 10H15V12H19V10Z" />
</vector>


code:
<!--
  ~ DSBDirect
  ~ Copyright (C) 2019 Fynn Godau
  ~
  ~ This program 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.
  ~
  ~ This program 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 this program.  If not, see <https://www.gnu.org/licenses/>.
  ~
  ~ This software is not affiliated with heinekingmedia GmbH, the
  ~ developer of the DSB platform.
    -->

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportWidth="24"
    android:viewportHeight="24">
  <path
      android:fillColor="#FFFFFFFF"
      android:pathData="M12,6c3.79,0 7.17,2.13 8.82,5.5C19.17,14.87 15.79,17 12,17s-7.17,-2.13 -8.82,-5.5C4.83,8.13 8.21,6 12,6m0,-2C7,4 2.73,7.11 1,11.5 2.73,15.89 7,19 12,19s9.27,-3.11 11,-7.5C21.27,7.11 17,4 12,4zM12,9c1.38,0 2.5,1.12 2.5,2.5S13.38,14 12,14s-2.5,-1.12 -2.5,-2.5S10.62,9 12,9m0,-2c-2.48,0 -4.5,2.02 -4.5,4.5S9.52,16 12,16s4.5,-2.02 4.5,-4.5S14.48,7 12,7z"/>
</vector>


code:
<?xml version="1.0" encoding="utf-8"?>
<!--
  ~ DSBDirect
  ~ Copyright (C) 2019 Fynn Godau
  ~
  ~ This program 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.
  ~
  ~ This program 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 this program.  If not, see <https://www.gnu.org/licenses/>.
  ~
  ~ This software is not affiliated with heinekingmedia GmbH, the
  ~ developer of the DSB platform.
  -->

<TextView android:id="@+id/title"
    android:drawableTop="@drawable/ic_notification"
    android:textSize="24sp"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_above="@id/authenticate"
    android:layout_centerHorizontal="true"
    android:gravity="center_horizontal"
    android:layout_alignParentTop="true"
    android:layout_marginTop="16dp"
    android:text="@string/login_title"
    xmlns:android="http://schemas.android.com/apk/res/android" />


code:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal"
    android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingLeft="24dp"
    android:paddingRight="24dp">

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:id="@+id/editText" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="@color/textOverWhite"
        android:text="→" />

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:id="@+id/editText1" />

</LinearLayout>


code:
<?xml version="1.0" encoding="utf-8"?><!--
  ~ DSBDirect
  ~ Copyright (C) 2019 Fynn Godau
  ~
  ~ This program 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.
  ~
  ~ This program 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 this program.  If not, see <https://www.gnu.org/licenses/>.
  ~
  ~ This software is not affiliated with heinekingmedia GmbH, the
  ~ developer of the DSB platform.
  -->

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="24dp"
    android:paddingRight="24dp"
    android:paddingTop="8dp">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/filter_by_class"
        android:textColor="?attr/TextOverBackground" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal">

        <EditText
            android:id="@+id/input_number"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="end"
            android:hint="@string/number"
            android:inputType="numberDecimal" />

        <EditText
            android:id="@+id/input_letter"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:hint="@string/letter"
            android:inputType="textNoSuggestions" />
    </LinearLayout>

    <TextView
        android:layout_marginTop="8dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/filter_by_courses"
        android:textColor="?attr/TextOverBackground" />

    <EditText
        android:id="@+id/input_courses"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/courses"
        android:inputType="text" />

    <TextView
        android:layout_marginTop="8dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/filter_by_teacher"
        android:textColor="?attr/TextOverBackground" />

    <EditText
        android:id="@+id/input_name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/name"
        android:inputType="text" />
</LinearLayout>


code:
<?xml version="1.0" encoding="utf-8"?>
<!--
  ~ DSBDirect
  ~ Copyright (C) 2019 Fynn Godau
  ~
  ~ This program 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.
  ~
  ~ This program 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 this program.  If not, see <https://www.gnu.org/licenses/>.
  ~
  ~ This software is not affiliated with heinekingmedia GmbH, the
  ~ developer of the DSB platform.
  -->

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <uz.shift.colorpicker.LineColorPicker
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:orientation="horizontal"
        android:id="@+id/picker"
        />

</LinearLayout>


code:
<?xml version="1.0" encoding="utf-8"?><!--
  ~ DSBDirect
  ~ Copyright (C) 2019 Fynn Godau
  ~
  ~ This program 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.
  ~
  ~ This program 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 this program.  If not, see <https://www.gnu.org/licenses/>.
  ~
  ~ This software is not affiliated with heinekingmedia GmbH, the
  ~ developer of the DSB platform.
  -->

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="24dp"
    android:paddingRight="24dp"
    android:paddingTop="8dp">

    <TextView
        android:layout_marginTop="8dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/settings_shortcodes_elternportal_popup_text_url"
        android:textColor="?attr/TextOverBackground" />

    <EditText
        android:id="@+id/input_url"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/settings_shortcodes_elternportal_popup_hint_url"
        android:inputType="textUri"/>

    <TextView
        android:layout_marginTop="8dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/settings_shortcodes_elternportal_popup_text_email"
        android:textColor="?attr/TextOverBackground" />

    <EditText
        android:id="@+id/input_email"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/settings_shortcodes_elternportal_popup_hint_email"
        android:inputType="textEmailAddress"/>

    <TextView
        android:layout_marginTop="8dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/settings_shortcodes_elternportal_popup_text_password"
        android:textColor="?attr/TextOverBackground" />

    <EditText
        android:id="@+id/input_password"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/settings_shortcodes_elternportal_popup_hint_password"
        android:inputType="textPassword"/>
</LinearLayout>


code:
<?xml version="1.0" encoding="utf-8"?>
<!--
  ~ DSBDirect
  ~ Copyright (C) 2019 Fynn Godau
  ~
  ~ This program 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.
  ~
  ~ This program 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 this program.  If not, see <https://www.gnu.org/licenses/>.
  ~
  ~ This software is not affiliated with heinekingmedia GmbH, the
  ~ developer of the DSB platform.
  -->

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/about_libraries_header"
        android:textColor="?attr/TextOverBackground"
        android:layout_margin="8dp" />

    <ListView
        android:id="@+id/list"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>


code:
<?xml version="1.0" encoding="utf-8"?><!--
  ~ DSBDirect
  ~ Copyright (C) 2019 Fynn Godau
  ~
  ~ This program 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.
  ~
  ~ This program 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 this program.  If not, see <https://www.gnu.org/licenses/>.
  ~
  ~ This software is not affiliated with heinekingmedia GmbH, the
  ~ developer of the DSB platform.
  -->

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".activity.LoginActivity">

    <include
        layout="@layout/activity_login_title"/>

    <RelativeLayout
        android:layout_marginLeft="16dp"
        android:layout_marginRight="16dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/authenticate"
        android:layout_centerInParent="true">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:id="@+id/credentials">

            <com.google.android.material.textfield.TextInputLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content">

                <com.google.android.material.textfield.TextInputEditText
                    android:id="@+id/id"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:inputType="number"
                    android:hint="@string/input_hint_id" />
            </com.google.android.material.textfield.TextInputLayout>

            <com.google.android.material.textfield.TextInputLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content">

                <com.google.android.material.textfield.TextInputEditText
                    android:id="@+id/pass"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:inputType="textPassword"
                    android:hint="@string/input_hint_pass" />
            </com.google.android.material.textfield.TextInputLayout>

        </LinearLayout>

        <Button
            android:id="@+id/login"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@id/credentials"
            android:text="@string/login_login"
            android:layout_margin="8dp" />

    </RelativeLayout>

    <ProgressBar
        android:id="@+id/progressBar"
        style="?android:attr/progressBarStyle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/authenticate"
        android:layout_centerHorizontal="true"
        android:visibility="gone"/>

</RelativeLayout>


code:
<?xml version="1.0" encoding="utf-8"?>
<!--
  ~ DSBDirect
  ~ Copyright (C) 2019 Fynn Godau
  ~
  ~ This program 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.
  ~
  ~ This program 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 this program.  If not, see <https://www.gnu.org/licenses/>.
  ~
  ~ This software is not affiliated with heinekingmedia GmbH, the
  ~ developer of the DSB platform.
  -->

<TextView android:id="@+id/title"
    android:textSize="24sp"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_above="@id/authenticate"
    android:layout_centerHorizontal="true"
    android:gravity="center_horizontal"
    android:layout_alignParentTop="true"
    android:layout_marginTop="16dp"
    android:text="@string/login_title"
    xmlns:android="http://schemas.android.com/apk/res/android" />


code:
<?xml version="1.0" encoding="utf-8"?><!--
  ~ DSBDirect
  ~ Copyright (C) 2019 Fynn Godau
  ~
  ~ This program 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.
  ~
  ~ This program 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 this program.  If not, see <https://www.gnu.org/licenses/>.
  ~
  ~ This software is not affiliated with heinekingmedia GmbH, the
  ~ developer of the DSB platform.
  -->

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/root"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="godau.fynn.dsbdirect.activity.MainActivity">

    <androidx.appcompat.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        android:elevation="4dp"
        android:theme="@style/ThemeOverlay.AppCompat.ActionBar"
        app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
        app:titleTextColor="@color/titleText" />

    <androidx.coordinatorlayout.widget.CoordinatorLayout
        android:id="@+id/contentCoordinator"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@id/page"
        android:layout_below="@id/toolbar"
        android:layout_alignParentStart="true"
        android:layout_alignParentLeft="true">

        <RelativeLayout
            android:id="@+id/content"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <TextView
                android:id="@+id/text"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerHorizontal="true"
                android:layout_centerVertical="true"
                android:layout_margin="8dp"
                android:foregroundGravity="center"
                android:text="@string/initializing" />

            <Button
                android:id="@+id/fix"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@id/text"
                android:layout_centerHorizontal="true"
                android:layout_centerVertical="true"
                android:layout_margin="8dp"
                android:text="@string/news_fix"
                android:visibility="gone" />

            <!-- WebView is created dynamically -->

            <RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical">

                <TextView
                    android:id="@+id/date"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:padding="8dp"
                    android:textSize="16pt"
                    android:textColor="?attr/TextOverBackground"
                    android:visibility="gone" />

                <ListView
                    android:id="@+id/table"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:layout_below="@id/date"
                    android:layout_alignParentTop="false"
                    android:layout_alignParentBottom="true"
                    android:listSelector="@android:color/transparent"
                    android:transcriptMode="disabled"
                    android:visibility="gone">

                </ListView>

            </RelativeLayout>

            <com.ortiz.touchview.TouchImageView
                android:id="@+id/tableimage"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_alignParentTop="true"
                android:visibility="gone" />

        </RelativeLayout>

    </androidx.coordinatorlayout.widget.CoordinatorLayout>

    <com.wefika.horizontalpicker.HorizontalPicker
        android:id="@+id/page"
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        android:layout_alignParentStart="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentBottom="true"
        android:layout_gravity="bottom"
        android:background="@color/colorPrimary"
        android:textColor="@color/white"
        android:textSize="14sp"
        android:visibility="gone" />

</RelativeLayout>


code:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/root"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="godau.fynn.dsbdirect.activity.MainActivity">

    <androidx.appcompat.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        android:elevation="4dp"
        android:theme="@style/ThemeOverlay.AppCompat.ActionBar"
        app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
        app:navigationIcon="@drawable/ic_close_black_24dp"
        app:titleTextColor="@color/titleText" />

    <androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/contentCoordinator"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/toolbar"
        android:layout_alignParentStart="true"
        android:layout_alignParentLeft="true">

        <RelativeLayout
            android:id="@+id/content"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <TextView
                android:id="@+id/text"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerHorizontal="true"
                android:layout_centerVertical="true"
                android:layout_margin="8dp"
                android:foregroundGravity="center"
                android:text="@string/initializing" />

            <RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical">

                <ListView
                    android:id="@+id/table"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:layout_alignParentTop="false"
                    android:layout_alignParentBottom="true"
                    android:listSelector="@android:color/transparent"
                    android:transcriptMode="disabled"
                    android:visibility="gone">

                </ListView>

            </RelativeLayout>

            <com.ortiz.touchview.TouchImageView
                android:id="@+id/expanded_image"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:visibility="invisible" />

        </RelativeLayout>

    </androidx.coordinatorlayout.widget.CoordinatorLayout>
</RelativeLayout>


code:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical"
    android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingLeft="24dp"
    android:paddingRight="24dp">

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/editText" />

</LinearLayout>


code:
<?xml version="1.0" encoding="utf-8"?>
<!--
  ~ DSBDirect
  ~ Copyright (C) 2019 Fynn Godau
  ~
  ~ This program 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.
  ~
  ~ This program 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 this program.  If not, see <https://www.gnu.org/licenses/>.
  ~
  ~ This software is not affiliated with heinekingmedia GmbH, the
  ~ developer of the DSB platform.
  -->

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical">

    <TextView
        android:id="@+id/date"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="8dp"
        android:textColor="?attr/TextOverBackground"
        android:textSize="16pt"
        android:text="date"
        android:layout_marginTop="4dp"
        android:layout_marginLeft="8dp"
        android:layout_marginRight="8dp"
        android:visibility="gone"/>

    <androidx.cardview.widget.CardView
        android:id="@+id/card"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="4dp"
        android:layout_marginRight="8dp"
        android:layout_marginLeft="8dp"
        android:layout_marginBottom="4dp"
        app:cardBackgroundColor="@color/colorPrimary">

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="horizontal">

            <org.sufficientlysecure.htmltextview.HtmlTextView
                android:id="@+id/affectedClass"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentBottom="true"
                android:layout_alignParentEnd="true"
                android:layout_alignParentRight="true"
                android:layout_marginBottom="4dp"
                android:layout_marginEnd="4dp"
                android:layout_marginRight="4dp"
                android:gravity="end"
                android:text="cl"
                android:textColor="#88ffffff"
                android:textSize="24sp" />

            <org.sufficientlysecure.htmltextview.HtmlTextView
                android:id="@+id/lesson"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentBottom="true"
                android:layout_alignParentTop="true"
                android:layout_marginStart="8dp"
                android:layout_marginLeft="8dp"
                android:gravity="center_vertical"
                android:text="lesson"
                android:textColor="@color/textOverPrimary"
                android:textSize="52sp" />

            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_toEndOf="@id/lesson"
                android:layout_toRightOf="@id/lesson"
                android:layout_centerInParent="true"
                android:layout_margin="8dp"
                android:orientation="vertical">

                <org.sufficientlysecure.htmltextview.HtmlTextView
                    android:id="@+id/replacementTeacher"
                    android:layout_width="100dp"
                    android:layout_height="wrap_content"
                    android:text="teacher"
                    android:textColor="@color/textOverPrimary" />

                <org.sufficientlysecure.htmltextview.HtmlTextView
                    android:id="@+id/info"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="infoinfoinfo"
                    android:textColor="@color/textOverPrimary" />
            </LinearLayout>
        </RelativeLayout>
    </androidx.cardview.widget.CardView>
</LinearLayout>


code:
<?xml version="1.0" encoding="utf-8"?>
<!--
  ~ DSBDirect
  ~ Copyright (C) 2019 Fynn Godau
  ~
  ~ This program 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.
  ~
  ~ This program 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 this program.  If not, see <https://www.gnu.org/licenses/>.
  ~
  ~ This software is not affiliated with heinekingmedia GmbH, the
  ~ developer of the DSB platform.
  -->

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical">

    <TextView
        android:id="@+id/date"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="8dp"
        android:textColor="?attr/TextOverBackground"
        android:textSize="16pt"
        android:text="date"
        android:layout_marginTop="4dp"
        android:layout_marginLeft="8dp"
        android:layout_marginRight="8dp"
        android:visibility="gone"/>

    <androidx.cardview.widget.CardView
        android:id="@+id/card"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="4dp"
        android:layout_marginRight="8dp"
        android:layout_marginLeft="8dp"
        android:layout_marginBottom="4dp"
        app:cardBackgroundColor="@color/colorPrimary">

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="horizontal">

            <org.sufficientlysecure.htmltextview.HtmlTextView
                android:id="@+id/replacementTeacher"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentBottom="true"
                android:layout_alignParentEnd="true"
                android:layout_alignParentRight="true"
                android:layout_marginBottom="4dp"
                android:layout_marginEnd="4dp"
                android:layout_marginRight="4dp"
                android:gravity="end"
                android:text="cl"
                android:textColor="#88ffffff"
                android:textSize="24sp" />

            <org.sufficientlysecure.htmltextview.HtmlTextView
                android:id="@+id/lesson"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentBottom="true"
                android:layout_alignParentTop="true"
                android:layout_marginStart="8dp"
                android:layout_marginLeft="8dp"
                android:gravity="center_vertical"
                android:text="lesson"
                android:textColor="@color/textOverPrimary"
                android:textSize="52sp" />

            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_toEndOf="@id/lesson"
                android:layout_toRightOf="@id/lesson"
                android:layout_centerInParent="true"
                android:layout_margin="8dp"
                android:orientation="vertical">

                <org.sufficientlysecure.htmltextview.HtmlTextView
                    android:id="@+id/affectedClass"
                    android:layout_width="100dp"
                    android:layout_height="wrap_content"
                    android:text="teacher"
                    android:textColor="@color/textOverPrimary" />

                <org.sufficientlysecure.htmltextview.HtmlTextView
                    android:id="@+id/info"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="infoinfoinfo"
                    android:textColor="@color/textOverPrimary" />
            </LinearLayout>
        </RelativeLayout>
    </androidx.cardview.widget.CardView>
</LinearLayout>


code:
<?xml version="1.0" encoding="utf-8"?><!--
  ~ DSBDirect
  ~ Copyright (C) 2019 Fynn Godau
  ~
  ~ This program 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.
  ~
  ~ This program 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 this program.  If not, see <https://www.gnu.org/licenses/>.
  ~
  ~ This software is not affiliated with heinekingmedia GmbH, the
  ~ developer of the DSB platform.
  -->

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="8dp">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TextView
            android:id="@+id/name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="?attr/TextOverBackground" />

        <TextView
            android:id="@+id/author"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@id/name" />

        <TextView
            android:id="@+id/license"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@id/author" />

        <ImageButton
            android:id="@+id/browse"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:srcCompat="@drawable/ic_internet_24dp"
            android:contentDescription="@string/about_libraries_open_browser"
            android:layout_alignParentEnd="true"
            android:layout_alignParentRight="true" /> <!-- TODO: ensure TextViews don't overlap with button -->
    </RelativeLayout>

</LinearLayout>


code:
<?xml version="1.0" encoding="utf-8"?>
<!--
  ~ DSBDirect
  ~ Copyright (C) 2019 Fynn Godau
  ~
  ~ This program 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.
  ~
  ~ This program 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 this program.  If not, see <https://www.gnu.org/licenses/>.
  ~
  ~ This software is not affiliated with heinekingmedia GmbH, the
  ~ developer of the DSB platform.
  -->

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:id="@+id/root"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical"
              android:padding="8dp">

    <TextView
        android:id="@+id/date"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="16dp"
        android:textColor="?attr/TextOverBackground"
        android:textSize="16pt"
        android:visibility="gone"/>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <org.sufficientlysecure.htmltextview.HtmlTextView
            android:id="@+id/affectedClass"
            android:layout_width="70dp"
            android:layout_height="wrap_content"
            android:textColor="?attr/TextOverBackground"/>

        <org.sufficientlysecure.htmltextview.HtmlTextView
            android:id="@+id/lesson"
            android:layout_width="50dp"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_marginLeft="70dp"
            android:textColor="?attr/TextOverBackground"
            android:layout_alignParentStart="true"
            android:layout_marginStart="70dp" />

        <org.sufficientlysecure.htmltextview.HtmlTextView
            android:id="@+id/replacementTeacher"
            android:layout_width="100dp"
            android:layout_height="wrap_content"
            android:layout_toRightOf="@id/lesson"
            android:textColor="?attr/TextOverBackground"
            android:layout_toEndOf="@id/lesson" />

        <org.sufficientlysecure.htmltextview.HtmlTextView
            android:id="@+id/info"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toRightOf="@id/replacementTeacher"
            android:textColor="?attr/TextOverBackground"
            android:layout_toEndOf="@id/replacementTeacher" />
    </RelativeLayout>
</LinearLayout>


code:
<?xml version="1.0" encoding="utf-8"?><!--
    Created by Jasper Michalke <jasper.michalke@jasmich.de> under license EUPL 1.2.
    -->

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">

    <androidx.cardview.widget.CardView
        android:id="@+id/card"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="8dp"
        android:layout_marginTop="4dp"
        android:layout_marginRight="8dp"
        android:layout_marginBottom="4dp"
        app:cardBackgroundColor="@color/colorPrimary">

        <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/container"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical">

                <org.sufficientlysecure.htmltextview.HtmlTextView
                    android:id="@+id/date"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_below="@id/message"
                    android:layout_alignParentEnd="true"
                    android:layout_alignParentRight="true"
                    android:layout_alignParentBottom="true"
                    android:layout_marginEnd="4dp"
                    android:layout_marginRight="4dp"
                    android:layout_marginBottom="4dp"
                    android:gravity="bottom|end"
                    android:text="date"
                    android:textColor="@color/textOverPrimary"
                    android:textSize="24sp" />

                <org.sufficientlysecure.htmltextview.HtmlTextView
                    android:id="@+id/title"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignParentTop="true"
                    android:layout_alignParentBottom="false"
                    android:layout_marginStart="8dp"
                    android:layout_marginLeft="8dp"
                    android:gravity="top"
                    android:text="title"
                    android:textColor="@color/textOverPrimary"
                    android:textSize="32sp" />

                <org.sufficientlysecure.htmltextview.HtmlTextView
                    android:id="@+id/message"
                    android:text="message"
                    android:textColor="@color/textOverPrimary"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_below="@id/title"
                    android:layout_margin="10dp"
                    android:layout_marginStart="5dp"
                    android:layout_marginLeft="5dp"
                    android:layout_marginTop="5dp"
                    android:layout_marginEnd="5dp"
                    android:layout_marginRight="5dp"
                    android:layout_marginBottom="5dp"
                    android:elevation="10dp"
                    android:gravity="center_vertical"
                    android:textSize="24sp"
                    app:cardCornerRadius="8dp" />
            </RelativeLayout>
        </FrameLayout>
    </androidx.cardview.widget.CardView>
</LinearLayout>


code:
<?xml version="1.0" encoding="utf-8"?><!--
    Created by Jasper Michalke <jasper.michalke@jasmich.de> under license EUPL 1.2.
    -->

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">

    <androidx.cardview.widget.CardView
        android:id="@+id/card"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="16dp"
        android:layout_marginTop="8dp"
        android:layout_marginRight="16dp"
        android:layout_marginBottom="8dp">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">

            <org.sufficientlysecure.htmltextview.HtmlTextView
                android:id="@+id/title"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginRight="16dp"
                android:layout_marginLeft="16dp"
                android:layout_marginTop="24dp"
                android:text="title"
                android:textColor="@color/textOverPrimary"
                android:textSize="24sp" />

            <org.sufficientlysecure.htmltextview.HtmlTextView
                android:id="@+id/date"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="4dp"
                android:layout_marginLeft="16dp"
                android:layout_marginRight="16dp"
                android:layout_marginBottom="16dp"
                android:text="date"
                android:textColor="@color/textSecondaryOverPrimary"
                android:textSize="14sp" />

            <TextView
                android:id="@+id/textContent"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="16dp"
                android:layout_marginRight="16dp"
                android:layout_marginBottom="16dp"
                android:textColor="@color/textOverPrimary">
            </TextView>

            <!-- Images will be added to the LinearLayout programmatically. -->
            <HorizontalScrollView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:foregroundGravity="center_horizontal"
                >

                <LinearLayout
                    android:id="@+id/content"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:gravity="center_horizontal"
                    android:orientation="horizontal">
                </LinearLayout>
            </HorizontalScrollView>
        </LinearLayout>
    </androidx.cardview.widget.CardView>
</LinearLayout>


code:
<?xml version="1.0" encoding="utf-8"?>
<!--
  ~ DSBDirect
  ~ Copyright (C) 2019 Fynn Godau
  ~
  ~ This program 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.
  ~
  ~ This program 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 this program.  If not, see <https://www.gnu.org/licenses/>.
  ~
  ~ This software is not affiliated with heinekingmedia GmbH, the
  ~ developer of the DSB platform.
  -->

<menu xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
      xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/action_view_history"
        android:title="@string/action_view_history"
        android:checkable="true"
        app:showAsAction="never"/>
    <item
        android:id="@+id/action_temp_filters"
        android:icon="@drawable/ic_visibility_24px"
        android:title="@string/action_temp_filters_disable"
        app:showAsAction="always"
        android:visible="false"/>
    <item
        android:id="@+id/action_reload"
        android:icon="@drawable/ic_autorenew_white_24dp"
        android:title="@string/action_reload"
        app:showAsAction="ifRoom"/>
    <item
        android:id="@+id/action_settings"
        android:title="@string/action_settings"
        app:showAsAction="never"/>
</menu>


code:
<?xml version="1.0" encoding="utf-8"?>
<!--
  ~ DSBDirect
  ~ Copyright (C) 2019 Fynn Godau
  ~
  ~ This program 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.
  ~
  ~ This program 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 this program.  If not, see <https://www.gnu.org/licenses/>.
  ~
  ~ This software is not affiliated with heinekingmedia GmbH, the
  ~ developer of the DSB platform.
  -->

<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
    <background android:drawable="@color/ic_launcher_background"/>
    <foreground android:drawable="@drawable/ic_launcher_foreground"/>
</adaptive-icon>


code:
<?xml version="1.0" encoding="utf-8"?>
<!--
  ~ DSBDirect
  ~ Copyright (C) 2019 Fynn Godau
  ~
  ~ This program 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.
  ~
  ~ This program 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 this program.  If not, see <https://www.gnu.org/licenses/>.
  ~
  ~ This software is not affiliated with heinekingmedia GmbH, the
  ~ developer of the DSB platform.
  -->

<resources>
    <string name="app_name">ESBDirect</string>
    <string name="app_name_offline">ESBDirect Zeitreise</string>
    <string name="credentials_invalid">Zugangsdaten ungültig</string>
    <string name="credentials_correct">Zugriffscode erhalten</string>

    <string name="timetable_uri_acquired">Darstellung des Planes</string>
    <string name="timetable_last_changed">Letzte Änderung %s</string>
    <string name="timetable_published">Veröffentlicht %s</string>

    <string name="network_generic_error">Netzwerkfehler</string>
    <string name="network_invalid_response">Ungültige Antwort</string>

    <string name="error_parsing">Tabelle konnte nicht erstellt werden</string>
    <string name="error_parsing_partial">Teile der Tabelle konnten nicht dargestellt werden</string>
    <string name="error_displaying">Datei konnte nicht angezeigt werden</string>

    <string name="network_authenticating">Anmeldung</string>

    <string name="input_hint_pass">Passwort</string>
    <string name="input_hint_id">ID</string>

    <string name="button_submit">OK</string>

    <string name="action_reload">Neu laden</string>
    <string name="action_temp_filters_enable">Filter aktivieren</string>
    <string name="action_temp_filters_disable">Filter deaktivieren</string>
    <string name="action_reauth">Neu anmelden</string>
    <string name="action_filter">Filter</string>
    <string name="action_choose_parser">Tabellenleser ändern</string>

    <string name="confirm">Bestätigen</string>
    <string name="cancel">Abbrechen</string>
    <string name="import_">Importieren</string>
    <string name="action_filter_popup_title">Filter</string>
    <string name="number">Zahl</string>
    <string name="letter">Buchstabe</string>
    <string name="courses">Kurse</string>
    <string name="name">Name</string>
    <string name="filter_by_class">Nach Klasse filtern</string>
    <string name="filter_by_courses">Nach Kursen filtern (durch Leerzeichen trennen; Kurse müssen im Info-Feld erscheinen)</string>
    <string name="filter_by_teacher">Nach Lehrkraft filtern</string>
    <string name="settings_view_filter_exclude_general">Generelle Ankündigungen immer anzeigen (empfohlen)</string>
    <string name="action_filter_popup_message">Bitte gib die Klasse oder die Kurse oder die Lehrkraft, nach der gefiltert werden soll, ein. Einträge, für die mehrere Kategorien zutreffen, werden <b>hervorgehoben</b>. Groß-/Kleinschreibung bitte beachten.</string>
    <string name="action_parse">Tabellendarstellung</string>
    <string name="action_view_history">Verlauf ansehen</string>
    <string name="network_versioncheck_failed">Suche nach Updates fehlgeschlagen.</string>
    <string name="dismiss">Egal</string>
    <string name="download">Herunterladen</string>
    <string name="update_popup_title">Update verfügbar: Version %s</string>
    <string name="update_download_title">ESBDirect %s</string>
    <string name="up_to_date">Dies ist die neuste Version von ESBDirect.</string>
    <string name="action_update">Nach Updates suchen</string>
    <string name="initializing">Initialisierung</string>
    <string name="parser_automatic">Automatisch</string>
    <string name="ok">OK</string>
    <string name="empty">Nichts anzuzeigen</string>
    <string name="you_are_offline">Du bist offline</string>
    <string name="title_activity_settings">Einstellungen</string>
    <string name="action_settings">Einstellungen</string>
    <string name="settings_view">Ansicht</string>
    <string name="settings_view_parse">Tabellendarstellung</string>
    <string name="settings_view_parse_not_html">Bilddateien können nicht ausgelesen werden</string>
    <string name="settings_view_parser">Tabellenleser</string>
    <string name="settings_view_filter">Filter aktivieren</string>
    <string name="settings_view_set_filter">Filter einstellen</string>
    <string name="settings_view_parse_summary">Pläne mithilfe eines Tabellenlesers in eine verarbeitbare Tabelle auslesen</string>
    <string name="settings_view_filter_summary">Nur relevante Einträge anzeigen</string>
    <string name="settings_view_invert_images">Bilder invertieren</string>
    <string name="settings_view_invert_images_summary">Bildfarben umwenden, um schwarz und weiß zu tauschen</string>
    <string name="settings_view_invert_images_no_images">In deinem Plan gibt es keine Bilder</string>
    <string name="settings_login">Anmeldung</string>
    <string name="settings_login_id">ID</string>
    <string name="settings_login_pass">Passwort</string>
    <string name="settings_time_travel">Zeitreise</string>
    <string name="settings_time_travel_caching">Speicherdauer</string>
    <string name="settings_time_travel_caching_summary">Dateien werden für %s gespeichert</string>
    <string name="settings_time_travel_clear_cache">Jetzt alle Dateien löschen</string>
    <string name="settings_time_travel_description">Mit einer Zeitreise kannst du alte Versionen deines Plans, die noch auf deinem Gerät gespeichert sind, ansehen.</string>
    <string name="clear_cache_popup_title">Dateien löschen</string>
    <string name="clear_cache_popup_message">Möchtest du %1$s (%2$s) löschen?</string>
    <string name="settings_updates">Aktualisierungen</string>
    <string name="settings_updates_check">Automatisch nach Aktualisierungen suchen</string>
    <string name="settings_updates_check_now">Jetzt nach Aktualisierungen suchen</string>
    <string name="settings_about">Über</string>
    <string name="settings_about_description">Entwickelt von Fynn Godau</string>
    <string name="settings_about_description_summary">Dies ist Version %s</string>
    <string name="settings_about_email">Dem Entwickler eine E-Mail-Nachricht schicken</string>
    <string name="settings_about_email_summary">Er freut sich über jegliche Nachrichten, weil er dann weiß, dass die Software, die er entwickelt hat, benutzt wird</string>
    <string name="email_body">(Bleibe höflich!)</string>
    <string name="settings_about_request_parser">Um die Entwicklung eines Tabellenlesers bitten</string>
    <string name="settings_about_issues">Issue tracker</string>
    <string name="settings_about_repository">Repository</string>
    <string name="settings_about_repository_summary">Diese Software ist unter GNU GPL v3 lizenziert, weswegen du zusätzliche Freiheiten genießt</string>
    <string name="settings_about_issues_summary">Gebrauche den Issue tracker, um Funktionen zu beantragen und Fehler zu melden</string>
    <string name="request_parser_popup_title">Tabellenleser beantragen</string>
    <string name="request_parser_popup_message">Um einen Tabellenleser zu entwickeln, benötigt der Entwickler Zugang zu deinem Plan.
        \n\nDeswegen wird die URL der letzten Vertretungsplandatei an einen von Moritz Zwerger (bixilon.de) betriebenen Server übertragen.
        \n\nBeim Transfer werden keine persönlichen Daten gespeichert. Der Uploadvorgang ist nicht automatisch reversibel, bitte nimm Kontakt auf, wenn du versehentlich den Zugang zu einer vertraulichen Datei hochgeladen hast.
        \n\nWenn dein Plan aus Bildern besteht, kann er nicht ausgelesen werden. Frage deine Schule, ob sie dem Elektronischen Schwarzen Brett stattdessen eine Webseite ausliefern können.
        </string>
    <string name="credentials_popup_title">Anmeldung fehlgeschlagen</string>
    <string name="one_file">eine Datei</string>
    <string name="files">Dateien</string>
    <string name="transfer_now">Jetzt übertragen</string>
    <string name="dont_request">Doch nicht</string>
    <string name="open">Öffnen</string>
    <string name="login_login">Anmelden</string>
    <string name="login_title">Im Elektronischen Schwarzen Brett anmelden</string>

    <string-array name="settings_view_parser_options">
        <item>Automatisch</item>
        <item>Untis</item>
        <item>HeinekingMedia (Goethe)</item>
        <item>WhiteYellow</item>
    </string-array>
    <string-array name="settings_view_parser_values">
        <item>automatic</item>
        <item>untis</item>
        <item>goethe</item>
        <item>whiteyellow</item>
    </string-array>
    <string-array name="settings_view_layout_options">
        <item>Liste</item>
        <item>Karten – Schüler*in</item>
        <item>Karten – Lehrkraft</item>
    </string-array>
    <string-array name="settings_view_style_options">
        <item>Hell</item>
        <item>Dunkel</item>
        <item>Schwarz</item>
    </string-array>
    <string-array name="settings_time_travel_caching_options">
        <item>drei Tage</item>
        <item>eine Woche</item>
        <item>zwei Wochen</item>
        <item>einen Monat</item>
        <item>drei Monate</item>
        <item>eine Ewigkeit</item>
    </string-array>
    <string-array name="settings_polling_interval_options">
        <item>5 Minuten</item>
        <item>10 Minuten</item>
        <item>20 Minuten</item>
        <item>30 Minuten</item>
    </string-array>
    <string-array name="settings_updates_check_options">
        <item>Nie</item>
        <item>Ab und zu (empfohlen)</item>
        <item>Bei jedem Start</item>
    </string-array>
    <string name="settings_polling">Benachrichtigungen</string>
    <string name="settings_polling_enabled">Benachrichtigungen aktivieren</string>
    <string name="notification_channel_plan_updates">Planaktualisierungen</string>
    <string name="notification_channel_plan_updates_description">Über Planaktualisierungen benachrichtigen</string>
    <string name="notification_plan_html_updates_title">Heute</string>
    <string name="notification_plan_html_updates_empty">Keine Einträge für heute</string>
    <string name="notification_plan_updates_title">Neuer Plan verfügbar</string>
    <string name="notification_plan_updates_text_pluralize_entries_one">Es gibt einen Eintrag</string>
    <string name="notification_plan_updates_text_pluralize_entries_many">Es gibt {0} Einträge</string>
    <string name="settings_polling_description">Empfange die Einträge des Tages als Benachrichtigung, sobald sie verfügbar werden. Diese Funktion kann Batterieverbrauch verursachen. Wochenends und in der Nacht wird nicht nach Benachrichtigungen gesucht, um Energie zu sparen.</string>
    <string name="settings_view_layout">Layout</string>
    <string name="settings_view_filter_hide_past">Vergangene Einträge nicht anzeigen</string>
    <string name="settings_view_polling_api_too_low">Benötigt Android 5.0+</string>
    <string name="settings_polling_interval">Aktualisierungsintervall</string>
    <string name="settings_polling_interval_summary">Alle %s nach neuen Benachrichtigungen suchen</string>
    <string name="settings_polling_display_empty">Leere Nachrichten anzeigen</string>
    <string name="settings_polling_display_empty_summary">Auch benachrichtigen, wenn keine Einträge den Filtern entsprechen</string>
    <string name="settings_polling_download">Neue Pläne automatisch herunterladen</string>
    <string name="settings_polling_download_summary">Neue Dateien herunterladen, sobald sie gefunden wurden</string>
    <string name="settings_polling_download_recommended">Benötigt, um Einträge in Benachrichtigungen anzuzeigen</string>
    <string name="settings_view_merge">Zusammenführen</string>
    <string name="settings_view_merge_summary">Mehrere Seiten in eine Tabelle zusammenführen</string>
    <string name="credentials_popup_message">Deine Zugansdaten sind ungültig. Wenn sie das nicht sind, könnte das ein Problem sein, für das es bereits eine Lösung gibt.</string>
    <string name="network_generic_error_credentials">Während der Verifizierung deiner Zugangsdaten ist ein Fehler aufgetreten.</string>
    <string name="notifications_popup_title">Benachrichtigungen aktivieren?</string>
    <string name="notifications_popup_message">Möchtest du Benachrichtigungen erhalten, wenn dein Plan aktualisiert wird?</string>
    <string name="yes">Ja</string>
    <string name="no">Nein</string>
    <string name="share_title">Diesen Eintrag teilen</string>
    <string name="settings_filter">Filter</string>
    <string name="settings_view_style">Hintergrund</string>
    <string name="settings_parser">Tabellenleser</string>
    <string name="today">Heute</string>
    <string name="tomorrow">Morgen</string>
    <string name="yesterday">Gestern</string>
    <string name="settings_about_libraries">Über Bibliotheken</string>
    <string name="about_libraries_header">Die folgenden Bibliotheken dienen der Funktionalität dieser Anwendung.</string>
    <string name="license">Lizenz</string>
    <string name="license_explanation">%1$s vertreibt %2$s unter der folgenden %3$s-Lizenz.</string>
    <string name="about_libraries_open_browser">Im Browser öffnen</string>
    <string name="contact_app_developer">App-Entwickler kontaktieren</string>
    <string name="credits">HeinekingMedia-Tabellenleser entwickelt von Jasper Michalke
    \nEltern-Portal-Importfunktion entwickelt von Moritz Zwerger</string>
    <string name="settings_view_styling">Stil und Farben</string>
    <string name="settings_styling_color_primary">Hauptfarbe</string>
    <string name="action_pick_color_popup_message">Wähle eine Farbe.</string>
    <string name="action_pick_color_popup">Farbe wählen</string>
    <string name="settings_styling_color_accent">Akzentfarbe</string>
    <string name="settings_styling_color_primary_dark">Hauptfarbe dunkel</string>
    <string name="settings_style_description">Du kannst die Farben der Applikation deinem Geschmack anpassen. Ungünstigerweise werden die voreingestellten Farben blau und pink weiterhin an manchen Stellen sichtbar sein, an denen es schwierig oder unmöglich ist, sie zu ändern.</string>
    <string name="news_fix">Nach einer Fehlerbehebung suchen</string>
    <string name="news_network_error_generic">Die Suche nach einer Fehlerbehebung war aufgrund eines Netzwerkfehlers nicht möglich.</string>
    <string name="news_network_invalid_response">Die Suche nach einer Fehlerbehebung ist fehlgeschlagen, vielleicht versuchst du es besser später noch einmal?</string>
    <string name="action_check_news">Neuigkeiten herunterladen</string>
    <string name="network_login_denied">Login abgelehnt – entweder sind deine Zugangsdaten falsch oder der Server hat keine Lust</string>
    <string name="credentials_popup_open_preferences">Einstellungen öffnen</string>
    <string name="settings_view_parse_not_exclusively_html">Zusammenführen ist nicht möglich, weil dein Plan wenigstens ein Bild beinhaltet</string>
    <string name="action_switch_login">Login wechseln</string>
    <string name="action_add_login">Login hinzufügen</string>
    <string name="settings_login_manage">Zugangsdaten verwalten</string>
    <string name="settings_login_alias_popup">Anzeigename für %s einstellen</string>
    <string name="settings_login_alias_popup_message">Wenn du einen Anzeigenamen einstellst, wird dieser anstatt der ID im Login-Wechselmenü angezeigt. Lässt du ihn frei, wird er wenn möglich mit dem Namen der Schule befüllt.</string>
    <string name="settings_login_description">Du kannst im Menü auf dem Hauptbildschirm zwischen verschiedenen Logins wechseln.</string>
    <string name="settings_login_remove">Login entfernen</string>
    <string name="network_generic_error_request">Beim Übermitteln deiner Anfrage ist ein Problem aufgetreten. Bitte stelle sicher, dass das Internet erreichbar ist.</string>
    <string name="request_parser_uploading_message">Anfrage läuft…</string>
    <string name="request_parser_uploading_failed_message">Der Server hat ein Problem beim Empfangen deiner Datei gemeldet.</string>
    <string name="request_parser_uploading_successful_message">Der Server hat deine Datei erfolgreich empfangen.</string>
    <string name="request_parser_uploading_successful_title">Anfrage erfolgreich</string>
    <string name="request_parser_uploading_failed_title">Anfrage fehlgeschlagen</string>

    <string name="settings_shortcodes">Kürzel</string>
    <string name="settings_shortcodes_enable">Kürzel aktivieren</string>
    <string name="settings_shortcodes_enable_summary">Lehrkraftkürzel durch den vollständigen Namen ersetzen</string>
    <string name="settings_shortcodes_elternportal">Import von eltern-portal.org</string>
    <string name="settings_shortcodes_elternportal_summary">Falls deine Schule die Platform "Eltern-Portal" benutzt, können die Kürzel der Lehrkräfte von dort heruntergeladen werden</string>

    <string name="settings_shortcodes_elternportal_popup_title">Kürzel importieren</string>
    <string name="settings_shortcodes_elternportal_popup_message">Bitte gib hier die Zugangsdaten für das von art soft and more GmbH betriebene "Eltern-Portal" ein, um die Kürzel von dort einmalig automatisch zu importieren. Zugansdaten werden nicht gespeichert. Vorhandene Kürzel werden überschrieben.</string>

    <string name="settings_shortcodes_elternportal_popup_text_url">URL des Eltern-Portals</string>
    <string name="settings_shortcodes_elternportal_popup_hint_url">URL</string>
    <string name="settings_shortcodes_elternportal_popup_text_email">E-Mail-Adresse</string>
    <string name="settings_shortcodes_elternportal_popup_hint_email">E-Mail</string>
    <string name="settings_shortcodes_elternportal_popup_text_password">Passwort</string>
    <string name="settings_shortcodes_elternportal_popup_hint_password">Pass</string>

    <string name="settings_shortcodes_elternportal_popup_success_title">Import erfolgreich</string>
    <string name="settings_shortcodes_elternportal_popup_fail_title">Import fehlgeschlagen</string>
    <string name="settings_shortcodes_elternportal_popup_success_message">Die Kürzel wurden erfolgreich importiert.</string>
    <string name="settings_shortcodes_elternportal_popup_fail_network">Das Eltern-Portal konnte nicht erreicht werden. Bitte stelle sicher, dass das Internet erreichbar ist.</string>
    <string name="settings_shortcodes_elternportal_popop_fail_url">Ungültige URL</string>
    <string name="settings_shortcodes_elternportal_popop_fail_url_message">Die eingegebene URL war leider nicht gültig.</string>
    <string name="settings_shortcodes_elternportal_popop_fail_credentials_invalid">Die eingegebenen Zugangsdaten waren leider nicht richtig.</string>
    <string name="settings_shortcodes_edit_popup">Kürzel bearbeiten</string>
    <string name="settings_shortcodes_edit_popup_remove">Kürzel entfernen</string>
    <string name="settings_shortcodes_add">Kürzel hinzufügen</string>
    <string name="settings_shortcodes_edit_popup_failure">Kürzel konnte nicht gespeichert werden</string>
    <string name="settings_shortcodes_edit_popup_failure_needs_from">Beide Felder müssen ausgefüllt sein.</string>
    <string name="settings_shortcodes_edit_popup_failure_illegal_character">Kein Feld darf das Zeichen \'→\' enthalten.</string>
    <string name="settings_shortcodes_manage">Kürzel verwalten</string>
    <string name="settings_shortcodes_add_popup">Kürzel hinzufügen</string>
    <string name="settings_shortcodes_description">Kürzel werden durch den vollständen Namen der zugehörigen Lehrkraft ersetzt.</string>
    <string name="edit">Bearbeiten</string>
    <string name="notice_board">Aushänge</string>
    <string name="action_notices">Aushänge</string>
    <string name="notice_board_content_not_displayable">Nicht darstellbarer Inhalt</string>
    <string name="notice_board_content_not_displayable_openable">Nicht darstellbarer Inhalt – zum externen Öffnen klicken</string>

    <string name="migration_dsbdirect_rename">Diese App wurde umbenannt</string>
    <string name="migration_dsbdirect_rename_message">Aufgrund der Existenz des Markenrechts wurde diese Software in ESBDirect umbenannt. Das \"ESB\" steht für \"Elektronisches Schwarzes Brett\".
\n\nSollte dir ein besserer Name einfallen, zögere nicht, eine E-Mail-Nachricht zu schicken.</string>
    <string name="email_the_dev">E-Mail schicken</string>
</resources>


code:
<?xml version="1.0" encoding="utf-8"?>
<!--
  ~ DSBDirect
  ~ Copyright (C) 2019 Fynn Godau
  ~
  ~ This program 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.
  ~
  ~ This program 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 this program.  If not, see <https://www.gnu.org/licenses/>.
  ~
  ~ This software is not affiliated with heinekingmedia GmbH, the
  ~ developer of the DSB platform.
  -->

<resources>

    <style name="LoginTheme" parent="Light">
        <!--Double trouble! -->
        <item name="android:windowBackground">@color/colorPrimary</item>
        <item name="android:background">@color/colorPrimary</item>
        <item name="android:textColor">@color/textOverPrimary</item>
        <item name="android:textColorPrimary">@color/textOverPrimary</item>
        <item name="android:editTextColor">@color/textOverPrimary</item>
        <item name="colorControlNormal">@color/white</item>
        <item name="android:textColorHint">@color/white</item>
        <item name="android:statusBarColor">@color/colorPrimaryDark</item>
        <item name="android:navigationBarColor">@color/colorPrimaryDark</item>
        <item name="android:colorButtonNormal">@color/colorAccent</item>
        <item name="TextOverBackground">@color/textOverPrimary</item>
    </style>

    <style name="Startup" parent="Light">
        <item name="android:windowBackground">@color/colorPrimary</item>
        <item name="android:navigationBarColor">@color/colorPrimaryDark</item>
    </style>
</resources>


code:
<resources>
    <!-- Example customization of dimensions originally defined in res/values/dimens.xml
         (such as screen margins) for screens with more than 820dp of available width. This
         would include 7" and 10" devices in landscape (~960dp and ~1280dp respectively). -->
    <dimen name="activity_horizontal_margin">64dp</dimen>
</resources>


code:
<?xml version="1.0" encoding="utf-8"?>
<!--
  ~ DSBDirect
  ~ Copyright (C) 2019 Fynn Godau
  ~
  ~ This program 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.
  ~
  ~ This program 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 this program.  If not, see <https://www.gnu.org/licenses/>.
  ~
  ~ This software is not affiliated with heinekingmedia GmbH, the
  ~ developer of the DSB platform.
  -->

<resources>
    <attr name="TextOverBackground" format="color"/>
</resources>


code:
<?xml version="1.0" encoding="utf-8"?>
<!--
  ~ DSBDirect
  ~ Copyright (C) 2019 Fynn Godau
  ~
  ~ This program 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.
  ~
  ~ This program 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 this program.  If not, see <https://www.gnu.org/licenses/>.
  ~
  ~ This software is not affiliated with heinekingmedia GmbH, the
  ~ developer of the DSB platform.
  -->

<resources>
    <color name="colorPrimary">#3F51B5</color>
    <color name="colorPrimaryDark">#303F9F</color>
    <color name="colorAccent">#FF4081</color>
    <color name="titleText">#ffffff</color>
    <color name="white">#FFFFFF</color>
    <color name="textOverPrimary">#ddffffff</color>
    <color name="textOverWhite">#dd000000</color>
    <color name="textSecondaryOverPrimary">#7fffffff</color>
</resources>


code:
<resources>
    <!-- Default screen margins, per the Android Design guidelines. -->
    <dimen name="activity_horizontal_margin">16dp</dimen>
    <dimen name="activity_vertical_margin">16dp</dimen>
    <dimen name="appbar_padding">16dp</dimen>
    <dimen name="fab_margin">16dp</dimen>
    <dimen name="appbar_padding_top">8dp</dimen>
</resources>


code:
<?xml version="1.0" encoding="utf-8"?>
<!--
  ~ DSBDirect
  ~ Copyright (C) 2019 Fynn Godau
  ~
  ~ This program 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.
  ~
  ~ This program 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 this program.  If not, see <https://www.gnu.org/licenses/>.
  ~
  ~ This software is not affiliated with heinekingmedia GmbH, the
  ~ developer of the DSB platform.
  -->

<resources>
    <color name="ic_launcher_background">#000000</color>
</resources>