Changed colour picker from a single palette dialog to recycler view to gain parity with iOS-version

This commit is contained in:
Deniz Düzgören
2019-10-15 08:29:53 +02:00
parent cad72fb90a
commit 3b239fc22d
20 changed files with 262 additions and 494 deletions
@@ -0,0 +1,58 @@
package com.denizd.substitutionplan.adapters
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
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
/**
* Adapter class used for displaying the colours available for tinting courses on the substitution
* plan. Used in SettingsFragment.kt
*
* @param colours a list of all available colours
* @param onClickListener a reference to an OnClickListener
*/
internal class ColourPickerAdapter(private var colours: List<Colour>, private val onClickListener: OnColourClickListener) : RecyclerView.Adapter<ColourPickerAdapter.ColourPickerViewHolder>() {
internal class ColourPickerViewHolder(view: View, private val clickListener: OnColourClickListener) : RecyclerView.ViewHolder(view), View.OnClickListener {
val title: TextView = view.findViewById(R.id.item_text)
var image: ImageView = view.findViewById(R.id.item_image)
var colourNoLang = ""
init { view.setOnClickListener(this) }
override fun onClick(v: View?) { clickListener.onColourClick(adapterPosition, colourNoLang) }
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ColourPickerViewHolder {
val v = LayoutInflater.from(parent.context).inflate(R.layout.colour_picker_item, parent, false)
return ColourPickerViewHolder(v, onClickListener)
}
override fun onBindViewHolder(holder: ColourPickerViewHolder, position: Int) {
val currentItem = colours[position]
holder.title.text = currentItem.title
holder.colourNoLang = currentItem.titleNoLang
val bg = ContextCompat.getDrawable(holder.image.context, R.drawable.circle)
bg?.setTint((ContextCompat.getColor(holder.image.context, if (currentItem.colour != 0) {
currentItem.colour
} else {
R.color.colorBackgroundLight
})))
holder.image.background = bg
}
override fun getItemCount(): Int = colours.size
internal interface OnColourClickListener {
fun onColourClick(position: Int, colourNoLang: String)
}
}
@@ -18,25 +18,25 @@ import com.google.android.material.card.MaterialCardView
* @param colours a list of all courses and their associated colour
* @param onClickListener a reference to an OnClickListener
*/
internal class ColourAdapter(private var colours: List<Colour>, private val onClickListener: OnColourClickListener) : RecyclerView.Adapter<ColourAdapter.ColourViewHolder>() {
internal class CourseColourAdapter(private var colours: List<Colour>, private val onClickListener: OnCourseColourClickListener) : RecyclerView.Adapter<CourseColourAdapter.CourseColourViewHolder>() {
internal class ColourViewHolder(view: View, private val clickListener: OnColourClickListener) : RecyclerView.ViewHolder(view), View.OnClickListener {
internal class CourseColourViewHolder(view: View, private val clickListener: OnCourseColourClickListener) : RecyclerView.ViewHolder(view), View.OnClickListener {
val title: TextView = view.findViewById(R.id.item_text)
var image: ImageView = view.findViewById(R.id.item_image)
var titleNoLang: String = ""
val cardView: MaterialCardView = view.findViewById(R.id.cardView)
init { view.setOnClickListener(this) }
override fun onClick(v: View?) { clickListener.onColourClick(adapterPosition, title.text.toString(), titleNoLang) }
override fun onClick(v: View?) { clickListener.onCourseClick(adapterPosition, title.text.toString(), titleNoLang) }
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ColourViewHolder {
val v = LayoutInflater.from(parent.context).inflate(R.layout.list_item, parent, false)
return ColourViewHolder(v, onClickListener)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CourseColourViewHolder {
val v = LayoutInflater.from(parent.context).inflate(R.layout.course_colour_picker_item, parent, false)
return CourseColourViewHolder(v, onClickListener)
}
override fun onBindViewHolder(holder: ColourViewHolder, position: Int) {
override fun onBindViewHolder(holder: CourseColourViewHolder, position: Int) {
val currentItem = colours[position]
holder.title.text = currentItem.title
@@ -60,7 +60,7 @@ internal class ColourAdapter(private var colours: List<Colour>, private val onCl
override fun getItemCount(): Int = colours.size
internal interface OnColourClickListener {
fun onColourClick(position: Int, title: String, titleNoLang: String)
internal interface OnCourseColourClickListener {
fun onCourseClick(position: Int, title: String, titleNoLang: String)
}
}
@@ -32,7 +32,7 @@ internal class RingtoneAdapter(private val ringtones: List<Ringtone>, private va
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RingtoneViewHolder {
val v = LayoutInflater.from(parent.context).inflate(R.layout.list_item, parent, false)
val v = LayoutInflater.from(parent.context).inflate(R.layout.course_colour_picker_item, parent, false)
return RingtoneViewHolder(v, onClickListener)
}
@@ -119,7 +119,7 @@ internal class SubstitutionAdapter(private var substitutions: List<Substitution>
} else {
""
}
colour = HelperFunctions.getColourForString(colourPrefsInt)
colour = HelperFunctions.getColourForString(colourPrefsInt, holder.context)
cardBackgroundColour = if (colour != 0) {
colour
} else {
@@ -20,6 +20,7 @@ import androidx.core.content.ContextCompat
import androidx.core.content.ContextCompat.checkSelfPermission
import androidx.fragment.app.FragmentActivity
import com.denizd.substitutionplan.R
import com.denizd.substitutionplan.models.Colour
import com.denizd.substitutionplan.models.Substitution
import java.util.*
import java.io.File
@@ -43,8 +44,8 @@ internal object HelperFunctions {
"Physics", "CompSci", "PhysEd", "GLL", "WAT", "Forder", "WP")
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")
"brown", "grey", "salmon", "tangerine", "banana", "flora", "spindrift", "sky", "orchid",
"lavender", "carnation", "brown2", "pureWhite", "pureBlack")
/**
* A lower-cased list of all phrases used to describe that a course has been cancelled. Expand
@@ -83,33 +84,41 @@ internal object HelperFunctions {
const val notificationChannelId = "general"
fun getColourForString(name: String): Int {
return when (name) {
"red" -> R.color.bgRed
"orange" -> R.color.bgOrange
"yellow" -> R.color.bgYellow
"green" -> R.color.bgGreen
"teal" -> R.color.bgTeal
"cyan" -> R.color.bgCyan
"blue" -> R.color.bgBlue
"purple" -> R.color.bgPurple
"pink" -> R.color.bgPink
"brown" -> R.color.bgBrown
"grey" -> R.color.bgGrey
"pureWhite" -> R.color.bgPureWhite
"salmon" -> R.color.bgSalmon
"tangerine" -> R.color.bgTangerine
"banana" -> R.color.bgBanana
"flora" -> R.color.bgFlora
"spindrift" -> R.color.bgSpindrift
"sky" -> R.color.bgSky
"orchid" -> R.color.bgOrchid
"lavender" -> R.color.bgLavender
"carnation" -> R.color.bgCarnation
"brown2" -> R.color.bgBrown2
"pureBlack" -> R.color.bgPureBlack
else -> R.color.colorBackgroundLight
fun getColourArray(c: Context): Array<Colour> {
val titles = c.resources.getStringArray(R.array.colour_names)
return arrayOf(
Colour(titles[0], "default", 0, 0),
Colour(titles[1], "red", 0, R.color.bgRed),
Colour(titles[2], "orange", 0, R.color.bgOrange),
Colour(titles[3], "yellow", 0, R.color.bgYellow),
Colour(titles[4], "green", 0, R.color.bgGreen),
Colour(titles[5], "teal", 0, R.color.bgTeal),
Colour(titles[6], "cyan", 0, R.color.bgCyan),
Colour(titles[7], "blue", 0, R.color.bgBlue),
Colour(titles[8], "purple", 0, R.color.bgPurple),
Colour(titles[9], "pink", 0, R.color.bgPink),
Colour(titles[10], "brown", 0, R.color.bgBrown),
Colour(titles[11], "grey", 0, R.color.bgGrey),
Colour(titles[12], "salmon", 0, R.color.bgSalmon),
Colour(titles[13], "tangerine", 0, R.color.bgTangerine),
Colour(titles[14], "banana", 0, R.color.bgBanana),
Colour(titles[15], "flora", 0, R.color.bgFlora),
Colour(titles[16], "spindrift", 0, R.color.bgSpindrift),
Colour(titles[17], "sky", 0, R.color.bgSky),
Colour(titles[18], "orchid", 0, R.color.bgOrchid),
Colour(titles[19], "lavender", 0, R.color.bgLavender),
Colour(titles[20], "carnation", 0, R.color.bgCarnation),
Colour(titles[21], "brown2", 0, R.color.bgBrown2),
Colour(titles[22], "pureWhite", 0, R.color.bgPureWhite),
Colour(titles[23], "pureBlack", 0, R.color.bgPureBlack)
)
}
fun getColourForString(name: String, context: Context): Int {
for (colour in getColourArray(context)) {
if (colour.titleNoLang == name) return colour.colour
}
return 0
}
fun getIconForCourse(course: String): Int {
@@ -27,7 +27,8 @@ 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.ColourPickerAdapter
import com.denizd.substitutionplan.adapters.CourseColourAdapter
import com.denizd.substitutionplan.adapters.RingtoneAdapter
import com.denizd.substitutionplan.data.DataFetcher
import com.denizd.substitutionplan.data.HelperFunctions
@@ -41,8 +42,8 @@ import com.google.firebase.messaging.FirebaseMessaging
import kotlin.collections.ArrayList
internal class SettingsFragment : Fragment(), View.OnClickListener, View.OnLongClickListener,
CompoundButton.OnCheckedChangeListener, ColourAdapter.OnColourClickListener,
RingtoneAdapter.OnRingtoneClickListener {
CompoundButton.OnCheckedChangeListener, CourseColourAdapter.OnCourseColourClickListener,
RingtoneAdapter.OnRingtoneClickListener, ColourPickerAdapter.OnColourClickListener {
private lateinit var mContext: Context
private lateinit var prefs: SharedPreferences
@@ -50,6 +51,7 @@ internal class SettingsFragment : Fragment(), View.OnClickListener, View.OnLongC
private var window: Window? = null
private var longPressed = false
private var versionCount = 0
private var currentCourseSelectedInColourPicker = ""
private val ringtones: List<Ringtone> by lazy {
getRingtones()
@@ -57,6 +59,7 @@ internal class SettingsFragment : Fragment(), View.OnClickListener, View.OnLongC
private lateinit var colourRecycler: RecyclerView
private lateinit var ringtoneDialog: AlertDialog
private lateinit var colourPickerDialog: AlertDialog
private lateinit var binding: ContentSettingsBinding
private lateinit var textCustomiseColoursTitle: TextView
@@ -311,36 +314,31 @@ internal class SettingsFragment : Fragment(), View.OnClickListener, View.OnLongC
}
// Functions for handling touch events for recycler view elements
override fun onColourClick(position: Int, title: String, titleNoLang: String) {
override fun onCourseClick(position: Int, title: String, titleNoLang: String) {
currentCourseSelectedInColourPicker = titleNoLang
val colourPickerBuilder = AlertDialog.Builder(mContext)
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 = View.inflate(mContext, R.layout.bg_colour_picker, null)
pickerLayout.addView(picker)
colourPickerBuilder.setView(pickerDialogView)
val colourPickerDialog: AlertDialog = colourPickerBuilder.create()
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 = HelperFunctions.colourNames
for (i2 in buttons.indices) {
picker.findViewById<MaterialButton>(buttons[i2]).setOnClickListener {
prefs.edit().putString("card$titleNoLang", colours[i2]).apply()
val recyclerViewState = colourRecycler.layoutManager?.onSaveInstanceState()
colourRecycler.adapter = ColourAdapter(getColourList(), this)
colourRecycler.layoutManager?.onRestoreInstanceState(recyclerViewState)
colourPickerDialog.dismiss()
}
val dialogView = View.inflate(mContext, R.layout.recycler_dialog, null)
val titleText = dialogView.findViewById<TextView>(R.id.empty_textviewtitle)
titleText.text = title
val colourRecycler = dialogView.findViewById<RecyclerView>(R.id.recyclerView)
colourRecycler.apply {
hasFixedSize()
layoutManager = GridLayoutManager(mContext, 1)
adapter = ColourPickerAdapter(HelperFunctions.getColourArray(mContext).toList(), this@SettingsFragment)
}
colourPickerDialog = colourPickerBuilder.setView(dialogView).create()
colourPickerDialog.show()
}
override fun onColourClick(position: Int, colourNoLang: String) {
prefs.edit().putString("card$currentCourseSelectedInColourPicker", colourNoLang).apply()
val recyclerViewState = colourRecycler.layoutManager?.onSaveInstanceState()
colourRecycler.adapter = CourseColourAdapter(getColourList(), this)
colourRecycler.layoutManager?.onRestoreInstanceState(recyclerViewState)
colourPickerDialog.dismiss()
}
override fun onRingtoneClick(position: Int, name: String, uri: String) {
prefs.edit().apply {
putString("ringtoneName", name)
@@ -365,11 +363,11 @@ internal class SettingsFragment : Fragment(), View.OnClickListener, View.OnLongC
val dialogView = View.inflate(mContext, R.layout.recycler_dialog, null)
val titleText = dialogView.findViewById<TextView>(R.id.empty_textviewtitle)
titleText.text = getString(R.string.customise_colours_title)
val colourRecycler = dialogView.findViewById<RecyclerView>(R.id.recyclerView)
colourRecycler = dialogView.findViewById(R.id.recyclerView)
colourRecycler.apply {
hasFixedSize()
layoutManager = GridLayoutManager(mContext, 1)
adapter = ColourAdapter(getColourList(), this@SettingsFragment)
adapter = CourseColourAdapter(getColourList(), this@SettingsFragment)
}
colourCustomisationDialogBuilder.setView(dialogView)
val colourCustomisationDialog = colourCustomisationDialogBuilder.create()
@@ -550,7 +548,7 @@ internal class SettingsFragment : Fragment(), View.OnClickListener, View.OnLongC
courses[i],
coursesNoLang[i],
coursesIcons[i],
HelperFunctions.getColourForString(prefs.getString("card${coursesNoLang[i]}", "") ?: "")
HelperFunctions.getColourForString(prefs.getString("card${coursesNoLang[i]}", "") ?: "", mContext)
)
)
}
@@ -17,7 +17,6 @@ internal data class Substitution(
val date_priority: Int,
val website_priority: Int
) {
@PrimaryKey(autoGenerate = true)
var id: Int = 0
}