diff --git a/common/src/main/res/values/strings.xml b/common/src/main/res/values/strings.xml
index 3f92d5bef..4739dc3e2 100644
--- a/common/src/main/res/values/strings.xml
+++ b/common/src/main/res/values/strings.xml
@@ -55,6 +55,8 @@
Create a Task
Complete a Task
Create %s
+ New %s
+ Save %s
Are you sure?
Task
diff --git a/wearos/src/main/AndroidManifest.xml b/wearos/src/main/AndroidManifest.xml
index 69aefbe0f..943e9543a 100644
--- a/wearos/src/main/AndroidManifest.xml
+++ b/wearos/src/main/AndroidManifest.xml
@@ -2,6 +2,7 @@
+
diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/MainApplication.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/MainApplication.kt
index 6570ecbb8..d58da7d1c 100644
--- a/wearos/src/main/java/com/habitrpg/wearos/habitica/MainApplication.kt
+++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/MainApplication.kt
@@ -5,6 +5,7 @@ import android.content.Intent
import com.habitrpg.common.habitica.extensions.setupCoil
import com.habitrpg.common.habitica.helpers.MarkdownParser
import com.habitrpg.common.habitica.views.HabiticaIconsHelper
+import com.habitrpg.wearos.habitica.data.repositories.TaskRepository
import com.habitrpg.wearos.habitica.data.repositories.UserRepository
import com.habitrpg.wearos.habitica.ui.activities.BaseActivity
import com.habitrpg.wearos.habitica.ui.activities.FaintActivity
@@ -20,6 +21,7 @@ import javax.inject.Inject
class MainApplication : Application() {
@Inject lateinit var userRepository: UserRepository
+ @Inject lateinit var taskRepository: TaskRepository
override fun onCreate() {
super.onCreate()
@@ -40,5 +42,9 @@ class MainApplication : Application() {
}
}.collect()
}
+ MainScope().launch {
+ userRepository.retrieveUser()
+ taskRepository.retrieveTasks()
+ }
}
}
\ No newline at end of file
diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/data/ApiClient.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/data/ApiClient.kt
index d30b1865e..0642ff40a 100644
--- a/wearos/src/main/java/com/habitrpg/wearos/habitica/data/ApiClient.kt
+++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/data/ApiClient.kt
@@ -1,6 +1,8 @@
package com.habitrpg.wearos.habitica.data
import android.content.Context
+import android.net.ConnectivityManager
+import android.net.NetworkCapabilities
import com.amplitude.api.Amplitude
import com.habitrpg.common.habitica.BuildConfig
import com.habitrpg.common.habitica.api.HostConfig
@@ -10,6 +12,7 @@ import com.habitrpg.common.habitica.models.auth.UserAuthSocial
import com.habitrpg.wearos.habitica.models.WearableHabitResponse
import com.habitrpg.wearos.habitica.models.tasks.Task
import okhttp3.Cache
+import okhttp3.CacheControl
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.logging.HttpLoggingInterceptor
@@ -34,7 +37,21 @@ class ApiClient @Inject constructor(
buildRetrofit()
}
- fun buildRetrofit() {
+ private fun hasNetwork(context: Context): Boolean {
+ val connectivityManager =
+ context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
+ val networkCapabilities = connectivityManager.activeNetwork ?: return false
+ val actNw =
+ connectivityManager.getNetworkCapabilities(networkCapabilities) ?: return false
+ return when {
+ actNw.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> true
+ actNw.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> true
+ actNw.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) -> true
+ else -> false
+ }
+ }
+
+ private fun buildRetrofit() {
val logging = HttpLoggingInterceptor()
if (BuildConfig.DEBUG) {
logging.level = HttpLoggingInterceptor.Level.BODY
@@ -44,15 +61,36 @@ class ApiClient @Inject constructor(
val calendar = GregorianCalendar()
val timeZone = calendar.timeZone
- val timezoneOffset = -TimeUnit.MINUTES.convert(timeZone.getOffset(calendar.timeInMillis).toLong(), TimeUnit.MILLISECONDS)
-
- val cacheSize: Long = 10 * 1024 * 1024 // 10 MB
+ val timezoneOffset = -TimeUnit.MINUTES.convert(
+ timeZone.getOffset(calendar.timeInMillis).toLong(),
+ TimeUnit.MILLISECONDS
+ )
+ val cacheSize = (5 * 1024 * 1024).toLong()
val cache = Cache(File(context.cacheDir, "http_cache"), cacheSize)
val client = OkHttpClient.Builder()
.cache(cache)
.addInterceptor(logging)
+ .addInterceptor { chain ->
+ val request = chain.request()
+ var cacheContol = CacheControl.Builder()
+ cacheContol = if (request.method == "GET") {
+ if (hasNetwork(context)) {
+ cacheContol.maxAge(5, TimeUnit.MINUTES)
+ } else {
+ cacheContol.maxAge(1, TimeUnit.DAYS)
+ .onlyIfCached()
+ }
+ } else {
+ cacheContol.noCache()
+ .noStore()
+ }
+ chain.proceed(request.newBuilder().header(
+ "Cache-Control",
+ cacheContol.build().toString()
+ ).build())
+ }
.addNetworkInterceptor { chain ->
val original = chain.request()
var builder: Request.Builder = original.newBuilder()
@@ -70,8 +108,16 @@ class ApiClient @Inject constructor(
builder = builder.header("Authorization", "Basic " + BuildConfig.STAGING_KEY)
}
val request = builder.method(original.method, original.body)
+ .removeHeader("Pragma")
.build()
- chain.proceed(request)
+ val response = chain.proceed(request)
+ if (request.method == "GET") {
+ response.newBuilder()
+ .header("Cache-Control", request.header("Cache-Control") ?: "")
+ .build()
+ } else {
+ response
+ }
}
.readTimeout(2400, TimeUnit.SECONDS)
.build()
@@ -111,6 +157,8 @@ class ApiClient @Inject constructor(
suspend fun runCron() = process(apiService.runCron())
suspend fun getTasks() = process(apiService.getTasks())
- suspend fun scoreTask(id: String, direction: String) = process(apiService.scoreTask(id, direction))
+ suspend fun scoreTask(id: String, direction: String) =
+ process(apiService.scoreTask(id, direction))
+
suspend fun createTask(task: Task) = process(apiService.createTask(task))
}
\ No newline at end of file
diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/MainActivity.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/MainActivity.kt
index f73bdfb52..63a2a5f4f 100644
--- a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/MainActivity.kt
+++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/MainActivity.kt
@@ -113,14 +113,16 @@ class MainActivity : BaseActivity() {
adapter.notifyItemChanged(0)
val index = adapter.data.indexOfFirst { it.identifier == "stats" }
adapter.data[index].detailText = getString(R.string.user_level, it.stats?.lvl ?: 0)
- adapter.notifyItemChanged(index)
+ adapter.notifyItemChanged(index+1)
}
viewModel.taskCounts.observe(this) {
adapter.data.forEach { menuItem ->
- if (it.containsKey(menuItem.identifier) && it[menuItem.identifier]!! > 0) {
- menuItem.detailText = it[menuItem.identifier].toString()
- } else {
- menuItem.detailText = null
+ if (it.containsKey(menuItem.identifier)) {
+ if (it[menuItem.identifier]!! > 0) {
+ menuItem.detailText = it[menuItem.identifier].toString()
+ } else {
+ menuItem.detailText = null
+ }
}
}
adapter.notifyDataSetChanged()
diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/TaskFormActivity.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/TaskFormActivity.kt
index 4e9fdbe3f..f8c7ac226 100644
--- a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/TaskFormActivity.kt
+++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/TaskFormActivity.kt
@@ -1,13 +1,16 @@
package com.habitrpg.wearos.habitica.ui.activities
+import android.content.Context
import android.content.Intent
import android.content.res.ColorStateList
import android.os.Bundle
import android.view.inputmethod.EditorInfo
+import android.view.inputmethod.InputMethodManager
import android.widget.TextView
import androidx.activity.viewModels
import androidx.core.content.ContextCompat
import androidx.core.view.isVisible
+import androidx.core.view.postDelayed
import androidx.lifecycle.lifecycleScope
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.databinding.ActivityTaskFormBinding
@@ -25,7 +28,8 @@ class TaskFormActivity : BaseActivity("task_type"))
val tasks = taskRepository.getTasks(taskType ?: TaskType.HABIT).asLiveData()
- val user = userRepository.getUser()
+ val user = userRepository.getUser()
.asLiveData()
fun scoreTask(task: Task, direction: TaskDirection, onResult: (TaskScoringResult?) -> Unit) {
viewModelScope.launch(exceptionBuilder.userFacing(this)) {
- val result = taskRepository.scoreTask(user.value, task, direction)
+ val result = taskRepository.scoreTask(
+ userRepository.localRepository.getUser().first(),
+ task,
+ direction
+ )
onResult(result)
}
}
diff --git a/wearos/src/main/res/layout/activity_login.xml b/wearos/src/main/res/layout/activity_login.xml
index 11e70d08e..efac8f016 100644
--- a/wearos/src/main/res/layout/activity_login.xml
+++ b/wearos/src/main/res/layout/activity_login.xml
@@ -82,6 +82,7 @@
android:paddingHorizontal="16dp"
android:background="@drawable/row_background_outline"
android:autofillHints="username"
+ android:textColorHint="@color/watch_gray_200"
android:textSize="14sp"
android:layout_marginBottom="@dimen/spacing_small"/>
\ No newline at end of file
diff --git a/wearos/src/main/res/layout/activity_task_form.xml b/wearos/src/main/res/layout/activity_task_form.xml
index 0ef8b4455..5c63da62e 100644
--- a/wearos/src/main/res/layout/activity_task_form.xml
+++ b/wearos/src/main/res/layout/activity_task_form.xml
@@ -72,7 +72,7 @@
android:paddingHorizontal="18dp"
android:hint="@string/task_title_hint"
android:background="@drawable/row_background_outline"
- android:inputType="textCapWords" />
+ android:inputType="textCapSentences" />
\ No newline at end of file
diff --git a/wearos/src/main/res/layout/row_hub.xml b/wearos/src/main/res/layout/row_hub.xml
index 3c7a1c05e..156fcc0df 100644
--- a/wearos/src/main/res/layout/row_hub.xml
+++ b/wearos/src/main/res/layout/row_hub.xml
@@ -28,7 +28,7 @@
android:id="@+id/detail_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- style="@style/Text.Body2"
+ style="@style/Text.Body1"
android:textColor="@color/watch_purple_200"
android:layout_marginEnd="@dimen/spacing_medium"/>