1
0
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:
Mariotaku Lee 2017-11-07 19:36:09 +08:00
parent b533e4157d
commit dcb8d4519c
No known key found for this signature in database
GPG Key ID: 15C10F89D7C33535
7 changed files with 137 additions and 72 deletions

View File

@ -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;

View File

@ -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)
}
}

View File

@ -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")
}

View File

@ -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
}

View File

@ -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) {

View File

@ -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,

View File

@ -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)
}