kopia lustrzana https://github.com/ryukoposting/Signal-Android
110 wiersze
3.7 KiB
Kotlin
110 wiersze
3.7 KiB
Kotlin
package org.thoughtcrime.securesms.jobs
|
|
|
|
import androidx.core.content.ContextCompat
|
|
import org.signal.core.util.logging.Log
|
|
import org.thoughtcrime.securesms.R
|
|
import org.thoughtcrime.securesms.avatar.Avatar
|
|
import org.thoughtcrime.securesms.avatar.AvatarRenderer
|
|
import org.thoughtcrime.securesms.avatar.Avatars
|
|
import org.thoughtcrime.securesms.database.SignalDatabase
|
|
import org.thoughtcrime.securesms.jobmanager.Data
|
|
import org.thoughtcrime.securesms.jobmanager.Job
|
|
import org.thoughtcrime.securesms.keyvalue.SignalStore
|
|
import org.thoughtcrime.securesms.profiles.AvatarHelper
|
|
import org.thoughtcrime.securesms.profiles.ProfileName
|
|
import org.thoughtcrime.securesms.providers.BlobProvider
|
|
import org.thoughtcrime.securesms.recipients.Recipient
|
|
import org.thoughtcrime.securesms.recipients.RecipientId
|
|
import org.thoughtcrime.securesms.transport.RetryLaterException
|
|
import java.util.concurrent.CountDownLatch
|
|
import java.util.concurrent.TimeUnit
|
|
|
|
/**
|
|
* Creates the Release Channel (Signal) recipient.
|
|
*/
|
|
class CreateReleaseChannelJob private constructor(parameters: Parameters) : BaseJob(parameters) {
|
|
companion object {
|
|
const val KEY = "CreateReleaseChannelJob"
|
|
|
|
private val TAG = Log.tag(CreateReleaseChannelJob::class.java)
|
|
|
|
fun create(): CreateReleaseChannelJob {
|
|
return CreateReleaseChannelJob(
|
|
Parameters.Builder()
|
|
.setQueue("CreateReleaseChannelJob")
|
|
.setMaxInstancesForFactory(1)
|
|
.setMaxAttempts(3)
|
|
.build()
|
|
)
|
|
}
|
|
}
|
|
|
|
override fun serialize(): Data = Data.EMPTY
|
|
|
|
override fun getFactoryKey(): String = KEY
|
|
|
|
override fun onFailure() = Unit
|
|
|
|
override fun onRun() {
|
|
if (!SignalStore.account().isRegistered) {
|
|
Log.i(TAG, "Not registered, skipping.")
|
|
return
|
|
}
|
|
|
|
if (SignalStore.releaseChannelValues().releaseChannelRecipientId != null) {
|
|
Log.i(TAG, "Already created Release Channel recipient ${SignalStore.releaseChannelValues().releaseChannelRecipientId}")
|
|
|
|
val recipient = Recipient.resolved(SignalStore.releaseChannelValues().releaseChannelRecipientId!!)
|
|
if (recipient.profileAvatar == null || recipient.profileAvatar?.isEmpty() == true) {
|
|
setAvatar(recipient.id)
|
|
}
|
|
} else {
|
|
val recipients = SignalDatabase.recipients
|
|
|
|
val releaseChannelId: RecipientId = recipients.insertReleaseChannelRecipient()
|
|
SignalStore.releaseChannelValues().setReleaseChannelRecipientId(releaseChannelId)
|
|
|
|
recipients.setProfileName(releaseChannelId, ProfileName.asGiven("Signal"))
|
|
recipients.setMuted(releaseChannelId, Long.MAX_VALUE)
|
|
setAvatar(releaseChannelId)
|
|
}
|
|
}
|
|
|
|
private fun setAvatar(id: RecipientId) {
|
|
val latch = CountDownLatch(1)
|
|
AvatarRenderer.renderAvatar(
|
|
context,
|
|
Avatar.Resource(
|
|
R.drawable.ic_signal_logo_large,
|
|
Avatars.ColorPair(ContextCompat.getColor(context, R.color.core_ultramarine), ContextCompat.getColor(context, R.color.core_white), "")
|
|
),
|
|
onAvatarRendered = { media ->
|
|
AvatarHelper.setAvatar(context, id, BlobProvider.getInstance().getStream(context, media.uri))
|
|
SignalDatabase.recipients.setProfileAvatar(id, "local")
|
|
latch.countDown()
|
|
},
|
|
onRenderFailed = { t ->
|
|
Log.w(TAG, t)
|
|
latch.countDown()
|
|
}
|
|
)
|
|
|
|
try {
|
|
val completed: Boolean = latch.await(30, TimeUnit.SECONDS)
|
|
if (!completed) {
|
|
throw RetryLaterException()
|
|
}
|
|
} catch (e: InterruptedException) {
|
|
throw RetryLaterException()
|
|
}
|
|
}
|
|
|
|
override fun onShouldRetry(e: Exception): Boolean = e is RetryLaterException
|
|
|
|
class Factory : Job.Factory<CreateReleaseChannelJob> {
|
|
override fun create(parameters: Parameters, data: Data): CreateReleaseChannelJob {
|
|
return CreateReleaseChannelJob(parameters)
|
|
}
|
|
}
|
|
}
|