From 47a4a51b44f9edf13f833ccdeeb2e9c5f616f446 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Deniz=20D=C3=BCzg=C3=B6ren?= Date: Sun, 8 Sep 2019 21:07:20 +0200 Subject: [PATCH] Added option to force a refresh, added fallBackToDestructiveMigration as possible migration strategy for substitution table --- app/build.gradle | 4 +- .../substitutionplan/activities/Main.kt | 4 +- .../substitutionplan/data/DataFetcher.kt | 13 ++++-- .../database/SubstDatabase.kt | 17 +++---- .../fragments/FoodFragment.kt | 26 ++++++----- .../fragments/PlanFragment.kt | 3 +- .../fragments/SettingsFragment.kt | 38 +++++++++------ .../services/FBNotificationService.kt | 3 +- app/src/main/res/layout/content_settings.xml | 46 +++++++++++++++++-- app/src/main/res/values-de/strings.xml | 4 ++ app/src/main/res/values/strings.xml | 4 ++ 11 files changed, 114 insertions(+), 48 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 30f7525..a206279 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -10,8 +10,8 @@ android { applicationId "com.denizd.substitutionplan" minSdkVersion 21 targetSdkVersion 28 - versionCode 30 - versionName "2.2.7" + versionCode 31 + versionName "2.2.8" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { diff --git a/app/src/main/java/com/denizd/substitutionplan/activities/Main.kt b/app/src/main/java/com/denizd/substitutionplan/activities/Main.kt index bc9ec24..619511e 100644 --- a/app/src/main/java/com/denizd/substitutionplan/activities/Main.kt +++ b/app/src/main/java/com/denizd/substitutionplan/activities/Main.kt @@ -112,9 +112,7 @@ internal class Main : AppCompatActivity(R.layout.app_bar_main) { if (info.manufacturer.contains("Huawei") || info.manufacturer.contains("Honor") || info.manufacturer.contains("Xiaomi")) { - val alertDialog = AlertDialog.Builder(context, - R.style.AlertDialog - ) + val alertDialog = AlertDialog.Builder(context, R.style.AlertDialog) val dialogView = LayoutInflater.from(context).inflate(R.layout.secret_dialog, null) val title = dialogView.findViewById(R.id.textviewtitle) title.text = getString(R.string.chineseDevicesTitle) diff --git a/app/src/main/java/com/denizd/substitutionplan/data/DataFetcher.kt b/app/src/main/java/com/denizd/substitutionplan/data/DataFetcher.kt index 3aff8b0..a8a18d5 100644 --- a/app/src/main/java/com/denizd/substitutionplan/data/DataFetcher.kt +++ b/app/src/main/java/com/denizd/substitutionplan/data/DataFetcher.kt @@ -34,11 +34,12 @@ import kotlin.collections.ArrayList * @param isMenu food menu will be downloaded and persisted in the database if true * @param isJobService a notification will be prepared and sent if this and isPlan is true */ -internal class DataFetcher(isPlan: Boolean, isMenu: Boolean, isJobService: Boolean, context: Context, application: Application, parentView: View?) : AsyncTask() { +internal class DataFetcher(isPlan: Boolean, isMenu: Boolean, isJobService: Boolean, context: Context, application: Application, parentView: View?, forced: Boolean) : AsyncTask() { private var jobService = isJobService private var plan = isPlan private var menu = isMenu + private var forceRefresh = forced private var mContext = context private var mApplication = application @@ -60,6 +61,10 @@ internal class DataFetcher(isPlan: Boolean, isMenu: Boolean, isJobService: Boole foodUrl = "https://djd4rkn355.github.io/food_test.html" } + if (forceRefresh) { + edit.putString("timeNew", "").putString("timeFoodNew", "").apply() + } + if (menu) { requestFoodMenuData() } @@ -69,10 +74,12 @@ internal class DataFetcher(isPlan: Boolean, isMenu: Boolean, isJobService: Boole if (plan || menu) { mView?.let { v: View -> - val snackText = "${mContext.getText(R.string.lastUpdated)} ${when { + var snackText = "${mContext.getText(R.string.lastUpdated)} ${when { + plan -> currentTime menu -> currentFoodTime - else -> currentTime + else -> "---" }}" + snackText = if (forceRefresh) mContext.getString(R.string.forcedRefresh) else snackText val snackBarView = v.findViewById(R.id.coordination) Snackbar.make(snackBarView, snackText, Snackbar.LENGTH_LONG).show() } diff --git a/app/src/main/java/com/denizd/substitutionplan/database/SubstDatabase.kt b/app/src/main/java/com/denizd/substitutionplan/database/SubstDatabase.kt index 5298e34..fc55210 100644 --- a/app/src/main/java/com/denizd/substitutionplan/database/SubstDatabase.kt +++ b/app/src/main/java/com/denizd/substitutionplan/database/SubstDatabase.kt @@ -28,10 +28,11 @@ internal abstract class SubstDatabase : RoomDatabase() { if (instance == null) { synchronized (SubstDatabase::class) { instance = Room.databaseBuilder(context.applicationContext, - SubstDatabase::class.java, - "subst_database") - .addMigrations(addTeacherColumn) - .build() + SubstDatabase::class.java, + "subst_database") + .addMigrations(addTeacherColumn) + .fallbackToDestructiveMigration() + .build() } } return instance @@ -43,10 +44,10 @@ internal abstract class SubstDatabase : RoomDatabase() { if (foodInstance == null) { synchronized (SubstDatabase::class) { foodInstance = Room.databaseBuilder(context.applicationContext, - SubstDatabase::class.java, - "food_database") - .fallbackToDestructiveMigration() - .build() + SubstDatabase::class.java, + "food_database") + .fallbackToDestructiveMigration() + .build() } } return foodInstance diff --git a/app/src/main/java/com/denizd/substitutionplan/fragments/FoodFragment.kt b/app/src/main/java/com/denizd/substitutionplan/fragments/FoodFragment.kt index c414934..def42d8 100644 --- a/app/src/main/java/com/denizd/substitutionplan/fragments/FoodFragment.kt +++ b/app/src/main/java/com/denizd/substitutionplan/fragments/FoodFragment.kt @@ -63,24 +63,26 @@ internal class FoodFragment : Fragment(R.layout.food_layout) { if (prefs.getBoolean("autoRefresh", false)) { pullToRefresh.isRefreshing = true DataFetcher( - false, - true, - false, - mContext, - activity!!.application, - view.rootView + isPlan = false, + isMenu = true, + isJobService = false, + context = mContext, + application = activity!!.application, + parentView = view.rootView, + forced = false ).execute() } pullToRefresh.setOnRefreshListener { pullToRefresh.isRefreshing = true DataFetcher( - false, - true, - false, - mContext, - activity!!.application, - view.rootView + isPlan = false, + isMenu = true, + isJobService = false, + context = mContext, + application = activity!!.application, + parentView = view.rootView, + forced = false ).execute() } } diff --git a/app/src/main/java/com/denizd/substitutionplan/fragments/PlanFragment.kt b/app/src/main/java/com/denizd/substitutionplan/fragments/PlanFragment.kt index 7c429af..ddca1cb 100644 --- a/app/src/main/java/com/denizd/substitutionplan/fragments/PlanFragment.kt +++ b/app/src/main/java/com/denizd/substitutionplan/fragments/PlanFragment.kt @@ -83,7 +83,8 @@ internal open class PlanFragment : Fragment(R.layout.plan) { isJobService = false, context = mContext, application = activity!!.application, - parentView = view.rootView + parentView = view.rootView, + forced = false ).execute() } diff --git a/app/src/main/java/com/denizd/substitutionplan/fragments/SettingsFragment.kt b/app/src/main/java/com/denizd/substitutionplan/fragments/SettingsFragment.kt index 4a881dd..29a97fd 100644 --- a/app/src/main/java/com/denizd/substitutionplan/fragments/SettingsFragment.kt +++ b/app/src/main/java/com/denizd/substitutionplan/fragments/SettingsFragment.kt @@ -1,5 +1,6 @@ package com.denizd.substitutionplan.fragments +import android.annotation.SuppressLint import android.content.ActivityNotFoundException import android.content.Context import android.content.Intent @@ -27,6 +28,7 @@ import androidx.recyclerview.widget.RecyclerView import com.denizd.substitutionplan.* import com.denizd.substitutionplan.adapters.ColourAdapter import com.denizd.substitutionplan.adapters.RingtoneAdapter +import com.denizd.substitutionplan.data.DataFetcher import com.denizd.substitutionplan.data.HelperFunctions import com.denizd.substitutionplan.models.Colour import com.denizd.substitutionplan.models.Ringtone @@ -85,6 +87,7 @@ internal class SettingsFragment : Fragment(R.layout.content_settings), View.OnCl val btnVersion = view.findViewById(R.id.btnVersion) currentRingtone = view.findViewById(R.id.txtCustomiseRingtone2) setRingtoneText() + val btnForceRefresh = view.findViewById(R.id.btnForceRefresh) switchDisableGreeting.setOnCheckedChangeListener(this) // switchDark.setOnCheckedChangeListener(this) @@ -101,6 +104,12 @@ internal class SettingsFragment : Fragment(R.layout.content_settings), View.OnCl view.findViewById(R.id.btnTerms).setOnClickListener(this) view.findViewById(R.id.btnPrivacyP).setOnClickListener(this) btnVersion.setOnClickListener(this) + btnForceRefresh.setOnClickListener(this) + btnForceRefresh.setOnLongClickListener { + edit.putString("timeNew", "").putString("timeFoodNew", "").apply() + makeToast(mContext.getString(R.string.forcedRefreshTimes)) + true + } val darkModeDropDown = view.findViewById(R.id.darkModeDropDownText) val darkModeList = if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.P) { @@ -127,6 +136,7 @@ internal class SettingsFragment : Fragment(R.layout.content_settings), View.OnCl 0 -> { AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO) if (Build.VERSION.SDK_INT in 23..28) { + @SuppressLint("InlinedApi") window?.decorView?.systemUiVisibility = View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR window?.navigationBarColor = ContextCompat.getColor(mContext, R.color.colorBackground) } @@ -150,11 +160,6 @@ internal class SettingsFragment : Fragment(R.layout.content_settings), View.OnCl switchDisableGreeting.isChecked = prefs.getBoolean("greeting", true) -// switchDark.isChecked = when (prefs.getInt("themeInt", 0)) { -// 1 -> true -// 2 -> true -// else -> false -// } switchNotifications.isChecked = prefs.getBoolean("notif", false) switchDefaultPlan.isChecked = prefs.getBoolean("defaultPersonalised", false) switchAutoRefresh.isChecked = prefs.getBoolean("autoRefresh", false) @@ -271,6 +276,17 @@ internal class SettingsFragment : Fragment(R.layout.content_settings), View.OnCl } } } + R.id.btnForceRefresh -> { + DataFetcher( + isPlan = true, + isMenu = true, + isJobService = false, + context = mContext, + application = activity!!.application, + parentView = view!!.rootView, + forced = true + ).execute() + } } edit.apply() } @@ -311,9 +327,7 @@ internal class SettingsFragment : Fragment(R.layout.content_settings), View.OnCl } private fun createColourDialog() { - val colourCustomiserBuilder = AlertDialog.Builder(mContext, - R.style.AlertDialog - ) + val colourCustomiserBuilder = AlertDialog.Builder(mContext, R.style.AlertDialog) val dialogView = LayoutInflater.from(mContext).inflate(R.layout.recycler_dialog, null) val titleText = dialogView.findViewById(R.id.empty_textviewtitle) @@ -358,7 +372,7 @@ internal class SettingsFragment : Fragment(R.layout.content_settings), View.OnCl R.drawable.ic_help, R.drawable.ic_pencil ) - for (i in 0 until coursesNoLang.size) { + for (i in coursesNoLang.indices) { colours.add( Colour( courses[i], @@ -462,7 +476,7 @@ internal class SettingsFragment : Fragment(R.layout.content_settings), View.OnCl R.id.sky, R.id.orchid, R.id.lavender, R.id.carnation, R.id.brown2, R.id.pureBlack) val colours = HelperFunctions.colourNames - for (i2 in 0 until buttons.size) { + for (i2 in buttons.indices) { picker.findViewById(buttons[i2]).setOnClickListener { // prefs.edit().putInt("bg$titleNoLang", colourIntegers[i2]).apply() prefs.edit().putString("card$titleNoLang", colours[i2]).apply() @@ -530,10 +544,6 @@ internal class SettingsFragment : Fragment(R.layout.content_settings), View.OnCl makeToast(getString(R.string.youtubeNotFound)) } } - "_NOTIFICATION" -> { - edit.putString("timeNew", "").putString("timeFoodNew", "").apply() - makeToast("Notification times cleared") - } // TODO add option to clear database "_FIRSTTIME" -> { edit.putBoolean("firstTime", true).apply() makeToast("First time flag cleared") diff --git a/app/src/main/java/com/denizd/substitutionplan/services/FBNotificationService.kt b/app/src/main/java/com/denizd/substitutionplan/services/FBNotificationService.kt index 5c6beb1..cd24c1d 100644 --- a/app/src/main/java/com/denizd/substitutionplan/services/FBNotificationService.kt +++ b/app/src/main/java/com/denizd/substitutionplan/services/FBNotificationService.kt @@ -13,7 +13,8 @@ internal class FBNotificationService : FirebaseMessagingService() { isJobService = true, context = applicationContext, application = application, - parentView = null + parentView = null, + forced = false ).execute() } } \ No newline at end of file diff --git a/app/src/main/res/layout/content_settings.xml b/app/src/main/res/layout/content_settings.xml index b287440..5311236 100644 --- a/app/src/main/res/layout/content_settings.xml +++ b/app/src/main/res/layout/content_settings.xml @@ -496,6 +496,44 @@ app:layout_constraintStart_toStartOf="@+id/txtAutoRefresh" app:layout_constraintTop_toTopOf="@+id/txtAutoRefresh"/> + + + + + + + app:layout_constraintStart_toStartOf="@+id/txtForceRefresh2" + app:layout_constraintTop_toBottomOf="@+id/txtForceRefresh2" /> + app:layout_constraintTop_toBottomOf="@+id/txtForceRefresh2" /> Hell Dunkel + Aktualisierung erfolgreich + Aktualisierungszeiten wurden gelöscht + Erzwinge eine Aktualisierung + Nutz dies falls du Plan oder Speisemenü nicht sehen kannst \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 480fad3..8378b14 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -165,4 +165,8 @@ Light Dark + Forced refresh successful + Cleared refresh times + Force a refresh + Use this if you can\'t see the plan or food menu