forked from penguin86/luna-tracker
		
	WIP detail view
This commit is contained in:
		@@ -30,6 +30,9 @@ import it.danieleverducci.lunatracker.repository.WebDAVLogbookRepository
 | 
			
		||||
import kotlinx.coroutines.Runnable
 | 
			
		||||
import okio.IOException
 | 
			
		||||
import org.json.JSONException
 | 
			
		||||
import utils.DateUtils
 | 
			
		||||
import java.text.DateFormat
 | 
			
		||||
import java.util.Date
 | 
			
		||||
 | 
			
		||||
class MainActivity : AppCompatActivity() {
 | 
			
		||||
    companion object {
 | 
			
		||||
@@ -55,6 +58,11 @@ class MainActivity : AppCompatActivity() {
 | 
			
		||||
 | 
			
		||||
        handler = Handler(mainLooper)
 | 
			
		||||
        adapter = LunaEventRecyclerAdapter(this)
 | 
			
		||||
        adapter.onItemClickListener = object: LunaEventRecyclerAdapter.OnItemClickListener{
 | 
			
		||||
            override fun onItemClick(event: LunaEvent) {
 | 
			
		||||
                showEventDetailDialog(event)
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Show view
 | 
			
		||||
        setContentView(R.layout.activity_main)
 | 
			
		||||
@@ -251,6 +259,22 @@ class MainActivity : AppCompatActivity() {
 | 
			
		||||
        alertDialog.show()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun showEventDetailDialog(event: LunaEvent) {
 | 
			
		||||
        val dateFormat = DateFormat.getDateTimeInstance();
 | 
			
		||||
        val d = AlertDialog.Builder(this)
 | 
			
		||||
        d.setTitle(event.getTypeDescription(this))
 | 
			
		||||
        val dialogView = layoutInflater.inflate(R.layout.dialog_event_detail, null)
 | 
			
		||||
        dialogView.findViewById<TextView>(R.id.dialog_event_detail_type_emoji).setText(event.getTypeEmoji(this))
 | 
			
		||||
        dialogView.findViewById<TextView>(R.id.dialog_event_detail_type_description).setText(event.getTypeDescription(this))
 | 
			
		||||
        dialogView.findViewById<TextView>(R.id.dialog_event_detail_type_date).setText(dateFormat.format(Date(event.time * 1000)))
 | 
			
		||||
        dialogView.findViewById<TextView>(R.id.dialog_event_detail_type_quantity).setText(event.quantity.toString())
 | 
			
		||||
        dialogView.findViewById<TextView>(R.id.dialog_event_detail_type_notes).setText(event.notes)
 | 
			
		||||
        d.setView(dialogView)
 | 
			
		||||
        d.setPositiveButton(android.R.string.ok) { dialogInterface, i -> dialogInterface.dismiss() }
 | 
			
		||||
        val alertDialog = d.create()
 | 
			
		||||
        alertDialog.show()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun loadLogbook() {
 | 
			
		||||
        if (savingEvent)
 | 
			
		||||
            return
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,6 @@ package it.danieleverducci.lunatracker.adapters
 | 
			
		||||
import android.content.Context
 | 
			
		||||
import android.icu.util.LocaleData
 | 
			
		||||
import android.icu.util.ULocale
 | 
			
		||||
import android.text.format.DateFormat
 | 
			
		||||
import android.view.LayoutInflater
 | 
			
		||||
import android.view.View
 | 
			
		||||
import android.view.ViewGroup
 | 
			
		||||
@@ -11,7 +10,7 @@ import android.widget.TextView
 | 
			
		||||
import androidx.recyclerview.widget.RecyclerView
 | 
			
		||||
import it.danieleverducci.lunatracker.entities.LunaEvent
 | 
			
		||||
import it.danieleverducci.lunatracker.R
 | 
			
		||||
import java.util.Date
 | 
			
		||||
import utils.DateUtils
 | 
			
		||||
 | 
			
		||||
class LunaEventRecyclerAdapter: RecyclerView.Adapter<LunaEventRecyclerAdapter.LunaEventVH> {
 | 
			
		||||
    private val context: Context
 | 
			
		||||
@@ -19,6 +18,7 @@ class LunaEventRecyclerAdapter: RecyclerView.Adapter<LunaEventRecyclerAdapter.Lu
 | 
			
		||||
    val measurement_unit_liquid_base: String
 | 
			
		||||
    val measurement_unit_weight_base: String
 | 
			
		||||
    val measurement_unit_weight_tiny: String
 | 
			
		||||
    var onItemClickListener: OnItemClickListener? = null
 | 
			
		||||
 | 
			
		||||
    constructor(context: Context) {
 | 
			
		||||
        this.context = context
 | 
			
		||||
@@ -57,9 +57,11 @@ class LunaEventRecyclerAdapter: RecyclerView.Adapter<LunaEventRecyclerAdapter.Lu
 | 
			
		||||
        position: Int
 | 
			
		||||
    ) {
 | 
			
		||||
        val item = items.get(position)
 | 
			
		||||
        // Colors
 | 
			
		||||
        holder.root.setBackgroundResource(
 | 
			
		||||
            if (position % 2 == 0) R.color.list_background_even else R.color.list_background_odd
 | 
			
		||||
        )
 | 
			
		||||
        // Contents
 | 
			
		||||
        holder.type.text = item.getTypeEmoji(context)
 | 
			
		||||
        holder.description.text = when(item.type) {
 | 
			
		||||
            LunaEvent.TYPE_MEDICINE -> item.notes
 | 
			
		||||
@@ -67,7 +69,7 @@ class LunaEventRecyclerAdapter: RecyclerView.Adapter<LunaEventRecyclerAdapter.Lu
 | 
			
		||||
            LunaEvent.TYPE_CUSTOM -> item.notes
 | 
			
		||||
            else -> item.getTypeDescription(context)
 | 
			
		||||
        }
 | 
			
		||||
        holder.time.text = formatTimeAgo(context, item.time)
 | 
			
		||||
        holder.time.text = DateUtils.formatTimeAgo(context, item.time)
 | 
			
		||||
        val qtyText = if ((item.quantity ?: 0) > 0) {
 | 
			
		||||
            item.quantity.toString() + " " + when (item.type) {
 | 
			
		||||
                LunaEvent.TYPE_BABY_BOTTLE -> measurement_unit_liquid_base
 | 
			
		||||
@@ -79,49 +81,18 @@ class LunaEventRecyclerAdapter: RecyclerView.Adapter<LunaEventRecyclerAdapter.Lu
 | 
			
		||||
            ""
 | 
			
		||||
        }
 | 
			
		||||
        holder.quantity.text = qtyText
 | 
			
		||||
        // Listeners
 | 
			
		||||
        if (onItemClickListener != null) {
 | 
			
		||||
            holder.root.setOnClickListener({
 | 
			
		||||
                onItemClickListener?.onItemClick(item)
 | 
			
		||||
            })
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun getItemCount(): Int {
 | 
			
		||||
        return items.size
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Formats the provided unix timestamp in a string like "3 hours, 26 minutes ago)
 | 
			
		||||
     */
 | 
			
		||||
    fun formatTimeAgo(context: Context, unixTime: Long): String {
 | 
			
		||||
        val secondsDiff = (System.currentTimeMillis() / 1000) - unixTime
 | 
			
		||||
        val minutesDiff = secondsDiff / 60
 | 
			
		||||
 | 
			
		||||
        if (minutesDiff < 1)
 | 
			
		||||
            return context.getString(R.string.now)
 | 
			
		||||
 | 
			
		||||
        val hoursAgo = (secondsDiff / (60 * 60)).toInt()
 | 
			
		||||
        val minutesAgo = (minutesDiff % 60).toInt()
 | 
			
		||||
 | 
			
		||||
        if (hoursAgo > 24)
 | 
			
		||||
            return DateFormat.getDateFormat(context).format(Date(unixTime*1000)) + "\n" +
 | 
			
		||||
                DateFormat.getTimeFormat(context).format(Date(unixTime*1000))
 | 
			
		||||
 | 
			
		||||
        var formattedTime = StringBuilder()
 | 
			
		||||
        if (hoursAgo > 0) {
 | 
			
		||||
            formattedTime.append(hoursAgo).append(" ")
 | 
			
		||||
            if (hoursAgo.toInt() == 1)
 | 
			
		||||
                formattedTime.append(context.getString(R.string.hour_ago))
 | 
			
		||||
            else
 | 
			
		||||
                formattedTime.append(context.getString(R.string.hours_ago))
 | 
			
		||||
        }
 | 
			
		||||
        if (minutesAgo > 0) {
 | 
			
		||||
            if (formattedTime.isNotEmpty())
 | 
			
		||||
                formattedTime.append(", ")
 | 
			
		||||
            formattedTime.append(minutesAgo).append(" ")
 | 
			
		||||
            if (minutesAgo.toInt() == 1)
 | 
			
		||||
                formattedTime.append(context.getString(R.string.minute_ago))
 | 
			
		||||
            else
 | 
			
		||||
                formattedTime.append(context.getString(R.string.minutes_ago))
 | 
			
		||||
        }
 | 
			
		||||
        return formattedTime.toString()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    class LunaEventVH: RecyclerView.ViewHolder {
 | 
			
		||||
        val root: View
 | 
			
		||||
        val type: TextView
 | 
			
		||||
@@ -137,4 +108,8 @@ class LunaEventRecyclerAdapter: RecyclerView.Adapter<LunaEventRecyclerAdapter.Lu
 | 
			
		||||
            time = v.findViewById<TextView>(R.id.time)
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    interface OnItemClickListener {
 | 
			
		||||
        fun onItemClick(event: LunaEvent)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -46,7 +46,7 @@ class LunaEvent {
 | 
			
		||||
                jo.put("quantity", value)
 | 
			
		||||
        }
 | 
			
		||||
    var notes: String
 | 
			
		||||
        get(): String = jo.getString("notes")
 | 
			
		||||
        get(): String = jo.optString("notes")
 | 
			
		||||
        set(value) {
 | 
			
		||||
            jo.put("notes", value)
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										48
									
								
								app/src/main/java/utils/DateUtils.kt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								app/src/main/java/utils/DateUtils.kt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,48 @@
 | 
			
		||||
package utils
 | 
			
		||||
 | 
			
		||||
import android.content.Context
 | 
			
		||||
import android.text.format.DateFormat
 | 
			
		||||
import it.danieleverducci.lunatracker.R
 | 
			
		||||
import java.util.Date
 | 
			
		||||
 | 
			
		||||
class DateUtils {
 | 
			
		||||
    companion object {
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * Formats the provided unix timestamp in a string like "3 hours, 26 minutes ago)
 | 
			
		||||
         */
 | 
			
		||||
        fun formatTimeAgo(context: Context, unixTime: Long): String {
 | 
			
		||||
            val secondsDiff = (System.currentTimeMillis() / 1000) - unixTime
 | 
			
		||||
            val minutesDiff = secondsDiff / 60
 | 
			
		||||
 | 
			
		||||
            if (minutesDiff < 1)
 | 
			
		||||
                return context.getString(R.string.now)
 | 
			
		||||
 | 
			
		||||
            val hoursAgo = (secondsDiff / (60 * 60)).toInt()
 | 
			
		||||
            val minutesAgo = (minutesDiff % 60).toInt()
 | 
			
		||||
 | 
			
		||||
            if (hoursAgo > 24)
 | 
			
		||||
                return DateFormat.getDateFormat(context).format(Date(unixTime*1000)) + "\n" +
 | 
			
		||||
                        DateFormat.getTimeFormat(context).format(Date(unixTime*1000))
 | 
			
		||||
 | 
			
		||||
            var formattedTime = StringBuilder()
 | 
			
		||||
            if (hoursAgo > 0) {
 | 
			
		||||
                formattedTime.append(hoursAgo).append(" ")
 | 
			
		||||
                if (hoursAgo.toInt() == 1)
 | 
			
		||||
                    formattedTime.append(context.getString(R.string.hour_ago))
 | 
			
		||||
                else
 | 
			
		||||
                    formattedTime.append(context.getString(R.string.hours_ago))
 | 
			
		||||
            }
 | 
			
		||||
            if (minutesAgo > 0) {
 | 
			
		||||
                if (formattedTime.isNotEmpty())
 | 
			
		||||
                    formattedTime.append(", ")
 | 
			
		||||
                formattedTime.append(minutesAgo).append(" ")
 | 
			
		||||
                if (minutesAgo.toInt() == 1)
 | 
			
		||||
                    formattedTime.append(context.getString(R.string.minute_ago))
 | 
			
		||||
                else
 | 
			
		||||
                    formattedTime.append(context.getString(R.string.minutes_ago))
 | 
			
		||||
            }
 | 
			
		||||
            return formattedTime.toString()
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										55
									
								
								app/src/main/res/layout/dialog_event_detail.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								app/src/main/res/layout/dialog_event_detail.xml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,55 @@
 | 
			
		||||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
    android:orientation="vertical"
 | 
			
		||||
    android:layout_width="match_parent"
 | 
			
		||||
    android:layout_height="match_parent"
 | 
			
		||||
    android:padding="20dp">
 | 
			
		||||
 | 
			
		||||
    <TextView
 | 
			
		||||
        android:id="@+id/dialog_event_detail_type_emoji"
 | 
			
		||||
        android:layout_width="match_parent"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        android:gravity="center_horizontal"
 | 
			
		||||
        android:textSize="60dp"
 | 
			
		||||
        android:text="@string/event_diaperchange_pee_type"/>
 | 
			
		||||
 | 
			
		||||
    <TextView
 | 
			
		||||
        android:id="@+id/dialog_event_detail_type_description"
 | 
			
		||||
        android:layout_width="match_parent"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        android:layout_marginTop="10dp"
 | 
			
		||||
        android:gravity="center_horizontal"
 | 
			
		||||
        android:textColor="@color/accent"
 | 
			
		||||
        android:textSize="24dp"
 | 
			
		||||
        android:text="@string/event_diaperchange_pee_desc"/>
 | 
			
		||||
 | 
			
		||||
    <TextView
 | 
			
		||||
        android:id="@+id/dialog_event_detail_type_date"
 | 
			
		||||
        android:layout_width="match_parent"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        android:layout_marginTop="20dp"
 | 
			
		||||
        android:gravity="center_horizontal"
 | 
			
		||||
        android:textStyle="bold"
 | 
			
		||||
        android:text="2020"/>
 | 
			
		||||
 | 
			
		||||
    <TextView
 | 
			
		||||
        android:id="@+id/dialog_event_detail_type_quantity"
 | 
			
		||||
        android:layout_width="match_parent"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        android:gravity="center_horizontal"
 | 
			
		||||
        android:text="2020"/>
 | 
			
		||||
 | 
			
		||||
    <ScrollView
 | 
			
		||||
        android:layout_width="match_parent"
 | 
			
		||||
        android:layout_height="200dp"
 | 
			
		||||
        android:layout_marginTop="20dp">
 | 
			
		||||
 | 
			
		||||
        <TextView
 | 
			
		||||
            android:id="@+id/dialog_event_detail_type_notes"
 | 
			
		||||
            android:layout_width="match_parent"
 | 
			
		||||
            android:layout_height="wrap_content"
 | 
			
		||||
            android:textStyle="italic"
 | 
			
		||||
            android:text="Lorem ipsum"/>
 | 
			
		||||
 | 
			
		||||
    </ScrollView>
 | 
			
		||||
</LinearLayout>
 | 
			
		||||
		Reference in New Issue
	
	Block a user