OsmAnd/OsmAnd-telegram/src/net/osmand/telegram/ui/SetTimeDialogFragment.kt

210 lines
6.2 KiB
Kotlin

package net.osmand.telegram.ui
import android.app.TimePickerDialog
import android.os.Bundle
import android.support.v4.app.DialogFragment
import android.support.v4.app.FragmentManager
import android.support.v7.widget.LinearLayoutManager
import android.support.v7.widget.RecyclerView
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import android.widget.Toast
import net.osmand.telegram.R
import net.osmand.telegram.TelegramApplication
import net.osmand.telegram.helpers.TelegramUiHelper
import net.osmand.telegram.ui.SetTimeDialogFragment.SetTimeListAdapter.ChatViewHolder
import org.drinkless.td.libcore.telegram.TdApi
import java.util.concurrent.TimeUnit
class SetTimeDialogFragment : DialogFragment() {
private val app: TelegramApplication
get() = activity?.application as TelegramApplication
private val telegramHelper get() = app.telegramHelper
private val adapter = SetTimeListAdapter()
private val chatIdsToDuration = HashMap<Long, Long>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setStyle(DialogFragment.STYLE_NO_FRAME, R.style.AppTheme_NoActionbar)
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
readFromBundle(savedInstanceState ?: arguments)
val view = inflater.inflate(R.layout.fragment_set_time_dialog, container)
view.findViewById<View>(R.id.time_for_all_row).apply {
findViewById<ImageView>(R.id.time_for_all_icon).setImageDrawable(
app.uiUtils.getIcon(R.drawable.ic_action_time_span, R.color.ctrl_active_light)
)
findViewById<TextView>(R.id.time_for_all_value).text = "1 hour"
setOnClickListener {
selectDuration()
}
}
view.findViewById<RecyclerView>(R.id.recycler_view).apply {
layoutManager = LinearLayoutManager(context)
adapter = this@SetTimeDialogFragment.adapter
}
view.findViewById<TextView>(R.id.secondary_btn).apply {
text = getString(R.string.shared_string_back)
setOnClickListener {
dismiss()
}
}
view.findViewById<TextView>(R.id.primary_btn).apply {
text = getString(R.string.shared_string_share)
setOnClickListener {
Toast.makeText(context, "Share", Toast.LENGTH_SHORT).show()
}
}
return view
}
override fun onResume() {
super.onResume()
updateList()
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
val chats = mutableListOf<Long>()
for ((id, duration) in chatIdsToDuration) {
chats.add(id)
chats.add(duration)
}
outState.putLongArray(CHATS_KEY, chats.toLongArray())
}
private fun readFromBundle(bundle: Bundle?) {
chatIdsToDuration.clear()
bundle?.getLongArray(CHATS_KEY)?.also {
for (i in 0 until it.size step 2) {
chatIdsToDuration[it[i]] = it[i + 1]
}
}
}
private fun selectDuration(id: Long? = null) {
val (defHours, defMinutes) = secondsToHoursAndMinutes(DEFAULT_VISIBLE_TIME_SECONDS)
TimePickerDialog(
context,
TimePickerDialog.OnTimeSetListener { _, hours, minutes ->
val seconds = TimeUnit.HOURS.toSeconds(hours.toLong()) +
TimeUnit.MINUTES.toSeconds(minutes.toLong())
if (id != null) {
chatIdsToDuration[id] = seconds
} else {
chatIdsToDuration.keys.forEach {
chatIdsToDuration[it] = seconds
}
}
adapter.notifyDataSetChanged()
}, defHours, defMinutes, true
).show()
}
private fun secondsToHoursAndMinutes(seconds: Long): Pair<Int, Int> {
val hours = TimeUnit.SECONDS.toHours(seconds)
val minutes = TimeUnit.SECONDS.toMinutes(seconds - TimeUnit.HOURS.toSeconds(hours))
return Pair(hours.toInt(), minutes.toInt())
}
private fun formatDuration(seconds: Long): String {
val (hours, minutes) = secondsToHoursAndMinutes(seconds)
return when {
hours != 0 && minutes == 0 -> String.format("%d h", hours)
hours == 0 && minutes != 0 -> String.format("%02d m", minutes)
else -> String.format("%d h, %02d m", hours, minutes)
}
}
private fun updateList() {
val chats: MutableList<TdApi.Chat> = mutableListOf()
telegramHelper.getChatList().filter { chatIdsToDuration.keys.contains(it.chatId) }
.forEach { orderedChat ->
telegramHelper.getChat(orderedChat.chatId)?.also { chats.add(it) }
}
adapter.chats = chats
}
inner class SetTimeListAdapter : RecyclerView.Adapter<ChatViewHolder>() {
var chats: List<TdApi.Chat> = emptyList()
set(value) {
field = value
notifyDataSetChanged()
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ChatViewHolder {
val view = LayoutInflater.from(parent.context)
.inflate(R.layout.user_list_item, parent, false)
return ChatViewHolder(view)
}
override fun onBindViewHolder(holder: ChatViewHolder, position: Int) {
val chat = chats[position]
TelegramUiHelper.setupPhoto(app, holder.icon, chat.photo?.small?.local?.path)
holder.title?.text = chat.title
holder.description?.text = "Some description" // FIXME
holder.textInArea?.apply {
visibility = View.VISIBLE
chatIdsToDuration[chat.id]?.also { text = formatDuration(it) }
}
holder.bottomShadow?.visibility = View.GONE
holder.itemView.setOnClickListener {
selectDuration(chat.id)
}
}
override fun getItemCount() = chats.size
inner class ChatViewHolder(val view: View) : RecyclerView.ViewHolder(view) {
val icon: ImageView? = view.findViewById(R.id.icon)
val title: TextView? = view.findViewById(R.id.title)
val description: TextView? = view.findViewById(R.id.description)
val textInArea: TextView? = view.findViewById(R.id.text_in_area)
val bottomShadow: View? = view.findViewById(R.id.bottom_shadow)
}
}
companion object {
private const val TAG = "SetTimeDialogFragment"
private const val CHATS_KEY = "chats_key"
private const val DEFAULT_VISIBLE_TIME_SECONDS = 60 * 60L // 1 hour
fun showInstance(fm: FragmentManager, chatIds: Set<Long>): Boolean {
return try {
val chats = mutableListOf<Long>()
for (id in chatIds) {
chats.add(id)
chats.add(DEFAULT_VISIBLE_TIME_SECONDS)
}
SetTimeDialogFragment().apply {
arguments = Bundle().apply { putLongArray(CHATS_KEY, chats.toLongArray()) }
show(fm, TAG)
}
true
} catch (e: RuntimeException) {
false
}
}
}
}