mirror of
https://github.com/oxen-io/session-android.git
synced 2025-01-11 23:03:46 +00:00
Fixes SES-1936
This commit is contained in:
parent
fbc82d7831
commit
75e53c86b1
@ -50,7 +50,7 @@ public class AttachmentServer implements Runnable {
|
|||||||
throws IOException
|
throws IOException
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
this.context = context;
|
this.context = context.getApplicationContext();
|
||||||
this.attachment = attachment;
|
this.attachment = attachment;
|
||||||
this.socket = new ServerSocket(0, 0, InetAddress.getByAddress(new byte[]{127, 0, 0, 1}));
|
this.socket = new ServerSocket(0, 0, InetAddress.getByAddress(new byte[]{127, 0, 0, 1}));
|
||||||
this.port = socket.getLocalPort();
|
this.port = socket.getLocalPort();
|
||||||
|
@ -122,7 +122,7 @@ class ProfilePictureView @JvmOverloads constructor(
|
|||||||
|
|
||||||
glide.clear(imageView)
|
glide.clear(imageView)
|
||||||
|
|
||||||
val placeholder = PlaceholderAvatarPhoto(context, publicKey, displayName ?: "${publicKey.take(4)}...${publicKey.takeLast(4)}")
|
val placeholder = PlaceholderAvatarPhoto(publicKey, displayName ?: "${publicKey.take(4)}...${publicKey.takeLast(4)}")
|
||||||
|
|
||||||
if (signalProfilePicture != null && avatar != "0" && avatar != "") {
|
if (signalProfilePicture != null && avatar != "0" && avatar != "") {
|
||||||
glide.load(signalProfilePicture)
|
glide.load(signalProfilePicture)
|
||||||
|
@ -833,6 +833,7 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe
|
|||||||
|
|
||||||
override fun onDestroy() {
|
override fun onDestroy() {
|
||||||
viewModel.saveDraft(binding?.inputBar?.text?.trim() ?: "")
|
viewModel.saveDraft(binding?.inputBar?.text?.trim() ?: "")
|
||||||
|
cancelVoiceMessage()
|
||||||
tearDownRecipientObserver()
|
tearDownRecipientObserver()
|
||||||
super.onDestroy()
|
super.onDestroy()
|
||||||
binding = null
|
binding = null
|
||||||
|
@ -132,7 +132,12 @@ class InputBarRecordingView : RelativeLayout {
|
|||||||
private fun updateTimer() {
|
private fun updateTimer() {
|
||||||
val duration = (Date().time - startTimestamp) / 1000L
|
val duration = (Date().time - startTimestamp) / 1000L
|
||||||
binding.recordingViewDurationTextView.text = DateUtils.formatElapsedTime(duration)
|
binding.recordingViewDurationTextView.text = DateUtils.formatElapsedTime(duration)
|
||||||
snHandler.postDelayed({ updateTimer() }, 500)
|
|
||||||
|
if (isAttachedToWindow) {
|
||||||
|
// Should only update the timer if the view is still attached to the window.
|
||||||
|
// Otherwise, the timer will keep running even after the view is detached.
|
||||||
|
snHandler.postDelayed({ updateTimer() }, 500)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun lock() {
|
fun lock() {
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package org.thoughtcrime.securesms.glide
|
package org.thoughtcrime.securesms.glide
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
import android.graphics.drawable.BitmapDrawable
|
import android.graphics.drawable.BitmapDrawable
|
||||||
import com.bumptech.glide.load.Options
|
import com.bumptech.glide.load.Options
|
||||||
import com.bumptech.glide.load.model.ModelLoader
|
import com.bumptech.glide.load.model.ModelLoader
|
||||||
@ -8,7 +9,7 @@ import com.bumptech.glide.load.model.ModelLoaderFactory
|
|||||||
import com.bumptech.glide.load.model.MultiModelLoaderFactory
|
import com.bumptech.glide.load.model.MultiModelLoaderFactory
|
||||||
import org.session.libsession.avatars.PlaceholderAvatarPhoto
|
import org.session.libsession.avatars.PlaceholderAvatarPhoto
|
||||||
|
|
||||||
class PlaceholderAvatarLoader(): ModelLoader<PlaceholderAvatarPhoto, BitmapDrawable> {
|
class PlaceholderAvatarLoader(private val appContext: Context): ModelLoader<PlaceholderAvatarPhoto, BitmapDrawable> {
|
||||||
|
|
||||||
override fun buildLoadData(
|
override fun buildLoadData(
|
||||||
model: PlaceholderAvatarPhoto,
|
model: PlaceholderAvatarPhoto,
|
||||||
@ -16,14 +17,14 @@ class PlaceholderAvatarLoader(): ModelLoader<PlaceholderAvatarPhoto, BitmapDrawa
|
|||||||
height: Int,
|
height: Int,
|
||||||
options: Options
|
options: Options
|
||||||
): LoadData<BitmapDrawable> {
|
): LoadData<BitmapDrawable> {
|
||||||
return LoadData(model, PlaceholderAvatarFetcher(model.context, model))
|
return LoadData(model, PlaceholderAvatarFetcher(appContext, model))
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun handles(model: PlaceholderAvatarPhoto): Boolean = true
|
override fun handles(model: PlaceholderAvatarPhoto): Boolean = true
|
||||||
|
|
||||||
class Factory() : ModelLoaderFactory<PlaceholderAvatarPhoto, BitmapDrawable> {
|
class Factory(private val appContext: Context) : ModelLoaderFactory<PlaceholderAvatarPhoto, BitmapDrawable> {
|
||||||
override fun build(multiFactory: MultiModelLoaderFactory): ModelLoader<PlaceholderAvatarPhoto, BitmapDrawable> {
|
override fun build(multiFactory: MultiModelLoaderFactory): ModelLoader<PlaceholderAvatarPhoto, BitmapDrawable> {
|
||||||
return PlaceholderAvatarLoader()
|
return PlaceholderAvatarLoader(appContext)
|
||||||
}
|
}
|
||||||
override fun teardown() {}
|
override fun teardown() {}
|
||||||
}
|
}
|
||||||
|
@ -22,7 +22,7 @@ class HomeViewModel @Inject constructor(private val threadDb: ThreadDatabase): V
|
|||||||
|
|
||||||
private val executor = viewModelScope + SupervisorJob()
|
private val executor = viewModelScope + SupervisorJob()
|
||||||
private var lastContext: WeakReference<Context>? = null
|
private var lastContext: WeakReference<Context>? = null
|
||||||
private var updateJobs: MutableList<Job> = mutableListOf()
|
private val updateJobs: MutableList<Job> = mutableListOf()
|
||||||
|
|
||||||
private val _conversations = MutableLiveData<List<ThreadRecord>>()
|
private val _conversations = MutableLiveData<List<ThreadRecord>>()
|
||||||
val conversations: LiveData<List<ThreadRecord>> = _conversations
|
val conversations: LiveData<List<ThreadRecord>> = _conversations
|
||||||
@ -31,6 +31,15 @@ class HomeViewModel @Inject constructor(private val threadDb: ThreadDatabase): V
|
|||||||
|
|
||||||
fun tryUpdateChannel() = listUpdateChannel.trySend(Unit)
|
fun tryUpdateChannel() = listUpdateChannel.trySend(Unit)
|
||||||
|
|
||||||
|
override fun onCleared() {
|
||||||
|
super.onCleared()
|
||||||
|
|
||||||
|
for (job in updateJobs) {
|
||||||
|
job.cancel()
|
||||||
|
}
|
||||||
|
updateJobs.clear()
|
||||||
|
}
|
||||||
|
|
||||||
fun getObservable(context: Context): LiveData<List<ThreadRecord>> {
|
fun getObservable(context: Context): LiveData<List<ThreadRecord>> {
|
||||||
// If the context has changed (eg. the activity gets recreated) then
|
// If the context has changed (eg. the activity gets recreated) then
|
||||||
// we need to cancel the old executors and recreate them to prevent
|
// we need to cancel the old executors and recreate them to prevent
|
||||||
|
@ -240,19 +240,22 @@ class PathActivity : PassphraseRequiredActionBarActivity() {
|
|||||||
dotViewLayoutParams.addRule(CENTER_IN_PARENT)
|
dotViewLayoutParams.addRule(CENTER_IN_PARENT)
|
||||||
dotView.layoutParams = dotViewLayoutParams
|
dotView.layoutParams = dotViewLayoutParams
|
||||||
addView(dotView)
|
addView(dotView)
|
||||||
Handler().postDelayed({
|
postDelayed({
|
||||||
performAnimation()
|
performAnimation()
|
||||||
}, dotAnimationStartDelay)
|
}, dotAnimationStartDelay)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun performAnimation() {
|
private fun performAnimation() {
|
||||||
expand()
|
if (isAttachedToWindow) {
|
||||||
Handler().postDelayed({
|
expand()
|
||||||
collapse()
|
|
||||||
Handler().postDelayed({
|
postDelayed({
|
||||||
performAnimation()
|
collapse()
|
||||||
}, dotAnimationRepeatInterval)
|
postDelayed({
|
||||||
}, 1000)
|
performAnimation()
|
||||||
|
}, dotAnimationRepeatInterval)
|
||||||
|
}, 1000)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun expand() {
|
private fun expand() {
|
||||||
|
@ -73,7 +73,7 @@ public class SignalGlideModule extends AppGlideModule {
|
|||||||
registry.append(DecryptableUri.class, InputStream.class, new DecryptableStreamUriLoader.Factory(context));
|
registry.append(DecryptableUri.class, InputStream.class, new DecryptableStreamUriLoader.Factory(context));
|
||||||
registry.append(AttachmentModel.class, InputStream.class, new AttachmentStreamUriLoader.Factory());
|
registry.append(AttachmentModel.class, InputStream.class, new AttachmentStreamUriLoader.Factory());
|
||||||
registry.append(ChunkedImageUrl.class, InputStream.class, new ChunkedImageUrlLoader.Factory());
|
registry.append(ChunkedImageUrl.class, InputStream.class, new ChunkedImageUrlLoader.Factory());
|
||||||
registry.append(PlaceholderAvatarPhoto.class, BitmapDrawable.class, new PlaceholderAvatarLoader.Factory());
|
registry.append(PlaceholderAvatarPhoto.class, BitmapDrawable.class, new PlaceholderAvatarLoader.Factory(context));
|
||||||
registry.replace(GlideUrl.class, InputStream.class, new OkHttpUrlLoader.Factory());
|
registry.replace(GlideUrl.class, InputStream.class, new OkHttpUrlLoader.Factory());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -55,7 +55,7 @@ class IP2Country private constructor(private val context: Context) {
|
|||||||
|
|
||||||
public fun configureIfNeeded(context: Context) {
|
public fun configureIfNeeded(context: Context) {
|
||||||
if (isInitialized) { return; }
|
if (isInitialized) { return; }
|
||||||
shared = IP2Country(context)
|
shared = IP2Country(context.applicationContext)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,13 +1,10 @@
|
|||||||
package org.session.libsession.avatars
|
package org.session.libsession.avatars
|
||||||
|
|
||||||
import android.content.Context
|
|
||||||
import com.bumptech.glide.load.Key
|
import com.bumptech.glide.load.Key
|
||||||
import java.security.MessageDigest
|
import java.security.MessageDigest
|
||||||
|
|
||||||
class PlaceholderAvatarPhoto(val context: Context,
|
class PlaceholderAvatarPhoto(val hashString: String,
|
||||||
val hashString: String,
|
|
||||||
val displayName: String): Key {
|
val displayName: String): Key {
|
||||||
|
|
||||||
override fun updateDiskCacheKey(messageDigest: MessageDigest) {
|
override fun updateDiskCacheKey(messageDigest: MessageDigest) {
|
||||||
messageDigest.update(hashString.encodeToByteArray())
|
messageDigest.update(hashString.encodeToByteArray())
|
||||||
messageDigest.update(displayName.encodeToByteArray())
|
messageDigest.update(displayName.encodeToByteArray())
|
||||||
|
@ -70,7 +70,7 @@ public class Recipient implements RecipientModifiedListener {
|
|||||||
private final @NonNull Address address;
|
private final @NonNull Address address;
|
||||||
private final @NonNull List<Recipient> participants = new LinkedList<>();
|
private final @NonNull List<Recipient> participants = new LinkedList<>();
|
||||||
|
|
||||||
private Context context;
|
private final Context context;
|
||||||
private @Nullable String name;
|
private @Nullable String name;
|
||||||
private @Nullable String customLabel;
|
private @Nullable String customLabel;
|
||||||
private boolean resolving;
|
private boolean resolving;
|
||||||
@ -132,7 +132,7 @@ public class Recipient implements RecipientModifiedListener {
|
|||||||
@NonNull Optional<RecipientDetails> details,
|
@NonNull Optional<RecipientDetails> details,
|
||||||
@NonNull ListenableFutureTask<RecipientDetails> future)
|
@NonNull ListenableFutureTask<RecipientDetails> future)
|
||||||
{
|
{
|
||||||
this.context = context;
|
this.context = context.getApplicationContext();
|
||||||
this.address = address;
|
this.address = address;
|
||||||
this.color = null;
|
this.color = null;
|
||||||
this.resolving = true;
|
this.resolving = true;
|
||||||
@ -259,7 +259,7 @@ public class Recipient implements RecipientModifiedListener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Recipient(@NonNull Context context, @NonNull Address address, @NonNull RecipientDetails details) {
|
Recipient(@NonNull Context context, @NonNull Address address, @NonNull RecipientDetails details) {
|
||||||
this.context = context;
|
this.context = context.getApplicationContext();
|
||||||
this.address = address;
|
this.address = address;
|
||||||
this.contactUri = details.contactUri;
|
this.contactUri = details.contactUri;
|
||||||
this.name = details.name;
|
this.name = details.name;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user