Compare commits
4 Commits
dc144f068e
...
e325e886ac
Author | SHA1 | Date |
---|---|---|
Tlaster | e325e886ac | |
Tlaster | cf270b72fc | |
Tlaster | 4f137ad827 | |
TacoTheDank | 4729c02ea9 |
|
@ -67,8 +67,6 @@ public interface TwidereConstants extends SharedPreferenceConstants, IntentConst
|
||||||
String TWITTER_CONSUMER_KEY = "MUUBibXUognm6e9vbzrUIqPkt";
|
String TWITTER_CONSUMER_KEY = "MUUBibXUognm6e9vbzrUIqPkt";
|
||||||
String TWITTER_CONSUMER_SECRET = "l2uWAgQkoHvDfM2PrRFx2WN4h7QIUIktmxyeTAqRo6TkGCtNKy";
|
String TWITTER_CONSUMER_SECRET = "l2uWAgQkoHvDfM2PrRFx2WN4h7QIUIktmxyeTAqRo6TkGCtNKy";
|
||||||
|
|
||||||
String YANDEX_KEY = "trnsl.1.1.20200513T065609Z.8e72845b632aa04f.fe1297e42c152de9e8773e1bc71162b1e498e2a8";
|
|
||||||
|
|
||||||
String DEFAULT_TWITTER_API_URL_FORMAT = "https://[DOMAIN].twitter.com/";
|
String DEFAULT_TWITTER_API_URL_FORMAT = "https://[DOMAIN].twitter.com/";
|
||||||
|
|
||||||
String SCHEME_HTTP = "http";
|
String SCHEME_HTTP = "http";
|
||||||
|
|
|
@ -285,8 +285,6 @@ public interface SharedPreferenceConstants {
|
||||||
String KEY_OVERRIDE_LANGUAGE = "override_language";
|
String KEY_OVERRIDE_LANGUAGE = "override_language";
|
||||||
@ExportablePreference(STRING)
|
@ExportablePreference(STRING)
|
||||||
String KEY_TAB_POSITION = "tab_position";
|
String KEY_TAB_POSITION = "tab_position";
|
||||||
@ExportablePreference(STRING)
|
|
||||||
String KEY_YANDEX_KEY = "yandex_key";
|
|
||||||
@ExportablePreference(BOOLEAN)
|
@ExportablePreference(BOOLEAN)
|
||||||
String KEY_AUTO_HIDE_TABS = "auto_hide_tabs";
|
String KEY_AUTO_HIDE_TABS = "auto_hide_tabs";
|
||||||
@ExportablePreference(BOOLEAN)
|
@ExportablePreference(BOOLEAN)
|
||||||
|
|
|
@ -10,7 +10,6 @@ import org.mariotaku.ktextension.bcp47Tag
|
||||||
import org.mariotaku.ktextension.toLongOr
|
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
|
|
||||||
import org.mariotaku.twidere.TwidereConstants.KEY_MEDIA_PRELOAD
|
import org.mariotaku.twidere.TwidereConstants.KEY_MEDIA_PRELOAD
|
||||||
import org.mariotaku.twidere.annotation.AccountType
|
import org.mariotaku.twidere.annotation.AccountType
|
||||||
import org.mariotaku.twidere.annotation.ImageShapeStyle
|
import org.mariotaku.twidere.annotation.ImageShapeStyle
|
||||||
|
@ -87,7 +86,6 @@ val lastLaunchTimeKey = KLongKey("last_launch_time", -1)
|
||||||
val promotionsEnabledKey = KBooleanKey("promotions_enabled", false)
|
val promotionsEnabledKey = KBooleanKey("promotions_enabled", false)
|
||||||
val translationDestinationKey = KNullableStringKey(KEY_TRANSLATION_DESTINATION, null)
|
val translationDestinationKey = KNullableStringKey(KEY_TRANSLATION_DESTINATION, null)
|
||||||
val tabPositionKey = KStringKey(KEY_TAB_POSITION, SharedPreferenceConstants.DEFAULT_TAB_POSITION)
|
val tabPositionKey = KStringKey(KEY_TAB_POSITION, SharedPreferenceConstants.DEFAULT_TAB_POSITION)
|
||||||
val yandexKeyKey = KStringKey(SharedPreferenceConstants.KEY_YANDEX_KEY, TwidereConstants.YANDEX_KEY)
|
|
||||||
val autoHideTabs = KBooleanKey(SharedPreferenceConstants.KEY_AUTO_HIDE_TABS, true)
|
val autoHideTabs = KBooleanKey(SharedPreferenceConstants.KEY_AUTO_HIDE_TABS, true)
|
||||||
val hideCardNumbersKey = KBooleanKey(KEY_HIDE_CARD_NUMBERS, false)
|
val hideCardNumbersKey = KBooleanKey(KEY_HIDE_CARD_NUMBERS, false)
|
||||||
val showLinkPreviewKey = KBooleanKey(KEY_SHOW_LINK_PREVIEW, false)
|
val showLinkPreviewKey = KBooleanKey(KEY_SHOW_LINK_PREVIEW, false)
|
||||||
|
|
|
@ -32,19 +32,19 @@ import android.nfc.NdefMessage
|
||||||
import android.nfc.NdefRecord
|
import android.nfc.NdefRecord
|
||||||
import android.nfc.NfcAdapter.CreateNdefMessageCallback
|
import android.nfc.NfcAdapter.CreateNdefMessageCallback
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.text.TextUtils
|
|
||||||
import android.view.*
|
|
||||||
import android.widget.Toast
|
|
||||||
import androidx.appcompat.app.AlertDialog
|
|
||||||
import androidx.loader.app.LoaderManager
|
import androidx.loader.app.LoaderManager
|
||||||
import androidx.loader.app.LoaderManager.LoaderCallbacks
|
import androidx.loader.app.LoaderManager.LoaderCallbacks
|
||||||
import androidx.loader.app.hasRunningLoadersSafe
|
import androidx.loader.app.hasRunningLoadersSafe
|
||||||
import androidx.loader.content.FixedAsyncTaskLoader
|
import androidx.loader.content.FixedAsyncTaskLoader
|
||||||
import androidx.loader.content.Loader
|
import androidx.loader.content.Loader
|
||||||
|
import androidx.appcompat.app.AlertDialog
|
||||||
import androidx.recyclerview.widget.FixedLinearLayoutManager
|
import androidx.recyclerview.widget.FixedLinearLayoutManager
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager
|
import androidx.recyclerview.widget.LinearLayoutManager
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
import androidx.recyclerview.widget.RecyclerView.ViewHolder
|
import androidx.recyclerview.widget.RecyclerView.ViewHolder
|
||||||
|
import android.text.TextUtils
|
||||||
|
import android.view.*
|
||||||
|
import android.widget.Toast
|
||||||
import com.squareup.otto.Subscribe
|
import com.squareup.otto.Subscribe
|
||||||
import kotlinx.android.synthetic.main.fragment_status.*
|
import kotlinx.android.synthetic.main.fragment_status.*
|
||||||
import kotlinx.android.synthetic.main.layout_content_fragment_common.*
|
import kotlinx.android.synthetic.main.layout_content_fragment_common.*
|
||||||
|
@ -72,12 +72,13 @@ import org.mariotaku.twidere.annotation.AccountType
|
||||||
import org.mariotaku.twidere.constant.KeyboardShortcutConstants.*
|
import org.mariotaku.twidere.constant.KeyboardShortcutConstants.*
|
||||||
import org.mariotaku.twidere.constant.displaySensitiveContentsKey
|
import org.mariotaku.twidere.constant.displaySensitiveContentsKey
|
||||||
import org.mariotaku.twidere.constant.newDocumentApiKey
|
import org.mariotaku.twidere.constant.newDocumentApiKey
|
||||||
import org.mariotaku.twidere.constant.yandexKeyKey
|
|
||||||
import org.mariotaku.twidere.exception.AccountNotFoundException
|
|
||||||
import org.mariotaku.twidere.extension.*
|
import org.mariotaku.twidere.extension.*
|
||||||
import org.mariotaku.twidere.extension.model.*
|
|
||||||
import org.mariotaku.twidere.extension.model.api.key
|
import org.mariotaku.twidere.extension.model.api.key
|
||||||
import org.mariotaku.twidere.extension.model.api.toParcelable
|
import org.mariotaku.twidere.extension.model.api.toParcelable
|
||||||
|
import org.mariotaku.twidere.extension.model.getAccountType
|
||||||
|
import org.mariotaku.twidere.extension.model.media_type
|
||||||
|
import org.mariotaku.twidere.extension.model.newMicroBlogInstance
|
||||||
|
import org.mariotaku.twidere.extension.model.originalId
|
||||||
import org.mariotaku.twidere.extension.view.calculateSpaceItemHeight
|
import org.mariotaku.twidere.extension.view.calculateSpaceItemHeight
|
||||||
import org.mariotaku.twidere.fragment.AbsStatusesFragment
|
import org.mariotaku.twidere.fragment.AbsStatusesFragment
|
||||||
import org.mariotaku.twidere.fragment.AbsStatusesFragment.Companion.handleActionClick
|
import org.mariotaku.twidere.fragment.AbsStatusesFragment.Companion.handleActionClick
|
||||||
|
@ -95,20 +96,17 @@ import org.mariotaku.twidere.model.pagination.SinceMaxPagination
|
||||||
import org.mariotaku.twidere.model.util.AccountUtils
|
import org.mariotaku.twidere.model.util.AccountUtils
|
||||||
import org.mariotaku.twidere.provider.TwidereDataStore.CachedStatuses
|
import org.mariotaku.twidere.provider.TwidereDataStore.CachedStatuses
|
||||||
import org.mariotaku.twidere.provider.TwidereDataStore.Statuses
|
import org.mariotaku.twidere.provider.TwidereDataStore.Statuses
|
||||||
import org.mariotaku.twidere.task.ExceptionHandlingAbstractTask
|
import org.mariotaku.twidere.task.AbsAccountRequestTask
|
||||||
import org.mariotaku.twidere.util.*
|
import org.mariotaku.twidere.util.*
|
||||||
import org.mariotaku.twidere.util.ContentScrollHandler.ContentListSupport
|
import org.mariotaku.twidere.util.ContentScrollHandler.ContentListSupport
|
||||||
import org.mariotaku.twidere.util.KeyboardShortcutsHandler.KeyboardShortcutCallback
|
import org.mariotaku.twidere.util.KeyboardShortcutsHandler.KeyboardShortcutCallback
|
||||||
import org.mariotaku.twidere.util.RecyclerViewScrollHandler.RecyclerViewCallback
|
import org.mariotaku.twidere.util.RecyclerViewScrollHandler.RecyclerViewCallback
|
||||||
import org.mariotaku.twidere.util.dagger.DependencyHolder
|
|
||||||
import org.mariotaku.twidere.view.CardMediaContainer.OnMediaClickListener
|
import org.mariotaku.twidere.view.CardMediaContainer.OnMediaClickListener
|
||||||
import org.mariotaku.twidere.view.ExtendedRecyclerView
|
import org.mariotaku.twidere.view.ExtendedRecyclerView
|
||||||
import org.mariotaku.twidere.view.holder.GapViewHolder
|
import org.mariotaku.twidere.view.holder.GapViewHolder
|
||||||
import org.mariotaku.twidere.view.holder.StatusViewHolder
|
import org.mariotaku.twidere.view.holder.StatusViewHolder
|
||||||
import org.mariotaku.twidere.view.holder.iface.IStatusViewHolder
|
import org.mariotaku.twidere.view.holder.iface.IStatusViewHolder
|
||||||
import org.mariotaku.twidere.view.holder.iface.IStatusViewHolder.StatusClickListener
|
import org.mariotaku.twidere.view.holder.iface.IStatusViewHolder.StatusClickListener
|
||||||
import org.mariotaku.yandex.YandexAPIFactory
|
|
||||||
import org.mariotaku.yandex.YandexException
|
|
||||||
import java.lang.ref.WeakReference
|
import java.lang.ref.WeakReference
|
||||||
import kotlin.math.max
|
import kotlin.math.max
|
||||||
import kotlin.math.min
|
import kotlin.math.min
|
||||||
|
@ -689,16 +687,13 @@ class StatusFragment : BaseFragment(), LoaderCallbacks<SingleResponse<Parcelable
|
||||||
}
|
}
|
||||||
|
|
||||||
internal class LoadTranslationTask(fragment: StatusFragment, val status: ParcelableStatus) :
|
internal class LoadTranslationTask(fragment: StatusFragment, val status: ParcelableStatus) :
|
||||||
ExceptionHandlingAbstractTask<Any?, TranslationResult, YandexException, Any?>(fragment.requireContext()) {
|
AbsAccountRequestTask<Any?, TranslationResult, Any?>(fragment.requireContext(), status.account_key) {
|
||||||
|
|
||||||
private val weakFragment = WeakReference(fragment)
|
private val weakFragment = WeakReference(fragment)
|
||||||
|
|
||||||
override fun onExecute(params: Any?): TranslationResult {
|
override fun onExecute(account: AccountDetails, params: Any?): TranslationResult {
|
||||||
val am = AccountManager.get(context)
|
|
||||||
val account = status.account_key?.let { AccountUtils.getAccountDetails(am, it, true) } ?:
|
|
||||||
throw AccountNotFoundException()
|
|
||||||
val prefDest = preferences.getString(KEY_TRANSLATION_DESTINATION, null).orEmpty()
|
|
||||||
val twitter = account.newMicroBlogInstance(context, MicroBlog::class.java)
|
val twitter = account.newMicroBlogInstance(context, MicroBlog::class.java)
|
||||||
|
val prefDest = preferences.getString(KEY_TRANSLATION_DESTINATION, null).orEmpty()
|
||||||
val dest: String
|
val dest: String
|
||||||
if (TextUtils.isEmpty(prefDest)) {
|
if (TextUtils.isEmpty(prefDest)) {
|
||||||
dest = twitter.accountSettings.language
|
dest = twitter.accountSettings.language
|
||||||
|
@ -708,21 +703,7 @@ class StatusFragment : BaseFragment(), LoaderCallbacks<SingleResponse<Parcelable
|
||||||
} else {
|
} else {
|
||||||
dest = prefDest
|
dest = prefDest
|
||||||
}
|
}
|
||||||
return if (account.isOfficial(context)) {
|
return twitter.showTranslation(status.originalId, dest)
|
||||||
twitter.showTranslation(status.originalId, dest)
|
|
||||||
} else {
|
|
||||||
val holder = DependencyHolder.get(context)
|
|
||||||
val api = YandexAPIFactory(preferences[yandexKeyKey], "https://translate.yandex.net/")
|
|
||||||
.setHttpClient(holder.restHttpClient)
|
|
||||||
.build()
|
|
||||||
val result = api.search(status.text_plain, "${status.lang}-${dest.split('-').firstOrNull()}")
|
|
||||||
TranslationResult().also {
|
|
||||||
it[TranslationResult::class.java.getDeclaredField("text")] = result.text?.firstOrNull()
|
|
||||||
it[TranslationResult::class.java.getDeclaredField("id")] = status.originalId
|
|
||||||
it[TranslationResult::class.java.getDeclaredField("translatedLang")] = result.lang?.split('-')?.lastOrNull()
|
|
||||||
it[TranslationResult::class.java.getDeclaredField("lang")] = result.lang?.split('-')?.firstOrNull()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onSucceed(callback: Any?, result: TranslationResult) {
|
override fun onSucceed(callback: Any?, result: TranslationResult) {
|
||||||
|
@ -730,11 +711,9 @@ class StatusFragment : BaseFragment(), LoaderCallbacks<SingleResponse<Parcelable
|
||||||
fragment.displayTranslation(result)
|
fragment.displayTranslation(result)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onException(callback: Any?, exception: YandexException) {
|
override fun onException(callback: Any?, exception: MicroBlogException) {
|
||||||
Toast.makeText(context, exception.getErrorMessage(context), Toast.LENGTH_SHORT).show()
|
Toast.makeText(context, exception.getErrorMessage(context), Toast.LENGTH_SHORT).show()
|
||||||
}
|
}
|
||||||
|
|
||||||
final override val exceptionClass = YandexException::class.java
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -23,6 +23,12 @@ import android.content.Context
|
||||||
import android.content.SharedPreferences
|
import android.content.SharedPreferences
|
||||||
import android.graphics.Rect
|
import android.graphics.Rect
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
|
import androidx.annotation.UiThread
|
||||||
|
import androidx.core.content.ContextCompat
|
||||||
|
import androidx.core.view.ViewCompat
|
||||||
|
import androidx.appcompat.widget.ActionMenuView
|
||||||
|
import androidx.recyclerview.widget.LinearLayoutManager
|
||||||
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
import android.text.SpannableString
|
import android.text.SpannableString
|
||||||
import android.text.SpannableStringBuilder
|
import android.text.SpannableStringBuilder
|
||||||
import android.text.Spanned
|
import android.text.Spanned
|
||||||
|
@ -33,13 +39,7 @@ import android.view.LayoutInflater
|
||||||
import android.view.MenuItem
|
import android.view.MenuItem
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import androidx.annotation.UiThread
|
|
||||||
import androidx.appcompat.widget.ActionMenuView
|
|
||||||
import androidx.core.content.ContextCompat
|
|
||||||
import androidx.core.view.ViewCompat
|
|
||||||
import androidx.core.view.isVisible
|
import androidx.core.view.isVisible
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager
|
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
|
||||||
import kotlinx.android.synthetic.main.adapter_item_status_count_label.view.*
|
import kotlinx.android.synthetic.main.adapter_item_status_count_label.view.*
|
||||||
import kotlinx.android.synthetic.main.header_status.view.*
|
import kotlinx.android.synthetic.main.header_status.view.*
|
||||||
import org.mariotaku.abstask.library.TaskStarter
|
import org.mariotaku.abstask.library.TaskStarter
|
||||||
|
@ -351,7 +351,7 @@ class DetailStatusViewHolder(
|
||||||
|
|
||||||
|
|
||||||
val lang = status.lang
|
val lang = status.lang
|
||||||
if (CheckUtils.isValidLocale(lang) /* && account.isOfficial(context)*/) {
|
if (CheckUtils.isValidLocale(lang) && account.isOfficial(context)) {
|
||||||
translateContainer.visibility = View.VISIBLE
|
translateContainer.visibility = View.VISIBLE
|
||||||
if (translation != null) {
|
if (translation != null) {
|
||||||
val locale = Locale(translation.translatedLang)
|
val locale = Locale(translation.translatedLang)
|
||||||
|
|
|
@ -1,12 +0,0 @@
|
||||||
package org.mariotaku.yandex
|
|
||||||
|
|
||||||
import org.mariotaku.restfu.annotation.method.POST
|
|
||||||
import org.mariotaku.restfu.annotation.param.Query
|
|
||||||
import org.mariotaku.yandex.model.YandexTranslateResult
|
|
||||||
|
|
||||||
interface YandexAPI {
|
|
||||||
@POST("/api/v1.5/tr.json/translate")
|
|
||||||
@Throws(YandexException::class)
|
|
||||||
fun search(@Query("text") text: String,
|
|
||||||
@Query("lang") lang: String): YandexTranslateResult
|
|
||||||
}
|
|
|
@ -1,50 +0,0 @@
|
||||||
package org.mariotaku.yandex
|
|
||||||
|
|
||||||
import org.mariotaku.restfu.RestAPIFactory
|
|
||||||
import org.mariotaku.restfu.RestConverter
|
|
||||||
import org.mariotaku.restfu.RestMethod
|
|
||||||
import org.mariotaku.restfu.RestRequest
|
|
||||||
import org.mariotaku.restfu.http.Endpoint
|
|
||||||
import org.mariotaku.restfu.http.RestHttpClient
|
|
||||||
import org.mariotaku.restfu.http.ValueMap
|
|
||||||
import org.mariotaku.restfu.logansqaure.LoganSquareConverterFactory
|
|
||||||
|
|
||||||
|
|
||||||
class YandexAPIFactory(apiKey: String, endpoint: String) {
|
|
||||||
private val factory: RestAPIFactory<YandexException> = RestAPIFactory<YandexException>()
|
|
||||||
|
|
||||||
init {
|
|
||||||
factory.setEndpoint(Endpoint(endpoint))
|
|
||||||
factory.setExceptionFactory { cause, _, _ ->
|
|
||||||
cause?.let { YandexException(it) }
|
|
||||||
?: YandexException()
|
|
||||||
}
|
|
||||||
factory.setRestConverterFactory(LoganSquareConverterFactory())
|
|
||||||
factory.setRestRequestFactory(object : RestRequest.DefaultFactory<YandexException?>() {
|
|
||||||
override fun create(restMethod: RestMethod<YandexException?>,
|
|
||||||
factory: RestConverter.Factory<YandexException?>, valuePool: ValueMap?): RestRequest {
|
|
||||||
val method = restMethod.method
|
|
||||||
val path = restMethod.path
|
|
||||||
val headers = restMethod.getHeaders(valuePool)
|
|
||||||
val queries = restMethod.getQueries(valuePool)
|
|
||||||
val params = restMethod.getParams(factory, valuePool)
|
|
||||||
val rawValue = restMethod.rawValue
|
|
||||||
val bodyType = restMethod.bodyType
|
|
||||||
val extras = restMethod.extras
|
|
||||||
queries.add("key", apiKey)
|
|
||||||
return RestRequest(method.value, method.allowBody, path, headers, queries,
|
|
||||||
params, rawValue, bodyType, extras)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
fun setHttpClient(restClient: RestHttpClient): YandexAPIFactory {
|
|
||||||
factory.setHttpClient(restClient)
|
|
||||||
return this
|
|
||||||
}
|
|
||||||
|
|
||||||
fun build(): YandexAPI {
|
|
||||||
return factory.build(YandexAPI::class.java)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,8 +0,0 @@
|
||||||
package org.mariotaku.yandex
|
|
||||||
|
|
||||||
class YandexException : Exception {
|
|
||||||
constructor() : super()
|
|
||||||
constructor(message: String?) : super(message)
|
|
||||||
constructor(message: String?, cause: Throwable?) : super(message, cause)
|
|
||||||
constructor(cause: Throwable?) : super(cause)
|
|
||||||
}
|
|
|
@ -1,14 +0,0 @@
|
||||||
package org.mariotaku.yandex.model
|
|
||||||
|
|
||||||
import com.bluelinelabs.logansquare.annotation.JsonField
|
|
||||||
import com.bluelinelabs.logansquare.annotation.JsonObject
|
|
||||||
|
|
||||||
@JsonObject
|
|
||||||
data class YandexTranslateResult(
|
|
||||||
@JsonField(name = ["code"])
|
|
||||||
var code: Int? = null,
|
|
||||||
@JsonField(name = ["lang"])
|
|
||||||
var lang: String? = null,
|
|
||||||
@JsonField(name = ["text"])
|
|
||||||
var text: List<String>? = null
|
|
||||||
)
|
|
|
@ -326,8 +326,6 @@
|
||||||
<string name="dns_server">DNS Server</string>
|
<string name="dns_server">DNS Server</string>
|
||||||
<string name="dns_server_summary">Set DNS Server for network requests.</string>
|
<string name="dns_server_summary">Set DNS Server for network requests.</string>
|
||||||
|
|
||||||
<string name="yandex_key">Yandex Api Key</string>
|
|
||||||
|
|
||||||
<string name="draft_saved">Draft saved</string>
|
<string name="draft_saved">Draft saved</string>
|
||||||
|
|
||||||
<string name="drafts_hint_messages">Your unsent tweets will save here</string>
|
<string name="drafts_hint_messages">Your unsent tweets will save here</string>
|
||||||
|
|
|
@ -36,12 +36,6 @@
|
||||||
android:summary="@string/custom_host_mapping_summary"
|
android:summary="@string/custom_host_mapping_summary"
|
||||||
android:title="@string/custom_host_mapping"/>
|
android:title="@string/custom_host_mapping"/>
|
||||||
|
|
||||||
<org.mariotaku.twidere.preference.ThemedEditTextPreference
|
|
||||||
android:dialogTitle="@string/yandex_key"
|
|
||||||
android:key="yandex_key"
|
|
||||||
android:singleLine="true"
|
|
||||||
android:title="@string/yandex_key"/>
|
|
||||||
|
|
||||||
<org.mariotaku.twidere.preference.TintedPreferenceCategory
|
<org.mariotaku.twidere.preference.TintedPreferenceCategory
|
||||||
android:key="category_proxy"
|
android:key="category_proxy"
|
||||||
android:title="@string/proxy">
|
android:title="@string/proxy">
|
||||||
|
|
Loading…
Reference in New Issue