Fix intro screens

This commit is contained in:
Phillip Thelen 2020-04-20 15:45:22 +02:00
parent 66199eefbe
commit e72cc072f1
12 changed files with 101 additions and 80 deletions

View file

@ -64,7 +64,7 @@ dependencies {
compileOnly 'com.github.pengrad:jdk9-deps:1.0'
//App Compatibility and Material Design
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'com.google.android.material:material:1.0.0'
implementation 'com.google.android.material:material:1.1.0'
implementation 'androidx.recyclerview:recyclerview:1.1.0'
implementation 'androidx.legacy:legacy-preference-v14:1.0.0'
// Emojis
@ -132,9 +132,9 @@ dependencies {
implementation 'androidx.core:core-ktx:1.2.0'
implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
implementation "androidx.lifecycle:lifecycle-common-java8:2.2.0"
implementation 'androidx.navigation:navigation-fragment-ktx:2.2.1'
implementation 'androidx.navigation:navigation-ui-ktx:2.2.1'
implementation "androidx.paging:paging-runtime-ktx:2.1.1"
implementation 'androidx.navigation:navigation-fragment-ktx:2.2.2'
implementation 'androidx.navigation:navigation-ui-ktx:2.2.2'
implementation "androidx.paging:paging-runtime-ktx:2.1.2"
implementation 'com.plattysoft.leonids:LeonidsLib:1.3.2'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.3'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.3'
@ -162,7 +162,7 @@ android {
multiDexEnabled true
resConfigs "en", "bg", "de", "en-rGB", "es", "fr", "hr-rHR", "in", "it", "iw", "ja", "ko", "lt", "nl", "pl", "pt-rBR", "pt-rPT", "ru", "tr", "zh", "zh-rTW"
versionCode 2407
versionCode 2408
versionName "2.6"
}

View file

@ -1,8 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
<androidx.core.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white">
android:background="@color/white"
android:layout_marginBottom="@dimen/spacing_large">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -107,4 +111,5 @@
android:elevation="0dp"
android:layout_marginStart="@dimen/spacing_large"
android:layout_marginEnd="@dimen/spacing_large" />
</LinearLayout>
</LinearLayout>
</androidx.core.widget.NestedScrollView>

View file

@ -1,4 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.core.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
@ -173,4 +177,5 @@
android:textColor="@color/gray_50"
android:text="@string/reset_walkthrough"
android:layout_margin="@dimen/spacing_large"/>
</LinearLayout>
</LinearLayout>
</androidx.core.widget.NestedScrollView>

View file

@ -24,7 +24,6 @@ import com.habitrpg.android.habitica.ui.helpers.dismissKeyboard
import com.habitrpg.android.habitica.ui.views.HabiticaSnackbar
import com.habitrpg.android.habitica.ui.views.HabiticaSnackbar.Companion.showSnackbar
import io.reactivex.functions.Consumer
import kotlinx.android.synthetic.main.activity_prefs.*
import java.util.*
import java.util.concurrent.TimeUnit
import javax.inject.Inject
@ -54,7 +53,7 @@ class GroupInviteActivity : BaseActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setupToolbar(toolbar)
setupToolbar(findViewById(R.id.toolbar))
viewPager.currentItem = 0
supportActionBar?.title = null

View file

@ -6,7 +6,6 @@ import android.widget.TextView
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.components.UserComponent
import com.habitrpg.android.habitica.ui.helpers.setMarkdown
import kotlinx.android.synthetic.main.activity_prefs.*
import okhttp3.*
import java.io.BufferedReader
import java.io.IOException
@ -20,7 +19,7 @@ class GuidelinesActivity: BaseActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setupToolbar(toolbar)
setupToolbar(findViewById(R.id.toolbar))
val client = OkHttpClient()
val request = Request.Builder().url("https://s3.amazonaws.com/habitica-assets/mobileApp/endpoint/community-guidelines.md").build()

View file

@ -3,46 +3,47 @@ package com.habitrpg.android.habitica.ui.activities
import android.content.Intent
import android.os.Bundle
import android.view.View
import android.widget.Button
import android.view.ViewGroup
import androidx.core.content.ContextCompat
import androidx.core.content.res.ResourcesCompat
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentPagerAdapter
import androidx.fragment.app.FragmentStatePagerAdapter
import androidx.viewpager.widget.ViewPager
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.components.UserComponent
import com.habitrpg.android.habitica.data.ContentRepository
import com.habitrpg.android.habitica.databinding.ActivityIntroBinding
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.ui.fragments.setup.IntroFragment
import com.habitrpg.android.habitica.ui.helpers.bindView
import com.viewpagerindicator.IconPageIndicator
import com.viewpagerindicator.IconPagerAdapter
import io.reactivex.functions.Consumer
import javax.inject.Inject
class IntroActivity : BaseActivity(), View.OnClickListener, ViewPager.OnPageChangeListener {
private lateinit var binding: ActivityIntroBinding
@Inject
lateinit var contentRepository: ContentRepository
private val pager: ViewPager by bindView(R.id.viewPager)
private val indicator: IconPageIndicator by bindView(R.id.view_pager_indicator)
private val skipButton: Button by bindView(R.id.skipButton)
private val finishButton: Button by bindView(R.id.finishButton)
override fun getLayoutResId(): Int {
return R.layout.activity_intro
}
override fun getContentView(): View {
binding = ActivityIntroBinding.inflate(layoutInflater)
return binding.root
}
public override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setupIntro()
indicator.setViewPager(pager)
//binding.viewPagerIndicator.setViewPager(binding.viewPager)
this.skipButton.setOnClickListener(this)
this.finishButton.setOnClickListener(this)
binding.skipButton.setOnClickListener(this)
binding.finishButton.setOnClickListener(this)
compositeSubscription.add(contentRepository.retrieveContent(this).subscribe(Consumer { }, RxErrorHandler.handleEmptyError()))
}
@ -52,11 +53,9 @@ class IntroActivity : BaseActivity(), View.OnClickListener, ViewPager.OnPageChan
}
private fun setupIntro() {
val fragmentManager = supportFragmentManager
binding.viewPager.adapter = PagerAdapter(supportFragmentManager)
pager.adapter = PagerAdapter(fragmentManager)
pager.addOnPageChangeListener(this)
binding.viewPager.addOnPageChangeListener(this)
}
override fun onClick(v: View) {
@ -76,43 +75,19 @@ class IntroActivity : BaseActivity(), View.OnClickListener, ViewPager.OnPageChan
override fun onPageSelected(position: Int) {
if (position == 2) {
this.finishButton.visibility = View.VISIBLE
binding.finishButton.visibility = View.VISIBLE
} else {
this.finishButton.visibility = View.GONE
binding.finishButton.visibility = View.GONE
}
}
override fun onPageScrollStateChanged(state: Int) { /* no-on */ }
private inner class PagerAdapter(fm: FragmentManager) : FragmentPagerAdapter(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT), IconPagerAdapter {
private inner class PagerAdapter(fm: FragmentManager) : FragmentStatePagerAdapter(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT), IconPagerAdapter {
override fun getItem(position: Int): Fragment {
val fragment = IntroFragment()
when (position) {
0 -> {
fragment.setImage(ResourcesCompat.getDrawable(resources, R.drawable.intro_1, null))
fragment.setSubtitle(getString(R.string.intro_1_subtitle))
fragment.setTitleImage(ResourcesCompat.getDrawable(resources, R.drawable.intro_1_title, null))
fragment.setDescription(getString(R.string.intro_1_description, getString(R.string.habitica_user_count)))
fragment.setBackgroundColor(ContextCompat.getColor(this@IntroActivity, R.color.brand_300))
}
1 -> {
fragment.setImage(ResourcesCompat.getDrawable(resources, R.drawable.intro_2, null))
fragment.setSubtitle(getString(R.string.intro_2_subtitle))
fragment.setTitle(getString(R.string.intro_2_title))
fragment.setDescription(getString(R.string.intro_2_description))
fragment.setBackgroundColor(ContextCompat.getColor(this@IntroActivity, R.color.blue_10))
}
2 -> {
fragment.setImage(ResourcesCompat.getDrawable(resources, R.drawable.intro_3, null))
fragment.setSubtitle(getString(R.string.intro_3_subtitle))
fragment.setTitle(getString(R.string.intro_3_title))
fragment.setDescription(getString(R.string.intro_3_description))
fragment.setBackgroundColor(ContextCompat.getColor(this@IntroActivity, R.color.red_100))
}
}
configureFragment(fragment, position)
return fragment
}
@ -123,5 +98,39 @@ class IntroActivity : BaseActivity(), View.OnClickListener, ViewPager.OnPageChan
override fun getCount(): Int {
return 3
}
override fun instantiateItem(container: ViewGroup, position: Int): Any {
val item = super.instantiateItem(container, position)
if (item is IntroFragment) {
configureFragment(item, position)
}
return item
}
}
private fun configureFragment(fragment: IntroFragment, position: Int) {
when (position) {
0 -> {
fragment.setImage(ResourcesCompat.getDrawable(resources, R.drawable.intro_1, null))
fragment.setSubtitle(getString(R.string.intro_1_subtitle))
fragment.setTitleImage(ResourcesCompat.getDrawable(resources, R.drawable.intro_1_title, null))
fragment.setDescription(getString(R.string.intro_1_description, getString(R.string.habitica_user_count)))
fragment.setBackgroundColor(ContextCompat.getColor(this@IntroActivity, R.color.brand_300))
}
1 -> {
fragment.setImage(ResourcesCompat.getDrawable(resources, R.drawable.intro_2, null))
fragment.setSubtitle(getString(R.string.intro_2_subtitle))
fragment.setTitle(getString(R.string.intro_2_title))
fragment.setDescription(getString(R.string.intro_2_description))
fragment.setBackgroundColor(ContextCompat.getColor(this@IntroActivity, R.color.blue_10))
}
2 -> {
fragment.setImage(ResourcesCompat.getDrawable(resources, R.drawable.intro_3, null))
fragment.setSubtitle(getString(R.string.intro_3_subtitle))
fragment.setTitle(getString(R.string.intro_3_title))
fragment.setDescription(getString(R.string.intro_3_description))
fragment.setBackgroundColor(ContextCompat.getColor(this@IntroActivity, R.color.red_100))
}
}
}
}

View file

@ -13,6 +13,8 @@ import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.components.UserComponent
import com.habitrpg.android.habitica.data.InventoryRepository
import com.habitrpg.android.habitica.data.SocialRepository
import com.habitrpg.android.habitica.databinding.ActivityIntroBinding
import com.habitrpg.android.habitica.databinding.ActivityNotificationsBinding
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.models.Notification
import com.habitrpg.android.habitica.models.inventory.QuestContent
@ -20,11 +22,11 @@ import com.habitrpg.android.habitica.models.notifications.*
import com.habitrpg.android.habitica.ui.activities.MainActivity.Companion.NOTIFICATION_CLICK
import com.habitrpg.android.habitica.ui.viewmodels.NotificationsViewModel
import io.reactivex.functions.Consumer
import kotlinx.android.synthetic.main.activity_notifications.*
import javax.inject.Inject
class NotificationsActivity : BaseActivity(), androidx.swiperefreshlayout.widget.SwipeRefreshLayout.OnRefreshListener {
private lateinit var binding: ActivityNotificationsBinding
@Inject
lateinit var inventoryRepository: InventoryRepository
@Inject
@ -36,12 +38,17 @@ class NotificationsActivity : BaseActivity(), androidx.swiperefreshlayout.widget
override fun getLayoutResId(): Int = R.layout.activity_notifications
override fun getContentView(): View {
binding = ActivityNotificationsBinding.inflate(layoutInflater)
return binding.root
}
private var notifications: List<Notification> = emptyList()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setupToolbar(toolbar)
setupToolbar(binding.toolbar)
inflater = getSystemService(Context.LAYOUT_INFLATER_SERVICE) as? LayoutInflater
@ -53,7 +60,7 @@ class NotificationsActivity : BaseActivity(), androidx.swiperefreshlayout.widget
viewModel.markNotificationsAsSeen(it)
}, RxErrorHandler.handleEmptyError()))
notifications_refresh_layout?.setOnRefreshListener(this)
binding.notificationsRefreshLayout.setOnRefreshListener(this)
}
override fun injectActivity(component: UserComponent?) {
@ -69,21 +76,21 @@ class NotificationsActivity : BaseActivity(), androidx.swiperefreshlayout.widget
}
override fun onRefresh() {
notifications_refresh_layout.isRefreshing = true
binding.notificationsRefreshLayout.isRefreshing = true
compositeSubscription.add(viewModel.refreshNotifications().subscribe(Consumer {
notifications_refresh_layout.isRefreshing = false
binding.notificationsRefreshLayout.isRefreshing = false
}, RxErrorHandler.handleEmptyError()))
}
private fun setNotifications(notifications: List<Notification>) {
this.notifications = notifications
if (notification_items == null) {
if (binding.notificationItems == null) {
return
}
notification_items.removeAllViewsInLayout()
binding.notificationItems.removeAllViewsInLayout()
if (notifications.isEmpty()) {
displayNoNotificationsView()
@ -93,15 +100,15 @@ class NotificationsActivity : BaseActivity(), androidx.swiperefreshlayout.widget
}
private fun displayNoNotificationsView() {
notification_items.showDividers = LinearLayout.SHOW_DIVIDER_NONE
binding.notificationItems.showDividers = LinearLayout.SHOW_DIVIDER_NONE
notification_items.addView(inflater?.inflate(R.layout.no_notifications, notification_items, false))
binding.notificationItems.addView(inflater?.inflate(R.layout.no_notifications, binding.notificationItems, false))
}
private fun displayNotificationsListView(notifications: List<Notification>) {
notification_items.showDividers = LinearLayout.SHOW_DIVIDER_MIDDLE or LinearLayout.SHOW_DIVIDER_END
binding.notificationItems.showDividers = LinearLayout.SHOW_DIVIDER_MIDDLE or LinearLayout.SHOW_DIVIDER_END
notification_items.addView(
binding.notificationItems.addView(
createNotificationsHeaderView(notifications.count())
)
@ -121,13 +128,13 @@ class NotificationsActivity : BaseActivity(), androidx.swiperefreshlayout.widget
}
if (item != null) {
notification_items.addView(item)
binding.notificationItems.addView(item)
}
}
}
private fun createNotificationsHeaderView(notificationCount: Int): View? {
val header = inflater?.inflate(R.layout.notifications_header, notification_items, false)
val header = inflater?.inflate(R.layout.notifications_header, binding.notificationItems, false)
val badge = header?.findViewById(R.id.notifications_title_badge) as? TextView
badge?.text = notificationCount.toString()
@ -237,7 +244,7 @@ class NotificationsActivity : BaseActivity(), androidx.swiperefreshlayout.widget
imageResourceId: Int? = null,
textColor: Int? = null
): View? {
val item = inflater?.inflate(R.layout.notification_item, notification_items, false)
val item = inflater?.inflate(R.layout.notification_item, binding.notificationItems, false)
val container = item?.findViewById(R.id.notification_item) as? View
container?.setOnClickListener {
@ -337,7 +344,7 @@ class NotificationsActivity : BaseActivity(), androidx.swiperefreshlayout.widget
notification: Notification,
messageText: CharSequence,
openable: Boolean = false): View? {
val item = inflater?.inflate(R.layout.notification_item_actionable, notification_items, false)
val item = inflater?.inflate(R.layout.notification_item_actionable, binding.notificationItems, false)
if (openable) {
val container = item?.findViewById(R.id.notification_item) as? View

View file

@ -6,7 +6,6 @@ import androidx.preference.PreferenceScreen
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.components.UserComponent
import com.habitrpg.android.habitica.ui.fragments.preferences.*
import kotlinx.android.synthetic.main.activity_prefs.*
class PrefsActivity : BaseActivity(), PreferenceFragmentCompat.OnPreferenceStartScreenCallback {
@ -15,7 +14,7 @@ class PrefsActivity : BaseActivity(), PreferenceFragmentCompat.OnPreferenceStart
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setupToolbar(toolbar)
setupToolbar(findViewById(R.id.toolbar))
supportFragmentManager.beginTransaction()
.add(R.id.fragment_container, PreferencesFragment())

View file

@ -13,7 +13,6 @@ import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.ui.adapter.social.PartyMemberRecyclerViewAdapter
import com.habitrpg.android.habitica.ui.helpers.bindView
import io.reactivex.functions.Consumer
import kotlinx.android.synthetic.main.activity_prefs.*
import javax.inject.Inject
class SkillMemberActivity : BaseActivity() {
@ -36,7 +35,7 @@ class SkillMemberActivity : BaseActivity() {
public override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setupToolbar(toolbar)
setupToolbar(findViewById(R.id.toolbar))
loadMemberList()
}

View file

@ -18,7 +18,6 @@ import com.habitrpg.android.habitica.modules.AppModule
import com.habitrpg.android.habitica.ui.fragments.skills.SkillTasksRecyclerViewFragment
import com.habitrpg.android.habitica.ui.helpers.bindView
import io.reactivex.functions.Consumer
import kotlinx.android.synthetic.main.activity_prefs.*
import javax.inject.Inject
import javax.inject.Named
@ -40,7 +39,7 @@ class SkillTasksActivity : BaseActivity() {
public override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setupToolbar(toolbar)
setupToolbar(findViewById(R.id.toolbar))
loadTaskLists()
}

View file

@ -100,7 +100,7 @@ class BugFixFragment: BaseMainFragment() {
activity?.let {
val emailIntent = Intent(Intent.ACTION_SENDTO)
val mailto = "mailto:" + appConfigManager.supportEmail() +
"&subject=" + Uri.encode(subject) +
"?subject=" + Uri.encode(subject) +
"&body=" + Uri.encode(bodyOfEmail)
emailIntent.data = Uri.parse(mailto);

View file

@ -118,7 +118,7 @@ class SupportMainFragment : BaseMainFragment() {
activity?.let {
val emailIntent = Intent(Intent.ACTION_SENDTO)
val mailto = "mailto:" + appConfigManager.supportEmail() +
"&subject=" + Uri.encode(subject) +
"?subject=" + Uri.encode(subject) +
"&body=" + Uri.encode(bodyOfEmail)
emailIntent.data = Uri.parse(mailto);