1
0
mirror of https://github.com/AllanWang/Frost-for-Facebook.git synced 2024-11-10 04:52:38 +01:00

Add intro panel

This commit is contained in:
Allan Wang 2019-07-23 00:22:48 -07:00
parent b6f05964d9
commit 66dd55a079
No known key found for this signature in database
GPG Key ID: C93E3F9C679D7A56
9 changed files with 131 additions and 32 deletions

View File

@ -45,6 +45,7 @@ import com.mikepenz.google_material_typeface_library.GoogleMaterial
import com.pitchedapps.frost.R
import com.pitchedapps.frost.intro.BaseIntroFragment
import com.pitchedapps.frost.intro.IntroAccountFragment
import com.pitchedapps.frost.intro.IntroFragmentAnalytics
import com.pitchedapps.frost.intro.IntroFragmentEnd
import com.pitchedapps.frost.intro.IntroFragmentTheme
import com.pitchedapps.frost.intro.IntroFragmentWelcome
@ -80,6 +81,7 @@ class IntroActivity : KauBaseActivity(), ViewPager.PageTransformer, ViewPager.On
IntroAccountFragment(),
IntroTabTouchFragment(),
IntroTabContextFragment(),
IntroFragmentAnalytics(),
IntroFragmentEnd()
)

View File

@ -30,10 +30,13 @@ import androidx.fragment.app.Fragment
import ca.allanwang.kau.kotlin.LazyResettableRegistry
import ca.allanwang.kau.utils.Kotterknife
import ca.allanwang.kau.utils.bindViewResettable
import ca.allanwang.kau.utils.setIcon
import ca.allanwang.kau.utils.setOnSingleTapListener
import com.mikepenz.google_material_typeface_library.GoogleMaterial
import com.pitchedapps.frost.R
import com.pitchedapps.frost.activities.IntroActivity
import com.pitchedapps.frost.utils.Prefs
import kotlinx.android.synthetic.main.intro_analytics.*
/**
* Created by Allan Wang on 2017-07-28.
@ -56,7 +59,8 @@ abstract class BaseIntroFragment(val layoutRes: Int) : Fragment() {
val increment = maxTranslation / views.size
views.forEachIndexed { i, group ->
group.forEach {
it.translationX = if (offset > 0) -maxTranslation + i * increment else -(i + 1) * increment
it.translationX =
if (offset > 0) -maxTranslation + i * increment else -(i + 1) * increment
it.alpha = 1 - Math.abs(offset)
}
}
@ -73,9 +77,14 @@ abstract class BaseIntroFragment(val layoutRes: Int) : Fragment() {
protected val image: ImageView by bindViewResettable(R.id.intro_image)
protected val desc: TextView by bindViewResettable(R.id.intro_desc)
protected fun defaultViewArray(): Array<Array<out View>> = arrayOf(arrayOf(title), arrayOf(image), arrayOf(desc))
protected fun defaultViewArray(): Array<Array<out View>> =
arrayOf(arrayOf(title), arrayOf(image), arrayOf(desc))
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(layoutRes, container, false)
}
@ -128,6 +137,31 @@ class IntroFragmentWelcome : BaseIntroFragment(R.layout.intro_welcome) {
}
}
class IntroFragmentAnalytics : BaseIntroFragment(R.layout.intro_analytics) {
val container: ConstraintLayout by bindViewResettable(R.id.intro_end_container)
override fun viewArray(): Array<Array<out View>> = arrayOf(
arrayOf(title), arrayOf(image),
arrayOf(intro_switch), arrayOf(desc)
)
override fun themeFragmentImpl() {
super.themeFragmentImpl()
image.imageTintList = ColorStateList.valueOf(Prefs.textColor)
}
@SuppressLint("ClickableViewAccessibility")
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
image.setIcon(GoogleMaterial.Icon.gmd_bug_report, 120)
intro_switch.isSelected = Prefs.analytics
intro_switch.setOnCheckedChangeListener { _, isChecked ->
Prefs.analytics = isChecked
}
}
}
class IntroFragmentEnd : BaseIntroFragment(R.layout.intro_end) {
val container: ConstraintLayout by bindViewResettable(R.id.intro_end_container)

View File

@ -17,8 +17,6 @@
package com.pitchedapps.frost.settings
import ca.allanwang.kau.kpref.activity.KPrefAdapterBuilder
import com.bugsnag.android.Bugsnag
import com.pitchedapps.frost.BuildConfig
import com.pitchedapps.frost.R
import com.pitchedapps.frost.activities.SettingsActivity
import com.pitchedapps.frost.facebook.FB_URL_BASE
@ -86,16 +84,7 @@ fun SettingsActivity.getBehaviourPrefs(): KPrefAdapterBuilder.() -> Unit = {
descRes = R.string.exit_confirmation_desc
}
checkbox(R.string.analytics, Prefs::analytics, {
if (!BuildConfig.DEBUG) {
if (it) {
Bugsnag.enableExceptionHandler()
} else {
Bugsnag.disableExceptionHandler()
}
}
Prefs.analytics = it
}) {
checkbox(R.string.analytics, Prefs::analytics, { Prefs.analytics = it }) {
descRes = R.string.analytics_desc
}
}

View File

@ -22,6 +22,7 @@ import ca.allanwang.kau.kpref.KPref
import ca.allanwang.kau.utils.colorToForeground
import ca.allanwang.kau.utils.isColorVisibleOn
import ca.allanwang.kau.utils.withAlpha
import com.bugsnag.android.Bugsnag
import com.pitchedapps.frost.BuildConfig
import com.pitchedapps.frost.enums.FACEBOOK_BLUE
import com.pitchedapps.frost.enums.FeedSort
@ -42,7 +43,9 @@ object Prefs : KPref() {
var prevId: Long by kpref("prev_id", -1L)
var theme: Int by kpref("theme", 0, postSetter = { _: Int -> loader.invalidate() })
var theme: Int by kpref("theme", 0) { _: Int ->
loader.invalidate()
}
var customTextColor: Int by kpref("color_text", 0xffeceff1.toInt())
@ -154,7 +157,15 @@ object Prefs : KPref() {
var verboseLogging: Boolean by kpref("verbose_logging", false)
var analytics: Boolean by kpref("analytics", false)
var analytics: Boolean by kpref("analytics", false) {
if (!BuildConfig.DEBUG) {
if (it) {
Bugsnag.enableExceptionHandler()
} else {
Bugsnag.disableExceptionHandler()
}
}
}
var biometricsEnabled: Boolean by kpref("biometrics_enabled", false)

View File

@ -33,8 +33,8 @@ import ca.allanwang.kau.utils.toast
import com.devbrackets.android.exomedia.ui.widget.VideoControls
import com.devbrackets.android.exomedia.ui.widget.VideoView
import com.pitchedapps.frost.R
import com.pitchedapps.frost.facebook.formattedFbUrl
import com.pitchedapps.frost.utils.L
import com.pitchedapps.frost.utils.Prefs
/**
* Created by Allan Wang on 2017-10-13.
@ -154,8 +154,7 @@ class FrostVideoView @JvmOverloads constructor(
if (isExpanded) showControls()
}
setOnErrorListener {
if (Prefs.analytics)
L.e(it) { "Failed to load video $videoUri" }
L.e(it) { "Failed to load video ${videoUri?.toString()?.formattedFbUrl}" }
toast(R.string.video_load_failed, Toast.LENGTH_SHORT)
destroy()
true
@ -168,7 +167,10 @@ class FrostVideoView @JvmOverloads constructor(
v.setOnTouchListener(VideoTouchListener(context))
setOnVideoSizedChangedListener { intrinsicWidth, intrinsicHeight, pixelWidthHeightRatio ->
// todo use provided ratio?
val ratio = Math.min(width.toFloat() / intrinsicWidth, height.toFloat() / intrinsicHeight.toFloat())
val ratio = Math.min(
width.toFloat() / intrinsicWidth,
height.toFloat() / intrinsicHeight.toFloat()
)
/**
* Only remap if not expanded and if dimensions have changed
*/
@ -237,7 +239,8 @@ class FrostVideoView @JvmOverloads constructor(
}
private fun onHorizontalSwipe(offset: Float) {
val alpha = Math.max((1f - Math.abs(offset / SWIPE_TO_CLOSE_OFFSET_THRESHOLD)) * 0.5f + 0.5f, 0f)
val alpha =
Math.max((1f - Math.abs(offset / SWIPE_TO_CLOSE_OFFSET_THRESHOLD)) * 0.5f + 0.5f, 0f)
this.alpha = alpha
}
@ -247,7 +250,8 @@ class FrostVideoView @JvmOverloads constructor(
* -------------------------------------------------------------------
*/
private inner class FrameTouchListener(context: Context) : GestureDetector.SimpleOnGestureListener(),
private inner class FrameTouchListener(context: Context) :
GestureDetector.SimpleOnGestureListener(),
View.OnTouchListener {
private val gestureDetector: GestureDetector = GestureDetector(context, this)
@ -274,7 +278,8 @@ class FrostVideoView @JvmOverloads constructor(
/**
* Monitors the view click events to show and hide the video controls if they have been specified.
*/
private inner class VideoTouchListener(context: Context) : GestureDetector.SimpleOnGestureListener(),
private inner class VideoTouchListener(context: Context) :
GestureDetector.SimpleOnGestureListener(),
View.OnTouchListener {
private val gestureDetector: GestureDetector = GestureDetector(context, this)
@ -314,7 +319,9 @@ class FrostVideoView @JvmOverloads constructor(
if (Math.abs(baseSwipeX - event.rawX) > SWIPE_TO_CLOSE_OFFSET_THRESHOLD)
destroy()
else
animate().translationX(baseTranslateX).setDuration(FAST_ANIMATION_DURATION).withStartAction {
animate().translationX(baseTranslateX).setDuration(
FAST_ANIMATION_DURATION
).withStartAction {
animate().alpha(1f)
}
}

View File

@ -1,8 +1,4 @@
v2.3.1
v2.3.2
* Hide all story panels if enabled
* Prevent swipe to refresh if not at the very top
* Add vertical swipe to dismiss when viewing images
* Add horizontal scroll support for webviews
* Fix theme for F-Droid builds
* Added Greek translations
* Disable auto feed refresh by default and add setting to re-enable it
* Update theme

View File

@ -0,0 +1,52 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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/intro_end_container"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@id/intro_title"
style="@style/IntroTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/analytics"
app:layout_constraintBottom_toTopOf="@id/intro_image"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_chainStyle="spread" />
<ImageView
android:id="@id/intro_image"
android:layout_width="120dp"
android:layout_height="120dp"
android:scaleType="fitCenter"
app:layout_constraintBottom_toTopOf="@id/intro_switch"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/intro_title"
tools:layout_editor_absoluteX="112dp" />
<Switch
android:id="@+id/intro_switch"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toTopOf="@id/intro_desc"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/intro_image" />
<TextView
android:id="@id/intro_desc"
style="@style/IntroSubTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/analytics_desc"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/intro_switch" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -86,11 +86,15 @@
<style name="IntroTitle" parent="TextAppearance.AppCompat.Title">
<item name="android:textSize">20sp</item>
<item name="android:textAlignment">center</item>
<item name="android:paddingStart">@dimen/kau_activity_horizontal_margin</item>
<item name="android:paddingEnd">@dimen/kau_activity_horizontal_margin</item>
</style>
<style name="IntroSubTitle" parent="TextAppearance.AppCompat.Subhead">
<item name="android:textSize">18sp</item>
<item name="android:textAlignment">center</item>
<item name="android:paddingStart">@dimen/kau_activity_horizontal_margin</item>
<item name="android:paddingEnd">@dimen/kau_activity_horizontal_margin</item>
</style>
<style name="IntroButton" parent="TextAppearance.AppCompat.Button">

View File

@ -1,5 +1,9 @@
# Changelog
## v2.3.2
* Disable auto feed refresh by default and add setting to re-enable it
* Update theme
## v2.3.1
* Hide all story panels if enabled
* Prevent swipe to refresh if not at the very top