From 31b8d68f9c9057876b658a58c63ac5e3dbb75868 Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Wed, 26 Aug 2020 12:58:04 +0200 Subject: [PATCH] Fix issues with new design --- Habitica/build.gradle | 2 +- Habitica/res/layout/activity_full_profile.xml | 2 +- Habitica/res/layout/activity_guidelines.xml | 4 +- Habitica/res/layout/activity_main.xml | 7 +- .../res/layout/activity_notifications.xml | 4 +- Habitica/res/layout/activity_party_invite.xml | 10 +- Habitica/res/layout/activity_prefs.xml | 2 +- .../res/layout/activity_skill_members.xml | 4 +- Habitica/res/layout/activity_skill_tasks.xml | 4 +- Habitica/res/layout/avatar_with_bars.xml | 6 +- Habitica/res/layout/task_main_content.xml | 1 + Habitica/res/values/styles.xml | 2 +- .../android/habitica/data/SocialRepository.kt | 2 +- .../implementation/SocialRepositoryImpl.kt | 2 +- .../data/local/SocialLocalRepository.kt | 2 +- .../RealmSocialLocalRepository.kt | 4 +- .../android/habitica/extensions/ViewExt.kt | 22 ++++ .../habitica/ui/activities/BaseActivity.kt | 50 +++++--- .../ui/activities/ChallengeFormActivity.kt | 18 ++- .../ui/activities/FullProfileActivity.kt | 6 +- .../ui/activities/GroupInviteActivity.kt | 3 +- .../habitica/ui/activities/MainActivity.kt | 22 +++- .../ui/activities/TaskFormActivity.kt | 9 +- .../ui/fragments/AchievementsFragment.kt | 5 + .../habitica/ui/fragments/BaseMainFragment.kt | 10 ++ .../social/GuildsOverviewFragment.kt | 2 +- .../challenges/ChallengeListFragment.kt | 2 +- .../ui/fragments/tasks/TasksFragment.kt | 1 + .../habitica/ui/helpers/ToolbarColorHelper.kt | 119 ++++++++++++++++++ .../ui/viewHolders/tasks/RewardViewHolder.kt | 1 + 30 files changed, 261 insertions(+), 67 deletions(-) create mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/ToolbarColorHelper.kt diff --git a/Habitica/build.gradle b/Habitica/build.gradle index d0a530e0d..231f7bb90 100644 --- a/Habitica/build.gradle +++ b/Habitica/build.gradle @@ -162,7 +162,7 @@ android { multiDexEnabled true resConfigs "en", "bg", "de", "en-rGB", "es", "fr", "hr-rHR", "in", "it", "iw", "ja", "ko", "lt", "nl", "pl", "pt-rBR", "pt-rPT", "ru", "tr", "zh", "zh-rTW" - versionCode 2514 + versionCode 2515 versionName "2.8" } diff --git a/Habitica/res/layout/activity_full_profile.xml b/Habitica/res/layout/activity_full_profile.xml index f6d00e853..e5b00b214 100644 --- a/Habitica/res/layout/activity_full_profile.xml +++ b/Habitica/res/layout/activity_full_profile.xml @@ -17,7 +17,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:minHeight="?attr/actionBarSize" - android:theme="@style/Toolbar" + android:theme="@style/Toolbar.Modern" app:layout_scrollFlags="scroll|enterAlways" app:popupTheme="@style/Theme.AppCompat.Light"/> diff --git a/Habitica/res/layout/activity_guidelines.xml b/Habitica/res/layout/activity_guidelines.xml index 06418db99..e22db839a 100644 --- a/Habitica/res/layout/activity_guidelines.xml +++ b/Habitica/res/layout/activity_guidelines.xml @@ -17,9 +17,9 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:minHeight="?attr/actionBarSize" - android:theme="@style/Toolbar" + android:theme="@style/Toolbar.Modern" app:layout_scrollFlags="scroll|enterAlways" - app:popupTheme="@style/ThemeOverlay.AppCompat.Dark"/> + app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/> - @@ -43,6 +44,8 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="?attr/actionBarSize" + android:layout_marginEnd="@dimen/header_border_spacing" + android:layout_marginStart="@dimen/header_border_spacing" app:layout_collapseMode="parallax" /> diff --git a/Habitica/res/layout/activity_notifications.xml b/Habitica/res/layout/activity_notifications.xml index 5671d72f2..06f378e3a 100644 --- a/Habitica/res/layout/activity_notifications.xml +++ b/Habitica/res/layout/activity_notifications.xml @@ -17,9 +17,9 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:minHeight="?attr/actionBarSize" - android:theme="@style/Toolbar" + android:theme="@style/Toolbar.Modern" app:layout_scrollFlags="scroll|enterAlways" - app:popupTheme="@style/ThemeOverlay.AppCompat.Dark" /> + app:popupTheme="@style/ThemeOverlay.AppCompat.Light" /> diff --git a/Habitica/res/layout/activity_party_invite.xml b/Habitica/res/layout/activity_party_invite.xml index fc8f3e4b6..8c62f603f 100644 --- a/Habitica/res/layout/activity_party_invite.xml +++ b/Habitica/res/layout/activity_party_invite.xml @@ -22,9 +22,9 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:minHeight="?attr/actionBarSize" - android:theme="@style/Toolbar" + android:theme="@style/Toolbar.Modern" app:layout_scrollFlags="scroll|enterAlways" - app:popupTheme="@style/ThemeOverlay.AppCompat.Dark"/> + app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/> @@ -33,17 +33,17 @@ android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:layout_gravity="bottom" - android:background="?attr/colorPrimary" + android:background="@color/gray_700" android:elevation="0dp" android:fillViewport="false" - android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" + android:theme="@style/ThemeOverlay.AppCompat.Light" app:layout_anchor="@+id/collapsing_toolbar" app:layout_anchorGravity="bottom" app:layout_collapseMode="pin" app:tabGravity="fill" - app:tabIndicatorColor="@android:color/white" + app:tabIndicatorColor="?attr/colorPrimary" app:tabMode="fixed" /> diff --git a/Habitica/res/layout/activity_skill_members.xml b/Habitica/res/layout/activity_skill_members.xml index 85325ea9b..e536a11c9 100644 --- a/Habitica/res/layout/activity_skill_members.xml +++ b/Habitica/res/layout/activity_skill_members.xml @@ -17,9 +17,9 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:minHeight="?attr/actionBarSize" - android:theme="@style/Toolbar" + android:theme="@style/Toolbar.Modern" app:layout_scrollFlags="scroll|enterAlways" - app:popupTheme="@style/ThemeOverlay.AppCompat.Dark"/> + app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/> diff --git a/Habitica/res/layout/activity_skill_tasks.xml b/Habitica/res/layout/activity_skill_tasks.xml index a55bc2bcf..499a5bb2e 100644 --- a/Habitica/res/layout/activity_skill_tasks.xml +++ b/Habitica/res/layout/activity_skill_tasks.xml @@ -17,9 +17,9 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:minHeight="?attr/actionBarSize" - android:theme="@style/Toolbar" + android:theme="@style/Toolbar.Modern" app:layout_scrollFlags="scroll|enterAlways" - app:popupTheme="@style/ThemeOverlay.AppCompat.Dark"/> + app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/> diff --git a/Habitica/res/layout/avatar_with_bars.xml b/Habitica/res/layout/avatar_with_bars.xml index 9d92ff9d8..60d30f300 100644 --- a/Habitica/res/layout/avatar_with_bars.xml +++ b/Habitica/res/layout/avatar_with_bars.xml @@ -9,11 +9,7 @@ android:background="?attr/headerBackgroundColor" android:focusable="true" android:focusableInTouchMode="true" - android:orientation="vertical" - android:paddingEnd="@dimen/header_border_spacing" - android:paddingLeft="@dimen/header_border_spacing" - android:paddingRight="@dimen/header_border_spacing" - android:paddingStart="@dimen/header_border_spacing"> + android:orientation="vertical"> diff --git a/Habitica/res/values/styles.xml b/Habitica/res/values/styles.xml index 1e494a552..2b8edcef5 100644 --- a/Habitica/res/values/styles.xml +++ b/Habitica/res/values/styles.xml @@ -276,7 +276,7 @@ diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/SocialRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/SocialRepository.kt index 96b0e5cc6..5f4d7ff9c 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/SocialRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/SocialRepository.kt @@ -14,7 +14,7 @@ import java.util.* interface SocialRepository : BaseRepository { fun getPublicGuilds(): Flowable> - fun getUserGroups(): Flowable> + fun getUserGroups(type: String?): Flowable> fun retrieveGroupChat(groupId: String): Single> fun getGroupChat(groupId: String): Flowable> diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/SocialRepositoryImpl.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/SocialRepositoryImpl.kt index 8bcd607ef..9cbe74eb7 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/SocialRepositoryImpl.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/SocialRepositoryImpl.kt @@ -273,7 +273,7 @@ class SocialRepositoryImpl(localRepository: SocialLocalRepository, apiClient: Ap } } - override fun getUserGroups(): Flowable> = localRepository.getUserGroups(userID) + override fun getUserGroups(type: String?): Flowable> = localRepository.getUserGroups(userID, type) override fun acceptQuest(user: User?, partyId: String): Flowable { return apiClient.acceptQuest(partyId) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/SocialLocalRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/SocialLocalRepository.kt index 542428130..7494528c6 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/SocialLocalRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/SocialLocalRepository.kt @@ -12,7 +12,7 @@ import io.realm.RealmResults interface SocialLocalRepository : BaseLocalRepository { fun getPublicGuilds(): Flowable> - fun getUserGroups(userID: String): Flowable> + fun getUserGroups(userID: String, type: String?): Flowable> fun getGroups(type: String): Flowable> fun getGroup(id: String): Flowable diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmSocialLocalRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmSocialLocalRepository.kt index 6e76f8c7a..daf4a57b9 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmSocialLocalRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmSocialLocalRepository.kt @@ -106,14 +106,14 @@ class RealmSocialLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm) .asFlowable() .filter { it.isLoaded } - override fun getUserGroups(userID: String): Flowable> = realm.where(GroupMembership::class.java) + override fun getUserGroups(userID: String, type: String?): Flowable> = realm.where(GroupMembership::class.java) .equalTo("userID", userID) .findAll() .asFlowable() .filter { it.isLoaded } .flatMap {memberships -> realm.where(Group::class.java) - .equalTo("type", "guild") + .equalTo("type", type ?: "guild") .notEqualTo("id", Group.TAVERN_ID) .`in`("id", memberships.map { return@map it.groupID diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/ViewExt.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/ViewExt.kt index 02945548d..1135ee139 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/ViewExt.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/ViewExt.kt @@ -2,8 +2,30 @@ package com.habitrpg.android.habitica.extensions import android.content.Context import android.view.View +import android.view.ViewTreeObserver fun View.setScaledPadding(context: Context?, left: Int, top: Int, right: Int, bottom: Int) { this.setPadding(left.dpToPx(context), top.dpToPx(context), right.dpToPx(context), bottom.dpToPx(context)) } + + +inline fun View.waitForLayout(crossinline f: View.() -> Unit) = with(viewTreeObserver) { + addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener { + override fun onGlobalLayout() { + viewTreeObserver.removeOnGlobalLayoutListener(this) + f() + } + }) +} + +inline fun View.afterMeasured(crossinline f: View.() -> Unit) { + viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener { + override fun onGlobalLayout() { + if (measuredWidth > 0 && measuredHeight > 0) { + viewTreeObserver.removeOnGlobalLayoutListener(this) + f() + } + } + }) +} \ No newline at end of file diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/BaseActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/BaseActivity.kt index ca38f066e..ae2c6c917 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/BaseActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/BaseActivity.kt @@ -1,14 +1,22 @@ package com.habitrpg.android.habitica.ui.activities +import android.app.Activity import android.content.Context import android.content.SharedPreferences import android.content.res.Configuration +import android.graphics.PorterDuff +import android.graphics.PorterDuffColorFilter import android.os.Build import android.os.Bundle import android.view.LayoutInflater +import android.view.Menu import android.view.View +import android.view.ViewGroup +import android.view.ViewTreeObserver.OnGlobalLayoutListener +import android.widget.ImageButton import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatDelegate +import androidx.appcompat.view.menu.ActionMenuItemView import androidx.appcompat.widget.Toolbar import androidx.preference.PreferenceManager import com.habitrpg.android.habitica.HabiticaApplication @@ -18,6 +26,7 @@ import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.events.ShowConnectionProblemEvent import com.habitrpg.android.habitica.extensions.getThemeColor import com.habitrpg.android.habitica.helpers.LanguageHelper +import com.habitrpg.android.habitica.ui.helpers.ToolbarColorHelper import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog import io.reactivex.disposables.CompositeDisposable import org.greenrobot.eventbus.EventBus @@ -31,6 +40,8 @@ abstract class BaseActivity : AppCompatActivity() { internal var forcedTheme: String? = null private var destroyed: Boolean = false + open var overrideModernHeader: Boolean? = null + protected abstract fun getLayoutResId(): Int open fun getContentView(): View { @@ -94,29 +105,29 @@ abstract class BaseActivity : AppCompatActivity() { } else { sharedPreferences.getString("theme_name", "purple") } - val modernHeaderStyle = sharedPreferences.getBoolean("modern_header_style", true) - if (theme == currentTheme) return - setTheme(when (theme) { - "maroon" -> R.style.MainAppTheme_Maroon - "red" -> R.style.MainAppTheme_Red - "orange" -> R.style.MainAppTheme_Orange - "yellow" -> R.style.MainAppTheme_Yellow - "green" -> R.style.MainAppTheme_Green - "teal" -> R.style.MainAppTheme_Teal - "blue" -> R.style.MainAppTheme_Blue - else -> R.style.MainAppTheme - }) - window.navigationBarColor = getThemeColor(R.attr.colorPrimaryDark) - window.statusBarColor = if (modernHeaderStyle && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - getThemeColor(R.attr.headerBackgroundColor) - } else { - getThemeColor(R.attr.colorPrimaryDark) + val modernHeaderStyle = overrideModernHeader ?: sharedPreferences.getBoolean("modern_header_style", true) + if (theme != currentTheme) { + setTheme(when (theme) { + "maroon" -> R.style.MainAppTheme_Maroon + "red" -> R.style.MainAppTheme_Red + "orange" -> R.style.MainAppTheme_Orange + "yellow" -> R.style.MainAppTheme_Yellow + "green" -> R.style.MainAppTheme_Green + "teal" -> R.style.MainAppTheme_Teal + "blue" -> R.style.MainAppTheme_Blue + else -> R.style.MainAppTheme + }) } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + window.navigationBarColor = getThemeColor(R.attr.colorPrimaryDark) + if (modernHeaderStyle && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + window.statusBarColor = getThemeColor(R.attr.headerBackgroundColor) window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR + } else { + window.statusBarColor = getThemeColor(R.attr.colorPrimaryDark) + window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_VISIBLE } - if (currentTheme != null) { + if (currentTheme != null && theme != currentTheme) { reload() } else { currentTheme = theme @@ -138,6 +149,7 @@ abstract class BaseActivity : AppCompatActivity() { actionBar.setHomeButtonEnabled(true) } } + toolbar?.let { ToolbarColorHelper.colorizeToolbar(it, this, overrideModernHeader) } } override fun onDestroy() { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ChallengeFormActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ChallengeFormActivity.kt index a3a82706e..fe55c9ac2 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ChallengeFormActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ChallengeFormActivity.kt @@ -25,11 +25,13 @@ import com.habitrpg.android.habitica.models.tasks.Task import com.habitrpg.android.habitica.models.user.User import com.habitrpg.android.habitica.modules.AppModule import com.habitrpg.android.habitica.ui.adapter.social.challenges.ChallengeTasksRecyclerViewAdapter +import com.habitrpg.android.habitica.ui.helpers.ToolbarColorHelper import com.habitrpg.android.habitica.ui.helpers.bindView import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog import io.reactivex.Flowable import io.reactivex.functions.Consumer +import io.reactivex.rxkotlin.zipWith import java.util.* import javax.inject.Inject import javax.inject.Named @@ -71,6 +73,7 @@ class ChallengeFormActivity : BaseActivity() { private val updatedTasks = HashMap() private val removedTasks = HashMap() + override var overrideModernHeader: Boolean? = true // Add {*} Items private var addHabit: Task? = null private var addDaily: Task? = null @@ -117,6 +120,7 @@ class ChallengeFormActivity : BaseActivity() { override fun onCreateOptionsMenu(menu: Menu): Boolean { val inflater = menuInflater inflater.inflate(R.menu.menu_create_challenge, menu) + findViewById(R.id.toolbar).let { ToolbarColorHelper.colorizeToolbar(it, this, overrideModernHeader) } return true } @@ -319,15 +323,21 @@ class ChallengeFormActivity : BaseActivity() { } locationAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) - compositeSubscription.add(socialRepository.getGroups("guild").subscribe(Consumer { groups -> - val mutableGroups = groups.toMutableList() - if (groups.firstOrNull { it.id == "00000000-0000-4000-A000-000000000000" } == null) { + compositeSubscription.add(socialRepository.getUserGroups("guild").zipWith(userRepository.getUser() + .map { it.party?.id ?: "" } + .distinctUntilChanged() + .flatMap { socialRepository.getGroup(it) }) + .subscribe(Consumer { groups -> + val mutableGroups = groups.first.toMutableList() + if (groups.first.firstOrNull { it.id == "00000000-0000-4000-A000-000000000000" } == null) { val tavern = Group() tavern.id = "00000000-0000-4000-A000-000000000000" tavern.name = getString(R.string.public_challenge) mutableGroups.add(0, tavern) } - + if (groups.second != null) { + mutableGroups.add(groups.second) + } locationAdapter.clear() locationAdapter.addAll(mutableGroups) }, RxErrorHandler.handleEmptyError())) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/FullProfileActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/FullProfileActivity.kt index 84d6e2108..7e51053cf 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/FullProfileActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/FullProfileActivity.kt @@ -33,10 +33,7 @@ import com.habitrpg.android.habitica.models.user.Stats import com.habitrpg.android.habitica.ui.AvatarView import com.habitrpg.android.habitica.ui.AvatarWithBarsViewModel import com.habitrpg.android.habitica.ui.adapter.social.AchievementProfileAdapter -import com.habitrpg.android.habitica.ui.helpers.bindView -import com.habitrpg.android.habitica.ui.helpers.dismissKeyboard -import com.habitrpg.android.habitica.ui.helpers.loadImage -import com.habitrpg.android.habitica.ui.helpers.setMarkdown +import com.habitrpg.android.habitica.ui.helpers.* import com.habitrpg.android.habitica.ui.views.HabiticaSnackbar import com.habitrpg.android.habitica.ui.views.HabiticaSnackbar.SnackbarDisplayType import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog @@ -141,6 +138,7 @@ class FullProfileActivity : BaseActivity() { } else { item?.title = getString(R.string.block) } + findViewById(R.id.toolbar).let { ToolbarColorHelper.colorizeToolbar(it, this, overrideModernHeader) } return super.onCreateOptionsMenu(menu) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GroupInviteActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GroupInviteActivity.kt index 5f390b3fb..fdb58a72e 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GroupInviteActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GroupInviteActivity.kt @@ -6,6 +6,7 @@ import android.os.Bundle import android.view.Menu import android.view.MenuItem import android.view.ViewGroup +import androidx.appcompat.widget.Toolbar import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentPagerAdapter import androidx.viewpager.widget.ViewPager @@ -19,6 +20,7 @@ import com.habitrpg.android.habitica.helpers.RxErrorHandler import com.habitrpg.android.habitica.models.user.User import com.habitrpg.android.habitica.modules.AppModule import com.habitrpg.android.habitica.ui.fragments.social.party.PartyInviteFragment +import com.habitrpg.android.habitica.ui.helpers.ToolbarColorHelper import com.habitrpg.android.habitica.ui.helpers.bindView import com.habitrpg.android.habitica.ui.helpers.dismissKeyboard import com.habitrpg.android.habitica.ui.views.HabiticaSnackbar @@ -66,7 +68,6 @@ class GroupInviteActivity : BaseActivity() { } override fun onCreateOptionsMenu(menu: Menu): Boolean { - // Inflate the menu; this adds items to the action bar if it is present. menuInflater.inflate(R.menu.menu_party_invite, menu) return true } 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 e06e2be3e..85ddf7838 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 @@ -26,6 +26,7 @@ import androidx.lifecycle.ViewModelProviders import androidx.navigation.NavController import androidx.navigation.NavDestination import androidx.navigation.findNavController +import androidx.navigation.fragment.NavHostFragment import com.facebook.drawee.view.SimpleDraweeView import com.google.firebase.analytics.FirebaseAnalytics import com.google.firebase.perf.FirebasePerformance @@ -195,7 +196,7 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction { .get(NotificationsViewModel::class.java) notificationsViewModel = viewModel - val drawerLayout = findViewById(R.id.drawer_layout) + val drawerLayout = findViewById(R.id.drawer_layout) drawerFragment = supportFragmentManager.findFragmentById(R.id.navigation_drawer) as? NavigationDrawerFragment @@ -216,11 +217,11 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction { override fun onDrawerSlide(drawerView: View, slideOffset: Float) { val modernHeaderStyle = sharedPreferences.getBoolean("modern_header_style", true) if (modernHeaderStyle && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - if (slideOffset < 0.1f && isOpeningDrawer == null) { + if (slideOffset < 0.5f && isOpeningDrawer == null) { window.statusBarColor = getThemeColor(R.attr.colorPrimaryDark) window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_VISIBLE isOpeningDrawer = true - } else if (slideOffset > 0.9f && isOpeningDrawer == null) { + } else if (slideOffset > 0.5f && isOpeningDrawer == null) { window.statusBarColor = getThemeColor(R.attr.headerBackgroundColor) window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR isOpeningDrawer = false @@ -229,23 +230,34 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction { } override fun onDrawerOpened(drawerView: View) { + val modernHeaderStyle = sharedPreferences.getBoolean("modern_header_style", true) + if (modernHeaderStyle && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + window.statusBarColor = getThemeColor(R.attr.colorPrimaryDark) + window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_VISIBLE + } isOpeningDrawer = null } override fun onDrawerClosed(drawerView: View) { + val modernHeaderStyle = sharedPreferences.getBoolean("modern_header_style", true) + if (modernHeaderStyle && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + window.statusBarColor = getThemeColor(R.attr.headerBackgroundColor) + window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR + } isOpeningDrawer = null } override fun onDrawerStateChanged(newState: Int) { } - }) supportActionBar?.setDisplayHomeAsUpEnabled(true) supportActionBar?.setHomeButtonEnabled(true) - val navigationController = findNavController(R.id.nav_host_fragment) + val navHostFragment = supportFragmentManager + .findFragmentById(R.id.nav_host_fragment) as NavHostFragment + val navigationController = navHostFragment.navController navigationController.addOnDestinationChangedListener { _, destination, arguments -> updateToolbarTitle(destination, arguments) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskFormActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskFormActivity.kt index f4bcb4ac9..77f5e90df 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskFormActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskFormActivity.kt @@ -96,8 +96,9 @@ class TaskFormActivity : BaseActivity() { private val tagsTitleView: TextView by bindView(R.id.tags_title) private val tagsWrapper: LinearLayout by bindView(R.id.tags_wrapper) - private val challengeNameView: TextView by bindView(R.id.challenge_name_view) + override var overrideModernHeader: Boolean? = false + private val challengeNameView: TextView by bindView(R.id.challenge_name_view) private var challenge: Challenge? = null private var isCreating = true @@ -527,7 +528,7 @@ class TaskFormActivity : BaseActivity() { val alert = HabiticaAlertDialog(this) alert.setTitle(getString(R.string.delete_challenge_task_title)) alert.setMessage(getString(R.string.delete_challenge_task_description, taskCount, challenge?.name ?: "")) - alert.addButton(R.string.leave_delete_task, true, true) { _, _ -> + alert.addButton(R.string.leave_delete_task, isPrimary = true, isDestructive = true) { _, _ -> challenge?.let { compositeSubscription.add(challengeRepository.leaveChallenge(it, "keep-all") .flatMap { taskRepository.deleteTask(task?.id ?: "") } @@ -537,7 +538,7 @@ class TaskFormActivity : BaseActivity() { }, RxErrorHandler.handleEmptyError())) } } - alert.addButton(getString(R.string.leave_delete_x_tasks, taskCount), false, true) { _, _ -> + alert.addButton(getString(R.string.leave_delete_x_tasks, taskCount), isPrimary = false, isDestructive = true) { _, _ -> challenge?.let { compositeSubscription.add(challengeRepository.leaveChallenge(it, "remove-all") .flatMap { userRepository.retrieveUser(true) } @@ -558,7 +559,7 @@ class TaskFormActivity : BaseActivity() { } companion object { - val SELECTED_TAGS_KEY = "selectedTags" + const val SELECTED_TAGS_KEY = "selectedTags" const val TASK_ID_KEY = "taskId" const val TASK_VALUE_KEY = "taskValue" const val USER_ID_KEY = "userId" diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/AchievementsFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/AchievementsFragment.kt index a21cbe23b..d6670e460 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/AchievementsFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/AchievementsFragment.kt @@ -3,6 +3,7 @@ package com.habitrpg.android.habitica.ui.fragments import android.graphics.drawable.ColorDrawable import android.os.Bundle import android.view.* +import androidx.appcompat.widget.Toolbar import androidx.core.content.ContextCompat import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.RecyclerView @@ -14,6 +15,7 @@ import com.habitrpg.android.habitica.extensions.subscribeWithErrorHandler import com.habitrpg.android.habitica.helpers.RxErrorHandler import com.habitrpg.android.habitica.models.Achievement import com.habitrpg.android.habitica.ui.adapter.AchievementsAdapter +import com.habitrpg.android.habitica.ui.helpers.ToolbarColorHelper import com.habitrpg.android.habitica.ui.helpers.bindView import com.habitrpg.android.habitica.ui.helpers.resetViews import io.reactivex.functions.Action @@ -139,6 +141,9 @@ class AchievementsFragment: BaseMainFragment(), SwipeRefreshLayout.OnRefreshList menuItem?.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS) menuItem?.setIcon(R.drawable.ic_round_view_module_24px) } + activity?.findViewById(R.id.toolbar)?.let { + ToolbarColorHelper.colorizeToolbar(it, activity, false) + } super.onCreateOptionsMenu(menu, inflater) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/BaseMainFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/BaseMainFragment.kt index f7c1f8ad8..5941a48c2 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/BaseMainFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/BaseMainFragment.kt @@ -1,6 +1,7 @@ package com.habitrpg.android.habitica.ui.fragments import android.content.Context +import android.graphics.PorterDuff import android.graphics.drawable.ColorDrawable import android.os.Bundle import android.view.LayoutInflater @@ -13,6 +14,7 @@ import com.google.android.material.tabs.TabLayout import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.data.ApiClient import com.habitrpg.android.habitica.data.UserRepository +import com.habitrpg.android.habitica.extensions.getThemeColor import com.habitrpg.android.habitica.helpers.RxErrorHandler import com.habitrpg.android.habitica.helpers.SoundManager import com.habitrpg.android.habitica.models.user.User @@ -113,4 +115,12 @@ abstract class BaseMainFragment : BaseFragment() { val params = collapsingToolbar?.layoutParams as? AppBarLayout.LayoutParams params?.scrollFlags = AppBarLayout.LayoutParams.SCROLL_FLAG_SCROLL or AppBarLayout.LayoutParams.SCROLL_FLAG_EXIT_UNTIL_COLLAPSED } + + + protected fun tintMenuIcon(item: MenuItem?) { + context?.getThemeColor(R.attr.headerTextColor)?.let { + item?.icon?.setTint(it) + item?.icon?.setTintMode(PorterDuff.Mode.MULTIPLY) + } + } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/GuildsOverviewFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/GuildsOverviewFragment.kt index a54bfe30d..d421e96a6 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/GuildsOverviewFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/GuildsOverviewFragment.kt @@ -53,7 +53,7 @@ class GuildsOverviewFragment : BaseMainFragment(), androidx.swiperefreshlayout.w binding?.publicGuildsButton?.setOnClickListener { MainNavigationController.navigate(GuildsOverviewFragmentDirections.openPublicGuilds()) } - compositeSubscription.add(socialRepository.getUserGroups().subscribe(Consumer { this.setGuilds(it) }, RxErrorHandler.handleEmptyError())) + compositeSubscription.add(socialRepository.getUserGroups("guild").subscribe(Consumer { this.setGuilds(it) }, RxErrorHandler.handleEmptyError())) } override fun onDestroy() { socialRepository.close() diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengeListFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengeListFragment.kt index d40982bd9..24b40f378 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengeListFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengeListFragment.kt @@ -89,7 +89,7 @@ class ChallengeListFragment : BaseFragment(), androidx.swiperefreshlayout.widget this.recyclerView?.setBackgroundResource(R.color.white) } - compositeSubscription.add(socialRepository.getGroup(Group.TAVERN_ID).combineLatest(socialRepository.getUserGroups()).subscribe(Consumer { + compositeSubscription.add(socialRepository.getGroup(Group.TAVERN_ID).combineLatest(socialRepository.getUserGroups("guild")).subscribe(Consumer { this.filterGroups = mutableListOf() filterGroups?.add(it.first) filterGroups?.addAll(it.second) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TasksFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TasksFragment.kt index a4a3876d8..2e13a9c46 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TasksFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TasksFragment.kt @@ -116,6 +116,7 @@ class TasksFragment : BaseMainFragment(), SearchView.OnQueryTextListener { updateFilterIcon() val item = menu.findItem(R.id.action_search) + tintMenuIcon(item) val sv = item.actionView as? SearchView sv?.setOnQueryTextListener(this) sv?.setIconifiedByDefault(false) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/ToolbarColorHelper.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/ToolbarColorHelper.kt new file mode 100644 index 000000000..5c70ffdb7 --- /dev/null +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/ToolbarColorHelper.kt @@ -0,0 +1,119 @@ +/* +Copyright 2015 Michal Pawlowski + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +package com.habitrpg.android.habitica.ui.helpers + +import android.app.Activity +import android.graphics.PorterDuff +import android.graphics.PorterDuffColorFilter +import android.os.Build +import android.view.View +import android.view.ViewGroup +import android.view.ViewTreeObserver +import android.view.ViewTreeObserver.OnGlobalLayoutListener +import android.widget.ImageButton +import androidx.appcompat.view.menu.ActionMenuItemView +import androidx.appcompat.widget.ActionMenuView +import androidx.appcompat.widget.Toolbar +import androidx.preference.PreferenceManager +import com.habitrpg.android.habitica.R +import com.habitrpg.android.habitica.extensions.getThemeColor +import com.habitrpg.android.habitica.extensions.waitForLayout +import java.util.* + +/** + * Helper class that iterates through Toolbar views, and sets dynamically icons and texts color + * Created by chomi3 on 2015-01-19. + */ +object ToolbarColorHelper { + /** + * Use this method to colorize toolbar icons to the desired target color + * @param toolbarView toolbar view being colored + * @param toolbarIconsColor the target color of toolbar icons + * @param activity reference to activity needed to register observers + */ + fun colorizeToolbar(toolbar: Toolbar, activity: Activity?, overrideModernHeader: Boolean? = null) { + if (activity == null) return + val modernHeaderStyle = overrideModernHeader ?: PreferenceManager.getDefaultSharedPreferences(activity).getBoolean("modern_header_style", true) + val toolbarIconsColor = if (modernHeaderStyle && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + toolbar.setBackgroundColor(activity.getThemeColor(R.attr.headerBackgroundColor)) + activity.getThemeColor(R.attr.headerTextColor) + } else { + toolbar.setBackgroundColor(activity.getThemeColor(R.attr.colorPrimary)) + activity.getThemeColor(R.attr.toolbarContentColor) + } + val colorFilter = PorterDuffColorFilter(toolbarIconsColor, PorterDuff.Mode.MULTIPLY) + for (i in 0 until toolbar.childCount) { + val v = toolbar.getChildAt(i) + + //Step 1 : Changing the color of back button (or open drawer button). + if (v is ImageButton) { + //Action Bar back button + v.drawable.colorFilter = colorFilter + } + if (v is ActionMenuView) { + for (j in 0 until v.childCount) { + + //Step 2: Changing the color of any ActionMenuViews - icons that are not back button, nor text, nor overflow menu icon. + //Colorize the ActionViews -> all icons that are NOT: back button | overflow menu + val innerView = v.getChildAt(j) + if (innerView is ActionMenuItemView) { + innerView.setTextColor(toolbarIconsColor) + for (k in innerView.compoundDrawables.indices) { + if (innerView.compoundDrawables[k] != null) { + + //Important to set the color filter in seperate thread, by adding it to the message queue + //Won't work otherwise. + innerView.post { innerView.compoundDrawables[k].colorFilter = colorFilter } + } + } + } + } + } + } + + //Step 3: Changing the color of title and subtitle. + toolbar.setTitleTextColor(toolbarIconsColor) + toolbar.setSubtitleTextColor(toolbarIconsColor) + + //Step 4: Changing the color of the Overflow Menu icon. + setOverflowButtonColor(activity, toolbarIconsColor) + } + + /** + * It's important to set overflowDescription atribute in styles, so we can grab the reference + * to the overflow icon. Check: res/values/styles.xml + * @param activity + * @param color + */ + private fun setOverflowButtonColor(activity: Activity, color: Int) { + val overflowDescription = activity.getString(R.string.abc_action_menu_overflow_description) + activity.window.decorView .waitForLayout { + val outViews = ArrayList() + findViewsWithText(outViews, overflowDescription, + View.FIND_VIEWS_WITH_CONTENT_DESCRIPTION) + if (outViews.isEmpty()) { + return@waitForLayout + } + val overflowViewParent = outViews[0].parent as ActionMenuView + overflowViewParent.overflowIcon?.setTint(color) + overflowViewParent.overflowIcon?.setTintMode(PorterDuff.Mode.SRC_ATOP) + } + } + + private fun removeOnGlobalLayoutListener(v: View, listener: OnGlobalLayoutListener) { + v.viewTreeObserver.removeOnGlobalLayoutListener(listener) + } +} \ No newline at end of file diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/RewardViewHolder.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/RewardViewHolder.kt index 207f3d611..db10a658d 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/RewardViewHolder.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/RewardViewHolder.kt @@ -78,5 +78,6 @@ class RewardViewHolder(itemView: View, scoreTaskFunc: ((Task, TaskDirection) -> priceLabel.setTextColor(ContextCompat.getColor(context, R.color.gray_300)) buyButton.setBackgroundColor(ColorUtils.setAlphaComponent(ContextCompat.getColor(context, R.color.gray_600), 127)) } + streakTextView.visibility = View.GONE } }