Enable rotation and fix issue with party screen

This commit is contained in:
Phillip Thelen 2019-04-18 17:01:19 +02:00
parent 714e071983
commit b8c44e589e
6 changed files with 77 additions and 85 deletions

View file

@ -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">
<meta-data
android:name="firebase_performance_logcat_enabled"
@ -34,8 +35,7 @@
android:name=".ui.activities.MainActivity"
android:label="@string/app_name"
android:theme="@style/AppTheme.NoActionBar.Transparent"
android:windowSoftInputMode="stateHidden|adjustResize"
android:screenOrientation="portrait">
android:windowSoftInputMode="stateHidden|adjustResize">
<nav-graph android:value="@navigation/navigation" />
<intent-filter>
<action android:name="android.intent.action.MAIN" />
@ -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">
<intent-filter android:label="@string/app_name">
<action android:name="android.intent.action.VIEW" />
@ -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">
</activity>
<activity
android:name=".ui.activities.LoginActivity"
android:label="@string/LoginActivityName"
android:theme="@style/AppTheme.NoActionBar.Transparent"
android:windowSoftInputMode="adjustResize"
android:screenOrientation="portrait">
android:windowSoftInputMode="adjustResize">
</activity>
<activity
android:name=".ui.activities.IntroActivity"
android:theme="@style/AppTheme.NoActionBar.Transparent"
android:windowSoftInputMode="adjustResize"
android:screenOrientation="portrait">
android:windowSoftInputMode="adjustResize">
</activity>
<activity
android:name=".ui.activities.SetupActivity"
android:windowSoftInputMode="stateHidden|adjustResize"
android:screenOrientation="portrait">
android:windowSoftInputMode="stateHidden|adjustResize">
</activity>
<activity
android:name=".ui.activities.SkillTasksActivity"
android:label="@string/app_name"
android:screenOrientation="portrait">
android:label="@string/app_name">
</activity>
<activity
android:name=".ui.activities.SkillMemberActivity"
android:label="@string/app_name"
android:screenOrientation="portrait">
android:label="@string/app_name">
</activity>
<activity
android:name=".ui.activities.GiftIAPActivity"
android:label="@string/gift_subscription"
android:screenOrientation="portrait">
android:label="@string/gift_subscription">
</activity>
<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/facebook_app_id"/>
@ -112,12 +104,10 @@
android:value="false"/>
<activity
android:name=".ui.activities.AboutActivity"
android:theme="@style/AppThemeWithActionBarBlackText"
android:screenOrientation="portrait"/>
android:theme="@style/AppThemeWithActionBarBlackText"/>
<activity
android:name=".ui.activities.TaskFormActivity"
android:parentActivityName=".ui.activities.MainActivity"
android:screenOrientation="portrait"
tools:ignore="UnusedAttribute">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
@ -127,7 +117,6 @@
android:name=".ui.activities.OldTaskFormActivity"
android:theme="@style/AppThemeWithActionBarBlackText"
android:parentActivityName=".ui.activities.MainActivity"
android:screenOrientation="portrait"
tools:ignore="UnusedAttribute">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
@ -137,7 +126,6 @@
android:name=".ui.activities.GroupFormActivity"
android:theme="@style/AppTheme.NoActionBar.Transparent"
android:parentActivityName=".ui.activities.MainActivity"
android:screenOrientation="portrait"
tools:ignore="UnusedAttribute">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
@ -146,7 +134,6 @@
<activity
android:name=".ui.activities.ClassSelectionActivity"
android:parentActivityName=".ui.activities.MainActivity"
android:screenOrientation="portrait"
tools:ignore="UnusedAttribute"
android:label="@string/select_class">
<meta-data
@ -156,7 +143,6 @@
<activity
android:name=".ui.activities.PartyInviteActivity"
android:theme="@style/AppThemeWithActionBarBlackText"
android:screenOrientation="portrait"
tools:ignore="UnusedAttribute"
android:label="@string/invite_users">
</activity>
@ -164,7 +150,6 @@
android:name=".ui.activities.FullProfileActivity"
android:theme="@style/AppThemeWithActionBarBlackText"
android:parentActivityName=".ui.activities.MainActivity"
android:screenOrientation="portrait"
tools:ignore="UnusedAttribute">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
@ -182,7 +167,6 @@
android:name=".ui.activities.ChallengeFormActivity"
android:theme="@style/AppTheme.ActionBar"
android:parentActivityName=".ui.activities.MainActivity"
android:screenOrientation="portrait"
android:launchMode="singleTask"
tools:ignore="UnusedAttribute">
<meta-data

View file

@ -596,7 +596,7 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction {
private fun displayDeathDialogIfNeeded() {
if (user?.stats?.hp ?: 0.0 > 0) {
if (user?.stats?.hp ?: 1.0 > 0) {
return
}

View file

@ -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<RealmResults<ChatMessage>> { 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<RealmResults<ChatMessage>> { 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<ChatMessage>) {
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)
}
}

View file

@ -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 ?: ""))
}
}

View file

@ -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)
}

View file

@ -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()))