From 6791b1e0657f5cc97b112604cfbcdd46cee462bd Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Mon, 27 Jun 2022 22:09:27 +0200 Subject: [PATCH] UI fixes --- common/src/main/res/values/strings.xml | 2 + wearos/src/main/AndroidManifest.xml | 1 + .../wearos/habitica/MainApplication.kt | 6 ++ .../wearos/habitica/data/ApiClient.kt | 60 +++++++++++++++++-- .../habitica/ui/activities/MainActivity.kt | 12 ++-- .../ui/activities/TaskFormActivity.kt | 19 +++++- .../habitica/ui/viewmodels/MainViewModel.kt | 11 ---- .../ui/viewmodels/TaskListViewModel.kt | 9 ++- wearos/src/main/res/layout/activity_login.xml | 2 + .../main/res/layout/activity_task_detail.xml | 7 ++- .../main/res/layout/activity_task_form.xml | 2 +- .../src/main/res/layout/activity_tasklist.xml | 2 +- wearos/src/main/res/layout/row_hub.xml | 2 +- 13 files changed, 104 insertions(+), 31 deletions(-) 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"/>