Archived
Refactor to organise the project and change visibility modifiers
This commit is contained in:
@@ -18,14 +18,14 @@
|
||||
tools:ignore="GoogleAppIndexingWarning">
|
||||
|
||||
<activity
|
||||
android:name=".FirstTime"
|
||||
android:name=".activities.FirstTime"
|
||||
android:label="First Time"
|
||||
android:screenOrientation="portrait"
|
||||
android:theme="@style/AppTheme0.Launcher"
|
||||
android:windowSoftInputMode="adjustPan"/>
|
||||
|
||||
<activity
|
||||
android:name=".Main"
|
||||
android:name=".activities.Main"
|
||||
android:label="@string/appName"
|
||||
android:configChanges="orientation|keyboardHidden|screenSize"
|
||||
android:theme="@style/AppTheme0.Launcher"
|
||||
@@ -39,7 +39,7 @@
|
||||
</activity>
|
||||
|
||||
<service
|
||||
android:name=".FBNotificationService"
|
||||
android:name=".services.FBNotificationService"
|
||||
android:exported="false">
|
||||
<intent-filter>
|
||||
<action android:name="com.google.firebase.MESSAGING_EVENT" />
|
||||
@@ -54,7 +54,7 @@
|
||||
android:resource="@color/colorAccent" />
|
||||
|
||||
<service
|
||||
android:name=".FBPingService"
|
||||
android:name=".services.FBPingService"
|
||||
android:permission="android.permission.BIND_JOB_SERVICE"
|
||||
android:required="true"/>
|
||||
</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
|
||||
}
|
||||
+33
-12
@@ -1,4 +1,4 @@
|
||||
package com.denizd.substitutionplan
|
||||
package com.denizd.substitutionplan.activities
|
||||
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
@@ -20,11 +20,12 @@ import androidx.appcompat.app.AppCompatDelegate
|
||||
import androidx.coordinatorlayout.widget.CoordinatorLayout
|
||||
import androidx.core.content.ContextCompat
|
||||
import androidx.vectordrawable.graphics.drawable.AnimatedVectorDrawableCompat
|
||||
import com.denizd.substitutionplan.R
|
||||
import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
|
||||
import com.google.android.material.textfield.TextInputEditText
|
||||
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 prefs: SharedPreferences
|
||||
@@ -38,16 +39,28 @@ class FirstTime : AppCompatActivity(R.layout.activity_first_time) {
|
||||
AppCompatDelegate.MODE_NIGHT_NO, AppCompatDelegate.MODE_NIGHT_UNSPECIFIED -> {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||
window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
|
||||
window.statusBarColor = ContextCompat.getColor(this, R.color.colorBackground)
|
||||
window.navigationBarColor = ContextCompat.getColor(this, R.color.colorBackground)
|
||||
window.statusBarColor = ContextCompat.getColor(this,
|
||||
R.color.colorBackground
|
||||
)
|
||||
window.navigationBarColor = ContextCompat.getColor(this,
|
||||
R.color.colorBackground
|
||||
)
|
||||
} else {
|
||||
window.statusBarColor = ContextCompat.getColor(this, R.color.legacyBlack)
|
||||
window.navigationBarColor = ContextCompat.getColor(this, R.color.legacyBlack)
|
||||
window.statusBarColor = ContextCompat.getColor(this,
|
||||
R.color.legacyBlack
|
||||
)
|
||||
window.navigationBarColor = ContextCompat.getColor(this,
|
||||
R.color.legacyBlack
|
||||
)
|
||||
}
|
||||
}
|
||||
else -> {
|
||||
window.navigationBarColor = ContextCompat.getColor(this, R.color.colorBackground)
|
||||
window.statusBarColor = ContextCompat.getColor(this, R.color.colorBackground)
|
||||
window.navigationBarColor = ContextCompat.getColor(this,
|
||||
R.color.colorBackground
|
||||
)
|
||||
window.statusBarColor = ContextCompat.getColor(this,
|
||||
R.color.colorBackground
|
||||
)
|
||||
// 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)
|
||||
|
||||
helpClasses.setOnClickListener {
|
||||
createDialog(getString(R.string.enterGradeHelpTitle), getString(R.string.enterGradeHelp))
|
||||
createDialog(getString(R.string.enterGradeHelpTitle), getString(
|
||||
R.string.enterGradeHelp
|
||||
))
|
||||
}
|
||||
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
|
||||
@@ -103,7 +120,9 @@ class FirstTime : AppCompatActivity(R.layout.activity_first_time) {
|
||||
inflater.inflate(R.layout.welcome_screen, linearInflation, true)
|
||||
val anim = ViewAnimationUtils.createCircularReveal(linearInflation, x, y, 0F, endRadius.toFloat())
|
||||
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
|
||||
val colour = findViewById<LinearLayout>(R.id.colourLayout)
|
||||
linearInflation.visibility = View.VISIBLE
|
||||
@@ -137,7 +156,9 @@ class FirstTime : AppCompatActivity(R.layout.activity_first_time) {
|
||||
}
|
||||
|
||||
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 dialogTitle = dialogView.findViewById<TextView>(R.id.textviewtitle)
|
||||
val dialogText = dialogView.findViewById<TextView>(R.id.dialogtext)
|
||||
+42
-15
@@ -1,4 +1,4 @@
|
||||
package com.denizd.substitutionplan
|
||||
package com.denizd.substitutionplan.activities
|
||||
|
||||
import android.app.job.JobInfo
|
||||
import android.app.job.JobScheduler
|
||||
@@ -20,16 +20,21 @@ import androidx.fragment.app.Fragment
|
||||
import androidx.fragment.app.FragmentTransaction
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
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.bottomnavigation.BottomNavigationView
|
||||
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 java.lang.IllegalArgumentException
|
||||
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 prefs: SharedPreferences
|
||||
@@ -71,17 +76,29 @@ class Main : AppCompatActivity(R.layout.app_bar_main) {
|
||||
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||
window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
|
||||
window.statusBarColor = ContextCompat.getColor(this, R.color.colorBackground)
|
||||
window.navigationBarColor = ContextCompat.getColor(this, R.color.colorBackground)
|
||||
window.statusBarColor = ContextCompat.getColor(this,
|
||||
R.color.colorBackground
|
||||
)
|
||||
window.navigationBarColor = ContextCompat.getColor(this,
|
||||
R.color.colorBackground
|
||||
)
|
||||
} else {
|
||||
window.statusBarColor = ContextCompat.getColor(this, R.color.legacyBlack)
|
||||
window.navigationBarColor = ContextCompat.getColor(this, R.color.legacyBlack)
|
||||
window.statusBarColor = ContextCompat.getColor(this,
|
||||
R.color.legacyBlack
|
||||
)
|
||||
window.navigationBarColor = ContextCompat.getColor(this,
|
||||
R.color.legacyBlack
|
||||
)
|
||||
}
|
||||
}
|
||||
else -> {
|
||||
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
|
||||
window.navigationBarColor = ContextCompat.getColor(this, R.color.colorBackground)
|
||||
window.statusBarColor = ContextCompat.getColor(this, R.color.colorBackground)
|
||||
window.navigationBarColor = ContextCompat.getColor(this,
|
||||
R.color.colorBackground
|
||||
)
|
||||
window.statusBarColor = ContextCompat.getColor(this,
|
||||
R.color.colorBackground
|
||||
)
|
||||
}
|
||||
// else -> {
|
||||
// when (context.resources.configuration.uiMode) {
|
||||
@@ -114,7 +131,9 @@ class Main : AppCompatActivity(R.layout.app_bar_main) {
|
||||
if (info.manufacturer.contains("Huawei") ||
|
||||
info.manufacturer.contains("Honor") ||
|
||||
info.manufacturer.contains("Xiaomi")) {
|
||||
val alertDialog = AlertDialog.Builder(context, R.style.AlertDialog)
|
||||
val alertDialog = AlertDialog.Builder(context,
|
||||
R.style.AlertDialog
|
||||
)
|
||||
val dialogView = LayoutInflater.from(context).inflate(R.layout.secret_dialog, null)
|
||||
val title = dialogView.findViewById<TextView>(R.id.textviewtitle)
|
||||
title.text = getString(R.string.chineseDevicesTitle)
|
||||
@@ -223,16 +242,24 @@ class Main : AppCompatActivity(R.layout.app_bar_main) {
|
||||
val gen = Random()
|
||||
|
||||
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 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)]
|
||||
in 5..10 -> resources.getStringArray(R.array.greetingsMorning)[gen.nextInt(resources.getStringArray(
|
||||
R.array.greetingsMorning
|
||||
).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", ""))
|
||||
}
|
||||
|
||||
private fun openInfoDialog() {
|
||||
val dialog = AlertDialog.Builder(context)
|
||||
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", "")}"
|
||||
dialogView.findViewById<TextView>(R.id.dialogtext).text = dialogText
|
||||
dialog.setView(dialogView).show()
|
||||
+16
-5
@@ -1,4 +1,4 @@
|
||||
package com.denizd.substitutionplan
|
||||
package com.denizd.substitutionplan.adapters
|
||||
|
||||
import android.content.ActivityNotFoundException
|
||||
import android.net.Uri
|
||||
@@ -14,10 +14,13 @@ import android.widget.Toast
|
||||
import androidx.browser.customtabs.CustomTabsIntent
|
||||
import androidx.core.content.ContextCompat
|
||||
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 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 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.mTime.setText(strings[1], 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.mTime.text = " "
|
||||
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 {
|
||||
holder.mDate.visibility = View.VISIBLE
|
||||
holder.mDate.text = currentItem.date
|
||||
@@ -100,7 +109,9 @@ class CardAdapter(private var mSubst: List<Subst>) : RecyclerView.Adapter<CardAd
|
||||
if (colour != 0) {
|
||||
holder.mCard.setCardBackgroundColor(ContextCompat.getColor(holder.mCourse.context, colour))
|
||||
} else {
|
||||
holder.mCard.setCardBackgroundColor(ContextCompat.getColor(holder.mCourse.context, R.color.colorBackgroundLight))
|
||||
holder.mCard.setCardBackgroundColor(ContextCompat.getColor(holder.mCourse.context,
|
||||
R.color.colorBackgroundLight
|
||||
))
|
||||
}
|
||||
}
|
||||
|
||||
+8
-3
@@ -1,4 +1,4 @@
|
||||
package com.denizd.substitutionplan
|
||||
package com.denizd.substitutionplan.adapters
|
||||
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
@@ -7,9 +7,11 @@ import android.widget.ImageView
|
||||
import android.widget.TextView
|
||||
import androidx.core.content.ContextCompat
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import com.denizd.substitutionplan.models.Colour
|
||||
import com.denizd.substitutionplan.R
|
||||
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
|
||||
|
||||
@@ -27,7 +29,10 @@ class ColourAdapter(private var mColours: List<Colour>, onClickListener: OnClick
|
||||
|
||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ColourViewHolder {
|
||||
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) {
|
||||
+5
-7
@@ -1,4 +1,4 @@
|
||||
package com.denizd.substitutionplan
|
||||
package com.denizd.substitutionplan.adapters
|
||||
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
@@ -7,16 +7,14 @@ import android.widget.TextView
|
||||
|
||||
import java.util.ArrayList
|
||||
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
|
||||
|
||||
class CardViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
|
||||
var mFood: TextView
|
||||
|
||||
init {
|
||||
mFood = itemView.findViewById(R.id.cardInfoText)
|
||||
}
|
||||
var mFood: TextView = itemView.findViewById(R.id.cardInfoText)
|
||||
}
|
||||
|
||||
init {
|
||||
+13
-6
@@ -1,4 +1,4 @@
|
||||
package com.denizd.substitutionplan
|
||||
package com.denizd.substitutionplan.adapters
|
||||
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
@@ -6,17 +6,19 @@ import android.view.ViewGroup
|
||||
import android.widget.TextView
|
||||
import androidx.core.content.ContextCompat
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import com.denizd.substitutionplan.R
|
||||
import com.denizd.substitutionplan.models.Ringtone
|
||||
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 {
|
||||
val name: TextView = view.findViewById(R.id.item_text)
|
||||
val uri: TextView = view.findViewById(R.id.item_text_no_lang)
|
||||
val cardView: MaterialCardView = view.findViewById(R.id.cardView)
|
||||
val _clickListener = clickListener
|
||||
private val _clickListener = clickListener
|
||||
init { view.setOnClickListener(this) }
|
||||
|
||||
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 {
|
||||
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) {
|
||||
@@ -33,7 +38,9 @@ class RingtoneAdapter(private var _ringtones: List<Ringtone>, onClickListener: O
|
||||
|
||||
holder.name.text = currentItem.name
|
||||
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
|
||||
+39
-12
@@ -1,4 +1,4 @@
|
||||
package com.denizd.substitutionplan
|
||||
package com.denizd.substitutionplan.data
|
||||
|
||||
import android.app.*
|
||||
import android.content.Context
|
||||
@@ -13,6 +13,12 @@ import android.widget.RemoteViews
|
||||
import androidx.core.app.NotificationCompat
|
||||
import androidx.core.content.ContextCompat
|
||||
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 org.jsoup.Jsoup
|
||||
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 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 plan = isPlan
|
||||
@@ -47,11 +53,12 @@ class DataFetcher(isPlan: Boolean, isMenu: Boolean, isJobService: Boolean, conte
|
||||
|
||||
override fun doInBackground(vararg params: Void?): Void? {
|
||||
try {
|
||||
when {
|
||||
prefs.getBoolean("testUrls", false) -> {
|
||||
if (prefs.getBoolean("testUrls", false)) {
|
||||
substUrl = "https://djd4rkn355.github.io/subst_test.html"
|
||||
foodUrl = "https://djd4rkn355.github.io/food_test.html"
|
||||
}
|
||||
|
||||
when {
|
||||
menu -> requestFoodMenuData()
|
||||
plan -> requestSubstPlanAndNotification()
|
||||
}
|
||||
@@ -69,7 +76,9 @@ class DataFetcher(isPlan: Boolean, isMenu: Boolean, isJobService: Boolean, conte
|
||||
} catch (e: Exception) {
|
||||
mView?.let { v: View ->
|
||||
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
|
||||
@@ -143,15 +152,24 @@ class DataFetcher(isPlan: Boolean, isMenu: Boolean, isJobService: Boolean, conte
|
||||
val group = cols[0].text()
|
||||
val course = cols[3].text()
|
||||
val additional = cols[5].text()
|
||||
val subst = Subst(group = group, date = cols[1].text(), time = cols[2].text(), course = course,
|
||||
room = cols[4].text(), additional = additional, priority = priority)
|
||||
val subst = Subst(
|
||||
group = group, date = cols[1].text(), time = cols[2].text(), course = course,
|
||||
room = cols[4].text(), additional = additional, priority = priority
|
||||
)
|
||||
substArray.add(subst)
|
||||
substRepo.insert(subst)
|
||||
priority--
|
||||
}
|
||||
|
||||
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 "---"}"
|
||||
}
|
||||
}
|
||||
@@ -170,21 +188,30 @@ class DataFetcher(isPlan: Boolean, isMenu: Boolean, isJobService: Boolean, conte
|
||||
openApp.flags += Intent.FLAG_ACTIVITY_CLEAR_TASK
|
||||
val openAppPending = PendingIntent.getActivity(mContext, 0, openApp, 0)
|
||||
|
||||
val notificationLayout = RemoteViews(mContext.packageName, R.layout.notification)
|
||||
notificationLayout.setTextViewText(R.id.notification_title, mContext.getString(R.string.substitutionPlan))
|
||||
val notificationLayout = RemoteViews(mContext.packageName,
|
||||
R.layout.notification
|
||||
)
|
||||
notificationLayout.setTextViewText(
|
||||
R.id.notification_title, mContext.getString(
|
||||
R.string.substitutionPlan
|
||||
))
|
||||
notificationLayout.setTextViewText(R.id.notification_textview, notifText)
|
||||
|
||||
val manager = mContext.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
|
||||
|
||||
MiscData.getNotificationChannel(mContext, prefs)
|
||||
|
||||
val notification = NotificationCompat.Builder(mContext, MiscData.notificationChannelId)
|
||||
val notification = NotificationCompat.Builder(mContext,
|
||||
MiscData.notificationChannelId
|
||||
)
|
||||
.setStyle(NotificationCompat.DecoratedCustomViewStyle())
|
||||
.setCustomContentView(notificationLayout)
|
||||
.setSmallIcon(R.drawable.ic_avh)
|
||||
.setContentIntent(openAppPending)
|
||||
.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) {
|
||||
val sound = if ((prefs.getString("ringtoneUri", "") ?: "").isNotEmpty()) {
|
||||
+33
-7
@@ -1,4 +1,4 @@
|
||||
package com.denizd.substitutionplan
|
||||
package com.denizd.substitutionplan.data
|
||||
|
||||
import android.annotation.TargetApi
|
||||
import android.app.NotificationChannel
|
||||
@@ -6,9 +6,11 @@ import android.app.NotificationManager
|
||||
import android.content.Context
|
||||
import android.content.SharedPreferences
|
||||
import android.graphics.Color
|
||||
import com.denizd.substitutionplan.R
|
||||
import com.denizd.substitutionplan.models.Subst
|
||||
import java.util.*
|
||||
|
||||
object MiscData {
|
||||
internal object MiscData {
|
||||
|
||||
val languageIndependentCourses = arrayOf("German", "English", "French", "Spanish", "Latin", "Turkish", "Chinese", "Arts", "Music",
|
||||
"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",
|
||||
"brown", "grey", "pureWhite", "salmon", "tangerine", "banana", "flora", "spindrift", "sky", "orchid",
|
||||
"lavender", "carnation", "brown2", "pureBlack")
|
||||
private val colourIntegers = intArrayOf(0, R.color.bgRed, R.color.bgOrange, 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)
|
||||
private val colourIntegers = intArrayOf(0,
|
||||
R.color.bgRed,
|
||||
R.color.bgOrange,
|
||||
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"
|
||||
|
||||
fun getColourForString(name: String): Int {
|
||||
@@ -128,7 +151,10 @@ object MiscData {
|
||||
fun getNotificationChannel(context: Context, prefs: SharedPreferences): NotificationChannel {
|
||||
val manager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
|
||||
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.lightColor = Color.BLUE
|
||||
manager.createNotificationChannel(channel)
|
||||
+5
-4
@@ -1,17 +1,18 @@
|
||||
package com.denizd.substitutionplan
|
||||
package com.denizd.substitutionplan.database
|
||||
|
||||
import android.app.Application
|
||||
import android.os.AsyncTask
|
||||
|
||||
import androidx.lifecycle.LiveData
|
||||
import com.denizd.substitutionplan.models.Food
|
||||
|
||||
public class FoodRepository(application: Application) {
|
||||
internal class FoodRepository(application: Application) {
|
||||
|
||||
private val substDao: SubstDao?
|
||||
val allFoods: LiveData<List<Food>>?
|
||||
|
||||
init {
|
||||
val database = SubstDatabase.getFoodInstance(application)
|
||||
val database =
|
||||
SubstDatabase.getFoodInstance(application)
|
||||
substDao = database?.substDao()
|
||||
allFoods = substDao?.allFoods
|
||||
}
|
||||
+5
-3
@@ -1,12 +1,14 @@
|
||||
package com.denizd.substitutionplan
|
||||
package com.denizd.substitutionplan.database
|
||||
|
||||
import android.app.Application
|
||||
import androidx.lifecycle.AndroidViewModel
|
||||
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>>?
|
||||
|
||||
init {
|
||||
+4
-2
@@ -1,10 +1,12 @@
|
||||
package com.denizd.substitutionplan
|
||||
package com.denizd.substitutionplan.database
|
||||
|
||||
import androidx.lifecycle.LiveData
|
||||
import androidx.room.*
|
||||
import com.denizd.substitutionplan.models.Food
|
||||
import com.denizd.substitutionplan.models.Subst
|
||||
|
||||
@Dao
|
||||
public interface SubstDao {
|
||||
internal interface SubstDao {
|
||||
|
||||
@get:Query("SELECT * FROM subst_table ORDER BY priority DESC")
|
||||
val allSubst: LiveData<List<Subst>>
|
||||
+4
-2
@@ -1,12 +1,14 @@
|
||||
package com.denizd.substitutionplan
|
||||
package com.denizd.substitutionplan.database
|
||||
|
||||
import android.content.Context
|
||||
import androidx.room.Database
|
||||
import androidx.room.Room
|
||||
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)
|
||||
public abstract class SubstDatabase : RoomDatabase() {
|
||||
internal abstract class SubstDatabase : RoomDatabase() {
|
||||
|
||||
abstract fun substDao(): SubstDao
|
||||
|
||||
+5
-3
@@ -1,17 +1,19 @@
|
||||
package com.denizd.substitutionplan
|
||||
package com.denizd.substitutionplan.database
|
||||
|
||||
import android.app.Application
|
||||
import android.os.AsyncTask
|
||||
|
||||
import androidx.lifecycle.LiveData
|
||||
import com.denizd.substitutionplan.models.Subst
|
||||
|
||||
public class SubstRepository(application: Application) {
|
||||
internal class SubstRepository(application: Application) {
|
||||
|
||||
private val substDao: SubstDao?
|
||||
val allSubst: LiveData<List<Subst>>?
|
||||
|
||||
init {
|
||||
val database = SubstDatabase.getInstance(application)
|
||||
val database =
|
||||
SubstDatabase.getInstance(application)
|
||||
substDao = database?.substDao()
|
||||
allSubst = substDao?.allSubst
|
||||
}
|
||||
+5
-3
@@ -1,12 +1,14 @@
|
||||
package com.denizd.substitutionplan
|
||||
package com.denizd.substitutionplan.database
|
||||
|
||||
import android.app.Application
|
||||
import androidx.lifecycle.AndroidViewModel
|
||||
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>>?
|
||||
|
||||
init {
|
||||
+23
-4
@@ -1,4 +1,4 @@
|
||||
package com.denizd.substitutionplan
|
||||
package com.denizd.substitutionplan.fragments
|
||||
|
||||
import android.content.Context
|
||||
import android.content.SharedPreferences
|
||||
@@ -11,8 +11,13 @@ import androidx.lifecycle.ViewModelProviders
|
||||
import androidx.recyclerview.widget.GridLayoutManager
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
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 mAdapter = FoodAdapter(foodArrayList)
|
||||
@@ -57,12 +62,26 @@ class FoodFragment : Fragment(R.layout.food_layout) {
|
||||
|
||||
if (prefs.getBoolean("autoRefresh", false)) {
|
||||
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.isRefreshing = true
|
||||
DataFetcher(false, true, false, mContext, activity!!.application, view.rootView).execute()
|
||||
DataFetcher(
|
||||
false,
|
||||
true,
|
||||
false,
|
||||
mContext,
|
||||
activity!!.application,
|
||||
view.rootView
|
||||
).execute()
|
||||
}
|
||||
}
|
||||
}
|
||||
+3
-2
@@ -1,10 +1,11 @@
|
||||
package com.denizd.substitutionplan
|
||||
package com.denizd.substitutionplan.fragments
|
||||
|
||||
import android.os.Bundle
|
||||
import android.view.View
|
||||
import androidx.lifecycle.Observer
|
||||
import com.denizd.substitutionplan.models.Subst
|
||||
|
||||
class GeneralPlanFragment : PlanFragment() {
|
||||
internal class GeneralPlanFragment : PlanFragment() {
|
||||
|
||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||
super.onViewCreated(view, savedInstanceState)
|
||||
+13
-3
@@ -1,10 +1,13 @@
|
||||
package com.denizd.substitutionplan
|
||||
package com.denizd.substitutionplan.fragments
|
||||
|
||||
import android.os.Bundle
|
||||
import android.view.View
|
||||
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?) {
|
||||
super.onViewCreated(view, savedInstanceState)
|
||||
@@ -24,7 +27,14 @@ class PersonalPlanFragment : PlanFragment() {
|
||||
persPlanEmpty = true
|
||||
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)
|
||||
}
|
||||
persPlanEmpty = (planCardList.size == 1 && planCardList[0].date.substring(0, 3) == "psa") || planCardList.isEmpty()
|
||||
+15
-17
@@ -1,4 +1,4 @@
|
||||
package com.denizd.substitutionplan
|
||||
package com.denizd.substitutionplan.fragments
|
||||
|
||||
import android.content.Context
|
||||
import android.content.SharedPreferences
|
||||
@@ -14,9 +14,14 @@ import androidx.lifecycle.ViewModelProviders
|
||||
import androidx.recyclerview.widget.GridLayoutManager
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
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
|
||||
|
||||
open class PlanFragment : Fragment(R.layout.plan) {
|
||||
internal open class PlanFragment : Fragment(R.layout.plan) {
|
||||
lateinit var recyclerView: RecyclerView
|
||||
lateinit var mAdapter: CardAdapter
|
||||
private lateinit var layoutManager: GridLayoutManager
|
||||
@@ -56,38 +61,31 @@ open class PlanFragment : Fragment(R.layout.plan) {
|
||||
recyclerView.adapter = mAdapter
|
||||
|
||||
if (prefs.getInt("firstTimeOpening", 0) == 1) {
|
||||
if (!prefs.getBoolean("notif", false)) {
|
||||
pullToRefresh.isRefreshing = true
|
||||
DataFetcher(true, true, false, mContext, activity!!.application, view.rootView).execute()
|
||||
startFetch(view, pullToRefresh, true)
|
||||
prefs.edit().putInt("firstTimeOpening", 2).apply()
|
||||
}
|
||||
}
|
||||
|
||||
if (prefs.getBoolean("autoRefresh", false)) {
|
||||
pullToRefresh.isRefreshing = true
|
||||
DataFetcher(
|
||||
isPlan = true,
|
||||
isMenu = false,
|
||||
isJobService = false,
|
||||
context = mContext,
|
||||
application = activity!!.application,
|
||||
parentView = view.rootView
|
||||
).execute()
|
||||
startFetch(view, pullToRefresh, false)
|
||||
}
|
||||
substViewModel = ViewModelProviders.of(this).get(SubstViewModel::class.java)
|
||||
|
||||
pullToRefresh.setOnRefreshListener {
|
||||
startFetch(view, pullToRefresh, false)
|
||||
}
|
||||
}
|
||||
|
||||
private fun startFetch(view: View, pullToRefresh: SwipeRefreshLayout, refreshMenu: Boolean) {
|
||||
pullToRefresh.isRefreshing = true
|
||||
DataFetcher(
|
||||
isPlan = true,
|
||||
isMenu = false,
|
||||
isMenu = refreshMenu,
|
||||
isJobService = false,
|
||||
context = mContext,
|
||||
application = activity!!.application,
|
||||
parentView = view.rootView
|
||||
).execute()
|
||||
}
|
||||
}
|
||||
|
||||
private fun getGridColumnCount(config: Configuration): Int {
|
||||
val tabletSize = resources.getBoolean(R.bool.isTablet)
|
||||
+100
-57
@@ -1,4 +1,4 @@
|
||||
package com.denizd.substitutionplan
|
||||
package com.denizd.substitutionplan.fragments
|
||||
|
||||
import android.content.ActivityNotFoundException
|
||||
import android.content.Context
|
||||
@@ -24,6 +24,12 @@ import androidx.core.content.ContextCompat
|
||||
import androidx.fragment.app.Fragment
|
||||
import androidx.recyclerview.widget.GridLayoutManager
|
||||
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.button.MaterialButton
|
||||
import com.google.android.material.textfield.TextInputEditText
|
||||
@@ -31,8 +37,10 @@ import com.google.firebase.messaging.FirebaseMessaging
|
||||
import com.jaredrummler.android.device.DeviceName
|
||||
import kotlin.collections.ArrayList
|
||||
|
||||
class SettingsFragment : Fragment(R.layout.content_settings), View.OnClickListener,
|
||||
CompoundButton.OnCheckedChangeListener, ColourAdapter.OnClickListener, RingtoneAdapter.OnClickListener {
|
||||
internal class SettingsFragment : Fragment(R.layout.content_settings), View.OnClickListener,
|
||||
CompoundButton.OnCheckedChangeListener,
|
||||
ColourAdapter.OnClickListener,
|
||||
RingtoneAdapter.OnClickListener {
|
||||
|
||||
private var name = ""
|
||||
private var model = ""
|
||||
@@ -131,22 +139,26 @@ class SettingsFragment : Fragment(R.layout.content_settings), View.OnClickListen
|
||||
})
|
||||
|
||||
btnVersion.setOnLongClickListener {
|
||||
Toast.makeText(mContext, getString(R.string.madeBy), Toast.LENGTH_LONG).show()
|
||||
makeToast(getString(R.string.madeBy))
|
||||
debugMenu()
|
||||
}
|
||||
}
|
||||
|
||||
override fun onClick(v: View?) {
|
||||
when (v?.id) {
|
||||
R.id.chipHelpCourses -> createDialog(getString(R.string.enterCoursesHelpTitle), getString(R.string.enterCoursesHelp))
|
||||
R.id.chipHelpClasses -> createDialog(getString(R.string.enterGradeHelpTitle), getString(R.string.enterGradeHelp))
|
||||
R.id.chipHelpCourses -> createDialog(getString(R.string.enterCoursesHelpTitle), getString(
|
||||
R.string.enterCoursesHelp
|
||||
))
|
||||
R.id.chipHelpClasses -> createDialog(getString(R.string.enterGradeHelpTitle), getString(
|
||||
R.string.enterGradeHelp
|
||||
))
|
||||
R.id.btnCustomiseColours -> createColourDialog()
|
||||
R.id.btnCustomiseRingtone -> createRingtoneDialog()
|
||||
R.id.btnWebsite -> {
|
||||
try {
|
||||
customTabsIntent.launchUrl(mContext, Uri.parse("http://307.joomla.schule.bremen.de"))
|
||||
} catch (e: ActivityNotFoundException) {
|
||||
Toast.makeText(mContext, getString(R.string.chromeCompatibleNotFound), Toast.LENGTH_LONG).show()
|
||||
makeToast(getString(R.string.chromeCompatibleNotFound))
|
||||
}
|
||||
}
|
||||
R.id.btnLicences -> {
|
||||
@@ -202,9 +214,9 @@ class SettingsFragment : Fragment(R.layout.content_settings), View.OnClickListen
|
||||
try {
|
||||
cs = 7
|
||||
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) {
|
||||
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) {
|
||||
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)
|
||||
dialogView.findViewById<TextView>(R.id.textviewtitle).text = title
|
||||
dialogView.findViewById<TextView>(R.id.dialogtext).text = text
|
||||
@@ -268,7 +282,9 @@ class SettingsFragment : Fragment(R.layout.content_settings), View.OnClickListen
|
||||
}
|
||||
|
||||
private fun createColourDialog() {
|
||||
val colourCustomiserBuilder = AlertDialog.Builder(mContext, R.style.AlertDialog)
|
||||
val colourCustomiserBuilder = AlertDialog.Builder(mContext,
|
||||
R.style.AlertDialog
|
||||
)
|
||||
|
||||
val dialogView = LayoutInflater.from(mContext).inflate(R.layout.recycler_dialog, null)
|
||||
val titleText = dialogView.findViewById<TextView>(R.id.empty_textviewtitle)
|
||||
@@ -279,34 +295,49 @@ class SettingsFragment : Fragment(R.layout.content_settings), View.OnClickListen
|
||||
colourRecycler.layoutManager = GridLayoutManager(mContext, 1)
|
||||
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)
|
||||
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()
|
||||
|
||||
}
|
||||
|
||||
private fun getColourList(): ArrayList<Colour> {
|
||||
val colours = ArrayList<Colour>()
|
||||
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 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)
|
||||
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 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) {
|
||||
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
|
||||
}
|
||||
@@ -343,16 +374,21 @@ class SettingsFragment : Fragment(R.layout.content_settings), View.OnClickListen
|
||||
}
|
||||
|
||||
private fun getRingtones(): ArrayList<Ringtone> {
|
||||
lateinit var _cursor: Cursor
|
||||
lateinit var ringtoneCursor: Cursor
|
||||
val ringtoneManager = RingtoneManager(activity).apply {
|
||||
setType(RingtoneManager.TYPE_NOTIFICATION)
|
||||
_cursor = cursor
|
||||
ringtoneCursor = cursor
|
||||
}
|
||||
val alarms = ArrayList<Ringtone>()
|
||||
|
||||
while (!_cursor.isAfterLast && _cursor.moveToNext()) {
|
||||
val position = _cursor.position
|
||||
alarms.add(Ringtone(ringtoneManager.getRingtone(position).getTitle(mContext), ringtoneManager.getRingtoneUri(position).toString()))
|
||||
while (!ringtoneCursor.isAfterLast && ringtoneCursor.moveToNext()) {
|
||||
val position = ringtoneCursor.position
|
||||
alarms.add(
|
||||
Ringtone(
|
||||
ringtoneManager.getRingtone(position).getTitle(mContext),
|
||||
ringtoneManager.getRingtoneUri(position).toString()
|
||||
)
|
||||
)
|
||||
}
|
||||
return alarms
|
||||
}
|
||||
@@ -391,19 +427,14 @@ class SettingsFragment : Fragment(R.layout.content_settings), View.OnClickListen
|
||||
colourPickerBuilder.setView(pickerDialogView)
|
||||
val colourPickerDialog: AlertDialog = colourPickerBuilder.create()
|
||||
|
||||
val buttons = arrayOf<MaterialButton>(picker.findViewById(R.id.def), picker.findViewById(R.id.red),
|
||||
picker.findViewById(R.id.orange), picker.findViewById(R.id.yellow), picker.findViewById(R.id.green),
|
||||
picker.findViewById(R.id.teal), picker.findViewById(R.id.cyan), picker.findViewById(R.id.blue),
|
||||
picker.findViewById(R.id.purple), picker.findViewById(R.id.pink), picker.findViewById(R.id.brown),
|
||||
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 buttons = intArrayOf(R.id.def, R.id.red, R.id.orange, R.id.yellow, R.id.green,
|
||||
R.id.teal, R.id.cyan, R.id.blue, R.id.purple, R.id.pink, R.id.brown, R.id.grey,
|
||||
R.id.pureWhite, R.id.salmon, R.id.tangerine, R.id.banana, R.id.flora, R.id.spindrift,
|
||||
R.id.sky, R.id.orchid, R.id.lavender, R.id.carnation, R.id.brown2, R.id.pureBlack)
|
||||
val colours = MiscData.colourNames
|
||||
|
||||
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().putString("card$titleNoLang", colours[i2]).apply()
|
||||
val recyclerViewState = colourRecycler.layoutManager?.onSaveInstanceState()
|
||||
@@ -421,13 +452,19 @@ class SettingsFragment : Fragment(R.layout.content_settings), View.OnClickListen
|
||||
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 dialogEditText = dialogView.findViewById<EditText>(R.id.dialog_edittext)
|
||||
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.dialogtext).text = getString(R.string.menuForTests)
|
||||
dialogView.findViewById<TextView>(R.id.textviewtitle).text = getString(
|
||||
R.string.experimentalMenu
|
||||
)
|
||||
dialogView.findViewById<TextView>(R.id.dialogtext).text = getString(
|
||||
R.string.menuForTests
|
||||
)
|
||||
dialogButton.setOnClickListener {
|
||||
when (dialogEditText.text.toString()) {
|
||||
"_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 devDialogText = devDialogView.findViewById<TextView>(R.id.dialogtext)
|
||||
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)
|
||||
|
||||
resetLaunchBtn.setOnClickListener {
|
||||
@@ -445,7 +484,7 @@ class SettingsFragment : Fragment(R.layout.content_settings), View.OnClickListen
|
||||
devDialogText.text = getDiagnosticsText(prefs)
|
||||
}
|
||||
|
||||
resetNotifBtn.setOnClickListener {
|
||||
resetNotificationBtn.setOnClickListener {
|
||||
edit.putInt("pingFB", 0).apply()
|
||||
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")
|
||||
startActivity(intent)
|
||||
} catch (e: ActivityNotFoundException) {
|
||||
Toast.makeText(mContext, R.string.youtubeNotFound, Toast.LENGTH_LONG).show()
|
||||
makeToast(getString(R.string.youtubeNotFound))
|
||||
}
|
||||
}
|
||||
"_NOTIFICATION" -> {
|
||||
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
|
||||
"_FIRSTTIME" -> {
|
||||
edit.putBoolean("firstTime", true).apply()
|
||||
Toast.makeText(mContext, "First time flag cleared", Toast.LENGTH_LONG).show()
|
||||
makeToast("First time flag cleared")
|
||||
}
|
||||
"_TESTURLS" -> {
|
||||
val currentTest = !prefs.getBoolean("testUrls", false)
|
||||
edit.putBoolean("testUrls", currentTest).apply()
|
||||
Toast.makeText(mContext, "Test URLs set to $currentTest", Toast.LENGTH_LONG).show()
|
||||
makeToast("Test URLs set to $currentTest")
|
||||
}
|
||||
"_DEVCHANNEL" -> {
|
||||
val subbed = if (prefs.getBoolean("subscribedToFBDebugChannel", false)) {
|
||||
@@ -482,7 +521,7 @@ class SettingsFragment : Fragment(R.layout.content_settings), View.OnClickListen
|
||||
"Subscribed to"
|
||||
}
|
||||
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" -> {
|
||||
val subbed = if (prefs.getBoolean("subscribedToiOSChannel", false)) {
|
||||
@@ -491,9 +530,9 @@ class SettingsFragment : Fragment(R.layout.content_settings), View.OnClickListen
|
||||
"Subscribed to"
|
||||
}
|
||||
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)
|
||||
@@ -501,6 +540,10 @@ class SettingsFragment : Fragment(R.layout.content_settings), View.OnClickListen
|
||||
return true
|
||||
}
|
||||
|
||||
private fun makeToast(text: String) {
|
||||
Toast.makeText(mContext, text, Toast.LENGTH_LONG).show()
|
||||
}
|
||||
|
||||
private fun getDiagnosticsText(prefs: SharedPreferences): String {
|
||||
return "First Launch: ${prefs.getString("firstTimeDev", "")}" +
|
||||
"\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
|
||||
}
|
||||
+3
-2
@@ -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.RemoteMessage
|
||||
|
||||
class FBNotificationService : FirebaseMessagingService() {
|
||||
internal class FBNotificationService : FirebaseMessagingService() {
|
||||
|
||||
override fun onMessageReceived(p0: RemoteMessage) {
|
||||
DataFetcher(
|
||||
+2
-2
@@ -1,4 +1,4 @@
|
||||
package com.denizd.substitutionplan
|
||||
package com.denizd.substitutionplan.services
|
||||
|
||||
import android.app.job.JobParameters
|
||||
import android.app.job.JobService
|
||||
@@ -6,7 +6,7 @@ import android.preference.PreferenceManager
|
||||
import com.google.firebase.FirebaseApp
|
||||
import com.google.firebase.messaging.FirebaseMessaging
|
||||
|
||||
class FBPingService : JobService() {
|
||||
internal class FBPingService : JobService() {
|
||||
|
||||
private var jobCancelled = false
|
||||
private val context = this
|
||||
@@ -7,7 +7,7 @@
|
||||
android:layout_height="match_parent"
|
||||
android:background="@color/colorBackground"
|
||||
android:fitsSystemWindows="true"
|
||||
tools:context=".FirstTime">
|
||||
tools:context=".activities.FirstTime">
|
||||
|
||||
<androidx.core.widget.NestedScrollView
|
||||
android:layout_width="match_parent"
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
tools:context=".Main">
|
||||
tools:context=".activities.Main">
|
||||
|
||||
<com.google.android.material.appbar.AppBarLayout
|
||||
android:id="@+id/appbarlayout"
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
tools:context=".Main"
|
||||
tools:context=".activities.Main"
|
||||
tools:showIn="@layout/app_bar_main"
|
||||
android:id="@+id/content"
|
||||
android:background="@color/colorBackground"
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
android:layout_height="match_parent"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:background="@color/colorBackground"
|
||||
tools:context=".SettingsFragment">
|
||||
tools:context=".fragments.SettingsFragment">
|
||||
|
||||
<androidx.core.widget.NestedScrollView
|
||||
android:id="@+id/nsvsettings"
|
||||
|
||||
Reference in New Issue
Block a user