code cleanup

This commit is contained in:
Mariotaku Lee 2017-04-07 12:12:34 +08:00
parent 21a325ebda
commit 4f13376e78
No known key found for this signature in database
GPG Key ID: 15C10F89D7C33535
56 changed files with 248 additions and 248 deletions

View File

@ -1 +1 @@
27572907b9df93dc524c921ad30e2bfe1e2ec75c 64f8fa2e8644a79a84902f7a32cdf7b4b4d8e674

View File

@ -4,7 +4,7 @@ package org.mariotaku.ktextension
* Created by mariotaku on 16/7/30. * Created by mariotaku on 16/7/30.
*/ */
fun String?.toLong(def: Long): Long { fun String?.toLongOr(def: Long): Long {
try { try {
return this?.toLong() ?: def return this?.toLong() ?: def
} catch (e: NumberFormatException) { } catch (e: NumberFormatException) {
@ -12,7 +12,7 @@ fun String?.toLong(def: Long): Long {
} }
} }
fun String?.toInt(def: Int): Int { fun String?.toIntOr(def: Int): Int {
try { try {
return this?.toInt() ?: def return this?.toInt() ?: def
} catch (e: NumberFormatException) { } catch (e: NumberFormatException) {
@ -20,7 +20,7 @@ fun String?.toInt(def: Int): Int {
} }
} }
fun String?.toDouble(def: Double): Double { fun String?.toDoubleOr(def: Double): Double {
try { try {
return this?.toDouble() ?: def return this?.toDouble() ?: def
} catch (e: NumberFormatException) { } catch (e: NumberFormatException) {

View File

@ -60,7 +60,6 @@ import com.bumptech.glide.Glide
import com.twitter.Extractor import com.twitter.Extractor
import com.twitter.Validator import com.twitter.Validator
import kotlinx.android.synthetic.main.activity_compose.* import kotlinx.android.synthetic.main.activity_compose.*
import org.apache.commons.lang3.ArrayUtils
import org.mariotaku.abstask.library.AbstractTask import org.mariotaku.abstask.library.AbstractTask
import org.mariotaku.abstask.library.TaskStarter import org.mariotaku.abstask.library.TaskStarter
import org.mariotaku.kpreferences.get import org.mariotaku.kpreferences.get
@ -254,7 +253,7 @@ class ComposeActivity : BaseActivity(), OnMenuItemClickListener, OnClickListener
} }
setLabel(intent) setLabel(intent)
val selectedAccountIds = accountsAdapter.selectedAccountKeys val selectedAccountIds = accountsAdapter.selectedAccountKeys
if (ArrayUtils.isEmpty(selectedAccountIds)) { if (selectedAccountIds.isNullOrEmpty()) {
val idsInPrefs: Array<UserKey> = kPreferences[composeAccountsKey] ?: emptyArray() val idsInPrefs: Array<UserKey> = kPreferences[composeAccountsKey] ?: emptyArray()
val intersection: Array<UserKey> = defaultAccountIds.intersect(listOf(*idsInPrefs)).toTypedArray() val intersection: Array<UserKey> = defaultAccountIds.intersect(listOf(*idsInPrefs)).toTypedArray()
@ -1194,11 +1193,7 @@ class ComposeActivity : BaseActivity(), OnMenuItemClickListener, OnClickListener
private fun notifyAccountSelectionChanged() { private fun notifyAccountSelectionChanged() {
displaySelectedAccountsIcon() displaySelectedAccountsIcon()
val accounts = accountsAdapter.selectedAccounts val accounts = accountsAdapter.selectedAccounts
if (ArrayUtils.isEmpty(accounts)) { editText.accountKey = accounts.firstOrNull()?.key ?: Utils.getDefaultAccountKey(this)
editText.accountKey = Utils.getDefaultAccountKey(this)
} else {
editText.accountKey = accounts[0].key
}
statusTextCount.maxLength = accounts.textLimit statusTextCount.maxLength = accounts.textLimit
setMenu() setMenu()
} }

View File

@ -42,7 +42,7 @@ import android.view.Window
import kotlinx.android.synthetic.main.activity_link_handler.* import kotlinx.android.synthetic.main.activity_link_handler.*
import org.mariotaku.kpreferences.get import org.mariotaku.kpreferences.get
import org.mariotaku.ktextension.set import org.mariotaku.ktextension.set
import org.mariotaku.ktextension.toDouble import org.mariotaku.ktextension.toDoubleOr
import org.mariotaku.twidere.Constants.* import org.mariotaku.twidere.Constants.*
import org.mariotaku.twidere.R import org.mariotaku.twidere.R
import org.mariotaku.twidere.activity.iface.IControlBarActivity import org.mariotaku.twidere.activity.iface.IControlBarActivity
@ -559,8 +559,8 @@ class LinkHandlerActivity : BaseActivity(), SystemWindowsInsetsCallback, IContro
LINK_ID_MAP -> { LINK_ID_MAP -> {
accountRequired = false accountRequired = false
if (!args.containsKey(EXTRA_LATITUDE) && !args.containsKey(EXTRA_LONGITUDE)) { if (!args.containsKey(EXTRA_LATITUDE) && !args.containsKey(EXTRA_LONGITUDE)) {
val lat = uri.getQueryParameter(QUERY_PARAM_LAT).toDouble(Double.NaN) val lat = uri.getQueryParameter(QUERY_PARAM_LAT).toDoubleOr(Double.NaN)
val lng = uri.getQueryParameter(QUERY_PARAM_LNG).toDouble(Double.NaN) val lng = uri.getQueryParameter(QUERY_PARAM_LNG).toDoubleOr(Double.NaN)
if (lat.isNaN() || lng.isNaN()) return null if (lat.isNaN() || lng.isNaN()) return null
args.putDouble(EXTRA_LATITUDE, lat) args.putDouble(EXTRA_LATITUDE, lat)
args.putDouble(EXTRA_LONGITUDE, lng) args.putDouble(EXTRA_LONGITUDE, lng)

View File

@ -49,7 +49,6 @@ import android.view.View.OnClickListener
import android.widget.EditText import android.widget.EditText
import android.widget.TextView import android.widget.TextView
import android.widget.Toast import android.widget.Toast
import com.bluelinelabs.logansquare.LoganSquare
import kotlinx.android.synthetic.main.activity_sign_in.* import kotlinx.android.synthetic.main.activity_sign_in.*
import nl.komponents.kovenant.combine.and import nl.komponents.kovenant.combine.and
import nl.komponents.kovenant.task import nl.komponents.kovenant.task

View File

@ -5,8 +5,7 @@ import android.content.Intent
import android.net.Uri import android.net.Uri
import android.os.Bundle import android.os.Bundle
import android.text.TextUtils import android.text.TextUtils
import org.apache.commons.lang3.ArrayUtils import org.mariotaku.ktextension.toLongOr
import org.mariotaku.ktextension.toLong
import org.mariotaku.twidere.R import org.mariotaku.twidere.R
import org.mariotaku.twidere.TwidereConstants.* import org.mariotaku.twidere.TwidereConstants.*
import org.mariotaku.twidere.app.TwidereApplication import org.mariotaku.twidere.app.TwidereApplication
@ -167,7 +166,7 @@ class WebLinkHandlerActivity : Activity() {
return Pair(Intent(Intent.ACTION_VIEW, builder.build()), true) return Pair(Intent(Intent.ACTION_VIEW, builder.build()), true)
} }
else -> { else -> {
if (ArrayUtils.contains(TWITTER_RESERVED_PATHS, pathSegments[0])) { if (pathSegments[0] in TWITTER_RESERVED_PATHS) {
return Pair(null, true) return Pair(null, true)
} }
return handleUserSpecificPageIntent(uri, pathSegments, pathSegments[0]) return handleUserSpecificPageIntent(uri, pathSegments, pathSegments[0])
@ -223,7 +222,7 @@ class WebLinkHandlerActivity : Activity() {
} }
} }
} else if (segsSize >= 3) { } else if (segsSize >= 3) {
if ("status" == pathSegments[1] && pathSegments[2].toLong(-1) != -1L) { if ("status" == pathSegments[1] && pathSegments[2].toLongOr(-1L) != -1L) {
val builder = Uri.Builder() val builder = Uri.Builder()
builder.scheme(SCHEME_TWIDERE) builder.scheme(SCHEME_TWIDERE)
builder.authority(AUTHORITY_STATUS) builder.authority(AUTHORITY_STATUS)

View File

@ -27,9 +27,9 @@ import org.mariotaku.kpreferences.get
import org.mariotaku.twidere.R import org.mariotaku.twidere.R
import org.mariotaku.twidere.constant.profileImageStyleKey import org.mariotaku.twidere.constant.profileImageStyleKey
import org.mariotaku.twidere.fragment.AccountsDashboardFragment import org.mariotaku.twidere.fragment.AccountsDashboardFragment
import org.mariotaku.twidere.view.transformer.AccountsSelectorTransformer
import org.mariotaku.twidere.model.AccountDetails import org.mariotaku.twidere.model.AccountDetails
import org.mariotaku.twidere.view.holder.AccountProfileImageViewHolder import org.mariotaku.twidere.view.holder.AccountProfileImageViewHolder
import org.mariotaku.twidere.view.transformer.AccountsSelectorTransformer
import java.util.* import java.util.*
class AccountSelectorAdapter( class AccountSelectorAdapter(

View File

@ -28,11 +28,7 @@ import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.TextView import android.widget.TextView
import com.bumptech.glide.RequestManager import com.bumptech.glide.RequestManager
import org.apache.commons.lang3.ArrayUtils import org.mariotaku.ktextension.*
import org.mariotaku.ktextension.contains
import org.mariotaku.ktextension.rangeOfSize
import org.mariotaku.ktextension.safeGetLong
import org.mariotaku.ktextension.safeMoveToPosition
import org.mariotaku.library.objectcursor.ObjectCursor import org.mariotaku.library.objectcursor.ObjectCursor
import org.mariotaku.microblog.library.twitter.model.Activity import org.mariotaku.microblog.library.twitter.model.Activity
import org.mariotaku.twidere.R import org.mariotaku.twidere.R
@ -272,19 +268,19 @@ class ParcelableActivitiesAdapter(
val activity = getActivity(position, false) val activity = getActivity(position, false)
when (activity.action) { when (activity.action) {
Activity.Action.MENTION -> { Activity.Action.MENTION -> {
if (ArrayUtils.isEmpty(activity.target_object_statuses)) { if (activity.target_object_statuses.isNullOrEmpty()) {
return ITEM_VIEW_TYPE_STUB return ITEM_VIEW_TYPE_STUB
} }
return ITEM_VIEW_TYPE_STATUS return ITEM_VIEW_TYPE_STATUS
} }
Activity.Action.REPLY -> { Activity.Action.REPLY -> {
if (ArrayUtils.isEmpty(activity.target_statuses)) { if (activity.target_statuses.isNullOrEmpty()) {
return ITEM_VIEW_TYPE_STUB return ITEM_VIEW_TYPE_STUB
} }
return ITEM_VIEW_TYPE_STATUS return ITEM_VIEW_TYPE_STATUS
} }
Activity.Action.QUOTE -> { Activity.Action.QUOTE -> {
if (ArrayUtils.isEmpty(activity.target_statuses)) { if (activity.target_statuses.isNullOrEmpty()) {
return ITEM_VIEW_TYPE_STUB return ITEM_VIEW_TYPE_STUB
} }
return ITEM_VIEW_TYPE_STATUS return ITEM_VIEW_TYPE_STATUS

View File

@ -34,7 +34,6 @@ import nl.komponents.kovenant.android.startKovenant
import nl.komponents.kovenant.android.stopKovenant import nl.komponents.kovenant.android.stopKovenant
import nl.komponents.kovenant.task import nl.komponents.kovenant.task
import okhttp3.Dns import okhttp3.Dns
import org.apache.commons.lang3.ArrayUtils
import org.mariotaku.kpreferences.KPreferences import org.mariotaku.kpreferences.KPreferences
import org.mariotaku.kpreferences.get import org.mariotaku.kpreferences.get
import org.mariotaku.kpreferences.set import org.mariotaku.kpreferences.set
@ -244,7 +243,7 @@ class TwidereApplication : Application(), Constants, OnSharedPreferenceChangeLis
val uid = intent.getIntExtra(Intent.EXTRA_UID, -1) val uid = intent.getIntExtra(Intent.EXTRA_UID, -1)
val packages = packageManager.getPackagesForUid(uid) val packages = packageManager.getPackagesForUid(uid)
val manager = externalThemeManager val manager = externalThemeManager
if (ArrayUtils.contains(packages, manager.emojiPackageName)) { if (manager.emojiPackageName in packages) {
manager.reloadEmojiPreferences() manager.reloadEmojiPreferences()
} }
} }

View File

@ -7,7 +7,7 @@ import android.text.TextUtils
import org.apache.commons.lang3.LocaleUtils import org.apache.commons.lang3.LocaleUtils
import org.mariotaku.kpreferences.* import org.mariotaku.kpreferences.*
import org.mariotaku.ktextension.bcp47Tag import org.mariotaku.ktextension.bcp47Tag
import org.mariotaku.ktextension.toLong import org.mariotaku.ktextension.toLongOr
import org.mariotaku.twidere.BuildConfig import org.mariotaku.twidere.BuildConfig
import org.mariotaku.twidere.Constants.* import org.mariotaku.twidere.Constants.*
import org.mariotaku.twidere.TwidereConstants.KEY_MEDIA_PRELOAD import org.mariotaku.twidere.TwidereConstants.KEY_MEDIA_PRELOAD
@ -160,7 +160,7 @@ object linkHighlightOptionKey : KSimpleKey<Int>(KEY_LINK_HIGHLIGHT_OPTION, VALUE
object refreshIntervalKey : KSimpleKey<Long>(KEY_REFRESH_INTERVAL, 15) { object refreshIntervalKey : KSimpleKey<Long>(KEY_REFRESH_INTERVAL, 15) {
override fun read(preferences: SharedPreferences): Long { override fun read(preferences: SharedPreferences): Long {
return preferences.getString(key, null).toLong(def) return preferences.getString(key, null).toLongOr(def)
} }
override fun write(editor: SharedPreferences.Editor, value: Long): Boolean { override fun write(editor: SharedPreferences.Editor, value: Long): Boolean {

View File

@ -17,7 +17,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package org.mariotaku.twidere.extensions package org.mariotaku.twidere.extension
import android.support.v7.widget.RecyclerView import android.support.v7.widget.RecyclerView
import android.support.v7.widget.StaggeredGridLayoutManager import android.support.v7.widget.StaggeredGridLayoutManager

View File

@ -8,7 +8,7 @@ import android.support.annotation.RequiresApi
import android.text.TextUtils import android.text.TextUtils
import org.mariotaku.ktextension.HexColorFormat import org.mariotaku.ktextension.HexColorFormat
import org.mariotaku.ktextension.toHexColor import org.mariotaku.ktextension.toHexColor
import org.mariotaku.ktextension.toInt import org.mariotaku.ktextension.toIntOr
import org.mariotaku.twidere.TwidereConstants.* import org.mariotaku.twidere.TwidereConstants.*
import org.mariotaku.twidere.annotation.AccountType import org.mariotaku.twidere.annotation.AccountType
import org.mariotaku.twidere.model.ParcelableUser import org.mariotaku.twidere.model.ParcelableUser
@ -71,7 +71,7 @@ fun Account.getColor(am: AccountManager): Int {
} }
fun Account.getPosition(am: AccountManager): Int { fun Account.getPosition(am: AccountManager): Int {
return AccountDataQueue.getUserData(am, this, ACCOUNT_USER_DATA_POSITION).toInt(-1) return AccountDataQueue.getUserData(am, this, ACCOUNT_USER_DATA_POSITION).toIntOr(-1)
} }
fun Account.getAccountExtras(am: AccountManager): AccountExtras? { fun Account.getAccountExtras(am: AccountManager): AccountExtras? {

View File

@ -14,7 +14,7 @@ import org.apache.james.mime4j.stream.BodyDescriptor
import org.apache.james.mime4j.stream.MimeConfig import org.apache.james.mime4j.stream.MimeConfig
import org.apache.james.mime4j.stream.RawField import org.apache.james.mime4j.stream.RawField
import org.apache.james.mime4j.util.MimeUtil import org.apache.james.mime4j.util.MimeUtil
import org.mariotaku.ktextension.toInt import org.mariotaku.ktextension.toIntOr
import org.mariotaku.ktextension.toString import org.mariotaku.ktextension.toString
import org.mariotaku.twidere.R import org.mariotaku.twidere.R
import org.mariotaku.twidere.model.* import org.mariotaku.twidere.model.*
@ -231,7 +231,7 @@ private class BodyPartHandler(private val context: Context, private val draft: D
val mediaFile = File(context.filesDir, filename) val mediaFile = File(context.filesDir, filename)
media = ParcelableMediaUpdate().apply { media = ParcelableMediaUpdate().apply {
bd.transferEncoding bd.transferEncoding
this.type = contentType?.getParameter("media_type").toInt(ParcelableMedia.Type.UNKNOWN) this.type = contentType?.getParameter("media_type").toIntOr(ParcelableMedia.Type.UNKNOWN)
this.alt_text = contentType?.getParameter("alt_text") this.alt_text = contentType?.getParameter("alt_text")
FileOutputStream(mediaFile).use { FileOutputStream(mediaFile).use {
st.copyTo(it) st.copyTo(it)

View File

@ -0,0 +1,76 @@
/*
* Twidere - Twitter client for Android
*
* Copyright (C) 2012-2017 Mariotaku Lee <mariotaku.lee@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.mariotaku.twidere.extension.model
import org.mariotaku.ktextension.toIntOr
import org.mariotaku.ktextension.toLongOr
import org.mariotaku.microblog.library.twitter.model.CardEntity
import org.mariotaku.twidere.model.ParcelableCardEntity
import org.mariotaku.twidere.model.UserKey
import org.mariotaku.twidere.model.util.ParcelableCardEntityUtils
import java.text.ParseException
import java.util.*
fun CardEntity.toParcelable(accountKey: UserKey, accountType: String): ParcelableCardEntity? {
val obj = ParcelableCardEntity()
obj.name = name
obj.url = url
obj.users = users?.toParcelables(accountKey, accountType)
obj.account_key = accountKey
obj.values = bindingValues?.mapValues { entry ->
ParcelableCardEntity.ParcelableBindingValue(entry.value)
}
return obj
}
fun ParcelableCardEntity.getAsBoolean(key: String, def: Boolean): Boolean {
val value = getValue(key) ?: return def
return value.value.toBoolean()
}
fun ParcelableCardEntity.getAsString(key: String, def: String?): String? {
return getValue(key)?.value ?: return def
}
fun ParcelableCardEntity.getString(key: String): String? {
val value = getValue(key) ?: return null
if (CardEntity.BindingValue.TYPE_STRING != value.type) return null
return value.value
}
fun ParcelableCardEntity.getAsInteger(key: String, def: Int): Int {
val value = getValue(key) ?: return def
return value.value.toIntOr(def)
}
fun ParcelableCardEntity.getAsLong(key: String, def: Long): Long {
val value = getValue(key) ?: return def
return value.value.toLongOr(def)
}
fun ParcelableCardEntity.getAsDate(key: String, def: Date): Date {
val value = getValue(key) ?: return def
try {
return ParcelableCardEntityUtils.sISOFormat.parse(value.value)
} catch (e: ParseException) {
return def
}
}

View File

@ -1,7 +1,10 @@
package org.mariotaku.twidere.extension.model package org.mariotaku.twidere.extension.model
import org.mariotaku.microblog.library.twitter.model.Status
import org.mariotaku.twidere.model.ParcelableStatus import org.mariotaku.twidere.model.ParcelableStatus
import org.mariotaku.twidere.model.ParcelableUser import org.mariotaku.twidere.model.ParcelableUser
import org.mariotaku.twidere.model.UserKey
import org.mariotaku.twidere.model.util.ParcelableStatusUtils
/** /**
* Created by mariotaku on 2017/1/7. * Created by mariotaku on 2017/1/7.
@ -29,3 +32,8 @@ val ParcelableStatus.referenced_users: Array<ParcelableUser>
} }
return resultList.toTypedArray() return resultList.toTypedArray()
} }
fun Array<Status>.toParcelables(accountKey: UserKey, accountType: String, profileImageSize: String) = Array(size) { i ->
ParcelableStatusUtils.fromStatus(this[i], accountKey, accountType, false, profileImageSize)
}

View File

@ -19,8 +19,11 @@
package org.mariotaku.twidere.extension.model package org.mariotaku.twidere.extension.model
import org.mariotaku.microblog.library.twitter.model.User
import org.mariotaku.twidere.TwidereConstants.USER_TYPE_FANFOU_COM import org.mariotaku.twidere.TwidereConstants.USER_TYPE_FANFOU_COM
import org.mariotaku.twidere.model.ParcelableUser import org.mariotaku.twidere.model.ParcelableUser
import org.mariotaku.twidere.model.UserKey
import org.mariotaku.twidere.model.util.ParcelableUserUtils
import org.mariotaku.twidere.util.InternalTwitterContentUtils import org.mariotaku.twidere.util.InternalTwitterContentUtils
fun ParcelableUser.getBestProfileBanner(width: Int): String? { fun ParcelableUser.getBestProfileBanner(width: Int): String? {
@ -33,4 +36,11 @@ fun ParcelableUser.getBestProfileBanner(width: Int): String? {
} }
} }
val ParcelableUser.urlPreferred: String? get() = url_expanded?.takeIf(String::isNotEmpty) ?: url val ParcelableUser.urlPreferred: String? get() = url_expanded?.takeIf(String::isNotEmpty) ?: url
fun Array<User>.toParcelables(accountKey: UserKey, accountType: String, profileImageSize: String = "normal"): Array<ParcelableUser>? {
return map {
ParcelableUserUtils.fromUser(it, accountKey, accountType, profileImageSize = profileImageSize)
}.toTypedArray()
}

View File

@ -0,0 +1,32 @@
/*
* Twidere - Twitter client for Android
*
* Copyright (C) 2012-2017 Mariotaku Lee <mariotaku.lee@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.mariotaku.twidere.extension.model
import org.mariotaku.microblog.library.twitter.model.UserList
import org.mariotaku.twidere.model.UserKey
import org.mariotaku.twidere.model.util.ParcelableUserListUtils
/**
* Created by mariotaku on 2017/4/7.
*/
fun Array<UserList>.toParcelables(accountKey: UserKey, profileImageSize: String = "normal") = Array(size) {
ParcelableUserListUtils.from(this[it], accountKey, profileImageSize = profileImageSize)
}

View File

@ -35,8 +35,6 @@ import android.support.v7.widget.RecyclerView.OnScrollListener
import android.view.* import android.view.*
import com.bumptech.glide.Glide import com.bumptech.glide.Glide
import com.squareup.otto.Subscribe import com.squareup.otto.Subscribe
import edu.tsinghua.hotmobi.HotMobiLogger
import edu.tsinghua.hotmobi.model.MediaEvent
import kotlinx.android.synthetic.main.fragment_content_recyclerview.* import kotlinx.android.synthetic.main.fragment_content_recyclerview.*
import org.mariotaku.kpreferences.get import org.mariotaku.kpreferences.get
import org.mariotaku.ktextension.* import org.mariotaku.ktextension.*
@ -48,9 +46,12 @@ import org.mariotaku.twidere.adapter.decorator.ExtendedDividerItemDecoration
import org.mariotaku.twidere.adapter.iface.ILoadMoreSupportAdapter import org.mariotaku.twidere.adapter.iface.ILoadMoreSupportAdapter
import org.mariotaku.twidere.annotation.ReadPositionTag import org.mariotaku.twidere.annotation.ReadPositionTag
import org.mariotaku.twidere.annotation.Referral import org.mariotaku.twidere.annotation.Referral
import org.mariotaku.twidere.constant.*
import org.mariotaku.twidere.constant.IntentConstants.* import org.mariotaku.twidere.constant.IntentConstants.*
import org.mariotaku.twidere.constant.KeyboardShortcutConstants.* import org.mariotaku.twidere.constant.KeyboardShortcutConstants.*
import org.mariotaku.twidere.constant.displaySensitiveContentsKey
import org.mariotaku.twidere.constant.newDocumentApiKey
import org.mariotaku.twidere.constant.readFromBottomKey
import org.mariotaku.twidere.constant.rememberPositionKey
import org.mariotaku.twidere.extension.model.getAccountType import org.mariotaku.twidere.extension.model.getAccountType
import org.mariotaku.twidere.graphic.like.LikeAnimationDrawable import org.mariotaku.twidere.graphic.like.LikeAnimationDrawable
import org.mariotaku.twidere.loader.iface.IExtendedLoader import org.mariotaku.twidere.loader.iface.IExtendedLoader

View File

@ -34,8 +34,7 @@ import kotlinx.android.synthetic.main.fragment_content_listview.*
import org.mariotaku.kpreferences.get import org.mariotaku.kpreferences.get
import org.mariotaku.sqliteqb.library.Expression import org.mariotaku.sqliteqb.library.Expression
import org.mariotaku.twidere.R import org.mariotaku.twidere.R
import org.mariotaku.twidere.TwidereConstants import org.mariotaku.twidere.TwidereConstants.EXTRA_ACCOUNT_KEY
import org.mariotaku.twidere.TwidereConstants.*
import org.mariotaku.twidere.activity.QuickSearchBarActivity import org.mariotaku.twidere.activity.QuickSearchBarActivity
import org.mariotaku.twidere.adapter.TrendsAdapter import org.mariotaku.twidere.adapter.TrendsAdapter
import org.mariotaku.twidere.constant.IntentConstants.EXTRA_EXTRAS import org.mariotaku.twidere.constant.IntentConstants.EXTRA_EXTRAS
@ -46,7 +45,6 @@ import org.mariotaku.twidere.model.UserKey
import org.mariotaku.twidere.model.event.TrendsRefreshedEvent import org.mariotaku.twidere.model.event.TrendsRefreshedEvent
import org.mariotaku.twidere.model.tab.extra.TrendsTabExtras import org.mariotaku.twidere.model.tab.extra.TrendsTabExtras
import org.mariotaku.twidere.provider.TwidereDataStore.CachedTrends import org.mariotaku.twidere.provider.TwidereDataStore.CachedTrends
import org.mariotaku.twidere.util.IntentUtils
import org.mariotaku.twidere.util.IntentUtils.openTweetSearch import org.mariotaku.twidere.util.IntentUtils.openTweetSearch
import org.mariotaku.twidere.util.Utils import org.mariotaku.twidere.util.Utils

View File

@ -127,7 +127,6 @@ import org.mariotaku.twidere.provider.TwidereDataStore.CachedRelationships
import org.mariotaku.twidere.provider.TwidereDataStore.CachedUsers import org.mariotaku.twidere.provider.TwidereDataStore.CachedUsers
import org.mariotaku.twidere.text.TwidereURLSpan import org.mariotaku.twidere.text.TwidereURLSpan
import org.mariotaku.twidere.util.* import org.mariotaku.twidere.util.*
import org.mariotaku.twidere.util.InternalTwitterContentUtils.getBestBannerUrl
import org.mariotaku.twidere.util.KeyboardShortcutsHandler.KeyboardShortcutCallback import org.mariotaku.twidere.util.KeyboardShortcutsHandler.KeyboardShortcutCallback
import org.mariotaku.twidere.util.TwidereLinkify.OnLinkClickListener import org.mariotaku.twidere.util.TwidereLinkify.OnLinkClickListener
import org.mariotaku.twidere.util.UserColorNameManager.UserColorChangedListener import org.mariotaku.twidere.util.UserColorNameManager.UserColorChangedListener

View File

@ -30,7 +30,6 @@ import kotlinx.android.synthetic.main.fragment_content_recyclerview.*
import org.mariotaku.kpreferences.get import org.mariotaku.kpreferences.get
import org.mariotaku.twidere.R import org.mariotaku.twidere.R
import org.mariotaku.twidere.constant.IntentConstants.* import org.mariotaku.twidere.constant.IntentConstants.*
import org.mariotaku.twidere.constant.SharedPreferenceConstants.KEY_NAME_FIRST
import org.mariotaku.twidere.constant.nameFirstKey import org.mariotaku.twidere.constant.nameFirstKey
import org.mariotaku.twidere.loader.CursorSupportUsersLoader import org.mariotaku.twidere.loader.CursorSupportUsersLoader
import org.mariotaku.twidere.loader.UserListMembersLoader import org.mariotaku.twidere.loader.UserListMembersLoader

View File

@ -9,13 +9,11 @@ import android.support.v7.widget.RecyclerView
import android.support.v7.widget.StaggeredGridLayoutManager import android.support.v7.widget.StaggeredGridLayoutManager
import android.text.TextUtils import android.text.TextUtils
import com.bumptech.glide.Glide import com.bumptech.glide.Glide
import org.mariotaku.kpreferences.get
import org.mariotaku.twidere.adapter.StaggeredGridParcelableStatusesAdapter import org.mariotaku.twidere.adapter.StaggeredGridParcelableStatusesAdapter
import org.mariotaku.twidere.adapter.iface.ILoadMoreSupportAdapter import org.mariotaku.twidere.adapter.iface.ILoadMoreSupportAdapter
import org.mariotaku.twidere.constant.IntentConstants.* import org.mariotaku.twidere.constant.IntentConstants.*
import org.mariotaku.twidere.constant.userTimelineFilterKey import org.mariotaku.twidere.extension.reachingEnd
import org.mariotaku.twidere.extensions.reachingEnd import org.mariotaku.twidere.extension.reachingStart
import org.mariotaku.twidere.extensions.reachingStart
import org.mariotaku.twidere.loader.MediaTimelineLoader import org.mariotaku.twidere.loader.MediaTimelineLoader
import org.mariotaku.twidere.loader.iface.IExtendedLoader import org.mariotaku.twidere.loader.iface.IExtendedLoader
import org.mariotaku.twidere.model.ParcelableStatus import org.mariotaku.twidere.model.ParcelableStatus

View File

@ -28,7 +28,6 @@ import org.mariotaku.microblog.library.twitter.model.User
import org.mariotaku.twidere.model.AccountDetails import org.mariotaku.twidere.model.AccountDetails
import org.mariotaku.twidere.model.ParcelableUser import org.mariotaku.twidere.model.ParcelableUser
import org.mariotaku.twidere.model.UserKey import org.mariotaku.twidere.model.UserKey
import org.mariotaku.twidere.model.util.AccountUtils
import org.mariotaku.twidere.util.DataStoreUtils import org.mariotaku.twidere.util.DataStoreUtils
class MutesUsersLoader( class MutesUsersLoader(

View File

@ -20,7 +20,6 @@
package org.mariotaku.twidere.loader package org.mariotaku.twidere.loader
import android.content.Context import android.content.Context
import org.mariotaku.microblog.library.MicroBlog import org.mariotaku.microblog.library.MicroBlog
import org.mariotaku.microblog.library.MicroBlogException import org.mariotaku.microblog.library.MicroBlogException
import org.mariotaku.microblog.library.twitter.model.Paging import org.mariotaku.microblog.library.twitter.model.Paging
@ -29,7 +28,6 @@ import org.mariotaku.twidere.annotation.AccountType
import org.mariotaku.twidere.model.AccountDetails import org.mariotaku.twidere.model.AccountDetails
import org.mariotaku.twidere.model.ParcelableUser import org.mariotaku.twidere.model.ParcelableUser
import org.mariotaku.twidere.model.UserKey import org.mariotaku.twidere.model.UserKey
import org.mariotaku.twidere.model.util.AccountUtils
import org.mariotaku.twidere.util.DataStoreUtils import org.mariotaku.twidere.util.DataStoreUtils
class UserBlocksLoader( class UserBlocksLoader(

View File

@ -13,7 +13,6 @@ import org.mariotaku.twidere.activity.TrendsLocationSelectorActivity
import org.mariotaku.twidere.annotation.AccountType import org.mariotaku.twidere.annotation.AccountType
import org.mariotaku.twidere.constant.IntentConstants.EXTRA_ACCOUNT_KEY import org.mariotaku.twidere.constant.IntentConstants.EXTRA_ACCOUNT_KEY
import org.mariotaku.twidere.constant.IntentConstants.EXTRA_LOCATION import org.mariotaku.twidere.constant.IntentConstants.EXTRA_LOCATION
import org.mariotaku.twidere.fragment.CustomTabsFragment
import org.mariotaku.twidere.fragment.CustomTabsFragment.TabEditorDialogFragment import org.mariotaku.twidere.fragment.CustomTabsFragment.TabEditorDialogFragment
import org.mariotaku.twidere.model.AccountDetails import org.mariotaku.twidere.model.AccountDetails
import org.mariotaku.twidere.model.tab.TabConfiguration import org.mariotaku.twidere.model.tab.TabConfiguration

View File

@ -1,6 +1,7 @@
package org.mariotaku.twidere.model.util package org.mariotaku.twidere.model.util
import org.mariotaku.microblog.library.twitter.model.Activity import org.mariotaku.microblog.library.twitter.model.Activity
import org.mariotaku.twidere.extension.model.toParcelables
import org.mariotaku.twidere.model.ParcelableActivity import org.mariotaku.twidere.model.ParcelableActivity
import org.mariotaku.twidere.model.ParcelableUser import org.mariotaku.twidere.model.ParcelableUser
import org.mariotaku.twidere.model.UserKey import org.mariotaku.twidere.model.UserKey
@ -67,26 +68,26 @@ object ParcelableActivityUtils {
result.min_sort_position = activity.minSortPosition result.min_sort_position = activity.minSortPosition
result.max_position = activity.maxPosition result.max_position = activity.maxPosition
result.min_position = activity.minPosition result.min_position = activity.minPosition
result.sources = ParcelableUserUtils.fromUsers(activity.sources, accountKey, accountType, result.sources = activity.sources?.toParcelables(accountKey, accountType,
profileImageSize) profileImageSize)
result.target_users = ParcelableUserUtils.fromUsers(activity.targetUsers, accountKey, result.target_users = activity.targetUsers?.toParcelables(accountKey,
accountType, profileImageSize) accountType, profileImageSize)
result.target_user_lists = ParcelableUserListUtils.fromUserLists(activity.targetUserLists, result.target_user_lists = activity.targetUserLists?.toParcelables(accountKey,
accountKey, profileImageSize) profileImageSize)
result.target_statuses = ParcelableStatusUtils.fromStatuses(activity.targetStatuses, result.target_statuses = activity.targetStatuses?.toParcelables(accountKey,
accountKey, accountType, profileImageSize) accountType, profileImageSize)
result.target_object_statuses = ParcelableStatusUtils.fromStatuses(activity.targetObjectStatuses, result.target_object_statuses = activity.targetObjectStatuses?.toParcelables(accountKey,
accountKey, accountType, profileImageSize) accountType, profileImageSize)
result.target_object_user_lists = ParcelableUserListUtils.fromUserLists(activity.targetObjectUserLists, result.target_object_user_lists = activity.targetObjectUserLists?.toParcelables(accountKey,
accountKey, profileImageSize) profileImageSize)
result.target_object_users = ParcelableUserUtils.fromUsers(activity.targetObjectUsers, result.target_object_users = activity.targetObjectUsers?.toParcelables(accountKey, accountType,
accountKey, accountType, profileImageSize) profileImageSize)
result.has_following_source = activity.sources.fold(false) { folded, item -> result.has_following_source = activity.sources?.fold(false) { folded, item ->
if (item.isFollowing == true) { if (item.isFollowing == true) {
return@fold true return@fold true
} }
return@fold folded return@fold folded
} } ?: false
if (result.sources != null) { if (result.sources != null) {
result.source_ids = arrayOfNulls<UserKey>(result.sources.size) result.source_ids = arrayOfNulls<UserKey>(result.sources.size)
for (i in result.sources.indices) { for (i in result.sources.indices) {

View File

@ -1,14 +1,8 @@
package org.mariotaku.twidere.model.util package org.mariotaku.twidere.model.util
import android.support.v4.util.ArrayMap
import org.apache.commons.lang3.math.NumberUtils
import org.mariotaku.microblog.library.twitter.model.CardEntity
import org.mariotaku.microblog.library.twitter.util.ThreadLocalSimpleDateFormat import org.mariotaku.microblog.library.twitter.util.ThreadLocalSimpleDateFormat
import org.mariotaku.twidere.model.ParcelableCardEntity
import org.mariotaku.twidere.model.UserKey
import java.text.DateFormat import java.text.DateFormat
import java.text.ParseException
import java.util.* import java.util.*
/** /**
@ -24,58 +18,4 @@ object ParcelableCardEntityUtils {
sISOFormat.timeZone = TimeZone.getTimeZone("UTC") sISOFormat.timeZone = TimeZone.getTimeZone("UTC")
} }
fun fromCardEntity(card: CardEntity, accountKey: UserKey, accountType: String): ParcelableCardEntity? {
val obj = ParcelableCardEntity()
obj.name = card.name
obj.url = card.url
obj.users = ParcelableUserUtils.fromUsers(card.users, accountKey, accountType)
obj.account_key = accountKey
obj.values = from(card.bindingValues)
return obj
}
fun from(bindingValues: Map<String, CardEntity.BindingValue>?): Map<String, ParcelableCardEntity.ParcelableBindingValue>? {
if (bindingValues == null) return null
val map = ArrayMap<String, ParcelableCardEntity.ParcelableBindingValue>()
for ((key, value) in bindingValues) {
map.put(key, ParcelableCardEntity.ParcelableBindingValue(value))
}
return map
}
fun getAsBoolean(obj: ParcelableCardEntity, key: String, def: Boolean): Boolean {
val value = obj.getValue(key) ?: return def
return java.lang.Boolean.parseBoolean(value.value)
}
fun getAsString(obj: ParcelableCardEntity, key: String, def: String?): String? {
return obj.getValue(key)?.value ?: return def
}
fun getString(obj: ParcelableCardEntity, key: String): String? {
val value = obj.getValue(key)
if (value == null || CardEntity.BindingValue.TYPE_STRING != value.type) return null
return getAsString(obj, key, null)
}
fun getAsInteger(obj: ParcelableCardEntity, key: String, def: Int): Int {
val value = obj.getValue(key) ?: return def
return NumberUtils.toInt(value.value, def)
}
fun getAsLong(obj: ParcelableCardEntity, key: String, def: Long): Long {
val value = obj.getValue(key) ?: return def
return NumberUtils.toLong(value.value, def)
}
fun getAsDate(obj: ParcelableCardEntity, key: String, def: Date): Date {
val value = obj.getValue(key) ?: return def
try {
return sISOFormat.parse(value.value)
} catch (e: ParseException) {
return def
}
}
} }

View File

@ -1,11 +1,11 @@
package org.mariotaku.twidere.model.util package org.mariotaku.twidere.model.util
import android.text.TextUtils import android.text.TextUtils
import org.apache.commons.lang3.ArrayUtils
import org.apache.commons.lang3.math.NumberUtils
import org.mariotaku.ktextension.addAllTo import org.mariotaku.ktextension.addAllTo
import org.mariotaku.ktextension.isNullOrEmpty import org.mariotaku.ktextension.isNullOrEmpty
import org.mariotaku.ktextension.toIntOr
import org.mariotaku.microblog.library.twitter.model.* import org.mariotaku.microblog.library.twitter.model.*
import org.mariotaku.twidere.extension.model.toParcelable
import org.mariotaku.twidere.model.ParcelableMedia import org.mariotaku.twidere.model.ParcelableMedia
import org.mariotaku.twidere.model.ParcelableStatus import org.mariotaku.twidere.model.ParcelableStatus
import org.mariotaku.twidere.model.UserKey import org.mariotaku.twidere.model.UserKey
@ -87,11 +87,9 @@ object ParcelableMediaUtils {
private fun fromAttachments(status: Status): Array<ParcelableMedia> { private fun fromAttachments(status: Status): Array<ParcelableMedia> {
val attachments = status.attachments ?: return emptyArray() val attachments = status.attachments ?: return emptyArray()
val temp = arrayOfNulls<ParcelableMedia>(attachments.size)
val externalUrl = status.externalUrl val externalUrl = status.externalUrl
var i = 0 return attachments.mapNotNull { attachment ->
for (attachment in attachments) { val mimeType = attachment.mimetype ?: return@mapNotNull null
val mimeType = attachment.mimetype ?: continue
val media = ParcelableMedia() val media = ParcelableMedia()
if (mimeType.startsWith("image/")) { if (mimeType.startsWith("image/")) {
@ -101,7 +99,7 @@ object ParcelableMediaUtils {
} else { } else {
// https://github.com/TwidereProject/Twidere-Android/issues/729 // https://github.com/TwidereProject/Twidere-Android/issues/729
// Skip unsupported attachment // Skip unsupported attachment
continue return@mapNotNull null
} }
media.width = attachment.width media.width = attachment.width
media.height = attachment.height media.height = attachment.height
@ -109,9 +107,8 @@ object ParcelableMediaUtils {
media.page_url = if (TextUtils.isEmpty(externalUrl)) attachment.url else externalUrl media.page_url = if (TextUtils.isEmpty(externalUrl)) attachment.url else externalUrl
media.media_url = attachment.url media.media_url = attachment.url
media.preview_url = attachment.largeThumbUrl media.preview_url = attachment.largeThumbUrl
temp[i++] = media return@mapNotNull null
} }.toTypedArray()
return ArrayUtils.subarray<ParcelableMedia>(temp, 0, i)
} }
private fun fromCard(card: CardEntity?, urlEntities: Array<UrlEntity>?, private fun fromCard(card: CardEntity?, urlEntities: Array<UrlEntity>?,
@ -122,8 +119,7 @@ object ParcelableMediaUtils {
if ("animated_gif" == name || "player" == name) { if ("animated_gif" == name || "player" == name) {
val media = ParcelableMedia() val media = ParcelableMedia()
val playerStreamUrl = card.getBindingValue("player_stream_url") val playerStreamUrl = card.getBindingValue("player_stream_url")
media.card = ParcelableCardEntityUtils.fromCardEntity(card, accountKey, media.card = card.toParcelable(accountKey, accountType)
accountType)
val appUrlResolved = card.getBindingValue("app_url_resolved") as CardEntity.StringValue val appUrlResolved = card.getBindingValue("app_url_resolved") as CardEntity.StringValue
media.url = if (checkUrl(appUrlResolved)) appUrlResolved.value else card.url media.url = if (checkUrl(appUrlResolved)) appUrlResolved.value else card.url
if ("animated_gif" == name) { if ("animated_gif" == name) {
@ -148,8 +144,8 @@ object ParcelableMediaUtils {
val playerWidth = card.getBindingValue("player_width") val playerWidth = card.getBindingValue("player_width")
val playerHeight = card.getBindingValue("player_height") val playerHeight = card.getBindingValue("player_height")
if (playerWidth is CardEntity.StringValue && playerHeight is CardEntity.StringValue) { if (playerWidth is CardEntity.StringValue && playerHeight is CardEntity.StringValue) {
media.width = NumberUtils.toInt(playerWidth.value, -1) media.width = playerWidth.value.toIntOr(-1)
media.height = NumberUtils.toInt(playerHeight.value, -1) media.height = playerHeight.value.toIntOr(-1)
} }
writeLinkInfo(media, urlEntities, mediaEntities, extendedMediaEntities) writeLinkInfo(media, urlEntities, mediaEntities, extendedMediaEntities)
return arrayOf(media) return arrayOf(media)
@ -158,8 +154,7 @@ object ParcelableMediaUtils {
val media = ParcelableMedia() val media = ParcelableMedia()
media.url = card.url media.url = card.url
media.card = ParcelableCardEntityUtils.fromCardEntity(card, accountKey, media.card = card.toParcelable(accountKey, accountType)
accountType)
media.type = ParcelableMedia.Type.IMAGE media.type = ParcelableMedia.Type.IMAGE
media.media_url = photoImageFullSize.url media.media_url = photoImageFullSize.url
media.width = photoImageFullSize.width media.width = photoImageFullSize.width

View File

@ -4,6 +4,7 @@ import android.text.Spanned
import android.text.style.URLSpan import android.text.style.URLSpan
import org.mariotaku.microblog.library.twitter.model.Status import org.mariotaku.microblog.library.twitter.model.Status
import org.mariotaku.twidere.extension.model.api.getProfileImageOfSize import org.mariotaku.twidere.extension.model.api.getProfileImageOfSize
import org.mariotaku.twidere.extension.model.toParcelable
import org.mariotaku.twidere.model.* import org.mariotaku.twidere.model.*
import org.mariotaku.twidere.model.ParcelableStatus.FilterFlags import org.mariotaku.twidere.model.ParcelableStatus.FilterFlags
import org.mariotaku.twidere.util.HtmlSpanBuilder import org.mariotaku.twidere.util.HtmlSpanBuilder
@ -163,9 +164,7 @@ object ParcelableStatusUtils {
result.is_possibly_sensitive = status.isPossiblySensitive result.is_possibly_sensitive = status.isPossiblySensitive
result.mentions = ParcelableUserMentionUtils.fromUserMentionEntities(user, result.mentions = ParcelableUserMentionUtils.fromUserMentionEntities(user,
status.userMentionEntities) status.userMentionEntities)
result.card = status.card?.let { result.card = status.card?.toParcelable(accountKey, accountType)
ParcelableCardEntityUtils.fromCardEntity(it, accountKey, accountType)
}
result.card_name = result.card?.name result.card_name = result.card?.name
result.place_full_name = getPlaceFullName(status) result.place_full_name = getPlaceFullName(status)
result.lang = status.lang result.lang = status.lang
@ -208,14 +207,6 @@ object ParcelableStatusUtils {
return UserKey(inReplyToUserId, accountKey.host) return UserKey(inReplyToUserId, accountKey.host)
} }
fun fromStatuses(statuses: Array<Status>?, accountKey: UserKey, accountType: String,
profileImageSize: String): Array<ParcelableStatus>? {
if (statuses == null) return null
return Array(statuses.size) { i ->
fromStatus(statuses[i], accountKey, accountType, false, profileImageSize)
}
}
private fun getPlaceFullName(status: Status): String? { private fun getPlaceFullName(status: Status): String? {
val place = status.place val place = status.place
if (place != null) return place.fullName if (place != null) return place.fullName

View File

@ -50,13 +50,6 @@ object ParcelableUserListUtils {
return obj return obj
} }
fun fromUserLists(userLists: Array<UserList>?, accountKey: UserKey,
profileImageSize: String = "normal"): Array<ParcelableUserList>? {
if (userLists == null) return emptyArray()
val size = userLists.size
return Array(size) { from(userLists[it], accountKey, profileImageSize = profileImageSize) }
}
fun check(userList: ParcelableUserList, accountKey: UserKey, listId: String?, fun check(userList: ParcelableUserList, accountKey: UserKey, listId: String?,
userKey: UserKey?, screenName: String?, listName: String?): Boolean { userKey: UserKey?, screenName: String?, listName: String?): Boolean {
if (userList.account_key != accountKey) return false if (userList.account_key != accountKey) return false

View File

@ -88,12 +88,6 @@ object ParcelableUserUtils {
return obj return obj
} }
fun fromUsers(users: Array<User>, accountKey: UserKey, accountType: String,
profileImageSize: String = "normal"): Array<ParcelableUser>? {
return users.map {
fromUser(it, accountKey, accountType, profileImageSize = profileImageSize)
}.toTypedArray()
}
fun parseColor(colorString: String?): Int { fun parseColor(colorString: String?): Int {
if (colorString == null) return 0 if (colorString == null) return 0

View File

@ -7,7 +7,7 @@ import android.os.Build
import android.support.v7.preference.PreferenceManager import android.support.v7.preference.PreferenceManager
import android.util.AttributeSet import android.util.AttributeSet
import org.mariotaku.kpreferences.get import org.mariotaku.kpreferences.get
import org.mariotaku.ktextension.toLong import org.mariotaku.ktextension.toLongOr
import org.mariotaku.twidere.constant.autoRefreshCompatibilityModeKey import org.mariotaku.twidere.constant.autoRefreshCompatibilityModeKey
import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit
@ -42,7 +42,7 @@ class RefreshIntervalPreference(
var index: Int = -1 var index: Int = -1
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && !sharedPreferences[autoRefreshCompatibilityModeKey]) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && !sharedPreferences[autoRefreshCompatibilityModeKey]) {
index = valuesBackup.indexOfFirst { index = valuesBackup.indexOfFirst {
val intervalMinutes = it.toString().toLong(-1L) val intervalMinutes = it.toString().toLongOr(-1L)
if (intervalMinutes < 0) return@indexOfFirst false if (intervalMinutes < 0) return@indexOfFirst false
return@indexOfFirst TimeUnit.MINUTES.toMillis(intervalMinutes) >= JobInfo.getMinPeriodMillis() return@indexOfFirst TimeUnit.MINUTES.toMillis(intervalMinutes) >= JobInfo.getMinPeriodMillis()
} }
@ -56,8 +56,8 @@ class RefreshIntervalPreference(
entryValues = valuesBackup entryValues = valuesBackup
entries = entriesBackup entries = entriesBackup
} }
val valueMinutes = value.toLong(-1) val valueMinutes = value.toLongOr(-1)
val minValue = entryValues.firstOrNull()?.toString().toLong(-1) val minValue = entryValues.firstOrNull()?.toString().toLongOr(-1)
if (valueMinutes > 0 && valueMinutes < minValue) { if (valueMinutes > 0 && valueMinutes < minValue) {
value = minValue.toString() value = minValue.toString()
} }

View File

@ -38,7 +38,6 @@ import android.support.v4.app.NotificationCompat
import android.support.v4.text.BidiFormatter import android.support.v4.text.BidiFormatter
import com.squareup.otto.Bus import com.squareup.otto.Bus
import okhttp3.Dns import okhttp3.Dns
import org.apache.commons.lang3.ArrayUtils
import org.mariotaku.ktextension.isNullOrEmpty import org.mariotaku.ktextension.isNullOrEmpty
import org.mariotaku.ktextension.toNulls import org.mariotaku.ktextension.toNulls
import org.mariotaku.library.objectcursor.ObjectCursor import org.mariotaku.library.objectcursor.ObjectCursor
@ -169,7 +168,7 @@ class TwidereDataProvider : ContentProvider(), LazyLoadCallback {
val map = permissionsManager.all val map = permissionsManager.all
val callingPackages = pm.getPackagesForUid(Binder.getCallingUid()) val callingPackages = pm.getPackagesForUid(Binder.getCallingUid())
for ((key, value) in map) { for ((key, value) in map) {
if (ArrayUtils.contains(callingPackages, key)) { if (key in callingPackages) {
c.addRow(arrayOf<Any>(key, value)) c.addRow(arrayOf<Any>(key, value))
} }
} }

View File

@ -23,7 +23,7 @@ import android.content.BroadcastReceiver
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import org.mariotaku.abstask.library.TaskStarter import org.mariotaku.abstask.library.TaskStarter
import org.mariotaku.ktextension.toLong import org.mariotaku.ktextension.toLongOr
import org.mariotaku.twidere.TwidereConstants.* import org.mariotaku.twidere.TwidereConstants.*
import org.mariotaku.twidere.annotation.NotificationType import org.mariotaku.twidere.annotation.NotificationType
import org.mariotaku.twidere.annotation.ReadPositionTag import org.mariotaku.twidere.annotation.ReadPositionTag
@ -53,19 +53,19 @@ class NotificationReceiver : BroadcastReceiver() {
val positionTag = Utils.getReadPositionTagWithAccount(ReadPositionTag.HOME_TIMELINE, val positionTag = Utils.getReadPositionTagWithAccount(ReadPositionTag.HOME_TIMELINE,
accountKey) accountKey)
val manager = holder.readStateManager val manager = holder.readStateManager
manager.setPosition(positionTag, paramReadPosition.toLong(-1)) manager.setPosition(positionTag, paramReadPosition.toLongOr(-1L))
} }
NotificationType.INTERACTIONS -> { NotificationType.INTERACTIONS -> {
val positionTag = Utils.getReadPositionTagWithAccount(ReadPositionTag.ACTIVITIES_ABOUT_ME, val positionTag = Utils.getReadPositionTagWithAccount(ReadPositionTag.ACTIVITIES_ABOUT_ME,
accountKey) accountKey)
val manager = holder.readStateManager val manager = holder.readStateManager
manager.setPosition(positionTag, paramReadPosition.toLong(-1)) manager.setPosition(positionTag, paramReadPosition.toLongOr(-1L))
} }
NotificationType.DIRECT_MESSAGES -> { NotificationType.DIRECT_MESSAGES -> {
if (accountKey == null) return if (accountKey == null) return
val appContext = context.applicationContext val appContext = context.applicationContext
val task = BatchMarkMessageReadTask(appContext, accountKey, val task = BatchMarkMessageReadTask(appContext, accountKey,
paramReadPosition.toLong(-1)) paramReadPosition.toLongOr(-1L))
TaskStarter.execute(task) TaskStarter.execute(task)
} }
} }

View File

@ -4,7 +4,6 @@ import android.accounts.AbstractAccountAuthenticator
import android.accounts.Account import android.accounts.Account
import android.accounts.AccountAuthenticatorResponse import android.accounts.AccountAuthenticatorResponse
import android.accounts.AccountManager import android.accounts.AccountManager
import android.app.Service
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle

View File

@ -1,7 +1,6 @@
package org.mariotaku.twidere.service package org.mariotaku.twidere.service
import android.accounts.Account import android.accounts.Account
import android.app.Service
import android.content.* import android.content.*
import android.os.Bundle import android.os.Bundle
import android.os.IBinder import android.os.IBinder

View File

@ -3,7 +3,10 @@ package org.mariotaku.twidere.service
import android.app.IntentService import android.app.IntentService
import com.twitter.Extractor import com.twitter.Extractor
import com.twitter.Validator import com.twitter.Validator
import org.mariotaku.twidere.util.* import org.mariotaku.twidere.util.AsyncTwitterWrapper
import org.mariotaku.twidere.util.NotificationManagerWrapper
import org.mariotaku.twidere.util.SharedPreferencesWrapper
import org.mariotaku.twidere.util.UserColorNameManager
import org.mariotaku.twidere.util.dagger.GeneralComponentHelper import org.mariotaku.twidere.util.dagger.GeneralComponentHelper
import javax.inject.Inject import javax.inject.Inject

View File

@ -44,7 +44,7 @@ import nl.komponents.kovenant.ui.successUi
import org.mariotaku.abstask.library.AbstractTask import org.mariotaku.abstask.library.AbstractTask
import org.mariotaku.abstask.library.ManualTaskStarter import org.mariotaku.abstask.library.ManualTaskStarter
import org.mariotaku.ktextension.configure import org.mariotaku.ktextension.configure
import org.mariotaku.ktextension.toLong import org.mariotaku.ktextension.toLongOr
import org.mariotaku.ktextension.toTypedArray import org.mariotaku.ktextension.toTypedArray
import org.mariotaku.ktextension.useCursor import org.mariotaku.ktextension.useCursor
import org.mariotaku.library.objectcursor.ObjectCursor import org.mariotaku.library.objectcursor.ObjectCursor
@ -116,7 +116,7 @@ class LengthyOperationsService : BaseIntentService("lengthy_operations") {
private fun handleSendDraftIntent(intent: Intent) { private fun handleSendDraftIntent(intent: Intent) {
val uri = intent.data ?: return val uri = intent.data ?: return
notificationManager.cancel(uri.toString(), NOTIFICATION_ID_DRAFTS) notificationManager.cancel(uri.toString(), NOTIFICATION_ID_DRAFTS)
val draftId = uri.lastPathSegment.toLong(-1) val draftId = uri.lastPathSegment.toLongOr(-1L)
if (draftId == -1L) return if (draftId == -1L) return
val where = Expression.equals(Drafts._ID, draftId) val where = Expression.equals(Drafts._ID, draftId)
@SuppressLint("Recycle") @SuppressLint("Recycle")
@ -166,7 +166,7 @@ class LengthyOperationsService : BaseIntentService("lengthy_operations") {
private fun handleDiscardDraftIntent(intent: Intent) { private fun handleDiscardDraftIntent(intent: Intent) {
val data = intent.data ?: return val data = intent.data ?: return
task { task {
if (deleteDrafts(this, longArrayOf(data.lastPathSegment.toLong(-1))) < 1) { if (deleteDrafts(this, longArrayOf(data.lastPathSegment.toLongOr(-1L))) < 1) {
throw IOException() throw IOException()
} }
return@task data return@task data

View File

@ -16,7 +16,7 @@ import org.mariotaku.abstask.library.TaskStarter
import org.mariotaku.kpreferences.get import org.mariotaku.kpreferences.get
import org.mariotaku.ktextension.addOnAccountsUpdatedListenerSafe import org.mariotaku.ktextension.addOnAccountsUpdatedListenerSafe
import org.mariotaku.ktextension.removeOnAccountsUpdatedListenerSafe import org.mariotaku.ktextension.removeOnAccountsUpdatedListenerSafe
import org.mariotaku.ktextension.toLong import org.mariotaku.ktextension.toLongOr
import org.mariotaku.library.objectcursor.ObjectCursor import org.mariotaku.library.objectcursor.ObjectCursor
import org.mariotaku.microblog.library.MicroBlogException import org.mariotaku.microblog.library.MicroBlogException
import org.mariotaku.microblog.library.twitter.TwitterUserStream import org.mariotaku.microblog.library.twitter.TwitterUserStream
@ -357,7 +357,7 @@ class StreamingService : BaseService() {
} else { } else {
val uri = resolver.insert(Activities.AboutMe.CONTENT_URI, values) val uri = resolver.insert(Activities.AboutMe.CONTENT_URI, values)
if (uri != null) { if (uri != null) {
curActivity._id = uri.lastPathSegment.toLong(-1) curActivity._id = uri.lastPathSegment.toLongOr(-1L)
} }
} }
lastActivityAboutMe = curActivity lastActivityAboutMe = curActivity

View File

@ -15,7 +15,6 @@ import org.mariotaku.twidere.model.event.ProfileUpdatedEvent
import org.mariotaku.twidere.model.util.AccountUtils import org.mariotaku.twidere.model.util.AccountUtils
import org.mariotaku.twidere.model.util.ParcelableUserUtils import org.mariotaku.twidere.model.util.ParcelableUserUtils
import org.mariotaku.twidere.util.DebugLog import org.mariotaku.twidere.util.DebugLog
import org.mariotaku.twidere.util.MicroBlogAPIFactory
import org.mariotaku.twidere.util.TwitterWrapper import org.mariotaku.twidere.util.TwitterWrapper
import org.mariotaku.twidere.util.Utils import org.mariotaku.twidere.util.Utils
import java.io.IOException import java.io.IOException

View File

@ -30,7 +30,6 @@ import org.mariotaku.twidere.extension.model.isOfficial
import org.mariotaku.twidere.model.AccountDetails import org.mariotaku.twidere.model.AccountDetails
import org.mariotaku.twidere.model.UserKey import org.mariotaku.twidere.model.UserKey
import org.mariotaku.twidere.provider.TwidereDataStore.Activities import org.mariotaku.twidere.provider.TwidereDataStore.Activities
import org.mariotaku.twidere.task.twitter.GetActivitiesTask
import org.mariotaku.twidere.util.ErrorInfoStore import org.mariotaku.twidere.util.ErrorInfoStore
import org.mariotaku.twidere.util.Utils import org.mariotaku.twidere.util.Utils

View File

@ -28,7 +28,6 @@ import org.mariotaku.microblog.library.twitter.model.Paging
import org.mariotaku.microblog.library.twitter.model.ResponseList import org.mariotaku.microblog.library.twitter.model.ResponseList
import org.mariotaku.microblog.library.twitter.model.Status import org.mariotaku.microblog.library.twitter.model.Status
import org.mariotaku.twidere.provider.TwidereDataStore.Statuses import org.mariotaku.twidere.provider.TwidereDataStore.Statuses
import org.mariotaku.twidere.task.twitter.GetStatusesTask
import org.mariotaku.twidere.util.ErrorInfoStore import org.mariotaku.twidere.util.ErrorInfoStore
/** /**

View File

@ -6,10 +6,9 @@ import android.content.Context
import android.net.Uri import android.net.Uri
import edu.tsinghua.hotmobi.HotMobiLogger import edu.tsinghua.hotmobi.HotMobiLogger
import edu.tsinghua.hotmobi.model.RefreshEvent import edu.tsinghua.hotmobi.model.RefreshEvent
import org.apache.commons.lang3.ArrayUtils
import org.apache.commons.lang3.math.NumberUtils
import org.mariotaku.abstask.library.TaskStarter import org.mariotaku.abstask.library.TaskStarter
import org.mariotaku.kpreferences.get import org.mariotaku.kpreferences.get
import org.mariotaku.ktextension.toLongOr
import org.mariotaku.library.objectcursor.ObjectCursor import org.mariotaku.library.objectcursor.ObjectCursor
import org.mariotaku.microblog.library.MicroBlog import org.mariotaku.microblog.library.MicroBlog
import org.mariotaku.microblog.library.MicroBlogException import org.mariotaku.microblog.library.MicroBlogException
@ -89,7 +88,7 @@ abstract class GetStatusesTask(
} }
if (sinceIds != null && sinceIds[i] != null) { if (sinceIds != null && sinceIds[i] != null) {
sinceId = sinceIds[i] sinceId = sinceIds[i]
val sinceIdLong = NumberUtils.toLong(sinceId, -1) val sinceIdLong = sinceId.toLongOr(-1L)
//TODO handle non-twitter case //TODO handle non-twitter case
if (sinceIdLong != -1L) { if (sinceIdLong != -1L) {
paging.sinceId((sinceIdLong - 1).toString()) paging.sinceId((sinceIdLong - 1).toString())
@ -202,7 +201,7 @@ abstract class GetStatusesTask(
// END HotMobi // END HotMobi
// Insert a gap. // Insert a gap.
val deletedOldGap = rowsDeleted > 0 && ArrayUtils.contains(statusIds, maxId) val deletedOldGap = rowsDeleted > 0 && maxId in statusIds
val noRowsDeleted = rowsDeleted == 0 val noRowsDeleted = rowsDeleted == 0
// Why loadItemLimit / 2? because it will not acting strange in most cases // Why loadItemLimit / 2? because it will not acting strange in most cases
val insertGap = minIdx != -1 && olderCount > 0 && (noRowsDeleted || deletedOldGap) val insertGap = minIdx != -1 && olderCount > 0 && (noRowsDeleted || deletedOldGap)

View File

@ -19,8 +19,6 @@ import edu.tsinghua.hotmobi.HotMobiLogger
import edu.tsinghua.hotmobi.model.MediaUploadEvent import edu.tsinghua.hotmobi.model.MediaUploadEvent
import net.ypresto.androidtranscoder.MediaTranscoder import net.ypresto.androidtranscoder.MediaTranscoder
import net.ypresto.androidtranscoder.format.MediaFormatStrategyPresets import net.ypresto.androidtranscoder.format.MediaFormatStrategyPresets
import org.apache.commons.lang3.ArrayUtils
import org.apache.commons.lang3.math.NumberUtils
import org.mariotaku.ktextension.* import org.mariotaku.ktextension.*
import org.mariotaku.library.objectcursor.ObjectCursor import org.mariotaku.library.objectcursor.ObjectCursor
import org.mariotaku.microblog.library.MicroBlog import org.mariotaku.microblog.library.MicroBlog
@ -367,7 +365,7 @@ class UpdateStatusTask(
@Throws(UploadException::class) @Throws(UploadException::class)
private fun uploadMediaWithDefaultProvider(update: ParcelableStatusUpdate, pendingUpdate: PendingStatusUpdate) { private fun uploadMediaWithDefaultProvider(update: ParcelableStatusUpdate, pendingUpdate: PendingStatusUpdate) {
// Return empty array if no media attached // Return empty array if no media attached
if (ArrayUtils.isEmpty(update.media)) return if (update.media.isNullOrEmpty()) return
val ownersList = update.accounts.filter { val ownersList = update.accounts.filter {
AccountType.TWITTER == it.type AccountType.TWITTER == it.type
}.map(AccountDetails::key) }.map(AccountDetails::key)
@ -920,10 +918,10 @@ class UpdateStatusTask(
if (extractedMimeType != null) { if (extractedMimeType != null) {
mediaType = extractedMimeType mediaType = extractedMimeType
} }
geometry.x = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH).toInt(-1) geometry.x = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH).toIntOr(-1)
geometry.y = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT).toInt(-1) geometry.y = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT).toIntOr(-1)
duration = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION).toLong(-1) duration = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION).toLongOr(-1)
framerate = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_CAPTURE_FRAMERATE).toDouble(-1.0) framerate = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_CAPTURE_FRAMERATE).toDoubleOr(-1.0)
size = resolver.openFileDescriptor(mediaUri, "r").use { it.statSize } size = resolver.openFileDescriptor(mediaUri, "r").use { it.statSize }
} catch (e: Exception) { } catch (e: Exception) {
@ -1001,7 +999,7 @@ class UpdateStatusTask(
val resolver = context.contentResolver val resolver = context.contentResolver
val creator = ObjectCursor.valuesCreatorFrom(Draft::class.java) val creator = ObjectCursor.valuesCreatorFrom(Draft::class.java)
val draftUri = resolver.insert(Drafts.CONTENT_URI, creator.create(draft)) ?: return -1 val draftUri = resolver.insert(Drafts.CONTENT_URI, creator.create(draft)) ?: return -1
return NumberUtils.toLong(draftUri.lastPathSegment, -1) return draftUri.lastPathSegment.toLongOr(-1)
} }
fun deleteDraft(context: Context, id: Long) { fun deleteDraft(context: Context, id: Long) {

View File

@ -22,8 +22,8 @@ package org.mariotaku.twidere.task.twitter.message
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.content.ContentValues import android.content.ContentValues
import android.content.Context import android.content.Context
import org.mariotaku.ktextension.toInt import org.mariotaku.ktextension.toIntOr
import org.mariotaku.ktextension.toLong import org.mariotaku.ktextension.toLongOr
import org.mariotaku.ktextension.useCursor import org.mariotaku.ktextension.useCursor
import org.mariotaku.library.objectcursor.ObjectCursor import org.mariotaku.library.objectcursor.ObjectCursor
import org.mariotaku.microblog.library.MicroBlog import org.mariotaku.microblog.library.MicroBlog
@ -224,7 +224,7 @@ class GetMessagesTask(
val accountKey = details.key val accountKey = details.key
val accountType = details.type val accountType = details.type
val cursor = param.cursors?.get(index) val cursor = param.cursors?.get(index)
val page = cursor?.substringAfter("page:").toInt(-1) val page = cursor?.substringAfter("page:").toIntOr(-1)
val result = microBlog.getConversationList(Paging().apply { val result = microBlog.getConversationList(Paging().apply {
count(60) count(60)
if (page >= 0) { if (page >= 0) {
@ -529,10 +529,10 @@ class GetMessagesTask(
private fun Map<String, List<ParcelableMessage>>.findLastReadTimestamp(conversationId: String, lastReadEventId: String?): Long { private fun Map<String, List<ParcelableMessage>>.findLastReadTimestamp(conversationId: String, lastReadEventId: String?): Long {
val longEventId = lastReadEventId.toLong(-1) val longEventId = lastReadEventId.toLongOr(-1L)
return this[conversationId]?.filter { message -> return this[conversationId]?.filter { message ->
if (message.id == lastReadEventId) return@filter true if (message.id == lastReadEventId) return@filter true
if (longEventId > 0 && longEventId >= message.id.toLong(-1)) return@filter true if (longEventId > 0 && longEventId >= message.id.toLongOr(-1L)) return@filter true
return@filter false return@filter false
}?.maxBy(ParcelableMessage::message_timestamp)?.message_timestamp ?: -1 }?.maxBy(ParcelableMessage::message_timestamp)?.message_timestamp ?: -1
} }

View File

@ -29,8 +29,6 @@ import android.os.Parcelable
import android.provider.BaseColumns import android.provider.BaseColumns
import android.support.annotation.WorkerThread import android.support.annotation.WorkerThread
import android.text.TextUtils import android.text.TextUtils
import com.bluelinelabs.logansquare.LoganSquare
import org.apache.commons.lang3.ArrayUtils
import org.apache.commons.lang3.StringUtils import org.apache.commons.lang3.StringUtils
import org.mariotaku.kpreferences.get import org.mariotaku.kpreferences.get
import org.mariotaku.ktextension.useCursor import org.mariotaku.ktextension.useCursor
@ -720,7 +718,9 @@ object DataStoreUtils {
val keyString = cur.getString(cur.getColumnIndex(keyField)) val keyString = cur.getString(cur.getColumnIndex(keyField))
if (keyString != null) { if (keyString != null) {
val accountKey = UserKey.valueOf(keyString) val accountKey = UserKey.valueOf(keyString)
val arrayIdx = ArrayUtils.indexOf(keys, accountKey) val arrayIdx = keys.indexOfFirst {
accountKey == it
}
if (arrayIdx >= 0) { if (arrayIdx >= 0) {
creator.assign(resultArray, arrayIdx, cur, colIdx) creator.assign(resultArray, arrayIdx, cur, colIdx)
} }

View File

@ -3,7 +3,7 @@ package org.mariotaku.twidere.util
import android.content.Context import android.content.Context
import android.text.TextUtils.isEmpty import android.text.TextUtils.isEmpty
import okhttp3.* import okhttp3.*
import org.apache.commons.lang3.math.NumberUtils import org.mariotaku.ktextension.toIntOr
import org.mariotaku.restfu.http.RestHttpClient import org.mariotaku.restfu.http.RestHttpClient
import org.mariotaku.restfu.okhttp3.OkHttpRestClient import org.mariotaku.restfu.okhttp3.OkHttpRestClient
import org.mariotaku.twidere.constant.SharedPreferenceConstants.* import org.mariotaku.twidere.constant.SharedPreferenceConstants.*
@ -77,7 +77,7 @@ object HttpClientFactory {
private fun configProxy(builder: OkHttpClient.Builder) { private fun configProxy(builder: OkHttpClient.Builder) {
val proxyType = prefs.getString(KEY_PROXY_TYPE, null) val proxyType = prefs.getString(KEY_PROXY_TYPE, null)
val proxyHost = prefs.getString(KEY_PROXY_HOST, null) val proxyHost = prefs.getString(KEY_PROXY_HOST, null)
val proxyPort = NumberUtils.toInt(prefs.getString(KEY_PROXY_PORT, null), -1) val proxyPort = prefs.getString(KEY_PROXY_PORT, null).toIntOr(-1)
if (!isEmpty(proxyHost) && proxyPort in (0..65535)) { if (!isEmpty(proxyHost) && proxyPort in (0..65535)) {
val type = getProxyType(proxyType) val type = getProxyType(proxyType)
if (type != Proxy.Type.DIRECT) { if (type != Proxy.Type.DIRECT) {

View File

@ -44,10 +44,8 @@ import org.mariotaku.ktextension.Bundle
import org.mariotaku.ktextension.set import org.mariotaku.ktextension.set
import org.mariotaku.ktextension.setItemChecked import org.mariotaku.ktextension.setItemChecked
import org.mariotaku.ktextension.setMenuItemIcon import org.mariotaku.ktextension.setMenuItemIcon
import org.mariotaku.twidere.Constants
import org.mariotaku.twidere.Constants.* import org.mariotaku.twidere.Constants.*
import org.mariotaku.twidere.R import org.mariotaku.twidere.R
import org.mariotaku.twidere.TwidereConstants.*
import org.mariotaku.twidere.activity.AccountSelectorActivity import org.mariotaku.twidere.activity.AccountSelectorActivity
import org.mariotaku.twidere.activity.ColorPickerDialogActivity import org.mariotaku.twidere.activity.ColorPickerDialogActivity
import org.mariotaku.twidere.constant.SharedPreferenceConstants import org.mariotaku.twidere.constant.SharedPreferenceConstants

View File

@ -21,10 +21,10 @@ package org.mariotaku.twidere.util
import android.graphics.Point import android.graphics.Point
import android.text.TextUtils import android.text.TextUtils
import org.apache.commons.lang3.math.NumberUtils import org.mariotaku.twidere.extension.model.getAsInteger
import org.mariotaku.twidere.extension.model.getString
import org.mariotaku.twidere.model.ParcelableCardEntity import org.mariotaku.twidere.model.ParcelableCardEntity
import org.mariotaku.twidere.model.ParcelableStatus import org.mariotaku.twidere.model.ParcelableStatus
import org.mariotaku.twidere.model.util.ParcelableCardEntityUtils
import java.util.regex.Pattern import java.util.regex.Pattern
/** /**
@ -39,8 +39,8 @@ object TwitterCardUtils {
const val CARD_NAME_ANIMATED_GIF = "animated_gif" const val CARD_NAME_ANIMATED_GIF = "animated_gif"
fun getCardSize(card: ParcelableCardEntity): Point? { fun getCardSize(card: ParcelableCardEntity): Point? {
val playerWidth = ParcelableCardEntityUtils.getAsInteger(card, "player_width", -1) val playerWidth = card.getAsInteger("player_width", -1)
val playerHeight = ParcelableCardEntityUtils.getAsInteger(card, "player_height", -1) val playerHeight = card.getAsInteger("player_height", -1)
if (playerWidth > 0 && playerHeight > 0) { if (playerWidth > 0 && playerHeight > 0) {
return Point(playerWidth, playerHeight) return Point(playerWidth, playerHeight)
} }
@ -52,7 +52,7 @@ object TwitterCardUtils {
when (status.card_name) { when (status.card_name) {
CARD_NAME_PLAYER -> { CARD_NAME_PLAYER -> {
status.media?.let { mediaArray -> status.media?.let { mediaArray ->
val appUrlResolved = ParcelableCardEntityUtils.getString(card, "app_url_resolved") val appUrlResolved = card.getString("app_url_resolved")
val cardUrl = card.url val cardUrl = card.url
mediaArray.forEach { mediaArray.forEach {
if (it.url == appUrlResolved || it.url == cardUrl) { if (it.url == appUrlResolved || it.url == cardUrl) {
@ -60,7 +60,7 @@ object TwitterCardUtils {
} }
} }
} }
return TextUtils.isEmpty(ParcelableCardEntityUtils.getString(card, "player_stream_url")) return TextUtils.isEmpty(card.getString("player_stream_url"))
} }
CARD_NAME_AUDIO -> { CARD_NAME_AUDIO -> {
return true return true
@ -75,7 +75,7 @@ object TwitterCardUtils {
fun getChoicesCount(card: ParcelableCardEntity): Int { fun getChoicesCount(card: ParcelableCardEntity): Int {
val matcher = PATTERN_POLL_TEXT_ONLY.matcher(card.name) val matcher = PATTERN_POLL_TEXT_ONLY.matcher(card.name)
if (!matcher.matches()) throw IllegalStateException() if (!matcher.matches()) throw IllegalStateException()
return NumberUtils.toInt(matcher.group(1)) return matcher.group(1).toInt()
} }
fun isPoll(card: ParcelableCardEntity): Boolean { fun isPoll(card: ParcelableCardEntity): Boolean {

View File

@ -2,7 +2,6 @@ package org.mariotaku.twidere.util.filter
import android.content.Context import android.content.Context
import android.net.Uri import android.net.Uri
import com.bluelinelabs.logansquare.LoganSquare
import com.bluelinelabs.logansquare.annotation.JsonField import com.bluelinelabs.logansquare.annotation.JsonField
import com.bluelinelabs.logansquare.annotation.JsonObject import com.bluelinelabs.logansquare.annotation.JsonObject
import org.mariotaku.restfu.annotation.method.GET import org.mariotaku.restfu.annotation.method.GET

View File

@ -25,7 +25,7 @@ import android.util.Log
import android.util.TimingLogger import android.util.TimingLogger
import okhttp3.Dns import okhttp3.Dns
import org.apache.commons.lang3.StringUtils import org.apache.commons.lang3.StringUtils
import org.mariotaku.ktextension.toInt import org.mariotaku.ktextension.toIntOr
import org.mariotaku.twidere.BuildConfig import org.mariotaku.twidere.BuildConfig
import org.mariotaku.twidere.TwidereConstants.HOST_MAPPING_PREFERENCES_NAME import org.mariotaku.twidere.TwidereConstants.HOST_MAPPING_PREFERENCES_NAME
import org.mariotaku.twidere.constant.SharedPreferenceConstants.* import org.mariotaku.twidere.constant.SharedPreferenceConstants.*
@ -200,7 +200,7 @@ class TwidereDns(context: Context, private val preferences: SharedPreferences) :
if (!isValidIpAddress(segs[0])) return@mapNotNull null if (!isValidIpAddress(segs[0])) return@mapNotNull null
return@mapNotNull SimpleResolver(segs[0]).apply { return@mapNotNull SimpleResolver(segs[0]).apply {
if (segs.size == 2) { if (segs.size == 2) {
val port = segs[1].toInt(-1) val port = segs[1].toIntOr(-1)
if (port in 0..65535) { if (port in 0..65535) {
setPort(port) setPort(port)
} }

View File

@ -19,9 +19,9 @@
package org.mariotaku.twidere.util.twitter.card package org.mariotaku.twidere.util.twitter.card
import org.mariotaku.twidere.extension.model.getString
import org.mariotaku.twidere.model.ParcelableCardEntity import org.mariotaku.twidere.model.ParcelableCardEntity
import org.mariotaku.twidere.model.ParcelableStatus import org.mariotaku.twidere.model.ParcelableStatus
import org.mariotaku.twidere.model.util.ParcelableCardEntityUtils
import org.mariotaku.twidere.util.TwitterCardUtils import org.mariotaku.twidere.util.TwitterCardUtils
import org.mariotaku.twidere.view.ContainerView import org.mariotaku.twidere.view.ContainerView
import org.mariotaku.twidere.view.controller.twitter.card.CardBrowserViewController import org.mariotaku.twidere.view.controller.twitter.card.CardBrowserViewController
@ -69,7 +69,7 @@ abstract class TwitterCardViewFactory {
} }
private fun createGenericPlayerFragment(card: ParcelableCardEntity): ContainerView.ViewController? { private fun createGenericPlayerFragment(card: ParcelableCardEntity): ContainerView.ViewController? {
val playerUrl = ParcelableCardEntityUtils.getString(card, "player_url") ?: return null val playerUrl = card.getString("player_url") ?: return null
return CardBrowserViewController.show(playerUrl) return CardBrowserViewController.show(playerUrl)
} }
} }

View File

@ -20,19 +20,15 @@
package org.mariotaku.twidere.view package org.mariotaku.twidere.view
import android.content.Context import android.content.Context
import android.os.Handler
import android.os.SystemClock import android.os.SystemClock
import android.support.v7.widget.AppCompatTextView import android.support.v7.widget.AppCompatTextView
import android.text.TextUtils import android.text.TextUtils
import android.text.format.DateUtils import android.text.format.DateUtils
import android.util.AttributeSet import android.util.AttributeSet
import org.mariotaku.twidere.Constants import org.mariotaku.twidere.Constants
import org.mariotaku.twidere.R import org.mariotaku.twidere.R
import java.lang.ref.WeakReference
import org.mariotaku.twidere.util.Utils.formatSameDayTime import org.mariotaku.twidere.util.Utils.formatSameDayTime
import java.lang.ref.WeakReference
class ShortTimeView( class ShortTimeView(
context: Context, context: Context,

View File

@ -32,19 +32,18 @@ import android.widget.TextView
import kotlinx.android.synthetic.main.layout_twitter_card_poll.view.* import kotlinx.android.synthetic.main.layout_twitter_card_poll.view.*
import nl.komponents.kovenant.task import nl.komponents.kovenant.task
import nl.komponents.kovenant.ui.successUi import nl.komponents.kovenant.ui.successUi
import org.apache.commons.lang3.math.NumberUtils
import org.mariotaku.abstask.library.AbstractTask import org.mariotaku.abstask.library.AbstractTask
import org.mariotaku.abstask.library.TaskStarter import org.mariotaku.abstask.library.TaskStarter
import org.mariotaku.ktextension.toLongOr
import org.mariotaku.microblog.library.MicroBlogException import org.mariotaku.microblog.library.MicroBlogException
import org.mariotaku.microblog.library.twitter.TwitterCaps import org.mariotaku.microblog.library.twitter.TwitterCaps
import org.mariotaku.microblog.library.twitter.model.CardDataMap import org.mariotaku.microblog.library.twitter.model.CardDataMap
import org.mariotaku.twidere.Constants.LOGTAG import org.mariotaku.twidere.Constants.LOGTAG
import org.mariotaku.twidere.R import org.mariotaku.twidere.R
import org.mariotaku.twidere.extension.model.newMicroBlogInstance import org.mariotaku.twidere.extension.model.*
import org.mariotaku.twidere.model.ParcelableCardEntity import org.mariotaku.twidere.model.ParcelableCardEntity
import org.mariotaku.twidere.model.ParcelableStatus import org.mariotaku.twidere.model.ParcelableStatus
import org.mariotaku.twidere.model.util.AccountUtils import org.mariotaku.twidere.model.util.AccountUtils
import org.mariotaku.twidere.model.util.ParcelableCardEntityUtils
import org.mariotaku.twidere.util.MicroBlogAPIFactory import org.mariotaku.twidere.util.MicroBlogAPIFactory
import org.mariotaku.twidere.util.TwitterCardUtils import org.mariotaku.twidere.util.TwitterCardUtils
import org.mariotaku.twidere.util.support.ViewSupport import org.mariotaku.twidere.util.support.ViewSupport
@ -104,8 +103,7 @@ class CardPollViewController : ContainerView.ViewController() {
if (cardResponse == null || cardResponse.name == null) { if (cardResponse == null || cardResponse.name == null) {
throw IllegalStateException() throw IllegalStateException()
} }
return@task ParcelableCardEntityUtils.fromCardEntity(cardResponse, details.key, return@task cardResponse.toParcelable(details.key, details.type)
details.type)
}.successUi { data -> }.successUi { data ->
weakThis.get()?.displayPoll(data, status) weakThis.get()?.displayPoll(data, status)
} }
@ -116,15 +114,15 @@ class CardPollViewController : ContainerView.ViewController() {
fetchedCard = card fetchedCard = card
val choicesCount = TwitterCardUtils.getChoicesCount(card) val choicesCount = TwitterCardUtils.getChoicesCount(card)
var votesSum = 0 var votesSum = 0
val countsAreFinal = ParcelableCardEntityUtils.getAsBoolean(card, "counts_are_final", false) val countsAreFinal = card.getAsBoolean("counts_are_final", false)
val selectedChoice = ParcelableCardEntityUtils.getAsInteger(card, "selected_choice", -1) val selectedChoice = card.getAsInteger("selected_choice", -1)
val endDatetimeUtc = ParcelableCardEntityUtils.getAsDate(card, "end_datetime_utc", Date()) val endDatetimeUtc = card.getAsDate("end_datetime_utc", Date())
val hasChoice = selectedChoice != -1 val hasChoice = selectedChoice != -1
val isMyPoll = status.account_key == status.user_key val isMyPoll = status.account_key == status.user_key
val showResult = countsAreFinal || isMyPoll || hasChoice val showResult = countsAreFinal || isMyPoll || hasChoice
for (i in 0..choicesCount - 1) { for (i in 0..choicesCount - 1) {
val choiceIndex = i + 1 val choiceIndex = i + 1
votesSum += ParcelableCardEntityUtils.getAsInteger(card, "choice" + choiceIndex + "_count", 0) votesSum += card.getAsInteger("choice${choiceIndex}_count", 0)
} }
val clickListener = object : View.OnClickListener { val clickListener = object : View.OnClickListener {
@ -141,7 +139,7 @@ class CardPollViewController : ContainerView.ViewController() {
choiceRadioButton.isChecked = checked choiceRadioButton.isChecked = checked
if (checked) { if (checked) {
val cardData = CardDataMap() val cardData = CardDataMap()
cardData.putLong("original_tweet_id", NumberUtils.toLong(status.id)) cardData.putLong("original_tweet_id", status.id.toLongOr(-1L))
cardData.putString("card_uri", card.url) cardData.putString("card_uri", card.url)
cardData.putString("cards_platform", MicroBlogAPIFactory.CARDS_PLATFORM_ANDROID_12) cardData.putString("cards_platform", MicroBlogAPIFactory.CARDS_PLATFORM_ANDROID_12)
cardData.putString("response_card_name", card.name) cardData.putString("response_card_name", card.name)
@ -161,8 +159,7 @@ class CardPollViewController : ContainerView.ViewController() {
val cardEntity = caps.sendPassThrough(cardDataMap).card ?: run { val cardEntity = caps.sendPassThrough(cardDataMap).card ?: run {
return null return null
} }
return ParcelableCardEntityUtils.fromCardEntity(cardEntity, return cardEntity.toParcelable(card.account_key, details.type)
card.account_key, details.type)
} catch (e: MicroBlogException) { } catch (e: MicroBlogException) {
Log.w(LOGTAG, e) Log.w(LOGTAG, e)
} }
@ -188,8 +185,8 @@ class CardPollViewController : ContainerView.ViewController() {
val choiceRadioButton = pollItem.findViewById(R.id.choice_button) as RadioButton val choiceRadioButton = pollItem.findViewById(R.id.choice_button) as RadioButton
val choiceIndex = i + 1 val choiceIndex = i + 1
val label = ParcelableCardEntityUtils.getAsString(card, "choice" + choiceIndex + "_label", null) val label = card.getAsString("choice${choiceIndex}_label", null)
val value = ParcelableCardEntityUtils.getAsInteger(card, "choice" + choiceIndex + "_count", 0) val value = card.getAsInteger("choice${choiceIndex}_count", 0)
if (label == null) throw NullPointerException() if (label == null) throw NullPointerException()
val choicePercent = if (votesSum == 0) 0f else value / votesSum.toFloat() val choicePercent = if (votesSum == 0) 0f else value / votesSum.toFloat()
choiceLabelView.text = label choiceLabelView.text = label

View File

@ -28,9 +28,7 @@ import org.mariotaku.twidere.R
import org.mariotaku.twidere.extension.model.getActionName import org.mariotaku.twidere.extension.model.getActionName
import org.mariotaku.twidere.model.Draft import org.mariotaku.twidere.model.Draft
import org.mariotaku.twidere.model.ParcelableMedia import org.mariotaku.twidere.model.ParcelableMedia
import org.mariotaku.twidere.model.ParcelableMediaUpdate
import org.mariotaku.twidere.model.draft.StatusObjectExtras import org.mariotaku.twidere.model.draft.StatusObjectExtras
import org.mariotaku.twidere.model.util.ParcelableMediaUtils
import org.mariotaku.twidere.util.DataStoreUtils import org.mariotaku.twidere.util.DataStoreUtils
import org.mariotaku.twidere.util.Utils import org.mariotaku.twidere.util.Utils

View File

@ -18,8 +18,7 @@
~ along with this program. If not, see <http://www.gnu.org/licenses/>. ~ along with this program. If not, see <http://www.gnu.org/licenses/>.
--> -->
<menu xmlns:android="http://schemas.android.com/apk/res/android" <menu xmlns:android="http://schemas.android.com/apk/res/android">
xmlns:app="http://schemas.android.com/apk/res-auto">
<item <item
android:id="@+id/search" android:id="@+id/search"
android:enabled="@bool/debug" android:enabled="@bool/debug"