mirror of
https://github.com/TwidereProject/Twidere-Android
synced 2025-02-11 01:00:42 +01:00
removed some AbsTask implementations
This commit is contained in:
parent
b533e4157d
commit
dcb8d4519c
@ -221,7 +221,7 @@ public class ParcelableUser implements Parcelable, Comparable<ParcelableUser> {
|
||||
public ParcelableUser() {
|
||||
}
|
||||
|
||||
public ParcelableUser(final UserKey account_key, final UserKey key, final String name,
|
||||
public ParcelableUser(@Nullable final UserKey account_key, final UserKey key, final String name,
|
||||
final String screenName, final String profileImageUrl) {
|
||||
this.account_key = account_key;
|
||||
this.key = key;
|
||||
|
@ -66,7 +66,6 @@ import nl.komponents.kovenant.ui.alwaysUi
|
||||
import nl.komponents.kovenant.ui.failUi
|
||||
import nl.komponents.kovenant.ui.promiseOnUi
|
||||
import nl.komponents.kovenant.ui.successUi
|
||||
import org.mariotaku.abstask.library.TaskStarter
|
||||
import org.mariotaku.kpreferences.edit
|
||||
import org.mariotaku.kpreferences.get
|
||||
import org.mariotaku.kpreferences.set
|
||||
@ -96,7 +95,7 @@ import org.mariotaku.twidere.model.util.ParcelableLocationUtils
|
||||
import org.mariotaku.twidere.preference.ComponentPickerPreference
|
||||
import org.mariotaku.twidere.provider.TwidereDataStore.Drafts
|
||||
import org.mariotaku.twidere.service.LengthyOperationsService
|
||||
import org.mariotaku.twidere.task.compose.AbsAddMediaTask
|
||||
import org.mariotaku.twidere.util.obtainMedia
|
||||
import org.mariotaku.twidere.task.status.UpdateStatusTask
|
||||
import org.mariotaku.twidere.text.MarkForDeleteSpan
|
||||
import org.mariotaku.twidere.text.style.EmojiSpan
|
||||
@ -399,9 +398,9 @@ class ComposeActivity : BaseActivity(), OnMenuItemClickListener, OnClickListener
|
||||
REQUEST_TAKE_PHOTO, REQUEST_PICK_MEDIA -> {
|
||||
if (resultCode == Activity.RESULT_OK && data != null) {
|
||||
val src = MediaPickerActivity.getMediaUris(data)
|
||||
TaskStarter.execute(AddMediaTask(this, src, null, false, false))
|
||||
performObtainMedia(src, null, false, false)
|
||||
val extras = data.getBundleExtra(MediaPickerActivity.EXTRA_EXTRAS)
|
||||
if (extras?.getBoolean(EXTRA_IS_POSSIBLY_SENSITIVE) ?: false) {
|
||||
if (extras?.getBoolean(EXTRA_IS_POSSIBLY_SENSITIVE) == true) {
|
||||
possiblySensitive = true
|
||||
}
|
||||
}
|
||||
@ -436,7 +435,7 @@ class ComposeActivity : BaseActivity(), OnMenuItemClickListener, OnClickListener
|
||||
val src = MediaPickerActivity.getMediaUris(data)?.takeIf(Array<Uri>::isNotEmpty) ?:
|
||||
data.getParcelableExtra<Uri>(EXTRA_IMAGE_URI)?.let { arrayOf(it) }
|
||||
if (src != null) {
|
||||
TaskStarter.execute(AddMediaTask(this, src, null, false, false))
|
||||
performObtainMedia(src, null, false, false)
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -834,6 +833,7 @@ class ComposeActivity : BaseActivity(), OnMenuItemClickListener, OnClickListener
|
||||
mediaPreviewAdapter.addAll(media)
|
||||
updateMediaState()
|
||||
setMenu()
|
||||
updateTextCount()
|
||||
}
|
||||
|
||||
private fun removeMedia(list: List<ParcelableMediaUpdate>) {
|
||||
@ -1057,7 +1057,7 @@ class ComposeActivity : BaseActivity(), OnMenuItemClickListener, OnClickListener
|
||||
}
|
||||
|
||||
if (extras != null) {
|
||||
if (extras.summaryText?.isNotEmpty() ?: false) {
|
||||
if (extras.summaryText?.isNotEmpty() == true) {
|
||||
editSummaryEnabled = true
|
||||
}
|
||||
editSummary.setText(extras.summaryText)
|
||||
@ -1099,7 +1099,7 @@ class ComposeActivity : BaseActivity(), OnMenuItemClickListener, OnClickListener
|
||||
val stream = intent.getStreamExtra()
|
||||
if (stream != null) {
|
||||
val src = stream.toTypedArray()
|
||||
TaskStarter.execute(AddMediaTask(this, src, null, true, false))
|
||||
performObtainMedia(src, null, true, false)
|
||||
}
|
||||
}
|
||||
else -> {
|
||||
@ -1108,7 +1108,7 @@ class ComposeActivity : BaseActivity(), OnMenuItemClickListener, OnClickListener
|
||||
val data = intent.data
|
||||
if (data != null) {
|
||||
val src = arrayOf(data)
|
||||
TaskStarter.execute(AddMediaTask(this, src, null, true, false))
|
||||
performObtainMedia(src, null, true, false)
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1791,11 +1791,17 @@ class ComposeActivity : BaseActivity(), OnMenuItemClickListener, OnClickListener
|
||||
})
|
||||
editText.customSelectionActionModeCallback = this
|
||||
editText.imageInputListener = { contentInfo ->
|
||||
val task = AddMediaTask(this, arrayOf(contentInfo.contentUri), null, true, false)
|
||||
task.callback = {
|
||||
contentInfo.releasePermission()
|
||||
val weakThis by weak(this)
|
||||
val weakContentInfo by weak(contentInfo)
|
||||
promiseOnUi {
|
||||
weakThis?.setProgressVisible(true)
|
||||
} and obtainMedia(arrayOf(contentInfo.contentUri), intArrayOf(contentInfo.inferredMediaType),
|
||||
true, false).successUi { media ->
|
||||
weakThis?.addMedia(media)
|
||||
}.alwaysUi {
|
||||
weakContentInfo?.releasePermission()
|
||||
weakThis?.setProgressVisible(false)
|
||||
}
|
||||
TaskStarter.execute(task)
|
||||
}
|
||||
editTextContainer.touchDelegate = ComposeEditTextTouchDelegate(editTextContainer, editText)
|
||||
}
|
||||
@ -1844,7 +1850,7 @@ class ComposeActivity : BaseActivity(), OnMenuItemClickListener, OnClickListener
|
||||
}
|
||||
}
|
||||
|
||||
private fun deleteMedia(media:Array<ParcelableMediaUpdate>) {
|
||||
private fun deleteMedia(media: Array<ParcelableMediaUpdate>) {
|
||||
val weakThis by weak(this)
|
||||
promiseOnUi {
|
||||
weakThis?.setProgressVisible(true)
|
||||
@ -1864,6 +1870,17 @@ class ComposeActivity : BaseActivity(), OnMenuItemClickListener, OnClickListener
|
||||
}
|
||||
}
|
||||
|
||||
private fun performObtainMedia(sources: Array<Uri>, types: IntArray?, copySrc: Boolean, deleteSrc: Boolean) {
|
||||
val weakThis by weak(this)
|
||||
promiseOnUi {
|
||||
weakThis?.setProgressVisible(true)
|
||||
} and obtainMedia(sources, types, copySrc, deleteSrc).successUi { media ->
|
||||
weakThis?.addMedia(media)
|
||||
}.alwaysUi {
|
||||
weakThis?.setProgressVisible(false)
|
||||
}
|
||||
}
|
||||
|
||||
internal object NoAddress
|
||||
|
||||
class RetweetProtectedStatusWarnFragment : BaseDialogFragment(), DialogInterface.OnClickListener {
|
||||
@ -2093,28 +2110,6 @@ class ComposeActivity : BaseActivity(), OnMenuItemClickListener, OnClickListener
|
||||
activity.setMenu()
|
||||
notifyDataSetChanged()
|
||||
}
|
||||
}
|
||||
|
||||
private class AddMediaTask(activity: ComposeActivity, sources: Array<Uri>, types: IntArray?,
|
||||
copySrc: Boolean, deleteSrc: Boolean) : AbsAddMediaTask<((List<ParcelableMediaUpdate>?) -> Unit)?>(
|
||||
activity, sources, types, copySrc, deleteSrc) {
|
||||
|
||||
override fun afterExecute(callback: ((List<ParcelableMediaUpdate>?) -> Unit)?,
|
||||
result: List<ParcelableMediaUpdate>?) {
|
||||
callback?.invoke(result)
|
||||
val activity = context as? ComposeActivity ?: return
|
||||
activity.setProgressVisible(false)
|
||||
if (result != null) {
|
||||
activity.addMedia(result)
|
||||
}
|
||||
activity.setMenu()
|
||||
activity.updateTextCount()
|
||||
}
|
||||
|
||||
override fun beforeExecute() {
|
||||
val activity = context as? ComposeActivity ?: return
|
||||
activity.setProgressVisible(true)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
@ -30,6 +30,7 @@ import org.mariotaku.twidere.TwidereConstants.QUERY_PARAM_LIMIT
|
||||
import org.mariotaku.twidere.model.CursorReference
|
||||
import org.mariotaku.twidere.util.TwidereQueryBuilder
|
||||
import org.mariotaku.twidere.util.content.ContentResolverUtils
|
||||
import java.io.FileNotFoundException
|
||||
|
||||
fun ContentResolver.query(uri: Uri, projection: Array<String>? = null,
|
||||
selection: String? = null, selectionArgs: Array<String>? = null, sortOrder: String? = null,
|
||||
@ -105,4 +106,12 @@ fun <T : Any> ContentResolver.insert(uri: Uri, obj: T, cls: Class<T> = obj.javaC
|
||||
fun <T : Any> ContentResolver.bulkInsert(uri: Uri, collection: Collection<T>, cls: Class<T>): Int {
|
||||
val creator = ObjectCursor.valuesCreatorFrom(cls)
|
||||
return ContentResolverUtils.bulkInsert(this, uri, collection.map(creator::create))
|
||||
}
|
||||
|
||||
fun ContentResolver.copyStream(src: Uri, dest: Uri) {
|
||||
openOutputStream(dest)?.use { os ->
|
||||
openInputStream(src)?.use { st ->
|
||||
st.copyTo(os)
|
||||
} ?: throw FileNotFoundException("Unable to open $src")
|
||||
} ?: throw FileNotFoundException("Unable to open $dest")
|
||||
}
|
@ -1,7 +1,9 @@
|
||||
package org.mariotaku.twidere.extension.model
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.support.v13.view.inputmethod.InputContentInfoCompat
|
||||
import org.mariotaku.twidere.model.ParcelableMedia
|
||||
import org.mariotaku.twidere.model.util.ParcelableMediaUtils
|
||||
import org.mariotaku.twidere.util.promotion.PromotionService
|
||||
|
||||
/**
|
||||
@ -49,4 +51,12 @@ val ParcelableMedia.bannerExtras: PromotionService.BannerExtras?
|
||||
get() {
|
||||
val contentUrl = this.page_url ?: this.url ?: return null
|
||||
return PromotionService.BannerExtras(contentUrl)
|
||||
}
|
||||
|
||||
@ParcelableMedia.Type
|
||||
val InputContentInfoCompat.inferredMediaType: Int
|
||||
get() = if (description.mimeTypeCount > 0) {
|
||||
ParcelableMediaUtils.inferMediaType(description.getMimeType(0))
|
||||
} else {
|
||||
ParcelableMedia.Type.IMAGE
|
||||
}
|
@ -44,9 +44,11 @@ import kotlinx.android.synthetic.main.activity_premium_dashboard.*
|
||||
import kotlinx.android.synthetic.main.fragment_messages_conversation.*
|
||||
import kotlinx.android.synthetic.main.fragment_messages_conversation.view.*
|
||||
import kotlinx.android.synthetic.main.layout_toolbar_message_conversation_title.*
|
||||
import nl.komponents.kovenant.combine.and
|
||||
import nl.komponents.kovenant.then
|
||||
import nl.komponents.kovenant.ui.alwaysUi
|
||||
import nl.komponents.kovenant.ui.promiseOnUi
|
||||
import nl.komponents.kovenant.ui.successUi
|
||||
import org.mariotaku.abstask.library.TaskStarter
|
||||
import org.mariotaku.chameleon.Chameleon
|
||||
import org.mariotaku.chameleon.ChameleonUtils
|
||||
@ -81,14 +83,13 @@ import org.mariotaku.twidere.model.event.SendMessageTaskEvent
|
||||
import org.mariotaku.twidere.model.util.AccountUtils
|
||||
import org.mariotaku.twidere.provider.TwidereDataStore.Messages
|
||||
import org.mariotaku.twidere.service.LengthyOperationsService
|
||||
import org.mariotaku.twidere.task.compose.AbsAddMediaTask
|
||||
import org.mariotaku.twidere.util.obtainMedia
|
||||
import org.mariotaku.twidere.task.twitter.message.DestroyMessageTask
|
||||
import org.mariotaku.twidere.task.twitter.message.GetMessagesTask
|
||||
import org.mariotaku.twidere.task.twitter.message.MarkMessageReadTask
|
||||
import org.mariotaku.twidere.util.*
|
||||
import org.mariotaku.twidere.view.ExtendedRecyclerView
|
||||
import org.mariotaku.twidere.view.holder.compose.MediaPreviewViewHolder
|
||||
import java.lang.ref.WeakReference
|
||||
import java.util.concurrent.atomic.AtomicReference
|
||||
|
||||
class MessagesConversationFragment : AbsContentListRecyclerViewFragment<MessagesConversationAdapter>(),
|
||||
@ -229,7 +230,7 @@ class MessagesConversationFragment : AbsContentListRecyclerViewFragment<Messages
|
||||
Activity.RESULT_OK -> if (data != null) {
|
||||
val mediaUris = MediaPickerActivity.getMediaUris(data)
|
||||
val types = data.getBundleExtra(MediaPickerActivity.EXTRA_EXTRAS)?.getIntArray(EXTRA_TYPES)
|
||||
TaskStarter.execute(AddMediaTask(this, mediaUris, types, false, false))
|
||||
performObtainMedia(mediaUris, types, false, false)
|
||||
}
|
||||
RESULT_SEARCH_GIF -> {
|
||||
startActivityForResult(gifShareProvider.createGifSelectorIntent(), REQUEST_ADD_GIF)
|
||||
@ -522,44 +523,29 @@ class MessagesConversationFragment : AbsContentListRecyclerViewFragment<Messages
|
||||
|
||||
private fun setupEditText() {
|
||||
editText.imageInputListener = { contentInfo ->
|
||||
val type = if (contentInfo.description.mimeTypeCount > 0) {
|
||||
AbsAddMediaTask.inferMediaType(contentInfo.description.getMimeType(0))
|
||||
} else {
|
||||
ParcelableMedia.Type.IMAGE
|
||||
val weakThis by weak(this)
|
||||
val weakContentInfo by weak(contentInfo)
|
||||
promiseOnUi {
|
||||
weakThis?.setProgressVisible(true)
|
||||
} and context.obtainMedia(arrayOf(contentInfo.contentUri), intArrayOf(contentInfo.inferredMediaType),
|
||||
true, false).successUi { media ->
|
||||
weakThis?.attachMedia(media)
|
||||
}.alwaysUi {
|
||||
weakThis?.setProgressVisible(false)
|
||||
weakContentInfo?.releasePermission()
|
||||
}
|
||||
val task = AddMediaTask(this, arrayOf(contentInfo.contentUri), intArrayOf(type), true,
|
||||
false)
|
||||
task.callback = {
|
||||
contentInfo.releasePermission()
|
||||
}
|
||||
TaskStarter.execute(task)
|
||||
}
|
||||
}
|
||||
|
||||
internal class AddMediaTask(
|
||||
fragment: MessagesConversationFragment,
|
||||
sources: Array<Uri>,
|
||||
types: IntArray?,
|
||||
copySrc: Boolean,
|
||||
deleteSrc: Boolean
|
||||
) : AbsAddMediaTask<((List<ParcelableMediaUpdate>?) -> Unit)?>(fragment.context, sources, types, copySrc, deleteSrc) {
|
||||
|
||||
private val fragmentRef = WeakReference(fragment)
|
||||
|
||||
override fun afterExecute(callback: ((List<ParcelableMediaUpdate>?) -> Unit)?, result: List<ParcelableMediaUpdate>?) {
|
||||
callback?.invoke(result)
|
||||
val fragment = fragmentRef.get()
|
||||
if (fragment != null && result != null) {
|
||||
fragment.setProgressVisible(false)
|
||||
fragment.attachMedia(result)
|
||||
}
|
||||
private fun performObtainMedia(sources: Array<Uri>, types: IntArray?, copySrc: Boolean, deleteSrc: Boolean) {
|
||||
val weakThis by weak(this)
|
||||
promiseOnUi {
|
||||
weakThis?.setProgressVisible(true)
|
||||
} and context.obtainMedia(sources, types, copySrc, deleteSrc).successUi { media ->
|
||||
weakThis?.attachMedia(media)
|
||||
}.alwaysUi {
|
||||
weakThis?.setProgressVisible(false)
|
||||
}
|
||||
|
||||
override fun beforeExecute() {
|
||||
val fragment = fragmentRef.get() ?: return
|
||||
fragment.setProgressVisible(true)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private fun deleteMedia(vararg media: ParcelableMediaUpdate) {
|
||||
|
@ -19,6 +19,14 @@ import org.mariotaku.twidere.model.UserKey
|
||||
*/
|
||||
object ParcelableMediaUtils {
|
||||
|
||||
fun inferMediaType(mimeType: String, def: Int = ParcelableMedia.Type.IMAGE): Int {
|
||||
return when {
|
||||
mimeType == "image/gif" -> ParcelableMedia.Type.ANIMATED_GIF
|
||||
mimeType.startsWith("video/") -> ParcelableMedia.Type.VIDEO
|
||||
mimeType.startsWith("image/") -> ParcelableMedia.Type.IMAGE
|
||||
else -> def
|
||||
}
|
||||
}
|
||||
|
||||
fun fromStatus(status: Status, accountKey: UserKey, accountType: String): Array<ParcelableMedia>? {
|
||||
return status.getEntityMedia() + status.getAttachmentMedia() + fromCard(status.card,
|
||||
|
@ -19,6 +19,63 @@
|
||||
|
||||
package org.mariotaku.twidere.util
|
||||
|
||||
import android.content.Context
|
||||
import android.net.Uri
|
||||
import android.webkit.MimeTypeMap
|
||||
import nl.komponents.kovenant.Promise
|
||||
import nl.komponents.kovenant.task
|
||||
import org.mariotaku.ktextension.weak
|
||||
import org.mariotaku.twidere.extension.copyStream
|
||||
import org.mariotaku.twidere.model.ParcelableMedia
|
||||
import org.mariotaku.twidere.model.ParcelableMediaUpdate
|
||||
import org.mariotaku.twidere.model.util.ParcelableMediaUtils
|
||||
import java.io.File
|
||||
import java.io.IOException
|
||||
|
||||
/**
|
||||
* Created by mariotaku on 2017/11/6.
|
||||
*/
|
||||
fun Context.obtainMedia(sources: Array<Uri>, types: IntArray?, copySrc: Boolean = false,
|
||||
deleteSrc: Boolean = false): Promise<List<ParcelableMediaUpdate>, Exception> {
|
||||
val weakThis by weak(this)
|
||||
return task {
|
||||
val context = weakThis ?: throw InterruptedException()
|
||||
val resolver = context.contentResolver
|
||||
return@task sources.mapIndexedNotNull map@ { index, source ->
|
||||
try {
|
||||
val mimeTypeMap = MimeTypeMap.getSingleton()
|
||||
val sourceMimeType = resolver.getType(source) ?: mimeTypeMap.getMimeTypeFromExtension(
|
||||
source.lastPathSegment.substringAfterLast('.', "tmp"))
|
||||
val mediaType = types?.get(index) ?: sourceMimeType?.let {
|
||||
return@let ParcelableMediaUtils.inferMediaType(it)
|
||||
} ?: ParcelableMedia.Type.IMAGE
|
||||
val extension = sourceMimeType?.let { mimeType ->
|
||||
mimeTypeMap.getExtensionFromMimeType(mimeType)
|
||||
} ?: "tmp"
|
||||
if (copySrc) {
|
||||
val dest = context.createTempImageUri(index, extension)
|
||||
resolver.copyStream(source, dest)
|
||||
if (deleteSrc) {
|
||||
Utils.deleteMedia(context, source)
|
||||
}
|
||||
// File is copied locally, so delete on success
|
||||
return@map ParcelableMediaUpdate(dest.toString(), mediaType).apply {
|
||||
delete_on_success = true
|
||||
}
|
||||
} else {
|
||||
return@map ParcelableMediaUpdate(source.toString(), mediaType).apply {
|
||||
delete_on_success = true
|
||||
}
|
||||
}
|
||||
} catch (e: IOException) {
|
||||
DebugLog.w(tr = e)
|
||||
return@map null
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun Context.createTempImageUri(extraNum: Int, ext: String): Uri {
|
||||
val file = File(cacheDir, "tmp_media_${System.currentTimeMillis()}_$extraNum.$ext")
|
||||
return Uri.fromFile(file)
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user