diff --git a/app/src/main/kotlin/com/simplemobiletools/clock/adapters/SelectTimeZonesAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/clock/adapters/SelectTimeZonesAdapter.kt new file mode 100644 index 00000000..809aca63 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/clock/adapters/SelectTimeZonesAdapter.kt @@ -0,0 +1,89 @@ +package com.simplemobiletools.clock.adapters + +import android.support.v7.widget.RecyclerView +import android.util.SparseArray +import android.view.View +import android.view.ViewGroup +import com.simplemobiletools.clock.R +import com.simplemobiletools.clock.activities.SimpleActivity +import com.simplemobiletools.clock.extensions.config +import com.simplemobiletools.clock.models.MyTimeZone +import com.simplemobiletools.commons.extensions.getAdjustedPrimaryColor +import com.simplemobiletools.commons.interfaces.MyAdapterListener +import kotlinx.android.synthetic.main.item_add_time_zone.view.* +import java.util.* + +class SelectTimeZonesAdapter(val activity: SimpleActivity, val timeZones: ArrayList) : RecyclerView.Adapter() { + private val itemViews = SparseArray() + private val selectedPositions = HashSet() + private val config = activity.config + private val textColor = config.textColor + private val backgroundColor = config.backgroundColor + private val primaryColor = activity.getAdjustedPrimaryColor() + + init { + val selectedTimeZones = config.selectedTimeZones + timeZones.forEachIndexed { index, myTimeZone -> + if (selectedTimeZones.contains(myTimeZone.id.toString())) { + selectedPositions.add(index) + } + } + } + + private fun toggleItemSelection(select: Boolean, pos: Int) { + if (select) { + if (itemViews[pos] != null) { + selectedPositions.add(pos) + } + } else { + selectedPositions.remove(pos) + } + + itemViews[pos]?.time_zone_checkbox?.isChecked = select + } + + private val adapterListener = object : MyAdapterListener { + override fun toggleItemSelectionAdapter(select: Boolean, position: Int) { + toggleItemSelection(select, position) + } + + override fun getSelectedPositions() = selectedPositions + + override fun itemLongClicked(position: Int) {} + } + + fun getSelectedItemsSet(): HashSet { + val selectedItemsSet = HashSet(selectedPositions.size) + selectedPositions.forEach { selectedItemsSet.add(timeZones[it].id.toString()) } + return selectedItemsSet + } + + override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): ViewHolder { + val view = activity.layoutInflater.inflate(R.layout.item_add_time_zone, parent, false) + return ViewHolder(view, adapterListener) + } + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + val timeZone = timeZones[position] + itemViews.put(position, holder.bindView(timeZone, textColor, primaryColor, backgroundColor)) + toggleItemSelection(selectedPositions.contains(position), position) + } + + override fun getItemCount() = timeZones.size + + class ViewHolder(view: View, val adapterListener: MyAdapterListener) : RecyclerView.ViewHolder(view) { + fun bindView(timeZone: MyTimeZone, textColor: Int, primaryColor: Int, backgroundColor: Int): View { + itemView.apply { + time_zone_title.text = timeZone.title + time_zone_title.setTextColor(textColor) + + time_zone_checkbox.setColors(textColor, primaryColor, backgroundColor) + time_zone_holder.setOnClickListener { + adapterListener.toggleItemSelectionAdapter(!time_zone_checkbox.isChecked, adapterPosition) + } + } + + return itemView + } + } +} diff --git a/app/src/main/kotlin/com/simplemobiletools/clock/dialogs/AddTimeZonesDialog.kt b/app/src/main/kotlin/com/simplemobiletools/clock/dialogs/AddTimeZonesDialog.kt new file mode 100644 index 00000000..946b6c8c --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/clock/dialogs/AddTimeZonesDialog.kt @@ -0,0 +1,31 @@ +package com.simplemobiletools.clock.dialogs + +import android.support.v7.app.AlertDialog +import com.simplemobiletools.clock.R +import com.simplemobiletools.clock.activities.SimpleActivity +import com.simplemobiletools.clock.adapters.SelectTimeZonesAdapter +import com.simplemobiletools.clock.extensions.config +import com.simplemobiletools.clock.helpers.getAllTimeZones +import com.simplemobiletools.commons.extensions.setupDialogStuff +import kotlinx.android.synthetic.main.dialog_select_time_zones.view.* + +class AddTimeZonesDialog(val activity: SimpleActivity, private val callback: () -> Unit) { + private var view = activity.layoutInflater.inflate(R.layout.dialog_select_time_zones, null) + + init { + view.select_time_zones_list.adapter = SelectTimeZonesAdapter(activity, getAllTimeZones()) + + AlertDialog.Builder(activity) + .setPositiveButton(R.string.ok, { dialog, which -> dialogConfirmed() }) + .setNegativeButton(R.string.cancel, null) + .create().apply { + activity.setupDialogStuff(view, this) + } + } + + private fun dialogConfirmed() { + val selectedTimeZones = (view?.select_time_zones_list?.adapter as? SelectTimeZonesAdapter)?.getSelectedItemsSet() ?: LinkedHashSet() + activity.config.selectedTimeZones = selectedTimeZones + callback() + } +} diff --git a/app/src/main/kotlin/com/simplemobiletools/clock/fragments/ClockFragment.kt b/app/src/main/kotlin/com/simplemobiletools/clock/fragments/ClockFragment.kt index 182e0734..9ca73b53 100644 --- a/app/src/main/kotlin/com/simplemobiletools/clock/fragments/ClockFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/clock/fragments/ClockFragment.kt @@ -7,6 +7,8 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import com.simplemobiletools.clock.R +import com.simplemobiletools.clock.activities.SimpleActivity +import com.simplemobiletools.clock.dialogs.AddTimeZonesDialog import com.simplemobiletools.clock.extensions.config import com.simplemobiletools.commons.extensions.beVisibleIf import com.simplemobiletools.commons.extensions.updateTextColors @@ -99,6 +101,8 @@ class ClockFragment : Fragment() { } private fun fabClicked() { + AddTimeZonesDialog(activity as SimpleActivity) { + } } } diff --git a/app/src/main/kotlin/com/simplemobiletools/clock/helpers/Config.kt b/app/src/main/kotlin/com/simplemobiletools/clock/helpers/Config.kt index 3c587904..f92bcc9c 100644 --- a/app/src/main/kotlin/com/simplemobiletools/clock/helpers/Config.kt +++ b/app/src/main/kotlin/com/simplemobiletools/clock/helpers/Config.kt @@ -15,4 +15,8 @@ class Config(context: Context) : BaseConfig(context) { var displayOtherTimeZones: Boolean get() = prefs.getBoolean(DISPLAY_OTHER_TIME_ZONES, false) set(displayOtherTimeZones) = prefs.edit().putBoolean(DISPLAY_OTHER_TIME_ZONES, displayOtherTimeZones).apply() + + var selectedTimeZones: Set + get() = prefs.getStringSet(SELECTED_TIME_ZONES, HashSet()) + set(selectedTimeZones) = prefs.edit().putStringSet(SELECTED_TIME_ZONES, selectedTimeZones).apply() } diff --git a/app/src/main/kotlin/com/simplemobiletools/clock/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/clock/helpers/Constants.kt index a75889bf..374f0fc5 100644 --- a/app/src/main/kotlin/com/simplemobiletools/clock/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/clock/helpers/Constants.kt @@ -5,10 +5,11 @@ import com.simplemobiletools.clock.models.MyTimeZone // shared preferences const val SHOW_SECONDS = "show_seconds" const val DISPLAY_OTHER_TIME_ZONES = "display_other_time_zones" +const val SELECTED_TIME_ZONES = "selected_time_zones" const val TABS_COUNT = 3 -val timezones = arrayListOf( +fun getAllTimeZones() = arrayListOf( MyTimeZone(1, "GMT-11:00 Midway", "Pacific/Midway"), MyTimeZone(2, "GMT-10:00 Honolulu", "Pacific/Honolulu"), MyTimeZone(3, "GMT-09:00 Anchorage", "America/Anchorage"), diff --git a/app/src/main/res/layout/dialog_select_time_zones.xml b/app/src/main/res/layout/dialog_select_time_zones.xml new file mode 100644 index 00000000..fbe873de --- /dev/null +++ b/app/src/main/res/layout/dialog_select_time_zones.xml @@ -0,0 +1,17 @@ + + + + + + diff --git a/app/src/main/res/layout/item_add_time_zone.xml b/app/src/main/res/layout/item_add_time_zone.xml new file mode 100644 index 00000000..5a36c52b --- /dev/null +++ b/app/src/main/res/layout/item_add_time_zone.xml @@ -0,0 +1,35 @@ + + + + + + + +