Improve new navigation

This commit is contained in:
Phillip Thelen 2018-12-07 18:54:14 +01:00
parent eb97b5c3ed
commit 69a539662d
27 changed files with 94 additions and 153 deletions

View file

@ -14,6 +14,8 @@
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.RECORD_AUDIO" tools:node="remove" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" tools:node="remove" />
<application
android:name=".HabiticaApplication"

View file

@ -147,7 +147,7 @@ android {
buildConfigField "String", "STORE", "\"google\""
multiDexEnabled true
versionCode 2040
versionCode 2042
versionName "1.7"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 70 B

View file

@ -36,6 +36,19 @@
android:name="com.habitrpg.android.habitica.ui.fragments.social.party.PartyFragment"
android:label="@string/sidebar.party">
<deepLink app:uri="habitica.com/party" />
<action
android:id="@+id/openQuestDetail"
app:destination="@id/questDetailFragment" />
</fragment>
<fragment
android:id="@+id/questDetailFragment"
android:name="com.habitrpg.android.habitica.ui.fragments.social.QuestDetailFragment">
<argument
android:name="partyID"
app:argType="string"/>
<argument
android:name="questKey"
app:argType="string"/>
</fragment>
<fragment
android:id="@+id/skillsFragment"
@ -67,7 +80,11 @@
<fragment
android:id="@+id/challengesOverviewFragment"
android:name="com.habitrpg.android.habitica.ui.fragments.social.challenges.ChallengesOverviewFragment"
android:label="@string/sidebar.challenges" />
android:label="@string/sidebar.challenges" >
<action
android:id="@+id/openChallengeDetail"
app:destination="@id/challengeDetailFragment" />
</fragment>
<fragment
android:id="@+id/shopsFragment"
android:name="com.habitrpg.android.habitica.ui.fragments.inventory.shops.ShopsFragment"
@ -120,7 +137,7 @@
android:name="com.habitrpg.android.habitica.ui.fragments.social.InboxFragment"
android:label="@string/sidebar.inbox" >
<action
android:id="@+id/action_inboxFragment_to_inboxMessageListFragment"
android:id="@+id/openInboxDetail"
app:destination="@id/inboxMessageListFragment" />
</fragment>
<fragment
@ -173,6 +190,9 @@
<argument
android:name="userID"
app:argType="string" />
<argument
android:name="username"
app:argType="string" />
</fragment>
<fragment
android:id="@+id/petDetailRecyclerFragment"
@ -196,4 +216,16 @@
android:name="group"
app:argType="string" />
</fragment>
<fragment
android:id="@+id/challengeDetailFragment"
android:name="com.habitrpg.android.habitica.ui.fragments.social.challenges.ChallengeDetailFragment"
android:label="Challenge" >
<argument
android:name="challengeID"
app:argType="string" />
</fragment>
<activity
android:id="@+id/taskFormActivity"
android:name="com.habitrpg.android.habitica.ui.activities.TaskFormActivity"
android:label="TaskFormActivity" />
</navigation>

View file

@ -106,16 +106,14 @@ abstract class HabiticaBaseApplication : MultiDexApplication() {
}
private fun setupInstabug() {
if (BuildConfig.FLAVOR == "beta") {
Instabug.Builder(this, getString(R.string.instabug_key))
.setInvocationEvents(InstabugInvocationEvent.SHAKE)
.setReproStepsState(State.ENABLED_WITH_NO_SCREENSHOTS)
.build()
Instabug.setWelcomeMessageState(WelcomeMessage.State.DISABLED)
Instabug.setUserAttribute("", lazyApiHelper.hostConfig.user)
BugReporting.setShakingThreshold(900)
BugReporting.setPromptOptionsEnabled(PromptOption.BUG, PromptOption.FEEDBACK)
}
Instabug.Builder(this, getString(R.string.instabug_key))
.setInvocationEvents(InstabugInvocationEvent.SHAKE)
.setReproStepsState(State.ENABLED_WITH_NO_SCREENSHOTS)
.build()
Instabug.setWelcomeMessageState(WelcomeMessage.State.DISABLED)
Instabug.setUserAttribute("", lazyApiHelper.hostConfig.user)
BugReporting.setShakingThreshold(900)
BugReporting.setPromptOptionsEnabled(PromptOption.BUG, PromptOption.FEEDBACK)
}
protected open fun setupRealm() {

View file

@ -1,8 +0,0 @@
package com.habitrpg.android.habitica.events;
import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment;
public class DisplayFragmentEvent {
public BaseMainFragment fragment;
}

View file

@ -1,10 +0,0 @@
package com.habitrpg.android.habitica.events;
import com.habitrpg.android.habitica.models.tasks.RemindersItem;
/**
* Created by keithholliday on 7/16/16.
*/
public class ReminderDeleteEvent {
public RemindersItem reminder;
}

View file

@ -1,14 +0,0 @@
package com.habitrpg.android.habitica.events;
import com.habitrpg.android.habitica.models.tasks.Task;
/**
* Created by Negue on 28.09.2015.
*/
public class TaskUpdatedEvent {
public Task task;
public TaskUpdatedEvent(Task t) {
task = t;
}
}

View file

@ -1,8 +0,0 @@
package com.habitrpg.android.habitica.events.commands;
/**
* Created by Negue on 11.07.2015.
*/
public class AddNewTaskCommand {
public String taskType;
}

View file

@ -1,11 +0,0 @@
package com.habitrpg.android.habitica.events.commands;
/**
* Created by viirus on 15/01/16.
*/
public class UnlockPathCommand {
public String path;
public double balanceDiff;
}

View file

@ -6,11 +6,9 @@ import android.content.Context
import android.content.Intent
import android.os.Build
import android.os.Build.VERSION.SDK_INT
import android.provider.Settings.Global.putLong
import androidx.core.content.edit
import androidx.preference.PreferenceManager
import com.habitrpg.android.habitica.data.TaskRepository
import com.habitrpg.android.habitica.events.ReminderDeleteEvent
import com.habitrpg.android.habitica.models.tasks.RemindersItem
import com.habitrpg.android.habitica.models.tasks.Task
import com.habitrpg.android.habitica.receivers.NotificationPublisher
@ -18,22 +16,11 @@ import com.habitrpg.android.habitica.receivers.TaskReceiver
import io.reactivex.Flowable
import io.reactivex.functions.Consumer
import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
import java.util.*
class TaskAlarmManager(private var context: Context, private var taskRepository: TaskRepository, private var userId: String) {
private val am: AlarmManager? = context.getSystemService(Context.ALARM_SERVICE) as? AlarmManager
init {
EventBus.getDefault().register(this)
}
@Subscribe
fun onEvent(event: ReminderDeleteEvent) {
val remindersItem = event.reminder
this.removeAlarmForRemindersItem(remindersItem)
}
private fun setAlarmsForTask(task: Task) {
task.reminders?.let {
for (reminder in it) {
@ -45,7 +32,6 @@ class TaskAlarmManager(private var context: Context, private var taskRepository:
this.setAlarmForRemindersItem(task, currentReminder)
}
}
}
private fun removeAlarmsForTask(task: Task) {

View file

@ -379,30 +379,6 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction {
findNavController(R.id.nav_host_fragment).navigate(transitionId)
}
@SuppressLint("ObsoleteSdkInt")
fun displayFragment(fragment: BaseMainFragment) {
if (fragment.javaClass == this.activeFragment?.get()?.javaClass) {
return
}
if (SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 && this.isDestroyed) {
return
}
makeActiveFragment(fragment)
/*if (supportFragmentManager.fragments == null) {
supportFragmentManager.beginTransaction().add(R.id.fragment_container, fragment).commitAllowingStateLoss()
} else {
val transaction = supportFragmentManager.beginTransaction()
transaction.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out, android.R.anim.fade_in, android.R.anim.fade_out)
transaction.replace(R.id.fragment_container, fragment)
if (fragment.addToBackStack()) {
transaction.addToBackStack(null)
}
transaction.commitAllowingStateLoss()
}*/
}
private fun setUserData() {
if (user != null) {
val preferences = user?.preferences

View file

@ -97,10 +97,6 @@ class StableRecyclerAdapter : androidx.recyclerview.widget.RecyclerView.Adapter<
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 {
MainNavigationController.navigate(StableFragmentDirections.openMountDetail(animal.animal, animal.animalGroup))
}

View file

@ -9,7 +9,6 @@ import android.widget.Filterable
import android.widget.TextView
import com.habitrpg.android.habitica.R
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

View file

@ -9,11 +9,13 @@ 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.extensions.notNull
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.models.inventory.Equipment
import com.habitrpg.android.habitica.models.user.Items
import com.habitrpg.android.habitica.ui.adapter.inventory.EquipmentRecyclerViewAdapter
import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment
import com.habitrpg.android.habitica.ui.fragments.inventory.customization.AvatarCustomizationFragmentArgs
import com.habitrpg.android.habitica.ui.helpers.SafeDefaultItemAnimator
import io.reactivex.functions.Consumer
import io.realm.RealmResults
@ -47,6 +49,13 @@ class EquipmentDetailFragment : BaseMainFragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
arguments.notNull {
val args = EquipmentDetailFragmentArgs.fromBundle(it)
type = args.type
isCostume = args.isCostume
equippedGear = args.equippedGear
}
recyclerView.adapter = this.adapter
recyclerView.layoutManager = androidx.recyclerview.widget.LinearLayoutManager(activity)
recyclerView.addItemDecoration(androidx.recyclerview.widget.DividerItemDecoration(getActivity(), androidx.recyclerview.widget.DividerItemDecoration.VERTICAL))

View file

@ -14,6 +14,7 @@ import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.ui.adapter.inventory.MountDetailRecyclerAdapter
import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment
import com.habitrpg.android.habitica.ui.fragments.inventory.customization.AvatarCustomizationFragmentArgs
import com.habitrpg.android.habitica.ui.helpers.MarginDecoration
import com.habitrpg.android.habitica.ui.helpers.SafeDefaultItemAnimator
import com.habitrpg.android.habitica.ui.helpers.bindView
@ -49,6 +50,13 @@ class MountDetailRecyclerFragment : BaseMainFragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
arguments.notNull {
val args = MountDetailRecyclerFragmentArgs.fromBundle(it)
animalGroup = args.group
animalType = args.type
}
layoutManager = androidx.recyclerview.widget.GridLayoutManager(activity, 2)
recyclerView.layoutManager = layoutManager
recyclerView.addItemDecoration(MarginDecoration(activity))

View file

@ -10,6 +10,7 @@ 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.FeedCommand
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.models.inventory.Mount
import com.habitrpg.android.habitica.models.inventory.Pet
@ -60,6 +61,12 @@ class PetDetailRecyclerFragment : BaseMainFragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
arguments.notNull {
val args = MountDetailRecyclerFragmentArgs.fromBundle(it)
animalGroup = args.group
animalType = args.type
}
resetViews()
layoutManager = androidx.recyclerview.widget.GridLayoutManager(getActivity(), 2)

View file

@ -163,10 +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)
MainNavigationController.navigate(InboxFragmentDirections.openInboxDetail(userID, username))
}
override fun customTitle(): String {

View file

@ -4,12 +4,10 @@ import android.content.ClipData
import android.content.ClipboardManager
import android.content.Context
import android.os.Bundle
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
import androidx.appcompat.app.AlertDialog
import androidx.recyclerview.widget.LinearLayoutManager
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.appcompat.app.AlertDialog
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.components.AppComponent
import com.habitrpg.android.habitica.data.SocialRepository
@ -57,6 +55,11 @@ class InboxMessageListFragment : BaseMainFragment(), androidx.swiperefreshlayout
super.onViewCreated(view, savedInstanceState)
swipeRefreshLayout?.setOnRefreshListener(this)
arguments.notNull {
val args = InboxMessageListFragmentArgs.fromBundle(it)
setReceivingUser(args.username, args.userID)
}
val layoutManager = androidx.recyclerview.widget.LinearLayoutManager(this.getActivity())
recyclerView.layoutManager = layoutManager

View file

@ -71,6 +71,12 @@ class QuestDetailFragment : BaseMainFragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
arguments.notNull {
val args = QuestDetailFragmentArgs.fromBundle(it)
partyId = args.partyID
questKey = args.questKey
}
resetViews()
questAcceptButton?.setOnClickListener { onQuestAccept() }

View file

@ -79,6 +79,11 @@ class ChallengeDetailFragment: BaseMainFragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
arguments.notNull {
val args = ChallengeDetailFragmentArgs.fromBundle(it)
challengeID = args.challengeID
}
gemAmountIconView?.setImageBitmap(HabiticaIconsHelper.imageOfGem_36())
memberCountIconView?.setImageBitmap(HabiticaIconsHelper.imageOfParticipantsIcon())
challengeDescription?.movementMethod = LinkMovementMethod.getInstance()

View file

@ -13,6 +13,7 @@ import com.habitrpg.android.habitica.components.AppComponent
import com.habitrpg.android.habitica.data.ChallengeRepository
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.Challenge
import com.habitrpg.android.habitica.modules.AppModule
@ -89,9 +90,7 @@ class ChallengeListFragment : BaseMainFragment(), androidx.swiperefreshlayout.wi
}
private fun openDetailFragment(challengeID: String) {
val detailFragment = ChallengeDetailFragment()
detailFragment.challengeID = challengeID
this.activity?.displayFragment(detailFragment)
MainNavigationController.navigate(ChallengesOverviewFragmentDirections.openChallengeDetail(challengeID))
}
override fun injectFragment(component: AppComponent) {

View file

@ -15,6 +15,7 @@ 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.extensions.notNull
import com.habitrpg.android.habitica.helpers.MainNavigationController
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.models.inventory.QuestContent
import com.habitrpg.android.habitica.models.social.Group
@ -221,13 +222,8 @@ class PartyDetailFragment constructor(private val viewModel: PartyViewModel) : B
}
private fun questDetailButtonClicked() {
val fragment = QuestDetailFragment()
val party = viewModel.getGroupData().value
fragment.partyId = party?.id
fragment.questKey = party?.quest?.key
if (activity != null) {
val activity = activity as? MainActivity
activity?.displayFragment(fragment)
viewModel.getGroupData().value.notNull { party ->
MainNavigationController.navigate(PartyFragmentDirections.openQuestDetail(party.id, party.quest?.key ?: ""))
}
}
}

View file

@ -3,9 +3,6 @@ package com.habitrpg.android.habitica.ui.fragments.tasks
import android.content.Context
import android.graphics.Color
import android.os.Bundle
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.ItemTouchHelper
import android.util.TypedValue
import android.view.LayoutInflater
@ -17,7 +14,6 @@ import com.habitrpg.android.habitica.data.ApiClient
import com.habitrpg.android.habitica.data.InventoryRepository
import com.habitrpg.android.habitica.data.TaskRepository
import com.habitrpg.android.habitica.data.UserRepository
import com.habitrpg.android.habitica.events.commands.AddNewTaskCommand
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.helpers.TaskFilterHelper
@ -32,13 +28,12 @@ import com.habitrpg.android.habitica.ui.viewHolders.tasks.BaseTaskViewHolder
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.functions.Consumer
import kotlinx.android.synthetic.main.fragment_refresh_recyclerview.*
import org.greenrobot.eventbus.EventBus
import java.util.*
import java.util.concurrent.TimeUnit
import javax.inject.Inject
import javax.inject.Named
open class TaskRecyclerViewFragment : BaseFragment(), View.OnClickListener, androidx.swiperefreshlayout.widget.SwipeRefreshLayout.OnRefreshListener {
open class TaskRecyclerViewFragment : BaseFragment(), androidx.swiperefreshlayout.widget.SwipeRefreshLayout.OnRefreshListener {
var recyclerAdapter: TaskRecyclerViewAdapter? = null
@field:[Inject Named(AppModule.NAMED_USER_ID)]
lateinit var userID: String
@ -251,13 +246,6 @@ open class TaskRecyclerViewFragment : BaseFragment(), View.OnClickListener, andr
outState.putString(CLASS_TYPE_KEY, this.classType)
}
override fun onClick(v: View) {
val event = AddNewTaskCommand()
event.taskType = this.classType
EventBus.getDefault().post(event)
}
override val displayedClassName: String?
get() = this.classType + super.displayedClassName

View file

@ -3,9 +3,7 @@ package com.habitrpg.android.habitica.ui.fragments.tasks
import android.app.Activity
import android.content.Intent
import android.os.Bundle
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentPagerAdapter
import androidx.viewpager.widget.ViewPager
import android.view.*
import com.github.clans.fab.FloatingActionButton
import com.github.clans.fab.FloatingActionMenu
@ -14,7 +12,6 @@ import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.components.AppComponent
import com.habitrpg.android.habitica.data.TagRepository
import com.habitrpg.android.habitica.events.TaskTappedEvent
import com.habitrpg.android.habitica.events.commands.AddNewTaskCommand
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.helpers.TaskFilterHelper
@ -324,11 +321,6 @@ class TasksFragment : BaseMainFragment() {
}
}
@Subscribe
fun onEvent(event: AddNewTaskCommand) {
openNewTaskActivity(event.taskType.toLowerCase(Locale.US))
}
//endregion Events
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {

View file

@ -1,8 +1 @@
This update fixes various bugs and adds support for an upcoming feature.
This update also reworks a lot of the internals for the party view, to make it more reliable. Please report any new oddities on that screen.
Daily reminders have also been reworked and should now work better and not notify every day.
NEW:
- Add Cat support (Can you find it?)
This update brings a new navigation architecture, which is the groundwork for additional features like in-app linking and deep links. If there are any views that do not open correctly anymore or any new issues that seem releated to navigation, please let us know.