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">
<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
}
@@ -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)
@@ -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()
@@ -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
))
}
}
@@ -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) {
@@ -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 {
@@ -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
@@ -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()) {
@@ -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)
@@ -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
}
@@ -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 {
@@ -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>>
@@ -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
@@ -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
}
@@ -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 {
@@ -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()
}
}
}
@@ -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)
@@ -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()
@@ -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)
@@ -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
}
@@ -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(
@@ -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"
+1 -1
View File
@@ -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"
+1 -1
View File
@@ -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"
+1 -1
View File
@@ -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"