Begin implementing new navigation architecture

This commit is contained in:
Phillip Thelen 2018-12-03 19:26:47 +01:00
parent 679c7eff16
commit 70e7b54cc1
44 changed files with 451 additions and 348 deletions

View file

@ -30,6 +30,7 @@
android:theme="@style/AppTheme.NoActionBar.Transparent"
android:windowSoftInputMode="stateHidden|adjustResize"
android:screenOrientation="portrait">
<nav-graph android:value="@navigation/navigation" />
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />

View file

@ -5,6 +5,7 @@ apply plugin: 'kotlin-kapt'
apply plugin: 'io.fabric'
apply plugin: 'com.noveogroup.android.check'
apply plugin: 'realm-android'
apply plugin: 'androidx.navigation.safeargs'
buildscript {
repositories {
@ -130,6 +131,8 @@ dependencies {
implementation 'androidx.core:core-ktx:1.0.1'
implementation "androidx.lifecycle:lifecycle-extensions:2.0.0"
kapt "androidx.lifecycle:lifecycle-compiler:2.0.0"
implementation 'android.arch.navigation:navigation-fragment-ktx:1.0.0-alpha07'
implementation 'android.arch.navigation:navigation-ui-ktx:1.0.0-alpha07'
implementation 'com.plattysoft.leonids:LeonidsLib:1.3.2'
}

View file

@ -5,7 +5,7 @@
<!-- view background color -->
<solid
android:color="@color/brand_200" >
android:color="@color/brand_300" >
</solid>
<!-- Here is the corner radius -->

View file

@ -0,0 +1,7 @@
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<stroke
android:width="1dp"
android:color="@color/white"/>
<corners android:radius="6dp" />
</shape>

View file

@ -18,13 +18,14 @@
android:layout_height="match_parent"
tools:context=".ui.activities.MainActivity"
android:fitsSystemWindows="false">
<FrameLayout
android:id="@+id/fragment_container"
<fragment
android:id="@+id/nav_host_fragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
app:layout_behavior="@string/appbar_scrolling_view_behavior"
app:defaultNavHost="true"
app:navGraph="@navigation/navigation" />
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/appbar"
android:layout_width="match_parent"
@ -132,7 +133,7 @@
app:bb_badgesHideWhenActive="true"
app:bb_badgeBackgroundColor="@color/brand_400"
android:layout_gravity="bottom"
android:layout_margin="0dp"
android:layout_marginBottom="-5dp"
/>
</LinearLayout>

View file

@ -0,0 +1,199 @@
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/navigation"
app:startDestination="@id/tasksFragment">
<fragment
android:id="@+id/equipmentOverviewFragment"
android:name="com.habitrpg.android.habitica.ui.fragments.inventory.equipment.EquipmentOverviewFragment"
android:label="@string/sidebar.equipment" >
<action
android:id="@+id/openEquipmentDetail"
app:destination="@id/equipmentDetailFragment" />
</fragment>
<fragment
android:id="@+id/equipmentDetailFragment"
android:name="com.habitrpg.android.habitica.ui.fragments.inventory.equipment.EquipmentDetailFragment"
android:label="@string/sidebar.equipment" >
<argument
android:name="type"
app:argType="string" />
<argument android:name="isCostume"
app:argType="boolean"/>
<argument
android:name="equippedGear"
app:argType="string" />
</fragment>
<fragment
android:id="@+id/tasksFragment"
android:name="com.habitrpg.android.habitica.ui.fragments.tasks.TasksFragment">
<deepLink app:uri="habitica.com/tasks" />
</fragment>
<fragment
android:id="@+id/partyFragment"
android:name="com.habitrpg.android.habitica.ui.fragments.social.party.PartyFragment"
android:label="@string/sidebar.party">
<deepLink app:uri="habitica.com/party" />
</fragment>
<fragment
android:id="@+id/skillsFragment"
android:name="com.habitrpg.android.habitica.ui.fragments.skills.SkillsFragment"
android:label="@string/sidebar.skills" />
<fragment
android:id="@+id/statsFragment"
android:name="com.habitrpg.android.habitica.ui.fragments.StatsFragment"
android:label="@string/stats" />
<fragment
android:id="@+id/tavernFragment"
android:name="com.habitrpg.android.habitica.ui.fragments.social.TavernFragment"
android:label="@string/sidebar.tavern" />
<fragment
android:id="@+id/guildsOverviewFragment"
android:name="com.habitrpg.android.habitica.ui.fragments.social.GuildsOverviewFragment"
android:label="@string/sidebar.guilds" >
<action
android:id="@+id/openGuildDetail"
app:destination="@id/guildFragment" >
<argument
android:name="isMember"
android:defaultValue="true" />
</action>
<action
android:id="@+id/openPublicGuilds"
app:destination="@id/publicGuildsFragment" />
</fragment>
<fragment
android:id="@+id/challengesOverviewFragment"
android:name="com.habitrpg.android.habitica.ui.fragments.social.challenges.ChallengesOverviewFragment"
android:label="@string/sidebar.challenges" />
<fragment
android:id="@+id/shopsFragment"
android:name="com.habitrpg.android.habitica.ui.fragments.inventory.shops.ShopsFragment"
android:label="@string/sidebar_shops" />
<fragment
android:id="@+id/avatarOverviewFragment"
android:name="com.habitrpg.android.habitica.ui.fragments.inventory.customization.AvatarOverviewFragment"
android:label="@string/sidebar.avatar" >
<action
android:id="@+id/openAvatarDetail"
app:destination="@id/avatarCustomizationFragment" />
</fragment>
<fragment
android:id="@+id/itemsFragment"
android:name="com.habitrpg.android.habitica.ui.fragments.inventory.items.ItemsFragment"
android:label="@string/sidebar_items" />
<fragment
android:id="@+id/stableFragment"
android:name="com.habitrpg.android.habitica.ui.fragments.inventory.stable.StableFragment"
android:label="@string/sidebar.stable" >
<action
android:id="@+id/openPetDetail"
app:destination="@id/petDetailRecyclerFragment" />
<action
android:id="@+id/openMountDetail"
app:destination="@id/mountDetailRecyclerFragment" />
</fragment>
<activity
android:id="@+id/gemPurchaseActivity"
android:name="com.habitrpg.android.habitica.ui.activities.GemPurchaseActivity"
android:label="GemPurchaseActivity" />
<fragment
android:id="@+id/newsFragment"
android:name="com.habitrpg.android.habitica.ui.fragments.NewsFragment"
android:label="@string/sidebar.news" />
<fragment
android:id="@+id/FAQOverviewFragment"
android:name="com.habitrpg.android.habitica.ui.fragments.faq.FAQOverviewFragment"
android:label="@string/sidebar_help" >
<action
android:id="@+id/openFAQDetail"
app:destination="@id/FAQDetailFragment" />
</fragment>
<fragment
android:id="@+id/aboutFragment"
android:name="com.habitrpg.android.habitica.ui.fragments.AboutFragment"
android:label="@string/sidebar.about" />
<fragment
android:id="@+id/inboxFragment"
android:name="com.habitrpg.android.habitica.ui.fragments.social.InboxFragment"
android:label="@string/sidebar.inbox" >
<action
android:id="@+id/action_inboxFragment_to_inboxMessageListFragment"
app:destination="@id/inboxMessageListFragment" />
</fragment>
<fragment
android:id="@+id/guildFragment"
android:name="com.habitrpg.android.habitica.ui.fragments.social.GuildFragment"
android:label="@string/guild" >
<argument
android:name="groupID"
app:argType="string" />
<argument
android:name="isMember"
app:argType="boolean" />
</fragment>
<fragment
android:id="@+id/publicGuildsFragment"
android:name="com.habitrpg.android.habitica.ui.fragments.social.PublicGuildsFragment"
android:label="@string/public_guilds" >
<action
android:id="@+id/openGuildDetail"
app:destination="@id/guildFragment" />
</fragment>
<fragment
android:id="@+id/FAQDetailFragment"
android:name="com.habitrpg.android.habitica.ui.fragments.faq.FAQDetailFragment"
android:label="@string/sidebar_help" >
<argument
android:name="position"
app:argType="integer" />
</fragment>
<fragment
android:id="@+id/avatarCustomizationFragment"
android:name="com.habitrpg.android.habitica.ui.fragments.inventory.customization.AvatarCustomizationFragment"
android:label="@string/sidebar.avatar" >
<argument
android:name="type"
app:argType="string" />
<argument
android:name="category"
app:argType="string" />
</fragment>
<activity
android:id="@+id/prefsActivity"
android:name="com.habitrpg.android.habitica.ui.activities.PrefsActivity"
android:label="activity_prefs"
tools:layout="@layout/activity_prefs" />
<fragment
android:id="@+id/inboxMessageListFragment"
android:name="com.habitrpg.android.habitica.ui.fragments.social.InboxMessageListFragment"
android:label="InboxMessageListFragment" >
<argument
android:name="userID"
app:argType="string" />
</fragment>
<fragment
android:id="@+id/petDetailRecyclerFragment"
android:name="com.habitrpg.android.habitica.ui.fragments.inventory.stable.PetDetailRecyclerFragment"
android:label="PetDetailRecyclerFragment" >
<argument
android:name="type"
app:argType="string" />
<argument
android:name="group"
app:argType="string" />
</fragment>
<fragment
android:id="@+id/mountDetailRecyclerFragment"
android:name="com.habitrpg.android.habitica.ui.fragments.inventory.stable.MountDetailRecyclerFragment"
android:label="MountDetailRecyclerFragment" >
<argument
android:name="type"
app:argType="string" />
<argument
android:name="group"
app:argType="string" />
</fragment>
</navigation>

View file

@ -2,7 +2,7 @@
<resources>
<style name="GemPurchaseListItem">
<item name="android:textColor">@color/brand_100</item>
<item name="android:textColor">@color/brand_300</item>
<item name="android:gravity">center_horizontal</item>
<item name="android:textSize">12sp</item>
<item name="android:drawableLeft">@drawable/ic_check_purple</item>

View file

@ -93,8 +93,8 @@
<dimen name="task_icon_space">12dp</dimen>
<dimen name="task_icon_size">18dp</dimen>
<dimen name="task_info_bar_bottom_space">-8dp</dimen>
<dimen name="pill_horizontal_padding">12dp</dimen>
<dimen name="pill_vertical_padding">4dp</dimen>
<dimen name="pill_horizontal_padding">10dp</dimen>
<dimen name="pill_vertical_padding">2dp</dimen>
<dimen name="button_padding">32dp</dimen>
<dimen name="button_padding_small">16dp</dimen>
<dimen name="button_padding_vertical_small">4dp</dimen>

View file

@ -827,7 +827,7 @@
<string name="username_not_confirmed">Username not confirmed</string>
<string name="username_confirmed">Username Confirmed</string>
<string name="username_level">\@%s ・Lvl %d</string>
<string name="enter_recipient_username">Enter a Recipient\'s username</string>
<string name="enter_recipient_username">Enter a Recipient\'s @ username</string>
<string name="username_copied">Username copied to clipboard</string>
<string name="verification_pet">One of these Veteran Pets will be waiting for you after youve finished confirming!</string>
<string name="welcomeNameTitle">What should we call you?</string>
@ -840,4 +840,9 @@
<string name="equipment_con">CON:</string>
<string name="equipment_int">INT:</string>
<string name="equipment_per">PER:</string>
<string name="visit_website">visit website</string>
<string name="subscribe_gift_description">Want to give the benefits of a subscription to someone else?</string>
<string name="gift_subscription">Gift a Subscription</string>
<string name="gift_one_get_one_description">Gift a sub and get a sub free event going on now!</string>
<string name="gift_title">Who would you like to gift to?</string>
</resources>

View file

@ -184,12 +184,12 @@
</style>
<style name="GemPurchaseListItem">
<item name="android:textColor">@color/brand_100</item>
<item name="android:textColor">@color/brand_300</item>
<item name="android:gravity">center_horizontal</item>
<item name="android:textSize">12sp</item>
<item name="android:drawableLeft">@drawable/ic_check_purple_24dp</item>
<item name="android:layout_gravity">center</item>
<item name="android:drawablePadding">4dp</item>
<item name="android:drawablePadding">8dp</item>
</style>
<style name="SubscriptionListTitle" parent="GemPurchaseListItem">
@ -216,7 +216,7 @@
</style>
<style name="Pill">
<item name="android:textSize">11sp</item>
<item name="android:textSize">10sp</item>
<item name="android:background">@drawable/pill_bg_gray</item>
<item name="android:paddingRight">@dimen/pill_horizontal_padding</item>
<item name="android:paddingLeft">@dimen/pill_horizontal_padding</item>
@ -249,8 +249,8 @@
<item name="android:background">@color/habit_inactive_gray</item>
<item name="android:paddingTop">8dp</item>
<item name="android:paddingBottom">8dp</item>
<item name="android:paddingLeft">12dp</item>
<item name="android:paddingRight">12dp</item>
<item name="android:paddingLeft">18dp</item>
<item name="android:paddingRight">18dp</item>
<item name="android:layout_marginBottom">8dp</item>
</style>
@ -264,6 +264,10 @@
<style name="subscriptionBoxText.Subtitle">
<item name="android:textSize">11sp</item>
<item name="android:fontFamily" tools:targetApi="jelly_bean">
@string/font_family_regular
</item>
<item name="android:textColor">@color/gray_50</item>
</style>
<style name="subscriptionBoxText.Title.Red">

View file

@ -7,5 +7,5 @@ import io.realm.RealmResults
interface FAQRepository : BaseRepository {
fun getArticles(): Flowable<RealmResults<FAQArticle>>
fun getArticle(position: Int): Flowable<FAQArticle>
}

View file

@ -10,6 +10,9 @@ import io.realm.RealmResults
class FAQRepositoryImpl(localRepository: FAQLocalRepository, apiClient: ApiClient, userID: String) : ContentRepositoryImpl<FAQLocalRepository>(localRepository, apiClient, userID), FAQRepository {
override fun getArticle(position: Int): Flowable<FAQArticle> {
return localRepository.getArticle(position)
}
override fun getArticles(): Flowable<RealmResults<FAQArticle>> {
return localRepository.articles

View file

@ -6,6 +6,7 @@ import io.reactivex.Flowable
import io.realm.RealmResults
interface FAQLocalRepository : ContentLocalRepository {
fun getArticle(position: Int): Flowable<FAQArticle>
val articles: Flowable<RealmResults<FAQArticle>>
}

View file

@ -4,9 +4,18 @@ import com.habitrpg.android.habitica.data.local.FAQLocalRepository
import com.habitrpg.android.habitica.models.FAQArticle
import io.reactivex.Flowable
import io.realm.Realm
import io.realm.RealmObject.asFlowable
import io.realm.RealmResults
class RealmFAQLocalRepository(realm: Realm) : RealmContentLocalRepository(realm), FAQLocalRepository {
override fun getArticle(position: Int): Flowable<FAQArticle> {
return realm.where(FAQArticle::class.java)
.equalTo("position", position)
.findAll()
.asFlowable()
.filter{ it.isLoaded && it.count() > 0 }
.map { it.first() }
}
override val articles: Flowable<RealmResults<FAQArticle>>
get() = realm.where(FAQArticle::class.java)

View file

@ -1,7 +0,0 @@
package com.habitrpg.android.habitica.events.commands;
/**
* Created by Negue on 29.11.2015.
*/
public class OpenGemPurchaseFragmentCommand {
}

View file

@ -1,15 +0,0 @@
package com.habitrpg.android.habitica.events.commands;
/**
* Created by viirus on 15/01/16.
*/
public class OpenMenuItemCommand {
public String identifier;
public OpenMenuItemCommand(String identifier) {
this.identifier = identifier;
}
public OpenMenuItemCommand() {
}
}

View file

@ -0,0 +1,25 @@
package com.habitrpg.android.habitica.helpers
import android.os.Bundle
import androidx.navigation.NavController
import androidx.navigation.NavDirections
import androidx.navigation.NavOptions
import com.habitrpg.android.habitica.ui.fragments.social.PublicGuildsFragmentDirections
import java.lang.ref.WeakReference
object MainNavigationController {
var navController: WeakReference<NavController>? = null
fun setup(navController: NavController) {
this.navController = WeakReference(navController)
}
fun navigate(transactionId: Int, args: Bundle? = null) {
navController?.get()?.navigate(transactionId, args)
}
fun navigate(directions: NavDirections) {
navController?.get()?.navigate(directions)
}
}

View file

@ -1,6 +1,9 @@
package com.habitrpg.android.habitica.helpers
import android.content.Intent
import android.os.Bundle
import androidx.core.os.bundleOf
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.helpers.notifications.PushNotificationManager
import com.habitrpg.android.habitica.models.user.User
import com.habitrpg.android.habitica.ui.activities.MainActivity
@ -16,59 +19,47 @@ class NotificationOpenHandler {
companion object {
fun handleOpenedByNotification(identifier: String, intent: Intent, activity: MainActivity, user: User?) {
fun handleOpenedByNotification(identifier: String, intent: Intent, user: User?) {
when (identifier) {
PushNotificationManager.PARTY_INVITE_PUSH_NOTIFICATION_KEY -> openPartyScreen(activity)
PushNotificationManager.QUEST_BEGUN_PUSH_NOTIFICATION_KEY -> openQuestDetailSCreen(activity,
user?.party?.id,
PushNotificationManager.PARTY_INVITE_PUSH_NOTIFICATION_KEY -> openPartyScreen()
PushNotificationManager.QUEST_BEGUN_PUSH_NOTIFICATION_KEY -> openQuestDetailSCreen(user?.party?.id,
user?.party?.quest?.key)
PushNotificationManager.QUEST_INVITE_PUSH_NOTIFICATION_KEY -> openQuestDetailSCreen(activity,
user?.party?.id,
PushNotificationManager.QUEST_INVITE_PUSH_NOTIFICATION_KEY -> openQuestDetailSCreen(user?.party?.id,
user?.party?.quest?.key)
PushNotificationManager.GUILD_INVITE_PUSH_NOTIFICATION_KEY -> openGuildDetailScreen(activity,
intent.getStringExtra("groupID"))
PushNotificationManager.RECEIVED_PRIVATE_MESSAGE_PUSH_NOTIFICATION_KEY -> openPrivateMessageScreen(activity,
intent.getStringExtra("replyTo"))
PushNotificationManager.CHANGE_USERNAME_PUSH_NOTIFICATION_KEY -> openSettingsScreen(activity)
PushNotificationManager.GUILD_INVITE_PUSH_NOTIFICATION_KEY -> openGuildDetailScreen(intent.getStringExtra("groupID"))
PushNotificationManager.RECEIVED_PRIVATE_MESSAGE_PUSH_NOTIFICATION_KEY -> openPrivateMessageScreen(intent.getStringExtra("replyTo"))
PushNotificationManager.CHANGE_USERNAME_PUSH_NOTIFICATION_KEY -> openSettingsScreen()
}
}
private fun openPrivateMessageScreen(activity: MainActivity, userID: String?) {
private fun openPrivateMessageScreen(userID: String?) {
if (userID?.isNotEmpty() == true) {
return
}
val fragment = InboxFragment()
fragment.userId = userID ?: ""
activity.displayFragment(fragment)
MainNavigationController.navigate(R.id.inboxFragment, bundleOf("userId" to userID))
}
private fun openPartyScreen(activity: MainActivity) {
activity.selectMenuItem(NavigationDrawerFragment.SIDEBAR_PARTY)
private fun openPartyScreen() {
MainNavigationController.navigate(R.id.partyFragment)
}
private fun openQuestDetailSCreen(activity: MainActivity, partyId: String?, questKey: String?) {
private fun openQuestDetailSCreen(partyId: String?, questKey: String?) {
if (partyId?.isNotEmpty() == true || questKey?.isNotEmpty() == true) {
return
}
val fragment = QuestDetailFragment()
fragment.partyId = partyId
fragment.questKey = questKey
activity.displayFragment(fragment)
MainNavigationController.navigate(R.id.inboxFragment, bundleOf("partyId" to partyId, "questKey" to questKey))
}
private fun openGuildDetailScreen(activity: MainActivity, groupID: String) {
private fun openGuildDetailScreen(groupID: String) {
if (groupID.isEmpty()) {
return
}
val fragment = GuildFragment()
fragment.setGuildId(groupID)
activity.displayFragment(fragment)
MainNavigationController.navigate(R.id.guildFragment, bundleOf("groupId" to groupID))
}
private fun openSettingsScreen(activity: MainActivity) {
val passUserId = Intent(activity, PrefsActivity::class.java)
passUserId.putExtra("userId", activity.userID)
activity.startActivity(passUserId)
private fun openSettingsScreen() {
MainNavigationController.navigate(R.id.prefsActivity)
}
}
}

View file

@ -10,19 +10,16 @@ import android.widget.TextView
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.data.UserRepository
import com.habitrpg.android.habitica.events.BoughtGemsEvent
import com.habitrpg.android.habitica.events.commands.OpenGemPurchaseFragmentCommand
import com.habitrpg.android.habitica.events.commands.OpenMenuItemCommand
import com.habitrpg.android.habitica.helpers.HealthFormatter
import com.habitrpg.android.habitica.helpers.MainNavigationController
import com.habitrpg.android.habitica.models.Avatar
import com.habitrpg.android.habitica.models.user.Stats
import com.habitrpg.android.habitica.models.user.User
import com.habitrpg.android.habitica.ui.fragments.NavigationDrawerFragment
import com.habitrpg.android.habitica.ui.helpers.bindView
import com.habitrpg.android.habitica.ui.views.CurrencyViews
import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper
import com.habitrpg.android.habitica.ui.views.ValueBar
import io.reactivex.disposables.Disposable
import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
import java.util.*
@ -99,12 +96,10 @@ class AvatarWithBarsViewModel(private val context: Context, view: View, userRepo
}
currencyView.setOnClickListener {
EventBus.getDefault().post(OpenGemPurchaseFragmentCommand())
MainNavigationController.navigate(R.id.gemPurchaseActivity)
}
avatarView.setOnClickListener {
val event = OpenMenuItemCommand()
event.identifier = NavigationDrawerFragment.SIDEBAR_AVATAR
EventBus.getDefault().post(event)
MainNavigationController.navigate(R.id.avatarOverviewFragment)
}
}

View file

@ -30,6 +30,8 @@ import android.view.*
import android.widget.FrameLayout
import android.widget.TextView
import androidx.core.content.edit
import androidx.navigation.findNavController
import androidx.navigation.fragment.NavHostFragment
import com.facebook.drawee.view.SimpleDraweeView
import com.habitrpg.android.habitica.HabiticaBaseApplication
import com.habitrpg.android.habitica.R
@ -221,7 +223,6 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction {
drawerFragment = supportFragmentManager.findFragmentById(R.id.navigation_drawer) as? NavigationDrawerFragment
drawerFragment?.setUp(R.id.navigation_drawer, drawerLayout)
selectMenuItem(NavigationDrawerFragment.SIDEBAR_TASKS)
drawerToggle = object : ActionBarDrawerToggle(
this, /* host Activity */
@ -240,6 +241,17 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction {
keyboardUtil = KeyboardUtil(this, this.findViewById(android.R.id.content))
this.keyboardUtil?.enable()
val navigationController = findNavController(R.id.nav_host_fragment)
navigationController.addOnNavigatedListener { _, destination ->
if (destination.label.isNullOrEmpty()) {
toolbarTitleTextView.text = user?.profile?.name
} else if (user?.profile != null) {
toolbarTitleTextView.text = destination.label
}
drawerFragment?.setSelection(destination.id, false)
}
MainNavigationController.setup(navigationController)
}
override fun onPostCreate(savedInstanceState: Bundle?) {
@ -313,7 +325,7 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction {
val additionalData = HashMap<String, Any>()
additionalData["identifier"] = identifier
AmplitudeManager.sendEvent("open notification", AmplitudeManager.EVENT_CATEGORY_BEHAVIOUR, AmplitudeManager.EVENT_HITTYPE_EVENT, additionalData)
NotificationOpenHandler.handleOpenedByNotification(identifier, intent, this, user)
NotificationOpenHandler.handleOpenedByNotification(identifier, intent, user)
}
}
@ -352,6 +364,21 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction {
sendBroadcast(intent)
}
public fun makeActiveFragment(fragment: BaseMainFragment) {
this.activeFragment = WeakReference(fragment)
fragment.user = user
fragment.activity = this
fragment.tabLayout = detailTabs
fragment.toolbarAccessoryContainer = toolbarAccessoryContainer
fragment.collapsingToolbar = collapsingToolbar
fragment.bottomNavigation = bottomNavigation
fragment.floatingMenuWrapper = floatingMenuWrapper
}
fun navigate(transitionId: Int) {
findNavController(R.id.nav_host_fragment).navigate(transitionId)
}
@SuppressLint("ObsoleteSdkInt")
fun displayFragment(fragment: BaseMainFragment) {
if (fragment.javaClass == this.activeFragment?.get()?.javaClass) {
@ -360,18 +387,10 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction {
if (SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 && this.isDestroyed) {
return
}
this.activeFragment = WeakReference(fragment)
fragment.arguments = intent.extras
fragment.user = user
fragment.activity = this
fragment.tabLayout = detailTabs
fragment.toolbarAccessoryContainer = toolbarAccessoryContainer
fragment.collapsingToolbar = collapsingToolbar
fragment.bottomNavigation = bottomNavigation
fragment.floatingMenuWrapper = floatingMenuWrapper
makeActiveFragment(fragment)
if (supportFragmentManager.fragments == null) {
/*if (supportFragmentManager.fragments == null) {
supportFragmentManager.beginTransaction().add(R.id.fragment_container, fragment).commitAllowingStateLoss()
} else {
val transaction = supportFragmentManager.beginTransaction()
@ -381,7 +400,7 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction {
transaction.addToBackStack(null)
}
transaction.commitAllowingStateLoss()
}
}*/
}
private fun setUserData() {
@ -392,11 +411,7 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction {
preferences?.sound.notNull { soundManager.soundTheme = it }
runOnUiThread {
updateSidebar()
if (activeFragment != null && activeFragment?.get() != null) {
activeFragment?.get()?.updateUserData(user)
} else {
selectMenuItem(NavigationDrawerFragment.SIDEBAR_TASKS)
}
activeFragment?.get()?.updateUserData(user)
}
displayDeathDialogIfNeeded()
@ -455,26 +470,6 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction {
}
}
fun setActiveFragment(fragment: BaseMainFragment?) {
this.activeFragment = WeakReference<BaseMainFragment>(fragment)
setTranslatedFragmentTitle(fragment)
val identifier = activeFragment?.get()?.fragmentSidebarIdentifier
if (identifier != null) {
selectMenuItem(identifier, false)
}
}
private fun setTranslatedFragmentTitle(fragment: BaseMainFragment?) {
if (supportActionBar == null) {
return
}
if (fragment?.customTitle()?.isNotEmpty() != true) {
toolbarTitleTextView.text = user?.profile?.name
} else if (user?.profile != null) {
toolbarTitleTextView.text = fragment.customTitle()
}
}
override fun onBackPressed() {
if (this.activeTutorialView != null) {
this.removeActiveTutorialView()
@ -509,11 +504,6 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction {
super.onDestroy()
}
@Subscribe
fun onEvent(event: OpenMenuItemCommand) {
drawerFragment?.setSelection(event.identifier, true)
}
@Subscribe
@Suppress("ReturnCount")
fun onEvent(event: BuyRewardCommand) {
@ -572,11 +562,6 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction {
.subscribe(Consumer { }, RxErrorHandler.handleEmptyError())
}
@Subscribe
fun openGemPurchaseFragment(event: OpenGemPurchaseFragmentCommand?) {
drawerFragment?.setSelection(NavigationDrawerFragment.SIDEBAR_PURCHASE, true)
}
@Subscribe
fun onEvent(tutorialEvent: DisplayTutorialEvent) {
if (tutorialEvent.tutorialText != null) {
@ -586,11 +571,6 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction {
}
}
@Subscribe
fun onEvent(event: DisplayFragmentEvent) {
this.displayFragment(event.fragment)
}
@Subscribe
fun onEvent(event: HatchingCommand) {
if (event.usingEgg == null || event.usingHatchingPotion == null) {
@ -936,7 +916,7 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction {
}
public fun selectMenuItem(identifier: String, openSelection: Boolean = true) {
drawerFragment?.setSelection(identifier, openSelection)
//drawerFragment?.setSelection(identifier, openSelection)
}
companion object {

View file

@ -3,26 +3,22 @@ package com.habitrpg.android.habitica.ui.adapter
import android.content.Context
import androidx.core.content.ContextCompat
import androidx.appcompat.app.AlertDialog
import androidx.cardview.widget.CardView
import androidx.recyclerview.widget.RecyclerView
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.*
import com.facebook.drawee.view.SimpleDraweeView
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.events.commands.OpenMenuItemCommand
import com.habitrpg.android.habitica.ui.helpers.bindView
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.helpers.MainNavigationController
import com.habitrpg.android.habitica.models.inventory.Customization
import com.habitrpg.android.habitica.models.inventory.CustomizationSet
import com.habitrpg.android.habitica.ui.fragments.NavigationDrawerFragment
import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils
import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper
import io.reactivex.BackpressureStrategy
import io.reactivex.Flowable
import io.reactivex.subjects.PublishSubject
import org.greenrobot.eventbus.EventBus
import java.util.*
class CustomizationRecyclerViewAdapter : androidx.recyclerview.widget.RecyclerView.Adapter<androidx.recyclerview.widget.RecyclerView.ViewHolder>() {
@ -181,9 +177,7 @@ class CustomizationRecyclerViewAdapter : androidx.recyclerview.widget.RecyclerVi
val dialog = AlertDialog.Builder(itemView.context)
.setPositiveButton(R.string.purchase_button) { _, _ ->
if (customization?.price ?: 0 > gemBalance) {
val event = OpenMenuItemCommand()
event.identifier = NavigationDrawerFragment.SIDEBAR_PURCHASE
EventBus.getDefault().post(event)
MainNavigationController.navigate(R.id.gemPurchaseActivity)
return@setPositiveButton
}
@ -239,9 +233,7 @@ class CustomizationRecyclerViewAdapter : androidx.recyclerview.widget.RecyclerVi
val dialog = AlertDialog.Builder(context)
.setPositiveButton(R.string.purchase_button) { _, _ ->
if (set?.price ?: 0 > gemBalance) {
val event = OpenMenuItemCommand()
event.identifier = NavigationDrawerFragment.SIDEBAR_PURCHASE
EventBus.getDefault().post(event)
MainNavigationController.navigate(R.id.gemPurchaseActivity)
return@setPositiveButton
}
set?.customizations = ArrayList()

View file

@ -1,6 +1,5 @@
package com.habitrpg.android.habitica.ui.adapter
import androidx.recyclerview.widget.RecyclerView
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
@ -8,9 +7,10 @@ import android.widget.Button
import android.widget.TextView
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.helpers.MainNavigationController
import com.habitrpg.android.habitica.models.FAQArticle
import com.habitrpg.android.habitica.ui.activities.MainActivity
import com.habitrpg.android.habitica.ui.fragments.faq.FAQDetailFragment
import com.habitrpg.android.habitica.ui.fragments.faq.FAQOverviewFragmentDirections
import com.habitrpg.android.habitica.ui.helpers.bindView
import io.reactivex.BackpressureStrategy
import io.reactivex.Flowable
@ -77,11 +77,9 @@ class FAQOverviewRecyclerAdapter : androidx.recyclerview.widget.RecyclerView.Ada
}
override fun onClick(v: View) {
val fragment = FAQDetailFragment()
article.notNull {
fragment.setArticle(it)
MainNavigationController.navigate(FAQOverviewFragmentDirections.openFAQDetail(it.position))
}
activity?.displayFragment(fragment)
}
}

View file

@ -32,25 +32,29 @@ class NavigationDrawerAdapter(tintColor: Int, backgroundTintColor: Int): android
internal val items: MutableList<HabiticaDrawerItem> = ArrayList()
var selectedItem: String? = null
var selectedItem: Int? = null
set(value) {
field = value
notifyDataSetChanged()
}
private val itemSelectedEvents = PublishSubject.create<String>()
private val itemSelectedEvents = PublishSubject.create<Int>()
fun getItemSelectionEvents(): Flowable<String> = itemSelectedEvents.toFlowable(BackpressureStrategy.DROP)
fun getItemSelectionEvents(): Flowable<Int> = itemSelectedEvents.toFlowable(BackpressureStrategy.DROP)
fun getItemWithTransitionId(transitionId: Int): HabiticaDrawerItem? =
items.find { it.transitionId == transitionId }
fun getItemWithIdentifier(identifier: String): HabiticaDrawerItem? =
items.find { it.identifier == identifier }
private fun getItemPosition(transitionId: Int): Int =
items.indexOfFirst { it.transitionId == transitionId }
private fun getItemPosition(identifier: String): Int =
items.indexOfFirst { it.identifier == identifier }
fun updateItem(item: HabiticaDrawerItem) {
val position = getItemPosition(item.identifier)
val position = getItemPosition(item.transitionId)
items[position] = item
notifyDataSetChanged()
}
@ -64,13 +68,14 @@ class NavigationDrawerAdapter(tintColor: Int, backgroundTintColor: Int): android
override fun onBindViewHolder(holder: androidx.recyclerview.widget.RecyclerView.ViewHolder, position: Int) {
val drawerItem = getItem(position)
if (getItemViewType(position) == 0) {
(holder as DrawerItemViewHolder?)?.tintColor = tintColor
holder.backgroundTintColor = backgroundTintColor
holder.bind(drawerItem, drawerItem.identifier == selectedItem)
holder.itemView.setOnClickListener { itemSelectedEvents.onNext(drawerItem.identifier) }
val itemHolder = holder as? DrawerItemViewHolder
itemHolder?.tintColor = tintColor
itemHolder?.backgroundTintColor = backgroundTintColor
itemHolder?.bind(drawerItem, drawerItem.transitionId == selectedItem)
itemHolder?.itemView?.setOnClickListener { itemSelectedEvents.onNext(drawerItem.transitionId) }
} else {
(holder as SectionHeaderViewHolder?)?.backgroundTintColor = backgroundTintColor
holder.bind(drawerItem)
(holder as? SectionHeaderViewHolder)?.backgroundTintColor = backgroundTintColor
(holder as? SectionHeaderViewHolder)?.bind(drawerItem)
}
}

View file

@ -1,7 +1,6 @@
package com.habitrpg.android.habitica.ui.adapter.inventory
import android.content.Context
import androidx.recyclerview.widget.RecyclerView
import android.text.Html
import android.text.method.LinkMovementMethod
import android.view.View
@ -9,10 +8,10 @@ import android.view.ViewGroup
import android.widget.Button
import android.widget.TextView
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.events.commands.OpenGemPurchaseFragmentCommand
import com.habitrpg.android.habitica.ui.helpers.bindView
import com.habitrpg.android.habitica.extensions.inflate
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.helpers.MainNavigationController
import com.habitrpg.android.habitica.models.inventory.Item
import com.habitrpg.android.habitica.models.shops.Shop
import com.habitrpg.android.habitica.models.shops.ShopCategory
@ -21,7 +20,6 @@ import com.habitrpg.android.habitica.models.user.User
import com.habitrpg.android.habitica.ui.viewHolders.SectionViewHolder
import com.habitrpg.android.habitica.ui.viewHolders.ShopItemViewHolder
import com.habitrpg.android.habitica.ui.views.NPCBannerView
import org.greenrobot.eventbus.EventBus
class ShopRecyclerAdapter : androidx.recyclerview.widget.RecyclerView.Adapter<androidx.recyclerview.widget.RecyclerView.ViewHolder>() {
@ -247,7 +245,7 @@ class ShopRecyclerAdapter : androidx.recyclerview.widget.RecyclerView.Adapter<an
private val subscribeButton: Button? by bindView(itemView, R.id.subscribeButton)
private val textView: TextView? by bindView(itemView, R.id.textView)
init {
subscribeButton?.setOnClickListener { EventBus.getDefault().post(OpenGemPurchaseFragmentCommand()) }
subscribeButton?.setOnClickListener { MainNavigationController.navigate(R.id.gemPurchaseActivity) }
}
var text: String? = null

View file

@ -8,11 +8,13 @@ import android.widget.TextView
import com.facebook.drawee.view.SimpleDraweeView
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.helpers.MainNavigationController
import com.habitrpg.android.habitica.ui.helpers.bindView
import com.habitrpg.android.habitica.models.inventory.Animal
import com.habitrpg.android.habitica.ui.activities.MainActivity
import com.habitrpg.android.habitica.ui.fragments.inventory.stable.MountDetailRecyclerFragment
import com.habitrpg.android.habitica.ui.fragments.inventory.stable.PetDetailRecyclerFragment
import com.habitrpg.android.habitica.ui.fragments.inventory.stable.StableFragmentDirections
import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils
import com.habitrpg.android.habitica.ui.viewHolders.SectionViewHolder
@ -94,15 +96,13 @@ class StableRecyclerAdapter : androidx.recyclerview.widget.RecyclerView.Adapter<
if (animal != null) {
if (animal.numberOwned > 0) {
if (itemType == "pets") {
MainNavigationController.navigate(StableFragmentDirections.openPetDetail(animal.animal, animal.animalGroup))
val fragment = PetDetailRecyclerFragment()
fragment.animalType = animal.animal
fragment.animalGroup = animal.animalGroup
activity?.displayFragment(fragment)
} else {
val fragment = MountDetailRecyclerFragment()
fragment.animalType = animal.animal
fragment.animalGroup = animal.animalGroup
activity?.displayFragment(fragment)
MainNavigationController.navigate(StableFragmentDirections.openMountDetail(animal.animal, animal.animalGroup))
}
}
}

View file

@ -135,6 +135,7 @@ class ChatRecyclerViewAdapter(data: OrderedRealmCollection<ChatMessage>?, autoUp
messageText.setOnClickListener { _ -> expandMessage() }
messageText.movementMethod = LinkMovementMethod.getInstance()
userLabel.setOnClickListener { _ -> chatMessage?.uuid.notNull {userLabelClickEvents.onNext(it) } }
avatarView.setOnClickListener { _ -> chatMessage?.uuid.notNull {userLabelClickEvents.onNext(it) } }
replyButton.setOnClickListener { _ ->
if (releasedUsernames && chatMessage?.username != null) {
chatMessage?.username.notNull { replyMessageEvents.onNext(it) }

View file

@ -12,9 +12,12 @@ import com.habitrpg.android.habitica.data.ApiClient
import com.habitrpg.android.habitica.events.DisplayFragmentEvent
import com.habitrpg.android.habitica.extensions.inflate
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.helpers.MainNavigationController
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.models.social.Group
import com.habitrpg.android.habitica.ui.fragments.social.GuildFragment
import com.habitrpg.android.habitica.ui.fragments.social.GuildsOverviewFragmentDirections
import com.habitrpg.android.habitica.ui.fragments.social.PublicGuildsFragmentDirections
import com.habitrpg.android.habitica.ui.helpers.MarkdownParser
import com.habitrpg.android.habitica.ui.helpers.bindView
import io.reactivex.functions.Consumer
@ -36,12 +39,7 @@ class PublicGuildsRecyclerViewAdapter(data: OrderedRealmCollection<Group>?, auto
val guildViewHolder = GuildViewHolder(parent.inflate(R.layout.item_public_guild))
guildViewHolder.itemView.setOnClickListener { v ->
val guild = v.tag as? Group ?: return@setOnClickListener
val guildFragment = GuildFragment()
guildFragment.setGuildId(guild.id)
guildFragment.isMember = isInGroup(guild)
val event = DisplayFragmentEvent()
event.fragment = guildFragment
EventBus.getDefault().post(event)
MainNavigationController.navigate(PublicGuildsFragmentDirections.openGuildDetail(guild.id, isInGroup(guild)))
}
guildViewHolder.joinLeaveButton.setOnClickListener { v ->
val guild = v.tag as? Group ?: return@setOnClickListener

View file

@ -50,6 +50,7 @@ abstract class BaseMainFragment : BaseFragment() {
if (getActivity()?.javaClass == MainActivity::class.java) {
this.activity = getActivity() as? MainActivity
activity?.makeActiveFragment(this)
}
}
@ -76,8 +77,6 @@ abstract class BaseMainFragment : BaseFragment() {
setHasOptionsMenu(true)
activity?.setActiveFragment(this)
updateTabLayoutVisibility()
return null

View file

@ -3,18 +3,14 @@ package com.habitrpg.android.habitica.ui.fragments
import android.app.ActionBar
import android.content.Intent
import android.graphics.Rect
import android.os.Build
import android.os.Bundle
import androidx.fragment.app.DialogFragment
import androidx.core.content.ContextCompat
import androidx.core.view.GravityCompat
import androidx.drawerlayout.widget.DrawerLayout
import androidx.recyclerview.widget.LinearLayoutManager
import android.view.Gravity
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.Window
import androidx.core.content.ContextCompat
import androidx.core.view.GravityCompat
import androidx.fragment.app.DialogFragment
import com.habitrpg.android.habitica.HabiticaBaseApplication
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.data.InventoryRepository
@ -50,8 +46,6 @@ import io.reactivex.disposables.CompositeDisposable
import io.reactivex.functions.Consumer
import kotlinx.android.synthetic.main.drawer_main.*
import javax.inject.Inject
import android.view.Window.ID_ANDROID_CONTENT
import androidx.core.view.ViewCompat
/**
@ -79,7 +73,7 @@ class NavigationDrawerFragment : DialogFragment() {
private var subscriptions: CompositeDisposable? = null
val isDrawerOpen: Boolean
get() = drawerLayout?.isDrawerOpen(fragmentContainerView!!) ?: false
get() = drawerLayout?.isDrawerOpen(Gravity.LEFT) ?: false
private val actionBar: ActionBar?
get() = activity?.actionBar
@ -194,7 +188,7 @@ class NavigationDrawerFragment : DialogFragment() {
}, RxErrorHandler.handleEmptyError()))
subscriptions?.add(socialRepository.getGroup(Group.TAVERN_ID)
.doOnNext({ quest = it.quest })
.doOnNext { quest = it.quest }
.filter { it.hasActiveQuest }
.flatMapMaybe { inventoryRepository.getQuestContent(it.quest?.key ?: "").firstElement() }
.subscribe(Consumer {
@ -207,8 +201,8 @@ class NavigationDrawerFragment : DialogFragment() {
questMenuView.configure(it)
}, RxErrorHandler.handleEmptyError()))
messagesButton.setOnClickListener { setSelection(SIDEBAR_INBOX) }
settingsButton.setOnClickListener { setSelection(SIDEBAR_SETTINGS) }
messagesButton.setOnClickListener { setSelection(R.id.inboxFragment) }
settingsButton.setOnClickListener { setSelection(R.id.prefsActivity) }
}
override fun onDestroy() {
@ -222,111 +216,41 @@ class NavigationDrawerFragment : DialogFragment() {
private fun initializeMenuItems() {
val items = ArrayList<HabiticaDrawerItem>()
context.notNull {context ->
items.add(HabiticaDrawerItem(SIDEBAR_TASKS, context.getString(R.string.sidebar_tasks)))
items.add(HabiticaDrawerItem(SIDEBAR_SKILLS, context.getString(R.string.sidebar_skills)))
items.add(HabiticaDrawerItem(SIDEBAR_STATS, context.getString(R.string.sidebar_stats)))
items.add(HabiticaDrawerItem(SIDEBAR_SOCIAL, context.getString(R.string.sidebar_section_social), true))
items.add(HabiticaDrawerItem(SIDEBAR_TAVERN, context.getString(R.string.sidebar_tavern)))
items.add(HabiticaDrawerItem(SIDEBAR_PARTY, context.getString(R.string.sidebar_party)))
items.add(HabiticaDrawerItem(SIDEBAR_GUILDS, context.getString(R.string.sidebar_guilds)))
items.add(HabiticaDrawerItem(SIDEBAR_CHALLENGES, context.getString(R.string.sidebar_challenges)))
items.add(HabiticaDrawerItem(SIDEBAR_INVENTORY, context.getString(R.string.sidebar_section_inventory), true))
items.add(HabiticaDrawerItem(SIDEBAR_SHOPS, context.getString(R.string.sidebar_shops)))
items.add(HabiticaDrawerItem(SIDEBAR_AVATAR, context.getString(R.string.sidebar_avatar)))
items.add(HabiticaDrawerItem(SIDEBAR_EQUIPMENT, context.getString(R.string.sidebar_equipment)))
items.add(HabiticaDrawerItem(SIDEBAR_ITEMS, context.getString(R.string.sidebar_items)))
items.add(HabiticaDrawerItem(SIDEBAR_STABLE, context.getString(R.string.sidebar_stable)))
items.add(HabiticaDrawerItem(SIDEBAR_PURCHASE, context.getString(R.string.sidebar_purchaseGems)))
items.add(HabiticaDrawerItem(SIDEBAR_ABOUT_HEADER, context.getString(R.string.sidebar_about), true))
items.add(HabiticaDrawerItem(SIDEBAR_NEWS, context.getString(R.string.sidebar_news)))
items.add(HabiticaDrawerItem(SIDEBAR_HELP, context.getString(R.string.sidebar_help)))
items.add(HabiticaDrawerItem(SIDEBAR_ABOUT, context.getString(R.string.sidebar_about)))
items.add(HabiticaDrawerItem(R.id.tasksFragment, SIDEBAR_TASKS, context.getString(R.string.sidebar_tasks)))
items.add(HabiticaDrawerItem(R.id.skillsFragment, SIDEBAR_SKILLS, context.getString(R.string.sidebar_skills)))
items.add(HabiticaDrawerItem(R.id.statsFragment, SIDEBAR_STATS, context.getString(R.string.sidebar_stats)))
items.add(HabiticaDrawerItem(0, SIDEBAR_SOCIAL, context.getString(R.string.sidebar_section_social), true))
items.add(HabiticaDrawerItem(R.id.tavernFragment, SIDEBAR_TAVERN, context.getString(R.string.sidebar_tavern)))
items.add(HabiticaDrawerItem(R.id.partyFragment, SIDEBAR_PARTY, context.getString(R.string.sidebar_party)))
items.add(HabiticaDrawerItem(R.id.guildsOverviewFragment, SIDEBAR_GUILDS, context.getString(R.string.sidebar_guilds)))
items.add(HabiticaDrawerItem(R.id.challengesOverviewFragment, SIDEBAR_CHALLENGES, context.getString(R.string.sidebar_challenges)))
items.add(HabiticaDrawerItem(0, SIDEBAR_INVENTORY, context.getString(R.string.sidebar_section_inventory), true))
items.add(HabiticaDrawerItem(R.id.shopsFragment, SIDEBAR_SHOPS, context.getString(R.string.sidebar_shops)))
items.add(HabiticaDrawerItem(R.id.avatarOverviewFragment, SIDEBAR_AVATAR, context.getString(R.string.sidebar_avatar)))
items.add(HabiticaDrawerItem(R.id.equipmentOverviewFragment, SIDEBAR_EQUIPMENT, context.getString(R.string.sidebar_equipment)))
items.add(HabiticaDrawerItem(R.id.itemsFragment, SIDEBAR_ITEMS, context.getString(R.string.sidebar_items)))
items.add(HabiticaDrawerItem(R.id.stableFragment, SIDEBAR_STABLE, context.getString(R.string.sidebar_stable)))
items.add(HabiticaDrawerItem(R.id.gemPurchaseActivity, SIDEBAR_PURCHASE, context.getString(R.string.sidebar_purchaseGems)))
items.add(HabiticaDrawerItem(0, SIDEBAR_ABOUT_HEADER, context.getString(R.string.sidebar_about), true))
items.add(HabiticaDrawerItem(R.id.newsFragment, SIDEBAR_NEWS, context.getString(R.string.sidebar_news)))
items.add(HabiticaDrawerItem(R.id.FAQOverviewFragment, SIDEBAR_HELP, context.getString(R.string.sidebar_help)))
items.add(HabiticaDrawerItem(R.id.aboutFragment, SIDEBAR_ABOUT, context.getString(R.string.sidebar_about)))
}
adapter.updateItems(items)
}
fun setSelection(identifier: String?, openSelection: Boolean = true) {
adapter.selectedItem = identifier
fun setSelection(transitionId: Int?, openSelection: Boolean = true) {
adapter.selectedItem = transitionId
closeDrawer()
if (!openSelection) {
return
}
var fragment: BaseMainFragment? = null
var newActivityClass: Class<*>? = null
when (identifier) {
SIDEBAR_TASKS -> {
fragment = TasksFragment()
}
SIDEBAR_SKILLS -> {
fragment = SkillsFragment()
}
SIDEBAR_STATS -> {
fragment = StatsFragment()
}
SIDEBAR_INBOX -> {
fragment = InboxFragment()
}
SIDEBAR_PARTY -> {
fragment = PartyFragment()
}
SIDEBAR_GUILDS -> {
fragment = GuildsOverviewFragment()
}
SIDEBAR_TAVERN -> {
fragment = TavernFragment()
}
SIDEBAR_CHALLENGES -> {
fragment = ChallengesOverviewFragment()
}
SIDEBAR_SHOPS -> {
fragment = ShopsFragment()
}
SIDEBAR_AVATAR -> {
fragment = AvatarOverviewFragment()
}
SIDEBAR_EQUIPMENT -> {
fragment = EquipmentOverviewFragment()
}
SIDEBAR_ITEMS -> {
fragment = ItemsFragment()
}
SIDEBAR_STABLE -> {
fragment = StableFragment()
}
SIDEBAR_PURCHASE -> {
newActivityClass = GemPurchaseActivity::class.java
}
SIDEBAR_NEWS -> {
fragment = NewsFragment()
}
SIDEBAR_SETTINGS -> {
newActivityClass = PrefsActivity::class.java
}
SIDEBAR_HELP -> {
fragment = FAQOverviewFragment()
}
SIDEBAR_ABOUT -> {
newActivityClass = AboutActivity::class.java
}
}
val activity = activity as? MainActivity
if (activity != null) {
if (fragment != null) {
fragment.fragmentSidebarIdentifier = identifier
activity.displayFragment(fragment)
}
if (newActivityClass != null) {
val passUserId = Intent(activity, newActivityClass)
passUserId.putExtra("userId", activity.userID)
if (identifier == SIDEBAR_PURCHASE) {
activity.startActivityForResult(passUserId, MainActivity.GEM_PURCHASE_REQUEST)
} else {
activity.startActivity(passUserId)
}
if (transitionId != null) {
activity.navigate(transitionId)
}
}
}

View file

@ -8,19 +8,24 @@ import android.view.ViewGroup
import android.widget.TextView
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.components.AppComponent
import com.habitrpg.android.habitica.data.FAQRepository
import com.habitrpg.android.habitica.extensions.inflate
import com.habitrpg.android.habitica.models.FAQArticle
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment
import com.habitrpg.android.habitica.ui.helpers.MarkdownParser
import com.habitrpg.android.habitica.ui.helpers.bindOptionalView
import com.habitrpg.android.habitica.ui.helpers.resetViews
import io.reactivex.functions.Consumer
import javax.inject.Inject
class FAQDetailFragment : BaseMainFragment() {
@Inject
lateinit var faqRepository: FAQRepository
private val questionTextView: TextView? by bindOptionalView(R.id.questionTextView)
private val answerTextView: TextView? by bindOptionalView(R.id.answerTextView)
private var article: FAQArticle? = null
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
super.onCreateView(inflater, container, savedInstanceState)
return container?.inflate(R.layout.fragment_faq_detail)
@ -31,24 +36,18 @@ class FAQDetailFragment : BaseMainFragment() {
resetViews()
if (this.article != null) {
this.questionTextView?.text = this.article?.question
this.answerTextView?.text = MarkdownParser.parseMarkdown(article?.answer)
arguments.notNull {
val args = FAQDetailFragmentArgs.fromBundle(it)
compositeSubscription.add(faqRepository.getArticle(args.position).subscribe(Consumer { faq ->
this.questionTextView?.text = faq.question
this.answerTextView?.text = MarkdownParser.parseMarkdown(faq.answer)
}, RxErrorHandler.handleEmptyError()))
}
this.answerTextView?.movementMethod = LinkMovementMethod.getInstance()
}
override fun injectFragment(component: AppComponent) {
component.inject(this)
}
fun setArticle(article: FAQArticle) {
this.article = article
if (this.questionTextView != null) {
this.questionTextView?.text = this.article?.question
}
if (this.answerTextView != null) {
this.answerTextView?.text = MarkdownParser.parseMarkdown(article.answer)
}
}
}

View file

@ -76,6 +76,13 @@ class AvatarCustomizationFragment : BaseMainFragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
arguments.notNull {
val args = AvatarCustomizationFragmentArgs.fromBundle(it)
type = args.type
if (args.category.isNotEmpty()) {
category = args.category
}
}
setGridSpanCount(view.width)
if (recyclerView.layoutManager == null) {

View file

@ -7,6 +7,7 @@ import android.view.ViewGroup
import android.widget.AdapterView
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.components.AppComponent
import com.habitrpg.android.habitica.helpers.MainNavigationController
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.models.user.User
import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment
@ -73,10 +74,7 @@ class AvatarOverviewFragment : BaseMainFragment(), AdapterView.OnItemSelectedLis
}
private fun displayCustomizationFragment(type: String, category: String?) {
val fragment = AvatarCustomizationFragment()
fragment.type = type
fragment.category = category
activity?.displayFragment(fragment)
MainNavigationController.navigate(AvatarOverviewFragmentDirections.openAvatarDetail(type, category ?: ""))
}
override fun updateUserData(user: User?) {

View file

@ -7,6 +7,7 @@ import android.view.ViewGroup
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.components.AppComponent
import com.habitrpg.android.habitica.data.InventoryRepository
import com.habitrpg.android.habitica.helpers.MainNavigationController
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment
import io.reactivex.functions.Consumer
@ -116,11 +117,7 @@ class EquipmentOverviewFragment : BaseMainFragment() {
}
private fun displayEquipmentDetailList(type: String, equipped: String?, isCostume: Boolean?) {
val fragment = EquipmentDetailFragment()
fragment.type = type
fragment.isCostume = isCostume
fragment.equippedGear = equipped
activity?.displayFragment(fragment)
MainNavigationController.navigate(EquipmentOverviewFragmentDirections.openEquipmentDetail(type, isCostume ?: false, equipped ?: ""))
}
override fun customTitle(): String {

View file

@ -1,8 +1,6 @@
package com.habitrpg.android.habitica.ui.fragments.inventory.items
import android.os.Bundle
import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.LinearLayoutManager
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
@ -12,22 +10,19 @@ import android.widget.TextView
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.components.AppComponent
import com.habitrpg.android.habitica.data.InventoryRepository
import com.habitrpg.android.habitica.events.commands.OpenMenuItemCommand
import com.habitrpg.android.habitica.extensions.inflate
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.helpers.MainNavigationController
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.models.inventory.*
import com.habitrpg.android.habitica.models.user.User
import com.habitrpg.android.habitica.ui.adapter.inventory.ItemRecyclerAdapter
import com.habitrpg.android.habitica.ui.fragments.BaseFragment
import com.habitrpg.android.habitica.ui.fragments.NavigationDrawerFragment
import com.habitrpg.android.habitica.ui.helpers.RecyclerViewEmptySupport
import com.habitrpg.android.habitica.ui.helpers.SafeDefaultItemAnimator
import com.habitrpg.android.habitica.ui.helpers.bindView
import com.habitrpg.android.habitica.ui.helpers.resetViews
import io.reactivex.functions.Consumer
import io.realm.OrderedRealmCollection
import org.greenrobot.eventbus.EventBus
import javax.inject.Inject
class ItemRecyclerFragment : BaseFragment() {
@ -105,7 +100,7 @@ class ItemRecyclerFragment : BaseFragment() {
compositeSubscription.add(adapter.getQuestInvitationFlowable()
.flatMap { quest -> inventoryRepository.inviteToQuest(quest) }
.subscribe(Consumer { EventBus.getDefault().post(OpenMenuItemCommand(NavigationDrawerFragment.SIDEBAR_PARTY)) }, RxErrorHandler.handleEmptyError()))
.subscribe(Consumer { MainNavigationController.navigate(R.id.partyFragment) }, RxErrorHandler.handleEmptyError()))
}
}
activity.notNull {
@ -186,7 +181,7 @@ class ItemRecyclerFragment : BaseFragment() {
}
private fun openMarket() {
EventBus.getDefault().post(OpenMenuItemCommand(NavigationDrawerFragment.SIDEBAR_SHOPS))
MainNavigationController.navigate(R.id.shopsFragment)
}
companion object {

View file

@ -10,23 +10,19 @@ import androidx.core.content.ContextCompat
import androidx.appcompat.app.AlertDialog
import androidx.preference.Preference
import android.text.InputType
import android.view.View
import android.widget.EditText
import android.widget.LinearLayout
import android.widget.TextView
import android.widget.Toast
import com.habitrpg.android.habitica.HabiticaApplication
import com.habitrpg.android.habitica.HabiticaBaseApplication
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.events.commands.OpenGemPurchaseFragmentCommand
import com.habitrpg.android.habitica.extensions.layoutInflater
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.helpers.MainNavigationController
import com.habitrpg.android.habitica.helpers.RemoteConfigManager
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.models.user.User
import com.habitrpg.android.habitica.ui.views.subscriptions.SubscriptionDetailsView
import io.reactivex.functions.Consumer
import org.greenrobot.eventbus.EventBus
import javax.inject.Inject
class AuthenticationPreferenceFragment: BasePreferencesFragment() {
@ -75,7 +71,7 @@ class AuthenticationPreferenceFragment: BasePreferencesFragment() {
showSubscriptionStatusDialog()
return super.onPreferenceTreeClick(preference)
}
EventBus.getDefault().post(OpenGemPurchaseFragmentCommand())
MainNavigationController.navigate(R.id.gemPurchaseActivity)
}
"reset_account" -> showAccountResetConfirmation()
"delete_account" -> showAccountDeleteConfirmation()

View file

@ -68,6 +68,11 @@ class GuildFragment : BaseMainFragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
if (arguments != null) {
val args = GuildFragmentArgs.fromBundle(arguments)
guildId = args.groupID
isMember = args.isMember
}
viewPager?.currentItem = 0

View file

@ -14,6 +14,7 @@ import com.habitrpg.android.habitica.components.AppComponent
import com.habitrpg.android.habitica.data.ChallengeRepository
import com.habitrpg.android.habitica.data.SocialRepository
import com.habitrpg.android.habitica.extensions.inflate
import com.habitrpg.android.habitica.helpers.MainNavigationController
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.models.social.Group
import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment
@ -100,20 +101,13 @@ class GuildsOverviewFragment : BaseMainFragment(), View.OnClickListener, android
}
override fun onClick(v: View) {
val fragment: BaseMainFragment
if (v === this.publicGuildsButton) {
val publicGuildsFragment = PublicGuildsFragment()
publicGuildsFragment.memberGuildIDs = this.guildIDs
fragment = publicGuildsFragment
MainNavigationController.navigate(GuildsOverviewFragmentDirections.openPublicGuilds())
} else {
val guildIndex = (v.parent as? ViewGroup)?.indexOfChild(v)
val guildId = this.guilds?.get(guildIndex ?: 0)?.id ?: return
val guildFragment = GuildFragment()
guildFragment.setGuildId(guildId)
guildFragment.isMember = true
fragment = guildFragment
MainNavigationController.navigate(GuildsOverviewFragmentDirections.openGuildDetail(guildId))
}
activity?.displayFragment(fragment)
}

View file

@ -11,6 +11,7 @@ import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.components.AppComponent
import com.habitrpg.android.habitica.data.SocialRepository
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.helpers.MainNavigationController
import com.habitrpg.android.habitica.helpers.RemoteConfigManager
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.models.social.ChatMessage
@ -162,6 +163,7 @@ class InboxFragment : BaseMainFragment(), androidx.swiperefreshlayout.widget.Swi
}
private fun openInboxMessages(userID: String, username: String) {
MainNavigationController.navigate(R.id.prefsActivity)
val inboxMessageListFragment = InboxMessageListFragment()
inboxMessageListFragment.setReceivingUser(username, userID)
this.activity?.displayFragment(inboxMessageListFragment)

View file

@ -3,7 +3,6 @@ package com.habitrpg.android.habitica.ui.fragments.social
import android.content.Context
import android.content.Intent
import android.graphics.PorterDuff
import android.net.Uri
import android.os.Bundle
import androidx.core.content.ContextCompat
import androidx.appcompat.app.AlertDialog
@ -19,9 +18,9 @@ import com.habitrpg.android.habitica.components.AppComponent
import com.habitrpg.android.habitica.data.InventoryRepository
import com.habitrpg.android.habitica.data.SocialRepository
import com.habitrpg.android.habitica.data.UserRepository
import com.habitrpg.android.habitica.events.commands.OpenMenuItemCommand
import com.habitrpg.android.habitica.extensions.backgroundCompat
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.helpers.MainNavigationController
import com.habitrpg.android.habitica.helpers.RemoteConfigManager
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.models.inventory.QuestContent
@ -30,13 +29,11 @@ import com.habitrpg.android.habitica.models.social.Group
import com.habitrpg.android.habitica.models.user.User
import com.habitrpg.android.habitica.modules.AppModule
import com.habitrpg.android.habitica.ui.fragments.BaseFragment
import com.habitrpg.android.habitica.ui.fragments.NavigationDrawerFragment
import com.habitrpg.android.habitica.ui.views.HabiticaAlertDialog
import com.habitrpg.android.habitica.ui.views.social.UsernameLabel
import io.reactivex.functions.Consumer
import kotlinx.android.synthetic.main.fragment_tavern_detail.*
import kotlinx.android.synthetic.main.shop_header.*
import org.greenrobot.eventbus.EventBus
import javax.inject.Inject
import javax.inject.Named
@ -126,11 +123,10 @@ class TavernDetailFragment : BaseFragment() {
context?.startActivity(i)
}
faqButton.setOnClickListener {
EventBus.getDefault().post(OpenMenuItemCommand(NavigationDrawerFragment.SIDEBAR_HELP))
MainNavigationController.navigate(R.id.FAQOverviewFragment)
}
reportButton.setOnClickListener {
EventBus.getDefault().post(OpenMenuItemCommand(NavigationDrawerFragment.SIDEBAR_ABOUT))
MainNavigationController.navigate(R.id.aboutFragment)
}
worldBossSection.infoIconView.setOnClickListener {

View file

@ -1,6 +1,6 @@
package com.habitrpg.android.habitica.ui.menu
class HabiticaDrawerItem(val identifier: String, val text: String, val isHeader: Boolean = false, var additionalInfoAsPill: Boolean = true) {
class HabiticaDrawerItem(val transitionId: Int,val identifier: String, val text: String, val isHeader: Boolean = false, var additionalInfoAsPill: Boolean = true) {
var additionalInfo: String? = null
var isVisible: Boolean = true

View file

@ -4,9 +4,7 @@ import android.app.AlertDialog
import android.content.Context
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.events.commands.OpenGemPurchaseFragmentCommand
import org.greenrobot.eventbus.EventBus
import com.habitrpg.android.habitica.helpers.MainNavigationController
/**
* Created by phillip on 27.09.17.
@ -19,6 +17,6 @@ class InsufficientGemsDialog(context: Context) : InsufficientCurrencyDialog(cont
imageView.setImageResource(R.drawable.gems_84)
textView.setText(R.string.insufficientGems)
setButton(AlertDialog.BUTTON_POSITIVE, context.getString(R.string.purchase_gems)) { _, _ -> EventBus.getDefault().post(OpenGemPurchaseFragmentCommand()) }
setButton(AlertDialog.BUTTON_POSITIVE, context.getString(R.string.purchase_gems)) { _, _ -> MainNavigationController.navigate(R.id.gemPurchaseActivity) }
}
}

View file

@ -4,17 +4,15 @@ import android.content.Context
import androidx.appcompat.app.AlertDialog
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.events.commands.OpenGemPurchaseFragmentCommand
import com.habitrpg.android.habitica.helpers.MainNavigationController
import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper
import org.greenrobot.eventbus.EventBus
class InsufficientHourglassesDialog(context: Context) : InsufficientCurrencyDialog(context) {
init {
imageView.setImageBitmap(HabiticaIconsHelper.imageOfHourglassShop())
textView.setText(R.string.insufficientHourglasses)
setButton(AlertDialog.BUTTON_POSITIVE, context.getString(R.string.get_hourglasses)) { _, _ -> EventBus.getDefault().post(OpenGemPurchaseFragmentCommand()) }
setButton(AlertDialog.BUTTON_POSITIVE, context.getString(R.string.get_hourglasses)) { _, _ -> MainNavigationController.navigate(R.id.gemPurchaseActivity) }
}
}

View file

@ -16,7 +16,7 @@ import com.habitrpg.android.habitica.data.InventoryRepository
import com.habitrpg.android.habitica.data.UserRepository
import com.habitrpg.android.habitica.events.GearPurchasedEvent
import com.habitrpg.android.habitica.events.ShowSnackbarEvent
import com.habitrpg.android.habitica.events.commands.OpenGemPurchaseFragmentCommand
import com.habitrpg.android.habitica.helpers.MainNavigationController
import com.habitrpg.android.habitica.ui.helpers.bindView
import com.habitrpg.android.habitica.helpers.RemoteConfigManager
import com.habitrpg.android.habitica.helpers.RxErrorHandler
@ -33,7 +33,6 @@ import com.habitrpg.android.habitica.ui.views.insufficientCurrency.InsufficientG
import com.habitrpg.android.habitica.ui.views.insufficientCurrency.InsufficientGoldDialog
import com.habitrpg.android.habitica.ui.views.insufficientCurrency.InsufficientHourglassesDialog
import com.habitrpg.android.habitica.ui.views.insufficientCurrency.InsufficientSubscriberGemsDialog
import com.playseeds.android.sdk.inappmessaging.Log
import io.reactivex.Flowable
import io.reactivex.disposables.CompositeDisposable
import io.reactivex.functions.Consumer
@ -266,7 +265,7 @@ class PurchaseDialog(context: Context, component: AppComponent?, val item: ShopI
if (throwable.javaClass.isAssignableFrom(retrofit2.HttpException::class.java)) {
val error = throwable as retrofit2.HttpException
if (error.code() == 401 && shopItem.currency == "gems") {
EventBus.getDefault().post(OpenGemPurchaseFragmentCommand())
MainNavigationController.navigate(R.id.gemPurchaseActivity)
}
}
}

View file

@ -1,7 +1,7 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
ext.kotlin_version = '1.3.0'
ext.kotlin_version = '1.3.10'
ext.build_tools_version = '28.0.3'
ext.sdk_version = 28
@ -17,6 +17,8 @@ buildscript {
classpath "io.realm:realm-gradle-plugin:5.8.0"
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath "gradle.plugin.io.gitlab.arturbosch.detekt:detekt-gradle-plugin:1.0.0.RC4-3"
classpath "android.arch.navigation:navigation-safe-args-gradle-plugin:1.0.0-alpha07"
}
}