mirror of
https://github.com/sudoxnym/habitica-android.git
synced 2026-05-24 22:55:59 +00:00
dark mode improvements
This commit is contained in:
parent
e2b2853206
commit
80012485b4
29 changed files with 361 additions and 68 deletions
|
|
@ -77,6 +77,26 @@
|
|||
layout="@layout/avatar_with_bars"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content" />
|
||||
<LinearLayout
|
||||
android:id="@+id/admin_status_view"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="horizontal"
|
||||
android:layout_marginTop="@dimen/spacing_medium"
|
||||
android:layout_marginBottom="@dimen/spacing_medium"
|
||||
android:visibility="gone">
|
||||
<TextView
|
||||
android:layout_width="0dp"
|
||||
android:layout_weight="1"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/status"
|
||||
style="@style/SubHeader1"/>
|
||||
<TextView
|
||||
android:id="@+id/admin_status_textview"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
tools:text="today"/>
|
||||
</LinearLayout>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/blurb_text_view"
|
||||
|
|
|
|||
|
|
@ -32,6 +32,14 @@
|
|||
style="@style/CardContent.Compact"
|
||||
android:background="@drawable/layout_rounded_bg_content"
|
||||
android:padding="@dimen/spacing_medium">
|
||||
<TextView
|
||||
android:id="@+id/flag_count_textview"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
tools:text="Flagged once, not hidden"
|
||||
android:textColor="@color/text_red"
|
||||
android:textStyle="bold"
|
||||
android:layout_marginBottom="@dimen/spacing_small"/>
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
|
|
|||
|
|
@ -6,4 +6,12 @@
|
|||
android:title="@string/copy_userid" />
|
||||
<item android:id="@+id/block_user"
|
||||
android:title="@string/block_user" />
|
||||
<group android:id="@+id/admin_items">
|
||||
<item android:id="@+id/ban_user"
|
||||
android:title="@string/ban_user" />
|
||||
<item android:id="@+id/shadow_mute_user"
|
||||
android:title="@string/shadow_mute_user" />
|
||||
<item android:id="@+id/mute_user"
|
||||
android:title="@string/mute_user" />
|
||||
</group>
|
||||
</menu>
|
||||
|
|
@ -1272,6 +1272,20 @@
|
|||
<string name="promote_to_manager">Promote to Manager</string>
|
||||
<string name="manager">Manager</string>
|
||||
<string name="member_list">Member List</string>
|
||||
<string name="ban_user">Ban User</string>
|
||||
<string name="shadow_mute_user">Shadow Mute</string>
|
||||
<string name="mute_user">Mute User</string>
|
||||
<string name="ban_user_confirm">Do you want to ban this user?</string>
|
||||
<string name="unban_user_confirm">Do you want to unban this user?</string>
|
||||
<string name="mute_user_confirm">Do you want to revoke chat access for this user?</string>
|
||||
<string name="unmute_user_confirm">Do you want to return chat access for this user?</string>
|
||||
<string name="shadowmute_user_confirm">Do you want to shadow mute this user?</string>
|
||||
<string name="unshadowmute_user_confirm">Do you want to remove the shadow mute?</string>
|
||||
<string name="unban_user">Unban User</string>
|
||||
<string name="unshadowmute_user">Remove Shadow Mute</string>
|
||||
<string name="unmute_user">Unmute User</string>
|
||||
<string name="status">Status</string>
|
||||
<string name="regular_access">Regular Access</string>
|
||||
<plurals name="you_x_others">
|
||||
<item quantity="zero">You</item>
|
||||
<item quantity="one">You, %d other</item>
|
||||
|
|
|
|||
|
|
@ -106,8 +106,9 @@
|
|||
<item name="colorBoxStroke">@color/red_10</item>
|
||||
<item name="textColorPrimaryDark">@color/gray_200</item>
|
||||
<item name="toolbarContentColor">@color/red_100</item>
|
||||
<item name="colorTintedBackground">@color/red_1</item>
|
||||
<item name="colorTintedBackgroundOffset">@color/red_5</item>
|
||||
<item name="colorTintedBackground">@color/red_00</item>
|
||||
<item name="colorTintedBackgroundOffset">@color/red_0</item>
|
||||
<item name="colorPrimaryText">@color/red_600</item>
|
||||
</style>
|
||||
|
||||
<style name="MainAppTheme.Maroon">
|
||||
|
|
@ -136,8 +137,9 @@
|
|||
<item name="colorPrimaryOffset">@color/gray_10</item>
|
||||
<item name="textColorPrimaryDark">@color/gray_200</item>
|
||||
<item name="toolbarContentColor">@color/maroon_100</item>
|
||||
<item name="colorTintedBackground">@color/maroon_1</item>
|
||||
<item name="colorTintedBackgroundOffset">@color/maroon_5</item>
|
||||
<item name="colorTintedBackground">@color/maroon_00</item>
|
||||
<item name="colorTintedBackgroundOffset">@color/maroon_0</item>
|
||||
<item name="colorPrimaryText">@color/maroon_600</item>
|
||||
</style>
|
||||
|
||||
<style name="MainAppTheme.Orange">
|
||||
|
|
@ -168,8 +170,9 @@
|
|||
<item name="colorBoxStroke">@color/orange_10</item>
|
||||
<item name="textColorPrimaryDark">@color/gray_200</item>
|
||||
<item name="toolbarContentColor">@color/orange_100</item>
|
||||
<item name="colorTintedBackground">@color/orange_1</item>
|
||||
<item name="colorTintedBackgroundOffset">@color/orange_5</item>
|
||||
<item name="colorTintedBackground">@color/orange_00</item>
|
||||
<item name="colorTintedBackgroundOffset">@color/orange_0</item>
|
||||
<item name="colorPrimaryText">@color/orange_600</item>
|
||||
</style>
|
||||
|
||||
<style name="MainAppTheme.Yellow">
|
||||
|
|
@ -200,7 +203,9 @@
|
|||
<item name="colorBoxStroke">@color/yellow_5</item>
|
||||
<item name="textColorPrimaryDark">@color/gray_200</item>
|
||||
<item name="toolbarContentColor">@color/yellow_100</item>
|
||||
<item name="colorTintedBackground">@color/yellow_5</item>
|
||||
<item name="colorTintedBackground">@color/yellow_00</item>
|
||||
<item name="colorTintedBackgroundOffset">@color/yellow_0</item>
|
||||
<item name="colorPrimaryText">@color/yellow_600</item>
|
||||
</style>
|
||||
|
||||
<style name="MainAppTheme.Green">
|
||||
|
|
@ -231,8 +236,9 @@
|
|||
<item name="colorBoxStroke">@color/green_10</item>
|
||||
<item name="textColorPrimaryDark">@color/gray_200</item>
|
||||
<item name="toolbarContentColor">@color/green_100</item>
|
||||
<item name="colorTintedBackground">@color/green_1</item>
|
||||
<item name="colorTintedBackgroundOffset">@color/green_5</item>
|
||||
<item name="colorTintedBackground">@color/green_00</item>
|
||||
<item name="colorTintedBackgroundOffset">@color/green_0</item>
|
||||
<item name="colorPrimaryText">@color/green_600</item>
|
||||
</style>
|
||||
|
||||
<style name="MainAppTheme.Teal">
|
||||
|
|
@ -263,8 +269,9 @@
|
|||
<item name="colorBoxStroke">@color/teal_10</item>
|
||||
<item name="textColorPrimaryDark">@color/gray_200</item>
|
||||
<item name="toolbarContentColor">@color/teal_100</item>
|
||||
<item name="colorTintedBackground">@color/teal_1</item>
|
||||
<item name="colorTintedBackgroundOffset">@color/teal_5</item>
|
||||
<item name="colorTintedBackground">@color/teal_00</item>
|
||||
<item name="colorTintedBackgroundOffset">@color/teal_0</item>
|
||||
<item name="colorPrimaryText">@color/teal_600</item>
|
||||
</style>
|
||||
|
||||
<style name="MainAppTheme.Blue">
|
||||
|
|
@ -295,8 +302,9 @@
|
|||
<item name="textColorPrimaryDark">@color/gray_200</item>
|
||||
<item name="colorBoxStroke">@color/blue_10</item>
|
||||
<item name="toolbarContentColor">@color/blue_100</item>
|
||||
<item name="colorTintedBackground">@color/blue_1</item>
|
||||
<item name="colorTintedBackgroundOffset">@color/blue_5</item>
|
||||
<item name="colorTintedBackground">@color/blue_00</item>
|
||||
<item name="colorTintedBackgroundOffset">@color/blue_0</item>
|
||||
<item name="colorPrimaryText">@color/blue_600</item>
|
||||
</style>
|
||||
|
||||
<style name="MyWidgetTheme">
|
||||
|
|
@ -858,7 +866,7 @@
|
|||
|
||||
<style name="TaskFormTextInputLayoutAppearance" parent="Widget.MaterialComponents.TextInputLayout.FilledBox">
|
||||
<!-- reference our hint & error styles -->
|
||||
<item name="boxBackgroundColor">@color/white</item>
|
||||
<item name="boxBackgroundColor">?colorTintedBackground</item>
|
||||
<item name="boxStrokeColor">@color/color_box_stroke</item>
|
||||
<item name="boxStrokeWidth">2dp</item>
|
||||
<item name="boxStrokeWidthFocused">2dp</item>
|
||||
|
|
|
|||
|
|
@ -451,4 +451,10 @@ interface ApiService {
|
|||
|
||||
@POST("tasks/{taskID}/unassign/{userID}")
|
||||
suspend fun unassignFromTask(@Path("taskID") taskID: String, @Path("userID") userID: String): HabitResponse<Task>
|
||||
|
||||
@POST("hall/heroes/{memberID}")
|
||||
suspend fun updateUser(@Path("memberID") memberID: String, @Body updateData: Map<String, Any?>): HabitResponse<Member>
|
||||
|
||||
@GET("hall/heroes/{memberID}")
|
||||
suspend fun getHallMember(@Path("memberID") memberID: String): HabitResponse<Member>
|
||||
}
|
||||
|
|
|
|||
|
|
@ -272,4 +272,6 @@ interface ApiClient {
|
|||
suspend fun getTeamPlanTasks(teamID: String): TaskList?
|
||||
suspend fun assignToTask(taskId: String, ids: List<String>): Task?
|
||||
suspend fun unassignFromTask(taskId: String, userID: String): Task?
|
||||
suspend fun updateMember(memberID: String, updateData: Map<String, Any?>): Member?
|
||||
suspend fun getHallMember(userId: String): Member?
|
||||
}
|
||||
|
|
|
|||
|
|
@ -83,7 +83,7 @@ interface SocialRepository : BaseRepository {
|
|||
|
||||
suspend fun inviteToGroup(id: String, inviteData: Map<String, Any>): List<Void>?
|
||||
|
||||
suspend fun retrieveMember(userId: String?): Member?
|
||||
suspend fun retrieveMember(userId: String?, fromHall: Boolean = false): Member?
|
||||
suspend fun retrieveMemberWithUsername(username: String?): Member?
|
||||
|
||||
suspend fun findUsernames(
|
||||
|
|
@ -120,4 +120,5 @@ interface SocialRepository : BaseRepository {
|
|||
fun getGroupMemberships(): Flow<List<GroupMembership>>
|
||||
suspend fun blockMember(userID: String): List<String>?
|
||||
fun getMember(userID: String?): Flow<Member?>
|
||||
suspend fun updateMember(memberID: String, key: String, value: Any?): Member?
|
||||
}
|
||||
|
|
|
|||
|
|
@ -63,6 +63,7 @@ import java.io.IOException
|
|||
import java.net.SocketException
|
||||
import java.net.SocketTimeoutException
|
||||
import java.net.UnknownHostException
|
||||
import java.util.Date
|
||||
import java.util.GregorianCalendar
|
||||
import java.util.concurrent.TimeUnit
|
||||
import javax.net.ssl.SSLException
|
||||
|
|
@ -253,6 +254,10 @@ class ApiClientImpl(
|
|||
}
|
||||
}
|
||||
|
||||
override suspend fun updateMember(memberID: String, updateData: Map<String, Any?>): Member? {
|
||||
return process { apiService.updateUser(memberID, updateData) }
|
||||
}
|
||||
|
||||
override fun getErrorResponse(throwable: HttpException): ErrorResponse {
|
||||
val errorResponse = throwable.response()?.errorBody() ?: return ErrorResponse()
|
||||
val errorConverter = converter
|
||||
|
|
@ -360,8 +365,15 @@ class ApiClientImpl(
|
|||
return process { apiService.purchaseItem(type, itemKey, mapOf(Pair("quantity", purchaseQuantity))) }
|
||||
}
|
||||
|
||||
val lastSubscribeCall: Date? = null
|
||||
override suspend fun validateSubscription(request: PurchaseValidationRequest): Any? {
|
||||
return process { apiService.validateSubscription(request) }
|
||||
return if (lastSubscribeCall == null || Date().time - lastSubscribeCall.time > 60000) {
|
||||
process { apiService.validateSubscription(request) }
|
||||
} else null
|
||||
}
|
||||
|
||||
override suspend fun getHallMember(userId: String): Member? {
|
||||
return process { apiService.getHallMember(userId) }
|
||||
}
|
||||
|
||||
override suspend fun validateNoRenewSubscription(request: PurchaseValidationRequest): Any? {
|
||||
|
|
|
|||
|
|
@ -44,6 +44,10 @@ class SocialRepositoryImpl(
|
|||
return localRepository.getMember(userID)
|
||||
}
|
||||
|
||||
override suspend fun updateMember(memberID: String, key: String, value: Any?): Member? {
|
||||
return apiClient.updateMember(memberID, mapOf(key to value))
|
||||
}
|
||||
|
||||
override fun getGroupMembership(id: String) = localRepository.getGroupMembership(userID, id)
|
||||
|
||||
override fun getGroupMemberships(): Flow<List<GroupMembership>> {
|
||||
|
|
@ -247,12 +251,16 @@ class SocialRepositoryImpl(
|
|||
|
||||
override suspend fun inviteToGroup(id: String, inviteData: Map<String, Any>) = apiClient.inviteToGroup(id, inviteData)
|
||||
|
||||
override suspend fun retrieveMember(userId: String?): Member? {
|
||||
override suspend fun retrieveMember(userId: String?, fromHall: Boolean): Member? {
|
||||
return if (userId == null) {
|
||||
null
|
||||
} else {
|
||||
try {
|
||||
apiClient.getMember(UUID.fromString(userId).toString())
|
||||
if (fromHall) {
|
||||
apiClient.getHallMember(userId)
|
||||
} else {
|
||||
apiClient.getMember(UUID.fromString(userId).toString())
|
||||
}
|
||||
} catch (_: IllegalArgumentException) {
|
||||
apiClient.getMemberWithUsername(userId)
|
||||
}
|
||||
|
|
@ -260,7 +268,7 @@ class SocialRepositoryImpl(
|
|||
}
|
||||
|
||||
override suspend fun retrieveMemberWithUsername(username: String?): Member? {
|
||||
return retrieveMember(username)
|
||||
return retrieveMember(username, true)
|
||||
}
|
||||
|
||||
override suspend fun findUsernames(username: String, context: String?, id: String?): List<FindUsernameResult>? {
|
||||
|
|
|
|||
|
|
@ -48,9 +48,7 @@ class UserRepositoryImpl(
|
|||
}
|
||||
|
||||
private suspend fun updateUser(userID: String, key: String, value: Any): User? {
|
||||
val updateData = HashMap<String, Any>()
|
||||
updateData[key] = value
|
||||
return updateUser(userID, updateData)
|
||||
return updateUser(userID, mapOf(key to value))
|
||||
}
|
||||
|
||||
override suspend fun updateUser(updateData: Map<String, Any>): User? {
|
||||
|
|
|
|||
|
|
@ -6,5 +6,7 @@ import io.realm.annotations.RealmClass
|
|||
|
||||
@RealmClass(embedded = true)
|
||||
open class MemberFlags : RealmObject(), AvatarFlags {
|
||||
var chatShadowMuted: Boolean = false
|
||||
var chatRevoked: Boolean = false
|
||||
override var classSelected: Boolean = false
|
||||
}
|
||||
|
|
|
|||
|
|
@ -235,7 +235,7 @@ open class Task : RealmObject, BaseMainObject, Parcelable, BaseTask {
|
|||
}
|
||||
}
|
||||
|
||||
val darkestTaskColor: Int
|
||||
val extraDarkTaskColor: Int
|
||||
get() {
|
||||
return when {
|
||||
this.value < -20 -> return R.color.maroon_1
|
||||
|
|
@ -248,6 +248,32 @@ open class Task : RealmObject, BaseMainObject, Parcelable, BaseTask {
|
|||
}
|
||||
}
|
||||
|
||||
val extraExtraDarkTaskColor: Int
|
||||
get() {
|
||||
return when {
|
||||
this.value < -20 -> return R.color.maroon_0
|
||||
this.value < -10 -> return R.color.red_0
|
||||
this.value < -1 -> return R.color.orange_0
|
||||
this.value < 1 -> return R.color.yellow_0
|
||||
this.value < 5 -> return R.color.green_0
|
||||
this.value < 10 -> return R.color.teal_0
|
||||
else -> R.color.blue_1
|
||||
}
|
||||
}
|
||||
|
||||
val darkestTaskColor: Int
|
||||
get() {
|
||||
return when {
|
||||
this.value < -20 -> return R.color.maroon_00
|
||||
this.value < -10 -> return R.color.red_00
|
||||
this.value < -1 -> return R.color.orange_00
|
||||
this.value < 1 -> return R.color.yellow_00
|
||||
this.value < 5 -> return R.color.green_00
|
||||
this.value < 10 -> return R.color.teal_00
|
||||
else -> R.color.blue_1
|
||||
}
|
||||
}
|
||||
|
||||
val isChecklistDisplayActive: Boolean
|
||||
get() = this.checklist?.size != this.completedChecklistCount
|
||||
|
||||
|
|
|
|||
|
|
@ -19,6 +19,7 @@ open class Authentication : RealmObject(), BaseObject, AvatarAuthentication {
|
|||
return null
|
||||
}
|
||||
|
||||
var blocked: Boolean = false
|
||||
val hasPassword: Boolean
|
||||
get() = localAuthentication?.hasPassword == true
|
||||
@SerializedName("local")
|
||||
|
|
|
|||
|
|
@ -0,0 +1,11 @@
|
|||
package com.habitrpg.android.habitica.models.user
|
||||
|
||||
import com.habitrpg.android.habitica.models.BaseObject
|
||||
import io.realm.RealmObject
|
||||
|
||||
open class Permissions: RealmObject(), BaseObject {
|
||||
var userSupport: Boolean = false
|
||||
var fullAccess: Boolean = false
|
||||
|
||||
var moderator: Boolean = false
|
||||
}
|
||||
|
|
@ -19,7 +19,19 @@ import io.realm.annotations.Ignore
|
|||
import io.realm.annotations.PrimaryKey
|
||||
import java.util.Date
|
||||
|
||||
enum class Permission {
|
||||
MODERATOR,
|
||||
USER_SUPPORT
|
||||
}
|
||||
|
||||
open class User : RealmObject(), BaseMainObject, Avatar, VersionedObject {
|
||||
fun hasPermission(permission: Permission): Boolean {
|
||||
if (permissions?.fullAccess == true) return true
|
||||
return when (permission) {
|
||||
Permission.MODERATOR -> permissions?.moderator
|
||||
Permission.USER_SUPPORT -> permissions?.userSupport
|
||||
} == true
|
||||
}
|
||||
|
||||
override val realmClass: Class<User>
|
||||
get() = User::class.java
|
||||
|
|
@ -41,6 +53,7 @@ open class User : RealmObject(), BaseMainObject, Avatar, VersionedObject {
|
|||
override var balance: Double = 0.toDouble()
|
||||
override var stats: Stats? = null
|
||||
var inbox: Inbox? = null
|
||||
internal var permissions: Permissions? = null
|
||||
override var preferences: Preferences? = null
|
||||
var profile: Profile? = null
|
||||
var party: UserParty? = null
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
package com.habitrpg.android.habitica.ui.activities
|
||||
|
||||
import android.content.Context
|
||||
import android.content.ClipData
|
||||
import android.content.ClipboardManager
|
||||
import android.graphics.Typeface
|
||||
import android.os.Bundle
|
||||
import android.text.method.LinkMovementMethod
|
||||
|
|
@ -13,6 +14,8 @@ import android.widget.TableRow
|
|||
import android.widget.TextView
|
||||
import androidx.core.content.ContextCompat
|
||||
import androidx.core.os.bundleOf
|
||||
import androidx.core.view.MenuCompat
|
||||
import androidx.core.view.isVisible
|
||||
import androidx.lifecycle.lifecycleScope
|
||||
import com.habitrpg.android.habitica.R
|
||||
import com.habitrpg.android.habitica.components.UserComponent
|
||||
|
|
@ -29,6 +32,7 @@ import com.habitrpg.android.habitica.models.Achievement
|
|||
import com.habitrpg.android.habitica.models.inventory.Equipment
|
||||
import com.habitrpg.android.habitica.models.members.Member
|
||||
import com.habitrpg.android.habitica.models.user.Outfit
|
||||
import com.habitrpg.android.habitica.models.user.Permission
|
||||
import com.habitrpg.android.habitica.models.user.Stats
|
||||
import com.habitrpg.android.habitica.ui.AvatarWithBarsViewModel
|
||||
import com.habitrpg.android.habitica.ui.adapter.social.AchievementProfileAdapter
|
||||
|
|
@ -52,6 +56,8 @@ import kotlin.math.min
|
|||
|
||||
class FullProfileActivity : BaseActivity() {
|
||||
private var blocks: List<String> = listOf()
|
||||
private var isModerator = false
|
||||
private var member: Member? = null
|
||||
|
||||
@Inject
|
||||
lateinit var inventoryRepository: InventoryRepository
|
||||
|
|
@ -87,10 +93,7 @@ class FullProfileActivity : BaseActivity() {
|
|||
setTitle(R.string.profile_loading_data)
|
||||
|
||||
lifecycleScope.launch(ExceptionHandler.coroutine()) {
|
||||
val member = socialRepository.retrieveMember(userID)
|
||||
if (member != null) {
|
||||
updateView(member)
|
||||
}
|
||||
refresh()
|
||||
}
|
||||
avatarWithBars = AvatarWithBarsViewModel(this, binding.avatarWithBars)
|
||||
|
||||
|
|
@ -126,10 +129,29 @@ class FullProfileActivity : BaseActivity() {
|
|||
blocks = it?.inbox?.blocks ?: listOf()
|
||||
binding.blockedDisclaimerView.visibility =
|
||||
if (isUserBlocked()) View.VISIBLE else View.GONE
|
||||
|
||||
isModerator = it?.hasPermission(Permission.USER_SUPPORT) == true
|
||||
binding.adminStatusView.isVisible = isModerator
|
||||
if (isModerator) {
|
||||
val member = socialRepository.retrieveMember(userID, true)
|
||||
if (member != null) {
|
||||
updateView(member)
|
||||
}
|
||||
this@FullProfileActivity.member = member
|
||||
}
|
||||
invalidateOptionsMenu()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private suspend fun refresh() {
|
||||
val member = socialRepository.retrieveMember(userID)
|
||||
if (member != null) {
|
||||
updateView(member)
|
||||
}
|
||||
this@FullProfileActivity.member = member
|
||||
}
|
||||
|
||||
override fun onDestroy() {
|
||||
inventoryRepository.close()
|
||||
super.onDestroy()
|
||||
|
|
@ -138,12 +160,31 @@ class FullProfileActivity : BaseActivity() {
|
|||
override fun onCreateOptionsMenu(menu: Menu): Boolean {
|
||||
val inflater = menuInflater
|
||||
inflater.inflate(R.menu.menu_full_profile, menu)
|
||||
MenuCompat.setGroupDividerEnabled(menu, true)
|
||||
val item = menu.findItem(R.id.block_user)
|
||||
if (isUserBlocked()) {
|
||||
item?.title = getString(R.string.unblock_user)
|
||||
} else {
|
||||
item?.title = getString(R.string.block)
|
||||
}
|
||||
menu.setGroupVisible(R.id.admin_items, isModerator)
|
||||
if (isModerator) {
|
||||
menu.findItem(R.id.ban_user)?.title = getString(if (member?.authentication?.blocked == true) {
|
||||
R.string.unban_user
|
||||
} else {
|
||||
R.string.ban_user
|
||||
})
|
||||
menu.findItem(R.id.shadow_mute_user)?.title = getString(if (member?.flags?.chatShadowMuted == true) {
|
||||
R.string.unshadowmute_user
|
||||
} else {
|
||||
R.string.shadow_mute_user
|
||||
})
|
||||
menu.findItem(R.id.mute_user)?.title = getString(if (member?.flags?.chatRevoked == true) {
|
||||
R.string.unmute_user
|
||||
} else {
|
||||
R.string.mute_user
|
||||
})
|
||||
}
|
||||
return super.onCreateOptionsMenu(menu)
|
||||
}
|
||||
|
||||
|
|
@ -159,8 +200,8 @@ class FullProfileActivity : BaseActivity() {
|
|||
}
|
||||
R.id.copy_username -> {
|
||||
val clipboard =
|
||||
this.getSystemService(Context.CLIPBOARD_SERVICE) as? android.content.ClipboardManager
|
||||
val clip = android.content.ClipData.newPlainText(username, username)
|
||||
this.getSystemService(CLIPBOARD_SERVICE) as? ClipboardManager
|
||||
val clip = ClipData.newPlainText(username, username)
|
||||
clipboard?.setPrimaryClip(clip)
|
||||
HabiticaSnackbar.showSnackbar(
|
||||
this@FullProfileActivity.binding.scrollView.getChildAt(0) as ViewGroup,
|
||||
|
|
@ -171,8 +212,8 @@ class FullProfileActivity : BaseActivity() {
|
|||
}
|
||||
R.id.copy_userid -> {
|
||||
val clipboard =
|
||||
this.getSystemService(Context.CLIPBOARD_SERVICE) as? android.content.ClipboardManager
|
||||
val clip = android.content.ClipData.newPlainText(userID, userID)
|
||||
this.getSystemService(CLIPBOARD_SERVICE) as? ClipboardManager
|
||||
val clip = ClipData.newPlainText(userID, userID)
|
||||
clipboard?.setPrimaryClip(clip)
|
||||
HabiticaSnackbar.showSnackbar(
|
||||
this@FullProfileActivity.binding.scrollView.getChildAt(0) as ViewGroup,
|
||||
|
|
@ -189,10 +230,76 @@ class FullProfileActivity : BaseActivity() {
|
|||
}
|
||||
true
|
||||
}
|
||||
R.id.ban_user -> {
|
||||
banUser()
|
||||
true
|
||||
}
|
||||
R.id.shadow_mute_user -> {
|
||||
shadowMuteUser()
|
||||
true
|
||||
}
|
||||
R.id.mute_user -> {
|
||||
muteUser()
|
||||
true
|
||||
}
|
||||
else -> super.onOptionsItemSelected(item)
|
||||
}
|
||||
}
|
||||
|
||||
private fun muteUser() {
|
||||
val isMuted = member?.flags?.chatRevoked == true
|
||||
val alert = HabiticaAlertDialog(this)
|
||||
if (isMuted) {
|
||||
alert.setTitle(R.string.mute_user_confirm)
|
||||
} else {
|
||||
alert.setTitle(R.string.unmute_user_confirm)
|
||||
}
|
||||
alert.addButton(R.string.yes, isPrimary = true, isDestructive = true) { _, _ ->
|
||||
lifecycleScope.launchCatching {
|
||||
member?.id?.let { socialRepository.updateMember(it, "flags.chatRevoked", !isMuted) }
|
||||
refresh()
|
||||
invalidateOptionsMenu()
|
||||
}
|
||||
}
|
||||
alert.show()
|
||||
}
|
||||
|
||||
private fun shadowMuteUser() {
|
||||
val isBanned = member?.flags?.chatShadowMuted == true
|
||||
val alert = HabiticaAlertDialog(this)
|
||||
if (isBanned) {
|
||||
alert.setTitle(R.string.shadowmute_user_confirm)
|
||||
} else {
|
||||
alert.setTitle(R.string.unshadowmute_user_confirm)
|
||||
}
|
||||
alert.addButton(R.string.yes, isPrimary = true, isDestructive = true) { _, _ ->
|
||||
lifecycleScope.launchCatching {
|
||||
member?.id?.let { socialRepository.updateMember(it, "flags.chatShadowMuted", !isBanned) }
|
||||
refresh()
|
||||
invalidateOptionsMenu()
|
||||
}
|
||||
}
|
||||
alert.show()
|
||||
}
|
||||
|
||||
private fun banUser() {
|
||||
val isBanned = member?.authentication?.blocked == true
|
||||
val alert = HabiticaAlertDialog(this)
|
||||
if (isBanned) {
|
||||
alert.setTitle(R.string.ban_user_confirm)
|
||||
} else {
|
||||
alert.setTitle(R.string.unban_user_confirm)
|
||||
}
|
||||
alert.addButton(R.string.yes, isPrimary = true, isDestructive = true) { _, _ ->
|
||||
lifecycleScope.launchCatching {
|
||||
member?.id?.let { socialRepository.updateMember(it, "auth.blocked", !isBanned) }
|
||||
refresh()
|
||||
invalidateOptionsMenu()
|
||||
}
|
||||
}
|
||||
alert.show()
|
||||
}
|
||||
|
||||
private fun useBlock() {
|
||||
lifecycleScope.launchCatching {
|
||||
socialRepository.blockMember(userID)
|
||||
|
|
@ -205,7 +312,7 @@ class FullProfileActivity : BaseActivity() {
|
|||
val dialog = HabiticaAlertDialog(this)
|
||||
dialog.setTitle(getString(R.string.block_user_title, userDisplayName))
|
||||
dialog.setMessage(R.string.block_user_description)
|
||||
dialog.addButton(R.string.block, true, true) { _, _ ->
|
||||
dialog.addButton(R.string.block, isPrimary = true, isDestructive = true) { _, _ ->
|
||||
useBlock()
|
||||
}
|
||||
dialog.addCancelButton()
|
||||
|
|
@ -256,6 +363,18 @@ class FullProfileActivity : BaseActivity() {
|
|||
|
||||
avatarWithBars?.updateData(user)
|
||||
|
||||
val status = mutableListOf<String>()
|
||||
if (user.authentication?.blocked == true) status.add("Banned")
|
||||
if (user.flags?.chatShadowMuted == true) status.add("Shadow Muted")
|
||||
if (user.flags?.chatRevoked == true) status.add("Muted")
|
||||
if (status.isNotEmpty()) {
|
||||
binding.adminStatusTextview.text = status.joinToString(", ")
|
||||
binding.adminStatusTextview.setTextColor(ContextCompat.getColor(this, R.color.text_red))
|
||||
} else {
|
||||
binding.adminStatusTextview.text = getString(R.string.regular_access)
|
||||
binding.adminStatusTextview.setTextColor(ContextCompat.getColor(this, R.color.text_green))
|
||||
}
|
||||
|
||||
lifecycleScope.launchCatching {
|
||||
loadItemDataByOutfit(user.equipped).collect { gear -> gotGear(gear, user) }
|
||||
}
|
||||
|
|
|
|||
|
|
@ -72,7 +72,7 @@ class GiftSubscriptionActivity : PurchaseActivity() {
|
|||
selectedSubscriptionSku?.let { sku -> purchaseSubscription(sku) }
|
||||
}
|
||||
lifecycleScope.launch(ExceptionHandler.coroutine()) {
|
||||
val member = socialRepository.retrieveMember(giftedUsername ?: giftedUserID) ?: return@launch
|
||||
val member = socialRepository.retrieveMember(giftedUsername ?: giftedUserID, true) ?: return@launch
|
||||
binding.avatarView.setAvatar(member)
|
||||
binding.displayNameTextView.username = member.profile?.name
|
||||
binding.displayNameTextView.tier = member.contributor?.level ?: 0
|
||||
|
|
|
|||
|
|
@ -25,8 +25,6 @@ import androidx.appcompat.widget.AppCompatCheckBox
|
|||
import androidx.compose.runtime.mutableStateListOf
|
||||
import androidx.compose.runtime.mutableStateMapOf
|
||||
import androidx.compose.runtime.toMutableStateList
|
||||
import androidx.compose.ui.graphics.Color
|
||||
import androidx.compose.ui.res.colorResource
|
||||
import androidx.core.os.bundleOf
|
||||
import androidx.core.view.children
|
||||
import androidx.core.view.forEachIndexed
|
||||
|
|
@ -152,7 +150,6 @@ class TaskFormActivity : BaseActivity() {
|
|||
|
||||
val taskId = bundle.getString(TASK_ID_KEY)
|
||||
groupID = bundle.getString(GROUP_ID_KEY)
|
||||
forcedIsNight = false
|
||||
forcedTheme = if (taskId != null) {
|
||||
val taskValue = bundle.getDouble(TASK_VALUE_KEY)
|
||||
when {
|
||||
|
|
@ -227,10 +224,8 @@ class TaskFormActivity : BaseActivity() {
|
|||
AssignedView(
|
||||
groupMembers.filter { assignedIDs.contains(it.id) },
|
||||
taskCompletedMap,
|
||||
task?.extraExtraLightTaskColor?.let { colorResource(it) } ?: Color(
|
||||
getThemeColor(R.attr.colorTintedBackgroundOffset)
|
||||
),
|
||||
colorResource(task?.darkestTaskColor ?: R.color.text_primary),
|
||||
HabiticaTheme.colors.windowBackgroundFor(task),
|
||||
HabiticaTheme.colors.textPrimaryFor(task),
|
||||
{
|
||||
showAssignDialog()
|
||||
},
|
||||
|
|
@ -262,7 +257,6 @@ class TaskFormActivity : BaseActivity() {
|
|||
if (!task.isValid) return@launch
|
||||
this@TaskFormActivity.task = task
|
||||
initialTaskInstance = task
|
||||
// tintColor = ContextCompat.getColor(this, it.mediumTaskColor)
|
||||
fillForm(task)
|
||||
task.challengeID?.let { challengeID ->
|
||||
lifecycleScope.launchCatching {
|
||||
|
|
|
|||
|
|
@ -26,7 +26,6 @@ import androidx.compose.ui.Modifier
|
|||
import androidx.compose.ui.draw.shadow
|
||||
import androidx.compose.ui.graphics.ColorFilter
|
||||
import androidx.compose.ui.platform.LocalContext
|
||||
import androidx.compose.ui.res.colorResource
|
||||
import androidx.compose.ui.res.painterResource
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.text.AnnotatedString
|
||||
|
|
@ -112,16 +111,16 @@ fun TaskSummaryView(viewModel: TaskSummaryViewModel) {
|
|||
val titleModifier = Modifier.padding(top = 30.dp)
|
||||
val textModifier = Modifier.padding(top = 4.dp)
|
||||
if (task != null) {
|
||||
val darkestColor = colorResource(task?.darkestTaskColor ?: R.color.text_primary)
|
||||
val darkestColor = HabiticaTheme.colors.textPrimaryFor(task)
|
||||
val systemUiController = rememberSystemUiController()
|
||||
val statusBarColor = colorResource(task?.lightTaskColor ?: R.color.brand_400)
|
||||
val lightestColor = colorResource(task?.lightestTaskColor ?: R.color.window_background)
|
||||
val statusBarColor = HabiticaTheme.colors.primaryBackgroundFor(task)
|
||||
val lightestColor = HabiticaTheme.colors.contentBackgroundFor(task)
|
||||
DisposableEffect(systemUiController) {
|
||||
systemUiController.setStatusBarColor(statusBarColor, darkIcons = true)
|
||||
systemUiController.setNavigationBarColor(lightestColor)
|
||||
onDispose {}
|
||||
}
|
||||
Column(Modifier.background(colorResource(task?.lightTaskColor ?: R.color.brand_300))) {
|
||||
Column(Modifier.background(statusBarColor)) {
|
||||
Row(
|
||||
verticalAlignment = Alignment.CenterVertically,
|
||||
modifier = Modifier.padding(vertical = 2.dp)
|
||||
|
|
@ -137,9 +136,7 @@ fun TaskSummaryView(viewModel: TaskSummaryViewModel) {
|
|||
painterResource(R.drawable.arrow_back),
|
||||
stringResource(R.string.action_back),
|
||||
colorFilter = ColorFilter.tint(
|
||||
colorResource(
|
||||
task?.darkestTaskColor ?: R.color.white
|
||||
)
|
||||
darkestColor
|
||||
)
|
||||
)
|
||||
}
|
||||
|
|
@ -221,9 +218,7 @@ fun TaskSummaryView(viewModel: TaskSummaryViewModel) {
|
|||
modifier = Modifier
|
||||
.padding(vertical = 4.dp)
|
||||
.background(
|
||||
colorResource(
|
||||
task?.extraExtraLightTaskColor ?: R.color.gray_700
|
||||
),
|
||||
HabiticaTheme.colors.windowBackgroundFor(task),
|
||||
MaterialTheme.shapes.medium
|
||||
)
|
||||
.padding(15.dp)
|
||||
|
|
@ -246,9 +241,7 @@ fun TaskSummaryView(viewModel: TaskSummaryViewModel) {
|
|||
item.assignedUsername ?: "", member.value, Modifier
|
||||
.padding(vertical = 4.dp)
|
||||
.background(
|
||||
colorResource(
|
||||
task?.extraExtraLightTaskColor ?: R.color.gray_700
|
||||
),
|
||||
HabiticaTheme.colors.windowBackgroundFor(task),
|
||||
MaterialTheme.shapes.medium
|
||||
)
|
||||
.padding(15.dp, 12.dp)
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
package com.habitrpg.android.habitica.ui.theme
|
||||
|
||||
import androidx.compose.foundation.isSystemInDarkTheme
|
||||
import androidx.compose.foundation.shape.RoundedCornerShape
|
||||
import androidx.compose.material.MaterialTheme
|
||||
import androidx.compose.material.Shapes
|
||||
|
|
@ -8,6 +9,7 @@ import androidx.compose.runtime.Composable
|
|||
import androidx.compose.ui.graphics.Color
|
||||
import androidx.compose.ui.platform.LocalContext
|
||||
import androidx.compose.ui.platform.LocalLayoutDirection
|
||||
import androidx.compose.ui.res.colorResource
|
||||
import androidx.compose.ui.text.TextStyle
|
||||
import androidx.compose.ui.text.font.FontFamily
|
||||
import androidx.compose.ui.text.font.FontWeight
|
||||
|
|
@ -16,6 +18,7 @@ import androidx.compose.ui.unit.sp
|
|||
import androidx.core.content.ContextCompat
|
||||
import com.google.android.material.composethemeadapter.createMdcTheme
|
||||
import com.habitrpg.android.habitica.R
|
||||
import com.habitrpg.android.habitica.models.tasks.Task
|
||||
import com.habitrpg.common.habitica.extensions.getThemeColor
|
||||
|
||||
@Composable
|
||||
|
|
@ -149,4 +152,23 @@ class HabiticaColors(
|
|||
val textSecondary: Color,
|
||||
val textTertiary: Color,
|
||||
val textDimmed: Color
|
||||
)
|
||||
) {
|
||||
@Composable
|
||||
fun textPrimaryFor(task: Task?): Color {
|
||||
return colorResource((if (isSystemInDarkTheme()) task?.extraExtraLightTaskColor else task?.extraDarkTaskColor) ?: R.color.text_primary)
|
||||
}
|
||||
@Composable
|
||||
fun primaryBackgroundFor(task: Task?): Color {
|
||||
return colorResource((if (isSystemInDarkTheme()) task?.mediumTaskColor else task?.lightTaskColor) ?: R.color.brand_400)
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun windowBackgroundFor(task: Task?): Color {
|
||||
return (if (isSystemInDarkTheme()) task?.extraExtraDarkTaskColor else task?.extraExtraLightTaskColor)?.let { colorResource(it) } ?: windowBackground
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun contentBackgroundFor(task: Task?): Color {
|
||||
return (if (isSystemInDarkTheme()) task?.darkestTaskColor else task?.lightestTaskColor)?.let { colorResource(it) } ?: windowBackground
|
||||
}
|
||||
}
|
||||
|
|
@ -209,6 +209,10 @@ class ChatRecyclerMessageViewHolder(
|
|||
} else {
|
||||
binding.buttonsWrapper.visibility = View.GONE
|
||||
}
|
||||
|
||||
if ((chatMessage?.flagCount ?: 0) > 0) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
private fun messageWasSent(): Boolean {
|
||||
|
|
|
|||
|
|
@ -13,7 +13,6 @@ import androidx.recyclerview.widget.LinearLayoutManager
|
|||
import androidx.recyclerview.widget.RecyclerView
|
||||
import com.habitrpg.android.habitica.R
|
||||
import com.habitrpg.android.habitica.helpers.GroupPlanInfoProvider
|
||||
import com.habitrpg.android.habitica.helpers.ExceptionHandler
|
||||
import com.habitrpg.android.habitica.models.tasks.ChecklistItem
|
||||
import com.habitrpg.android.habitica.models.tasks.Task
|
||||
import com.habitrpg.common.habitica.extensions.getThemeColor
|
||||
|
|
@ -64,7 +63,7 @@ abstract class ChecklistedViewHolder(
|
|||
if (isLocked) {
|
||||
this.checkmarkView.visibility = View.GONE
|
||||
this.lockView.visibility = View.VISIBLE
|
||||
lockView.drawable.setTint(ContextCompat.getColor(context, if (data.isDue == true || data.type == TaskType.TODO) data.darkestTaskColor else R.color.text_dimmed))
|
||||
lockView.drawable.setTint(ContextCompat.getColor(context, if (data.isDue == true || data.type == TaskType.TODO) data.extraExtraDarkTaskColor else R.color.text_dimmed))
|
||||
} else {
|
||||
this.checkmarkView.visibility = if (completed) View.VISIBLE else View.GONE
|
||||
checkmarkView.drawable.setTint(ContextCompat.getColor(context, R.color.gray_400))
|
||||
|
|
@ -152,7 +151,7 @@ abstract class ChecklistedViewHolder(
|
|||
checkmark?.drawable?.setTint(ContextCompat.getColor(context, R.color.text_dimmed))
|
||||
R.color.offset_background
|
||||
} else {
|
||||
val color = if (context.isUsingNightModeResources()) task?.darkestTaskColor else task?.darkTaskColor
|
||||
val color = if (context.isUsingNightModeResources()) task?.extraExtraDarkTaskColor else task?.darkTaskColor
|
||||
checkmark?.drawable?.setTint(ContextCompat.getColor(context, color ?: R.color.text_dimmed))
|
||||
task?.extraLightTaskColor ?: R.color.offset_background
|
||||
}
|
||||
|
|
|
|||
|
|
@ -45,7 +45,7 @@ class HabitViewHolder(
|
|||
if (data.up == true) {
|
||||
val plusIcon = if (isLocked) {
|
||||
val icon = ContextCompat.getDrawable(context, R.drawable.task_lock)
|
||||
icon?.setTint(ContextCompat.getColor(context, data.darkestTaskColor))
|
||||
icon?.setTint(ContextCompat.getColor(context, data.extraExtraDarkTaskColor))
|
||||
icon
|
||||
} else {
|
||||
val icon = ContextCompat.getDrawable(context, R.drawable.habit_plus)
|
||||
|
|
@ -83,7 +83,7 @@ class HabitViewHolder(
|
|||
this.btnMinusWrapper.setBackgroundResource(data.lightTaskColor)
|
||||
val minusIcon = if (isLocked) {
|
||||
val icon = ContextCompat.getDrawable(context, R.drawable.task_lock)
|
||||
icon?.setTint(ContextCompat.getColor(context, data.darkestTaskColor))
|
||||
icon?.setTint(ContextCompat.getColor(context, data.extraExtraDarkTaskColor))
|
||||
icon
|
||||
} else {
|
||||
val icon = ContextCompat.getDrawable(context, R.drawable.habit_minus)
|
||||
|
|
|
|||
|
|
@ -140,7 +140,7 @@ class YesterdailyDialog private constructor(
|
|||
if (task.completed) {
|
||||
checkmark?.drawable?.setTint(ContextCompat.getColor(context, R.color.gray_400))
|
||||
} else {
|
||||
checkmark?.drawable?.setTint(ContextCompat.getColor(context, task.darkestTaskColor))
|
||||
checkmark?.drawable?.setTint(ContextCompat.getColor(context, task.extraExtraDarkTaskColor))
|
||||
}
|
||||
checkmark?.visibility = if (item.completed) View.VISIBLE else View.GONE
|
||||
val checkboxHolder = checklistView.findViewById<View>(R.id.checkBoxHolder) as? ViewGroup
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@ import com.google.gson.JsonElement
|
|||
import com.google.gson.JsonParseException
|
||||
import com.habitrpg.android.habitica.models.inventory.Quest
|
||||
import com.habitrpg.android.habitica.models.members.Member
|
||||
import com.habitrpg.android.habitica.models.members.MemberFlags
|
||||
import com.habitrpg.android.habitica.models.members.MemberPreferences
|
||||
import com.habitrpg.android.habitica.models.social.UserParty
|
||||
import com.habitrpg.android.habitica.models.user.Authentication
|
||||
|
|
@ -33,6 +34,10 @@ class MemberSerialization : JsonDeserializer<Member> {
|
|||
member = realm.copyFromRealm(member)
|
||||
}
|
||||
|
||||
if (obj.has("flags")) {
|
||||
member.flags = context.deserialize(obj.get("flags"), MemberFlags::class.java)
|
||||
}
|
||||
|
||||
if (obj.has("stats")) {
|
||||
member.stats = context.deserialize<Stats>(obj.get("stats"), Stats::class.java)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -14,7 +14,6 @@ import com.habitrpg.android.habitica.models.inventory.Quest
|
|||
import com.habitrpg.android.habitica.models.invitations.Invitations
|
||||
import com.habitrpg.android.habitica.models.social.ChallengeMembership
|
||||
import com.habitrpg.android.habitica.models.social.UserParty
|
||||
import com.habitrpg.shared.habitica.models.tasks.TasksOrder
|
||||
import com.habitrpg.android.habitica.models.user.ABTest
|
||||
import com.habitrpg.android.habitica.models.user.Authentication
|
||||
import com.habitrpg.android.habitica.models.user.Backer
|
||||
|
|
@ -23,12 +22,14 @@ import com.habitrpg.android.habitica.models.user.Flags
|
|||
import com.habitrpg.android.habitica.models.user.Inbox
|
||||
import com.habitrpg.android.habitica.models.user.Items
|
||||
import com.habitrpg.android.habitica.models.user.OwnedItem
|
||||
import com.habitrpg.android.habitica.models.user.Permissions
|
||||
import com.habitrpg.android.habitica.models.user.Preferences
|
||||
import com.habitrpg.android.habitica.models.user.Profile
|
||||
import com.habitrpg.android.habitica.models.user.Purchases
|
||||
import com.habitrpg.android.habitica.models.user.Stats
|
||||
import com.habitrpg.android.habitica.models.user.User
|
||||
import com.habitrpg.android.habitica.models.user.UserAchievement
|
||||
import com.habitrpg.shared.habitica.models.tasks.TasksOrder
|
||||
import io.realm.Realm
|
||||
import io.realm.RealmList
|
||||
import java.lang.reflect.Type
|
||||
|
|
@ -58,6 +59,9 @@ class UserDeserializer : JsonDeserializer<User> {
|
|||
if (obj.has("inbox")) {
|
||||
user.inbox = context.deserialize(obj.get("inbox"), Inbox::class.java)
|
||||
}
|
||||
if (obj.has("permissions")) {
|
||||
user.permissions = context.deserialize(obj.get("permissions"), Permissions::class.java)
|
||||
}
|
||||
if (obj.has("preferences")) {
|
||||
user.preferences = context.deserialize(obj.get("preferences"), Preferences::class.java)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -24,7 +24,6 @@
|
|||
<color name="maroon_50">#C92B2B</color>
|
||||
<color name="maroon_10">#B01515</color>
|
||||
<color name="maroon_5">#7D0C0C</color>
|
||||
<color name="maroon_1">#4C0001</color>
|
||||
|
||||
<color name="red_700">#FFF6F7</color>
|
||||
<color name="red_600">#FCEEEF</color>
|
||||
|
|
@ -33,8 +32,6 @@
|
|||
<color name="red_50">#F74E52</color>
|
||||
<color name="red_10">#F23035</color>
|
||||
<color name="red_5">#BF262B</color>
|
||||
<color name="red_1">#6c0406</color>
|
||||
|
||||
<color name="orange_700">#FFF9F5</color>
|
||||
<color name="orange_600">#FCF3ED</color>
|
||||
<color name="orange_500">#ffc8a7</color>
|
||||
|
|
@ -90,12 +87,30 @@
|
|||
|
||||
<color name="gray_1_30">#4D1A181D</color>
|
||||
|
||||
<color name="maroon_1">#4C0001</color>
|
||||
<color name="red_1">#6c0406</color>
|
||||
<color name="blue_1">#033f5e</color>
|
||||
<color name="teal_1">#005158</color>
|
||||
<color name="green_1">#005737</color>
|
||||
<color name="yellow_1">#794b00</color>
|
||||
<color name="orange_1">#7f3300</color>
|
||||
|
||||
<color name="maroon_0">#3D2828</color>
|
||||
<color name="red_0">#3D2828</color>
|
||||
<color name="blue_0">#28373D</color>
|
||||
<color name="teal_0">#283C3D</color>
|
||||
<color name="green_0">#283D36</color>
|
||||
<color name="yellow_0">#3D3528</color>
|
||||
<color name="orange_0">#3D3028</color>
|
||||
|
||||
<color name="maroon_00">#261C1C</color>
|
||||
<color name="red_00">#261C1C</color>
|
||||
<color name="blue_00">#191D21</color>
|
||||
<color name="teal_00">#1C2526</color>
|
||||
<color name="green_00">#1C2622</color>
|
||||
<color name="yellow_00">#26221C</color>
|
||||
<color name="orange_00">#26201C</color>
|
||||
|
||||
<color name="hpColor">@color/red_100</color>
|
||||
<color name="xpColor">@color/yellow_100</color>
|
||||
<color name="mpColor">@color/blue_100</color>
|
||||
|
|
|
|||
|
|
@ -1,2 +1,2 @@
|
|||
NAME=4.1
|
||||
CODE=4791
|
||||
CODE=4821
|
||||
Loading…
Reference in a new issue