Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Debug mode support upload album #3190

Draft
wants to merge 1 commit into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package one.mixin.android.api.request

import com.google.gson.annotations.SerializedName

data class AlbumUploadRequest(
@SerializedName("data_zip_base64")
val dataZipBase64: String
)
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import kotlinx.coroutines.Deferred
import one.mixin.android.api.MixinResponse
import one.mixin.android.api.request.AccountRequest
import one.mixin.android.api.request.AccountUpdateRequest
import one.mixin.android.api.request.AlbumUploadRequest
import one.mixin.android.api.request.CollectibleRequest
import one.mixin.android.api.request.DeactivateRequest
import one.mixin.android.api.request.DeactivateVerificationRequest
Expand Down Expand Up @@ -142,4 +143,7 @@ interface AccountService {

@GET("external/schemes")
suspend fun getExternalSchemes(): MixinResponse<Set<String>>

@POST("albums")
suspend fun uploadAlbum(@Body albumUploadRequest: AlbumUploadRequest): MixinResponse<StickerAlbum>
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ fun String.base64Encode() = toByteArray().base64Encode()

fun ByteArray.base64Encode(): String = Base64.encodeBytes(this)

fun ByteArray.base64RawEncode(): String = android.util.Base64.encodeToString(this, android.util.Base64.URL_SAFE or android.util.Base64.NO_PADDING)

fun String.decodeBase64(): ByteArray {
return android.util.Base64.decode(this, android.util.Base64.DEFAULT)
}
Expand Down
32 changes: 32 additions & 0 deletions app/src/main/java/one/mixin/android/job/RefreshAlbumStickersJob.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package one.mixin.android.job

import com.birbit.android.jobqueue.Params
import kotlinx.coroutines.runBlocking
import one.mixin.android.db.insertUpdate
import one.mixin.android.vo.Sticker
import one.mixin.android.vo.StickerRelationship

class RefreshAlbumStickersJob(
private val albumId: String,
) : BaseJob(
Params(PRIORITY_UI_HIGH).addTags(GROUP).requireNetwork()
) {

companion object {
private const val serialVersionUID = 1L
const val GROUP = "RefreshAlbumStickersJob"
}

override fun onRun() = runBlocking {
val r = accountService.getStickersByAlbumIdSuspend(albumId)
if (r.isSuccess && r.data != null) {
val stickers = r.data as List<Sticker>
val relationships = arrayListOf<StickerRelationship>()
for (s in stickers) {
stickerDao.insertUpdate(s)
relationships.add(StickerRelationship(albumId, s.stickerId))
}
stickerRelationshipDao.insertList(relationships)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import one.mixin.android.Constants.PIN_ERROR_MAX
import one.mixin.android.api.MixinResponse
import one.mixin.android.api.request.AccountRequest
import one.mixin.android.api.request.AccountUpdateRequest
import one.mixin.android.api.request.AlbumUploadRequest
import one.mixin.android.api.request.AuthorizeRequest
import one.mixin.android.api.request.CollectibleRequest
import one.mixin.android.api.request.DeactivateRequest
Expand Down Expand Up @@ -331,4 +332,6 @@ constructor(
suspend fun modifySessionSecret(request: SessionSecretRequest) = accountService.modifySessionSecret(request)

suspend fun getExternalSchemes() = accountService.getExternalSchemes()

suspend fun uploadAlbum(albumUploadRequest: AlbumUploadRequest) = accountService.uploadAlbum(albumUploadRequest)
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import one.mixin.android.Constants.FIXED_LOAD_SIZE
import one.mixin.android.Constants.PAGE_SIZE
import one.mixin.android.MixinApplication
import one.mixin.android.api.handleMixinResponse
import one.mixin.android.api.request.AlbumUploadRequest
import one.mixin.android.api.request.ConversationRequest
import one.mixin.android.api.request.DisappearRequest
import one.mixin.android.api.request.ParticipantRequest
Expand All @@ -39,6 +40,7 @@ import one.mixin.android.extension.putString
import one.mixin.android.job.AttachmentDownloadJob
import one.mixin.android.job.ConvertVideoJob
import one.mixin.android.job.MixinJobManager
import one.mixin.android.job.RefreshAlbumStickersJob
import one.mixin.android.job.RefreshStickerAlbumJob
import one.mixin.android.job.RefreshStickerAndRelatedAlbumJob
import one.mixin.android.job.RefreshUserJob
Expand Down Expand Up @@ -80,6 +82,7 @@ import one.mixin.android.vo.PinMessageData
import one.mixin.android.vo.PinMessageMinimal
import one.mixin.android.vo.QuoteMessageItem
import one.mixin.android.vo.Sticker
import one.mixin.android.vo.StickerAlbum
import one.mixin.android.vo.StickerAlbumAdded
import one.mixin.android.vo.StickerAlbumOrder
import one.mixin.android.vo.TranscriptMessage
Expand Down Expand Up @@ -822,4 +825,13 @@ internal constructor(

suspend fun updateConversationExpireIn(conversationId: String, expireIn: Long?) =
conversationRepository.updateConversationExpireIn(conversationId, expireIn)

suspend fun uploadAlbum(albumUploadRequest: AlbumUploadRequest) =
accountRepository.uploadAlbum(albumUploadRequest)

suspend fun saveAlbum(album: StickerAlbum) {
album.added = true
accountRepository.insertAlbumSuspend(album)
jobManager.addJobInBackground(RefreshAlbumStickersJob(album.albumId))
}
}
Original file line number Diff line number Diff line change
@@ -1,16 +1,28 @@
package one.mixin.android.ui.sticker

import android.Manifest
import android.os.Bundle
import android.view.View
import androidx.activity.result.contract.ActivityResultContracts
import androidx.fragment.app.viewModels
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.tbruyelle.rxpermissions2.RxPermissions
import com.uber.autodispose.autoDispose
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import one.mixin.android.BuildConfig
import one.mixin.android.R
import one.mixin.android.api.handleMixinResponse
import one.mixin.android.api.request.AlbumUploadRequest
import one.mixin.android.databinding.FragmentStickerAlbumManagementBinding
import one.mixin.android.extension.base64RawEncode
import one.mixin.android.extension.indeterminateProgressDialog
import one.mixin.android.extension.openPermissionSetting
import one.mixin.android.ui.common.BaseFragment
import one.mixin.android.ui.conversation.ConversationViewModel
import one.mixin.android.util.viewBinding
Expand All @@ -33,10 +45,55 @@ class StickerAlbumManagementFragment : BaseFragment(R.layout.fragment_sticker_al

private lateinit var itemTouchHelper: ItemTouchHelper

private val selectZip = registerForActivityResult(ActivityResultContracts.GetContent()) { uri ->
if (uri == null) return@registerForActivityResult

lifecycleScope.launch {
val dialog = indeterminateProgressDialog(
message = R.string.Please_wait_a_bit,
title = R.string.Creating
).apply {
setCancelable(false)
}
dialog.show()

val albumUploadRequest = withContext(Dispatchers.IO) {
val bytes = requireContext().contentResolver.openInputStream(uri)?.readBytes()
if (bytes == null) {
null
} else {
AlbumUploadRequest(bytes.base64RawEncode())
}
}
if (albumUploadRequest == null) {
dialog.dismiss()
return@launch
}

handleMixinResponse(
invokeNetwork = { viewModel.uploadAlbum(albumUploadRequest) },
switchContext = Dispatchers.IO,
successBlock = { rep ->
val album = requireNotNull(rep.data)
viewModel.saveAlbum(album)
},
doAfterNetworkSuccess = { dialog.dismiss() },
exceptionBlock = {
dialog.dismiss()
return@handleMixinResponse false
}
)
}
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.apply {
title.leftIb.setOnClickListener { activity?.onBackPressedDispatcher?.onBackPressed() }
if (BuildConfig.DEBUG) {
title.setRightIcon(R.drawable.ic_add_black_24dp)
title.rightIb.setOnClickListener { uploadAlbum() }
}
val callback: ItemTouchHelper.Callback = SimpleItemTouchHelperCallback(albumAdapter)
itemTouchHelper = ItemTouchHelper(callback)
itemTouchHelper.attachToRecyclerView(albumsRv)
Expand Down Expand Up @@ -78,4 +135,21 @@ class StickerAlbumManagementFragment : BaseFragment(R.layout.fragment_sticker_al
}
}
}

private fun uploadAlbum() {
RxPermissions(requireActivity())
.request(Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE)
.autoDispose(stopScope)
.subscribe(
{ granted ->
if (granted) {
selectZip.launch("application/zip")
} else {
context?.openPermissionSetting()
}
},
{
}
)
}
}
7 changes: 7 additions & 0 deletions app/src/main/java/one/mixin/android/widget/TitleView.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@ import android.util.AttributeSet
import android.view.LayoutInflater
import android.view.View
import android.widget.RelativeLayout
import androidx.annotation.DrawableRes
import androidx.core.content.ContextCompat
import androidx.core.view.isVisible
import one.mixin.android.R
import one.mixin.android.databinding.ViewTitleBinding

Expand Down Expand Up @@ -85,6 +87,11 @@ class TitleView(context: Context, attrs: AttributeSet) : RelativeLayout(context,
}
}

fun setRightIcon(@DrawableRes resId: Int) {
rightIb.setImageResource(resId)
rightAnimator.isVisible = true
}

companion object {
val POS_TEXT = 1
}
Expand Down