From 29c0c37e0e35246e9331da85703bc8ebf0af383d Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Fri, 10 Jun 2022 10:01:17 +0200 Subject: [PATCH] Auto-login user if they are logged in on phone --- Habitica/AndroidManifest.xml | 9 +++ .../habitica/components/UserComponent.java | 3 + .../data/implementation/ApiClientImpl.kt | 2 +- .../receivers/DeviceCommunicationService.kt | 32 ++++++++ .../LocalNotificationActionReceiver.kt | 2 +- .../habitica/ui/activities/MainActivity.kt | 15 ++-- .../extensions/Application-Extensions.kt | 6 +- .../common/habitica/views/AvatarView.kt | 6 +- wearos/src/main/AndroidManifest.xml | 24 +++--- .../wearos/habitica/models/tasks/Task.kt | 2 +- .../habitica/ui/activities/AvatarActivity.kt | 2 +- .../habitica/ui/activities/LoginActivity.kt | 7 +- .../habitica/ui/activities/MainActivity.kt | 13 +--- .../ui/activities/SettingsActivity.kt | 4 +- .../habitica/ui/activities/SplashActivity.kt | 75 +++++++++++++++++++ .../habitica/ui/activities/StatsActivity.kt | 2 +- .../ui/activities/TaskFormActivity.kt | 2 +- .../ui/activities/TaskListActivity.kt | 4 +- .../habitica/ui/adapters/DailyListAdapter.kt | 2 +- .../habitica/ui/adapters/HabitListAdapter.kt | 2 +- .../wearos/habitica/ui/adapters/HubAdapter.kt | 4 +- .../habitica/ui/adapters/RewardListAdapter.kt | 2 +- .../habitica/ui/adapters/SettingsAdapter.kt | 4 +- .../habitica/ui/adapters/TaskListAdapter.kt | 2 +- .../habitica/ui/adapters/ToDoListAdapter.kt | 2 +- .../ui/viewHolders/HeaderViewHolder.kt | 2 +- .../habitica/ui/viewHolders/HubViewHolder.kt | 4 +- .../ui/viewHolders/tasks/DailyViewHolder.kt | 2 +- .../ui/viewHolders/tasks/HabitViewHolder.kt | 2 +- .../ui/viewHolders/tasks/RewardViewHolder.kt | 2 +- .../ui/viewHolders/tasks/ToDoViewHolder.kt | 2 +- .../habitica/ui/viewmodels/SplashViewModel.kt | 69 +++++++++++++++++ .../src/main/res/layout/activity_splash.xml | 7 ++ 33 files changed, 251 insertions(+), 67 deletions(-) create mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/receivers/DeviceCommunicationService.kt create mode 100644 wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/SplashActivity.kt create mode 100644 wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewmodels/SplashViewModel.kt create mode 100644 wearos/src/main/res/layout/activity_splash.xml diff --git a/Habitica/AndroidManifest.xml b/Habitica/AndroidManifest.xml index 68b34144c..503e8a516 100644 --- a/Habitica/AndroidManifest.xml +++ b/Habitica/AndroidManifest.xml @@ -302,6 +302,15 @@ android:name=".widget.TodosWidgetService" android:permission="android.permission.BIND_REMOTEVIEWS" /> + + + + + + + diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/components/UserComponent.java b/Habitica/src/main/java/com/habitrpg/android/habitica/components/UserComponent.java index dbff176df..1af774a36 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/components/UserComponent.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/components/UserComponent.java @@ -8,6 +8,7 @@ import com.habitrpg.android.habitica.helpers.notifications.HabiticaFirebaseMessa import com.habitrpg.android.habitica.helpers.notifications.PushNotificationManager; import com.habitrpg.android.habitica.modules.UserModule; import com.habitrpg.android.habitica.modules.UserRepositoryModule; +import com.habitrpg.android.habitica.receivers.DeviceCommunicationService; import com.habitrpg.android.habitica.receivers.LocalNotificationActionReceiver; import com.habitrpg.android.habitica.receivers.NotificationPublisher; import com.habitrpg.android.habitica.receivers.TaskAlarmBootReceiver; @@ -367,4 +368,6 @@ public interface UserComponent { void inject(@NotNull StableViewModel stableViewModel); void inject(@NotNull DeathActivity deathActivity); + + void inject(@NotNull DeviceCommunicationService deviceCommunicationService); } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.kt index 3a95056f0..a99038881 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.kt @@ -232,7 +232,7 @@ class ApiClientImpl( if (res.message != null && res.message == "RECEIPT_ALREADY_USED") { return - }∂ + } if (error.response()?.raw()?.request?.url?.toString()?.endsWith("/user/push-devices") == true) { // workaround for an error that sometimes displays that the user already has this push device return diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/DeviceCommunicationService.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/DeviceCommunicationService.kt new file mode 100644 index 000000000..887bf991c --- /dev/null +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/DeviceCommunicationService.kt @@ -0,0 +1,32 @@ +package com.habitrpg.android.habitica.receivers + +import android.util.Log +import com.google.android.gms.wearable.MessageEvent +import com.google.android.gms.wearable.Wearable +import com.google.android.gms.wearable.WearableListenerService +import com.habitrpg.android.habitica.HabiticaBaseApplication +import com.habitrpg.common.habitica.api.HostConfig +import javax.inject.Inject + +class DeviceCommunicationService: WearableListenerService() { + @Inject + lateinit var hostConfig: HostConfig + + private val messageClient by lazy { Wearable.getMessageClient(this) } + + init { + HabiticaBaseApplication.userComponent?.inject(this) + } + + override fun onMessageReceived(event: MessageEvent) { + super.onMessageReceived(event) + when (event.path) { + "/request/auth" -> processAuthRequest(event) + } + } + + private fun processAuthRequest(event: MessageEvent) { + Log.d("DeviceCommunicationServ", "processAuthRequest: AUTH REQUESTED") + messageClient.sendMessage(event.sourceNodeId, "/auth", "${hostConfig.userID}:${hostConfig.apiKey}".toByteArray()) + } +} \ No newline at end of file diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/LocalNotificationActionReceiver.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/LocalNotificationActionReceiver.kt index 5d0e87eb0..94c65e650 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/LocalNotificationActionReceiver.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/LocalNotificationActionReceiver.kt @@ -127,6 +127,6 @@ class LocalNotificationActionReceiver : BroadcastReceiver() { } private fun getMessageText(key: String?): String? { - return RemoteInput.getResultsFromIntent(intent)?.getCharSequence(key)?.toString() + return intent?.let { RemoteInput.getResultsFromIntent(it)?.getCharSequence(key)?.toString() } } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.kt index 05e1261c7..a190fa740 100755 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.kt @@ -21,6 +21,7 @@ import androidx.lifecycle.lifecycleScope import androidx.navigation.NavDestination import androidx.navigation.findNavController import androidx.navigation.fragment.NavHostFragment +import com.google.android.gms.wearable.Wearable import com.google.firebase.perf.FirebasePerformance import com.habitrpg.android.habitica.BuildConfig import com.habitrpg.android.habitica.R @@ -30,10 +31,7 @@ import com.habitrpg.android.habitica.data.InventoryRepository import com.habitrpg.android.habitica.data.TaskRepository import com.habitrpg.android.habitica.data.local.UserQuestStatus import com.habitrpg.android.habitica.databinding.ActivityMainBinding -import com.habitrpg.common.habitica.extensions.dpToPx -import com.habitrpg.common.habitica.extensions.getThemeColor import com.habitrpg.android.habitica.extensions.hideKeyboard -import com.habitrpg.common.habitica.extensions.isUsingNightModeResources import com.habitrpg.android.habitica.extensions.observeOnce import com.habitrpg.android.habitica.extensions.subscribeWithErrorHandler import com.habitrpg.android.habitica.extensions.updateStatusBarColor @@ -47,10 +45,7 @@ import com.habitrpg.android.habitica.interactors.CheckClassSelectionUseCase import com.habitrpg.android.habitica.interactors.DisplayItemDropUseCase import com.habitrpg.android.habitica.interactors.NotifyUserUseCase import com.habitrpg.android.habitica.models.TutorialStep -import com.habitrpg.common.habitica.models.responses.MaintenanceResponse -import com.habitrpg.common.habitica.models.responses.TaskScoringResult import com.habitrpg.android.habitica.models.user.User -import com.habitrpg.common.habitica.views.AvatarView import com.habitrpg.android.habitica.ui.AvatarWithBarsViewModel import com.habitrpg.android.habitica.ui.TutorialView import com.habitrpg.android.habitica.ui.fragments.NavigationDrawerFragment @@ -63,6 +58,12 @@ import com.habitrpg.android.habitica.widget.AvatarStatsWidgetProvider import com.habitrpg.android.habitica.widget.DailiesWidgetProvider import com.habitrpg.android.habitica.widget.HabitButtonWidgetProvider import com.habitrpg.android.habitica.widget.TodoListWidgetProvider +import com.habitrpg.common.habitica.extensions.dpToPx +import com.habitrpg.common.habitica.extensions.getThemeColor +import com.habitrpg.common.habitica.extensions.isUsingNightModeResources +import com.habitrpg.common.habitica.models.responses.MaintenanceResponse +import com.habitrpg.common.habitica.models.responses.TaskScoringResult +import com.habitrpg.common.habitica.views.AvatarView import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import kotlinx.coroutines.delay @@ -140,6 +141,8 @@ open class MainActivity : BaseActivity(), SnackbarActivity { intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK) startActivity(intent) return + } else { + Wearable.getCapabilityClient(this).addLocalCapability("provide_auth") } setupToolbar(binding.toolbar) diff --git a/common/src/main/java/com/habitrpg/common/habitica/extensions/Application-Extensions.kt b/common/src/main/java/com/habitrpg/common/habitica/extensions/Application-Extensions.kt index 8e0f89bbb..363d913e9 100644 --- a/common/src/main/java/com/habitrpg/common/habitica/extensions/Application-Extensions.kt +++ b/common/src/main/java/com/habitrpg/common/habitica/extensions/Application-Extensions.kt @@ -12,11 +12,11 @@ import com.habitrpg.common.habitica.BuildConfig fun Application.setupCoil() { var builder = ImageLoader.Builder(this) .allowHardware(false) - .componentRegistry { + .components { if (Build.VERSION.SDK_INT >= 28) { - add(ImageDecoderDecoder(this@setupCoil)) + add(ImageDecoderDecoder.Factory()) } else { - add(GifDecoder()) + add(GifDecoder.Factory()) } } if (BuildConfig.DEBUG) { diff --git a/common/src/main/java/com/habitrpg/common/habitica/views/AvatarView.kt b/common/src/main/java/com/habitrpg/common/habitica/views/AvatarView.kt index 9c1e2ad1f..1b168f553 100644 --- a/common/src/main/java/com/habitrpg/common/habitica/views/AvatarView.kt +++ b/common/src/main/java/com/habitrpg/common/habitica/views/AvatarView.kt @@ -15,7 +15,7 @@ import android.widget.ImageView import androidx.core.graphics.drawable.toBitmap import androidx.core.view.marginStart import androidx.core.view.marginTop -import coil.clear +import coil.dispose import coil.load import com.habitrpg.common.habitica.BuildConfig import com.habitrpg.common.habitica.R @@ -150,7 +150,7 @@ class AvatarView : FrameLayout { continue } imageView.tag = layerName - imageView.clear() + imageView.dispose() imageView.setImageResource(0) imageView.load( @@ -182,7 +182,7 @@ class AvatarView : FrameLayout { } } while (i < (imageViewHolder.size)) { - imageViewHolder[i].clear() + imageViewHolder[i].dispose() imageViewHolder[i].setImageResource(0) imageViewHolder[i].tag = null i++ diff --git a/wearos/src/main/AndroidManifest.xml b/wearos/src/main/AndroidManifest.xml index f9ca176b6..53c6cde44 100644 --- a/wearos/src/main/AndroidManifest.xml +++ b/wearos/src/main/AndroidManifest.xml @@ -1,6 +1,6 @@ + package="com.habitrpg.android.habitica"> @@ -11,16 +11,11 @@ android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" - android:name=".MainApplication" + android:name="com.habitrpg.wearos.habitica.MainApplication" android:theme="@style/Theme.AppCompat.NoActionBar"> - - @@ -29,20 +24,23 @@ android:name="com.habitrpg.wearos.habitica.ui.activities.MainActivity" android:exported="true" android:label="@string/app_name"> + + - + - - + + - - - + + + diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/models/tasks/Task.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/models/tasks/Task.kt index d46ab7e05..eed3e036f 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/models/tasks/Task.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/models/tasks/Task.kt @@ -3,11 +3,11 @@ package com.habitrpg.wearos.habitica.models.tasks import android.os.Parcel import android.os.Parcelable import android.text.Spanned +import com.habitrpg.android.habitica.R import com.habitrpg.common.habitica.helpers.MarkdownParser import com.habitrpg.common.habitica.models.tasks.Attribute import com.habitrpg.common.habitica.models.tasks.Frequency import com.habitrpg.common.habitica.models.tasks.TaskType -import com.habitrpg.wearos.habitica.R import com.squareup.moshi.Json import com.squareup.moshi.JsonClass import org.json.JSONArray diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/AvatarActivity.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/AvatarActivity.kt index 552da78d9..d73dee563 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/AvatarActivity.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/AvatarActivity.kt @@ -7,7 +7,7 @@ import android.view.ViewOutlineProvider import android.widget.FrameLayout import androidx.activity.viewModels import com.habitrpg.common.habitica.extensions.dpToPx -import com.habitrpg.wearos.habitica.databinding.ActivityAvatarBinding +import com.habitrpg.android.habitica.databinding.ActivityAvatarBinding import com.habitrpg.wearos.habitica.ui.viewmodels.AvatarViewModel import dagger.hilt.android.AndroidEntryPoint import java.lang.Integer.max diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/LoginActivity.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/LoginActivity.kt index c3e43ab62..bd36a1feb 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/LoginActivity.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/LoginActivity.kt @@ -7,13 +7,10 @@ import android.content.Intent import android.os.Bundle import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.viewModels -import androidx.lifecycle.lifecycleScope -import com.habitrpg.common.habitica.models.auth.UserAuthResponse -import com.habitrpg.wearos.habitica.R -import com.habitrpg.wearos.habitica.databinding.ActivityLoginBinding +import com.habitrpg.android.habitica.R +import com.habitrpg.android.habitica.databinding.ActivityLoginBinding import com.habitrpg.wearos.habitica.ui.viewmodels.LoginViewModel import dagger.hilt.android.AndroidEntryPoint -import kotlinx.coroutines.launch @AndroidEntryPoint class LoginActivity: BaseActivity() { 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 ee333f28b..5565eacba 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 @@ -7,8 +7,8 @@ import androidx.appcompat.content.res.AppCompatResources import androidx.core.content.ContextCompat import androidx.wear.widget.WearableLinearLayoutManager import com.habitrpg.common.habitica.models.tasks.TaskType -import com.habitrpg.wearos.habitica.R -import com.habitrpg.wearos.habitica.databinding.ActivityMainBinding +import com.habitrpg.android.habitica.R +import com.habitrpg.android.habitica.databinding.ActivityMainBinding import com.habitrpg.wearos.habitica.models.MenuItem import com.habitrpg.wearos.habitica.ui.adapters.HubAdapter import com.habitrpg.wearos.habitica.ui.viewmodels.MainViewModel @@ -28,9 +28,6 @@ class MainActivity : BaseActivity() { WearableLinearLayoutManager(this@MainActivity, HabiticaScrollingLayoutCallback()) adapter = this@MainActivity.adapter } - if (!viewModel.isAuthenticated) { - openLoginActivity() - } } override fun onStart() { @@ -125,12 +122,6 @@ class MainActivity : BaseActivity() { startActivity(Intent(this, SettingsActivity::class.java)) } - private fun openLoginActivity() { - val intent = Intent(this, LoginActivity::class.java) - intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK) - startActivity(intent) - } - private fun openTasklist(type: TaskType) { val intent = Intent(this, TaskListActivity::class.java).apply { putExtra("task_type", type.value) diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/SettingsActivity.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/SettingsActivity.kt index 552912922..1ae80da42 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/SettingsActivity.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/SettingsActivity.kt @@ -4,8 +4,8 @@ import android.content.Intent import android.os.Bundle import androidx.activity.viewModels import androidx.wear.widget.WearableLinearLayoutManager -import com.habitrpg.wearos.habitica.R -import com.habitrpg.wearos.habitica.databinding.ActivitySettingsBinding +import com.habitrpg.android.habitica.R +import com.habitrpg.android.habitica.databinding.ActivitySettingsBinding import com.habitrpg.wearos.habitica.ui.adapters.SettingsAdapter import com.habitrpg.wearos.habitica.ui.adapters.SettingsItem import com.habitrpg.wearos.habitica.ui.viewmodels.SettingsViewModel diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/SplashActivity.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/SplashActivity.kt new file mode 100644 index 000000000..53dc1ca42 --- /dev/null +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/SplashActivity.kt @@ -0,0 +1,75 @@ +package com.habitrpg.wearos.habitica.ui.activities + +import android.content.Intent +import android.os.Bundle +import androidx.activity.viewModels +import androidx.lifecycle.lifecycleScope +import com.google.android.gms.tasks.Tasks +import com.google.android.gms.wearable.CapabilityClient +import com.google.android.gms.wearable.MessageClient +import com.google.android.gms.wearable.Wearable +import com.habitrpg.android.habitica.databinding.ActivitySplashBinding +import com.habitrpg.wearos.habitica.ui.viewmodels.SplashViewModel +import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch + +@AndroidEntryPoint +class SplashActivity: BaseActivity() { + override val viewModel: SplashViewModel by viewModels() + val messageClient: MessageClient by lazy { Wearable.getMessageClient(this) } + val capabilityClient: CapabilityClient by lazy { Wearable.getCapabilityClient(this) } + + override fun onCreate(savedInstanceState: Bundle?) { + binding = ActivitySplashBinding.inflate(layoutInflater) + super.onCreate(savedInstanceState) + if (viewModel.hasAuthentication) { + startMainActivity() + } + + viewModel.onLoginCompleted = { + if (it) { + startMainActivity() + } else { + startLoginActivity() + } + } + } + + private fun startMainActivity() { + val intent = Intent(this, MainActivity::class.java) + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK) + startActivity(intent) + } + + private fun startLoginActivity() { + val intent = Intent(this, LoginActivity::class.java) + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK) + startActivity(intent) + } + + private fun requestAuthenticationData(nodeID: String) { + Tasks.await(messageClient.sendMessage(nodeID, "/request/auth", null).apply { + addOnSuccessListener { + + } + }) + } + + override fun onResume() { + super.onResume() + messageClient.addListener(viewModel) + lifecycleScope.launch(Dispatchers.IO) { + val info = Tasks.await(capabilityClient.getCapability("provide_auth", CapabilityClient.FILTER_REACHABLE)) + val nodeID = info.nodes.firstOrNull { it.isNearby } + if (nodeID != null) { + requestAuthenticationData(nodeID.id) + } + } + } + + override fun onPause() { + messageClient.removeListener(viewModel) + super.onPause() + } +} \ No newline at end of file diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/StatsActivity.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/StatsActivity.kt index 8c13afa33..a6f15d7b0 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/StatsActivity.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/StatsActivity.kt @@ -2,7 +2,7 @@ package com.habitrpg.wearos.habitica.ui.activities import android.os.Bundle import androidx.activity.viewModels -import com.habitrpg.wearos.habitica.databinding.ActivityStatsBinding +import com.habitrpg.android.habitica.databinding.ActivityStatsBinding import com.habitrpg.wearos.habitica.ui.viewmodels.StatsViewModel import dagger.hilt.android.AndroidEntryPoint 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 80508c1dc..870c0ca7c 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 @@ -2,7 +2,7 @@ package com.habitrpg.wearos.habitica.ui.activities import android.os.Bundle import androidx.activity.viewModels -import com.habitrpg.wearos.habitica.databinding.ActivityTaskFormBinding +import com.habitrpg.android.habitica.databinding.ActivityTaskFormBinding import com.habitrpg.wearos.habitica.ui.viewmodels.TaskFormViewModel import dagger.hilt.android.AndroidEntryPoint diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/TaskListActivity.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/TaskListActivity.kt index e06016fde..5082f9a52 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/TaskListActivity.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/TaskListActivity.kt @@ -8,8 +8,8 @@ import androidx.wear.widget.WearableLinearLayoutManager import com.habitrpg.common.habitica.models.responses.TaskDirection import com.habitrpg.common.habitica.models.responses.TaskScoringResult import com.habitrpg.common.habitica.models.tasks.TaskType -import com.habitrpg.wearos.habitica.R -import com.habitrpg.wearos.habitica.databinding.ActivityTasklistBinding +import com.habitrpg.android.habitica.R +import com.habitrpg.android.habitica.databinding.ActivityTasklistBinding import com.habitrpg.wearos.habitica.models.tasks.Task import com.habitrpg.wearos.habitica.ui.adapters.DailyListAdapter import com.habitrpg.wearos.habitica.ui.adapters.HabitListAdapter diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/adapters/DailyListAdapter.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/adapters/DailyListAdapter.kt index a1653dcf7..244f9c2ec 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/adapters/DailyListAdapter.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/adapters/DailyListAdapter.kt @@ -3,7 +3,7 @@ package com.habitrpg.wearos.habitica.ui.adapters import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import com.habitrpg.common.habitica.extensions.layoutInflater -import com.habitrpg.wearos.habitica.databinding.RowDailyBinding +import com.habitrpg.android.habitica.databinding.RowDailyBinding import com.habitrpg.wearos.habitica.ui.viewHolders.tasks.DailyViewHolder class DailyListAdapter: TaskListAdapter() { diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/adapters/HabitListAdapter.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/adapters/HabitListAdapter.kt index b11104bb0..01c3fbbe4 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/adapters/HabitListAdapter.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/adapters/HabitListAdapter.kt @@ -3,7 +3,7 @@ package com.habitrpg.wearos.habitica.ui.adapters import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import com.habitrpg.common.habitica.extensions.layoutInflater -import com.habitrpg.wearos.habitica.databinding.RowHabitBinding +import com.habitrpg.android.habitica.databinding.RowHabitBinding import com.habitrpg.wearos.habitica.ui.viewHolders.tasks.HabitViewHolder class HabitListAdapter: TaskListAdapter() { diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/adapters/HubAdapter.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/adapters/HubAdapter.kt index 4b6fb02dc..1071087ea 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/adapters/HubAdapter.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/adapters/HubAdapter.kt @@ -3,8 +3,8 @@ package com.habitrpg.wearos.habitica.ui.adapters import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import com.habitrpg.common.habitica.extensions.layoutInflater -import com.habitrpg.wearos.habitica.databinding.RowHeaderBinding -import com.habitrpg.wearos.habitica.databinding.RowHubBinding +import com.habitrpg.android.habitica.databinding.RowHeaderBinding +import com.habitrpg.android.habitica.databinding.RowHubBinding import com.habitrpg.wearos.habitica.models.MenuItem import com.habitrpg.wearos.habitica.ui.viewHolders.HeaderViewHolder import com.habitrpg.wearos.habitica.ui.viewHolders.HubViewHolder diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/adapters/RewardListAdapter.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/adapters/RewardListAdapter.kt index 95f068d3e..c8569d984 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/adapters/RewardListAdapter.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/adapters/RewardListAdapter.kt @@ -3,7 +3,7 @@ package com.habitrpg.wearos.habitica.ui.adapters import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import com.habitrpg.common.habitica.extensions.layoutInflater -import com.habitrpg.wearos.habitica.databinding.RowRewardBinding +import com.habitrpg.android.habitica.databinding.RowRewardBinding import com.habitrpg.wearos.habitica.ui.viewHolders.tasks.RewardViewHolder class RewardListAdapter: TaskListAdapter() { diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/adapters/SettingsAdapter.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/adapters/SettingsAdapter.kt index d5f1cba3f..983ede41b 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/adapters/SettingsAdapter.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/adapters/SettingsAdapter.kt @@ -5,8 +5,8 @@ import android.view.ViewGroup import androidx.core.content.ContextCompat import androidx.recyclerview.widget.RecyclerView import com.habitrpg.common.habitica.extensions.layoutInflater -import com.habitrpg.wearos.habitica.R -import com.habitrpg.wearos.habitica.databinding.RowSettingsBinding +import com.habitrpg.android.habitica.R +import com.habitrpg.android.habitica.databinding.RowSettingsBinding import com.habitrpg.wearos.habitica.ui.viewHolders.BindableViewHolder class SettingsAdapter: RecyclerView.Adapter() { diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/adapters/TaskListAdapter.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/adapters/TaskListAdapter.kt index 3b4c61c10..9020f1824 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/adapters/TaskListAdapter.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/adapters/TaskListAdapter.kt @@ -3,7 +3,7 @@ package com.habitrpg.wearos.habitica.ui.adapters import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import com.habitrpg.common.habitica.extensions.layoutInflater -import com.habitrpg.wearos.habitica.databinding.RowHeaderBinding +import com.habitrpg.android.habitica.databinding.RowHeaderBinding import com.habitrpg.wearos.habitica.models.tasks.Task import com.habitrpg.wearos.habitica.ui.viewHolders.HeaderViewHolder import com.habitrpg.wearos.habitica.ui.viewHolders.tasks.TaskViewHolder diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/adapters/ToDoListAdapter.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/adapters/ToDoListAdapter.kt index 1d38a1e82..a9719aa76 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/adapters/ToDoListAdapter.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/adapters/ToDoListAdapter.kt @@ -3,7 +3,7 @@ package com.habitrpg.wearos.habitica.ui.adapters import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import com.habitrpg.common.habitica.extensions.layoutInflater -import com.habitrpg.wearos.habitica.databinding.RowTodoBinding +import com.habitrpg.android.habitica.databinding.RowTodoBinding import com.habitrpg.wearos.habitica.ui.viewHolders.tasks.ToDoViewHolder class ToDoListAdapter: TaskListAdapter() { diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewHolders/HeaderViewHolder.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewHolders/HeaderViewHolder.kt index 5d1fb6ee6..6bb38728c 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewHolders/HeaderViewHolder.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewHolders/HeaderViewHolder.kt @@ -1,7 +1,7 @@ package com.habitrpg.wearos.habitica.ui.viewHolders import android.view.View -import com.habitrpg.wearos.habitica.databinding.RowHeaderBinding +import com.habitrpg.android.habitica.databinding.RowHeaderBinding class HeaderViewHolder(itemView: View): BindableViewHolder(itemView) { private val binding = RowHeaderBinding.bind(itemView) diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewHolders/HubViewHolder.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewHolders/HubViewHolder.kt index d0bd6016d..f27e74ed0 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewHolders/HubViewHolder.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewHolders/HubViewHolder.kt @@ -3,8 +3,8 @@ package com.habitrpg.wearos.habitica.ui.viewHolders import android.content.res.ColorStateList import android.view.View import androidx.core.content.ContextCompat -import com.habitrpg.wearos.habitica.R -import com.habitrpg.wearos.habitica.databinding.RowHubBinding +import com.habitrpg.android.habitica.R +import com.habitrpg.android.habitica.databinding.RowHubBinding import com.habitrpg.wearos.habitica.models.MenuItem class HubViewHolder(itemView: View): BindableViewHolder(itemView) { diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewHolders/tasks/DailyViewHolder.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewHolders/tasks/DailyViewHolder.kt index a5b993cd7..d64576634 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewHolders/tasks/DailyViewHolder.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewHolders/tasks/DailyViewHolder.kt @@ -4,7 +4,7 @@ import android.content.res.ColorStateList import android.view.View import android.widget.TextView import androidx.core.content.ContextCompat -import com.habitrpg.wearos.habitica.databinding.RowDailyBinding +import com.habitrpg.android.habitica.databinding.RowDailyBinding import com.habitrpg.wearos.habitica.models.tasks.Task class DailyViewHolder(itemView: View) : TaskViewHolder(itemView) { diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewHolders/tasks/HabitViewHolder.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewHolders/tasks/HabitViewHolder.kt index b8c99fed4..3d491841e 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewHolders/tasks/HabitViewHolder.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewHolders/tasks/HabitViewHolder.kt @@ -4,7 +4,7 @@ import android.content.res.ColorStateList import android.view.View import android.widget.TextView import androidx.core.content.ContextCompat -import com.habitrpg.wearos.habitica.databinding.RowHabitBinding +import com.habitrpg.android.habitica.databinding.RowHabitBinding import com.habitrpg.wearos.habitica.models.tasks.Task class HabitViewHolder(itemView: View) : TaskViewHolder(itemView) { diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewHolders/tasks/RewardViewHolder.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewHolders/tasks/RewardViewHolder.kt index 06b599533..3b8769c19 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewHolders/tasks/RewardViewHolder.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewHolders/tasks/RewardViewHolder.kt @@ -2,7 +2,7 @@ package com.habitrpg.wearos.habitica.ui.viewHolders.tasks import android.view.View import android.widget.TextView -import com.habitrpg.wearos.habitica.databinding.RowRewardBinding +import com.habitrpg.android.habitica.databinding.RowRewardBinding import com.habitrpg.wearos.habitica.models.tasks.Task class RewardViewHolder(itemView: View) : TaskViewHolder(itemView) { diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewHolders/tasks/ToDoViewHolder.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewHolders/tasks/ToDoViewHolder.kt index 41e665bba..cd00cc327 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewHolders/tasks/ToDoViewHolder.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewHolders/tasks/ToDoViewHolder.kt @@ -4,7 +4,7 @@ import android.content.res.ColorStateList import android.view.View import android.widget.TextView import androidx.core.content.ContextCompat -import com.habitrpg.wearos.habitica.databinding.RowTodoBinding +import com.habitrpg.android.habitica.databinding.RowTodoBinding import com.habitrpg.wearos.habitica.models.tasks.Task class ToDoViewHolder(itemView: View) : TaskViewHolder(itemView) { diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewmodels/SplashViewModel.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewmodels/SplashViewModel.kt new file mode 100644 index 000000000..5386e3d8d --- /dev/null +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewmodels/SplashViewModel.kt @@ -0,0 +1,69 @@ +package com.habitrpg.wearos.habitica.ui.viewmodels + +import android.content.SharedPreferences +import androidx.core.content.edit +import androidx.lifecycle.viewModelScope +import com.google.android.gms.wearable.MessageClient +import com.google.android.gms.wearable.MessageEvent +import com.habitrpg.common.habitica.api.HostConfig +import com.habitrpg.common.habitica.helpers.KeyHelper +import com.habitrpg.wearos.habitica.data.ApiClient +import com.habitrpg.wearos.habitica.data.repositories.UserRepository +import com.habitrpg.wearos.habitica.util.ExceptionHandlerBuilder +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.launch +import javax.inject.Inject + +@HiltViewModel +class SplashViewModel @Inject constructor(userRepository: UserRepository, + exceptionBuilder: ExceptionHandlerBuilder, + val hostConfig: HostConfig, + val apiClient: ApiClient, + val sharedPreferences: SharedPreferences, + val keyHelper: KeyHelper? +) : BaseViewModel(userRepository, exceptionBuilder), MessageClient.OnMessageReceivedListener { + lateinit var onLoginCompleted: (Boolean) -> Unit + + val hasAuthentication: Boolean + get() { + return hostConfig.hasAuthentication() + } + + override fun onMessageReceived(event: MessageEvent) { + when (event.path) { + "/auth" -> authDataReceived(event) + } + } + + private fun authDataReceived(event: MessageEvent) { + viewModelScope.launch(exceptionBuilder.silent()) { + val (userID, apiKey) = String(event.data).split(":") + try { + saveTokens(apiKey, userID) + } catch (e: Exception) { + } + retrieveUser() + onLoginCompleted(true) + } + } + + @Throws(Exception::class) + private fun saveTokens(api: String, user: String) { + this.apiClient.updateAuthenticationCredentials(user, api) + sharedPreferences.edit { + putString("UserID", user) + val encryptedKey = + try { + keyHelper?.encrypt(api) + } catch (e: Exception) { + null + } + if ((encryptedKey?.length ?: 0) > 5) { + putString(user, encryptedKey) + } else { + // Something might have gone wrong with encryption, so fall back to this. + putString("APIToken", api) + } + } + } +} diff --git a/wearos/src/main/res/layout/activity_splash.xml b/wearos/src/main/res/layout/activity_splash.xml new file mode 100644 index 000000000..d829e291c --- /dev/null +++ b/wearos/src/main/res/layout/activity_splash.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file