Implement levelup activity

This commit is contained in:
Phillip Thelen 2022-07-05 17:14:02 +02:00
parent 43297a033d
commit d526fdd8a1
31 changed files with 226 additions and 20 deletions

View file

@ -26,7 +26,6 @@ configurations {
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
//Networking
implementation "com.squareup.okhttp3:okhttp:$okhttp_version"
implementation "com.squareup.okhttp3:logging-interceptor:$okhttp_version"
@ -215,6 +214,13 @@ android {
dimension "buildType"
buildConfigField "String", "TESTING_LEVEL", "\"staff\""
resValue "string", "app_name", "Habitica Staff"
versionCode app_version_code + 8
}
partners {
dimension "buildType"
buildConfigField "String", "TESTING_LEVEL", "\"partners\""
resValue "string", "app_name", "Habitica"
versionCode app_version_code + 6
}

View file

@ -10,7 +10,7 @@ import androidx.core.os.bundleOf
import androidx.lifecycle.ViewModel
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.databinding.AvatarWithBarsBinding
import com.habitrpg.android.habitica.helpers.Animations
import com.habitrpg.common.habitica.helpers.Animations
import com.habitrpg.android.habitica.helpers.MainNavigationController
import com.habitrpg.android.habitica.models.user.Stats
import com.habitrpg.android.habitica.models.user.User

View file

@ -18,7 +18,7 @@ import com.habitrpg.common.habitica.extensions.dpToPx
import com.habitrpg.android.habitica.extensions.observeOnce
import com.habitrpg.android.habitica.helpers.AdHandler
import com.habitrpg.android.habitica.helpers.AdType
import com.habitrpg.android.habitica.helpers.Animations
import com.habitrpg.common.habitica.helpers.Animations
import com.habitrpg.android.habitica.helpers.AppConfigManager
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.common.habitica.extensions.loadImage

View file

@ -14,7 +14,7 @@ import com.habitrpg.android.habitica.extensions.fromHtml
import com.habitrpg.android.habitica.extensions.observeOnce
import com.habitrpg.android.habitica.helpers.AdHandler
import com.habitrpg.android.habitica.helpers.AdType
import com.habitrpg.android.habitica.helpers.Animations
import com.habitrpg.common.habitica.helpers.Animations
import com.habitrpg.android.habitica.helpers.AppConfigManager
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.ui.viewmodels.MainUserViewModel

View file

@ -5,7 +5,7 @@ import android.view.ViewGroup
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.databinding.CanHatchItemBinding
import com.habitrpg.android.habitica.extensions.inflate
import com.habitrpg.android.habitica.helpers.Animations
import com.habitrpg.common.habitica.helpers.Animations
import com.habitrpg.android.habitica.models.inventory.Animal
import com.habitrpg.android.habitica.models.inventory.Egg
import com.habitrpg.android.habitica.models.inventory.Food

View file

@ -10,7 +10,7 @@ buildscript {
kotlin_version = '1.7.0'
core_ktx_version = '1.8.0'
appcompat_version = '1.4.2'
lifecycle_version = '2.4.1'
lifecycle_version = '2.5.0'
coroutines_version = '1.6.1'
okhttp_version = '4.9.3'
retrofit_version = '2.9.0'

View file

@ -36,6 +36,7 @@ android {
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: '../common/libs')
implementation "androidx.core:core-ktx:$core_ktx_version"
implementation "androidx.appcompat:appcompat:$appcompat_version"

View file

@ -1,4 +1,4 @@
package com.habitrpg.android.habitica.helpers
package com.habitrpg.common.habitica.helpers
import android.view.View
import android.view.ViewAnimationUtils

View file

@ -28,6 +28,7 @@
<string name="new_task">New Task</string>
<string name="avatar">Avatar</string>
<string name="user_level">Lvl. %d</string>
<string name="user_level_long">Level %d</string>
<string name="action_edit">Edit</string>
<string name="action_cancel">Cancel</string>

View file

@ -50,6 +50,13 @@ android {
dimension "buildType"
buildConfigField "String", "TESTING_LEVEL", "\"staff\""
resValue "string", "app_name", "Habitica Staff"
versionCode app_version_code + 9
}
partners {
dimension "buildType"
buildConfigField "String", "TESTING_LEVEL", "\"partners\""
resValue "string", "app_name", "Habitica"
versionCode app_version_code + 7
}
@ -79,6 +86,8 @@ android {
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: '../common/libs')
implementation "androidx.core:core-ktx:$core_ktx_version"
implementation "com.google.android.gms:play-services-wearable:$play_wearables_version"
implementation "androidx.recyclerview:recyclerview:$recyclerview_version"

View file

@ -49,6 +49,7 @@
<activity android:name="com.habitrpg.wearos.habitica.ui.activities.SettingsActivity" />
<activity android:name="com.habitrpg.wearos.habitica.ui.activities.ContinuePhoneActivity" />
<activity android:name="com.habitrpg.wearos.habitica.ui.activities.LevelupActivity" />
<activity android:name="androidx.wear.activity.ConfirmationActivity" />
</application>

View file

@ -4,6 +4,7 @@ import android.os.Bundle
import androidx.activity.viewModels
import androidx.lifecycle.lifecycleScope
import com.habitrpg.android.habitica.databinding.ActivityFaintBinding
import com.habitrpg.common.habitica.helpers.Animations
import com.habitrpg.wearos.habitica.ui.viewmodels.FaintViewModel
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.CoroutineExceptionHandler
@ -28,6 +29,7 @@ class FaintActivity: BaseActivity<ActivityFaintBinding, FaintViewModel>() {
}
}
binding.iconView.startAnimation(Animations.bobbingAnimation(4f))
binding.hpBar.setPercentageValues(0f, 50f)
}

View file

@ -0,0 +1,72 @@
package com.habitrpg.wearos.habitica.ui.activities
import android.os.Bundle
import android.view.Gravity
import android.view.animation.AccelerateInterpolator
import android.widget.FrameLayout
import androidx.activity.viewModels
import androidx.core.content.ContextCompat
import androidx.lifecycle.lifecycleScope
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.databinding.ActivityLevelupBinding
import com.habitrpg.common.habitica.helpers.Animations
import com.habitrpg.wearos.habitica.ui.viewmodels.LevelupViewModel
import com.plattysoft.leonids.ParticleSystem
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.CoroutineExceptionHandler
import kotlinx.coroutines.launch
@AndroidEntryPoint
class LevelupActivity: BaseActivity<ActivityLevelupBinding, LevelupViewModel>() {
override val viewModel: LevelupViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
binding = ActivityLevelupBinding.inflate(layoutInflater)
super.onCreate(savedInstanceState)
binding.continueButton.setOnClickListener {
binding.continueButton.isEnabled = false
startAnimatingProgress()
lifecycleScope.launch(CoroutineExceptionHandler { _, _ ->
stopAnimatingProgress()
binding.continueButton.isEnabled = true
}) {
finish()
}
}
viewModel.level.observe(this) {
binding.titleView.text = getString(R.string.user_level_long, it)
}
binding.iconView.startAnimation(Animations.bobbingAnimation(4f))
binding.expBar.setPercentageValues(100f, 100f)
val container = binding.confettiAnchor
container.postDelayed(
{
createParticles(container, R.drawable.confetti_blue)
createParticles(container, R.drawable.confetti_red)
createParticles(container, R.drawable.confetti_yellow)
createParticles(container, R.drawable.confetti_purple)
}, 500
)
}
private fun createParticles(container: FrameLayout, resource: Int) {
ParticleSystem(
container,
20,
ContextCompat.getDrawable(this, resource),
6000
)
.setRotationSpeed(144f)
.setScaleRange(1.0f, 1.6f)
.setSpeedByComponentsRange(-0.15f, 0.15f, 0.15f, 0.45f)
.setFadeOut(200, AccelerateInterpolator())
.emitWithGravity(binding.confettiAnchor, Gravity.TOP, 10, 2000)
}
override fun onResume() {
super.onResume()
binding.expBar.animateProgress(0f, 2000)
}
}

View file

@ -49,6 +49,13 @@ class TaskResultActivity : BaseActivity<ActivityTaskResultBinding, TaskResultVie
}
}
override fun finish() {
if (viewModel.result?.hasLeveledUp == true) {
startActivity(Intent(parent, LevelupActivity::class.java))
}
super.finish()
}
private fun makeChips() {
binding.gridLayout.removeAllViews()
var chips = mutableListOf<TaskRewardChip>()

View file

@ -0,0 +1,22 @@
package com.habitrpg.wearos.habitica.ui.viewmodels
import androidx.lifecycle.asLiveData
import com.habitrpg.wearos.habitica.data.repositories.TaskRepository
import com.habitrpg.wearos.habitica.data.repositories.UserRepository
import com.habitrpg.wearos.habitica.managers.LoadingManager
import com.habitrpg.wearos.habitica.util.ExceptionHandlerBuilder
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.map
import javax.inject.Inject
@HiltViewModel
class LevelupViewModel @Inject constructor(
userRepository: UserRepository,
taskRepository: TaskRepository,
exceptionBuilder: ExceptionHandlerBuilder,
loadingManager: LoadingManager
) : BaseViewModel(userRepository, taskRepository, exceptionBuilder, loadingManager) {
val level = userRepository.getUser()
.map { it.stats?.lvl }
.asLiveData()
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 873 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2 KiB

View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<size android:height="4dp" android:width="8dp" />
<solid android:color="@color/watch_blue_100" />
<corners android:radius="1dp" />
</shape>

View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<size android:height="4dp" android:width="8dp" />
<solid android:color="@color/watch_purple_100" />
<corners android:radius="1dp" />
</shape>

View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<size android:height="4dp" android:width="8dp" />
<solid android:color="@color/watch_red_100" />
<corners android:radius="1dp" />
</shape>

View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<size android:height="4dp" android:width="8dp" />
<solid android:color="@color/watch_yellow_100" />
<corners android:radius="1dp" />
</shape>

View file

@ -16,8 +16,10 @@
android:layout_height="wrap_content"
android:orientation="vertical"
android:gravity="center"
android:layout_gravity="center">
android:layout_gravity="center"
android:paddingVertical="@dimen/spacing_medium">
<ImageView
android:id="@+id/icon_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/broken_heart"
@ -35,7 +37,8 @@
android:layout_height="wrap_content"
android:text="@string/faint_description"
android:textColor="@color/watch_gray_500"
android:textSize="14sp"
style="@style/Text.Body1"
android:layout_marginHorizontal="@dimen/spacing_large"
android:layout_marginBottom="@dimen/spacing_large"
android:gravity="center"/>
<Button

View file

@ -19,17 +19,15 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/how_did_you_do"
android:fontFamily="sans-serif-medium"
android:gravity="center"
android:textSize="14sp"
style="@style/Text.Body1"
android:textColor="@color/watch_gray_200"/>
<TextView
android:id="@+id/text_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fontFamily="sans-serif-medium"
android:gravity="center"
android:textSize="16sp"
style="@style/Text.SubHeader1"
android:maxLines="2"
android:textColor="@color/watch_white"/>
<Space

View file

@ -0,0 +1,55 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:id="@+id/confetti_anchor"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:gravity="center"
android:layout_gravity="center"
android:paddingVertical="@dimen/spacing_medium">
<ImageView
android:id="@+id/icon_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/experience_large"
android:importantForAccessibility="no"
android:layout_marginBottom="@dimen/spacing_medium"/>
<TextView
android:id="@+id/title_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:textColor="@color/watch_white"
style="@style/Text.SubHeader1"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/levelup_description"
android:textColor="@color/watch_gray_200"
style="@style/Text.Body1"
android:layout_marginBottom="@dimen/spacing_large"
android:layout_marginHorizontal="@dimen/spacing_large"
android:gravity="center"/>
<Button
android:id="@+id/continue_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/continue_text"
style="@style/ChipButton.Small.Yellow"/>
</LinearLayout>
<com.habitrpg.wearos.habitica.ui.views.CircularProgressView
android:id="@+id/exp_bar"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:arcFillColor="@color/exp_bar_color"
app:backgroundArcColor="@color/bar_background_color"
app:offset="4dp" />
</FrameLayout>

View file

@ -12,10 +12,9 @@
android:id="@+id/title_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="14sp"
android:textColor="@color/watch_purple_200"
android:text="@string/day_start"
android:fontFamily="sans-serif-medium"
style="@style/Text.Body1"
android:gravity="center"
android:layout_marginHorizontal="12dp"
android:layout_marginBottom="10dp"/>

View file

@ -9,8 +9,7 @@
android:id="@+id/text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="sans-serif-medium"
android:textSize="16sp"
style="@style/Text.SubHeader1"
android:textColor="@color/watch_black"/>
<ImageView
android:id="@+id/icon_view"

View file

@ -14,8 +14,7 @@
android:id="@+id/text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="sans-serif-medium"
android:textSize="14sp"
style="@style/Text.Body1"
android:gravity="center"
android:textColor="@color/watch_white"
/>

View file

@ -36,4 +36,5 @@
<string name="a_potion">a Potion</string>
<string name="some_food">Some Food</string>
<string name="continue_on_your_phone">Continue on your phone</string>
<string name="levelup_description">You leveled up through all your hard work!</string>
</resources>

View file

@ -2,6 +2,7 @@
<resources>
<style name="HabiticaAppTheme" parent="@android:style/Theme.DeviceDefault">
<item name="android:windowBackground">@color/watch_black</item>
<item name="fontFamily">sans-serif</item>
</style>
<style name="Chip">
<item name="android:layout_marginVertical">@dimen/row_spacing</item>
@ -24,7 +25,7 @@
<item name="android:background">@drawable/row_background</item>
<item name="android:textSize">14sp</item>
<item name="android:textColor">@color/watch_white</item>
<item name="fontFamily">sans-serif-medium</item>
<item name="android:fontFamily">sans-serif-medium</item>
<item name="android:gravity">center</item>
<item name="android:minHeight">52dp</item>
<item name="android:textAllCaps">false</item>
@ -62,6 +63,11 @@
<item name="android:textColor">@color/watch_black</item>
</style>
<style name="ChipButton.Small.Yellow" parent="ChipButton.Small">
<item name="android:backgroundTint">@color/watch_yellow_200</item>
<item name="android:textColor">@color/watch_black</item>
</style>
<style name="Text" />
<style name="Text.SubHeader1">
@ -75,5 +81,6 @@
</style>
<style name="Text.Body2">
<item name="android:textSize">14sp</item>
<item name="android:fontFamily">sans-serif</item>
</style>
</resources>