diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..c6c3855 --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +Einschlafhilfe \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml index fb7f4a8..b589d56 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -1,6 +1,6 @@ - + \ No newline at end of file diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml new file mode 100644 index 0000000..0c0c338 --- /dev/null +++ b/.idea/deploymentTargetDropDown.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml index a2d7c21..0897082 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -4,15 +4,15 @@ diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..cd7dba1 --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 70f9ce0..209b8ad 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,4 +1,3 @@ - - + diff --git a/app/build.gradle b/app/build.gradle index 33ae07a..8b9928d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,14 +2,15 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' android { - compileSdkVersion 32 + + compileSdkVersion 33 defaultConfig { applicationId "de.msdevs.einschlafhilfe" minSdkVersion 26 - targetSdkVersion 32 - versionCode 44 - versionName "4.0" + targetSdkVersion 33 + versionCode 46 + versionName "4.2" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } @@ -27,11 +28,12 @@ android { dependencies { implementation fileTree(dir: "libs", include: ["*.jar"]) - implementation 'androidx.appcompat:appcompat:1.4.2' + implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' - implementation 'com.google.android.material:material:1.6.1' - implementation 'com.github.bumptech.glide:glide:4.13.0' - annotationProcessor 'com.github.bumptech.glide:compiler:4.13.0' + implementation 'com.google.android.material:material:1.9.0' + implementation 'com.github.bumptech.glide:glide:4.15.1' + annotationProcessor 'com.github.bumptech.glide:compiler:4.14.2' + implementation 'com.github.cachapa:ExpandableLayout:2.9.2' implementation "androidx.core:core-ktx:1.8.0" implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.4.1" implementation("ru.gildor.coroutines:kotlin-coroutines-okhttp:1.0") diff --git a/app/build/generated/source/buildConfig/debug/de/msdevs/einschlafhilfe/BuildConfig.java b/app/build/generated/source/buildConfig/debug/de/msdevs/einschlafhilfe/BuildConfig.java new file mode 100644 index 0000000..ee0cd00 --- /dev/null +++ b/app/build/generated/source/buildConfig/debug/de/msdevs/einschlafhilfe/BuildConfig.java @@ -0,0 +1,12 @@ +/** + * Automatically generated file. DO NOT MODIFY + */ +package de.msdevs.einschlafhilfe; + +public final class BuildConfig { + public static final boolean DEBUG = Boolean.parseBoolean("true"); + public static final String APPLICATION_ID = "de.msdevs.einschlafhilfe"; + public static final String BUILD_TYPE = "debug"; + public static final int VERSION_CODE = 46; + public static final String VERSION_NAME = "4.2"; +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c25dff9..9bbc2d7 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,18 +1,20 @@ + xmlns:tools="http://schemas.android.com/tools"> - + + - + - + + + + + + \ No newline at end of file diff --git a/app/src/main/assets/offline_list.txt b/app/src/main/assets/offline_list.txt index 9682804..4aea125 100644 --- a/app/src/main/assets/offline_list.txt +++ b/app/src/main/assets/offline_list.txt @@ -1307,6 +1307,30 @@ "beschreibung": "Ein Einbrecher, der nichts stiehlt, sondern Gegenstände hinterlässt? In Rocky Beach gehen seltsame Dinge vor, wenn das kein Fall für die drei ??? ist! Was zunächst harmlos erscheint, folgt einem Muster und genau dieses versuchen Just, Peter und Bob zu entschlüsseln. Doch jemand will mit aller Kraft verhindern, dass die Detektive Licht ins Dunkel bringen. Werden die drei Freunde den Fall lösen, bevor es zu einer Katastrophe kommt, oder verstricken sie sich im Netz der Lügen?", "nummer": "218", "spotify": "https://open.spotify.com/album/2WwOKZLpFWrvw3O9CISod1" + }, + { + "name": "Die drei Fragezeichen - Die Teufelsklippe", + "beschreibung": "Peter Shaw - ein Mörder? Ganz bestimmt nicht! Da sind sich Justus und Bob sicher. Können die beiden die Unschuld des Zweiten Detektivs beweisen? Peter sieht ihn fallen, doch die Teufelsklippe gibt ihn nicht wieder her. Verschluckt von den tosenden Wellen bleibt der Mann verschwunden … Was ist passiert? Ausgerechnet der Zweite Detektiv wird beschuldigt, Paul Forsters ins Meer gestoßen zu haben. Im Verhör wird Peter bis ins kleinste Detail befragt. Justus und Bob versuchen derweil mehr über den seltsamen Fall herauszufinden. Können die beiden ihrem Freund helfen?", + "nummer": "219", + "spotify": "https://open.spotify.com/album/6ewdyVIW2LurJhYGU0UBAa" + }, + { + "name": "Die drei Fragezeichen - Im Wald der Gefahren", + "beschreibung": "Von Rocky Beach in die Rocky Mountains – die drei ??? freuen sich auf ein Wander-Wochenende. Was harmlos beginnt, wird zum Kampf ums nackte Überleben! Noch bevor die Wandergruppe aufbricht, wittern die drei Detektive einen neuen Fall: Ein toter Briefkasten und eine Stolperfalle – will jemand die Tour verhindern? Schon auf der ersten Etappe wird es brenzlig. Ein Bach wird zum reißenden Fluss, und Pilze sollte man mit Vorsicht genießen. Als Peter verschwindet, wird klar: Die Wildnis hat etwas zu verbergen. Die drei ??? finden sich im Wald der Gefahren wieder ...", + "nummer": "220", + "spotify": "https://open.spotify.com/album/01i4iyB40EU7Qgd6EgKoZt" + }, + { + "name": "Die drei Fragezeichen - Manuskript des Satans", + "beschreibung": "Ein Manuskript des leibhaftigen Satans und teuflische Lärmattacken – dieser Fall hat es in sich! Begeben die drei ??? sich in höllische Gefahr? Wer steckt hinter dem entsetzlichen Lärmangriff auf das Haus von Professor Bancroft? Während der Wissenschaftler versucht, eine geheimnisvolle alte Handschrift zu übersetzen, machen sich Justus, Peter und Bob auf die Suche nach der Lärmquelle. Haben die Attacken etwas mit dem Manuskript des Satans zu tun, an dem der Professor gerade arbeitet? Die drei Detektive werden es herausfinden. ", + "nummer": "221", + "spotify": "https://open.spotify.com/album/1KpVSqapKAUAtAepWWxPWs" + }, + { + "name": "Die drei Fragezeichen - Die Gesetzlosen", + "beschreibung": "Schneller als Peter Shaw gucken kann, wird er in einen heiklen Fall verwickelt: Zufällig hört er, wie seine Mathe-Lehrerin Ms Blunt ein dubiöses Telefonat führt. Als gewissenhafter Detektiv heftet er sich an die Fersen der Lehrerin und findet heraus, dass die unauffällige Frau ein dunkles Geheimnis hat. Die drei ??? begeben sich auf einen Roadtrip durch die kalifornische Prärie und auf die Spur skrupelloser Kopfgeldjäger!", + "nummer": "222", + "spotify": "https://open.spotify.com/album/3o2Gwvg8lqLNRnlV1v1s5K" } ] } \ No newline at end of file diff --git a/app/src/main/assets/offline_list_kids.txt b/app/src/main/assets/offline_list_kids.txt index 3c97dda..93b8ffd 100644 --- a/app/src/main/assets/offline_list_kids.txt +++ b/app/src/main/assets/offline_list_kids.txt @@ -523,6 +523,30 @@ "beschreibung": "Peters Lieblings-Basketball Mannschaft spielt in Rocky Beach. Während des Turniers passieren unerklärliche Dinge. Ist etwa ein Geist im Stadion? Die drei ??? Kids sind sich sicher, dass jemand anderes dahintersteckt ... ", "nummer": "87", "spotify": "3M7f1Ta7DdY49Cj0bsHchW" - } + }, + { + "name": "Schatz aus dem All", + "beschreibung": "Alle in Rocky Beach wollen den fantastischen Schatz aus dem All finden. Auch Justus, Peter und Bob sind mit von der Partie. Doch schon bald ahnen die drei Freunde, dass an der ganzen Sache etwas faul ist ...", + "nummer": "88", + "spotify": "1wzirotAAliqPA1p0GPl08" + }, + { + "name": "Im Geistergarten", + "beschreibung": "Unheimliche Touristen streifen durch Rocky Beach und lassen ihre Drohnen am Himmel aufsteigen. Als im Rathaus auch noch alte Stadtpläne gestohlen werden, fragen sich die drei ??? Kids: Was geht hier vor?", + "nummer": "89", + "spotify": "7HIZJWnLo11Fsv68HPhjgj" + }, + { + "name": "Flug ins Nichts", + "beschreibung": "Justus, Peter und Bob freuen sich über eine spektakuläre Attraktion: Mitten auf dem Marktplatz steht ein Windkanal für Bodyflying. Aber schon beim ersten Testflug geht einiges schief. Ein neuer Fall für die drei Detektive. ", + "nummer": "90", + "spotify": "41Wrbk3iySSFbBnbixychu" + }, + { + "name": "Gefahr im Spiegelkabinett", + "beschreibung": "Onkel Titus kauft ein altes Spiegelkabinett. Bei genauerer Inspektion hören die drei ??? Kids plötzlich rätselhafte Reime.Vielleicht kann der berühmte Rätselerfinder Mr Think helfen? Doch als Justus, Peter und Bob in seiner Villa ankommen, fehlt von ihm jede Spur... ", + "nummer": "91", + "spotify": "3cbOXb1xkJF65KRjBBqlmL" + } ] } \ No newline at end of file diff --git a/app/src/main/java/de/msdevs/einschlafhilfe/AboutActivity.kt b/app/src/main/java/de/msdevs/einschlafhilfe/AboutActivity.kt index ab26db7..0eac48c 100644 --- a/app/src/main/java/de/msdevs/einschlafhilfe/AboutActivity.kt +++ b/app/src/main/java/de/msdevs/einschlafhilfe/AboutActivity.kt @@ -7,6 +7,7 @@ import android.widget.Button import androidx.appcompat.app.AppCompatActivity import com.google.android.material.dialog.MaterialAlertDialogBuilder import de.msdevs.einschlafhilfe.databinding.ActivityAboutBinding +import net.cachapa.expandablelayout.ExpandableLayout class AboutActivity : AppCompatActivity() { @@ -15,6 +16,15 @@ class AboutActivity : AppCompatActivity() { private lateinit var btnPrivacy : Button private lateinit var btnSource : Button private lateinit var btnLicenses : Button + private lateinit var expandableLayout : ExpandableLayout + + //TODO: RecyclerView für die Libraries nutzen -> Neue Libraries können besser hinzugefügt werden + private lateinit var btnOkHttp : Button + private lateinit var btnGlide : Button + private lateinit var btnCoOkHttp : Button + private lateinit var btnExpandableLayout : Button + private lateinit var btnAppIntro : Button + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -26,27 +36,43 @@ class AboutActivity : AppCompatActivity() { btnPrivacy = binding.btnPrivacy btnSource = binding.btnQuellcode btnLicenses = binding.btnLicense + expandableLayout = binding.expandableLayout + + //TODO: RecyclerView für die Libraries nutzen -> Neue Libraries können besser hinzugefügt werden + btnCoOkHttp = binding.included.btnCoroutinesOkhttp + btnExpandableLayout = binding.included.btnExLayout + btnGlide = binding.included.btnGlide + btnAppIntro = binding.included.btnAppIntro + btnOkHttp = binding.included.btnOkhttp btnPrivacy.setOnClickListener{ opennUrl("https://ddf-einschlafhilfe.de/files/app_privacy.php") } btnSource.setOnClickListener{ - opennUrl("https://github.com/MarvinStelter/DieDreiFragezeichenEinschlafhilfe") + opennUrl("https://github.com/MarvinStelter/DieDreiFragezeichenEinschlafhilfe") } btnLicenses.setOnClickListener{ - val builder = MaterialAlertDialogBuilder(this) - builder.setTitle(getString(R.string.third_party_libraries)) - val animals = arrayOf("AppIntro", "Glide", "OkHttp", "kotlin-coroutines-okhttp") - builder.setItems(animals) { dialog, which -> - when (which) { - 0 -> { opennUrl("https://github.com/AppIntro/AppIntro") } - 1 -> { opennUrl("https://github.com/bumptech/glide") } - 2 -> { opennUrl("https://github.com/square/okhttp") } - 3 -> { opennUrl("https://github.com/gildor/kotlin-coroutines-okhttp") } - } - } - val dialog = builder.create() - dialog.show() + if(expandableLayout.isExpanded){ + expandableLayout.collapse() + }else{ + expandableLayout.expand() + } + } + //TODO: RecyclerView für die Libraries nutzen -> Neue Libraries können besser hinzugefügt werden + btnOkHttp.setOnClickListener{ + opennUrl("https://github.com/square/okhttp") + } + btnCoOkHttp.setOnClickListener{ + opennUrl("https://github.com/gildor/kotlin-coroutines-okhttp") + } + btnGlide.setOnClickListener{ + opennUrl("https://github.com/bumptech/glide") + } + btnExpandableLayout.setOnClickListener{ + opennUrl("https://github.com/cachapa/ExpandableLayout") + } + btnAppIntro.setOnClickListener{ + opennUrl("https://github.com/AppIntro/AppIntro") } } override fun onSupportNavigateUp(): Boolean { @@ -57,4 +83,4 @@ class AboutActivity : AppCompatActivity() { val browserIntent = Intent(Intent.ACTION_VIEW, Uri.parse(url)) startActivity(browserIntent) } -} \ No newline at end of file +} diff --git a/app/src/main/java/de/msdevs/einschlafhilfe/MainActivity.kt b/app/src/main/java/de/msdevs/einschlafhilfe/MainActivity.kt index 4cd3e7c..3167b80 100644 --- a/app/src/main/java/de/msdevs/einschlafhilfe/MainActivity.kt +++ b/app/src/main/java/de/msdevs/einschlafhilfe/MainActivity.kt @@ -42,7 +42,7 @@ class MainActivity : AppCompatActivity() { private lateinit var folgenListe : String var random : Int = 0 /* - Copyright 2022 by Marvin Stelter + Copyright 2017 - 2023 by Marvin Stelter */ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -120,12 +120,12 @@ class MainActivity : AppCompatActivity() { refresh() } binding.fabDescription.setOnClickListener { - val alert = AlertDialog.Builder(this) + val alert = MaterialAlertDialogBuilder(this, R.style.DialogTheme) alert.setTitle(getString(R.string.output, (episodeNumber + 1).toString(), episodeList[episodeNumber].name) ) alert.setMessage(episodeList[episodeNumber].beschreibung) - alert.setNeutralButton(getString(R.string.close)) { dlg: DialogInterface, _: Int -> dlg.dismiss() } + alert.setNegativeButton(getString(R.string.close)) { dlg: DialogInterface, _: Int -> dlg.dismiss() } alert.show() } binding.fabLinks.setOnClickListener { @@ -155,7 +155,7 @@ class MainActivity : AppCompatActivity() { } - val builder = MaterialAlertDialogBuilder(this) + val builder = MaterialAlertDialogBuilder(this, R.style.DialogTheme) builder.setTitle("Links:") builder.setItems(liste) { _: DialogInterface?, which: Int -> var i = Intent(Intent.ACTION_VIEW) @@ -350,8 +350,7 @@ class MainActivity : AppCompatActivity() { val spotify: String ) - @SuppressLint("QueryPermissionsNeeded") - fun isSpotifyInstalled() : Boolean{ + private fun isSpotifyInstalled() : Boolean{ val packageManager: PackageManager = packageManager val intent = Intent(Intent.ACTION_VIEW) if (intent.resolveActivity(packageManager) != null) { @@ -374,7 +373,7 @@ class MainActivity : AppCompatActivity() { 0 -> episodeNumber = (1..50).random() 1 -> episodeNumber = (1..100).random() 2 -> episodeNumber = (1..150).random() - 3 -> episodeNumber = (1..216).random() + 3 -> episodeNumber = (1..222).random() 4 -> episodeNumber = (1..7).random() 5 -> episodeNumber = 0 6 -> episodeNumber = (1..87).random() diff --git a/app/src/main/java/de/msdevs/einschlafhilfe/fragments/SettingsFragment.kt b/app/src/main/java/de/msdevs/einschlafhilfe/fragments/SettingsFragment.kt index 8242c12..7da4244 100644 --- a/app/src/main/java/de/msdevs/einschlafhilfe/fragments/SettingsFragment.kt +++ b/app/src/main/java/de/msdevs/einschlafhilfe/fragments/SettingsFragment.kt @@ -3,26 +3,21 @@ package de.msdevs.einschlafhilfe.fragments import android.annotation.SuppressLint import android.content.SharedPreferences -import android.os.Build import android.os.Bundle -import android.text.Html import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.widget.CheckBox import androidx.annotation.Nullable -import androidx.appcompat.widget.SwitchCompat import androidx.fragment.app.Fragment import com.github.appintro.SlidePolicy -import com.google.android.material.slider.RangeSlider -import de.msdevs.einschlafhilfe.R +import com.google.android.material.materialswitch.MaterialSwitch import de.msdevs.einschlafhilfe.databinding.FragmentSettingsBinding class SettingsFragment(override val isPolicyRespected: Boolean) : Fragment(), SlidePolicy { - lateinit var switchSpotify : SwitchCompat - lateinit var switchUpdatelist : SwitchCompat + lateinit var switchSpotify : MaterialSwitch + lateinit var switchUpdatelist : MaterialSwitch lateinit var sharedPreferences: SharedPreferences lateinit var sharedPreferencesEditor: SharedPreferences.Editor lateinit var binding : FragmentSettingsBinding @@ -53,8 +48,6 @@ class SettingsFragment(override val isPolicyRespected: Boolean) : Fragment(), Sl sharedPreferencesEditor.putBoolean("update_list",isChecked) sharedPreferencesEditor.apply() } - - } companion object { fun newInstance() : SettingsFragment { diff --git a/app/src/main/res/drawable/placeholder_black.png b/app/src/main/res/drawable/placeholder_black.png new file mode 100644 index 0000000..2f293bd Binary files /dev/null and b/app/src/main/res/drawable/placeholder_black.png differ diff --git a/app/src/main/res/drawable/thumb_style.xml b/app/src/main/res/drawable/thumb_style.xml new file mode 100644 index 0000000..f84531d --- /dev/null +++ b/app/src/main/res/drawable/thumb_style.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_about.xml b/app/src/main/res/layout/activity_about.xml index 3a808fa..69c4ebe 100644 --- a/app/src/main/res/layout/activity_about.xml +++ b/app/src/main/res/layout/activity_about.xml @@ -1,5 +1,6 @@ @@ -69,6 +70,24 @@ android:id="@+id/btn_license" android:backgroundTint="@color/white" android:layout_height="wrap_content"/> + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 62e0377..6687daf 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,254 +1,255 @@ - - - - - - - - - - - - - - - - - - -