From 351845c4df0d2ba544dc8f4da6a350682ce7aba6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Deniz=20D=C3=BCzg=C3=B6ren?= Date: Fri, 26 Jul 2019 13:31:31 +0200 Subject: [PATCH] Revised colour picker dialog to show colour change without closing and re-opening the dialog --- .../com/denizd/substitutionplan/Colour.kt | 3 + .../denizd/substitutionplan/ColourAdapter.kt | 58 ++++++++ .../denizd/substitutionplan/DataFetcher.kt | 27 ++-- .../substitutionplan/SettingsFragment.kt | 136 ++++++++---------- app/src/main/res/layout/content_settings.xml | 9 +- app/src/main/res/layout/list_item.xml | 6 + app/src/main/res/layout/recycler_dialog.xml | 29 ++++ 7 files changed, 173 insertions(+), 95 deletions(-) create mode 100644 app/src/main/java/com/denizd/substitutionplan/Colour.kt create mode 100644 app/src/main/java/com/denizd/substitutionplan/ColourAdapter.kt create mode 100644 app/src/main/res/layout/recycler_dialog.xml diff --git a/app/src/main/java/com/denizd/substitutionplan/Colour.kt b/app/src/main/java/com/denizd/substitutionplan/Colour.kt new file mode 100644 index 0000000..cd79c71 --- /dev/null +++ b/app/src/main/java/com/denizd/substitutionplan/Colour.kt @@ -0,0 +1,3 @@ +package com.denizd.substitutionplan + +class Colour(val title: String, val titleNoLang: String, val icon: Int, val colour: Int) \ No newline at end of file diff --git a/app/src/main/java/com/denizd/substitutionplan/ColourAdapter.kt b/app/src/main/java/com/denizd/substitutionplan/ColourAdapter.kt new file mode 100644 index 0000000..d217719 --- /dev/null +++ b/app/src/main/java/com/denizd/substitutionplan/ColourAdapter.kt @@ -0,0 +1,58 @@ +package com.denizd.substitutionplan + +import android.preference.PreferenceManager +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.appcompat.app.AlertDialog +import androidx.core.content.ContextCompat +import androidx.recyclerview.widget.RecyclerView +import com.google.android.material.button.MaterialButton +import com.google.android.material.card.MaterialCardView + +class ColourAdapter(private var mColours: List, onClickListener: OnClickListener) : RecyclerView.Adapter() { + + val mOnClickListener = onClickListener + + class ColourViewHolder(view: View, clickListener: OnClickListener) : RecyclerView.ViewHolder(view), View.OnClickListener { + val title: TextView = view.findViewById(R.id.item_text) + var image: ImageView = view.findViewById(R.id.item_image) + val titleNoLang: TextView = view.findViewById(R.id.item_text_no_lang) + val mClickListener = clickListener + init { view.setOnClickListener(this) } + + override fun onClick(v: View?) { mClickListener.onClick(adapterPosition, title.text.toString(), titleNoLang.text.toString()) } + + } + + 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) + } + + override fun onBindViewHolder(holder: ColourViewHolder, position: Int) { + val currentItem = mColours[position] + val prefs = PreferenceManager.getDefaultSharedPreferences(holder.image.context) + + holder.title.text = currentItem.title + holder.titleNoLang.text = currentItem.titleNoLang + holder.image.setImageDrawable(ContextCompat.getDrawable(holder.image.context, currentItem.icon)) + if (currentItem.colour != 0) { + holder.image.drawable.setTint(ContextCompat.getColor(holder.image.context, currentItem.colour)) + } + } + + override fun getItemCount(): Int = mColours.size + + fun setColours(colours: List) { + mColours = colours + notifyDataSetChanged() + } + + public interface OnClickListener { + fun onClick(position: Int, title: String, titleNolang: String) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/denizd/substitutionplan/DataFetcher.kt b/app/src/main/java/com/denizd/substitutionplan/DataFetcher.kt index 449c1b0..1d9d23c 100644 --- a/app/src/main/java/com/denizd/substitutionplan/DataFetcher.kt +++ b/app/src/main/java/com/denizd/substitutionplan/DataFetcher.kt @@ -25,7 +25,6 @@ import org.jsoup.select.Elements import java.lang.IndexOutOfBoundsException import java.net.URL import java.net.URLConnection -import java.text.DateFormat import java.text.SimpleDateFormat import java.util.* import kotlin.collections.ArrayList @@ -251,24 +250,14 @@ class DataFetcher(isplan: Boolean, ismenu: Boolean, isjobservice: Boolean, conte manager.createNotificationChannel(channel) } - val notification = when (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - true -> NotificationCompat.Builder(mContext) // TODO switch out the deprecated notification delivery method - .setStyle(NotificationCompat.DecoratedCustomViewStyle()) - .setCustomContentView(notificationLayout) - .setSmallIcon(R.drawable.ic_avh) - .setChannelId(channelId) - .setContentIntent(openAppPending) - .setAutoCancel(true) - .build() - false -> NotificationCompat.Builder(mContext) - .setStyle(NotificationCompat.DecoratedCustomViewStyle()) - .setCustomContentView(notificationLayout) - .setSmallIcon(R.drawable.ic_avh) - .setContentIntent(openAppPending) - .setAutoCancel(true) - .build() - } - notification.sound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION) + val notification = NotificationCompat.Builder(mContext, channelId) + .setStyle(NotificationCompat.DecoratedCustomViewStyle()) + .setCustomContentView(notificationLayout) + .setSmallIcon(R.drawable.ic_avh) + .setContentIntent(openAppPending) + .setAutoCancel(true) + .setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)) + .build() manager.notify(1, notification) } } diff --git a/app/src/main/java/com/denizd/substitutionplan/SettingsFragment.kt b/app/src/main/java/com/denizd/substitutionplan/SettingsFragment.kt index 32845f6..08dd137 100644 --- a/app/src/main/java/com/denizd/substitutionplan/SettingsFragment.kt +++ b/app/src/main/java/com/denizd/substitutionplan/SettingsFragment.kt @@ -19,12 +19,14 @@ import androidx.appcompat.app.AppCompatDelegate import androidx.browser.customtabs.CustomTabsIntent import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment +import androidx.recyclerview.widget.GridLayoutManager +import androidx.recyclerview.widget.RecyclerView import com.google.android.material.bottomnavigation.BottomNavigationView import com.google.android.material.button.MaterialButton import com.google.android.material.textfield.TextInputEditText import com.jaredrummler.android.device.DeviceName -class SettingsFragment : Fragment(R.layout.content_settings), View.OnClickListener { +class SettingsFragment : Fragment(R.layout.content_settings), View.OnClickListener, ColourAdapter.OnClickListener { private lateinit var name: String private lateinit var model: String @@ -36,6 +38,8 @@ class SettingsFragment : Fragment(R.layout.content_settings), View.OnClickListen private val customTabsIntent = builder.build() as CustomTabsIntent private var cs: Int = 7 private var window: Window? = null + private lateinit var colourRecycler: RecyclerView + private lateinit var colourAdapter: ColourAdapter override fun onAttach(context: Context) { super.onAttach(context) @@ -61,14 +65,9 @@ class SettingsFragment : Fragment(R.layout.content_settings), View.OnClickListen val switchOpenInfo = view.findViewById(R.id.switchOpenInfo) val switchAutoRefresh = view.findViewById(R.id.switchAutoRefresh) val versionNumber = view.findViewById(R.id.txtVersionTwo) - val helpCourses = view.findViewById(R.id.chipHelpCourses) val helpClasses = view.findViewById(R.id.chipHelpClasses) val btnCustomiseColours = view.findViewById(R.id.btnCustomiseColours) - val btnWebsite = view.findViewById(R.id.btnWebsite) - val btnLicences = view.findViewById(R.id.btnLicences) - val btnTerms = view.findViewById(R.id.btnTerms) - val btnPrivacy = view.findViewById(R.id.btnPrivacyP) val btnVersion = view.findViewById(R.id.btnVersion) switchDisableGreeting.setOnClickListener(this) @@ -81,10 +80,10 @@ class SettingsFragment : Fragment(R.layout.content_settings), View.OnClickListen helpCourses.setOnClickListener(this) helpClasses.setOnClickListener(this) btnCustomiseColours.setOnClickListener(this) - btnWebsite.setOnClickListener(this) - btnLicences.setOnClickListener(this) - btnTerms.setOnClickListener(this) - btnPrivacy.setOnClickListener(this) + view.findViewById(R.id.btnWebsite).setOnClickListener(this) + view.findViewById(R.id.btnLicences).setOnClickListener(this) + view.findViewById(R.id.btnTerms).setOnClickListener(this) + view.findViewById(R.id.btnPrivacyP).setOnClickListener(this) btnVersion.setOnClickListener(this) switchDisableGreeting.isChecked = prefs.getBoolean("greeting", true) @@ -266,80 +265,71 @@ class SettingsFragment : Fragment(R.layout.content_settings), View.OnClickListen } private fun createColourDialog() { + val colourCustomiserBuilder = AlertDialog.Builder(mContext, R.style.AlertDialog) + val dialogView = LayoutInflater.from(mContext).inflate(R.layout.recycler_dialog, null) + val titleText = dialogView.findViewById(R.id.empty_textviewtitle) + titleText.text = getString(R.string.customisecolor1) + colourRecycler = dialogView.findViewById(R.id.recyclerView) + + 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(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 { + val colours = ArrayList() val coursesNoLang = arrayOf("German", "English", "French", "Spanish", "Latin", "Turkish", "Chinese", "Arts", "Music", "Theatre", "Geography", "History", "Politics", "Philosophy", "Religion", "Maths", "Biology", "Chemistry", "Physics", "CompSci", "PhysEd", "GLL", "WAT", "Forder", "WP") 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 colourCustomiserBuilder = AlertDialog.Builder(mContext, R.style.AlertDialog) - - val dialogView = LayoutInflater.from(mContext).inflate(R.layout.empty_dialog, null) - val titleText = dialogView.findViewById(R.id.empty_textviewtitle) - titleText.text = getString(R.string.customisecolor1) - val emptyLayout = dialogView.findViewById(R.id.empty_linearlayout) - for (i in 0 until coursesNoLang.size) { - val item = LayoutInflater.from(mContext).inflate(R.layout.list_item, null) - val itemText = item.findViewById(R.id.item_text) - val itemImage = item.findViewById(R.id.item_image) - val layout = item.findViewById(R.id.item_layout) - - itemText.text = courses[i] - itemImage.setImageDrawable(ContextCompat.getDrawable(mContext, coursesIcons[i])) - - val courseNoLangTxt = coursesNoLang[i] - val courseTxt = courses[i] - - if (prefs.getInt("bg" + coursesNoLang[i], 0) != 0) { -// itemText.setTextColor(ContextCompat.getColor(mContext, prefs.getInt("col$courseNoLangTxt", 0))) - itemImage.drawable.setTint(ContextCompat.getColor(mContext, prefs.getInt("bg$courseNoLangTxt", 0))) - } - - layout.setOnClickListener { - val colourPickerBuilder = AlertDialog.Builder(mContext, R.style.AlertDialog) - val pickerDialogView = LayoutInflater.from(mContext).inflate(R.layout.empty_dialog, null) - val pickerTitleText = pickerDialogView.findViewById(R.id.empty_textviewtitle) - val pickerLayout = pickerDialogView.findViewById(R.id.empty_linearlayout) - pickerTitleText.text = courseTxt - - val picker = LayoutInflater.from(mContext).inflate(R.layout.bg_colour_picker, null) - pickerLayout.addView(picker) - colourPickerBuilder.setView(pickerDialogView) - val colourPickerDialog: AlertDialog = colourPickerBuilder.create() - - val buttons = arrayOf(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)) - val colours = 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) - - for (i2 in 0 until buttons.size) { - buttons[i2].setOnClickListener { - edit.putInt("bg$courseNoLangTxt", colours[i2]).apply() - colourPickerDialog.dismiss() - } - } - - colourPickerDialog.show() - } - emptyLayout.addView(item) + colours.add(Colour(courses[i], coursesNoLang[i], coursesIcons[i], prefs.getInt("bg${coursesNoLang[i]}", 0))) } + return colours + } - val button = LayoutInflater.from(mContext).inflate(R.layout.forever_alone_button, null) - val buttonClearAll = button.findViewById(R.id.buttonclearallcolours) - emptyLayout.addView(button) - colourCustomiserBuilder.setView(dialogView) - val colourCustomiserDialog = colourCustomiserBuilder.create() + 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 pickerTitleText = pickerDialogView.findViewById(R.id.empty_textviewtitle) + val pickerLayout = pickerDialogView.findViewById(R.id.empty_linearlayout) + pickerTitleText.text = title - buttonClearAll.setOnClickListener { - for (course in coursesNoLang) { - edit.putInt("bg$course", 0) + val picker = LayoutInflater.from(mContext).inflate(R.layout.bg_colour_picker, null) + pickerLayout.addView(picker) + colourPickerBuilder.setView(pickerDialogView) + val colourPickerDialog: AlertDialog = colourPickerBuilder.create() + + val buttons = arrayOf(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)) + val colours = 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) + + for (i2 in 0 until buttons.size) { + buttons[i2].setOnClickListener { + prefs.edit().putInt("bg$titleNoLang", colours[i2]).apply() + colourRecycler.adapter = ColourAdapter(getColourList(), this) + colourPickerDialog.dismiss() } - edit.apply() - Toast.makeText(mContext, getString(R.string.allcolourscleared), - Toast.LENGTH_LONG).show() - colourCustomiserDialog.cancel() } - - colourCustomiserDialog.show() - + colourPickerDialog.show() } private fun debugMenu(): Boolean { diff --git a/app/src/main/res/layout/content_settings.xml b/app/src/main/res/layout/content_settings.xml index 279d8e3..bd4b7d5 100644 --- a/app/src/main/res/layout/content_settings.xml +++ b/app/src/main/res/layout/content_settings.xml @@ -3,7 +3,9 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@color/background"> + xmlns:tools="http://schemas.android.com/tools" + android:background="@color/background" + tools:context=".SettingsFragment"> + app:layout_constraintTop_toBottomOf="@+id/txtWhatittook"/> + app:layout_constraintTop_toBottomOf="@+id/txtWhatittook" + android:onClick="onClick"/> + + \ No newline at end of file diff --git a/app/src/main/res/layout/recycler_dialog.xml b/app/src/main/res/layout/recycler_dialog.xml new file mode 100644 index 0000000..3350b85 --- /dev/null +++ b/app/src/main/res/layout/recycler_dialog.xml @@ -0,0 +1,29 @@ + + + + + + + + + + \ No newline at end of file