diff --git a/Habitica/AndroidManifest.xml b/Habitica/AndroidManifest.xml index 1bf55414c..bdbd44483 100644 --- a/Habitica/AndroidManifest.xml +++ b/Habitica/AndroidManifest.xml @@ -26,6 +26,7 @@ android:theme="@style/AppTheme" tools:replace="android:name" android:fullBackupContent="@xml/backup_descriptor" + android:configChanges="orientation" android:networkSecurityConfig="@xml/network_security_config"> + android:windowSoftInputMode="stateHidden|adjustResize"> @@ -54,7 +54,6 @@ android:name=".ui.activities.PrefsActivity" android:parentActivityName=".ui.activities.MainActivity" android:label="@string/PS_settings_title" - android:screenOrientation="portrait" tools:ignore="UnusedAttribute"> @@ -69,41 +68,34 @@ android:name=".ui.activities.FixCharacterValuesActivity" android:parentActivityName=".ui.activities.PrefsActivity" android:label="@string/PS_settings_title" - android:screenOrientation="portrait" tools:ignore="UnusedAttribute"> + android:windowSoftInputMode="adjustResize"> + android:windowSoftInputMode="adjustResize"> + android:windowSoftInputMode="stateHidden|adjustResize"> + android:label="@string/app_name"> + android:label="@string/app_name"> + android:label="@string/gift_subscription"> @@ -112,12 +104,10 @@ android:value="false"/> + android:theme="@style/AppThemeWithActionBarBlackText"/> @@ -164,7 +150,6 @@ android:name=".ui.activities.FullProfileActivity" android:theme="@style/AppThemeWithActionBarBlackText" android:parentActivityName=".ui.activities.MainActivity" - android:screenOrientation="portrait" tools:ignore="UnusedAttribute"> 0) { + if (user?.stats?.hp ?: 1.0 > 0) { return } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/ChatFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/ChatFragment.kt index 1a656250d..367f164be 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/ChatFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/ChatFragment.kt @@ -28,6 +28,7 @@ import com.habitrpg.android.habitica.ui.activities.FullProfileActivity import com.habitrpg.android.habitica.ui.activities.MainActivity import com.habitrpg.android.habitica.ui.adapter.social.ChatRecyclerViewAdapter import com.habitrpg.android.habitica.ui.fragments.BaseFragment +import com.habitrpg.android.habitica.ui.fragments.social.party.PartyFragment import com.habitrpg.android.habitica.ui.helpers.SafeDefaultItemAnimator import com.habitrpg.android.habitica.ui.viewmodels.PartyViewModel import com.habitrpg.android.habitica.ui.views.HabiticaSnackbar.Companion.showSnackbar @@ -42,9 +43,9 @@ import kotlinx.android.synthetic.main.tavern_chat_new_entry_item.* import java.util.concurrent.TimeUnit import javax.inject.Inject -class ChatFragment constructor() : BaseFragment(), SwipeRefreshLayout.OnRefreshListener { +class ChatFragment : BaseFragment(), SwipeRefreshLayout.OnRefreshListener { - lateinit var viewModel: PartyViewModel + var viewModel: PartyViewModel? = null @Inject lateinit var configManager: RemoteConfigManager @@ -84,33 +85,17 @@ class ChatFragment constructor() : BaseFragment(), SwipeRefreshLayout.OnRefreshL compositeSubscription.add(adapter.getFlagMessageClickFlowable().subscribe(Consumer { this.showFlagConfirmationDialog(it) }, RxErrorHandler.handleEmptyError())) compositeSubscription.add(adapter.getReplyMessageEvents().subscribe(Consumer{ setReplyTo(it) }, RxErrorHandler.handleEmptyError())) compositeSubscription.add(adapter.getCopyMessageFlowable().subscribe(Consumer { this.copyMessageToClipboard(it) }, RxErrorHandler.handleEmptyError())) - compositeSubscription.add(adapter.getLikeMessageFlowable().subscribe(Consumer { viewModel.likeMessage(it) }, RxErrorHandler.handleEmptyError())) + compositeSubscription.add(adapter.getLikeMessageFlowable().subscribe(Consumer { viewModel?.likeMessage(it) }, RxErrorHandler.handleEmptyError())) } chatBarView.sendAction = { sendChatMessage(it) } chatBarView.maxChatLength = configManager.maxChatLength() chatBarView.autocompleteContext = "party" - chatBarView.groupID = viewModel.getGroupData().value?.id + chatBarView.groupID = viewModel?.getGroupData()?.value?.id recyclerView.adapter = chatAdapter recyclerView.itemAnimator = SafeDefaultItemAnimator() - compositeSubscription.add(viewModel.getChatMessages().subscribe(Consumer> { this.setChatMessages(it) }, RxErrorHandler.handleEmptyError())) - - viewModel.getUserData().observe(viewLifecycleOwner, Observer { - chatAdapter?.user = it - if (it?.flags?.isCommunityGuidelinesAccepted == true) { - communityGuidelinesView.visibility = View.GONE - } else { - communityGuidelinesView.setOnClickListener { _ -> - val i = Intent(Intent.ACTION_VIEW) - i.data = "https://habitica.com/static/community-guidelines".toUri() - context?.startActivity(i) - viewModel.updateUser("flags.communityGuidelinesAccepted", true) - } - } - }) - recyclerView.addOnScrollListener(object : androidx.recyclerview.widget.RecyclerView.OnScrollListener() { override fun onScrolled(recyclerView: androidx.recyclerview.widget.RecyclerView, dx: Int, dy: Int) { super.onScrolled(recyclerView, dx, dy) @@ -119,6 +104,22 @@ class ChatFragment constructor() : BaseFragment(), SwipeRefreshLayout.OnRefreshL }) refresh(false) + + viewModel?.getChatMessages()?.subscribe(Consumer> { this.setChatMessages(it) }, RxErrorHandler.handleEmptyError())?.let { compositeSubscription.add(it) } + + viewModel?.getUserData()?.observe(viewLifecycleOwner, Observer { + chatAdapter?.user = it + if (it?.flags?.isCommunityGuidelinesAccepted == true) { + communityGuidelinesView.visibility = View.GONE + } else { + communityGuidelinesView.setOnClickListener { _ -> + val i = Intent(Intent.ACTION_VIEW) + i.data = "https://habitica.com/static/community-guidelines".toUri() + context?.startActivity(i) + viewModel?.updateUser("flags.communityGuidelinesAccepted", true) + } + } + }) } override fun onDestroyView() { @@ -169,7 +170,7 @@ class ChatFragment constructor() : BaseFragment(), SwipeRefreshLayout.OnRefreshL if (isUserInitiated) { refreshLayout.isRefreshing = true } - viewModel.retrieveGroupChat { + viewModel?.retrieveGroupChat { refreshLayout?.isRefreshing = false if (isScrolledToTop) { recyclerView.scrollToPosition(0) @@ -184,7 +185,7 @@ class ChatFragment constructor() : BaseFragment(), SwipeRefreshLayout.OnRefreshL private fun markMessagesAsSeen() { if (navigatedOnceToFragment) { - viewModel.markMessagesSeen() + viewModel?.markMessagesSeen() } } @@ -210,23 +211,23 @@ class ChatFragment constructor() : BaseFragment(), SwipeRefreshLayout.OnRefreshL .setTitle(R.string.confirm_delete_tag_title) .setMessage(R.string.confirm_delete_tag_message) .setIcon(android.R.drawable.ic_dialog_alert) - .setPositiveButton(android.R.string.yes) { _, _ -> viewModel.deleteMessage(chatMessage) } + .setPositiveButton(android.R.string.yes) { _, _ -> viewModel?.deleteMessage(chatMessage) } .setNegativeButton(android.R.string.no, null).show() } } private fun setChatMessages(chatMessages: RealmResults) { chatAdapter?.updateData(chatMessages) - chatBarView.chatMessages = viewModel.socialRepository.getUnmanagedCopy(chatMessages) + viewModel?.socialRepository?.getUnmanagedCopy(chatMessages)?.let { chatBarView.chatMessages = it } recyclerView.scrollToPosition(0) - viewModel.gotNewMessages = true + viewModel?.gotNewMessages = true markMessagesAsSeen() } private fun sendChatMessage(chatText: String) { - viewModel.postGroupChat(chatText) { + viewModel?.postGroupChat(chatText) { recyclerView?.scrollToPosition(0) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyDetailFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyDetailFragment.kt index e8faefe49..f992b4f52 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyDetailFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyDetailFragment.kt @@ -33,9 +33,9 @@ import javax.inject.Inject import javax.inject.Named -class PartyDetailFragment constructor() : BaseFragment() { +class PartyDetailFragment : BaseFragment() { - lateinit var viewModel: PartyViewModel + var viewModel: PartyViewModel? = null @Inject lateinit var inventoryRepository: InventoryRepository @@ -89,17 +89,13 @@ class PartyDetailFragment constructor() : BaseFragment() { newQuestButton?.setOnClickListener { inviteNewQuest() } questDetailButton?.setOnClickListener { questDetailButtonClicked() } leaveButton?.setOnClickListener { leaveParty() } - } - override fun onActivityCreated(savedInstanceState: Bundle?) { - super.onActivityCreated(savedInstanceState) - - viewModel.getGroupData().observe(viewLifecycleOwner, Observer { updateParty(it) }) - viewModel.getUserData().observe(viewLifecycleOwner, Observer { updateUser(it) }) + viewModel?.getGroupData()?.observe(viewLifecycleOwner, Observer { updateParty(it) }) + viewModel?.getUserData()?.observe(viewLifecycleOwner, Observer { updateUser(it) }) } private fun refreshParty() { - viewModel.retrieveGroup { + viewModel?.retrieveGroup { refreshLayout?.isRefreshing = false } } @@ -158,7 +154,7 @@ class PartyDetailFragment constructor() : BaseFragment() { } private fun showParticipantButtons(): Boolean { - return viewModel.showParticipantButtons() + return viewModel?.showParticipantButtons() ?: false } private fun updateQuestContent(questContent: QuestContent) { @@ -172,11 +168,11 @@ class PartyDetailFragment constructor() : BaseFragment() { } else { DataBindingUtils.loadImage(questImageView, "quest_" + questContent.key) } - if (viewModel.isQuestActive) { + if (viewModel?.isQuestActive == true) { questProgressView?.visibility = View.VISIBLE - questProgressView?.setData(questContent, viewModel.getGroupData().value?.quest?.progress) + questProgressView?.setData(questContent, viewModel?.getGroupData()?.value?.quest?.progress) - questParticipationView?.text = getString(R.string.number_participants, viewModel.getGroupData().value?.quest?.members?.size) + questParticipationView?.text = getString(R.string.number_participants, viewModel?.getGroupData()?.value?.quest?.members?.size) } else { questProgressView?.visibility = View.GONE } @@ -193,34 +189,34 @@ class PartyDetailFragment constructor() : BaseFragment() { val builder = AlertDialog.Builder(activity) .setMessage(R.string.leave_party_confirmation) .setPositiveButton(R.string.yes) { _, _ -> - viewModel.leaveGroup { } + viewModel?.leaveGroup { } }.setNegativeButton(R.string.no) { _, _ -> } builder.show() } private fun onQuestAccept() { - viewModel.acceptQuest() + viewModel?.acceptQuest() } private fun onQuestReject() { - viewModel.rejectQuest() + viewModel?.rejectQuest() } private fun onPartyInviteAccepted() { - viewModel.getUserData().value?.invitations?.party?.id.notNull { - viewModel.joinGroup(it) + viewModel?.getUserData()?.value?.invitations?.party?.id.notNull { + viewModel?.joinGroup(it) } } private fun onPartyInviteRejected() { - viewModel.getUserData().value?.invitations?.party?.id.notNull { - viewModel.rejectGroupInvite(it) + viewModel?.getUserData()?.value?.invitations?.party?.id.notNull { + viewModel?.rejectGroupInvite(it) } } private fun questDetailButtonClicked() { - viewModel.getGroupData().value.notNull { party -> + viewModel?.getGroupData()?.value.notNull { party -> MainNavigationController.navigate(PartyFragmentDirections.openQuestDetail(party.id, party.quest?.key ?: "")) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyFragment.kt index bcf760073..2cedf7714 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyFragment.kt @@ -35,7 +35,7 @@ class PartyFragment : BaseMainFragment() { private var chatFragment: ChatFragment? = null private var viewPagerAdapter: androidx.fragment.app.FragmentPagerAdapter? = null - private lateinit var viewModel: PartyViewModel + internal lateinit var viewModel: PartyViewModel override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { @@ -84,10 +84,31 @@ class PartyFragment : BaseMainFragment() { viewPager?.currentItem = 0 setViewPagerAdapter() + + setFragments() + this.tutorialStepIdentifier = "party" this.tutorialText = getString(R.string.tutorial_party) } + fun setFragments() { + val fragments = childFragmentManager.fragments + for (childFragment in fragments) { + if (childFragment is ChatFragment) { + chatFragment = childFragment + chatFragment?.viewModel = viewModel + } + if (childFragment is PartyDetailFragment) { + firstFragment = childFragment + childFragment.viewModel = viewModel + } + if (childFragment is PartyMemberListFragment) { + partyMemberListFragment = childFragment + childFragment.viewModel = viewModel + } + } + } + override fun injectFragment(component: AppComponent) { component.inject(this) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyMemberListFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyMemberListFragment.kt index 879f842b7..25437755c 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyMemberListFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyMemberListFragment.kt @@ -22,7 +22,7 @@ import javax.inject.Inject class PartyMemberListFragment : BaseFragment() { - lateinit var viewModel: PartyViewModel + var viewModel: PartyViewModel? = null @Inject lateinit var socialRepository: SocialRepository @@ -51,19 +51,9 @@ class PartyMemberListFragment : BaseFragment() { recyclerView?.itemAnimator = SafeDefaultItemAnimator() refreshLayout?.setOnRefreshListener { this.refreshMembers() } - getUsers() } - override fun onActivityCreated(savedInstanceState: Bundle?) { - super.onActivityCreated(savedInstanceState) - - viewModel.getGroupData().observe(viewLifecycleOwner, Observer { - adapter?.leaderID = it?.leaderID - adapter?.notifyDataSetChanged() - }) - } - private fun refreshMembers() { setRefreshing(true) compositeSubscription.add(socialRepository.retrieveGroupMembers(partyId ?: "", true).doOnComplete { setRefreshing(false) }.subscribe(Consumer { }, RxErrorHandler.handleEmptyError()))