瀏覽代碼

Show relative timer on lobby screen

Resolves: #1557

Signed-off-by: Tim Krüger <t@timkrueger.me>
Tim Krüger 3 年之前
父節點
當前提交
4e8c8eb8d7

+ 15 - 9
app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt

@@ -1119,20 +1119,26 @@ class ChatController(args: Bundle) :
                 binding.messageInputView.visibility = View.GONE
                 binding.messageInputView.visibility = View.GONE
                 binding.progressBar.visibility = View.GONE
                 binding.progressBar.visibility = View.GONE
 
 
+                val sb = StringBuilder()
+                sb.append(resources!!.getText(R.string.nc_lobby_waiting))
+                    .append("\n\n")
+
                 if (currentConversation?.lobbyTimer != null && currentConversation?.lobbyTimer !=
                 if (currentConversation?.lobbyTimer != null && currentConversation?.lobbyTimer !=
                     0L
                     0L
                 ) {
                 ) {
-                    binding.lobby.lobbyTextView.text = String.format(
-                        resources!!.getString(R.string.nc_lobby_waiting_with_date),
-                        DateUtils.getLocalDateStringFromTimestampForLobby(
-                            currentConversation?.lobbyTimer
-                                ?: 0
-                        ),
-                        currentConversation!!.description
+                    val timestamp = currentConversation?.lobbyTimer ?: 0
+                    val stringWithStartDate = String.format(
+                        resources!!.getString(R.string.nc_lobby_start_date),
+                        DateUtils.getLocalDateStringFromTimestampForLobby(timestamp)
                     )
                     )
-                } else {
-                    binding.lobby.lobbyTextView.setText(R.string.nc_lobby_waiting)
+                    val relativeTime = DateUtils.relativeStartTimeForLobby(timestamp, resources!!)
+
+                    sb.append("$stringWithStartDate - $relativeTime")
+                        .append("\n\n")
                 }
                 }
+
+                sb.append(currentConversation!!.description)
+                binding.lobby.lobbyTextView.text = sb.toString()
             } else {
             } else {
                 binding.lobby.lobbyView.visibility = View.GONE
                 binding.lobby.lobbyView.visibility = View.GONE
                 binding.messagesListView.visibility = View.VISIBLE
                 binding.messagesListView.visibility = View.VISIBLE

+ 59 - 1
app/src/main/java/com/nextcloud/talk/utils/DateUtils.kt

@@ -20,12 +20,26 @@
 
 
 package com.nextcloud.talk.utils
 package com.nextcloud.talk.utils
 
 
+import android.content.res.Resources
+import android.icu.text.RelativeDateTimeFormatter
+import android.icu.text.RelativeDateTimeFormatter.Direction
+import android.icu.text.RelativeDateTimeFormatter.RelativeUnit
+import android.os.Build
+import com.nextcloud.talk.R
 import java.text.DateFormat
 import java.text.DateFormat
 import java.util.Calendar
 import java.util.Calendar
 import java.util.Date
 import java.util.Date
 import java.util.Locale
 import java.util.Locale
+import kotlin.math.roundToInt
 
 
 object DateUtils {
 object DateUtils {
+
+    private const val TIMESTAMP_CORRECTION_MULTIPLIER = 1000
+    private const val SECOND_DIVIDER = 1000
+    private const val MINUTES_DIVIDER = 60
+    private const val HOURS_DIVIDER = 60
+    private const val DAYS_DIVIDER = 24
+
     fun getLocalDateTimeStringFromTimestamp(timestamp: Long): String {
     fun getLocalDateTimeStringFromTimestamp(timestamp: Long): String {
         val cal = Calendar.getInstance()
         val cal = Calendar.getInstance()
         val tz = cal.timeZone
         val tz = cal.timeZone
@@ -41,6 +55,50 @@ object DateUtils {
     }
     }
 
 
     fun getLocalDateStringFromTimestampForLobby(timestamp: Long): String {
     fun getLocalDateStringFromTimestampForLobby(timestamp: Long): String {
-        return getLocalDateTimeStringFromTimestamp(timestamp * 1000)
+        return getLocalDateTimeStringFromTimestamp(timestamp * TIMESTAMP_CORRECTION_MULTIPLIER)
+    }
+
+    fun relativeStartTimeForLobby(timestamp: Long, resources: Resources): String {
+
+        return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
+            val fmt = RelativeDateTimeFormatter.getInstance()
+            val timeLeftMillis = timestamp * TIMESTAMP_CORRECTION_MULTIPLIER - System.currentTimeMillis()
+            val minutes = timeLeftMillis.toDouble() / SECOND_DIVIDER / MINUTES_DIVIDER
+            val hours = minutes / HOURS_DIVIDER
+            val days = hours / DAYS_DIVIDER
+
+            val minutesInt = minutes.roundToInt()
+            val hoursInt = hours.roundToInt()
+            val daysInt = days.roundToInt()
+
+            when {
+                daysInt > 0 -> {
+                    fmt.format(
+                        daysInt.toDouble(),
+                        Direction.NEXT,
+                        RelativeUnit.DAYS
+                    )
+                }
+                hoursInt > 0 -> {
+                    fmt.format(
+                        hoursInt.toDouble(),
+                        Direction.NEXT,
+                        RelativeUnit.HOURS
+                    )
+                }
+                minutesInt > 1 -> {
+                    fmt.format(
+                        minutesInt.toDouble(),
+                        Direction.NEXT,
+                        RelativeUnit.MINUTES
+                    )
+                }
+                else -> {
+                    resources.getString(R.string.nc_lobby_start_soon)
+                }
+            }
+        } else {
+            ""
+        }
     }
     }
 }
 }

+ 2 - 2
app/src/main/res/values/strings.xml

@@ -350,8 +350,8 @@
     <string name="nc_lobby">Lobby</string>
     <string name="nc_lobby">Lobby</string>
     <string name="nc_start_time">Start time</string>
     <string name="nc_start_time">Start time</string>
     <string name="nc_lobby_waiting">You are currently waiting in the lobby.</string>
     <string name="nc_lobby_waiting">You are currently waiting in the lobby.</string>
-    <string name="nc_lobby_waiting_with_date">You are currently waiting in the lobby.\n\nThis meeting is scheduled for
-        %1$s.\n\n%2$s</string>
+    <string name="nc_lobby_start_date">This meeting is scheduled for %1$s</string>
+    <string name="nc_lobby_start_soon">The meeting will start soon</string>
     <string name="nc_manual">Not set</string>
     <string name="nc_manual">Not set</string>
 
 
     <!-- Errors -->
     <!-- Errors -->