Refactor to organise the project and change visibility modifiers

This commit is contained in:
Deniz Düzgören
2019-09-01 11:54:12 +02:00
parent d4e69462b6
commit 82b5fa1b97
34 changed files with 418 additions and 215 deletions
+4 -4
View File
@@ -18,14 +18,14 @@
tools:ignore="GoogleAppIndexingWarning"> tools:ignore="GoogleAppIndexingWarning">
<activity <activity
android:name=".FirstTime" android:name=".activities.FirstTime"
android:label="First Time" android:label="First Time"
android:screenOrientation="portrait" android:screenOrientation="portrait"
android:theme="@style/AppTheme0.Launcher" android:theme="@style/AppTheme0.Launcher"
android:windowSoftInputMode="adjustPan"/> android:windowSoftInputMode="adjustPan"/>
<activity <activity
android:name=".Main" android:name=".activities.Main"
android:label="@string/appName" android:label="@string/appName"
android:configChanges="orientation|keyboardHidden|screenSize" android:configChanges="orientation|keyboardHidden|screenSize"
android:theme="@style/AppTheme0.Launcher" android:theme="@style/AppTheme0.Launcher"
@@ -39,7 +39,7 @@
</activity> </activity>
<service <service
android:name=".FBNotificationService" android:name=".services.FBNotificationService"
android:exported="false"> android:exported="false">
<intent-filter> <intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" /> <action android:name="com.google.firebase.MESSAGING_EVENT" />
@@ -54,7 +54,7 @@
android:resource="@color/colorAccent" /> android:resource="@color/colorAccent" />
<service <service
android:name=".FBPingService" android:name=".services.FBPingService"
android:permission="android.permission.BIND_JOB_SERVICE" android:permission="android.permission.BIND_JOB_SERVICE"
android:required="true"/> android:required="true"/>
</application> </application>
@@ -1,3 +0,0 @@
package com.denizd.substitutionplan
class Colour(val title: String, val titleNoLang: String, val icon: Int, val colour: Int)
@@ -1,7 +0,0 @@
package com.denizd.substitutionplan
import androidx.room.Entity
import androidx.room.PrimaryKey
@Entity(tableName = "food_table")
class Food(val food: String, @PrimaryKey val priority: Int)
@@ -1,5 +0,0 @@
package com.denizd.substitutionplan
import android.net.Uri
class Ringtone(val name: String, val uri: String)
@@ -1,11 +0,0 @@
package com.denizd.substitutionplan
import androidx.room.Entity
import androidx.room.PrimaryKey
@Entity(tableName = "subst_table")
public class Subst(val group: String, val date: String, val time: String, val course: String, val room: String, val additional: String, val priority: Int) {
@PrimaryKey(autoGenerate = true)
var id: Int = 0
}
@@ -1,4 +1,4 @@
package com.denizd.substitutionplan package com.denizd.substitutionplan.activities
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
@@ -20,11 +20,12 @@ import androidx.appcompat.app.AppCompatDelegate
import androidx.coordinatorlayout.widget.CoordinatorLayout import androidx.coordinatorlayout.widget.CoordinatorLayout
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.vectordrawable.graphics.drawable.AnimatedVectorDrawableCompat import androidx.vectordrawable.graphics.drawable.AnimatedVectorDrawableCompat
import com.denizd.substitutionplan.R
import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
import com.google.android.material.textfield.TextInputEditText import com.google.android.material.textfield.TextInputEditText
import java.util.* import java.util.*
class FirstTime : AppCompatActivity(R.layout.activity_first_time) { internal class FirstTime : AppCompatActivity(R.layout.activity_first_time) {
private lateinit var context: Context private lateinit var context: Context
private lateinit var prefs: SharedPreferences private lateinit var prefs: SharedPreferences
@@ -38,16 +39,28 @@ class FirstTime : AppCompatActivity(R.layout.activity_first_time) {
AppCompatDelegate.MODE_NIGHT_NO, AppCompatDelegate.MODE_NIGHT_UNSPECIFIED -> { AppCompatDelegate.MODE_NIGHT_NO, AppCompatDelegate.MODE_NIGHT_UNSPECIFIED -> {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
window.statusBarColor = ContextCompat.getColor(this, R.color.colorBackground) window.statusBarColor = ContextCompat.getColor(this,
window.navigationBarColor = ContextCompat.getColor(this, R.color.colorBackground) R.color.colorBackground
)
window.navigationBarColor = ContextCompat.getColor(this,
R.color.colorBackground
)
} else { } else {
window.statusBarColor = ContextCompat.getColor(this, R.color.legacyBlack) window.statusBarColor = ContextCompat.getColor(this,
window.navigationBarColor = ContextCompat.getColor(this, R.color.legacyBlack) R.color.legacyBlack
)
window.navigationBarColor = ContextCompat.getColor(this,
R.color.legacyBlack
)
} }
} }
else -> { else -> {
window.navigationBarColor = ContextCompat.getColor(this, R.color.colorBackground) window.navigationBarColor = ContextCompat.getColor(this,
window.statusBarColor = ContextCompat.getColor(this, R.color.colorBackground) R.color.colorBackground
)
window.statusBarColor = ContextCompat.getColor(this,
R.color.colorBackground
)
// window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_VISIBLE // window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_VISIBLE
} }
} }
@@ -67,10 +80,14 @@ class FirstTime : AppCompatActivity(R.layout.activity_first_time) {
val helpCourses = findViewById<ImageButton>(R.id.chipHelpCourses) val helpCourses = findViewById<ImageButton>(R.id.chipHelpCourses)
helpClasses.setOnClickListener { helpClasses.setOnClickListener {
createDialog(getString(R.string.enterGradeHelpTitle), getString(R.string.enterGradeHelp)) createDialog(getString(R.string.enterGradeHelpTitle), getString(
R.string.enterGradeHelp
))
} }
helpCourses.setOnClickListener { helpCourses.setOnClickListener {
createDialog(getString(R.string.enterCoursesHelpTitle), getString(R.string.enterCoursesHelp)) createDialog(getString(R.string.enterCoursesHelpTitle), getString(
R.string.enterCoursesHelp
))
} }
val inflater = this.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater val inflater = this.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
@@ -103,7 +120,9 @@ class FirstTime : AppCompatActivity(R.layout.activity_first_time) {
inflater.inflate(R.layout.welcome_screen, linearInflation, true) inflater.inflate(R.layout.welcome_screen, linearInflation, true)
val anim = ViewAnimationUtils.createCircularReveal(linearInflation, x, y, 0F, endRadius.toFloat()) val anim = ViewAnimationUtils.createCircularReveal(linearInflation, x, y, 0F, endRadius.toFloat())
val handler = Handler() val handler = Handler()
val animOut = AnimationUtils.loadAnimation(context, R.anim.fade_out_short) val animOut = AnimationUtils.loadAnimation(context,
R.anim.fade_out_short
)
anim.duration = 600 anim.duration = 600
val colour = findViewById<LinearLayout>(R.id.colourLayout) val colour = findViewById<LinearLayout>(R.id.colourLayout)
linearInflation.visibility = View.VISIBLE linearInflation.visibility = View.VISIBLE
@@ -137,7 +156,9 @@ class FirstTime : AppCompatActivity(R.layout.activity_first_time) {
} }
private fun createDialog(title: String, text: String) { private fun createDialog(title: String, text: String) {
val alertDialog = AlertDialog.Builder(context, R.style.AlertDialog) val alertDialog = AlertDialog.Builder(context,
R.style.AlertDialog
)
val dialogView = LayoutInflater.from(context).inflate(R.layout.simple_dialog, null) val dialogView = LayoutInflater.from(context).inflate(R.layout.simple_dialog, null)
val dialogTitle = dialogView.findViewById<TextView>(R.id.textviewtitle) val dialogTitle = dialogView.findViewById<TextView>(R.id.textviewtitle)
val dialogText = dialogView.findViewById<TextView>(R.id.dialogtext) val dialogText = dialogView.findViewById<TextView>(R.id.dialogtext)
@@ -1,4 +1,4 @@
package com.denizd.substitutionplan package com.denizd.substitutionplan.activities
import android.app.job.JobInfo import android.app.job.JobInfo
import android.app.job.JobScheduler import android.app.job.JobScheduler
@@ -20,16 +20,21 @@ import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentTransaction import androidx.fragment.app.FragmentTransaction
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.crashlytics.android.Crashlytics import com.crashlytics.android.Crashlytics
import com.denizd.substitutionplan.data.MiscData
import com.denizd.substitutionplan.R
import com.denizd.substitutionplan.fragments.FoodFragment
import com.denizd.substitutionplan.fragments.GeneralPlanFragment
import com.denizd.substitutionplan.fragments.PersonalPlanFragment
import com.denizd.substitutionplan.fragments.SettingsFragment
import com.denizd.substitutionplan.services.FBPingService
import com.google.android.material.appbar.AppBarLayout import com.google.android.material.appbar.AppBarLayout
import com.google.android.material.bottomnavigation.BottomNavigationView import com.google.android.material.bottomnavigation.BottomNavigationView
import com.google.android.material.snackbar.Snackbar import com.google.android.material.snackbar.Snackbar
import com.google.firebase.FirebaseApp
import com.google.firebase.messaging.FirebaseMessaging
import com.jaredrummler.android.device.DeviceName import com.jaredrummler.android.device.DeviceName
import java.lang.IllegalArgumentException import java.lang.IllegalArgumentException
import java.util.* import java.util.*
class Main : AppCompatActivity(R.layout.app_bar_main) { internal class Main : AppCompatActivity(R.layout.app_bar_main) {
private lateinit var context: Context private lateinit var context: Context
private lateinit var prefs: SharedPreferences private lateinit var prefs: SharedPreferences
@@ -71,17 +76,29 @@ class Main : AppCompatActivity(R.layout.app_bar_main) {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO) AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
window.statusBarColor = ContextCompat.getColor(this, R.color.colorBackground) window.statusBarColor = ContextCompat.getColor(this,
window.navigationBarColor = ContextCompat.getColor(this, R.color.colorBackground) R.color.colorBackground
)
window.navigationBarColor = ContextCompat.getColor(this,
R.color.colorBackground
)
} else { } else {
window.statusBarColor = ContextCompat.getColor(this, R.color.legacyBlack) window.statusBarColor = ContextCompat.getColor(this,
window.navigationBarColor = ContextCompat.getColor(this, R.color.legacyBlack) R.color.legacyBlack
)
window.navigationBarColor = ContextCompat.getColor(this,
R.color.legacyBlack
)
} }
} }
else -> { else -> {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES) AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
window.navigationBarColor = ContextCompat.getColor(this, R.color.colorBackground) window.navigationBarColor = ContextCompat.getColor(this,
window.statusBarColor = ContextCompat.getColor(this, R.color.colorBackground) R.color.colorBackground
)
window.statusBarColor = ContextCompat.getColor(this,
R.color.colorBackground
)
} }
// else -> { // else -> {
// when (context.resources.configuration.uiMode) { // when (context.resources.configuration.uiMode) {
@@ -114,7 +131,9 @@ class Main : AppCompatActivity(R.layout.app_bar_main) {
if (info.manufacturer.contains("Huawei") || if (info.manufacturer.contains("Huawei") ||
info.manufacturer.contains("Honor") || info.manufacturer.contains("Honor") ||
info.manufacturer.contains("Xiaomi")) { 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 dialogView = LayoutInflater.from(context).inflate(R.layout.secret_dialog, null)
val title = dialogView.findViewById<TextView>(R.id.textviewtitle) val title = dialogView.findViewById<TextView>(R.id.textviewtitle)
title.text = getString(R.string.chineseDevicesTitle) title.text = getString(R.string.chineseDevicesTitle)
@@ -223,16 +242,24 @@ class Main : AppCompatActivity(R.layout.app_bar_main) {
val gen = Random() val gen = Random()
return String.format(when (Calendar.getInstance().get(Calendar.HOUR_OF_DAY)) { return String.format(when (Calendar.getInstance().get(Calendar.HOUR_OF_DAY)) {
in 5..10 -> resources.getStringArray(R.array.greetingsMorning)[gen.nextInt(resources.getStringArray(R.array.greetingsMorning).size)] in 5..10 -> resources.getStringArray(R.array.greetingsMorning)[gen.nextInt(resources.getStringArray(
in 11..17 -> resources.getStringArray(R.array.greetingsNoon)[gen.nextInt(resources.getStringArray(R.array.greetingsNoon).size)] R.array.greetingsMorning
else -> resources.getStringArray(R.array.greetingsEvening)[gen.nextInt(resources.getStringArray(R.array.greetingsEvening).size)] ).size)]
in 11..17 -> resources.getStringArray(R.array.greetingsNoon)[gen.nextInt(resources.getStringArray(
R.array.greetingsNoon
).size)]
else -> resources.getStringArray(R.array.greetingsEvening)[gen.nextInt(resources.getStringArray(
R.array.greetingsEvening
).size)]
}, prefs.getString("username", "")) }, prefs.getString("username", ""))
} }
private fun openInfoDialog() { private fun openInfoDialog() {
val dialog = AlertDialog.Builder(context) val dialog = AlertDialog.Builder(context)
val dialogView = LayoutInflater.from(context).inflate(R.layout.simple_dialog, null) val dialogView = LayoutInflater.from(context).inflate(R.layout.simple_dialog, null)
dialogView.findViewById<TextView>(R.id.textviewtitle).text = getString(R.string.information) dialogView.findViewById<TextView>(R.id.textviewtitle).text = getString(
R.string.information
)
val dialogText = "${getString(R.string.lastUpdated)} ${prefs.getString("timeNew", "")}.\n\n${prefs.getString("informational", "")}" val dialogText = "${getString(R.string.lastUpdated)} ${prefs.getString("timeNew", "")}.\n\n${prefs.getString("informational", "")}"
dialogView.findViewById<TextView>(R.id.dialogtext).text = dialogText dialogView.findViewById<TextView>(R.id.dialogtext).text = dialogText
dialog.setView(dialogView).show() dialog.setView(dialogView).show()
@@ -1,4 +1,4 @@
package com.denizd.substitutionplan package com.denizd.substitutionplan.adapters
import android.content.ActivityNotFoundException import android.content.ActivityNotFoundException
import android.net.Uri import android.net.Uri
@@ -14,10 +14,13 @@ import android.widget.Toast
import androidx.browser.customtabs.CustomTabsIntent import androidx.browser.customtabs.CustomTabsIntent
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.denizd.substitutionplan.data.MiscData
import com.denizd.substitutionplan.R
import com.denizd.substitutionplan.models.Subst
import com.google.android.material.card.MaterialCardView import com.google.android.material.card.MaterialCardView
import java.util.* import java.util.*
class CardAdapter(private var mSubst: List<Subst>) : RecyclerView.Adapter<CardAdapter.CardViewHolder>() { internal class CardAdapter(private var mSubst: List<Subst>) : RecyclerView.Adapter<CardAdapter.CardViewHolder>() {
private var colour = 0 private var colour = 0
private var colourString = "" private var colourString = ""
@@ -70,7 +73,11 @@ class CardAdapter(private var mSubst: List<Subst>) : RecyclerView.Adapter<CardAd
} }
} }
holder.mImageView.setImageResource(MiscData.getIconForCourse(currentItem.course)) holder.mImageView.setImageResource(
MiscData.getIconForCourse(
currentItem.course
)
)
holder.mGroup.setText(strings[0], TextView.BufferType.SPANNABLE) holder.mGroup.setText(strings[0], TextView.BufferType.SPANNABLE)
holder.mTime.setText(strings[1], TextView.BufferType.SPANNABLE) holder.mTime.setText(strings[1], TextView.BufferType.SPANNABLE)
holder.mCourse.setText(strings[2], TextView.BufferType.SPANNABLE) holder.mCourse.setText(strings[2], TextView.BufferType.SPANNABLE)
@@ -83,7 +90,9 @@ class CardAdapter(private var mSubst: List<Subst>) : RecyclerView.Adapter<CardAd
holder.mDate.text = currentItem.date holder.mDate.text = currentItem.date
holder.mTime.text = " " holder.mTime.text = " "
holder.mImageView.setImageResource(R.drawable.ic_idea) holder.mImageView.setImageResource(R.drawable.ic_idea)
holder.mCard.setCardBackgroundColor(ContextCompat.getColor(holder.mImageView.context, R.color.colorAccent)) holder.mCard.setCardBackgroundColor(ContextCompat.getColor(holder.mImageView.context,
R.color.colorAccent
))
} else { } else {
holder.mDate.visibility = View.VISIBLE holder.mDate.visibility = View.VISIBLE
holder.mDate.text = currentItem.date holder.mDate.text = currentItem.date
@@ -100,7 +109,9 @@ class CardAdapter(private var mSubst: List<Subst>) : RecyclerView.Adapter<CardAd
if (colour != 0) { if (colour != 0) {
holder.mCard.setCardBackgroundColor(ContextCompat.getColor(holder.mCourse.context, colour)) holder.mCard.setCardBackgroundColor(ContextCompat.getColor(holder.mCourse.context, colour))
} else { } else {
holder.mCard.setCardBackgroundColor(ContextCompat.getColor(holder.mCourse.context, R.color.colorBackgroundLight)) holder.mCard.setCardBackgroundColor(ContextCompat.getColor(holder.mCourse.context,
R.color.colorBackgroundLight
))
} }
} }
@@ -1,4 +1,4 @@
package com.denizd.substitutionplan package com.denizd.substitutionplan.adapters
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
@@ -7,9 +7,11 @@ import android.widget.ImageView
import android.widget.TextView import android.widget.TextView
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.denizd.substitutionplan.models.Colour
import com.denizd.substitutionplan.R
import com.google.android.material.card.MaterialCardView import com.google.android.material.card.MaterialCardView
class ColourAdapter(private var mColours: List<Colour>, onClickListener: OnClickListener) : RecyclerView.Adapter<ColourAdapter.ColourViewHolder>() { internal class ColourAdapter(private var mColours: List<Colour>, onClickListener: OnClickListener) : RecyclerView.Adapter<ColourAdapter.ColourViewHolder>() {
val mOnClickListener = onClickListener val mOnClickListener = onClickListener
@@ -27,7 +29,10 @@ class ColourAdapter(private var mColours: List<Colour>, onClickListener: OnClick
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ColourViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ColourViewHolder {
val v = LayoutInflater.from(parent.context).inflate(R.layout.list_item, parent, false) val v = LayoutInflater.from(parent.context).inflate(R.layout.list_item, parent, false)
return ColourViewHolder(v, mOnClickListener) return ColourViewHolder(
v,
mOnClickListener
)
} }
override fun onBindViewHolder(holder: ColourViewHolder, position: Int) { override fun onBindViewHolder(holder: ColourViewHolder, position: Int) {
@@ -1,4 +1,4 @@
package com.denizd.substitutionplan package com.denizd.substitutionplan.adapters
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
@@ -7,16 +7,14 @@ import android.widget.TextView
import java.util.ArrayList import java.util.ArrayList
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.denizd.substitutionplan.models.Food
import com.denizd.substitutionplan.R
class FoodAdapter(food: ArrayList<Food>) : RecyclerView.Adapter<FoodAdapter.CardViewHolder>() { internal class FoodAdapter(food: ArrayList<Food>) : RecyclerView.Adapter<FoodAdapter.CardViewHolder>() {
private var mFood: List<Food>? = null private var mFood: List<Food>? = null
class CardViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { class CardViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
var mFood: TextView var mFood: TextView = itemView.findViewById(R.id.cardInfoText)
init {
mFood = itemView.findViewById(R.id.cardInfoText)
}
} }
init { init {
@@ -1,4 +1,4 @@
package com.denizd.substitutionplan package com.denizd.substitutionplan.adapters
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
@@ -6,17 +6,19 @@ import android.view.ViewGroup
import android.widget.TextView import android.widget.TextView
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.denizd.substitutionplan.R
import com.denizd.substitutionplan.models.Ringtone
import com.google.android.material.card.MaterialCardView import com.google.android.material.card.MaterialCardView
class RingtoneAdapter(private var _ringtones: List<Ringtone>, onClickListener: OnClickListener) : RecyclerView.Adapter<RingtoneAdapter.RingtoneViewHolder>() { internal class RingtoneAdapter(private var _ringtones: List<Ringtone>, onClickListener: OnClickListener) : RecyclerView.Adapter<RingtoneAdapter.RingtoneViewHolder>() {
val _onClickListener = onClickListener private val _onClickListener = onClickListener
class RingtoneViewHolder(view: View, clickListener: OnClickListener) : RecyclerView.ViewHolder(view), View.OnClickListener { class RingtoneViewHolder(view: View, clickListener: OnClickListener) : RecyclerView.ViewHolder(view), View.OnClickListener {
val name: TextView = view.findViewById(R.id.item_text) val name: TextView = view.findViewById(R.id.item_text)
val uri: TextView = view.findViewById(R.id.item_text_no_lang) val uri: TextView = view.findViewById(R.id.item_text_no_lang)
val cardView: MaterialCardView = view.findViewById(R.id.cardView) val cardView: MaterialCardView = view.findViewById(R.id.cardView)
val _clickListener = clickListener private val _clickListener = clickListener
init { view.setOnClickListener(this) } init { view.setOnClickListener(this) }
override fun onClick(v: View?) { _clickListener.onRingtoneClick(adapterPosition, name.text.toString(), uri.text.toString()) } override fun onClick(v: View?) { _clickListener.onRingtoneClick(adapterPosition, name.text.toString(), uri.text.toString()) }
@@ -25,7 +27,10 @@ class RingtoneAdapter(private var _ringtones: List<Ringtone>, onClickListener: O
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RingtoneViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RingtoneViewHolder {
val v = LayoutInflater.from(parent.context).inflate(R.layout.list_item, parent, false) val v = LayoutInflater.from(parent.context).inflate(R.layout.list_item, parent, false)
return RingtoneViewHolder(v, _onClickListener) return RingtoneViewHolder(
v,
_onClickListener
)
} }
override fun onBindViewHolder(holder: RingtoneViewHolder, position: Int) { override fun onBindViewHolder(holder: RingtoneViewHolder, position: Int) {
@@ -33,7 +38,9 @@ class RingtoneAdapter(private var _ringtones: List<Ringtone>, onClickListener: O
holder.name.text = currentItem.name holder.name.text = currentItem.name
holder.uri.text = currentItem.uri holder.uri.text = currentItem.uri
holder.cardView.setCardBackgroundColor(ContextCompat.getColor(holder.cardView.context, R.color.colorBackground)) holder.cardView.setCardBackgroundColor(ContextCompat.getColor(holder.cardView.context,
R.color.colorBackground
))
} }
override fun getItemCount(): Int = _ringtones.size override fun getItemCount(): Int = _ringtones.size
@@ -1,4 +1,4 @@
package com.denizd.substitutionplan package com.denizd.substitutionplan.data
import android.app.* import android.app.*
import android.content.Context import android.content.Context
@@ -13,6 +13,12 @@ import android.widget.RemoteViews
import androidx.core.app.NotificationCompat import androidx.core.app.NotificationCompat
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
import com.denizd.substitutionplan.database.FoodRepository
import com.denizd.substitutionplan.R
import com.denizd.substitutionplan.database.SubstRepository
import com.denizd.substitutionplan.activities.Main
import com.denizd.substitutionplan.models.Food
import com.denizd.substitutionplan.models.Subst
import com.google.android.material.snackbar.Snackbar import com.google.android.material.snackbar.Snackbar
import org.jsoup.Jsoup import org.jsoup.Jsoup
import kotlin.collections.ArrayList import kotlin.collections.ArrayList
@@ -26,7 +32,7 @@ import kotlin.collections.ArrayList
* @param isMenu food menu will be downloaded and persisted in the database if true * @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 * @param isJobService a notification will be prepared and sent if this and isPlan is true
*/ */
class DataFetcher(isPlan: Boolean, isMenu: Boolean, isJobService: Boolean, context: Context, application: Application, parentView: View?) : AsyncTask<Void, Void, Void>() { internal class DataFetcher(isPlan: Boolean, isMenu: Boolean, isJobService: Boolean, context: Context, application: Application, parentView: View?) : AsyncTask<Void, Void, Void>() {
private var jobService = isJobService private var jobService = isJobService
private var plan = isPlan private var plan = isPlan
@@ -47,11 +53,12 @@ class DataFetcher(isPlan: Boolean, isMenu: Boolean, isJobService: Boolean, conte
override fun doInBackground(vararg params: Void?): Void? { override fun doInBackground(vararg params: Void?): Void? {
try { try {
when { if (prefs.getBoolean("testUrls", false)) {
prefs.getBoolean("testUrls", false) -> {
substUrl = "https://djd4rkn355.github.io/subst_test.html" substUrl = "https://djd4rkn355.github.io/subst_test.html"
foodUrl = "https://djd4rkn355.github.io/food_test.html" foodUrl = "https://djd4rkn355.github.io/food_test.html"
} }
when {
menu -> requestFoodMenuData() menu -> requestFoodMenuData()
plan -> requestSubstPlanAndNotification() plan -> requestSubstPlanAndNotification()
} }
@@ -69,7 +76,9 @@ class DataFetcher(isPlan: Boolean, isMenu: Boolean, isJobService: Boolean, conte
} catch (e: Exception) { } catch (e: Exception) {
mView?.let { v: View -> mView?.let { v: View ->
val snackBarView = v.findViewById<View>(R.id.coordination) val snackBarView = v.findViewById<View>(R.id.coordination)
Snackbar.make(snackBarView, mContext.getString(R.string.noInternet), Snackbar.LENGTH_LONG).setBackgroundTint(ContextCompat.getColor(mContext, R.color.colorError)).show() Snackbar.make(snackBarView, mContext.getString(R.string.noInternet), Snackbar.LENGTH_LONG).setBackgroundTint(ContextCompat.getColor(mContext,
R.color.colorError
)).show()
} }
} }
return null return null
@@ -143,15 +152,24 @@ class DataFetcher(isPlan: Boolean, isMenu: Boolean, isJobService: Boolean, conte
val group = cols[0].text() val group = cols[0].text()
val course = cols[3].text() val course = cols[3].text()
val additional = cols[5].text() val additional = cols[5].text()
val subst = Subst(group = group, date = cols[1].text(), time = cols[2].text(), course = course, val subst = Subst(
room = cols[4].text(), additional = additional, priority = priority) group = group, date = cols[1].text(), time = cols[2].text(), course = course,
room = cols[4].text(), additional = additional, priority = priority
)
substArray.add(subst) substArray.add(subst)
substRepo.insert(subst) substRepo.insert(subst)
priority-- priority--
} }
if (jobService && prefs.getBoolean("notif", true)) { if (jobService && prefs.getBoolean("notif", true)) {
substArray.filter { MiscData.checkPersonalSubstitutions(it, coursePreference, classPreference, false) }.forEach { substItem -> substArray.filter {
MiscData.checkPersonalSubstitutions(
it,
coursePreference,
classPreference,
false
)
}.forEach { substItem ->
notifText += "${if (notifText.isNotEmpty()) ",\n" else ""}$substItem.course: ${if (substItem.additional.isNotEmpty()) substItem.additional else "---"}" notifText += "${if (notifText.isNotEmpty()) ",\n" else ""}$substItem.course: ${if (substItem.additional.isNotEmpty()) substItem.additional else "---"}"
} }
} }
@@ -170,21 +188,30 @@ class DataFetcher(isPlan: Boolean, isMenu: Boolean, isJobService: Boolean, conte
openApp.flags += Intent.FLAG_ACTIVITY_CLEAR_TASK openApp.flags += Intent.FLAG_ACTIVITY_CLEAR_TASK
val openAppPending = PendingIntent.getActivity(mContext, 0, openApp, 0) val openAppPending = PendingIntent.getActivity(mContext, 0, openApp, 0)
val notificationLayout = RemoteViews(mContext.packageName, R.layout.notification) val notificationLayout = RemoteViews(mContext.packageName,
notificationLayout.setTextViewText(R.id.notification_title, mContext.getString(R.string.substitutionPlan)) R.layout.notification
)
notificationLayout.setTextViewText(
R.id.notification_title, mContext.getString(
R.string.substitutionPlan
))
notificationLayout.setTextViewText(R.id.notification_textview, notifText) notificationLayout.setTextViewText(R.id.notification_textview, notifText)
val manager = mContext.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager val manager = mContext.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
MiscData.getNotificationChannel(mContext, prefs) MiscData.getNotificationChannel(mContext, prefs)
val notification = NotificationCompat.Builder(mContext, MiscData.notificationChannelId) val notification = NotificationCompat.Builder(mContext,
MiscData.notificationChannelId
)
.setStyle(NotificationCompat.DecoratedCustomViewStyle()) .setStyle(NotificationCompat.DecoratedCustomViewStyle())
.setCustomContentView(notificationLayout) .setCustomContentView(notificationLayout)
.setSmallIcon(R.drawable.ic_avh) .setSmallIcon(R.drawable.ic_avh)
.setContentIntent(openAppPending) .setContentIntent(openAppPending)
.setAutoCancel(true) .setAutoCancel(true)
.setColor(ContextCompat.getColor(mContext, R.color.colorAccent)) .setColor(ContextCompat.getColor(mContext,
R.color.colorAccent
))
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
val sound = if ((prefs.getString("ringtoneUri", "") ?: "").isNotEmpty()) { val sound = if ((prefs.getString("ringtoneUri", "") ?: "").isNotEmpty()) {
@@ -1,4 +1,4 @@
package com.denizd.substitutionplan package com.denizd.substitutionplan.data
import android.annotation.TargetApi import android.annotation.TargetApi
import android.app.NotificationChannel import android.app.NotificationChannel
@@ -6,9 +6,11 @@ import android.app.NotificationManager
import android.content.Context import android.content.Context
import android.content.SharedPreferences import android.content.SharedPreferences
import android.graphics.Color import android.graphics.Color
import com.denizd.substitutionplan.R
import com.denizd.substitutionplan.models.Subst
import java.util.* import java.util.*
object MiscData { internal object MiscData {
val languageIndependentCourses = arrayOf("German", "English", "French", "Spanish", "Latin", "Turkish", "Chinese", "Arts", "Music", val languageIndependentCourses = arrayOf("German", "English", "French", "Spanish", "Latin", "Turkish", "Chinese", "Arts", "Music",
"Theatre", "Geography", "History", "Politics", "Philosophy", "Religion", "Maths", "Biology", "Chemistry", "Theatre", "Geography", "History", "Politics", "Philosophy", "Religion", "Maths", "Biology", "Chemistry",
@@ -16,10 +18,31 @@ object MiscData {
val colourNames = arrayOf("default", "red", "orange", "yellow", "green", "teal", "cyan", "blue", "purple", "pink", val colourNames = arrayOf("default", "red", "orange", "yellow", "green", "teal", "cyan", "blue", "purple", "pink",
"brown", "grey", "pureWhite", "salmon", "tangerine", "banana", "flora", "spindrift", "sky", "orchid", "brown", "grey", "pureWhite", "salmon", "tangerine", "banana", "flora", "spindrift", "sky", "orchid",
"lavender", "carnation", "brown2", "pureBlack") "lavender", "carnation", "brown2", "pureBlack")
private val colourIntegers = intArrayOf(0, R.color.bgRed, R.color.bgOrange, R.color.bgYellow, R.color.bgGreen, private val colourIntegers = intArrayOf(0,
R.color.bgTeal, R.color.bgCyan, R.color.bgBlue, R.color.bgPurple, R.color.bgPink, R.color.bgBrown, R.color.bgGrey, R.color.bgRed,
R.color.bgPureWhite, R.color.bgSalmon, R.color.bgTangerine, R.color.bgBanana, R.color.bgFlora, R.color.bgSpindrift, R.color.bgOrange,
R.color.bgSky, R.color.bgOrchid, R.color.bgLavender, R.color.bgCarnation, R.color.bgBrown2, R.color.bgPureBlack) R.color.bgYellow,
R.color.bgGreen,
R.color.bgTeal,
R.color.bgCyan,
R.color.bgBlue,
R.color.bgPurple,
R.color.bgPink,
R.color.bgBrown,
R.color.bgGrey,
R.color.bgPureWhite,
R.color.bgSalmon,
R.color.bgTangerine,
R.color.bgBanana,
R.color.bgFlora,
R.color.bgSpindrift,
R.color.bgSky,
R.color.bgOrchid,
R.color.bgLavender,
R.color.bgCarnation,
R.color.bgBrown2,
R.color.bgPureBlack
)
const val notificationChannelId = "general" const val notificationChannelId = "general"
fun getColourForString(name: String): Int { fun getColourForString(name: String): Int {
@@ -128,7 +151,10 @@ object MiscData {
fun getNotificationChannel(context: Context, prefs: SharedPreferences): NotificationChannel { fun getNotificationChannel(context: Context, prefs: SharedPreferences): NotificationChannel {
val manager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager val manager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
return if (!prefs.getBoolean("notifChannelCreated", false)) { return if (!prefs.getBoolean("notifChannelCreated", false)) {
val channel = NotificationChannel(notificationChannelId, context.getString(R.string.general), NotificationManager.IMPORTANCE_DEFAULT) val channel = NotificationChannel(
notificationChannelId, context.getString(
R.string.general
), NotificationManager.IMPORTANCE_DEFAULT)
channel.enableLights(true) channel.enableLights(true)
channel.lightColor = Color.BLUE channel.lightColor = Color.BLUE
manager.createNotificationChannel(channel) manager.createNotificationChannel(channel)
@@ -1,17 +1,18 @@
package com.denizd.substitutionplan package com.denizd.substitutionplan.database
import android.app.Application import android.app.Application
import android.os.AsyncTask import android.os.AsyncTask
import androidx.lifecycle.LiveData import androidx.lifecycle.LiveData
import com.denizd.substitutionplan.models.Food
public class FoodRepository(application: Application) { internal class FoodRepository(application: Application) {
private val substDao: SubstDao? private val substDao: SubstDao?
val allFoods: LiveData<List<Food>>? val allFoods: LiveData<List<Food>>?
init { init {
val database = SubstDatabase.getFoodInstance(application) val database =
SubstDatabase.getFoodInstance(application)
substDao = database?.substDao() substDao = database?.substDao()
allFoods = substDao?.allFoods allFoods = substDao?.allFoods
} }
@@ -1,12 +1,14 @@
package com.denizd.substitutionplan package com.denizd.substitutionplan.database
import android.app.Application import android.app.Application
import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.LiveData import androidx.lifecycle.LiveData
import com.denizd.substitutionplan.models.Food
public class FoodViewModel(application: Application) : AndroidViewModel(application) { internal class FoodViewModel(application: Application) : AndroidViewModel(application) {
private val repository: FoodRepository = FoodRepository(application) private val repository: FoodRepository =
FoodRepository(application)
val allFoods: LiveData<List<Food>>? val allFoods: LiveData<List<Food>>?
init { init {
@@ -1,10 +1,12 @@
package com.denizd.substitutionplan package com.denizd.substitutionplan.database
import androidx.lifecycle.LiveData import androidx.lifecycle.LiveData
import androidx.room.* import androidx.room.*
import com.denizd.substitutionplan.models.Food
import com.denizd.substitutionplan.models.Subst
@Dao @Dao
public interface SubstDao { internal interface SubstDao {
@get:Query("SELECT * FROM subst_table ORDER BY priority DESC") @get:Query("SELECT * FROM subst_table ORDER BY priority DESC")
val allSubst: LiveData<List<Subst>> val allSubst: LiveData<List<Subst>>
@@ -1,12 +1,14 @@
package com.denizd.substitutionplan package com.denizd.substitutionplan.database
import android.content.Context import android.content.Context
import androidx.room.Database import androidx.room.Database
import androidx.room.Room import androidx.room.Room
import androidx.room.RoomDatabase import androidx.room.RoomDatabase
import com.denizd.substitutionplan.models.Food
import com.denizd.substitutionplan.models.Subst
@Database(entities = [Subst::class, Food::class], version = 5, exportSchema = false) @Database(entities = [Subst::class, Food::class], version = 5, exportSchema = false)
public abstract class SubstDatabase : RoomDatabase() { internal abstract class SubstDatabase : RoomDatabase() {
abstract fun substDao(): SubstDao abstract fun substDao(): SubstDao
@@ -1,17 +1,19 @@
package com.denizd.substitutionplan package com.denizd.substitutionplan.database
import android.app.Application import android.app.Application
import android.os.AsyncTask import android.os.AsyncTask
import androidx.lifecycle.LiveData import androidx.lifecycle.LiveData
import com.denizd.substitutionplan.models.Subst
public class SubstRepository(application: Application) { internal class SubstRepository(application: Application) {
private val substDao: SubstDao? private val substDao: SubstDao?
val allSubst: LiveData<List<Subst>>? val allSubst: LiveData<List<Subst>>?
init { init {
val database = SubstDatabase.getInstance(application) val database =
SubstDatabase.getInstance(application)
substDao = database?.substDao() substDao = database?.substDao()
allSubst = substDao?.allSubst allSubst = substDao?.allSubst
} }
@@ -1,12 +1,14 @@
package com.denizd.substitutionplan package com.denizd.substitutionplan.database
import android.app.Application import android.app.Application
import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.LiveData import androidx.lifecycle.LiveData
import com.denizd.substitutionplan.models.Subst
public class SubstViewModel(application: Application) : AndroidViewModel(application) { internal class SubstViewModel(application: Application) : AndroidViewModel(application) {
private val repository: SubstRepository = SubstRepository(application) private val repository: SubstRepository =
SubstRepository(application)
val allSubst: LiveData<List<Subst>>? val allSubst: LiveData<List<Subst>>?
init { init {
@@ -1,4 +1,4 @@
package com.denizd.substitutionplan package com.denizd.substitutionplan.fragments
import android.content.Context import android.content.Context
import android.content.SharedPreferences import android.content.SharedPreferences
@@ -11,8 +11,13 @@ import androidx.lifecycle.ViewModelProviders
import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
import com.denizd.substitutionplan.*
import com.denizd.substitutionplan.adapters.FoodAdapter
import com.denizd.substitutionplan.database.FoodViewModel
import com.denizd.substitutionplan.models.Food
import com.denizd.substitutionplan.data.DataFetcher
class FoodFragment : Fragment(R.layout.food_layout) { internal class FoodFragment : Fragment(R.layout.food_layout) {
private val foodArrayList = ArrayList<Food>() private val foodArrayList = ArrayList<Food>()
private val mAdapter = FoodAdapter(foodArrayList) private val mAdapter = FoodAdapter(foodArrayList)
@@ -57,12 +62,26 @@ class FoodFragment : Fragment(R.layout.food_layout) {
if (prefs.getBoolean("autoRefresh", false)) { if (prefs.getBoolean("autoRefresh", false)) {
pullToRefresh.isRefreshing = true pullToRefresh.isRefreshing = true
DataFetcher(false, true, false, mContext, activity!!.application, view.rootView).execute() DataFetcher(
false,
true,
false,
mContext,
activity!!.application,
view.rootView
).execute()
} }
pullToRefresh.setOnRefreshListener { pullToRefresh.setOnRefreshListener {
pullToRefresh.isRefreshing = true pullToRefresh.isRefreshing = true
DataFetcher(false, true, false, mContext, activity!!.application, view.rootView).execute() DataFetcher(
false,
true,
false,
mContext,
activity!!.application,
view.rootView
).execute()
} }
} }
} }
@@ -1,10 +1,11 @@
package com.denizd.substitutionplan package com.denizd.substitutionplan.fragments
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import androidx.lifecycle.Observer import androidx.lifecycle.Observer
import com.denizd.substitutionplan.models.Subst
class GeneralPlanFragment : PlanFragment() { internal class GeneralPlanFragment : PlanFragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
@@ -1,10 +1,13 @@
package com.denizd.substitutionplan package com.denizd.substitutionplan.fragments
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import androidx.lifecycle.Observer import androidx.lifecycle.Observer
import com.denizd.substitutionplan.data.MiscData
import com.denizd.substitutionplan.R
import com.denizd.substitutionplan.models.Subst
class PersonalPlanFragment : PlanFragment() { internal class PersonalPlanFragment : PlanFragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
@@ -24,7 +27,14 @@ class PersonalPlanFragment : PlanFragment() {
persPlanEmpty = true persPlanEmpty = true
recyclerView.visibility = View.VISIBLE recyclerView.visibility = View.VISIBLE
substitutions.filter { MiscData.checkPersonalSubstitutions(it, coursePreference, classPreference, true) }.forEach { substItem -> substitutions.filter {
MiscData.checkPersonalSubstitutions(
it,
coursePreference,
classPreference,
true
)
}.forEach { substItem ->
planCardList.add(substItem) planCardList.add(substItem)
} }
persPlanEmpty = (planCardList.size == 1 && planCardList[0].date.substring(0, 3) == "psa") || planCardList.isEmpty() persPlanEmpty = (planCardList.size == 1 && planCardList[0].date.substring(0, 3) == "psa") || planCardList.isEmpty()
@@ -1,4 +1,4 @@
package com.denizd.substitutionplan package com.denizd.substitutionplan.fragments
import android.content.Context import android.content.Context
import android.content.SharedPreferences import android.content.SharedPreferences
@@ -14,9 +14,14 @@ import androidx.lifecycle.ViewModelProviders
import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
import com.denizd.substitutionplan.*
import com.denizd.substitutionplan.adapters.CardAdapter
import com.denizd.substitutionplan.database.SubstViewModel
import com.denizd.substitutionplan.models.Subst
import com.denizd.substitutionplan.data.DataFetcher
import kotlin.collections.ArrayList import kotlin.collections.ArrayList
open class PlanFragment : Fragment(R.layout.plan) { internal open class PlanFragment : Fragment(R.layout.plan) {
lateinit var recyclerView: RecyclerView lateinit var recyclerView: RecyclerView
lateinit var mAdapter: CardAdapter lateinit var mAdapter: CardAdapter
private lateinit var layoutManager: GridLayoutManager private lateinit var layoutManager: GridLayoutManager
@@ -56,38 +61,31 @@ open class PlanFragment : Fragment(R.layout.plan) {
recyclerView.adapter = mAdapter recyclerView.adapter = mAdapter
if (prefs.getInt("firstTimeOpening", 0) == 1) { if (prefs.getInt("firstTimeOpening", 0) == 1) {
if (!prefs.getBoolean("notif", false)) { startFetch(view, pullToRefresh, true)
pullToRefresh.isRefreshing = true
DataFetcher(true, true, false, mContext, activity!!.application, view.rootView).execute()
prefs.edit().putInt("firstTimeOpening", 2).apply() prefs.edit().putInt("firstTimeOpening", 2).apply()
} }
}
if (prefs.getBoolean("autoRefresh", false)) { if (prefs.getBoolean("autoRefresh", false)) {
pullToRefresh.isRefreshing = true startFetch(view, pullToRefresh, false)
DataFetcher(
isPlan = true,
isMenu = false,
isJobService = false,
context = mContext,
application = activity!!.application,
parentView = view.rootView
).execute()
} }
substViewModel = ViewModelProviders.of(this).get(SubstViewModel::class.java) substViewModel = ViewModelProviders.of(this).get(SubstViewModel::class.java)
pullToRefresh.setOnRefreshListener { pullToRefresh.setOnRefreshListener {
startFetch(view, pullToRefresh, false)
}
}
private fun startFetch(view: View, pullToRefresh: SwipeRefreshLayout, refreshMenu: Boolean) {
pullToRefresh.isRefreshing = true pullToRefresh.isRefreshing = true
DataFetcher( DataFetcher(
isPlan = true, isPlan = true,
isMenu = false, isMenu = refreshMenu,
isJobService = false, isJobService = false,
context = mContext, context = mContext,
application = activity!!.application, application = activity!!.application,
parentView = view.rootView parentView = view.rootView
).execute() ).execute()
} }
}
private fun getGridColumnCount(config: Configuration): Int { private fun getGridColumnCount(config: Configuration): Int {
val tabletSize = resources.getBoolean(R.bool.isTablet) val tabletSize = resources.getBoolean(R.bool.isTablet)
@@ -1,4 +1,4 @@
package com.denizd.substitutionplan package com.denizd.substitutionplan.fragments
import android.content.ActivityNotFoundException import android.content.ActivityNotFoundException
import android.content.Context import android.content.Context
@@ -24,6 +24,12 @@ import androidx.core.content.ContextCompat
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView 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.MiscData
import com.denizd.substitutionplan.models.Colour
import com.denizd.substitutionplan.models.Ringtone
import com.google.android.material.bottomnavigation.BottomNavigationView import com.google.android.material.bottomnavigation.BottomNavigationView
import com.google.android.material.button.MaterialButton import com.google.android.material.button.MaterialButton
import com.google.android.material.textfield.TextInputEditText import com.google.android.material.textfield.TextInputEditText
@@ -31,8 +37,10 @@ import com.google.firebase.messaging.FirebaseMessaging
import com.jaredrummler.android.device.DeviceName import com.jaredrummler.android.device.DeviceName
import kotlin.collections.ArrayList import kotlin.collections.ArrayList
class SettingsFragment : Fragment(R.layout.content_settings), View.OnClickListener, internal class SettingsFragment : Fragment(R.layout.content_settings), View.OnClickListener,
CompoundButton.OnCheckedChangeListener, ColourAdapter.OnClickListener, RingtoneAdapter.OnClickListener { CompoundButton.OnCheckedChangeListener,
ColourAdapter.OnClickListener,
RingtoneAdapter.OnClickListener {
private var name = "" private var name = ""
private var model = "" private var model = ""
@@ -131,22 +139,26 @@ class SettingsFragment : Fragment(R.layout.content_settings), View.OnClickListen
}) })
btnVersion.setOnLongClickListener { btnVersion.setOnLongClickListener {
Toast.makeText(mContext, getString(R.string.madeBy), Toast.LENGTH_LONG).show() makeToast(getString(R.string.madeBy))
debugMenu() debugMenu()
} }
} }
override fun onClick(v: View?) { override fun onClick(v: View?) {
when (v?.id) { when (v?.id) {
R.id.chipHelpCourses -> createDialog(getString(R.string.enterCoursesHelpTitle), getString(R.string.enterCoursesHelp)) R.id.chipHelpCourses -> createDialog(getString(R.string.enterCoursesHelpTitle), getString(
R.id.chipHelpClasses -> createDialog(getString(R.string.enterGradeHelpTitle), getString(R.string.enterGradeHelp)) R.string.enterCoursesHelp
))
R.id.chipHelpClasses -> createDialog(getString(R.string.enterGradeHelpTitle), getString(
R.string.enterGradeHelp
))
R.id.btnCustomiseColours -> createColourDialog() R.id.btnCustomiseColours -> createColourDialog()
R.id.btnCustomiseRingtone -> createRingtoneDialog() R.id.btnCustomiseRingtone -> createRingtoneDialog()
R.id.btnWebsite -> { R.id.btnWebsite -> {
try { try {
customTabsIntent.launchUrl(mContext, Uri.parse("http://307.joomla.schule.bremen.de")) customTabsIntent.launchUrl(mContext, Uri.parse("http://307.joomla.schule.bremen.de"))
} catch (e: ActivityNotFoundException) { } catch (e: ActivityNotFoundException) {
Toast.makeText(mContext, getString(R.string.chromeCompatibleNotFound), Toast.LENGTH_LONG).show() makeToast(getString(R.string.chromeCompatibleNotFound))
} }
} }
R.id.btnLicences -> { R.id.btnLicences -> {
@@ -202,9 +214,9 @@ class SettingsFragment : Fragment(R.layout.content_settings), View.OnClickListen
try { try {
cs = 7 cs = 7
customTabsIntent.launchUrl(mContext, Uri.parse("http://www.flussufer.de/gerd/person.htm")) customTabsIntent.launchUrl(mContext, Uri.parse("http://www.flussufer.de/gerd/person.htm"))
Toast.makeText(mContext, getString(R.string.dontTellHim), Toast.LENGTH_LONG).show() makeToast(getString(R.string.dontTellHim))
} catch (e: ActivityNotFoundException) { } catch (e: ActivityNotFoundException) {
Toast.makeText(mContext, getString(R.string.chromeCompatibleNotFound), Toast.LENGTH_LONG).show() makeToast(getString(R.string.chromeCompatibleNotFound))
} }
} }
} }
@@ -260,7 +272,9 @@ class SettingsFragment : Fragment(R.layout.content_settings), View.OnClickListen
} }
private fun createDialog(title: String, text: String) { private fun createDialog(title: String, text: String) {
val alertDialog = AlertDialog.Builder(mContext, R.style.AlertDialog) val alertDialog = AlertDialog.Builder(mContext,
R.style.AlertDialog
)
val dialogView = LayoutInflater.from(mContext).inflate(R.layout.simple_dialog, null) val dialogView = LayoutInflater.from(mContext).inflate(R.layout.simple_dialog, null)
dialogView.findViewById<TextView>(R.id.textviewtitle).text = title dialogView.findViewById<TextView>(R.id.textviewtitle).text = title
dialogView.findViewById<TextView>(R.id.dialogtext).text = text dialogView.findViewById<TextView>(R.id.dialogtext).text = text
@@ -268,7 +282,9 @@ class SettingsFragment : Fragment(R.layout.content_settings), View.OnClickListen
} }
private fun createColourDialog() { 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 dialogView = LayoutInflater.from(mContext).inflate(R.layout.recycler_dialog, null)
val titleText = dialogView.findViewById<TextView>(R.id.empty_textviewtitle) val titleText = dialogView.findViewById<TextView>(R.id.empty_textviewtitle)
@@ -279,34 +295,49 @@ class SettingsFragment : Fragment(R.layout.content_settings), View.OnClickListen
colourRecycler.layoutManager = GridLayoutManager(mContext, 1) colourRecycler.layoutManager = GridLayoutManager(mContext, 1)
colourRecycler.adapter = ColourAdapter(getColourList(), this) colourRecycler.adapter = ColourAdapter(getColourList(), this)
// val button = LayoutInflater.from(mContext).inflate(R.layout.forever_alone_button, null)
// val buttonClearAll = button.findViewById<MaterialButton>(R.id.buttonclearallcolours)
// emptyLayout.addView(button)
colourCustomiserBuilder.setView(dialogView) colourCustomiserBuilder.setView(dialogView)
val colourCustomiserDialog = colourCustomiserBuilder.create() val colourCustomiserDialog = colourCustomiserBuilder.create()
//
// buttonClearAll.setOnClickListener {
// for (course in coursesNoLang) {
// edit.putInt("bg$course", 0)
// }
// edit.apply()
// Toast.makeText(mContext, getString(R.string.allcolourscleared),
// Toast.LENGTH_LONG).show()
// colourCustomiserDialog.cancel()
// }
colourCustomiserDialog.show() colourCustomiserDialog.show()
} }
private fun getColourList(): ArrayList<Colour> { private fun getColourList(): ArrayList<Colour> {
val colours = ArrayList<Colour>() val colours = ArrayList<Colour>()
val coursesNoLang = MiscData.languageIndependentCourses val coursesNoLang = MiscData.languageIndependentCourses
val courses = arrayOf(getString(R.string.courseDeu), getString(R.string.courseEng), getString(R.string.courseFra), getString(R.string.courseSpa), getString(R.string.courseLat), getString(R.string.courseTue), getString(R.string.courseChi), getString(R.string.courseKun), getString(R.string.courseMus), getString(R.string.courseDar), getString(R.string.courseGeg), getString(R.string.courseGes), getString(R.string.coursePol), getString(R.string.coursePhi), getString(R.string.courseRel), getString(R.string.courseMat), getString(R.string.courseBio), getString(R.string.courseChe), getString(R.string.coursePhy), getString(R.string.courseInf), getString(R.string.courseSpo), getString(R.string.courseGll), getString(R.string.courseWat), getString(R.string.courseFor), getString(R.string.courseWp)) val courses = arrayOf(getString(R.string.courseDeu), getString(
val coursesIcons = intArrayOf(R.drawable.ic_german, R.drawable.ic_english, R.drawable.ic_french, R.drawable.ic_spanish, R.drawable.ic_latin, R.drawable.ic_turkish, R.drawable.ic_chinese, R.drawable.ic_arts, R.drawable.ic_music, R.drawable.ic_drama, R.drawable.ic_geography, R.drawable.ic_history, R.drawable.ic_politics, R.drawable.ic_philosophy, R.drawable.ic_religion, R.drawable.ic_maths, R.drawable.ic_biology, R.drawable.ic_chemistry, R.drawable.ic_physics, R.drawable.ic_compsci, R.drawable.ic_pe, R.drawable.ic_gll, R.drawable.ic_wat, R.drawable.ic_help, R.drawable.ic_pencil) R.string.courseEng
), getString(R.string.courseFra), getString(R.string.courseSpa), getString(
R.string.courseLat
), getString(R.string.courseTue), getString(R.string.courseChi), getString(
R.string.courseKun
), getString(R.string.courseMus), getString(R.string.courseDar), getString(
R.string.courseGeg
), getString(R.string.courseGes), getString(R.string.coursePol), getString(
R.string.coursePhi
), getString(R.string.courseRel), getString(R.string.courseMat), getString(
R.string.courseBio
), getString(R.string.courseChe), getString(R.string.coursePhy), getString(
R.string.courseInf
), getString(R.string.courseSpo), getString(R.string.courseGll), getString(
R.string.courseWat
), getString(R.string.courseFor), getString(R.string.courseWp))
val coursesIcons = intArrayOf(R.drawable.ic_german, R.drawable.ic_english, R.drawable.ic_french,
R.drawable.ic_spanish, R.drawable.ic_latin, R.drawable.ic_turkish, R.drawable.ic_chinese,
R.drawable.ic_arts, R.drawable.ic_music, R.drawable.ic_drama, R.drawable.ic_geography,
R.drawable.ic_history, R.drawable.ic_politics, R.drawable.ic_philosophy, R.drawable.ic_religion,
R.drawable.ic_maths, R.drawable.ic_biology, R.drawable.ic_chemistry, R.drawable.ic_physics,
R.drawable.ic_compsci, R.drawable.ic_pe, R.drawable.ic_gll, R.drawable.ic_wat,
R.drawable.ic_help, R.drawable.ic_pencil
)
for (i in 0 until coursesNoLang.size) { for (i in 0 until coursesNoLang.size) {
colours.add(Colour(courses[i], coursesNoLang[i], coursesIcons[i], MiscData.getColourForString(prefs.getString("card${coursesNoLang[i]}", "") ?: ""))) colours.add(
Colour(
courses[i],
coursesNoLang[i],
coursesIcons[i],
MiscData.getColourForString(prefs.getString("card${coursesNoLang[i]}", "") ?: "")
)
)
} }
return colours return colours
} }
@@ -343,16 +374,21 @@ class SettingsFragment : Fragment(R.layout.content_settings), View.OnClickListen
} }
private fun getRingtones(): ArrayList<Ringtone> { private fun getRingtones(): ArrayList<Ringtone> {
lateinit var _cursor: Cursor lateinit var ringtoneCursor: Cursor
val ringtoneManager = RingtoneManager(activity).apply { val ringtoneManager = RingtoneManager(activity).apply {
setType(RingtoneManager.TYPE_NOTIFICATION) setType(RingtoneManager.TYPE_NOTIFICATION)
_cursor = cursor ringtoneCursor = cursor
} }
val alarms = ArrayList<Ringtone>() val alarms = ArrayList<Ringtone>()
while (!_cursor.isAfterLast && _cursor.moveToNext()) { while (!ringtoneCursor.isAfterLast && ringtoneCursor.moveToNext()) {
val position = _cursor.position val position = ringtoneCursor.position
alarms.add(Ringtone(ringtoneManager.getRingtone(position).getTitle(mContext), ringtoneManager.getRingtoneUri(position).toString())) alarms.add(
Ringtone(
ringtoneManager.getRingtone(position).getTitle(mContext),
ringtoneManager.getRingtoneUri(position).toString()
)
)
} }
return alarms return alarms
} }
@@ -391,19 +427,14 @@ class SettingsFragment : Fragment(R.layout.content_settings), View.OnClickListen
colourPickerBuilder.setView(pickerDialogView) colourPickerBuilder.setView(pickerDialogView)
val colourPickerDialog: AlertDialog = colourPickerBuilder.create() val colourPickerDialog: AlertDialog = colourPickerBuilder.create()
val buttons = arrayOf<MaterialButton>(picker.findViewById(R.id.def), picker.findViewById(R.id.red), val buttons = intArrayOf(R.id.def, R.id.red, R.id.orange, R.id.yellow, R.id.green,
picker.findViewById(R.id.orange), picker.findViewById(R.id.yellow), picker.findViewById(R.id.green), R.id.teal, R.id.cyan, R.id.blue, R.id.purple, R.id.pink, R.id.brown, R.id.grey,
picker.findViewById(R.id.teal), picker.findViewById(R.id.cyan), picker.findViewById(R.id.blue), R.id.pureWhite, R.id.salmon, R.id.tangerine, R.id.banana, R.id.flora, R.id.spindrift,
picker.findViewById(R.id.purple), picker.findViewById(R.id.pink), picker.findViewById(R.id.brown), R.id.sky, R.id.orchid, R.id.lavender, R.id.carnation, R.id.brown2, R.id.pureBlack)
picker.findViewById(R.id.grey), picker.findViewById(R.id.pureWhite), picker.findViewById(R.id.salmon),
picker.findViewById(R.id.tangerine), picker.findViewById(R.id.banana), picker.findViewById(R.id.flora),
picker.findViewById(R.id.spindrift), picker.findViewById(R.id.sky), picker.findViewById(R.id.orchid),
picker.findViewById(R.id.lavender), picker.findViewById(R.id.carnation), picker.findViewById(R.id.brown2),
picker.findViewById(R.id.pureBlack))
val colours = MiscData.colourNames val colours = MiscData.colourNames
for (i2 in 0 until buttons.size) { for (i2 in 0 until buttons.size) {
buttons[i2].setOnClickListener { picker.findViewById<MaterialButton>(buttons[i2]).setOnClickListener {
// prefs.edit().putInt("bg$titleNoLang", colourIntegers[i2]).apply() // prefs.edit().putInt("bg$titleNoLang", colourIntegers[i2]).apply()
prefs.edit().putString("card$titleNoLang", colours[i2]).apply() prefs.edit().putString("card$titleNoLang", colours[i2]).apply()
val recyclerViewState = colourRecycler.layoutManager?.onSaveInstanceState() val recyclerViewState = colourRecycler.layoutManager?.onSaveInstanceState()
@@ -421,13 +452,19 @@ class SettingsFragment : Fragment(R.layout.content_settings), View.OnClickListen
model = deviceInfo.model model = deviceInfo.model
} }
val alertDialog = AlertDialog.Builder(mContext, R.style.AlertDialog) val alertDialog = AlertDialog.Builder(mContext,
R.style.AlertDialog
)
val dialogView = LayoutInflater.from(mContext).inflate(R.layout.edittext_dialog, null) val dialogView = LayoutInflater.from(mContext).inflate(R.layout.edittext_dialog, null)
val dialogEditText = dialogView.findViewById<EditText>(R.id.dialog_edittext) val dialogEditText = dialogView.findViewById<EditText>(R.id.dialog_edittext)
val dialogButton = dialogView.findViewById<Button>(R.id.dialog_button) val dialogButton = dialogView.findViewById<Button>(R.id.dialog_button)
dialogView.findViewById<TextView>(R.id.textviewtitle).text = getString(R.string.experimentalMenu) dialogView.findViewById<TextView>(R.id.textviewtitle).text = getString(
dialogView.findViewById<TextView>(R.id.dialogtext).text = getString(R.string.menuForTests) R.string.experimentalMenu
)
dialogView.findViewById<TextView>(R.id.dialogtext).text = getString(
R.string.menuForTests
)
dialogButton.setOnClickListener { dialogButton.setOnClickListener {
when (dialogEditText.text.toString()) { when (dialogEditText.text.toString()) {
"_DIAGNOSTICS" -> { "_DIAGNOSTICS" -> {
@@ -435,9 +472,11 @@ class SettingsFragment : Fragment(R.layout.content_settings), View.OnClickListen
val devDialogView = LayoutInflater.from(mContext).inflate(R.layout.diagnostics_dialog, null) val devDialogView = LayoutInflater.from(mContext).inflate(R.layout.diagnostics_dialog, null)
val devDialogText = devDialogView.findViewById<TextView>(R.id.dialogtext) val devDialogText = devDialogView.findViewById<TextView>(R.id.dialogtext)
val resetLaunchBtn = devDialogView.findViewById<Button>(R.id.btnResetLaunch) val resetLaunchBtn = devDialogView.findViewById<Button>(R.id.btnResetLaunch)
val resetNotifBtn = devDialogView.findViewById<Button>(R.id.btnResetNotif) val resetNotificationBtn = devDialogView.findViewById<Button>(R.id.btnResetNotif)
devDialogView.findViewById<TextView>(R.id.textviewtitle).text = getString(R.string.diagnosticsMenu) devDialogView.findViewById<TextView>(R.id.textviewtitle).text = getString(
R.string.diagnosticsMenu
)
devDialogText.text = getDiagnosticsText(prefs) devDialogText.text = getDiagnosticsText(prefs)
resetLaunchBtn.setOnClickListener { resetLaunchBtn.setOnClickListener {
@@ -445,7 +484,7 @@ class SettingsFragment : Fragment(R.layout.content_settings), View.OnClickListen
devDialogText.text = getDiagnosticsText(prefs) devDialogText.text = getDiagnosticsText(prefs)
} }
resetNotifBtn.setOnClickListener { resetNotificationBtn.setOnClickListener {
edit.putInt("pingFB", 0).apply() edit.putInt("pingFB", 0).apply()
devDialogText.text = getDiagnosticsText(prefs) devDialogText.text = getDiagnosticsText(prefs)
} }
@@ -459,21 +498,21 @@ class SettingsFragment : Fragment(R.layout.content_settings), View.OnClickListen
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK).setPackage("com.google.android.youtube") intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK).setPackage("com.google.android.youtube")
startActivity(intent) startActivity(intent)
} catch (e: ActivityNotFoundException) { } catch (e: ActivityNotFoundException) {
Toast.makeText(mContext, R.string.youtubeNotFound, Toast.LENGTH_LONG).show() makeToast(getString(R.string.youtubeNotFound))
} }
} }
"_NOTIFICATION" -> { "_NOTIFICATION" -> {
edit.putString("timeNew", "").putString("timeFoodNew", "").apply() edit.putString("timeNew", "").putString("timeFoodNew", "").apply()
Toast.makeText(mContext, "Notification times cleared", Toast.LENGTH_LONG).show() makeToast("Notification times cleared")
} // TODO add option to clear database } // TODO add option to clear database
"_FIRSTTIME" -> { "_FIRSTTIME" -> {
edit.putBoolean("firstTime", true).apply() edit.putBoolean("firstTime", true).apply()
Toast.makeText(mContext, "First time flag cleared", Toast.LENGTH_LONG).show() makeToast("First time flag cleared")
} }
"_TESTURLS" -> { "_TESTURLS" -> {
val currentTest = !prefs.getBoolean("testUrls", false) val currentTest = !prefs.getBoolean("testUrls", false)
edit.putBoolean("testUrls", currentTest).apply() edit.putBoolean("testUrls", currentTest).apply()
Toast.makeText(mContext, "Test URLs set to $currentTest", Toast.LENGTH_LONG).show() makeToast("Test URLs set to $currentTest")
} }
"_DEVCHANNEL" -> { "_DEVCHANNEL" -> {
val subbed = if (prefs.getBoolean("subscribedToFBDebugChannel", false)) { val subbed = if (prefs.getBoolean("subscribedToFBDebugChannel", false)) {
@@ -482,7 +521,7 @@ class SettingsFragment : Fragment(R.layout.content_settings), View.OnClickListen
"Subscribed to" "Subscribed to"
} }
edit.putBoolean("subscribedToFBDebugChannel", !prefs.getBoolean("subscribedToFBDebugChannel", false)).apply() edit.putBoolean("subscribedToFBDebugChannel", !prefs.getBoolean("subscribedToFBDebugChannel", false)).apply()
Toast.makeText(mContext, "$subbed Firebase development channel", Toast.LENGTH_LONG).show() makeToast("$subbed Firebase development channel")
} }
"_IOSCHANNEL" -> { "_IOSCHANNEL" -> {
val subbed = if (prefs.getBoolean("subscribedToiOSChannel", false)) { val subbed = if (prefs.getBoolean("subscribedToiOSChannel", false)) {
@@ -491,9 +530,9 @@ class SettingsFragment : Fragment(R.layout.content_settings), View.OnClickListen
"Subscribed to" "Subscribed to"
} }
edit.putBoolean("subscribedToiOSChannel", !prefs.getBoolean("subscribedToiOSChannel", false)).apply() edit.putBoolean("subscribedToiOSChannel", !prefs.getBoolean("subscribedToiOSChannel", false)).apply()
Toast.makeText(mContext, "$subbed iOS channel", Toast.LENGTH_LONG).show() makeToast("$subbed iOS channel")
} }
else -> Toast.makeText(mContext, getString(R.string.invalidCode), Toast.LENGTH_LONG).show() else -> makeToast(getString(R.string.invalidCode))
} }
} }
alertDialog.setView(dialogView) alertDialog.setView(dialogView)
@@ -501,6 +540,10 @@ class SettingsFragment : Fragment(R.layout.content_settings), View.OnClickListen
return true return true
} }
private fun makeToast(text: String) {
Toast.makeText(mContext, text, Toast.LENGTH_LONG).show()
}
private fun getDiagnosticsText(prefs: SharedPreferences): String { private fun getDiagnosticsText(prefs: SharedPreferences): String {
return "First Launch: ${prefs.getString("firstTimeDev", "")}" + return "First Launch: ${prefs.getString("firstTimeDev", "")}" +
"\n\nApp launched: ${prefs.getInt("launchDev", 0)}" + "\n\nApp launched: ${prefs.getInt("launchDev", 0)}" +
@@ -0,0 +1,3 @@
package com.denizd.substitutionplan.models
internal class Colour(val title: String, val titleNoLang: String, val icon: Int, val colour: Int)
@@ -0,0 +1,7 @@
package com.denizd.substitutionplan.models
import androidx.room.Entity
import androidx.room.PrimaryKey
@Entity(tableName = "food_table")
internal class Food(val food: String, @PrimaryKey val priority: Int)
@@ -0,0 +1,3 @@
package com.denizd.substitutionplan.models
internal class Ringtone(val name: String, val uri: String)
@@ -0,0 +1,11 @@
package com.denizd.substitutionplan.models
import androidx.room.Entity
import androidx.room.PrimaryKey
@Entity(tableName = "subst_table")
internal class Subst(val group: String, val date: String, val time: String, val course: String, val room: String, val additional: String, val priority: Int) {
@PrimaryKey(autoGenerate = true)
var id: Int = 0
}
@@ -1,9 +1,10 @@
package com.denizd.substitutionplan package com.denizd.substitutionplan.services
import com.denizd.substitutionplan.data.DataFetcher
import com.google.firebase.messaging.FirebaseMessagingService import com.google.firebase.messaging.FirebaseMessagingService
import com.google.firebase.messaging.RemoteMessage import com.google.firebase.messaging.RemoteMessage
class FBNotificationService : FirebaseMessagingService() { internal class FBNotificationService : FirebaseMessagingService() {
override fun onMessageReceived(p0: RemoteMessage) { override fun onMessageReceived(p0: RemoteMessage) {
DataFetcher( DataFetcher(
@@ -1,4 +1,4 @@
package com.denizd.substitutionplan package com.denizd.substitutionplan.services
import android.app.job.JobParameters import android.app.job.JobParameters
import android.app.job.JobService import android.app.job.JobService
@@ -6,7 +6,7 @@ import android.preference.PreferenceManager
import com.google.firebase.FirebaseApp import com.google.firebase.FirebaseApp
import com.google.firebase.messaging.FirebaseMessaging import com.google.firebase.messaging.FirebaseMessaging
class FBPingService : JobService() { internal class FBPingService : JobService() {
private var jobCancelled = false private var jobCancelled = false
private val context = this private val context = this
@@ -7,7 +7,7 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="@color/colorBackground" android:background="@color/colorBackground"
android:fitsSystemWindows="true" android:fitsSystemWindows="true"
tools:context=".FirstTime"> tools:context=".activities.FirstTime">
<androidx.core.widget.NestedScrollView <androidx.core.widget.NestedScrollView
android:layout_width="match_parent" android:layout_width="match_parent"
+1 -1
View File
@@ -4,7 +4,7 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
tools:context=".Main"> tools:context=".activities.Main">
<com.google.android.material.appbar.AppBarLayout <com.google.android.material.appbar.AppBarLayout
android:id="@+id/appbarlayout" android:id="@+id/appbarlayout"
+1 -1
View File
@@ -4,7 +4,7 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
tools:context=".Main" tools:context=".activities.Main"
tools:showIn="@layout/app_bar_main" tools:showIn="@layout/app_bar_main"
android:id="@+id/content" android:id="@+id/content"
android:background="@color/colorBackground" android:background="@color/colorBackground"
+1 -1
View File
@@ -5,7 +5,7 @@
android:layout_height="match_parent" android:layout_height="match_parent"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:background="@color/colorBackground" android:background="@color/colorBackground"
tools:context=".SettingsFragment"> tools:context=".fragments.SettingsFragment">
<androidx.core.widget.NestedScrollView <androidx.core.widget.NestedScrollView
android:id="@+id/nsvsettings" android:id="@+id/nsvsettings"