This commit is contained in:
Mariotaku Lee 2017-04-13 15:53:22 +08:00
parent 0c748e9ef1
commit 56c65af196
No known key found for this signature in database
GPG Key ID: 15C10F89D7C33535
47 changed files with 191 additions and 59 deletions

View File

@ -38,6 +38,7 @@ import java.lang.annotation.RetentionPolicy;
CustomTabType.USER_TIMELINE,
CustomTabType.SEARCH_STATUSES,
CustomTabType.LIST_TIMELINE,
CustomTabType.PUBLIC_TIMELINE,
})
@Retention(RetentionPolicy.SOURCE)
public @interface CustomTabType {
@ -49,4 +50,5 @@ public @interface CustomTabType {
String USER_TIMELINE = "user_timeline";
String SEARCH_STATUSES = "search_statuses";
String LIST_TIMELINE = "list_timeline";
String PUBLIC_TIMELINE = "public_timeline";
}

View File

@ -94,6 +94,9 @@ public class TabArguments implements TwidereConstants {
'}';
}
/**
* Remember to make this method correspond to {@code CustomTabUtils#newTabArguments(String)}
*/
@Nullable
public static TabArguments parse(@NonNull @CustomTabType String type, @Nullable String json) throws IOException {
if (json == null) return null;
@ -101,7 +104,8 @@ public class TabArguments implements TwidereConstants {
case CustomTabType.HOME_TIMELINE:
case CustomTabType.NOTIFICATIONS_TIMELINE:
case CustomTabType.DIRECT_MESSAGES:
case CustomTabType.TRENDS_SUGGESTIONS: {
case CustomTabType.TRENDS_SUGGESTIONS:
case CustomTabType.PUBLIC_TIMELINE: {
return LoganSquare.parse(json, TabArguments.class);
}
case CustomTabType.USER_TIMELINE:

View File

@ -44,6 +44,9 @@ public abstract class TabExtras implements Parcelable {
}
/**
* Remember to make this method correspond to {@code CustomTabUtils#newTabExtras(String)}
*/
@Nullable
public static TabExtras parse(@NonNull @CustomTabType String type, @Nullable String json) throws IOException {
if (json == null) return null;

View File

@ -19,6 +19,7 @@ import org.mariotaku.twidere.model.tab.impl.FavoriteTimelineTabConfiguration;
import org.mariotaku.twidere.model.tab.impl.HomeTabConfiguration;
import org.mariotaku.twidere.model.tab.impl.InteractionsTabConfiguration;
import org.mariotaku.twidere.model.tab.impl.MessagesTabConfiguration;
import org.mariotaku.twidere.model.tab.impl.PublicTimelineTabConfiguration;
import org.mariotaku.twidere.model.tab.impl.SearchTabConfiguration;
import org.mariotaku.twidere.model.tab.impl.TrendsTabConfiguration;
import org.mariotaku.twidere.model.tab.impl.UserListTimelineTabConfiguration;
@ -73,10 +74,8 @@ public abstract class TabConfiguration {
return false;
}
@IntDef(value = {FLAG_HAS_ACCOUNT, FLAG_ACCOUNT_REQUIRED, FLAG_ACCOUNT_MULTIPLE,
FLAG_ACCOUNT_MUTABLE}, flag = true)
protected @interface AccountFlags {
public boolean checkAccountAvailability(@NonNull AccountDetails details) {
return true;
}
@NonNull
@ -98,7 +97,8 @@ public abstract class TabConfiguration {
CustomTabType.FAVORITES,
CustomTabType.USER_TIMELINE,
CustomTabType.SEARCH_STATUSES,
CustomTabType.LIST_TIMELINE
CustomTabType.LIST_TIMELINE,
CustomTabType.PUBLIC_TIMELINE,
};
}
@ -121,10 +121,18 @@ public abstract class TabConfiguration {
return new TrendsTabConfiguration();
case CustomTabType.SEARCH_STATUSES:
return new SearchTabConfiguration();
case CustomTabType.PUBLIC_TIMELINE:
return new PublicTimelineTabConfiguration();
}
return null;
}
@IntDef(value = {FLAG_HAS_ACCOUNT, FLAG_ACCOUNT_REQUIRED, FLAG_ACCOUNT_MULTIPLE,
FLAG_ACCOUNT_MUTABLE}, flag = true)
protected @interface AccountFlags {
}
public static abstract class ExtraConfiguration {
private final String key;
private StringHolder title;

View File

@ -0,0 +1,67 @@
/*
* 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.model.tab.impl;
import android.support.annotation.NonNull;
import android.support.v4.app.Fragment;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.annotation.AccountType;
import org.mariotaku.twidere.fragment.PublicTimelineFragment;
import org.mariotaku.twidere.model.AccountDetails;
import org.mariotaku.twidere.model.tab.DrawableHolder;
import org.mariotaku.twidere.model.tab.StringHolder;
import org.mariotaku.twidere.model.tab.TabConfiguration;
/**
* Created by mariotaku on 2016/11/27.
*/
public class PublicTimelineTabConfiguration extends TabConfiguration {
@NonNull
@Override
public StringHolder getName() {
return StringHolder.resource(R.string.title_public_timeline);
}
@NonNull
@Override
public DrawableHolder getIcon() {
return DrawableHolder.Builtin.QUOTE;
}
@AccountFlags
@Override
public int getAccountFlags() {
return FLAG_HAS_ACCOUNT | FLAG_ACCOUNT_REQUIRED | FLAG_ACCOUNT_MUTABLE;
}
@NonNull
@Override
public Class<? extends Fragment> getFragmentClass() {
return PublicTimelineFragment.class;
}
@Override
public boolean checkAccountAvailability(@NonNull final AccountDetails details) {
return AccountType.FANFOU.equals(details.type)
|| AccountType.STATUSNET.equals(details.type);
}
}

View File

@ -43,6 +43,9 @@ import org.mariotaku.twidere.model.UserKey;
import org.mariotaku.twidere.model.tab.DrawableHolder;
import org.mariotaku.twidere.model.tab.TabConfiguration;
import org.mariotaku.twidere.model.tab.argument.TabArguments;
import org.mariotaku.twidere.model.tab.argument.TextQueryArguments;
import org.mariotaku.twidere.model.tab.argument.UserArguments;
import org.mariotaku.twidere.model.tab.argument.UserListArguments;
import org.mariotaku.twidere.model.tab.extra.HomeTabExtras;
import org.mariotaku.twidere.model.tab.extra.InteractionsTabExtras;
import org.mariotaku.twidere.model.tab.extra.TabExtras;
@ -110,13 +113,33 @@ public class CustomTabUtils implements Constants {
return specs;
}
/**
* Remember to make this method correspond to {@link TabArguments#parse(String, String)}
*
* @see TabArguments#parse(String, String)
*/
@Nullable
public static TabArguments newTabArguments(@NonNull @CustomTabType String type) {
try {
return TabArguments.parse(type, "{}");
} catch (IOException e) {
throw new RuntimeException(e);
switch (type) {
case CustomTabType.HOME_TIMELINE:
case CustomTabType.NOTIFICATIONS_TIMELINE:
case CustomTabType.DIRECT_MESSAGES:
case CustomTabType.TRENDS_SUGGESTIONS:
case CustomTabType.PUBLIC_TIMELINE: {
return new TabArguments();
}
case CustomTabType.USER_TIMELINE:
case CustomTabType.FAVORITES: {
return new UserArguments();
}
case CustomTabType.LIST_TIMELINE: {
return new UserListArguments();
}
case CustomTabType.SEARCH_STATUSES: {
return new TextQueryArguments();
}
}
return null;
}

View File

@ -457,7 +457,7 @@ class LinkHandlerActivity : BaseActivity(), SystemWindowsInsetsCallback, IContro
title = getString(R.string.interactions)
}
LINK_ID_PUBLIC_TIMELINE -> {
title = getString(R.string.public_timeline)
title = getString(R.string.title_public_timeline)
}
LINK_ID_FILTERS_IMPORT_BLOCKS -> {
title = getString(R.string.title_select_users)

View File

@ -34,6 +34,8 @@ import nl.komponents.kovenant.android.startKovenant
import nl.komponents.kovenant.android.stopKovenant
import nl.komponents.kovenant.task
import okhttp3.Dns
import org.apache.commons.lang3.concurrent.ConcurrentUtils
import org.mariotaku.commons.logansquare.LoganSquareMapperFinder
import org.mariotaku.kpreferences.KPreferences
import org.mariotaku.kpreferences.get
import org.mariotaku.kpreferences.set
@ -61,6 +63,8 @@ import org.mariotaku.twidere.util.premium.ExtraFeaturesService
import org.mariotaku.twidere.util.refresh.AutoRefreshController
import org.mariotaku.twidere.util.sync.SyncController
import java.util.*
import java.util.concurrent.Callable
import java.util.concurrent.Future
import java.util.concurrent.TimeUnit
import javax.inject.Inject
@ -119,6 +123,11 @@ class TwidereApplication : Application(), Constants, OnSharedPreferenceChangeLis
StrictModeUtils.detectAllVmPolicy()
}
super.onCreate()
LoganSquareMapperFinder.setDefaultExecutor(object : LoganSquareMapperFinder.FutureExecutor {
override fun <T> submit(callable: Callable<T>): Future<T> {
return ConcurrentUtils.constantFuture(callable.call())
}
})
applyLanguageSettings()
startKovenant()
initializeAsyncTask()

View File

@ -95,6 +95,8 @@ abstract class AbsActivitiesFragment protected constructor() :
}
}
protected open val loaderId: Int
get() = tabId.toInt().coerceIn(0..Int.MAX_VALUE)
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
@ -108,7 +110,7 @@ abstract class AbsActivitiesFragment protected constructor() :
val loaderArgs = Bundle(arguments)
loaderArgs.putBoolean(EXTRA_FROM_USER, true)
loaderManager.initLoader(0, loaderArgs, this)
loaderManager.initLoader(loaderId, loaderArgs, this)
showProgress()
}

View File

@ -60,12 +60,15 @@ abstract class AbsMediaStatusesFragment : AbsContentRecyclerViewFragment<Stagger
override final val reachingStart: Boolean
get() = layoutManager.reachingStart
protected open val loaderId: Int
get() = tabId.toInt().coerceIn(0..Int.MAX_VALUE)
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
adapter.statusClickListener = this
val loaderArgs = Bundle(arguments)
loaderArgs.putBoolean(EXTRA_FROM_USER, true)
loaderManager.initLoader(0, loaderArgs, this)
loaderManager.initLoader(loaderId, loaderArgs, this)
showProgress()
}

View File

@ -130,6 +130,9 @@ abstract class AbsStatusesFragment : AbsContentListRecyclerViewFragment<Parcelab
protected open val timelineFilter: TimelineFilter? = null
protected open val loaderId: Int
get() = tabId.toInt().coerceIn(0..Int.MAX_VALUE)
// Fragment life cycles
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
@ -449,7 +452,7 @@ abstract class AbsStatusesFragment : AbsContentListRecyclerViewFragment<Parcelab
if (isDetached || host == null || loaderInitialized) return
val loaderArgs = Bundle(arguments)
loaderArgs.putBoolean(EXTRA_FROM_USER, true)
loaderManager.initLoader(0, loaderArgs, this)
loaderManager.initLoader(loaderId, loaderArgs, this)
loaderInitialized = true
}

View File

@ -334,6 +334,7 @@ class AccountsDashboardFragment : BaseFragment(), LoaderCallbacks<AccountsInfo>,
val account = accountsAdapter.selectedAccount ?: return
var hasDmTab = false
var hasInteractionsTab = false
var hasPublicTimelineTab = false
for (tab in tabs) {
when (tab.type) {
CustomTabType.DIRECT_MESSAGES -> {
@ -346,6 +347,11 @@ class AccountsDashboardFragment : BaseFragment(), LoaderCallbacks<AccountsInfo>,
hasInteractionsTab = hasAccountInTab(tab, account.key, account.activated)
}
}
CustomTabType.PUBLIC_TIMELINE -> {
if (!hasPublicTimelineTab) {
hasPublicTimelineTab = hasAccountInTab(tab, account.key, true)
}
}
}
}
val menu = navigationView.menu
@ -372,9 +378,10 @@ class AccountsDashboardFragment : BaseFragment(), LoaderCallbacks<AccountsInfo>,
}
AccountType.STATUSNET -> {
hasGroups = true
hasPublicTimeline = !hasPublicTimelineTab
}
AccountType.FANFOU -> {
hasPublicTimeline = true
hasPublicTimeline = !hasPublicTimelineTab
}
}
menu.setItemAvailability(R.id.groups, hasGroups)

View File

@ -239,7 +239,7 @@ abstract class CursorActivitiesFragment : AbsActivitiesFragment() {
args.putAll(fragmentArgs)
args.putBoolean(EXTRA_FROM_USER, true)
}
loaderManager.restartLoader(0, args, this)
loaderManager.restartLoader(loaderId, args, this)
}
private fun showContentOrError() {

View File

@ -161,7 +161,7 @@ abstract class CursorStatusesFragment : AbsStatusesFragment() {
args.putAll(fragmentArgs)
args.putBoolean(EXTRA_FROM_USER, true)
}
loaderManager.restartLoader(0, args, this)
loaderManager.restartLoader(loaderId, args, this)
}
override fun hasMoreData(data: List<ParcelableStatus>?): Boolean {

View File

@ -68,7 +68,6 @@ import org.mariotaku.twidere.model.tab.iface.AccountCallback
import org.mariotaku.twidere.model.util.AccountUtils
import org.mariotaku.twidere.provider.TwidereDataStore.Tabs
import org.mariotaku.twidere.util.CustomTabUtils
import org.mariotaku.twidere.util.DataStoreUtils
import org.mariotaku.twidere.util.ThemeUtils
import org.mariotaku.twidere.view.holder.TwoLineWithIconViewHolder
import java.lang.ref.WeakReference
@ -136,7 +135,7 @@ class CustomTabsFragment : BaseFragment(), LoaderCallbacks<Cursor?>, MultiChoice
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
inflater.inflate(R.menu.menu_custom_tabs, menu)
val context = this.context
val accountKeys = DataStoreUtils.getAccountKeys(context)
val accounts = AccountUtils.getAllAccountDetails(AccountManager.get(context), false)
val itemAdd = menu.findItem(R.id.add_submenu)
val theme = Chameleon.getOverrideTheme(context, context)
if (itemAdd != null && itemAdd.hasSubMenu()) {
@ -145,7 +144,7 @@ class CustomTabsFragment : BaseFragment(), LoaderCallbacks<Cursor?>, MultiChoice
for ((type, conf) in TabConfiguration.all()) {
val accountRequired = TabConfiguration.FLAG_ACCOUNT_REQUIRED in conf.accountFlags
val subItem = subMenu.add(0, 0, conf.sortPosition, conf.name.createString(context))
val disabledByNoAccount = accountRequired && accountKeys.isEmpty()
val disabledByNoAccount = accountRequired && accounts.none(conf::checkAccountAvailability)
val disabledByDuplicateTab = conf.isSingleTab && CustomTabUtils.isTabAdded(context, type)
val shouldDisable = disabledByDuplicateTab || disabledByNoAccount
subItem.isVisible = !shouldDisable
@ -297,7 +296,7 @@ class CustomTabsFragment : BaseFragment(), LoaderCallbacks<Cursor?>, MultiChoice
if (officialKeyOnly && !it.isOfficial(context)) {
return@filter false
}
return@filter true
return@filter conf.checkAccountAvailability(it)
})
accountsAdapter.setDummyItemText(R.string.activated_accounts)

View File

@ -54,7 +54,7 @@ class MediaStatusesSearchFragment : AbsMediaStatusesFragment() {
args.putString(EXTRA_MAX_ID, maxId)
args.putString(EXTRA_SINCE_ID, sinceId)
args.putBoolean(EXTRA_FROM_USER, true)
loaderManager.restartLoader(0, args, this)
loaderManager.restartLoader(loaderId, args, this)
return 0
}

View File

@ -104,7 +104,7 @@ abstract class ParcelableStatusesFragment : AbsStatusesFragment() {
args.putInt(EXTRA_PAGE, param.page)
}
}
loaderManager.restartLoader(0, args, this)
loaderManager.restartLoader(loaderId, args, this)
return true
}

View File

@ -33,8 +33,7 @@ import java.util.*
*/
class PublicTimelineFragment : ParcelableStatusesFragment() {
override fun onCreateStatusesLoader(context: Context,
args: Bundle,
override fun onCreateStatusesLoader(context: Context, args: Bundle,
fromUser: Boolean): Loader<List<ParcelableStatus>?> {
refreshing = true
val data = adapterData
@ -49,7 +48,7 @@ class PublicTimelineFragment : ParcelableStatusesFragment() {
override val savedStatusesFileArgs: Array<String>?
get() {
val accountKey = Utils.getAccountKey(context, arguments!!)!!
val accountKey = Utils.getAccountKey(context, arguments)
val result = ArrayList<String>()
result.add(AUTHORITY_PUBLIC_TIMELINE)
result.add("account=$accountKey")
@ -62,7 +61,7 @@ class PublicTimelineFragment : ParcelableStatusesFragment() {
override val readPositionTagWithArguments: String?
get() {
val tabPosition = arguments!!.getInt(EXTRA_TAB_POSITION, -1)
val tabPosition = arguments.getInt(EXTRA_TAB_POSITION, -1)
if (tabPosition < 0) return null
return "public_timeline"
}

View File

@ -34,7 +34,7 @@ class UserMediaTimelineFragment : AbsMediaStatusesFragment() {
args.putString(EXTRA_MAX_ID, maxId)
args.putString(EXTRA_SINCE_ID, sinceId)
args.putBoolean(EXTRA_FROM_USER, true)
loaderManager.restartLoader(0, args, this)
loaderManager.restartLoader(loaderId, args, this)
return 0
}

View File

@ -75,11 +75,14 @@ class MessagesEntriesFragment : AbsContentListRecyclerViewFragment<MessagesEntri
private val errorInfoKey: String = ErrorInfoStore.KEY_DIRECT_MESSAGES
private val loaderId: Int
get() = tabId.toInt().coerceIn(0..Int.MAX_VALUE)
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
adapter.listener = this
adapter.loadMoreSupportedPosition = ILoadMoreSupportAdapter.END
loaderManager.initLoader(0, null, this)
loaderManager.initLoader(loaderId, null, this)
registerForContextMenu(recyclerView)
}

View File

@ -59,7 +59,7 @@ class JobTaskService : JobService() {
}
override fun onStartJob(params: JobParameters): Boolean {
Log.d(LOGTAG, "LegacyTaskService received job $params")
Log.d(LOGTAG, "JobTaskService received job $params")
if (kPreferences[autoRefreshCompatibilityModeKey]) return false
val action = getTaskAction(params.jobId) ?: return false
return taskServiceRunner.runTask(action) {

View File

@ -763,7 +763,7 @@ Convertilu a un tuit normal amiesta una caráuter estra.</string>
<string name="proxy_summary">Usa\'l proxy pa toles solicitúes de rede.</string>
<string name="proxy_type">Triba de proxy</string>
<string name="proxy_username">Nome d\'usuariu de Proxy</string>
<string name="public_timeline">Llinia temporal pública</string>
<string name="title_public_timeline">Llinia temporal pública</string>
<string name="query">Consulta</string>
<string name="quick_send">Primir «Enter» pa unviar</string>
<string name="quick_send_summary">Únviase\'l tuit al primir «Enter».</string>

View File

@ -525,7 +525,7 @@
<string name="proxy_summary">Utilitza el proxy per a totes les solicituds de xarxa.</string>
<string name="proxy_type">Tipus de servidor intermediari</string>
<string name="proxy_username">Nom d\'usuari del servidor intermediari</string>
<string name="public_timeline">Cronologia pública</string>
<string name="title_public_timeline">Cronologia pública</string>
<string name="query">Consulta</string>
<string name="quick_send">Premeu «Retorn» per enviar</string>
<string name="quick_send_summary">Envia la piulada quan es premi «Retorn».</string>

View File

@ -282,7 +282,7 @@
<string name="proxy_summary">Použít proxy server pro všechny síťové požadavky.</string>
<string name="proxy_type">Typ proxy serveru</string>
<string name="proxy_username">Uživatelské jméno serveru proxy</string>
<string name="public_timeline">Veřejná časová osa</string>
<string name="title_public_timeline">Veřejná časová osa</string>
<string name="quick_send">Stisknout \"Enter\" pro odeslání</string>
<string name="quote_format">Formát poznámky</string>
<string name="quote_format_summary">\"[TEXT]\" = Text tweetu\n\"[NAME]\" = Jméno uživatele</string>

View File

@ -768,7 +768,7 @@
<string name="proxy_summary">Proxy für alle Netzwerkanfragen verwenden.</string>
<string name="proxy_type">Art des Proxys</string>
<string name="proxy_username">Proxy Benutzername</string>
<string name="public_timeline">Öffentliche Zeitleiste</string>
<string name="title_public_timeline">Öffentliche Zeitleiste</string>
<string name="query">Abfrage</string>
<string name="quick_send">\"Enter\" zum Abschicken antippen</string>
<string name="quick_send_summary">Tweet mit \"Enter\" abschicken.</string>

View File

@ -767,7 +767,7 @@
<string name="proxy_summary">Usar proxy para todas las solicitudes de red.</string>
<string name="proxy_type">Tipo de proxy</string>
<string name="proxy_username">Nombre de usuario</string>
<string name="public_timeline">Línea de tiempo pública</string>
<string name="title_public_timeline">Línea de tiempo pública</string>
<string name="query">Consulta</string>
<string name="quick_send">Pulsa «Intro» para enviar</string>
<string name="quick_send_summary">Enviar el tweet al pulsar \"Intro\".</string>

View File

@ -660,7 +660,7 @@
<string name="proxy_summary">استفاده از پیشکار برای تمام درخواست‌های شبکه.</string>
<string name="proxy_type">گونهٔ پیشکار</string>
<string name="proxy_username">نام کاربری پیشکار</string>
<string name="public_timeline">خط زمانی عمومی</string>
<string name="title_public_timeline">خط زمانی عمومی</string>
<string name="query">پرسش</string>
<string name="quick_send">فشردن «ورود» برای ارسال</string>
<string name="quick_send_summary">هنگان زدن کلید «ورود»، توییت را ارسال می‌کند.</string>

View File

@ -517,7 +517,7 @@
<string name="proxy_summary">Käytä välityspalvelinta kaikissa verkkoyhteyksissä.</string>
<string name="proxy_type">Välityspalvelimen tyyppi</string>
<string name="proxy_username">Välityspalvelimen käyttäjätunnus</string>
<string name="public_timeline">Julkinen aikajana</string>
<string name="title_public_timeline">Julkinen aikajana</string>
<string name="query">Kysely</string>
<string name="quick_send">Lähetä painamalla \"Enter\"</string>
<string name="quick_send_summary">Lähetä twiitti, kun painetaan \"Enter\".</string>

View File

@ -764,7 +764,7 @@
<string name="proxy_summary">Utiliser le proxy pour toutes les requêtes réseau.</string>
<string name="proxy_type">Type de proxy</string>
<string name="proxy_username">Nom d\'utilisateur pour le proxy</string>
<string name="public_timeline">Fil d\'actualités public</string>
<string name="title_public_timeline">Fil d\'actualités public</string>
<string name="query">Requête</string>
<string name="quick_send">Appuyez « Entrée » pour envoyer</string>
<string name="quick_send_summary">Envoyer le tweet lorsqu\'on appuye sur « Entrée ».</string>

View File

@ -775,7 +775,7 @@
<string name="proxy_summary">Usar proxy para todas as peticións de rede.</string>
<string name="proxy_type">Tipo de proxy</string>
<string name="proxy_username">Nome de usuario do proxy</string>
<string name="public_timeline">Liña de tempo pública</string>
<string name="title_public_timeline">Liña de tempo pública</string>
<string name="query">Consulta</string>
<string name="quick_send">Premer \"Enter\" para enviar</string>
<string name="quick_send_summary">Enviar chío cando se preme o \"Enter\".</string>

View File

@ -532,7 +532,7 @@
<string name="proxy_summary">Proxy használata minden hálózati eléréshez.</string>
<string name="proxy_type">Proxy típusa</string>
<string name="proxy_username">Proxy felhasználó név</string>
<string name="public_timeline">Nyilvános idővonal</string>
<string name="title_public_timeline">Nyilvános idővonal</string>
<string name="query">Lekérdezés</string>
<string name="quick_send">Nyomj \"Enter\"-t az elküldéshez</string>
<string name="quick_send_summary">Tweet elküldése, ha \"Enter\"-t nyomsz.</string>

View File

@ -588,7 +588,7 @@
<string name="proxy_summary">Gunakan proxy untuk semua permintaan jaringan.</string>
<string name="proxy_type">Tipe proxy</string>
<string name="proxy_username">Nama pengguna proxy</string>
<string name="public_timeline">Linimasa publik</string>
<string name="title_public_timeline">Linimasa publik</string>
<string name="query">Menanyakan</string>
<string name="quick_send">Tekan \"Enter\" untuk Mengirim</string>
<string name="quick_send_summary">Kirim tweet saat menekan \"Enter\".</string>

View File

@ -514,7 +514,7 @@
<string name="proxy_summary">Usa un proxy per tutte le connessioni di rete.</string>
<string name="proxy_type">Tipo di proxy</string>
<string name="proxy_username">Proxy username</string>
<string name="public_timeline">Timeline pubblica</string>
<string name="title_public_timeline">Timeline pubblica</string>
<string name="query">Interroga</string>
<string name="quick_send">Premi \"Invio\" per inviare</string>
<string name="quick_send_summary">Inviare tweet alla pressione di \"Invio\".</string>

View File

@ -781,7 +781,7 @@
<string name="proxy_summary">すべてのネットワーク要件においてプロキシを使用します。</string>
<string name="proxy_type">プロキシの種類</string>
<string name="proxy_username">プロキシのユーザー名</string>
<string name="public_timeline">公開タイムライン</string>
<string name="title_public_timeline">公開タイムライン</string>
<string name="query">クエリ</string>
<string name="quick_send">エンターキーで送信</string>
<string name="quick_send_summary">エンターキーを押すと送信します。</string>

View File

@ -685,7 +685,7 @@
<string name="proxy_summary">모든 네트워크 요청에 프록시를 사용합니다.</string>
<string name="proxy_type">프록시 유형</string>
<string name="proxy_username">프록시 사용자 이름</string>
<string name="public_timeline">공개 타임라인</string>
<string name="title_public_timeline">공개 타임라인</string>
<string name="query">쿼리</string>
<string name="quick_send">\"Enter\" 키를 눌러 보내기</string>
<string name="quick_send_summary">\"Enter\" 키를 눌러 트윗을 보내세요.</string>

View File

@ -532,7 +532,7 @@
<string name="proxy_summary">Gebruik proxy voor alle netwerkverkeer.</string>
<string name="proxy_type">Proxy-type</string>
<string name="proxy_username">Proxy gebruikersnaam</string>
<string name="public_timeline">Publieke tijdlijn</string>
<string name="title_public_timeline">Publieke tijdlijn</string>
<string name="query">Vraag</string>
<string name="quick_send">Druk op \"Enter\" om te versturen</string>
<string name="quick_send_summary">Verstuur tweet met \"Enter\".</string>

View File

@ -529,7 +529,7 @@
<string name="proxy_summary">Użyj serwera pośredniczącego do wszystkich żądań.</string>
<string name="proxy_type">Typ serwera pośredniczącego</string>
<string name="proxy_username">Nazwa użytkownika</string>
<string name="public_timeline">Publiczna oś czasu</string>
<string name="title_public_timeline">Publiczna oś czasu</string>
<string name="query">Zapytanie</string>
<string name="quick_send">\"Enter\" wysyła</string>
<string name="quick_send_summary">Wyślij tweeta wciskając \"Enter\".</string>

View File

@ -571,7 +571,7 @@
<string name="proxy_summary">Usar proxy para todas as requisições de rede.</string>
<string name="proxy_type">Tipo de proxy</string>
<string name="proxy_username">Nome de usuário do proxy</string>
<string name="public_timeline">Timeline pública</string>
<string name="title_public_timeline">Timeline pública</string>
<string name="query">Pesquisar</string>
<string name="quick_send">Apertar Enter para Enviar</string>
<string name="quick_send_summary">Enviar tweet ao apertar \"Enter\".</string>

View File

@ -602,7 +602,7 @@
<string name="proxy_summary">Проксировать все сетевые запросы.</string>
<string name="proxy_type">Тип прокси</string>
<string name="proxy_username">Логин прокси</string>
<string name="public_timeline">Публичная лента</string>
<string name="title_public_timeline">Публичная лента</string>
<string name="query">Запрос</string>
<string name="quick_send">Нажмите «Enter» для отправки</string>
<string name="quick_send_summary">Отправлять твит по нажатию «Enter».</string>

View File

@ -774,7 +774,7 @@
<string name="proxy_summary">ใช้ Proxy กับทุกการเชื่อมต่อ</string>
<string name="proxy_type">รูปแบบ Proxy</string>
<string name="proxy_username">Proxy username</string>
<string name="public_timeline">หน้าหลักสาธารณะ</string>
<string name="title_public_timeline">หน้าหลักสาธารณะ</string>
<string name="query">สอบถาม</string>
<string name="quick_send">ใช้ปุ่ม Enter เพื่อส่งทวีต</string>
<string name="quick_send_summary">ส่งทวีตเมื่อกด Enter</string>

View File

@ -533,7 +533,7 @@
<string name="proxy_summary">Tüm ağ istekleri için proxy kullanır.</string>
<string name="proxy_type">Proxy türü</string>
<string name="proxy_username">Proxy kullanıcı adı</string>
<string name="public_timeline">Genel zaman çizelgesi</string>
<string name="title_public_timeline">Genel zaman çizelgesi</string>
<string name="query">Sorgu</string>
<string name="quick_send">Göndermek İçin \"Enter\"a Basın</string>
<string name="quick_send_summary">\"Enter\"a basıldığında tweet\'i gönder.</string>

View File

@ -534,7 +534,7 @@
<string name="proxy_summary">Використовувати Http проксі для всіх мережевих запитів.</string>
<string name="proxy_type">Тип проксі</string>
<string name="proxy_username">Ім\'я користувача проксі</string>
<string name="public_timeline">Публічна стрічка</string>
<string name="title_public_timeline">Публічна стрічка</string>
<string name="query">Запит</string>
<string name="quick_send">Натисніть Enter для надсилання</string>
<string name="quick_send_summary">Надсилати твіт натисканням Enter.</string>

View File

@ -775,7 +775,7 @@
<string name="proxy_summary">为所有网络请求使用代理</string>
<string name="proxy_type">代理服务器类型</string>
<string name="proxy_username">代理服务器用户名</string>
<string name="public_timeline">公共时间线</string>
<string name="title_public_timeline">公共时间线</string>
<string name="query">查询</string>
<string name="quick_send">按“回车”发送</string>
<string name="quick_send_summary">按“回车”发送推文</string>

View File

@ -778,7 +778,7 @@
<string name="proxy_summary">為所有網絡請求使用代理</string>
<string name="proxy_type">代理伺服器類型</string>
<string name="proxy_username">代理伺服器帳號</string>
<string name="public_timeline">公開時間軸</string>
<string name="title_public_timeline">公開時間軸</string>
<string name="query">查詢</string>
<string name="quick_send">按「輸入」發送</string>
<string name="quick_send_summary">按「輸入」發送推文</string>

View File

@ -778,7 +778,7 @@
<string name="proxy_summary">為所有網絡請求使用代理</string>
<string name="proxy_type">代理伺服器類型</string>
<string name="proxy_username">代理伺服器帳號</string>
<string name="public_timeline">公開時間軸</string>
<string name="title_public_timeline">公開時間軸</string>
<string name="query">查詢</string>
<string name="quick_send">按「輸入」發送</string>
<string name="quick_send_summary">按「輸入」發送推文</string>

View File

@ -36,7 +36,7 @@
<item
android:id="@id/public_timeline"
android:icon="@drawable/ic_action_quote"
android:title="@string/public_timeline"/>
android:title="@string/title_public_timeline"/>
</group>
<group
android:id="@+id/app_menu"

View File

@ -848,12 +848,12 @@
<string name="preference_summary_background_streaming">Press HOME instead of BACK to keep streaming open</string>
<string name="preference_summary_chrome_custom_tab">Open links with in-app browser (Powered by Chrome)</string>
<string name="preference_summary_database_item_limit">Upper limit of items stored in databases for each account, set to a smaller value to save space and increase loading speed.</string>
<string name="preference_summary_favorite_confirmation">Show confirmation before favoriting a tweet</string>
<string name="preference_summary_like_confirmation">Show confirmation before liking a tweet</string>
<string name="preference_summary_media_preload_non_metered_network">Preload media only on free networks like Wi-Fi</string>
<string name="preference_summary_streaming_non_metered_network">Streaming only on free networks like Wi-Fi</string>
<string name="preference_summary_streaming_power_saving">Streaming only when charging</string>
<string name="preference_summary_trends_location">Now you can set location separately in tab settings.</string>
<string name="preference_summary_favorite_confirmation">Show confirmation before favoriting a tweet</string>
<string name="preference_summary_like_confirmation">Show confirmation before liking a tweet</string>
<string name="preference_title_accounts">Accounts</string>
<string name="preference_title_advanced">Advanced</string>
<string name="preference_title_auto_refresh_compatibility_mode">Compatibility mode</string>
@ -934,8 +934,6 @@
<string name="proxy_type">Proxy type</string>
<string name="proxy_username">Proxy username</string>
<string name="public_timeline">Public timeline</string>
<string name="query">Query</string>
<string name="quick_send">Hit \"Enter\" to Send</string>
@ -1204,11 +1202,13 @@
<!-- [noun] Like, Formerly Twitter's favorite, in the plural -->
<string name="title_likes">Likes</string>
<string name="title_manage_filter_subscriptions">Filter subscriptions</string>
<string name="title_media_timeline">Media timeline</string>
<string name="title_mentions">Mentions</string>
<string name="title_message_conversation_info">Conversation info</string>
<string name="title_nicknames">Nicknames</string>
<string name="title_open_source_license">Open source license</string>
<string name="title_premium_features_name">Twidere ∞</string>
<string name="title_public_timeline">Public timeline</string>
<string name="title_quick_action">Quick action</string>
<string name="title_retweet_quote_confirm">Retweet to your followers?</string>
<string name="title_scheduled_statuses">Scheduled tweets</string>