mirror of
https://github.com/oxen-io/session-android.git
synced 2023-12-14 02:53:01 +01:00
* Update build tools
* Update appcompat version
* Update dependencies
* feat: add paging into conversation recycler and queries to fetch data off-thread
* refactor: wip for updating paged results and bucketing messages / fetching enough to display
* fix: currently works for scrolling and possibly refreshing? need scroll to message and auto scroll down on insert (at bottom)
* fix: search and scrolling to X message works now
* build: increase version code and name
* fix: re-add refresh, remove the outdated comment
* refactor: lets see if 25 size pages increases performance 👀
* feat: add in some equals overrides for mms records to refresh if media has finished DLing
* feat: add scroll to bottom for new messages if we are at the end of the chat
* build: update build numbers
* fix: update AGP and fix compile errors for sdk version 31
* feat: add log for loki-avatar and loki-fs on upload types and responses
* feat: increase build number to match latest installed version
* feat: changing props and permission checks for call service
* fix: possible service exception when no call ID remote foreground service not terminated
* revert: google services version
* fix: re-add paging dependency
* feat: adding new last seen function and figuring out the last seen for recycler adapter
* build: update version names and codes for deploy
* refactor: undo the new adapter and query changes to use previous cursor logic. revert this commit to enable new paged adapter
* fix: use author's address in typist equality and hashcode for set inclusion
* refactor: refactor the select contacts activity
* refactor: refactor the select contacts activity
* build: update version code
* fix: hide all other bound views if deleted
* refactor: change voice message tint, upgrade build number
* fix: message detail showing up properly
* revert: realise copy public key is actually not allowed if open group participant
* fix: copy session ID, message detail activity support re-enabled
* build: update build version code
* build: remove version name
* build: update build code
* feat: google services version minimum compatible
* fix: selection for re-created objects not properly highlighting
* fix: foreground CENTER_INSIDE instead of just CENTER for scaletype
* build: update version code
* fix: don't show error if no error
* build: update version code
* fix: clear error messages if any on successful send
Co-authored-by: charles <charles@oxen.io>
169 lines
8.5 KiB
Kotlin
169 lines
8.5 KiB
Kotlin
package org.thoughtcrime.securesms.onboarding
|
|
|
|
import android.animation.ArgbEvaluator
|
|
import android.animation.ValueAnimator
|
|
import android.app.AlertDialog
|
|
import android.content.Intent
|
|
import android.graphics.drawable.TransitionDrawable
|
|
import android.net.Uri
|
|
import android.os.Bundle
|
|
import android.view.Menu
|
|
import android.view.MenuItem
|
|
import android.view.View
|
|
import android.widget.Toast
|
|
import androidx.annotation.ColorInt
|
|
import androidx.annotation.DrawableRes
|
|
import network.loki.messenger.R
|
|
import network.loki.messenger.databinding.ActivityPnModeBinding
|
|
import org.session.libsession.utilities.TextSecurePreferences
|
|
import org.session.libsession.utilities.ThemeUtil
|
|
import org.thoughtcrime.securesms.ApplicationContext
|
|
import org.thoughtcrime.securesms.BaseActionBarActivity
|
|
import org.thoughtcrime.securesms.home.HomeActivity
|
|
import org.thoughtcrime.securesms.util.GlowViewUtilities
|
|
import org.thoughtcrime.securesms.util.PNModeView
|
|
import org.thoughtcrime.securesms.util.disableClipping
|
|
import org.thoughtcrime.securesms.util.getAccentColor
|
|
import org.thoughtcrime.securesms.util.getColorWithID
|
|
import org.thoughtcrime.securesms.util.setUpActionBarSessionLogo
|
|
import org.thoughtcrime.securesms.util.show
|
|
|
|
class PNModeActivity : BaseActionBarActivity() {
|
|
private lateinit var binding: ActivityPnModeBinding
|
|
private var selectedOptionView: PNModeView? = null
|
|
|
|
// region Lifecycle
|
|
override fun onCreate(savedInstanceState: Bundle?) {
|
|
super.onCreate(savedInstanceState)
|
|
setUpActionBarSessionLogo(true)
|
|
TextSecurePreferences.setHasSeenWelcomeScreen(this, true)
|
|
binding = ActivityPnModeBinding.inflate(layoutInflater)
|
|
setContentView(binding.root)
|
|
with(binding) {
|
|
contentView.disableClipping()
|
|
fcmOptionView.setOnClickListener { toggleFCM() }
|
|
fcmOptionView.mainColor = ThemeUtil.getThemedColor(root.context, R.attr.colorPrimary)
|
|
fcmOptionView.strokeColor = resources.getColorWithID(R.color.pn_option_border, theme)
|
|
backgroundPollingOptionView.setOnClickListener { toggleBackgroundPolling() }
|
|
backgroundPollingOptionView.mainColor = ThemeUtil.getThemedColor(root.context, R.attr.colorPrimary)
|
|
backgroundPollingOptionView.strokeColor = resources.getColorWithID(R.color.pn_option_border, theme)
|
|
registerButton.setOnClickListener { register() }
|
|
}
|
|
toggleFCM()
|
|
}
|
|
|
|
override fun onCreateOptionsMenu(menu: Menu): Boolean {
|
|
menuInflater.inflate(R.menu.menu_pn_mode, menu)
|
|
return true
|
|
}
|
|
// endregion
|
|
|
|
// region Animation
|
|
private fun performTransition(@DrawableRes transitionID: Int, subject: View) {
|
|
val drawable = resources.getDrawable(transitionID, theme) as TransitionDrawable
|
|
subject.background = drawable
|
|
drawable.startTransition(250)
|
|
}
|
|
// endregion
|
|
|
|
// region Interaction
|
|
override fun onOptionsItemSelected(item: MenuItem): Boolean {
|
|
when(item.itemId) {
|
|
R.id.learnMoreButton -> learnMore()
|
|
else -> { /* Do nothing */ }
|
|
}
|
|
return super.onOptionsItemSelected(item)
|
|
}
|
|
|
|
private fun learnMore() {
|
|
try {
|
|
val url = "https://getsession.org/faq/#privacy"
|
|
val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url))
|
|
startActivity(intent)
|
|
} catch (e: Exception) {
|
|
Toast.makeText(this, R.string.invalid_url, Toast.LENGTH_SHORT).show()
|
|
}
|
|
}
|
|
|
|
private fun toggleFCM() = with(binding) {
|
|
val accentColor = getAccentColor()
|
|
when (selectedOptionView) {
|
|
null -> {
|
|
performTransition(R.drawable.pn_option_background_select_transition, fcmOptionView)
|
|
GlowViewUtilities.animateShadowColorChange(fcmOptionView, resources.getColorWithID(R.color.transparent, theme), accentColor)
|
|
animateStrokeColorChange(fcmOptionView, resources.getColorWithID(R.color.pn_option_border, theme), accentColor)
|
|
selectedOptionView = fcmOptionView
|
|
}
|
|
fcmOptionView -> {
|
|
performTransition(R.drawable.pn_option_background_deselect_transition, fcmOptionView)
|
|
GlowViewUtilities.animateShadowColorChange(fcmOptionView, accentColor, resources.getColorWithID(R.color.transparent, theme))
|
|
animateStrokeColorChange(fcmOptionView, accentColor, resources.getColorWithID(R.color.pn_option_border, theme))
|
|
selectedOptionView = null
|
|
}
|
|
backgroundPollingOptionView -> {
|
|
performTransition(R.drawable.pn_option_background_select_transition, fcmOptionView)
|
|
GlowViewUtilities.animateShadowColorChange(fcmOptionView, resources.getColorWithID(R.color.transparent, theme), accentColor)
|
|
animateStrokeColorChange(fcmOptionView, resources.getColorWithID(R.color.pn_option_border, theme), accentColor)
|
|
performTransition(R.drawable.pn_option_background_deselect_transition, backgroundPollingOptionView)
|
|
GlowViewUtilities.animateShadowColorChange(backgroundPollingOptionView, accentColor, resources.getColorWithID(R.color.transparent, theme))
|
|
animateStrokeColorChange(backgroundPollingOptionView, accentColor, resources.getColorWithID(R.color.pn_option_border, theme))
|
|
selectedOptionView = fcmOptionView
|
|
}
|
|
}
|
|
}
|
|
|
|
private fun toggleBackgroundPolling() = with(binding) {
|
|
val accentColor = getAccentColor()
|
|
when (selectedOptionView) {
|
|
null -> {
|
|
performTransition(R.drawable.pn_option_background_select_transition, backgroundPollingOptionView)
|
|
GlowViewUtilities.animateShadowColorChange(backgroundPollingOptionView, resources.getColorWithID(R.color.transparent, theme), accentColor)
|
|
animateStrokeColorChange(backgroundPollingOptionView, resources.getColorWithID(R.color.pn_option_border, theme), accentColor)
|
|
selectedOptionView = backgroundPollingOptionView
|
|
}
|
|
backgroundPollingOptionView -> {
|
|
performTransition(R.drawable.pn_option_background_deselect_transition, backgroundPollingOptionView)
|
|
GlowViewUtilities.animateShadowColorChange(backgroundPollingOptionView, accentColor, resources.getColorWithID(R.color.transparent, theme))
|
|
animateStrokeColorChange(backgroundPollingOptionView, accentColor, resources.getColorWithID(R.color.pn_option_border, theme))
|
|
selectedOptionView = null
|
|
}
|
|
fcmOptionView -> {
|
|
performTransition(R.drawable.pn_option_background_select_transition, backgroundPollingOptionView)
|
|
GlowViewUtilities.animateShadowColorChange(backgroundPollingOptionView, resources.getColorWithID(R.color.transparent, theme), accentColor)
|
|
animateStrokeColorChange(backgroundPollingOptionView, resources.getColorWithID(R.color.pn_option_border, theme), accentColor)
|
|
performTransition(R.drawable.pn_option_background_deselect_transition, fcmOptionView)
|
|
GlowViewUtilities.animateShadowColorChange(fcmOptionView, accentColor, resources.getColorWithID(R.color.transparent, theme))
|
|
animateStrokeColorChange(fcmOptionView, accentColor, resources.getColorWithID(R.color.pn_option_border, theme))
|
|
selectedOptionView = backgroundPollingOptionView
|
|
}
|
|
}
|
|
}
|
|
|
|
private fun animateStrokeColorChange(bubble: PNModeView, @ColorInt startColor: Int, @ColorInt endColor: Int) {
|
|
val animation = ValueAnimator.ofObject(ArgbEvaluator(), startColor, endColor)
|
|
animation.duration = 250
|
|
animation.addUpdateListener { animator ->
|
|
val color = animator.animatedValue as Int
|
|
bubble.strokeColor = color
|
|
}
|
|
animation.start()
|
|
}
|
|
|
|
private fun register() {
|
|
if (selectedOptionView == null) {
|
|
val dialog = AlertDialog.Builder(this)
|
|
dialog.setTitle(R.string.activity_pn_mode_no_option_picked_dialog_title)
|
|
dialog.setPositiveButton(R.string.ok) { _, _ -> }
|
|
dialog.create().show()
|
|
return
|
|
}
|
|
TextSecurePreferences.setIsUsingFCM(this, (selectedOptionView == binding.fcmOptionView))
|
|
val application = ApplicationContext.getInstance(this)
|
|
application.startPollingIfNeeded()
|
|
application.registerForFCMIfNeeded(true)
|
|
val intent = Intent(this, HomeActivity::class.java)
|
|
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
|
|
show(intent)
|
|
}
|
|
// endregion
|
|
} |