From 1a4b8ce14245ef0a4a6969db484b5c38c1ec9913 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Deniz=20D=C3=BCzg=C3=B6ren?= Date: Sat, 19 Oct 2019 19:48:21 +0200 Subject: [PATCH] Renamed HelperFunctions to SubstUtil, played around with Kotlin extensions --- .../substitutionplan/activities/FirstTime.kt | 4 ++-- .../substitutionplan/activities/Login.kt | 4 ++-- .../substitutionplan/activities/Main.kt | 4 ++-- .../adapters/SubstitutionAdapter.kt | 20 ++++++++--------- .../substitutionplan/data/DataFetcher.kt | 14 +++++------- .../data/LoginWebViewClient.kt | 2 +- .../data/{HelperFunctions.kt => SubstUtil.kt} | 22 +++++++++---------- .../database/SubstDatabase.kt | 3 ++- .../fragments/FoodFragment.kt | 4 ++-- .../fragments/GeneralPlanFragment.kt | 4 ++-- .../fragments/PersonalPlanFragment.kt | 6 ++--- .../fragments/SettingsFragment.kt | 14 ++++++------ 12 files changed, 50 insertions(+), 51 deletions(-) rename app/src/main/java/com/denizd/substitutionplan/data/{HelperFunctions.kt => SubstUtil.kt} (96%) diff --git a/app/src/main/java/com/denizd/substitutionplan/activities/FirstTime.kt b/app/src/main/java/com/denizd/substitutionplan/activities/FirstTime.kt index 5f6c572..1598646 100644 --- a/app/src/main/java/com/denizd/substitutionplan/activities/FirstTime.kt +++ b/app/src/main/java/com/denizd/substitutionplan/activities/FirstTime.kt @@ -20,7 +20,7 @@ import androidx.appcompat.app.AppCompatActivity import androidx.constraintlayout.widget.ConstraintLayout import androidx.vectordrawable.graphics.drawable.AnimatedVectorDrawableCompat import com.denizd.substitutionplan.R -import com.denizd.substitutionplan.data.HelperFunctions +import com.denizd.substitutionplan.data.SubstUtil import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton import com.google.android.material.textfield.TextInputEditText import java.util.* @@ -44,7 +44,7 @@ internal class FirstTime : AppCompatActivity(R.layout.activity_first_time) { val parentLayout = findViewById(R.id.coordinatorLayout) parentLayout.layoutTransition.enableTransitionType(LayoutTransition.CHANGING) - HelperFunctions.setTheme(window = window, context = context) + SubstUtil.setTheme(window = window, context = context) prefs = PreferenceManager.getDefaultSharedPreferences(context) as SharedPreferences val edit = prefs.edit() diff --git a/app/src/main/java/com/denizd/substitutionplan/activities/Login.kt b/app/src/main/java/com/denizd/substitutionplan/activities/Login.kt index 03cc360..c43300f 100644 --- a/app/src/main/java/com/denizd/substitutionplan/activities/Login.kt +++ b/app/src/main/java/com/denizd/substitutionplan/activities/Login.kt @@ -21,7 +21,7 @@ import androidx.constraintlayout.widget.ConstraintLayout import androidx.coordinatorlayout.widget.CoordinatorLayout import androidx.vectordrawable.graphics.drawable.AnimatedVectorDrawableCompat import com.denizd.substitutionplan.R -import com.denizd.substitutionplan.data.HelperFunctions +import com.denizd.substitutionplan.data.SubstUtil import com.denizd.substitutionplan.data.LoginWebViewClient import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton import com.google.android.material.snackbar.Snackbar @@ -48,7 +48,7 @@ internal class Login : AppCompatActivity(R.layout.activity_login_webview), Login val title = findViewById(R.id.txtWelcome) prefs = PreferenceManager.getDefaultSharedPreferences(this) - HelperFunctions.setTheme(window = window, context = this) + SubstUtil.setTheme(window = window, context = this) logInButton = findViewById(R.id.loginFab) logInButton.setOnClickListener { 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 86d3e9a..309cb83 100644 --- a/app/src/main/java/com/denizd/substitutionplan/activities/Main.kt +++ b/app/src/main/java/com/denizd/substitutionplan/activities/Main.kt @@ -20,7 +20,7 @@ import androidx.core.widget.NestedScrollView import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentTransaction import androidx.recyclerview.widget.RecyclerView -import com.denizd.substitutionplan.data.HelperFunctions +import com.denizd.substitutionplan.data.SubstUtil import com.denizd.substitutionplan.R import com.denizd.substitutionplan.fragments.FoodFragment import com.denizd.substitutionplan.fragments.GeneralPlanFragment @@ -70,7 +70,7 @@ internal class Main : AppCompatActivity(R.layout.app_bar_main) { else -> { // launch the app if (!prefs.getBoolean("colourTransferred", false)) { - HelperFunctions.transferOldColourIntsToString(prefs, context) + SubstUtil.transferOldColourIntsToString(prefs, context) edit.putBoolean("colourTransferred", true).apply() } diff --git a/app/src/main/java/com/denizd/substitutionplan/adapters/SubstitutionAdapter.kt b/app/src/main/java/com/denizd/substitutionplan/adapters/SubstitutionAdapter.kt index f2413c3..a5e6578 100644 --- a/app/src/main/java/com/denizd/substitutionplan/adapters/SubstitutionAdapter.kt +++ b/app/src/main/java/com/denizd/substitutionplan/adapters/SubstitutionAdapter.kt @@ -15,7 +15,7 @@ import android.widget.Toast import androidx.browser.customtabs.CustomTabsIntent import androidx.core.content.ContextCompat import androidx.recyclerview.widget.RecyclerView -import com.denizd.substitutionplan.data.HelperFunctions +import com.denizd.substitutionplan.data.SubstUtil import com.denizd.substitutionplan.R import com.denizd.substitutionplan.models.Substitution import com.google.android.material.card.MaterialCardView @@ -89,16 +89,16 @@ internal class SubstitutionAdapter(private var substitutions: List val add = currentItem.additional val type = currentItem.type.toLowerCase(Locale.ROOT) if (add.isNotEmpty()) { - if (HelperFunctions.checkStringForArray(add, HelperFunctions.cancellations, true)) { - strikeThrough(strings) + if (SubstUtil.checkStringForArray(add, SubstUtil.cancellations, true)) { + strings.strikeThrough() } } else { - if (HelperFunctions.checkStringForArray(type, HelperFunctions.cancellations, true)) { - strikeThrough(strings) + if (SubstUtil.checkStringForArray(type, SubstUtil.cancellations, true)) { + strings.strikeThrough() } } - var icon = HelperFunctions.getIconForCourse(currentItem.course) + var icon = SubstUtil.getIconForCourse(currentItem.course) holder.group.setText(strings[0], TextView.BufferType.SPANNABLE) holder.time.setText(strings[1], TextView.BufferType.SPANNABLE) holder.course.setText(strings[2], TextView.BufferType.SPANNABLE) @@ -113,13 +113,13 @@ internal class SubstitutionAdapter(private var substitutions: List cardBackgroundColour = R.color.colorAccent View.GONE } else { - val colourString = HelperFunctions.getColourString(holder.course.text.toString()) + val colourString = SubstUtil.getColourString(holder.course.text.toString()) val colourPrefsInt = if (colourString.isNotEmpty()) { prefs.getString("card$colourString", "") ?: "" } else { "" } - colour = HelperFunctions.getColourForString(colourPrefsInt, holder.context) + colour = SubstUtil.getColourForString(colourPrefsInt, holder.context) cardBackgroundColour = if (colour != 0) { colour } else { @@ -171,7 +171,7 @@ internal class SubstitutionAdapter(private var substitutions: List } /// Strikes through the strings for course, room and teacher - private fun strikeThrough(strings: Array) { - for (i in 2..4) { strings[i].setSpan(StrikethroughSpan(), 0, strings[i].length, 0) } + private fun Array.strikeThrough() { + for (i in 2..4) { this[i].setSpan(StrikethroughSpan(), 0, this[i].length, 0) } } } \ No newline at end of file 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 6b3ea5c..1023037 100644 --- a/app/src/main/java/com/denizd/substitutionplan/data/DataFetcher.kt +++ b/app/src/main/java/com/denizd/substitutionplan/data/DataFetcher.kt @@ -11,8 +11,6 @@ import android.util.Log import androidx.preference.PreferenceManager import android.view.View import android.widget.RemoteViews -import android.widget.TextView -import androidx.appcompat.app.AlertDialog import androidx.core.app.NotificationCompat import androidx.core.content.ContextCompat import androidx.swiperefreshlayout.widget.SwipeRefreshLayout @@ -137,7 +135,7 @@ internal class DataFetcher( val indices = ArrayList() val daysAndVon = arrayOf("montag", "dienstag", "mittwoch", "donnerstag", "freitag", "von", "wünschen") for (i in 0 until foodElements.size) { - if (HelperFunctions.checkStringForArray(foodElements[i].text(), daysAndVon, true)) indices.add(i) + if (SubstUtil.checkStringForArray(foodElements[i].text(), daysAndVon, true)) indices.add(i) } indices.add(foodElements.size) @@ -194,8 +192,8 @@ internal class DataFetcher( additional = cols[5].text(), teacher = cols[6].text(), type = cols[7].text(), - priority = HelperFunctions.assignRanking(group, (date.length > 2 && date.substring(0, 3) == "psa")), - date_priority = HelperFunctions.assignDatePriority(date), + priority = SubstUtil.assignRanking(group, (date.length > 2 && date.substring(0, 3) == "psa")), + date_priority = SubstUtil.assignDatePriority(date), website_priority = websitePriority ) substArray.add(subst) @@ -206,7 +204,7 @@ internal class DataFetcher( var countOfMoreNotificationItems = 0 if (jobService && prefs.getBoolean("notif", true)) { substArray.filter { substItem -> - HelperFunctions.checkPersonalSubstitutions( + SubstUtil.checkPersonalSubstitutions( substItem, coursePreference, classPreference, @@ -249,10 +247,10 @@ internal class DataFetcher( val manager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - HelperFunctions.getNotificationChannel(context, prefs) + SubstUtil.getNotificationChannel(context, prefs) } - val notification = NotificationCompat.Builder(context, HelperFunctions.notificationChannelId) + val notification = NotificationCompat.Builder(context, SubstUtil.notificationChannelId) .setStyle(NotificationCompat.DecoratedCustomViewStyle()) .setCustomContentView(notificationLayout) .setContentIntent(openAppPending) diff --git a/app/src/main/java/com/denizd/substitutionplan/data/LoginWebViewClient.kt b/app/src/main/java/com/denizd/substitutionplan/data/LoginWebViewClient.kt index a11f3f3..b3d7ca7 100644 --- a/app/src/main/java/com/denizd/substitutionplan/data/LoginWebViewClient.kt +++ b/app/src/main/java/com/denizd/substitutionplan/data/LoginWebViewClient.kt @@ -24,7 +24,7 @@ internal class LoginWebViewClient(private val successListener: OnLoginSuccessLis override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) { super.onPageStarted(view, url, favicon) - if (!HelperFunctions.checkStringForArray(url.toString(), schoolUrls, false)) { + if (!SubstUtil.checkStringForArray(url.toString(), schoolUrls, false)) { reloadLoginPage(webView = view) } } diff --git a/app/src/main/java/com/denizd/substitutionplan/data/HelperFunctions.kt b/app/src/main/java/com/denizd/substitutionplan/data/SubstUtil.kt similarity index 96% rename from app/src/main/java/com/denizd/substitutionplan/data/HelperFunctions.kt rename to app/src/main/java/com/denizd/substitutionplan/data/SubstUtil.kt index 898fe75..a11f914 100644 --- a/app/src/main/java/com/denizd/substitutionplan/data/HelperFunctions.kt +++ b/app/src/main/java/com/denizd/substitutionplan/data/SubstUtil.kt @@ -34,7 +34,7 @@ import javax.xml.parsers.DocumentBuilderFactory * An object class used for declaring functions and variables used by multiple classes throughout * the project. As it is an object class, it can be accessed statically without initialisation */ -internal object HelperFunctions { +internal object SubstUtil { /** * A language-independent list of all courses that is used to save the custom colours of any @@ -401,20 +401,20 @@ internal object HelperFunctions { private val prefTypes = arrayOf("string", "string", "string", "bool", "int", "bool", "bool", "bool", "string", "int", "int", "bool", "bool") - private fun getPrefValue(prefs: SharedPreferences, type: String, key: String): Any { + private fun SharedPreferences.getPrefValue(type: String, key: String): Any { return when (type) { - "string" -> prefs.getString(key, "") ?: "" - "int" -> prefs.getInt(key, 0) - "bool" -> prefs.getBoolean(key, false) + "string" -> getString(key, "") ?: "" + "int" -> getInt(key, 0) + "bool" -> getBoolean(key, false) else -> "" } } - private fun setPrefValue(prefs: SharedPreferences, key: String, value: String, type: String) { + private fun SharedPreferences.setPrefValue(key: String, value: String, type: String) { when (type) { - "int" -> prefs.edit().putInt(key, value.toInt()).apply() - "string" -> prefs.edit().putString(key, value).apply() - "bool" -> prefs.edit().putBoolean(key, value.toBoolean()).apply() + "int" -> edit().putInt(key, value.toInt()).apply() + "string" -> edit().putString(key, value).apply() + "bool" -> edit().putBoolean(key, value.toBoolean()).apply() } } @@ -439,7 +439,7 @@ internal object HelperFunctions { var input = "\n" for (i in localPrefKeys.indices) { input += "\n\t${localPrefKeys[i]}" + - "\n\t${getPrefValue(prefs, localPrefTypes[i], localPrefKeys[i])}" + "\n\t${prefs.getPrefValue(localPrefTypes[i], localPrefKeys[i])}" } input += "\n" out.apply { @@ -471,7 +471,7 @@ internal object HelperFunctions { for (i in localPrefTypes.indices) { val key = document.getElementsByTagName("key").item(i).textContent val value = document.getElementsByTagName("value").item(i).textContent - setPrefValue(prefs, key, value, localPrefTypes[i]) + prefs.setPrefValue(key, value, localPrefTypes[i]) } Toast.makeText(context, context.getString(R.string.success), Toast.LENGTH_LONG).show() } else { 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 e59b6d8..7dbc5a4 100644 --- a/app/src/main/java/com/denizd/substitutionplan/database/SubstDatabase.kt +++ b/app/src/main/java/com/denizd/substitutionplan/database/SubstDatabase.kt @@ -16,7 +16,6 @@ internal abstract class SubstDatabase : RoomDatabase() { companion object { - private var instance: SubstDatabase? = null private val addTeacherColumn = object : Migration(5, 6) { override fun migrate(database: SupportSQLiteDatabase) { database.execSQL("ALTER TABLE subst_table ADD COLUMN teacher TEXT NOT NULL DEFAULT ''") @@ -38,6 +37,8 @@ internal abstract class SubstDatabase : RoomDatabase() { } } + private var instance: SubstDatabase? = null + fun getInstance(context: Context): SubstDatabase? { if (instance == null) { synchronized (SubstDatabase::class) { 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 0ef8a33..619f5d2 100644 --- a/app/src/main/java/com/denizd/substitutionplan/fragments/FoodFragment.kt +++ b/app/src/main/java/com/denizd/substitutionplan/fragments/FoodFragment.kt @@ -12,7 +12,7 @@ import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProviders import androidx.recyclerview.widget.GridLayoutManager import com.denizd.substitutionplan.adapters.FoodAdapter -import com.denizd.substitutionplan.data.HelperFunctions +import com.denizd.substitutionplan.data.SubstUtil import com.denizd.substitutionplan.database.FoodViewModel import com.denizd.substitutionplan.databinding.FoodLayoutBinding import com.denizd.substitutionplan.models.Food @@ -50,7 +50,7 @@ internal class FoodFragment : Fragment() { foodViewModel.allFoods?.observe(this, Observer> { foodList -> binding.recyclerView.scheduleLayoutAnimation() mAdapter.setFood(if (foodList.isEmpty()) { - HelperFunctions.getEmptyFoodMenu(mContext) + SubstUtil.getEmptyFoodMenu(mContext) } else { foodList }) diff --git a/app/src/main/java/com/denizd/substitutionplan/fragments/GeneralPlanFragment.kt b/app/src/main/java/com/denizd/substitutionplan/fragments/GeneralPlanFragment.kt index e646bf3..5612d5b 100644 --- a/app/src/main/java/com/denizd/substitutionplan/fragments/GeneralPlanFragment.kt +++ b/app/src/main/java/com/denizd/substitutionplan/fragments/GeneralPlanFragment.kt @@ -3,7 +3,7 @@ package com.denizd.substitutionplan.fragments import android.os.Bundle import android.view.View import androidx.lifecycle.Observer -import com.denizd.substitutionplan.data.HelperFunctions +import com.denizd.substitutionplan.data.SubstUtil import com.denizd.substitutionplan.models.Substitution internal class GeneralPlanFragment : PlanFragment() { @@ -13,7 +13,7 @@ internal class GeneralPlanFragment : PlanFragment() { substitutionPlan?.observe(this, Observer> { substitutions -> mAdapter.setSubst(if (substitutions.isEmpty()) { - HelperFunctions.getEmptyGeneralSubstitution(mContext) + SubstUtil.getEmptyGeneralSubstitution(mContext) } else { substitutions }) diff --git a/app/src/main/java/com/denizd/substitutionplan/fragments/PersonalPlanFragment.kt b/app/src/main/java/com/denizd/substitutionplan/fragments/PersonalPlanFragment.kt index 1375d60..d8d7b9c 100644 --- a/app/src/main/java/com/denizd/substitutionplan/fragments/PersonalPlanFragment.kt +++ b/app/src/main/java/com/denizd/substitutionplan/fragments/PersonalPlanFragment.kt @@ -3,7 +3,7 @@ package com.denizd.substitutionplan.fragments import android.os.Bundle import android.view.View import androidx.lifecycle.Observer -import com.denizd.substitutionplan.data.HelperFunctions +import com.denizd.substitutionplan.data.SubstUtil import com.denizd.substitutionplan.models.Substitution internal class PersonalPlanFragment : PlanFragment() { @@ -20,7 +20,7 @@ internal class PersonalPlanFragment : PlanFragment() { binding.recyclerView.visibility = View.VISIBLE substitutions.filter { substItem -> - HelperFunctions.checkPersonalSubstitutions( + SubstUtil.checkPersonalSubstitutions( substItem, coursePreference, classPreference, @@ -31,7 +31,7 @@ internal class PersonalPlanFragment : PlanFragment() { } isPersonalPlanEmpty = (planCardList.size == 1 && planCardList[0].date.substring(0, 3) == "psa") || planCardList.isEmpty() if (isPersonalPlanEmpty) { - planCardList.add(HelperFunctions.getEmptyPersonalSubstitution(mContext)) + planCardList.add(SubstUtil.getEmptyPersonalSubstitution(mContext)) } binding.recyclerView.scheduleLayoutAnimation() mAdapter.setSubst(planCardList) 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 2c9e918..5438730 100644 --- a/app/src/main/java/com/denizd/substitutionplan/fragments/SettingsFragment.kt +++ b/app/src/main/java/com/denizd/substitutionplan/fragments/SettingsFragment.kt @@ -31,7 +31,7 @@ import com.denizd.substitutionplan.adapters.ColourPickerAdapter import com.denizd.substitutionplan.adapters.CourseColourAdapter import com.denizd.substitutionplan.adapters.RingtoneAdapter import com.denizd.substitutionplan.data.DataFetcher -import com.denizd.substitutionplan.data.HelperFunctions +import com.denizd.substitutionplan.data.SubstUtil import com.denizd.substitutionplan.data.Topic import com.denizd.substitutionplan.databinding.ContentSettingsBinding import com.denizd.substitutionplan.models.Colour @@ -325,7 +325,7 @@ internal class SettingsFragment : Fragment(), View.OnClickListener, View.OnLongC colourRecycler.apply { hasFixedSize() layoutManager = GridLayoutManager(mContext, 1) - adapter = ColourPickerAdapter(HelperFunctions.getColourArray(mContext).toList(), this@SettingsFragment) + adapter = ColourPickerAdapter(SubstUtil.getColourArray(mContext).toList(), this@SettingsFragment) } colourPickerDialog = colourPickerBuilder.setView(dialogView).create() colourPickerDialog.show() @@ -376,7 +376,7 @@ internal class SettingsFragment : Fragment(), View.OnClickListener, View.OnLongC private fun createRingtoneDialog() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - HelperFunctions.getNotificationChannel(mContext, prefs) + SubstUtil.getNotificationChannel(mContext, prefs) val intent = Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS).apply { putExtra(Settings.EXTRA_APP_PACKAGE, mContext.applicationContext.packageName) putExtra(Settings.EXTRA_CHANNEL_ID, "general") @@ -487,8 +487,8 @@ internal class SettingsFragment : Fragment(), View.OnClickListener, View.OnLongC this == "_viewstacktrace" -> { createDialog("Debug Stack Trace", prefs.getString("debug_recent_exception", "") ?: "") } - this == "_write" -> HelperFunctions.writePrefsToXml(prefs, mContext, activity!!) - this == "_read" -> HelperFunctions.readPrefsFromXml(prefs, mContext, activity!!) + this == "_write" -> SubstUtil.writePrefsToXml(prefs, mContext, activity!!) + this == "_read" -> SubstUtil.readPrefsFromXml(prefs, mContext, activity!!) else -> makeToast(getString(R.string.invalid_code)) } } @@ -501,7 +501,7 @@ internal class SettingsFragment : Fragment(), View.OnClickListener, View.OnLongC // Functions for retrieving data private fun getColourList(): ArrayList { val colours = ArrayList() - val coursesNoLang = HelperFunctions.languageIndependentCourses + val coursesNoLang = SubstUtil.languageIndependentCourses val courses = arrayOf( getString(R.string.course_deu), getString(R.string.course_eng), @@ -563,7 +563,7 @@ internal class SettingsFragment : Fragment(), View.OnClickListener, View.OnLongC courses[i], coursesNoLang[i], coursesIcons[i], - HelperFunctions.getColourForString(prefs.getString("card${coursesNoLang[i]}", "") ?: "", mContext) + SubstUtil.getColourForString(prefs.getString("card${coursesNoLang[i]}", "") ?: "", mContext) ) ) }