Archived
Refactored some resources, centralised Firebase topics by creating an emun 'Topic'
This commit is contained in:
+3
-3
@@ -10,8 +10,8 @@ android {
|
||||
applicationId "com.denizd.substitutionplan"
|
||||
minSdkVersion 21
|
||||
targetSdkVersion 28
|
||||
versionCode 36
|
||||
versionName "2.2.13"
|
||||
versionCode 37
|
||||
versionName "2.2.14"
|
||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||
}
|
||||
buildTypes {
|
||||
@@ -32,7 +32,7 @@ dependencies {
|
||||
implementation 'com.google.android.material:material:1.1.0-alpha10'
|
||||
implementation 'com.android.support:customtabs:28.0.0'
|
||||
|
||||
implementation 'com.google.firebase:firebase-core:17.1.0'
|
||||
implementation 'com.google.firebase:firebase-core:17.2.0'
|
||||
implementation 'com.google.firebase:firebase-messaging:20.0.0'
|
||||
implementation 'com.crashlytics.sdk.android:crashlytics:2.10.1'
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
|
||||
|
||||
<application
|
||||
android:allowBackup="true"
|
||||
android:allowBackup="false"
|
||||
android:icon="@mipmap/ic_launcher"
|
||||
android:label="@string/appName"
|
||||
android:roundIcon="@mipmap/ic_launcher_round"
|
||||
|
||||
@@ -57,27 +57,29 @@ internal class FirstTime : AppCompatActivity(R.layout.activity_first_time) {
|
||||
prefs = PreferenceManager.getDefaultSharedPreferences(context) as SharedPreferences
|
||||
val edit = prefs.edit()
|
||||
val fab = findViewById<ExtendedFloatingActionButton>(R.id.efab)
|
||||
val start = Intent(this, Main::class.java)
|
||||
val name = findViewById<TextInputEditText>(R.id.txtName)
|
||||
val grade = findViewById<TextInputEditText>(R.id.txtClasses)
|
||||
val courses = findViewById<TextInputEditText>(R.id.txtCourses)
|
||||
val notif = findViewById<CheckBox>(R.id.cbNotif)
|
||||
val dark = findViewById<CheckBox>(R.id.cbDark)
|
||||
val pers = findViewById<CheckBox>(R.id.cbPersonalised)
|
||||
val helpClasses = findViewById<ImageButton>(R.id.chipHelpClasses)
|
||||
val helpCourses = findViewById<ImageButton>(R.id.chipHelpCourses)
|
||||
val greeting = findViewById<CheckBox>(R.id.cbGreetings)
|
||||
val mainActivity = Intent(this, Main::class.java)
|
||||
val nameEditText = findViewById<TextInputEditText>(R.id.txtName)
|
||||
val gradeEditText = findViewById<TextInputEditText>(R.id.txtClasses)
|
||||
val courseEditText = findViewById<TextInputEditText>(R.id.txtCourses)
|
||||
val helpGradeButton = findViewById<ImageButton>(R.id.chipHelpClasses)
|
||||
val helpCoursesButton = findViewById<ImageButton>(R.id.chipHelpCourses)
|
||||
val greetingCheckBox = findViewById<CheckBox>(R.id.cbGreetings)
|
||||
val notificationCheckBox = findViewById<CheckBox>(R.id.cbNotif)
|
||||
val darkModeCheckBox = findViewById<CheckBox>(R.id.cbDark)
|
||||
val personalPlanCheckBox = findViewById<CheckBox>(R.id.cbPersonalised)
|
||||
|
||||
notificationCheckBox.isChecked = true
|
||||
|
||||
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.P) {
|
||||
dark.visibility = View.GONE
|
||||
darkModeCheckBox.visibility = View.GONE
|
||||
}
|
||||
|
||||
helpClasses.setOnClickListener {
|
||||
helpGradeButton.setOnClickListener {
|
||||
createDialog(getString(R.string.enterGradeHelpTitle), getString(
|
||||
R.string.enterGradeHelp
|
||||
))
|
||||
}
|
||||
helpCourses.setOnClickListener {
|
||||
helpCoursesButton.setOnClickListener {
|
||||
createDialog(getString(R.string.enterCoursesHelpTitle), getString(
|
||||
R.string.enterCoursesHelp
|
||||
))
|
||||
@@ -89,22 +91,22 @@ internal class FirstTime : AppCompatActivity(R.layout.activity_first_time) {
|
||||
fab.isClickable = false
|
||||
|
||||
edit.putString("firstTimeDev", Calendar.getInstance().time.toString())
|
||||
.putString("username", name.text.toString())
|
||||
.putString("classes", grade.text.toString())
|
||||
.putString("courses", courses.text.toString())
|
||||
.putString("username", nameEditText.text.toString())
|
||||
.putString("classes", gradeEditText.text.toString())
|
||||
.putString("courses", courseEditText.text.toString())
|
||||
val themeInt = if (Build.VERSION.SDK_INT > Build.VERSION_CODES.P) {
|
||||
2
|
||||
} else {
|
||||
if (dark.isChecked) {
|
||||
if (darkModeCheckBox.isChecked) {
|
||||
1
|
||||
} else {
|
||||
0
|
||||
}
|
||||
}
|
||||
edit.putInt("themeInt", themeInt)
|
||||
edit.putBoolean("notif", notif.isChecked)
|
||||
.putBoolean("greeting", greeting.isChecked)
|
||||
.putBoolean("defaultPersonalised", pers.isChecked)
|
||||
edit.putBoolean("notif", notificationCheckBox.isChecked)
|
||||
.putBoolean("greeting", greetingCheckBox.isChecked)
|
||||
.putBoolean("defaultPersonalised", personalPlanCheckBox.isChecked)
|
||||
.putBoolean("firstTime", false)
|
||||
.putBoolean("colourTransferred", true)
|
||||
.apply()
|
||||
@@ -147,17 +149,15 @@ internal class FirstTime : AppCompatActivity(R.layout.activity_first_time) {
|
||||
}
|
||||
}, 1000)
|
||||
handler.postDelayed({
|
||||
startActivity(start)
|
||||
startActivity(mainActivity)
|
||||
finish()
|
||||
}, 2000)
|
||||
}
|
||||
}
|
||||
|
||||
private fun createDialog(title: String, text: String) {
|
||||
val alertDialog = AlertDialog.Builder(context,
|
||||
R.style.AlertDialog
|
||||
)
|
||||
val dialogView = LayoutInflater.from(context).inflate(R.layout.simple_dialog, null)
|
||||
val alertDialog = AlertDialog.Builder(context, R.style.AlertDialog)
|
||||
val dialogView = View.inflate(context, R.layout.simple_dialog, null)
|
||||
val dialogTitle = dialogView.findViewById<TextView>(R.id.textviewtitle)
|
||||
val dialogText = dialogView.findViewById<TextView>(R.id.dialogtext)
|
||||
dialogTitle.text = title
|
||||
|
||||
@@ -109,7 +109,6 @@ internal class Main : AppCompatActivity(R.layout.app_bar_main) {
|
||||
textViewGreeting.text = if (prefs.getBoolean("greeting", true) && (prefs.getString("username", "") ?: "").isNotEmpty()) {
|
||||
getGreetingString()
|
||||
} else {
|
||||
// textViewGreeting.visibility = View.GONE
|
||||
""
|
||||
}
|
||||
|
||||
@@ -213,7 +212,7 @@ internal class Main : AppCompatActivity(R.layout.app_bar_main) {
|
||||
|
||||
private fun openInfoDialog() {
|
||||
val dialog = AlertDialog.Builder(context)
|
||||
val dialogView = LayoutInflater.from(context).inflate(R.layout.simple_dialog, null)
|
||||
val dialogView = View.inflate(context, R.layout.simple_dialog, null)
|
||||
dialogView.findViewById<TextView>(R.id.textviewtitle).text = getString(
|
||||
R.string.information
|
||||
)
|
||||
@@ -242,7 +241,7 @@ internal class Main : AppCompatActivity(R.layout.app_bar_main) {
|
||||
return if (prefs.getBoolean("greeting", true)) {
|
||||
getString(R.string.yourPlan)
|
||||
} else {
|
||||
val user = (prefs.getString("username", "") ?: "").toString()
|
||||
val user = prefs.getString("username", "") ?: ""
|
||||
if (user.endsWith("s", true) || user.endsWith("x", true) || user.endsWith("z", true)) {
|
||||
"$user${getString(R.string.noSPlan)}"
|
||||
} else {
|
||||
|
||||
@@ -231,7 +231,7 @@ internal class DataFetcher(isPlan: Boolean, isMenu: Boolean, isJobService: Boole
|
||||
val notification = NotificationCompat.Builder(context, HelperFunctions.notificationChannelId)
|
||||
.setStyle(NotificationCompat.DecoratedCustomViewStyle())
|
||||
.setCustomContentView(notificationLayout)
|
||||
.setSmallIcon(R.drawable.ic_avh)
|
||||
.setSmallIcon(R.drawable.ic_avhlogo)
|
||||
.setContentIntent(openAppPending)
|
||||
.setAutoCancel(true)
|
||||
.setColor(ContextCompat.getColor(context, R.color.colorAccent))
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
package com.denizd.substitutionplan.data
|
||||
|
||||
internal enum class Topic(val tag: String) {
|
||||
ANDROID("substitutions-android"),
|
||||
BROADCAST("substitutions-broadcast"),
|
||||
IOS("substitutions-ios"),
|
||||
DEVELOPMENT("substitutions-debug")
|
||||
}
|
||||
@@ -10,8 +10,7 @@ import com.denizd.substitutionplan.models.Food
|
||||
|
||||
internal class FoodViewModel(application: Application) : AndroidViewModel(application) {
|
||||
|
||||
private val repository: FoodRepository =
|
||||
FoodRepository(application)
|
||||
private val repository: FoodRepository = FoodRepository(application)
|
||||
val allFoods: LiveData<List<Food>>?
|
||||
private val app = application
|
||||
|
||||
|
||||
@@ -10,8 +10,7 @@ import com.denizd.substitutionplan.models.Subst
|
||||
|
||||
internal class SubstViewModel(application: Application) : AndroidViewModel(application) {
|
||||
|
||||
private val repository: SubstRepository =
|
||||
SubstRepository(application)
|
||||
private val repository: SubstRepository = SubstRepository(application)
|
||||
val allSubst: LiveData<List<Subst>>?
|
||||
private val app = application
|
||||
|
||||
|
||||
@@ -15,7 +15,6 @@ 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
|
||||
|
||||
internal class FoodFragment : Fragment(R.layout.food_layout) {
|
||||
|
||||
|
||||
@@ -12,19 +12,19 @@ internal class PersonalPlanFragment : PlanFragment() {
|
||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||
super.onViewCreated(view, savedInstanceState)
|
||||
|
||||
smileydown = view.findViewById(R.id.smileydown)
|
||||
smileydowntext = view.findViewById(R.id.smileydowntext)
|
||||
linearsmiley = view.findViewById(R.id.linearsmiley)
|
||||
personalPlanEmptyEmoticon = view.findViewById(R.id.smileydown)
|
||||
personalPlanEmptyText = view.findViewById(R.id.smileydowntext)
|
||||
personalPlanEmptyLayout = view.findViewById(R.id.linearsmiley)
|
||||
|
||||
val coursePreference = prefs.getString("courses", "") ?: ""
|
||||
val classPreference = prefs.getString("classes", "") ?: ""
|
||||
|
||||
substViewModel.allSubst?.observe(this, Observer<List<Subst>> { substitutions ->
|
||||
planCardList.clear()
|
||||
smileydown.visibility = View.GONE
|
||||
smileydowntext.visibility = View.GONE
|
||||
linearsmiley.visibility = View.GONE
|
||||
persPlanEmpty = true
|
||||
personalPlanEmptyEmoticon.visibility = View.GONE
|
||||
personalPlanEmptyText.visibility = View.GONE
|
||||
personalPlanEmptyLayout.visibility = View.GONE
|
||||
isPersonalPlanEmpty = true
|
||||
recyclerView.visibility = View.VISIBLE
|
||||
|
||||
substitutions.filter { substItem ->
|
||||
@@ -37,16 +37,16 @@ internal class PersonalPlanFragment : PlanFragment() {
|
||||
}.forEach { substItem ->
|
||||
planCardList.add(substItem)
|
||||
}
|
||||
persPlanEmpty = (planCardList.size == 1 && planCardList[0].date.substring(0, 3) == "psa") || planCardList.isEmpty()
|
||||
isPersonalPlanEmpty = (planCardList.size == 1 && planCardList[0].date.substring(0, 3) == "psa") || planCardList.isEmpty()
|
||||
recyclerView.scheduleLayoutAnimation()
|
||||
mAdapter.setSubst(planCardList)
|
||||
|
||||
handler.postDelayed({
|
||||
if (persPlanEmpty) {
|
||||
smileydown.visibility = View.VISIBLE
|
||||
smileydowntext.visibility = View.VISIBLE
|
||||
linearsmiley.visibility = View.VISIBLE
|
||||
linearsmiley.scheduleLayoutAnimation()
|
||||
if (isPersonalPlanEmpty) {
|
||||
personalPlanEmptyEmoticon.visibility = View.VISIBLE
|
||||
personalPlanEmptyText.visibility = View.VISIBLE
|
||||
personalPlanEmptyLayout.visibility = View.VISIBLE
|
||||
personalPlanEmptyLayout.scheduleLayoutAnimation()
|
||||
}
|
||||
}, 64)
|
||||
})
|
||||
|
||||
@@ -18,7 +18,6 @@ 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
|
||||
|
||||
internal open class PlanFragment : Fragment(R.layout.plan) {
|
||||
@@ -29,10 +28,10 @@ internal open class PlanFragment : Fragment(R.layout.plan) {
|
||||
private lateinit var mContext: Context
|
||||
lateinit var prefs: SharedPreferences
|
||||
|
||||
lateinit var smileydown: TextView
|
||||
lateinit var smileydowntext: TextView
|
||||
lateinit var linearsmiley: LinearLayout
|
||||
var persPlanEmpty: Boolean = true
|
||||
lateinit var personalPlanEmptyEmoticon: TextView
|
||||
lateinit var personalPlanEmptyText: TextView
|
||||
lateinit var personalPlanEmptyLayout: LinearLayout
|
||||
var isPersonalPlanEmpty: Boolean = true
|
||||
val handler = Handler()
|
||||
|
||||
override fun onAttach(context: Context) {
|
||||
|
||||
@@ -14,7 +14,6 @@ import android.preference.PreferenceManager
|
||||
import android.provider.Settings
|
||||
import android.text.Editable
|
||||
import android.text.TextWatcher
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.Window
|
||||
import android.widget.*
|
||||
@@ -30,6 +29,7 @@ import com.denizd.substitutionplan.adapters.ColourAdapter
|
||||
import com.denizd.substitutionplan.adapters.RingtoneAdapter
|
||||
import com.denizd.substitutionplan.data.DataFetcher
|
||||
import com.denizd.substitutionplan.data.HelperFunctions
|
||||
import com.denizd.substitutionplan.data.Topic
|
||||
import com.denizd.substitutionplan.models.Colour
|
||||
import com.denizd.substitutionplan.models.Ringtone
|
||||
import com.google.android.material.bottomnavigation.BottomNavigationView
|
||||
@@ -45,7 +45,6 @@ internal class SettingsFragment : Fragment(R.layout.content_settings), View.OnCl
|
||||
|
||||
private lateinit var mContext: Context
|
||||
private lateinit var prefs: SharedPreferences
|
||||
private lateinit var edit: SharedPreferences.Editor
|
||||
private val builder = CustomTabsIntent.Builder()
|
||||
private val customTabsIntent = builder.build() as CustomTabsIntent
|
||||
private var cs: Int = 7
|
||||
@@ -58,50 +57,47 @@ internal class SettingsFragment : Fragment(R.layout.content_settings), View.OnCl
|
||||
super.onAttach(context)
|
||||
mContext = context
|
||||
prefs = PreferenceManager.getDefaultSharedPreferences(mContext)
|
||||
edit = prefs.edit()
|
||||
|
||||
window = activity?.window
|
||||
}
|
||||
|
||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||
super.onViewCreated(view, savedInstanceState)
|
||||
|
||||
val txtName = view.findViewById<TextInputEditText>(R.id.txtName)
|
||||
val txtClasses = view.findViewById<TextInputEditText>(R.id.txtClasses)
|
||||
val txtCourses = view.findViewById<TextInputEditText>(R.id.txtCourses)
|
||||
val nameEditText = view.findViewById<TextInputEditText>(R.id.txtName)
|
||||
val gradeEditText = view.findViewById<TextInputEditText>(R.id.txtClasses)
|
||||
val courseEditText = view.findViewById<TextInputEditText>(R.id.txtCourses)
|
||||
|
||||
val switchDisableGreeting = view.findViewById<Switch>(R.id.switchDisableGreeting)
|
||||
// val switchDark = view.findViewById<Switch>(R.id.switchDark)
|
||||
val switchNotifications = view.findViewById<Switch>(R.id.switchNotifications)
|
||||
val switchDefaultPlan = view.findViewById<Switch>(R.id.switchDefaultPlan)
|
||||
val switchAutoRefresh = view.findViewById<Switch>(R.id.switchAutoRefresh)
|
||||
val versionNumber = view.findViewById<TextView>(R.id.txtVersionTwo)
|
||||
val helpCourses = view.findViewById<ImageButton>(R.id.chipHelpCourses)
|
||||
val helpClasses = view.findViewById<ImageButton>(R.id.chipHelpClasses)
|
||||
val btnCustomiseColours = view.findViewById<LinearLayout>(R.id.btnCustomiseColours)
|
||||
val btnVersion = view.findViewById<LinearLayout>(R.id.btnVersion)
|
||||
val greetingSwitch = view.findViewById<Switch>(R.id.switchDisableGreeting)
|
||||
val notificationSwitch = view.findViewById<Switch>(R.id.switchNotifications)
|
||||
val defaultPlanSwitch = view.findViewById<Switch>(R.id.switchDefaultPlan)
|
||||
val autoRefreshSwitch = view.findViewById<Switch>(R.id.switchAutoRefresh)
|
||||
val versionNumberText = view.findViewById<TextView>(R.id.txtVersionTwo)
|
||||
val helpGradeButton = view.findViewById<ImageButton>(R.id.chipHelpClasses)
|
||||
val helpCoursesButton = view.findViewById<ImageButton>(R.id.chipHelpCourses)
|
||||
val colourCustomisationButton = view.findViewById<LinearLayout>(R.id.btnCustomiseColours)
|
||||
val versionButton = view.findViewById<LinearLayout>(R.id.btnVersion)
|
||||
currentRingtone = view.findViewById(R.id.txtCustomiseRingtone2)
|
||||
setRingtoneText()
|
||||
val btnForceRefresh = view.findViewById<LinearLayout>(R.id.btnForceRefresh)
|
||||
val forceRefreshButton = view.findViewById<LinearLayout>(R.id.btnForceRefresh)
|
||||
|
||||
switchDisableGreeting.setOnCheckedChangeListener(this)
|
||||
greetingSwitch.setOnCheckedChangeListener(this)
|
||||
// switchDark.setOnCheckedChangeListener(this)
|
||||
switchNotifications.setOnCheckedChangeListener(this)
|
||||
switchDefaultPlan.setOnCheckedChangeListener(this)
|
||||
switchAutoRefresh.setOnCheckedChangeListener(this)
|
||||
helpCourses.setOnClickListener(this)
|
||||
helpClasses.setOnClickListener(this)
|
||||
btnCustomiseColours.setOnClickListener(this)
|
||||
notificationSwitch.setOnCheckedChangeListener(this)
|
||||
defaultPlanSwitch.setOnCheckedChangeListener(this)
|
||||
autoRefreshSwitch.setOnCheckedChangeListener(this)
|
||||
helpCoursesButton.setOnClickListener(this)
|
||||
helpGradeButton.setOnClickListener(this)
|
||||
colourCustomisationButton.setOnClickListener(this)
|
||||
view.findViewById<LinearLayout>(R.id.btnNoNotif).setOnClickListener(this)
|
||||
view.findViewById<LinearLayout>(R.id.btnCustomiseRingtone).setOnClickListener(this)
|
||||
view.findViewById<LinearLayout>(R.id.btnWebsite).setOnClickListener(this)
|
||||
view.findViewById<LinearLayout>(R.id.btnLicences).setOnClickListener(this)
|
||||
view.findViewById<LinearLayout>(R.id.btnTerms).setOnClickListener(this)
|
||||
view.findViewById<LinearLayout>(R.id.btnPrivacyP).setOnClickListener(this)
|
||||
btnVersion.setOnClickListener(this)
|
||||
btnForceRefresh.setOnClickListener(this)
|
||||
btnForceRefresh.setOnLongClickListener {
|
||||
edit.putString("timeNew", "").putString("newFoodTime", "").apply()
|
||||
versionButton.setOnClickListener(this)
|
||||
forceRefreshButton.setOnClickListener(this)
|
||||
forceRefreshButton.setOnLongClickListener {
|
||||
prefs.edit().putString("timeNew", "").putString("newFoodTime", "").apply()
|
||||
makeToast(mContext.getString(R.string.forcedRefreshTimes))
|
||||
true
|
||||
}
|
||||
@@ -124,7 +120,7 @@ internal class SettingsFragment : Fragment(R.layout.content_settings), View.OnCl
|
||||
darkModeDropDown.setText(darkModeDropDown.adapter.getItem(prefs.getInt("themeInt", 0)).toString(), false)
|
||||
|
||||
darkModeDropDown.setOnItemClickListener { _, _, position, _ ->
|
||||
edit.putInt("themeInt", position).apply()
|
||||
prefs.edit().putInt("themeInt", position).apply()
|
||||
|
||||
val bottomNav = view.rootView.findViewById<BottomNavigationView>(R.id.bottom_nav)
|
||||
when (position) {
|
||||
@@ -153,42 +149,42 @@ internal class SettingsFragment : Fragment(R.layout.content_settings), View.OnCl
|
||||
}
|
||||
}
|
||||
|
||||
switchDisableGreeting.isChecked = prefs.getBoolean("greeting", true)
|
||||
greetingSwitch.isChecked = prefs.getBoolean("greeting", true)
|
||||
|
||||
switchNotifications.isChecked = prefs.getBoolean("notif", false)
|
||||
switchDefaultPlan.isChecked = prefs.getBoolean("defaultPersonalised", false)
|
||||
switchAutoRefresh.isChecked = prefs.getBoolean("autoRefresh", false)
|
||||
notificationSwitch.isChecked = prefs.getBoolean("notif", false)
|
||||
defaultPlanSwitch.isChecked = prefs.getBoolean("defaultPersonalised", false)
|
||||
autoRefreshSwitch.isChecked = prefs.getBoolean("autoRefresh", false)
|
||||
|
||||
versionNumber.text = BuildConfig.VERSION_NAME
|
||||
versionNumberText.text = BuildConfig.VERSION_NAME
|
||||
|
||||
txtName.setText(prefs.getString("username", ""))
|
||||
txtName.addTextChangedListener(object: TextWatcher {
|
||||
nameEditText.setText(prefs.getString("username", ""))
|
||||
nameEditText.addTextChangedListener(object: TextWatcher {
|
||||
override fun afterTextChanged(s: Editable) {}
|
||||
override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {}
|
||||
override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {
|
||||
edit.putString("username", txtName.text.toString().trim()).apply()
|
||||
prefs.edit().putString("username", nameEditText.text.toString().trim()).apply()
|
||||
}
|
||||
})
|
||||
|
||||
txtClasses.setText(prefs.getString("classes", ""))
|
||||
txtClasses.addTextChangedListener(object: TextWatcher {
|
||||
gradeEditText.setText(prefs.getString("classes", ""))
|
||||
gradeEditText.addTextChangedListener(object: TextWatcher {
|
||||
override fun afterTextChanged(s: Editable) {}
|
||||
override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {}
|
||||
override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {
|
||||
edit.putString("classes", txtClasses.text.toString()).apply()
|
||||
prefs.edit().putString("classes", gradeEditText.text.toString()).apply()
|
||||
}
|
||||
})
|
||||
|
||||
txtCourses.setText(prefs.getString("courses", ""))
|
||||
txtCourses.addTextChangedListener(object: TextWatcher {
|
||||
courseEditText.setText(prefs.getString("courses", ""))
|
||||
courseEditText.addTextChangedListener(object: TextWatcher {
|
||||
override fun afterTextChanged(s: Editable) {}
|
||||
override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {}
|
||||
override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {
|
||||
edit.putString("courses", txtCourses.text.toString()).apply()
|
||||
prefs.edit().putString("courses", courseEditText.text.toString()).apply()
|
||||
}
|
||||
})
|
||||
|
||||
btnVersion.setOnLongClickListener {
|
||||
versionButton.setOnLongClickListener {
|
||||
makeToast(getString(R.string.madeBy))
|
||||
debugMenu()
|
||||
}
|
||||
@@ -282,31 +278,29 @@ internal class SettingsFragment : Fragment(R.layout.content_settings), View.OnCl
|
||||
).execute()
|
||||
}
|
||||
}
|
||||
edit.apply()
|
||||
}
|
||||
|
||||
override fun onCheckedChanged(v: CompoundButton?, isChecked: Boolean) {
|
||||
if (v?.isPressed == true) {
|
||||
when (v.id) {
|
||||
R.id.switchDisableGreeting -> {
|
||||
edit.putBoolean("greeting", isChecked)
|
||||
prefs.edit().putBoolean("greeting", isChecked).apply()
|
||||
}
|
||||
R.id.switchNotifications -> {
|
||||
edit.putBoolean("notif", isChecked)
|
||||
prefs.edit().putBoolean("notif", isChecked).apply()
|
||||
if (isChecked) {
|
||||
subToTopic("android")
|
||||
subscribeToTopic(Topic.ANDROID)
|
||||
} else {
|
||||
unsubFromTopic("android")
|
||||
unsubscribeFromTopic(Topic.ANDROID)
|
||||
}
|
||||
}
|
||||
R.id.switchDefaultPlan -> {
|
||||
edit.putBoolean("defaultPersonalised", isChecked)
|
||||
prefs.edit().putBoolean("defaultPersonalised", isChecked).apply()
|
||||
}
|
||||
R.id.switchAutoRefresh -> {
|
||||
edit.putBoolean("autoRefresh", isChecked)
|
||||
prefs.edit().putBoolean("autoRefresh", isChecked).apply()
|
||||
}
|
||||
}
|
||||
edit.apply()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -314,7 +308,7 @@ internal class SettingsFragment : Fragment(R.layout.content_settings), View.OnCl
|
||||
val alertDialog = AlertDialog.Builder(mContext,
|
||||
R.style.AlertDialog
|
||||
)
|
||||
val dialogView = LayoutInflater.from(mContext).inflate(R.layout.simple_dialog, null)
|
||||
val dialogView = View.inflate(mContext, R.layout.simple_dialog, null)
|
||||
dialogView.findViewById<TextView>(R.id.textviewtitle).text = title
|
||||
dialogView.findViewById<TextView>(R.id.dialogtext).text = text
|
||||
alertDialog.setView(dialogView).show()
|
||||
@@ -323,7 +317,7 @@ internal class SettingsFragment : Fragment(R.layout.content_settings), View.OnCl
|
||||
private fun createColourDialog() {
|
||||
val colourCustomiserBuilder = AlertDialog.Builder(mContext, R.style.AlertDialog)
|
||||
|
||||
val dialogView = LayoutInflater.from(mContext).inflate(R.layout.recycler_dialog, null)
|
||||
val dialogView = View.inflate(mContext, R.layout.recycler_dialog, null)
|
||||
val titleText = dialogView.findViewById<TextView>(R.id.empty_textviewtitle)
|
||||
titleText.text = getString(R.string.customiseColoursTitle)
|
||||
colourRecycler = dialogView.findViewById(R.id.recyclerView)
|
||||
@@ -390,7 +384,7 @@ internal class SettingsFragment : Fragment(R.layout.content_settings), View.OnCl
|
||||
} else {
|
||||
val ringtoneCustomiserBuilder = AlertDialog.Builder(mContext, R.style.AlertDialog)
|
||||
|
||||
val dialogView = LayoutInflater.from(mContext).inflate(R.layout.recycler_dialog, null)
|
||||
val dialogView = View.inflate(mContext, R.layout.recycler_dialog, null)
|
||||
val titleText = dialogView.findViewById<TextView>(R.id.empty_textviewtitle)
|
||||
titleText.text = getString(R.string.pickRingtone)
|
||||
|
||||
@@ -454,12 +448,12 @@ internal class SettingsFragment : Fragment(R.layout.content_settings), View.OnCl
|
||||
|
||||
override fun onClick(position: Int, title: String, titleNoLang: String) {
|
||||
val colourPickerBuilder = AlertDialog.Builder(mContext, R.style.AlertDialog)
|
||||
val pickerDialogView = LayoutInflater.from(mContext).inflate(R.layout.empty_dialog, null)
|
||||
val pickerDialogView = View.inflate(mContext, R.layout.empty_dialog, null)
|
||||
val pickerTitleText = pickerDialogView.findViewById<TextView>(R.id.empty_textviewtitle)
|
||||
val pickerLayout = pickerDialogView.findViewById<LinearLayout>(R.id.empty_linearlayout)
|
||||
pickerTitleText.text = title
|
||||
|
||||
val picker = LayoutInflater.from(mContext).inflate(R.layout.bg_colour_picker, null)
|
||||
val picker = View.inflate(mContext, R.layout.bg_colour_picker, null)
|
||||
pickerLayout.addView(picker)
|
||||
colourPickerBuilder.setView(pickerDialogView)
|
||||
val colourPickerDialog: AlertDialog = colourPickerBuilder.create()
|
||||
@@ -472,7 +466,6 @@ internal class SettingsFragment : Fragment(R.layout.content_settings), View.OnCl
|
||||
|
||||
for (i2 in buttons.indices) {
|
||||
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()
|
||||
colourRecycler.adapter = ColourAdapter(getColourList(), this)
|
||||
@@ -484,10 +477,8 @@ internal class SettingsFragment : Fragment(R.layout.content_settings), View.OnCl
|
||||
}
|
||||
|
||||
private fun debugMenu(): Boolean {
|
||||
val alertDialog = AlertDialog.Builder(mContext,
|
||||
R.style.AlertDialog
|
||||
)
|
||||
val dialogView = LayoutInflater.from(mContext).inflate(R.layout.edittext_dialog, null)
|
||||
val alertDialog = AlertDialog.Builder(mContext, R.style.AlertDialog)
|
||||
val dialogView = View.inflate(mContext, R.layout.edittext_dialog, null)
|
||||
val dialogEditText = dialogView.findViewById<EditText>(R.id.dialog_edittext)
|
||||
val dialogButton = dialogView.findViewById<Button>(R.id.dialog_button)
|
||||
|
||||
@@ -501,7 +492,7 @@ internal class SettingsFragment : Fragment(R.layout.content_settings), View.OnCl
|
||||
when (dialogEditText.text.toString()) {
|
||||
"_DIAGNOSTICS" -> {
|
||||
val alertDialogDev = AlertDialog.Builder(mContext, R.style.AlertDialog)
|
||||
val devDialogView = LayoutInflater.from(mContext).inflate(R.layout.diagnostics_dialog, null)
|
||||
val devDialogView = View.inflate(mContext, R.layout.diagnostics_dialog, null)
|
||||
val devDialogText = devDialogView.findViewById<TextView>(R.id.dialogtext)
|
||||
val resetLaunchBtn = devDialogView.findViewById<Button>(R.id.btnResetLaunch)
|
||||
val resetNotificationBtn = devDialogView.findViewById<Button>(R.id.btnResetNotif)
|
||||
@@ -509,16 +500,16 @@ internal class SettingsFragment : Fragment(R.layout.content_settings), View.OnCl
|
||||
devDialogView.findViewById<TextView>(R.id.textviewtitle).text = getString(
|
||||
R.string.diagnosticsMenu
|
||||
)
|
||||
devDialogText.text = getDiagnosticsText(prefs)
|
||||
devDialogText.text = getDiagnosticsText()
|
||||
|
||||
resetLaunchBtn.setOnClickListener {
|
||||
edit.putInt("launchDev", 0).apply()
|
||||
devDialogText.text = getDiagnosticsText(prefs)
|
||||
prefs.edit().putInt("launchDev", 0).apply()
|
||||
devDialogText.text = getDiagnosticsText()
|
||||
}
|
||||
|
||||
resetNotificationBtn.setOnClickListener {
|
||||
edit.putInt("pingFB", 0).apply()
|
||||
devDialogText.text = getDiagnosticsText(prefs)
|
||||
prefs.edit().putInt("pingFB", 0).apply()
|
||||
devDialogText.text = getDiagnosticsText()
|
||||
}
|
||||
|
||||
alertDialogDev.setView(devDialogView)
|
||||
@@ -534,34 +525,34 @@ internal class SettingsFragment : Fragment(R.layout.content_settings), View.OnCl
|
||||
}
|
||||
}
|
||||
"_FIRSTTIME" -> {
|
||||
edit.putBoolean("firstTime", true).apply()
|
||||
prefs.edit().putBoolean("firstTime", true).apply()
|
||||
makeToast("First time flag cleared")
|
||||
}
|
||||
"_TESTURLS" -> {
|
||||
val currentTest = !prefs.getBoolean("testUrls", false)
|
||||
edit.putBoolean("testUrls", currentTest).apply()
|
||||
prefs.edit().putBoolean("testUrls", currentTest).apply()
|
||||
makeToast("Test URLs set to $currentTest")
|
||||
}
|
||||
"_DEVCHANNEL" -> {
|
||||
val subbed = if (prefs.getBoolean("subscribedToFBDebugChannel", false)) {
|
||||
unsubFromTopic("debug")
|
||||
unsubscribeFromTopic(Topic.DEVELOPMENT)
|
||||
"Unsubscribed from"
|
||||
} else {
|
||||
subToTopic("debug")
|
||||
subscribeToTopic(Topic.DEVELOPMENT)
|
||||
"Subscribed to"
|
||||
}
|
||||
edit.putBoolean("subscribedToFBDebugChannel", !prefs.getBoolean("subscribedToFBDebugChannel", false)).apply()
|
||||
prefs.edit().putBoolean("subscribedToFBDebugChannel", !prefs.getBoolean("subscribedToFBDebugChannel", false)).apply()
|
||||
makeToast("$subbed Firebase development channel")
|
||||
}
|
||||
"_IOSCHANNEL" -> {
|
||||
val subbed = if (prefs.getBoolean("subscribedToiOSChannel", false)) {
|
||||
unsubFromTopic("ios")
|
||||
unsubscribeFromTopic(Topic.IOS)
|
||||
"Unsubscribed from"
|
||||
} else {
|
||||
subToTopic("ios")
|
||||
subscribeToTopic(Topic.IOS)
|
||||
"Subscribed to"
|
||||
}
|
||||
edit.putBoolean("subscribedToiOSChannel", !prefs.getBoolean("subscribedToiOSChannel", false)).apply()
|
||||
prefs.edit().putBoolean("subscribedToiOSChannel", !prefs.getBoolean("subscribedToiOSChannel", false)).apply()
|
||||
makeToast("$subbed iOS channel")
|
||||
}
|
||||
"_WRITE" -> HelperFunctions.writePrefsToXml(prefs, mContext, activity!!)
|
||||
@@ -578,7 +569,7 @@ internal class SettingsFragment : Fragment(R.layout.content_settings), View.OnCl
|
||||
Toast.makeText(mContext, text, Toast.LENGTH_LONG).show()
|
||||
}
|
||||
|
||||
private fun getDiagnosticsText(prefs: SharedPreferences): String {
|
||||
private fun getDiagnosticsText(): String {
|
||||
return "First Launch: ${prefs.getString("firstTimeDev", "")}" +
|
||||
"\n\nApp launched: ${prefs.getInt("launchDev", 0)}" +
|
||||
"\n\nFirebase ping service fired: ${prefs.getInt("pingFB", 0)}" +
|
||||
@@ -586,9 +577,10 @@ internal class SettingsFragment : Fragment(R.layout.content_settings), View.OnCl
|
||||
"\n\nDevice Model: ${Build.MODEL}" +
|
||||
"\n\nAndroid Version: ${Build.VERSION.RELEASE}" +
|
||||
"\n\nSubscribed to notification channel: ${prefs.getBoolean("notif", false)}" +
|
||||
"\n\nSubscribed to iOS channel: ${prefs.getBoolean("subscribedToiOSChannel", false)}" +
|
||||
"\n\nSubscribed to dev channel: ${prefs.getBoolean("subscribedToFBDebugChannel", false)}"
|
||||
}
|
||||
|
||||
private fun subToTopic(topic: String) = FirebaseMessaging.getInstance().subscribeToTopic("substitutions-$topic")
|
||||
private fun unsubFromTopic(topic: String) = FirebaseMessaging.getInstance().unsubscribeFromTopic("substitutions-$topic")
|
||||
private fun subscribeToTopic(topic: Topic) = FirebaseMessaging.getInstance().subscribeToTopic(topic.tag)
|
||||
private fun unsubscribeFromTopic(topic: Topic) = FirebaseMessaging.getInstance().unsubscribeFromTopic(topic.tag)
|
||||
}
|
||||
@@ -3,6 +3,7 @@ package com.denizd.substitutionplan.services
|
||||
import android.app.job.JobParameters
|
||||
import android.app.job.JobService
|
||||
import android.preference.PreferenceManager
|
||||
import com.denizd.substitutionplan.data.Topic
|
||||
import com.google.firebase.FirebaseApp
|
||||
import com.google.firebase.messaging.FirebaseMessaging
|
||||
|
||||
@@ -23,33 +24,29 @@ internal class FBPingService : JobService() {
|
||||
|
||||
private fun doBackgroundWork(params: JobParameters) {
|
||||
val prefs = PreferenceManager.getDefaultSharedPreferences(context)
|
||||
|
||||
FirebaseApp.initializeApp(context)
|
||||
|
||||
FirebaseMessaging.getInstance().apply {
|
||||
|
||||
if (prefs.getBoolean("notif", true)) {
|
||||
subscribeToTopic("substitutions-android")
|
||||
subscribeToTopic(Topic.ANDROID.tag)
|
||||
} else {
|
||||
unsubscribeFromTopic("substitutions-android")
|
||||
unsubscribeFromTopic(Topic.ANDROID.tag)
|
||||
}
|
||||
|
||||
if (prefs.getBoolean("subscribedToFBDebugChannel", false)) {
|
||||
subscribeToTopic("substitutions-debug")
|
||||
subscribeToTopic(Topic.DEVELOPMENT.tag)
|
||||
} else {
|
||||
unsubscribeFromTopic("substitutions-debug")
|
||||
unsubscribeFromTopic(Topic.DEVELOPMENT.tag)
|
||||
}
|
||||
|
||||
if (prefs.getBoolean("subscribedToiOSChannel", false)) {
|
||||
subscribeToTopic("substitutions-ios")
|
||||
subscribeToTopic(Topic.IOS.tag)
|
||||
} else {
|
||||
unsubscribeFromTopic("substitutions-ios")
|
||||
unsubscribeFromTopic(Topic.IOS.tag)
|
||||
}
|
||||
|
||||
subscribeToTopic("substitutions-broadcast")
|
||||
subscribeToTopic(Topic.BROADCAST.tag)
|
||||
|
||||
prefs.edit().putInt("pingFB", prefs.getInt("pingFB", 0) + 1).apply()
|
||||
|
||||
}
|
||||
jobFinished(params, false)
|
||||
}
|
||||
|
||||
@@ -127,7 +127,7 @@
|
||||
<string name="success">Erfolg</string>
|
||||
<string name="notReceivingNotifications1">Benachrichtigungen kommen nicht an?</string>
|
||||
<string name="notReceivingNotifications2">Klick hier um zu sehen, warum</string>
|
||||
<string name="notReceivingNotificationsHelp">Bemerke, dass diese Tipps insbesondere auf Huawei/Honor-Geräten nicht funktionieren könnten. Du kannst sie trotzdem ausprobieren.\n\nAkkusparfunktionen können dazu führen, dass Benachrichtigungen nicht ankommen. Versuche, Akkusparmodi auf deren Standardeinstellung zu setzen.\n\nEinige Geräte beschränken Apps im Hintergrund. Suche in deinen Geräteeinstellungen unter Apps die Vertretungsplan-App und schaue dann nach einer Einstellung namens \"Hintergrund-Services beschränken\" (oder ähnlich) und stelle sicher, dass diese ausgestellt ist.\n\nBei Schwierigkeiten kann ich auch gerne helfen.</string>
|
||||
<string name="notReceivingNotificationsHelp">Bemerke, dass diese Tipps insbesondere auf einigen Geräten chinesischer Hersteller nicht funktionieren könnten. Du kannst sie trotzdem ausprobieren.\n\nAkkusparfunktionen können dazu führen, dass Benachrichtigungen nicht ankommen. Versuche, Akkusparmodi auf deren Standardeinstellung zu setzen.\n\nEinige Geräte beschränken Apps im Hintergrund. Suche in deinen Geräteeinstellungen unter Apps die Vertretungsplan-App und schaue dann nach einer Einstellung namens \"Hintergrund-Services beschränken\" (oder ähnlich) und stelle sicher, dass diese ausgestellt ist.\n\nBei Schwierigkeiten kann ich auch gerne helfen.</string>
|
||||
<string name="appTheme">App-Design</string>
|
||||
<string-array name="themes">
|
||||
<item>Hell</item>
|
||||
|
||||
@@ -140,7 +140,7 @@
|
||||
<string name="success">Success</string>
|
||||
<string name="notReceivingNotifications1">Not receiving notifications?</string>
|
||||
<string name="notReceivingNotifications2">Click to see why</string>
|
||||
<string name="notReceivingNotificationsHelp">Note: on Huawei/Honor devices, there may not be a solution to this problem. You\'re welcome to try the tips provided.\n\nBattery saver functions often cause notifications to be delayed or not be received at all. Try setting any battery saving options to their default setting.\n\nSome devices restrict background usage of apps. Please go to your device app settings, select the app and check for a toggle named \"Restrict background usage\" (or similar) and verify that the setting is turned off.\n\nYou\'re also welcome to ask me for help.</string>
|
||||
<string name="notReceivingNotificationsHelp">Note: on some Chinese-branded devices, there may not be a solution to this problem. You\'re welcome to try the tips provided.\n\nBattery saver functions often cause notifications to be delayed or not be received at all. Try setting any battery saving options to their default setting.\n\nSome devices restrict background usage of apps. Please go to your device app settings, select the app and check for a toggle named \"Restrict background usage\" (or similar) and verify that the setting is turned off.\n\nYou\'re also welcome to ask me for help.</string>
|
||||
<string name="appTheme">App theme</string>
|
||||
<string-array name="themes">
|
||||
<item>Light</item>
|
||||
|
||||
Reference in New Issue
Block a user