Bug fixes and provide conversation tooltips (#851)

* refactor: removing unused strings and changing session header dimensions

* refactor: remove bodyTextView from LinkPreviewView.kt and changing header image colours

* fix: path layout is aligned, global search input should always prompt soft input on open

* fix: unread count and scroll to bottom button visibility properly taking into account adapter item count and RecyclerView.NO_POSITION

fixes #848

* fix: crash on error toast for failing to share logs

* feat: conversation tooltips in NewConversationButtonSetView.kt

* fix: UI issue for conversation action bar cutting off lower than baseline characters

fixes #839

* refactor (wip): replacing bindings with nullable types to try prevent mystery bug

* refactor: use the nullable bindings for ConversationActivityV2.kt and remove inputBarHeightChanged

* fix: remove recipient listener on destroy

* build: add latest strings and increase build
This commit is contained in:
Harris
2022-02-28 17:23:58 +11:00
committed by GitHub
parent a002e3e1f7
commit 55aa266769
149 changed files with 8729 additions and 17915 deletions

View File

@@ -270,7 +270,7 @@ class HomeActivity : PassphraseRequiredActionBarActivity(),
private fun setupHeaderImage() {
val isDayUiMode = UiModeUtilities.isDayUiMode(this)
val headerTint = if (isDayUiMode) R.color.black else R.color.accent
val headerTint = if (isDayUiMode) R.color.black else R.color.white
binding.sessionHeaderImage.setColorFilter(getColor(headerTint))
}

View File

@@ -8,15 +8,29 @@ import android.content.res.ColorStateList
import android.graphics.PointF
import android.os.Build
import android.util.AttributeSet
import android.util.TypedValue
import android.view.Gravity
import android.view.HapticFeedbackConstants
import android.view.MotionEvent
import android.view.View
import android.widget.ImageView
import android.widget.RelativeLayout
import android.widget.TextView
import androidx.annotation.ColorRes
import androidx.annotation.DrawableRes
import network.loki.messenger.R
import org.thoughtcrime.securesms.util.*
import org.thoughtcrime.securesms.util.GlowViewUtilities
import org.thoughtcrime.securesms.util.NewConversationButtonImageView
import org.thoughtcrime.securesms.util.UiModeUtilities
import org.thoughtcrime.securesms.util.animateSizeChange
import org.thoughtcrime.securesms.util.contains
import org.thoughtcrime.securesms.util.disableClipping
import org.thoughtcrime.securesms.util.distanceTo
import org.thoughtcrime.securesms.util.getColorWithID
import org.thoughtcrime.securesms.util.isAbove
import org.thoughtcrime.securesms.util.isLeftOf
import org.thoughtcrime.securesms.util.isRightOf
import org.thoughtcrime.securesms.util.toPx
class NewConversationButtonSetView : RelativeLayout {
private var expandedButton: Button? = null
@@ -26,9 +40,27 @@ class NewConversationButtonSetView : RelativeLayout {
// region Convenience
private val sessionButtonExpandedPosition: PointF get() { return PointF(width.toFloat() / 2 - sessionButton.expandedSize / 2 - sessionButton.shadowMargin, 0.0f) }
private val sessionTooltipExpandedPosition: PointF get() {
val x = sessionButtonExpandedPosition.x + sessionButton.width / 2 - sessionTooltip.width / 2
val y = sessionButtonExpandedPosition.y + sessionButton.height - sessionTooltip.height / 2
return PointF(x, y)
}
private val closedGroupButtonExpandedPosition: PointF get() { return PointF(width.toFloat() - closedGroupButton.expandedSize - 2 * closedGroupButton.shadowMargin, height.toFloat() - bottomMargin - closedGroupButton.expandedSize - 2 * closedGroupButton.shadowMargin) }
private val closedGroupTooltipExpandedPosition: PointF get() {
val x = closedGroupButtonExpandedPosition.x + closedGroupButton.width / 2 - closedGroupTooltip.width / 2
val y = closedGroupButtonExpandedPosition.y + closedGroupButton.height - closedGroupTooltip.height / 2
return PointF(x, y)
}
private val openGroupButtonExpandedPosition: PointF get() { return PointF(0.0f, height.toFloat() - bottomMargin - openGroupButton.expandedSize - 2 * openGroupButton.shadowMargin) }
private val openGroupTooltipExpandedPosition: PointF get() {
val x = openGroupButtonExpandedPosition.x + openGroupButton.width / 2 - openGroupTooltip.width / 2
val y = openGroupButtonExpandedPosition.y + openGroupButton.height - openGroupTooltip.height / 2
return PointF(x, y)
}
private val buttonRestPosition: PointF get() { return PointF(width.toFloat() / 2 - mainButton.expandedSize / 2 - mainButton.shadowMargin, height.toFloat() - bottomMargin - mainButton.expandedSize - 2 * mainButton.shadowMargin) }
private fun tooltipRestPosition(viewWidth: Int): PointF {
return PointF(width.toFloat() / 2 - viewWidth / 2, height.toFloat() - bottomMargin)
}
// endregion
// region Settings
@@ -41,8 +73,29 @@ class NewConversationButtonSetView : RelativeLayout {
// region Components
private val mainButton by lazy { Button(context, true, R.drawable.ic_plus) }
private val sessionButton by lazy { Button(context, false, R.drawable.ic_message) }
private val sessionTooltip by lazy {
TextView(context).apply {
setTextSize(TypedValue.COMPLEX_UNIT_SP, 10f)
setText(R.string.NewConversationButton_SessionTooltip)
isAllCaps = true
}
}
private val closedGroupButton by lazy { Button(context, false, R.drawable.ic_group) }
private val closedGroupTooltip by lazy {
TextView(context).apply {
setTextSize(TypedValue.COMPLEX_UNIT_SP, 10f)
setText(R.string.NewConversationButton_ClosedGroupTooltip)
isAllCaps = true
}
}
private val openGroupButton by lazy { Button(context, false, R.drawable.ic_globe) }
private val openGroupTooltip by lazy {
TextView(context).apply {
setTextSize(TypedValue.COMPLEX_UNIT_SP, 10f)
setText(R.string.NewConversationButton_OpenGroupTooltip)
isAllCaps = true
}
}
// endregion
// region Button
@@ -163,21 +216,27 @@ class NewConversationButtonSetView : RelativeLayout {
isHapticFeedbackEnabled = true
// Set up session button
addView(sessionButton)
addView(sessionTooltip)
sessionButton.alpha = 0.0f
sessionTooltip.alpha = 0.0f
val sessionButtonLayoutParams = sessionButton.layoutParams as LayoutParams
sessionButtonLayoutParams.addRule(CENTER_IN_PARENT, TRUE)
sessionButtonLayoutParams.addRule(ALIGN_PARENT_BOTTOM, TRUE)
sessionButtonLayoutParams.bottomMargin = bottomMargin.toInt()
// Set up closed group button
addView(closedGroupButton)
addView(closedGroupTooltip)
closedGroupButton.alpha = 0.0f
closedGroupTooltip.alpha = 0.0f
val closedGroupButtonLayoutParams = closedGroupButton.layoutParams as LayoutParams
closedGroupButtonLayoutParams.addRule(CENTER_IN_PARENT, TRUE)
closedGroupButtonLayoutParams.addRule(ALIGN_PARENT_BOTTOM, TRUE)
closedGroupButtonLayoutParams.bottomMargin = bottomMargin.toInt()
// Set up open group button
addView(openGroupButton)
addView(openGroupTooltip)
openGroupButton.alpha = 0.0f
openGroupTooltip.alpha = 0.0f
val openGroupButtonLayoutParams = openGroupButton.layoutParams as LayoutParams
openGroupButtonLayoutParams.addRule(CENTER_IN_PARENT, TRUE)
openGroupButtonLayoutParams.addRule(ALIGN_PARENT_BOTTOM, TRUE)
@@ -260,24 +319,57 @@ class NewConversationButtonSetView : RelativeLayout {
private fun expand() {
val buttonsExcludingMainButton = listOf( sessionButton, closedGroupButton, openGroupButton )
val allTooltips = listOf(sessionTooltip, closedGroupTooltip, openGroupTooltip)
sessionButton.animatePositionChange(buttonRestPosition, sessionButtonExpandedPosition)
sessionTooltip.animatePositionChange(tooltipRestPosition(sessionTooltip.width), sessionTooltipExpandedPosition)
closedGroupButton.animatePositionChange(buttonRestPosition, closedGroupButtonExpandedPosition)
closedGroupTooltip.animatePositionChange(tooltipRestPosition(closedGroupTooltip.width), closedGroupTooltipExpandedPosition)
openGroupButton.animatePositionChange(buttonRestPosition, openGroupButtonExpandedPosition)
openGroupTooltip.animatePositionChange(tooltipRestPosition(openGroupTooltip.width), openGroupTooltipExpandedPosition)
buttonsExcludingMainButton.forEach { it.animateAlphaChange(0.0f, 1.0f) }
allTooltips.forEach { it.animateAlphaChange(0.0f, 1.0f) }
postDelayed({ isExpanded = true }, Button.animationDuration)
}
private fun collapse() {
val allButtons = listOf( mainButton, sessionButton, closedGroupButton, openGroupButton )
val allTooltips = listOf(sessionTooltip, closedGroupTooltip, openGroupTooltip)
allButtons.forEach {
val currentPosition = PointF(it.x, it.y)
it.animatePositionChange(currentPosition, buttonRestPosition)
val endAlpha = if (it == mainButton) 1.0f else 0.0f
it.animateAlphaChange(it.alpha, endAlpha)
}
allTooltips.forEach {
it.animateAlphaChange(1.0f, 0.0f)
it.animatePositionChange(PointF(it.x, it.y), tooltipRestPosition(it.width))
}
postDelayed({ isExpanded = false }, Button.animationDuration)
}
// endregion
fun View.animatePositionChange(startPosition: PointF, endPosition: PointF) {
val animation = ValueAnimator.ofObject(PointFEvaluator(), startPosition, endPosition)
animation.duration = Button.animationDuration
animation.addUpdateListener { animator ->
val point = animator.animatedValue as PointF
x = point.x
y = point.y
}
animation.start()
}
fun View.animateAlphaChange(startAlpha: Float, endAlpha: Float) {
val animation = ValueAnimator.ofObject(FloatEvaluator(), startAlpha, endAlpha)
animation.duration = Button.animationDuration
animation.addUpdateListener { animator ->
alpha = animator.animatedValue as Float
}
animation.start()
}
}
// region Delegate

View File

@@ -45,7 +45,11 @@ class GlobalSearchInputLayout @JvmOverloads constructor(
override fun onFocusChange(v: View?, hasFocus: Boolean) {
if (v === binding.searchInput) {
val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
imm.hideSoftInputFromWindow(windowToken, 0)
if (!hasFocus) {
imm.hideSoftInputFromWindow(windowToken, 0)
} else {
imm.showSoftInput(v, 0)
}
listener?.onInputFocusChanged(hasFocus)
}
}