From 5cad924b2676cd4683b8a4e4525fdab8439935e2 Mon Sep 17 00:00:00 2001 From: Seil0 Date: Thu, 17 Oct 2019 19:19:47 +0200 Subject: [PATCH 01/11] removed anko dependency from PreferenceController --- .drone.yml | 2 +- app/build.gradle | 2 +- .../seil0/projectlaogai/controller/CacheController.kt | 4 +++- .../projectlaogai/controller/PreferencesController.kt | 11 ++++++++--- .../projectlaogai/controller/TCoRAPIController.kt | 4 ++++ app/src/main/res/values/strings.xml | 1 + 6 files changed, 18 insertions(+), 6 deletions(-) diff --git a/.drone.yml b/.drone.yml index cfb7155..0affa35 100644 --- a/.drone.yml +++ b/.drone.yml @@ -3,7 +3,7 @@ name: default steps: - name: assembleRelease - image: gradle:jdk8 + image: nextcloudci/android commands: - gradle assembleRelease diff --git a/app/build.gradle b/app/build.gradle index c63918f..1b6aa14 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -55,7 +55,7 @@ dependencies { implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta2' implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.0.0' implementation 'com.google.android.material:material:1.0.0' - implementation 'com.google.code.gson:gson:2.8.5' + implementation 'com.google.code.gson:gson:2.8.6' implementation 'com.afollestad:aesthetic:1.0.0-beta05' implementation 'com.afollestad.material-dialogs:core:3.1.1' implementation 'com.afollestad.material-dialogs:color:3.1.1' diff --git a/app/src/main/java/org/mosad/seil0/projectlaogai/controller/CacheController.kt b/app/src/main/java/org/mosad/seil0/projectlaogai/controller/CacheController.kt index 09c6aba..c88c1a5 100644 --- a/app/src/main/java/org/mosad/seil0/projectlaogai/controller/CacheController.kt +++ b/app/src/main/java/org/mosad/seil0/projectlaogai/controller/CacheController.kt @@ -28,7 +28,9 @@ import com.google.gson.GsonBuilder import com.google.gson.JsonParser import com.google.gson.reflect.TypeToken import org.mosad.seil0.projectlaogai.controller.PreferencesController.Companion.cCourse -import org.mosad.seil0.projectlaogai.hsoparser.* +import org.mosad.seil0.projectlaogai.hsoparser.Course +import org.mosad.seil0.projectlaogai.hsoparser.MensaMenu +import org.mosad.seil0.projectlaogai.hsoparser.TimetableCourseWeek import java.io.BufferedReader import java.io.File import java.io.FileReader diff --git a/app/src/main/java/org/mosad/seil0/projectlaogai/controller/PreferencesController.kt b/app/src/main/java/org/mosad/seil0/projectlaogai/controller/PreferencesController.kt index d6a43fa..f32f6c6 100644 --- a/app/src/main/java/org/mosad/seil0/projectlaogai/controller/PreferencesController.kt +++ b/app/src/main/java/org/mosad/seil0/projectlaogai/controller/PreferencesController.kt @@ -24,7 +24,6 @@ package org.mosad.seil0.projectlaogai.controller import android.content.Context import android.graphics.Color -import org.jetbrains.anko.defaultSharedPreferences import org.mosad.seil0.projectlaogai.R import org.mosad.seil0.projectlaogai.hsoparser.Course @@ -46,7 +45,10 @@ class PreferencesController { // the save function fun save(context: Context) { - val sharedPref = context.defaultSharedPreferences + val sharedPref = context.getSharedPreferences( + context.getString(R.string.preference_file_key), + Context.MODE_PRIVATE + ) // save the update times (cache) with (sharedPref.edit()) { @@ -97,7 +99,10 @@ class PreferencesController { // the load function fun load(context: Context) { - val sharedPref = context.defaultSharedPreferences + val sharedPref = context.getSharedPreferences( + context.getString(R.string.preference_file_key), + Context.MODE_PRIVATE + ) // load the update times (cache) coursesCacheTime = sharedPref.getLong(context.getString( diff --git a/app/src/main/java/org/mosad/seil0/projectlaogai/controller/TCoRAPIController.kt b/app/src/main/java/org/mosad/seil0/projectlaogai/controller/TCoRAPIController.kt index 2d03274..6f7c00d 100644 --- a/app/src/main/java/org/mosad/seil0/projectlaogai/controller/TCoRAPIController.kt +++ b/app/src/main/java/org/mosad/seil0/projectlaogai/controller/TCoRAPIController.kt @@ -37,6 +37,10 @@ import kotlin.Exception class TCoRAPIController { + /** + * TODO since anko seems dead, we should use coroutines here + */ + companion object { private const val className = "TCoRAPIController" private const val tcorBaseURL = "https://tcor.mosad.xyz" diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 57efb0b..17d7bf3 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -60,6 +60,7 @@ Could not load timetable!" + org.mosad.seil0.projectlaogai_preferences org.mosad.seil0.projectlaogai.course org.mosad.seil0.projectlaogai.courseTTLink org.mosad.seil0.projectlaogai.colorPrimary From 701a351e6ee1c6d6c915992b7c8411e541823f72 Mon Sep 17 00:00:00 2001 From: Seil0 Date: Thu, 17 Oct 2019 19:21:15 +0200 Subject: [PATCH 02/11] update .drone.yml --- .drone.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.drone.yml b/.drone.yml index 0affa35..4ea35a1 100644 --- a/.drone.yml +++ b/.drone.yml @@ -3,7 +3,7 @@ name: default steps: - name: assembleRelease - image: nextcloudci/android + image: nextcloudci/android:android-51 commands: - gradle assembleRelease From 5ec2b53bcef11d0271122ad77218949e18141626 Mon Sep 17 00:00:00 2001 From: Seil0 Date: Thu, 24 Oct 2019 22:22:17 +0200 Subject: [PATCH 03/11] added "Get it on Google Play" badge --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index b72a3f5..d7da456 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,7 @@ ProjectLaogai is a app to access the timetable and the mensa menu of Hochschule Offenburg. [](https://f-droid.org/packages/org.mosad.seil0.projectlaogai/) +[](https://play.google.com/store/apps/details?id=org.mosad.seil0.projectlaogai) ## Features * check out the mensa menu of this and next week * access your timetable From d4860b2a32731b32e545936a0cce44bd616d3ed6 Mon Sep 17 00:00:00 2001 From: Seil0 Date: Thu, 14 Nov 2019 23:11:49 +0100 Subject: [PATCH 04/11] updated some libs * kotlin 1.3.50 -> 1.3.60 * androidx.constraintlayout 2.0.0-beta2 -> 2.0.0-beta3 --- app/build.gradle | 2 +- build.gradle | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 1b6aa14..5d88468 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -52,7 +52,7 @@ dependencies { implementation 'org.jetbrains.anko:anko-commons:0.10.8' implementation 'androidx.appcompat:appcompat:1.1.0' implementation 'androidx.legacy:legacy-support-v4:1.0.0' - implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta2' + implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta3' implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.0.0' implementation 'com.google.android.material:material:1.0.0' implementation 'com.google.code.gson:gson:2.8.6' diff --git a/build.gradle b/build.gradle index 8d482e6..dc25159 100644 --- a/build.gradle +++ b/build.gradle @@ -1,13 +1,13 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.3.50' + ext.kotlin_version = '1.3.60' repositories { google() jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.5.0' + classpath 'com.android.tools.build:gradle:3.5.2' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // NOTE: Do not place your application dependencies here; they belong From 9907d083e97de4c93e742de522a7da42731b6535 Mon Sep 17 00:00:00 2001 From: Seil0 Date: Thu, 28 Nov 2019 16:38:25 +0100 Subject: [PATCH 05/11] added a Mensa shortcut * added a Mensa shortcut, to directly display the Mensa-Screen * kotlin 1.3.60 -> 1.3.61 --- app/src/main/AndroidManifest.xml | 3 +++ .../org/mosad/seil0/projectlaogai/MainActivity.kt | 8 ++++++++ .../main/res/layouts/activities/xml/shortcuts.xml | 15 +++++++++++++++ app/src/main/res/values-de-rDE/strings.xml | 3 +++ app/src/main/res/values/strings.xml | 5 +++++ build.gradle | 2 +- 6 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 app/src/main/res/layouts/activities/xml/shortcuts.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 2693fae..93c91fa 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -23,6 +23,9 @@ + + + + + + + diff --git a/app/src/main/res/values-de-rDE/strings.xml b/app/src/main/res/values-de-rDE/strings.xml index 64a267b..692dc9b 100644 --- a/app/src/main/res/values-de-rDE/strings.xml +++ b/app/src/main/res/values-de-rDE/strings.xml @@ -46,5 +46,8 @@ Fehler Stundenplan konnte nicht geladen werden! + Mensa deaktiviert + Mensa + Mensa diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 17d7bf3..6261791 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -59,6 +59,11 @@ Error Could not load timetable!" + + Mensa + Mensa + Mensa disabled + org.mosad.seil0.projectlaogai_preferences org.mosad.seil0.projectlaogai.course diff --git a/build.gradle b/build.gradle index dc25159..a75be3a 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.3.60' + ext.kotlin_version = '1.3.61' repositories { google() jcenter() From 8f5a4dd1b343ca496d5e4bf5892d0011d5a68387 Mon Sep 17 00:00:00 2001 From: Seil0 Date: Fri, 13 Dec 2019 14:54:51 +0100 Subject: [PATCH 06/11] reworked preference saving --- .../controller/PreferencesController.kt | 62 ++++++++++++++++--- .../fragments/SettingsFragment.kt | 14 ++--- build.gradle | 2 +- 3 files changed, 59 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/org/mosad/seil0/projectlaogai/controller/PreferencesController.kt b/app/src/main/java/org/mosad/seil0/projectlaogai/controller/PreferencesController.kt index f32f6c6..f3e0094 100644 --- a/app/src/main/java/org/mosad/seil0/projectlaogai/controller/PreferencesController.kt +++ b/app/src/main/java/org/mosad/seil0/projectlaogai/controller/PreferencesController.kt @@ -64,37 +64,81 @@ class PreferencesController { apply() } - // save the course + } + + /** + * save the course locally + */ + fun saveCourse(context: Context, course: Course) { + val sharedPref = context.getSharedPreferences( + context.getString(R.string.preference_file_key), + Context.MODE_PRIVATE + ) + with (sharedPref.edit()) { - putString(context.getString(R.string.save_key_course), cCourse.courseName) - putString(context.getString(R.string.save_key_courseTTLink), cCourse.courseLink) + putString(context.getString(R.string.save_key_course), course.courseName) + putString(context.getString(R.string.save_key_courseTTLink), course.courseLink) apply() } - // save the primary color + cCourse = course + } + + /** + * save the primary color + */ + fun saveColorPrimary(context: Context, colorPrimary: Int) { + val sharedPref = context.getSharedPreferences( + context.getString(R.string.preference_file_key), + Context.MODE_PRIVATE + ) + with (sharedPref.edit()) { putInt(context.getString(R.string.save_key_colorPrimary), - cColorPrimary + colorPrimary ) apply() } - // save the accent color + cColorPrimary = colorPrimary + } + + /** + * save the accent color + */ + fun saveColorAccent(context: Context, colorAccent: Int) { + val sharedPref = context.getSharedPreferences( + context.getString(R.string.preference_file_key), + Context.MODE_PRIVATE + ) + with (sharedPref.edit()) { putInt(context.getString(R.string.save_key_colorAccent), - cColorAccent + colorAccent ) apply() } - // save showBuffet + cColorAccent = colorAccent + } + + /** + * save showBuffet + */ + fun saveShowBuffet(context: Context, showBuffet: Boolean) { + val sharedPref = context.getSharedPreferences( + context.getString(R.string.preference_file_key), + Context.MODE_PRIVATE + ) + with (sharedPref.edit()) { putBoolean(context.getString(R.string.save_key_showBuffet), - cShowBuffet + showBuffet ) apply() } + cShowBuffet = showBuffet } // the load function diff --git a/app/src/main/java/org/mosad/seil0/projectlaogai/fragments/SettingsFragment.kt b/app/src/main/java/org/mosad/seil0/projectlaogai/fragments/SettingsFragment.kt index 50565b9..c69d79f 100644 --- a/app/src/main/java/org/mosad/seil0/projectlaogai/fragments/SettingsFragment.kt +++ b/app/src/main/java/org/mosad/seil0/projectlaogai/fragments/SettingsFragment.kt @@ -182,6 +182,7 @@ class SettingsFragment : Fragment() { 2 -> activityTheme(R.style.AppTheme_Black) else -> activityTheme(R.style.AppTheme_Light) } + apply() } } } @@ -199,8 +200,7 @@ class SettingsFragment : Fragment() { apply() } - cColorPrimary = color - PreferencesController.save(context!!) + PreferencesController.saveColorPrimary(context!!, color) } .positiveButton(R.string.select) .show() @@ -217,17 +217,14 @@ class SettingsFragment : Fragment() { apply() } - cColorAccent = color - PreferencesController.save(context!!) + PreferencesController.saveColorAccent(context!!, color) } .positiveButton(R.string.select) .show() } switchBuffet.setOnClickListener { - cShowBuffet = switchBuffet.isChecked - PreferencesController.save(context!!) - println(switchBuffet.isChecked) + PreferencesController.saveShowBuffet(context!!, switchBuffet.isChecked) } } @@ -249,8 +246,7 @@ class SettingsFragment : Fragment() { dialog.show() doAsync { - cCourse = coursesList[index] // set the course - PreferencesController.save(context) + PreferencesController.saveCourse(context, coursesList[index]) // save the course // update current & next weeks timetable TCoRAPIController.getTimetable(cCourse.courseName, 0, context).get() // blocking since we want the new data diff --git a/build.gradle b/build.gradle index a75be3a..81605cb 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.5.2' + classpath 'com.android.tools.build:gradle:3.5.3' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // NOTE: Do not place your application dependencies here; they belong From bed3f5d9787eacfda3daf979bfa086d3c3261778 Mon Sep 17 00:00:00 2001 From: Seil0 Date: Wed, 15 Jan 2020 15:00:05 +0100 Subject: [PATCH 07/11] added Timetable and Moodle shortcut, cleaned up activity init --- README.md | 2 +- .../mosad/seil0/projectlaogai/MainActivity.kt | 29 +++++++++---------- .../controller/CacheController.kt | 2 +- .../projectlaogai/controller/NFCMensaCard.kt | 2 +- .../controller/PreferencesController.kt | 2 +- .../controller/TCoRAPIController.kt | 2 +- .../projectlaogai/fragments/HomeFragment.kt | 2 +- .../projectlaogai/fragments/MensaFragment.kt | 2 +- .../projectlaogai/fragments/MoodleFragment.kt | 2 +- .../fragments/SettingsFragment.kt | 2 +- .../fragments/TimeTableFragment.kt | 2 +- .../projectlaogai/hsoparser/DataTypes.kt | 2 +- .../projectlaogai/uicomponents/DayCardView.kt | 2 +- .../uicomponents/LessonLinearLayout.kt | 2 +- .../uicomponents/MealLinearLayout.kt | 2 +- .../res/layouts/activities/xml/shortcuts.xml | 28 ++++++++++++++++++ app/src/main/res/values-de-rDE/strings.xml | 14 +++++++-- app/src/main/res/values/strings.xml | 10 ++++++- 18 files changed, 76 insertions(+), 33 deletions(-) diff --git a/README.md b/README.md index d7da456..42ede7b 100644 --- a/README.md +++ b/README.md @@ -20,4 +20,4 @@ ProjectLaogai is a app to access the timetable and the mensa menu of Hochschule [](https://www.mosad.xyz/images/Project_Laogai/ProjectLaogai_Settings.png) [](https://www.mosad.xyz/images/Project_Laogai/ProjectLaogai_Mensa_dark.png) -ProjectLaogai © 2019 [@Seil0](https://git.mosad.xyz/Seil0), a [mosad](http://www.mosad.xyz) Project +ProjectLaogai © 2019-2020 [@Seil0](https://git.mosad.xyz/Seil0), a [mosad](http://www.mosad.xyz) Project diff --git a/app/src/main/java/org/mosad/seil0/projectlaogai/MainActivity.kt b/app/src/main/java/org/mosad/seil0/projectlaogai/MainActivity.kt index ae7cb6f..1093bf2 100644 --- a/app/src/main/java/org/mosad/seil0/projectlaogai/MainActivity.kt +++ b/app/src/main/java/org/mosad/seil0/projectlaogai/MainActivity.kt @@ -1,7 +1,7 @@ /** * ProjectLaogai * - * Copyright 2019 + * Copyright 2019-2020 * * 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 @@ -62,6 +62,8 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte private var useNFC = false override fun onCreate(savedInstanceState: Bundle?) { + val fragmentTransaction: FragmentTransaction = supportFragmentManager.beginTransaction() + Aesthetic.attach(this) super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) @@ -72,11 +74,6 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte initAesthetic() initForegroundDispatch() - //init home fragment - val fragmentTransaction: FragmentTransaction = supportFragmentManager.beginTransaction() - fragmentTransaction.replace(R.id.fragment_container, activeFragment) - fragmentTransaction.commit() - val toggle = ActionBarDrawerToggle( this, drawer_layout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close ) @@ -85,17 +82,17 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte nav_view.setNavigationItemSelectedListener(this) - // TODO use a switch expression - // if we get an NFC read intent while the app is closed call readBalance - if (NfcAdapter.ACTION_TECH_DISCOVERED == intent.action) - NFCMensaCard.readBalance(intent, this) - if ("org.mosad.seil0.projectlaogai.fragments.MensaFragment" == intent.action) { - println("starting mensa screen") - // TODO find a way to use only one FragmentTransaction - val fragmentTransaction2: FragmentTransaction = supportFragmentManager.beginTransaction() - fragmentTransaction2.replace(R.id.fragment_container, MensaFragment()) - fragmentTransaction2.commit() + // based on the inent we get, call readBalance or open a Fragment + when (intent.action) { + NfcAdapter.ACTION_TECH_DISCOVERED -> NFCMensaCard.readBalance(intent, this) + "org.mosad.seil0.projectlaogai.fragments.MensaFragment" -> activeFragment = MensaFragment() + "org.mosad.seil0.projectlaogai.fragments.TimeTableFragment" -> activeFragment = TimeTableFragment() + "org.mosad.seil0.projectlaogai.fragments.MoodleFragment" -> activeFragment = MoodleFragment() } + + // open the activeFragment, default is the HomeFragment + fragmentTransaction.replace(R.id.fragment_container, activeFragment) + fragmentTransaction.commit() } override fun onNewIntent(intent: Intent) { diff --git a/app/src/main/java/org/mosad/seil0/projectlaogai/controller/CacheController.kt b/app/src/main/java/org/mosad/seil0/projectlaogai/controller/CacheController.kt index c88c1a5..c3f291c 100644 --- a/app/src/main/java/org/mosad/seil0/projectlaogai/controller/CacheController.kt +++ b/app/src/main/java/org/mosad/seil0/projectlaogai/controller/CacheController.kt @@ -1,7 +1,7 @@ /** * ProjectLaogai * - * Copyright 2019 + * Copyright 2019-2020 * * 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 diff --git a/app/src/main/java/org/mosad/seil0/projectlaogai/controller/NFCMensaCard.kt b/app/src/main/java/org/mosad/seil0/projectlaogai/controller/NFCMensaCard.kt index e3fbb77..73935d9 100644 --- a/app/src/main/java/org/mosad/seil0/projectlaogai/controller/NFCMensaCard.kt +++ b/app/src/main/java/org/mosad/seil0/projectlaogai/controller/NFCMensaCard.kt @@ -1,7 +1,7 @@ /** * ProjectLaogai * - * Copyright 2019 + * Copyright 2019-2020 * * 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 diff --git a/app/src/main/java/org/mosad/seil0/projectlaogai/controller/PreferencesController.kt b/app/src/main/java/org/mosad/seil0/projectlaogai/controller/PreferencesController.kt index f3e0094..24c48ab 100644 --- a/app/src/main/java/org/mosad/seil0/projectlaogai/controller/PreferencesController.kt +++ b/app/src/main/java/org/mosad/seil0/projectlaogai/controller/PreferencesController.kt @@ -1,7 +1,7 @@ /** * ProjectLaogai * - * Copyright 2019 + * Copyright 2019-2020 * * 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 diff --git a/app/src/main/java/org/mosad/seil0/projectlaogai/controller/TCoRAPIController.kt b/app/src/main/java/org/mosad/seil0/projectlaogai/controller/TCoRAPIController.kt index 6f7c00d..5a41c5d 100644 --- a/app/src/main/java/org/mosad/seil0/projectlaogai/controller/TCoRAPIController.kt +++ b/app/src/main/java/org/mosad/seil0/projectlaogai/controller/TCoRAPIController.kt @@ -1,7 +1,7 @@ /** * ProjectLaogai * - * Copyright 2019 + * Copyright 2019-2020 * * 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 diff --git a/app/src/main/java/org/mosad/seil0/projectlaogai/fragments/HomeFragment.kt b/app/src/main/java/org/mosad/seil0/projectlaogai/fragments/HomeFragment.kt index 3973212..40f4b5a 100644 --- a/app/src/main/java/org/mosad/seil0/projectlaogai/fragments/HomeFragment.kt +++ b/app/src/main/java/org/mosad/seil0/projectlaogai/fragments/HomeFragment.kt @@ -1,7 +1,7 @@ /** * ProjectLaogai * - * Copyright 2019 + * Copyright 2019-2020 * * 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 diff --git a/app/src/main/java/org/mosad/seil0/projectlaogai/fragments/MensaFragment.kt b/app/src/main/java/org/mosad/seil0/projectlaogai/fragments/MensaFragment.kt index 771637e..25a9680 100644 --- a/app/src/main/java/org/mosad/seil0/projectlaogai/fragments/MensaFragment.kt +++ b/app/src/main/java/org/mosad/seil0/projectlaogai/fragments/MensaFragment.kt @@ -1,7 +1,7 @@ /** * ProjectLaogai * - * Copyright 2019 + * Copyright 2019-2020 * * 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 diff --git a/app/src/main/java/org/mosad/seil0/projectlaogai/fragments/MoodleFragment.kt b/app/src/main/java/org/mosad/seil0/projectlaogai/fragments/MoodleFragment.kt index 920c3a1..7cbde41 100644 --- a/app/src/main/java/org/mosad/seil0/projectlaogai/fragments/MoodleFragment.kt +++ b/app/src/main/java/org/mosad/seil0/projectlaogai/fragments/MoodleFragment.kt @@ -1,7 +1,7 @@ /** * ProjectLaogai * - * Copyright 2019 + * Copyright 2019-2020 * * 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 diff --git a/app/src/main/java/org/mosad/seil0/projectlaogai/fragments/SettingsFragment.kt b/app/src/main/java/org/mosad/seil0/projectlaogai/fragments/SettingsFragment.kt index c69d79f..96f160a 100644 --- a/app/src/main/java/org/mosad/seil0/projectlaogai/fragments/SettingsFragment.kt +++ b/app/src/main/java/org/mosad/seil0/projectlaogai/fragments/SettingsFragment.kt @@ -1,7 +1,7 @@ /** * ProjectLaogai * - * Copyright 2019 + * Copyright 2019-2020 * * 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 diff --git a/app/src/main/java/org/mosad/seil0/projectlaogai/fragments/TimeTableFragment.kt b/app/src/main/java/org/mosad/seil0/projectlaogai/fragments/TimeTableFragment.kt index d4a2dc5..be3d017 100644 --- a/app/src/main/java/org/mosad/seil0/projectlaogai/fragments/TimeTableFragment.kt +++ b/app/src/main/java/org/mosad/seil0/projectlaogai/fragments/TimeTableFragment.kt @@ -1,7 +1,7 @@ /** * ProjectLaogai * - * Copyright 2019 + * Copyright 2019-2020 * * 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 diff --git a/app/src/main/java/org/mosad/seil0/projectlaogai/hsoparser/DataTypes.kt b/app/src/main/java/org/mosad/seil0/projectlaogai/hsoparser/DataTypes.kt index f3936f3..f1c23f5 100644 --- a/app/src/main/java/org/mosad/seil0/projectlaogai/hsoparser/DataTypes.kt +++ b/app/src/main/java/org/mosad/seil0/projectlaogai/hsoparser/DataTypes.kt @@ -1,7 +1,7 @@ /** * ProjectLaogai * - * Copyright 2019 + * Copyright 2019-2020 * * 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 diff --git a/app/src/main/java/org/mosad/seil0/projectlaogai/uicomponents/DayCardView.kt b/app/src/main/java/org/mosad/seil0/projectlaogai/uicomponents/DayCardView.kt index b1e9a95..f1c23c8 100644 --- a/app/src/main/java/org/mosad/seil0/projectlaogai/uicomponents/DayCardView.kt +++ b/app/src/main/java/org/mosad/seil0/projectlaogai/uicomponents/DayCardView.kt @@ -1,7 +1,7 @@ /** * ProjectLaogai * - * Copyright 2019 + * Copyright 2019-2020 * * 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 diff --git a/app/src/main/java/org/mosad/seil0/projectlaogai/uicomponents/LessonLinearLayout.kt b/app/src/main/java/org/mosad/seil0/projectlaogai/uicomponents/LessonLinearLayout.kt index dd47460..fbb92ba 100644 --- a/app/src/main/java/org/mosad/seil0/projectlaogai/uicomponents/LessonLinearLayout.kt +++ b/app/src/main/java/org/mosad/seil0/projectlaogai/uicomponents/LessonLinearLayout.kt @@ -1,7 +1,7 @@ /** * ProjectLaogai * - * Copyright 2019 + * Copyright 2019-2020 * * 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 diff --git a/app/src/main/java/org/mosad/seil0/projectlaogai/uicomponents/MealLinearLayout.kt b/app/src/main/java/org/mosad/seil0/projectlaogai/uicomponents/MealLinearLayout.kt index 233b9fe..3fea220 100644 --- a/app/src/main/java/org/mosad/seil0/projectlaogai/uicomponents/MealLinearLayout.kt +++ b/app/src/main/java/org/mosad/seil0/projectlaogai/uicomponents/MealLinearLayout.kt @@ -1,7 +1,7 @@ /** * ProjectLaogai * - * Copyright 2019 + * Copyright 2019-2020 * * 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 diff --git a/app/src/main/res/layouts/activities/xml/shortcuts.xml b/app/src/main/res/layouts/activities/xml/shortcuts.xml index beb28c2..93efa2c 100644 --- a/app/src/main/res/layouts/activities/xml/shortcuts.xml +++ b/app/src/main/res/layouts/activities/xml/shortcuts.xml @@ -12,4 +12,32 @@ android:targetClass="org.mosad.seil0.projectlaogai.MainActivity" /> + + + + + + + + + + diff --git a/app/src/main/res/values-de-rDE/strings.xml b/app/src/main/res/values-de-rDE/strings.xml index 692dc9b..0abcc1d 100644 --- a/app/src/main/res/values-de-rDE/strings.xml +++ b/app/src/main/res/values-de-rDE/strings.xml @@ -46,8 +46,18 @@ Fehler Stundenplan konnte nicht geladen werden! - Mensa deaktiviert - Mensa + + Mensa + Mensa + Mensa deaktiviert + + Stundenplan + Stundenplan + Stundenplan deaktiviert + + Moodle + Moodle + Moodle deaktiviert diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6261791..25f25ef 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -25,7 +25,7 @@ User Tap to change course About - "This software is made by @Seil0 and is published under the terms and conditions of GPL 3. For further information visit \ngit.mosad.xyz/Seil0/ProjectLaogai \n\n© 2018-2019 seil0@mosad.xyz " + "This software is made by @Seil0 and is published under the terms and conditions of GPL 3. For further information visit \ngit.mosad.xyz/Seil0/ProjectLaogai \n\n© 2018-2020 seil0@mosad.xyz " hso App by @Seil0 Version %1$s (%2$s) Licenses @@ -64,6 +64,14 @@ Mensa Mensa disabled + Timetable + Timetable + Timetable disabled + + Moodle + Moodle + Moodle disabled + org.mosad.seil0.projectlaogai_preferences org.mosad.seil0.projectlaogai.course From 9d2de3fcb3d3fb6e3adfc646402bb5e92f32df96 Mon Sep 17 00:00:00 2001 From: Seil0 Date: Wed, 15 Jan 2020 15:08:05 +0100 Subject: [PATCH 08/11] don't use deprecated Gson methods --- .../mosad/seil0/projectlaogai/controller/CacheController.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/mosad/seil0/projectlaogai/controller/CacheController.kt b/app/src/main/java/org/mosad/seil0/projectlaogai/controller/CacheController.kt index c3f291c..7367a4b 100644 --- a/app/src/main/java/org/mosad/seil0/projectlaogai/controller/CacheController.kt +++ b/app/src/main/java/org/mosad/seil0/projectlaogai/controller/CacheController.kt @@ -103,7 +103,7 @@ class CacheController(cont: Context) { val fileReader = FileReader(file) val bufferedReader = BufferedReader(fileReader) - val coursesObject = JsonParser().parse(bufferedReader.readLine()).asJsonObject + val coursesObject = JsonParser.parseString(bufferedReader.readLine()).asJsonObject coursesList = Gson().fromJson(coursesObject.getAsJsonArray("courses"), object : TypeToken>() {}.type) } @@ -122,7 +122,7 @@ class CacheController(cont: Context) { val fileReader = FileReader(file) val bufferedReader = BufferedReader(fileReader) - val mensaObject = JsonParser().parse(bufferedReader.readLine()).asJsonObject + val mensaObject = JsonParser.parseString(bufferedReader.readLine()).asJsonObject mensaMenu = GsonBuilder().create().fromJson(mensaObject, MensaMenu().javaClass) } @@ -141,7 +141,7 @@ class CacheController(cont: Context) { val fileReader = FileReader(file) val bufferedReader = BufferedReader(fileReader) - val timetableObject = JsonParser().parse(bufferedReader.readLine()).asJsonObject + val timetableObject = JsonParser.parseString(bufferedReader.readLine()).asJsonObject // make sure you add the single weeks in the exact order! if (timetables.size > week) { From 2d497d1a9605a60cc470d371187be0f49690c3bb Mon Sep 17 00:00:00 2001 From: Seil0 Date: Wed, 15 Jan 2020 15:28:07 +0100 Subject: [PATCH 09/11] update gradle wrapper to version 6.0.1 --- .../main/java/org/mosad/seil0/projectlaogai/MainActivity.kt | 5 ++++- .../seil0/projectlaogai/controller/TCoRAPIController.kt | 4 ---- gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 4 ++-- 4 files changed, 7 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/org/mosad/seil0/projectlaogai/MainActivity.kt b/app/src/main/java/org/mosad/seil0/projectlaogai/MainActivity.kt index 1093bf2..af33d57 100644 --- a/app/src/main/java/org/mosad/seil0/projectlaogai/MainActivity.kt +++ b/app/src/main/java/org/mosad/seil0/projectlaogai/MainActivity.kt @@ -50,7 +50,10 @@ import org.mosad.seil0.projectlaogai.controller.PreferencesController.Companion. import org.mosad.seil0.projectlaogai.fragments.* import kotlin.system.measureTimeMillis -// TODO save the current fragment to show it when the app is restarted +/** + * TODO save the current fragment to show it when the app is restarted + * TODO since anko is dead, we should use coroutines + */ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener { private var activeFragment: Fragment = HomeFragment() // the currently active fragment, home at the start diff --git a/app/src/main/java/org/mosad/seil0/projectlaogai/controller/TCoRAPIController.kt b/app/src/main/java/org/mosad/seil0/projectlaogai/controller/TCoRAPIController.kt index 5a41c5d..250ee49 100644 --- a/app/src/main/java/org/mosad/seil0/projectlaogai/controller/TCoRAPIController.kt +++ b/app/src/main/java/org/mosad/seil0/projectlaogai/controller/TCoRAPIController.kt @@ -37,10 +37,6 @@ import kotlin.Exception class TCoRAPIController { - /** - * TODO since anko seems dead, we should use coroutines here - */ - companion object { private const val className = "TCoRAPIController" private const val tcorBaseURL = "https://tcor.mosad.xyz" diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 7c4388a..9492014 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.0.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 8e25e6c..83f2acf 100755 --- a/gradlew +++ b/gradlew @@ -125,8 +125,8 @@ if $darwin; then GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" fi -# For Cygwin, switch paths to Windows format before running java -if $cygwin ; then +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then APP_HOME=`cygpath --path --mixed "$APP_HOME"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` JAVACMD=`cygpath --unix "$JAVACMD"` From 2cb4b7236901d79ef32ee143631d7b5ffedee17a Mon Sep 17 00:00:00 2001 From: Seil0 Date: Tue, 4 Feb 2020 19:58:07 +0100 Subject: [PATCH 10/11] anko code removed, coroutines are now used for asynchronous functions * constraintlayout 2.0.0-beta3 -> 2.0.0-beta4 * material-components-android 1.0.0 -> 1.1.0 * this is the first release candidate for version 0.5.1 --- app/build.gradle | 12 ++--- .../mosad/seil0/projectlaogai/MainActivity.kt | 1 - .../controller/CacheController.kt | 47 ++++++++++++------- .../controller/TCoRAPIController.kt | 34 ++++++++------ .../projectlaogai/fragments/HomeFragment.kt | 25 +++++----- .../projectlaogai/fragments/MensaFragment.kt | 34 ++++++++------ .../fragments/SettingsFragment.kt | 15 +++--- .../fragments/TimeTableFragment.kt | 28 ++++++----- app/src/main/res/raw/notices.xml | 4 +- .../metadata/android/en-US/changelogs/15.txt | 5 ++ 10 files changed, 118 insertions(+), 87 deletions(-) create mode 100644 fastlane/metadata/android/en-US/changelogs/15.txt diff --git a/app/build.gradle b/app/build.gradle index 5d88468..666963f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,7 +1,5 @@ apply plugin: 'com.android.application' - apply plugin: 'kotlin-android' - apply plugin: 'kotlin-android-extensions' android { @@ -12,8 +10,8 @@ android { applicationId "org.mosad.seil0.projectlaogai" minSdkVersion 23 targetSdkVersion 29 - versionCode 14 - versionName "0.5.0" + versionCode 15 + versionName "0.5.190" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" resValue "string", "build_time", buildTime() setProperty("archivesBaseName", "projectlaogai-$versionName") @@ -49,12 +47,12 @@ android { dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" - implementation 'org.jetbrains.anko:anko-commons:0.10.8' + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.3' implementation 'androidx.appcompat:appcompat:1.1.0' implementation 'androidx.legacy:legacy-support-v4:1.0.0' - implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta3' + implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta4' implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.0.0' - implementation 'com.google.android.material:material:1.0.0' + implementation 'com.google.android.material:material:1.1.0' implementation 'com.google.code.gson:gson:2.8.6' implementation 'com.afollestad:aesthetic:1.0.0-beta05' implementation 'com.afollestad.material-dialogs:core:3.1.1' diff --git a/app/src/main/java/org/mosad/seil0/projectlaogai/MainActivity.kt b/app/src/main/java/org/mosad/seil0/projectlaogai/MainActivity.kt index af33d57..c8a3b83 100644 --- a/app/src/main/java/org/mosad/seil0/projectlaogai/MainActivity.kt +++ b/app/src/main/java/org/mosad/seil0/projectlaogai/MainActivity.kt @@ -52,7 +52,6 @@ import kotlin.system.measureTimeMillis /** * TODO save the current fragment to show it when the app is restarted - * TODO since anko is dead, we should use coroutines */ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener { diff --git a/app/src/main/java/org/mosad/seil0/projectlaogai/controller/CacheController.kt b/app/src/main/java/org/mosad/seil0/projectlaogai/controller/CacheController.kt index 7367a4b..3c97140 100644 --- a/app/src/main/java/org/mosad/seil0/projectlaogai/controller/CacheController.kt +++ b/app/src/main/java/org/mosad/seil0/projectlaogai/controller/CacheController.kt @@ -27,6 +27,10 @@ import com.google.gson.Gson import com.google.gson.GsonBuilder import com.google.gson.JsonParser import com.google.gson.reflect.TypeToken +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.joinAll +import kotlinx.coroutines.launch import org.mosad.seil0.projectlaogai.controller.PreferencesController.Companion.cCourse import org.mosad.seil0.projectlaogai.hsoparser.Course import org.mosad.seil0.projectlaogai.hsoparser.MensaMenu @@ -53,7 +57,7 @@ class CacheController(cont: Context) { // if a) it's monday and the last cache update was on sunday or b) the cache is older than 24hr, update blocking if ((currentDay == Calendar.MONDAY && cal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) || (currentTime - mensaMenu.meta.updateTime) > 86400) { println("update mensa blocking") - TCoRAPIController.getMensa(context).get() + GlobalScope.launch(Dispatchers.Default) { TCoRAPIController.getMensa(context).join() } } // check if we need to update the timetables before displaying them @@ -61,23 +65,29 @@ class CacheController(cont: Context) { cal.time = Date(timetables[0].meta.updateTime * 1000) // if a) it`s monday and the last cache update was not on a sunday or b) the cache is older than 24hr, update blocking - if((currentDay == Calendar.MONDAY && cal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) || (currentTime - timetables[0].meta.updateTime) > 86400) { + if ((currentDay == Calendar.MONDAY && cal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) || (currentTime - timetables[0].meta.updateTime) > 86400) { println("updating timetable after sunday!") - val jobA = TCoRAPIController.getTimetable(cCourse.courseName, 0, context) - val jobB = TCoRAPIController.getTimetable(cCourse.courseName, 1, context) - jobA.get() - jobB.get() + GlobalScope.launch(Dispatchers.Default) { + val threads = listOf( + TCoRAPIController.getTimetable(cCourse.courseName, 0, context), + TCoRAPIController.getTimetable(cCourse.courseName, 1, context) + ) + threads.joinAll() + } + + TCoRAPIController.getTimetable(cCourse.courseName, 0, context) + TCoRAPIController.getTimetable(cCourse.courseName, 1, context) } // check if an update is necessary, not blocking - if(currentTime - PreferencesController.coursesCacheTime > 86400) + if (currentTime - PreferencesController.coursesCacheTime > 86400) TCoRAPIController.getCoursesList(context) - if(currentTime - PreferencesController.mensaCacheTime > 10800) + if (currentTime - PreferencesController.mensaCacheTime > 10800) TCoRAPIController.getMensa(context) - if(currentTime - PreferencesController.timetableCacheTime > 10800) { + if (currentTime - PreferencesController.timetableCacheTime > 10800) { TCoRAPIController.getTimetable(cCourse.courseName, 0, context) TCoRAPIController.getTimetable(cCourse.courseName, 1, context) } @@ -99,13 +109,16 @@ class CacheController(cont: Context) { // make sure the file exists if (!file.exists()) - TCoRAPIController.getCoursesList(context).get() + GlobalScope.launch(Dispatchers.Default) { TCoRAPIController.getCoursesList(context).join() } val fileReader = FileReader(file) val bufferedReader = BufferedReader(fileReader) val coursesObject = JsonParser.parseString(bufferedReader.readLine()).asJsonObject - coursesList = Gson().fromJson(coursesObject.getAsJsonArray("courses"), object : TypeToken>() {}.type) + coursesList = Gson().fromJson( + coursesObject.getAsJsonArray("courses"), + object : TypeToken>() {}.type + ) } /** @@ -116,9 +129,8 @@ class CacheController(cont: Context) { val file = File(context.filesDir, "mensa.json") // make sure the file exists - if (!file.exists()) { - TCoRAPIController.getMensa(context).get() - } + if (!file.exists()) + GlobalScope.launch(Dispatchers.Default) { TCoRAPIController.getMensa(context).join() } val fileReader = FileReader(file) val bufferedReader = BufferedReader(fileReader) @@ -136,8 +148,11 @@ class CacheController(cont: Context) { val file = File(context.filesDir, "timetable-$courseName-$week.json") // make sure the file exists - if (!file.exists()) - TCoRAPIController.getTimetable(courseName, week, context).get() + if (!file.exists()) { + GlobalScope.launch(Dispatchers.Default) { + TCoRAPIController.getTimetable(courseName, week, context).join() + } + } val fileReader = FileReader(file) val bufferedReader = BufferedReader(fileReader) diff --git a/app/src/main/java/org/mosad/seil0/projectlaogai/controller/TCoRAPIController.kt b/app/src/main/java/org/mosad/seil0/projectlaogai/controller/TCoRAPIController.kt index 250ee49..9d90148 100644 --- a/app/src/main/java/org/mosad/seil0/projectlaogai/controller/TCoRAPIController.kt +++ b/app/src/main/java/org/mosad/seil0/projectlaogai/controller/TCoRAPIController.kt @@ -24,7 +24,7 @@ package org.mosad.seil0.projectlaogai.controller import android.content.Context import android.util.Log -import org.jetbrains.anko.doAsync +import kotlinx.coroutines.* import org.json.JSONObject import org.mosad.seil0.projectlaogai.controller.PreferencesController.Companion.coursesCacheTime import org.mosad.seil0.projectlaogai.controller.PreferencesController.Companion.mensaCacheTime @@ -44,7 +44,7 @@ class TCoRAPIController { /** * get the json object from tcor api and write it as file (cache) */ - fun getCoursesList(context: Context) = doAsync { + fun getCoursesList(context: Context) = GlobalScope.launch { try { val url = URL("$tcorBaseURL/courseList") val file = File(context.filesDir, "courses.json") @@ -53,9 +53,11 @@ class TCoRAPIController { val coursesObject = JSONObject(url.readText()) //JSONObject(inReader.readLine()) // write the json object to a file - val writer = BufferedWriter(FileWriter(file)) - writer.write(coursesObject.toString()) - writer.close() + withContext(Dispatchers.IO) { + val writer = BufferedWriter(FileWriter(file)) + writer.write(coursesObject.toString()) + writer.close() + } // update cache time coursesCacheTime = System.currentTimeMillis() / 1000 @@ -69,7 +71,7 @@ class TCoRAPIController { /** * get the json object from tcor api and write it as file (cache) */ - fun getMensa(context: Context) = doAsync { + fun getMensa(context: Context) = GlobalScope.launch { try { val url = URL("$tcorBaseURL/mensamenu") val file = File(context.filesDir, "mensa.json") @@ -78,9 +80,11 @@ class TCoRAPIController { val mensaObject = JSONObject(url.readText()) //JSONObject(inReader.readLine()) // write the json object to a file - val writer = BufferedWriter(FileWriter(file)) - writer.write(mensaObject.toString()) - writer.close() + withContext(Dispatchers.IO) { + val writer = BufferedWriter(FileWriter(file)) + writer.write(mensaObject.toString()) + writer.close() + } // update cache time mensaCacheTime = System.currentTimeMillis() / 1000 @@ -94,18 +98,20 @@ class TCoRAPIController { /** * get the json object from tcor api and write it as file (cache) */ - fun getTimetable(courseName: String, week: Int, context: Context) = doAsync { + fun getTimetable(courseName: String, week: Int, context: Context) = GlobalScope.launch { try { val url = URL("$tcorBaseURL/timetable?courseName=$courseName&week=$week") val file = File(context.filesDir, "timetable-$courseName-$week.json") // read data from the API - val mensaObject = JSONObject(url.readText()) //JSONObject(inReader.readLine()) + val timetableObject = JSONObject(url.readText()) //JSONObject(inReader.readLine()) // write the json object to a file - val writer = BufferedWriter(FileWriter(file)) - writer.write(mensaObject.toString()) - writer.close() + withContext(Dispatchers.IO) { + val writer = BufferedWriter(FileWriter(file)) + writer.write(timetableObject.toString()) + writer.close() + } // update cache time timetableCacheTime = System.currentTimeMillis() / 1000 diff --git a/app/src/main/java/org/mosad/seil0/projectlaogai/fragments/HomeFragment.kt b/app/src/main/java/org/mosad/seil0/projectlaogai/fragments/HomeFragment.kt index 40f4b5a..e58b8de 100644 --- a/app/src/main/java/org/mosad/seil0/projectlaogai/fragments/HomeFragment.kt +++ b/app/src/main/java/org/mosad/seil0/projectlaogai/fragments/HomeFragment.kt @@ -31,8 +31,10 @@ import android.view.ViewGroup import android.widget.TextView import androidx.fragment.app.Fragment import kotlinx.android.synthetic.main.fragment_home.* -import org.jetbrains.anko.doAsync -import org.jetbrains.anko.uiThread +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import org.mosad.seil0.projectlaogai.R import org.mosad.seil0.projectlaogai.controller.CacheController.Companion.mensaMenu import org.mosad.seil0.projectlaogai.controller.CacheController.Companion.timetables @@ -54,11 +56,10 @@ class HomeFragment : Fragment() { private val formatter = SimpleDateFormat("E dd.MM", Locale.getDefault()) override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - val view: View = inflater.inflate(R.layout.fragment_home, container, false) - addMensaMenu().get() - addTimeTable().get() + addMensaMenu() + addTimeTable() // Inflate the layout for this fragment return view @@ -67,13 +68,13 @@ class HomeFragment : Fragment() { /** * add the current mensa meal to the home screens */ - private fun addMensaMenu() = doAsync { + private fun addMensaMenu() = GlobalScope.launch(Dispatchers.Default) { var dayMeals: ArrayList val cal = Calendar.getInstance() val mensaCardView = DayCardView(context!!) - uiThread { + withContext(Dispatchers.Main) { if (isAdded) { if (cal.get(Calendar.HOUR_OF_DAY) < 15) { @@ -117,9 +118,9 @@ class HomeFragment : Fragment() { /** * add the current timetable to the home screen */ - private fun addTimeTable() = doAsync { + private fun addTimeTable() = GlobalScope.launch(Dispatchers.Default) { - uiThread { + withContext(Dispatchers.Main) { if (isAdded && timetables.isNotEmpty()) { try { @@ -140,7 +141,7 @@ class HomeFragment : Fragment() { * @param startDayIndex the day index you want to start searching * @return a DayCardView with all lessons added */ - private fun findNextDay(startDayIndex: Int) : DayCardView { + private fun findNextDay(startDayIndex: Int): DayCardView { val dayCardView = DayCardView(context!!) var dayTimetable: TimetableDay? = null var dayIndexSearch = startDayIndex @@ -151,7 +152,7 @@ class HomeFragment : Fragment() { dayTimetable = timetables[weekIndexSearch].timetable.days[dayIndex] // some wired calendar magic, calculate the correct date to be shown ((timetable week - current week * 7) + (dayIndex - dayIndex of current week) - val daysToAdd =(timetables[weekIndexSearch].meta.weekNumberYear - NotRetardedCalendar.getWeekOfYear()) * 7 + (dayIndex - NotRetardedCalendar.getDayOfWeekIndex()) + val daysToAdd = (timetables[weekIndexSearch].meta.weekNumberYear - NotRetardedCalendar.getWeekOfYear()) * 7 + (dayIndex - NotRetardedCalendar.getDayOfWeekIndex()) dayCardView.addTimetableDay(dayTimetable, daysToAdd) // if there are no lessons don't show the dayCardView @@ -179,7 +180,7 @@ class HomeFragment : Fragment() { noLesson.textSize = 18.0F noLesson.setTypeface(null, Typeface.BOLD) noLesson.textAlignment = View.TEXT_ALIGNMENT_CENTER - noLesson.setPadding(7,7,7,7) + noLesson.setPadding(7, 7, 7, 7) return noLesson } diff --git a/app/src/main/java/org/mosad/seil0/projectlaogai/fragments/MensaFragment.kt b/app/src/main/java/org/mosad/seil0/projectlaogai/fragments/MensaFragment.kt index 25a9680..7bbc9d9 100644 --- a/app/src/main/java/org/mosad/seil0/projectlaogai/fragments/MensaFragment.kt +++ b/app/src/main/java/org/mosad/seil0/projectlaogai/fragments/MensaFragment.kt @@ -28,8 +28,10 @@ import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment import kotlinx.android.synthetic.main.fragment_mensa.* -import org.jetbrains.anko.doAsync -import org.jetbrains.anko.uiThread +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import org.mosad.seil0.projectlaogai.R import org.mosad.seil0.projectlaogai.controller.CacheController import org.mosad.seil0.projectlaogai.controller.CacheController.Companion.mensaMenu @@ -53,12 +55,14 @@ class MensaFragment : Fragment() { // init actions refreshAction() - // add the current week (week starts on sunday) - val dayCurrent = if(NotRetardedCalendar.getDayOfWeekIndex() == 6) 0 else NotRetardedCalendar.getDayOfWeekIndex() - addWeek(mensaMenu.currentWeek, dayCurrent).get() + GlobalScope.launch(Dispatchers.Default) { + val dayCurrent = if(NotRetardedCalendar.getDayOfWeekIndex() == 6) 0 else NotRetardedCalendar.getDayOfWeekIndex() + addWeek(mensaMenu.currentWeek, dayCurrent).join() + + // add the next week + addWeek(mensaMenu.nextWeek, 0) + } - // add the next week - addWeek(mensaMenu.nextWeek, 0) // TODO should we show a info if there is no more food this & next week? @@ -70,9 +74,9 @@ class MensaFragment : Fragment() { * @param menusWeek menu of type MensaWeek you want to add * @param dayStart the first day of the week to add */ - private fun addWeek(menusWeek: MensaWeek, dayStart: Int) = doAsync { + private fun addWeek(menusWeek: MensaWeek, dayStart: Int) = GlobalScope.launch(Dispatchers.Default) { - uiThread { + withContext(Dispatchers.Main) { // only add the days dayStart to Fri since the mensa is closed on Sat/Sun for (dayIndex in dayStart..4) { @@ -105,8 +109,8 @@ class MensaFragment : Fragment() { /** * initialize the refresh action */ - private fun refreshAction() = doAsync { - uiThread { + private fun refreshAction() = GlobalScope.launch(Dispatchers.Default) { + withContext(Dispatchers.Main) { // set the refresh listener refreshLayout_Mensa.setOnRefreshListener { updateMensaScreen() @@ -118,18 +122,18 @@ class MensaFragment : Fragment() { /** * refresh the mensa cache and update the mensa screen */ - private fun updateMensaScreen() = doAsync { + private fun updateMensaScreen() = GlobalScope.launch(Dispatchers.Default) { // update the cache - TCoRAPIController.getMensa(context!!).get() // blocking since we want the new data + TCoRAPIController.getMensa(context!!).join() // blocking since we want the new data CacheController.readMensa(context!!) - uiThread { + withContext(Dispatchers.Main) { // remove all menus from the layout linLayout_Mensa.removeAllViews() // add the refreshed menus val dayCurrent = if (NotRetardedCalendar.getDayOfWeekIndex() == 6) 0 else NotRetardedCalendar.getDayOfWeekIndex() - addWeek(mensaMenu.currentWeek, dayCurrent).get() + addWeek(mensaMenu.currentWeek, dayCurrent).join() // add the next week addWeek(mensaMenu.nextWeek, 0) diff --git a/app/src/main/java/org/mosad/seil0/projectlaogai/fragments/SettingsFragment.kt b/app/src/main/java/org/mosad/seil0/projectlaogai/fragments/SettingsFragment.kt index 96f160a..059f5e9 100644 --- a/app/src/main/java/org/mosad/seil0/projectlaogai/fragments/SettingsFragment.kt +++ b/app/src/main/java/org/mosad/seil0/projectlaogai/fragments/SettingsFragment.kt @@ -39,8 +39,7 @@ import com.afollestad.materialdialogs.list.listItems import com.afollestad.materialdialogs.list.listItemsSingleChoice import de.psdev.licensesdialog.LicensesDialog import kotlinx.android.synthetic.main.fragment_settings.* -import org.jetbrains.anko.doAsync -import org.jetbrains.anko.uiThread +import kotlinx.coroutines.* import org.mosad.seil0.projectlaogai.BuildConfig import org.mosad.seil0.projectlaogai.R import org.mosad.seil0.projectlaogai.controller.CacheController @@ -54,7 +53,6 @@ import org.mosad.seil0.projectlaogai.controller.TCoRAPIController import org.mosad.seil0.projectlaogai.hsoparser.DataTypes import java.util.* - /** * The settings controller class * contains all needed parts to display and the settings screen @@ -245,17 +243,20 @@ class SettingsFragment : Fragment() { .customView(R.layout.dialog_loading) dialog.show() - doAsync { + GlobalScope.launch(Dispatchers.Default) { PreferencesController.saveCourse(context, coursesList[index]) // save the course // update current & next weeks timetable - TCoRAPIController.getTimetable(cCourse.courseName, 0, context).get() // blocking since we want the new data - TCoRAPIController.getTimetable(cCourse.courseName, 1, context).get() // blocking since we want the new data + val threads = listOf( + TCoRAPIController.getTimetable(cCourse.courseName, 0, context), + TCoRAPIController.getTimetable(cCourse.courseName, 1, context) + ) + threads.joinAll() // blocking since we want the new data CacheController.readTimetable(cCourse.courseName, 0, context) CacheController.readTimetable(cCourse.courseName, 1, context) - uiThread { + withContext(Dispatchers.Main) { dialog.dismiss() txtView_Course.text = cCourse.courseName // update txtView } diff --git a/app/src/main/java/org/mosad/seil0/projectlaogai/fragments/TimeTableFragment.kt b/app/src/main/java/org/mosad/seil0/projectlaogai/fragments/TimeTableFragment.kt index be3d017..fc1fb75 100644 --- a/app/src/main/java/org/mosad/seil0/projectlaogai/fragments/TimeTableFragment.kt +++ b/app/src/main/java/org/mosad/seil0/projectlaogai/fragments/TimeTableFragment.kt @@ -31,8 +31,7 @@ import androidx.fragment.app.Fragment import com.afollestad.materialdialogs.MaterialDialog import com.google.android.material.floatingactionbutton.FloatingActionButton import kotlinx.android.synthetic.main.fragment_timetable.* -import org.jetbrains.anko.doAsync -import org.jetbrains.anko.uiThread +import kotlinx.coroutines.* import org.mosad.seil0.projectlaogai.R import org.mosad.seil0.projectlaogai.controller.CacheController import org.mosad.seil0.projectlaogai.controller.CacheController.Companion.timetables @@ -74,9 +73,9 @@ class TimeTableFragment : Fragment() { /** * initialize the actions */ - private fun initActions() = doAsync { + private fun initActions() = GlobalScope.launch(Dispatchers.Default) { - uiThread { + withContext(Dispatchers.Main) { refreshLayout_Timetable.setOnRefreshListener { updateTimetableScreen() } @@ -104,18 +103,18 @@ class TimeTableFragment : Fragment() { /** * add the current and next weeks lessons */ - private fun addInitWeeks() = doAsync { + private fun addInitWeeks() = GlobalScope.launch(Dispatchers.Default) { val currentDayIndex = NotRetardedCalendar.getDayOfWeekIndex() - addWeek(currentDayIndex, 5, 0).get() // add current week + addWeek(currentDayIndex, 5, 0).join() // add current week addWeek(0, currentDayIndex - 1, 1) // add next week } - private fun addWeek(startDayIndex: Int, dayEndIndex: Int, weekIndex: Int) = doAsync { + private fun addWeek(startDayIndex: Int, dayEndIndex: Int, weekIndex: Int) = GlobalScope.launch(Dispatchers.Default) { val timetable = timetables[weekIndex].timetable val timetableMeta = timetables[weekIndex].meta - uiThread { + withContext(Dispatchers.Main) { for (dayIndex in startDayIndex..dayEndIndex) { val dayCardView = DayCardView(context!!) @@ -132,15 +131,18 @@ class TimeTableFragment : Fragment() { } } - private fun updateTimetableScreen() = doAsync { + private fun updateTimetableScreen() = GlobalScope.launch(Dispatchers.Default) { // update the cache - TCoRAPIController.getTimetable(cCourse.courseName, 0, context!!).get() // blocking since we want the new data - TCoRAPIController.getTimetable(cCourse.courseName, 1, context!!).get() // blocking since we want the new data + val threads = listOf( + TCoRAPIController.getTimetable(cCourse.courseName, 0, context!!), + TCoRAPIController.getTimetable(cCourse.courseName, 1, context!!) + ) + threads.joinAll() // blocking since we want the new data CacheController.readTimetable(cCourse.courseName, 0, context!!) CacheController.readTimetable(cCourse.courseName, 1, context!!) - uiThread { + withContext(Dispatchers.Main) { // remove all menus from the layout linLayout_Timetable.removeAllViews() @@ -148,7 +150,7 @@ class TimeTableFragment : Fragment() { val dayIndex = NotRetardedCalendar.getDayOfWeekIndex() // add current week - addWeek(dayIndex, 5, 0).get() + addWeek(dayIndex, 5, 0).join() // add next week addWeek(0, dayIndex - 1, 1) diff --git a/app/src/main/res/raw/notices.xml b/app/src/main/res/raw/notices.xml index 99c8b86..e05c044 100644 --- a/app/src/main/res/raw/notices.xml +++ b/app/src/main/res/raw/notices.xml @@ -19,8 +19,8 @@ Apache Software License 2.0 - anko - https://github.com/Kotlin/anko + kotlinx.coroutines + https://github.com/Kotlin/kotlinx.coroutines Copyright JetBrains Apache Software License 2.0 diff --git a/fastlane/metadata/android/en-US/changelogs/15.txt b/fastlane/metadata/android/en-US/changelogs/15.txt new file mode 100644 index 0000000..375d883 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/15.txt @@ -0,0 +1,5 @@ +This release 0.5.1 is called "artistical Apollon". + +* new: it's now possible to use App shortcuts for the timetable, mensa and moodle screen +* change: updated some libs, updated kotlin to 1.3.61 +* change: the app was updated to use kotlin coroutines instead of anko for asynchronous work loads From b186a2e96e1d1381cd66a81a65a1c5d2b696af94 Mon Sep 17 00:00:00 2001 From: Seil0 Date: Wed, 5 Feb 2020 14:10:45 +0100 Subject: [PATCH 11/11] release version 0.5.1 --- app/build.gradle | 2 +- .../org/mosad/seil0/projectlaogai/MainActivity.kt | 4 +++- .../seil0/projectlaogai/controller/CacheController.kt | 8 +++++--- .../seil0/projectlaogai/controller/NFCMensaCard.kt | 2 +- .../projectlaogai/fragments/TimeTableFragment.kt | 2 +- app/src/main/res/values-de-rDE/strings.xml | 11 +++++++---- app/src/main/res/values/strings.xml | 7 +++++-- fastlane/metadata/android/en-US/changelogs/15.txt | 2 +- 8 files changed, 24 insertions(+), 14 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 666963f..a634a62 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -11,7 +11,7 @@ android { minSdkVersion 23 targetSdkVersion 29 versionCode 15 - versionName "0.5.190" + versionName "0.5.1" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" resValue "string", "build_time", buildTime() setProperty("archivesBaseName", "projectlaogai-$versionName") diff --git a/app/src/main/java/org/mosad/seil0/projectlaogai/MainActivity.kt b/app/src/main/java/org/mosad/seil0/projectlaogai/MainActivity.kt index c8a3b83..b4398ab 100644 --- a/app/src/main/java/org/mosad/seil0/projectlaogai/MainActivity.kt +++ b/app/src/main/java/org/mosad/seil0/projectlaogai/MainActivity.kt @@ -30,6 +30,7 @@ import android.nfc.NfcAdapter import android.nfc.NfcManager import android.nfc.tech.NfcA import android.os.Bundle +import android.util.Log import android.view.Menu import android.view.MenuItem import androidx.appcompat.app.ActionBarDrawerToggle @@ -56,6 +57,7 @@ import kotlin.system.measureTimeMillis class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener { private var activeFragment: Fragment = HomeFragment() // the currently active fragment, home at the start + private val className = "MainActivity" private lateinit var adapter: NfcAdapter private lateinit var pendingIntent: PendingIntent @@ -173,7 +175,7 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte PreferencesController.load(this) // load the settings, must be finished before doing anything else CacheController(this) // load the cache } - println("startup completed in $startupTime ms") + Log.i(className, "startup completed in $startupTime ms") } private fun initAesthetic() { diff --git a/app/src/main/java/org/mosad/seil0/projectlaogai/controller/CacheController.kt b/app/src/main/java/org/mosad/seil0/projectlaogai/controller/CacheController.kt index 3c97140..ad9b047 100644 --- a/app/src/main/java/org/mosad/seil0/projectlaogai/controller/CacheController.kt +++ b/app/src/main/java/org/mosad/seil0/projectlaogai/controller/CacheController.kt @@ -23,6 +23,7 @@ package org.mosad.seil0.projectlaogai.controller import android.content.Context +import android.util.Log import com.google.gson.Gson import com.google.gson.GsonBuilder import com.google.gson.JsonParser @@ -43,6 +44,7 @@ import kotlin.collections.ArrayList class CacheController(cont: Context) { + private val className = "CacheController" private val context = cont init { @@ -56,7 +58,7 @@ class CacheController(cont: Context) { // if a) it's monday and the last cache update was on sunday or b) the cache is older than 24hr, update blocking if ((currentDay == Calendar.MONDAY && cal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) || (currentTime - mensaMenu.meta.updateTime) > 86400) { - println("update mensa blocking") + Log.i(className, "update mensa blocking") GlobalScope.launch(Dispatchers.Default) { TCoRAPIController.getMensa(context).join() } } @@ -66,7 +68,7 @@ class CacheController(cont: Context) { // if a) it`s monday and the last cache update was not on a sunday or b) the cache is older than 24hr, update blocking if ((currentDay == Calendar.MONDAY && cal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) || (currentTime - timetables[0].meta.updateTime) > 86400) { - println("updating timetable after sunday!") + Log.i(className, "updating timetable after sunday!") GlobalScope.launch(Dispatchers.Default) { val threads = listOf( @@ -171,7 +173,7 @@ class CacheController(cont: Context) { * read coursesList, mensa (current and next week), timetable (current and next week) * @param courseName the course name (e.g AI1) */ - fun readStartCache(courseName: String) { + private fun readStartCache(courseName: String) { readCoursesList(context) readMensa(context) readTimetable(courseName, 0, context) diff --git a/app/src/main/java/org/mosad/seil0/projectlaogai/controller/NFCMensaCard.kt b/app/src/main/java/org/mosad/seil0/projectlaogai/controller/NFCMensaCard.kt index 73935d9..c19db0a 100644 --- a/app/src/main/java/org/mosad/seil0/projectlaogai/controller/NFCMensaCard.kt +++ b/app/src/main/java/org/mosad/seil0/projectlaogai/controller/NFCMensaCard.kt @@ -66,7 +66,7 @@ class NFCMensaCard { lookAtMe(context, data, settings.value).show() } } catch (ex: Exception) { - Log.i(className,"could not connect to tag", ex) + Log.w(className,"could not connect to tag", ex) } } diff --git a/app/src/main/java/org/mosad/seil0/projectlaogai/fragments/TimeTableFragment.kt b/app/src/main/java/org/mosad/seil0/projectlaogai/fragments/TimeTableFragment.kt index fc1fb75..66b9148 100644 --- a/app/src/main/java/org/mosad/seil0/projectlaogai/fragments/TimeTableFragment.kt +++ b/app/src/main/java/org/mosad/seil0/projectlaogai/fragments/TimeTableFragment.kt @@ -82,7 +82,7 @@ class TimeTableFragment : Fragment() { faBtnAddLesson.setOnClickListener { MaterialDialog(context!!) - .title(text = "Vorlesung hinzufügen") + .title(text = resources.getString(R.string.add_lesson)) .message(text = "wähle einen Studiengang aus:\n\nWähle eine Vorlesung aus: \n\n Diese Funktion ist noch nicht verfügbar") .show() } diff --git a/app/src/main/res/values-de-rDE/strings.xml b/app/src/main/res/values-de-rDE/strings.xml index 0abcc1d..1a787f2 100644 --- a/app/src/main/res/values-de-rDE/strings.xml +++ b/app/src/main/res/values-de-rDE/strings.xml @@ -18,20 +18,23 @@ Diese Woche keine weitere Essensausgabe heute keine Vorlesung! + + Eine Vorlesung hinzufügen + Info Benutzer - Tippen, um den Kurs zu ändern + Tippe um den Kurs zu ändern Über Lizenzen Design Hell Dunkel Schwarz - Hauptfarbe - Die Primärfarbe, Standard ist Schwarz. + Primärfarbe + Zum Ändern tippen, Standard ist Schwarz. Akzentfarbe - Die Akzentfarbe, Standard ist indigo + Zum Ändern tippen, Standard ist Indigo. Buffet immer anzeigen diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 25f25ef..1a03827 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -20,6 +20,9 @@ No more Food this week "No lecture today!" + + Add a lesson + Info User @@ -34,9 +37,9 @@ Dark Black Primary color - The primary color, default is black. + Tap to change, default is black. Accent color - The accent color, default is indigo. + Tap to change, default is indigo. Always show buffet diff --git a/fastlane/metadata/android/en-US/changelogs/15.txt b/fastlane/metadata/android/en-US/changelogs/15.txt index 375d883..39a72bf 100644 --- a/fastlane/metadata/android/en-US/changelogs/15.txt +++ b/fastlane/metadata/android/en-US/changelogs/15.txt @@ -2,4 +2,4 @@ This release 0.5.1 is called "artistical Apollon". * new: it's now possible to use App shortcuts for the timetable, mensa and moodle screen * change: updated some libs, updated kotlin to 1.3.61 -* change: the app was updated to use kotlin coroutines instead of anko for asynchronous work loads +* change: the app was updated to use kotlin coroutines instead of anko for asynchronous workloads