mirror of
https://github.com/sudoxnym/habitica-android.git
synced 2026-04-14 11:46:32 +00:00
Implement levelup activity
This commit is contained in:
parent
43297a033d
commit
d526fdd8a1
31 changed files with 226 additions and 20 deletions
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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'
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
package com.habitrpg.android.habitica.helpers
|
||||
package com.habitrpg.common.habitica.helpers
|
||||
|
||||
import android.view.View
|
||||
import android.view.ViewAnimationUtils
|
||||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
|
@ -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>()
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
}
|
||||
BIN
wearos/src/main/res/drawable-mdpi/experience_large.png
Normal file
BIN
wearos/src/main/res/drawable-mdpi/experience_large.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 873 B |
BIN
wearos/src/main/res/drawable-xhdpi/experience_large.png
Normal file
BIN
wearos/src/main/res/drawable-xhdpi/experience_large.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.4 KiB |
BIN
wearos/src/main/res/drawable-xxhdpi/experience_large.png
Normal file
BIN
wearos/src/main/res/drawable-xxhdpi/experience_large.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2 KiB |
6
wearos/src/main/res/drawable/confetti_blue.xml
Normal file
6
wearos/src/main/res/drawable/confetti_blue.xml
Normal 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>
|
||||
6
wearos/src/main/res/drawable/confetti_purple.xml
Normal file
6
wearos/src/main/res/drawable/confetti_purple.xml
Normal 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>
|
||||
6
wearos/src/main/res/drawable/confetti_red.xml
Normal file
6
wearos/src/main/res/drawable/confetti_red.xml
Normal 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>
|
||||
6
wearos/src/main/res/drawable/confetti_yellow.xml
Normal file
6
wearos/src/main/res/drawable/confetti_yellow.xml
Normal 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>
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
55
wearos/src/main/res/layout/activity_levelup.xml
Normal file
55
wearos/src/main/res/layout/activity_levelup.xml
Normal 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>
|
||||
|
|
@ -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"/>
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
/>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
Loading…
Reference in a new issue