separated tweets and tweets w/ replies
This commit is contained in:
parent
5d91cd05b3
commit
0cc43f5b9c
|
@ -60,8 +60,10 @@ install:
|
|||
- cat private/ssh_config >> ~/.ssh/config
|
||||
# Append known_hosts
|
||||
- cat private/ssh_known_hosts >> ~/.ssh/known_hosts
|
||||
# Checkout Google components
|
||||
# Clone Google components
|
||||
- ssh-agent bash -c "ssh-add private/ssh_id_rsa; git clone $COMPONENT_GOOGLE_REPO twidere/src/google" > /dev/null 2>&1
|
||||
# Force reset to required commit id
|
||||
- git -C twidere/src/google reset --hard `cat twidere/src/.google.commit-id` > /dev/null 2>&1
|
||||
# Dropbox accessToken for uploading logs
|
||||
- cat private/dropbox_uploader >> ~/.dropbox_uploader
|
||||
|
||||
|
|
|
@ -38,7 +38,7 @@ subprojects {
|
|||
MariotakuCommons: '0.9.11',
|
||||
RestFu : '0.9.43',
|
||||
ObjectCursor : '0.9.16',
|
||||
PlayServices : '10.2.0',
|
||||
PlayServices : '10.2.1',
|
||||
MapsUtils : '0.4.4',
|
||||
Crashlyrics : '2.6.7',
|
||||
FabricPlugin : '1.22.1',
|
||||
|
|
|
@ -26,6 +26,7 @@ import org.mariotaku.microblog.library.MicroBlogException;
|
|||
import org.mariotaku.microblog.library.twitter.model.Paging;
|
||||
import org.mariotaku.microblog.library.twitter.model.ResponseList;
|
||||
import org.mariotaku.microblog.library.twitter.model.Status;
|
||||
import org.mariotaku.microblog.library.twitter.model.TimelineOption;
|
||||
import org.mariotaku.microblog.library.twitter.template.StatusAnnotationTemplate;
|
||||
import org.mariotaku.restfu.annotation.method.GET;
|
||||
import org.mariotaku.restfu.annotation.param.Queries;
|
||||
|
@ -47,11 +48,14 @@ public interface TimelineResources {
|
|||
ResponseList<Status> getRetweetsOfMe(@Query Paging paging) throws MicroBlogException;
|
||||
|
||||
@GET("/statuses/user_timeline.json")
|
||||
ResponseList<Status> getUserTimeline(@Query("user_id") String userId, @Query Paging paging) throws MicroBlogException;
|
||||
ResponseList<Status> getUserTimeline(@Query("user_id") String userId, @Query Paging paging,
|
||||
@Query TimelineOption option) throws MicroBlogException;
|
||||
|
||||
@GET("/statuses/user_timeline.json")
|
||||
ResponseList<Status> getUserTimeline(@Query Paging paging) throws MicroBlogException;
|
||||
ResponseList<Status> getUserTimeline(@Query Paging paging, @Query TimelineOption option)
|
||||
throws MicroBlogException;
|
||||
|
||||
@GET("/statuses/user_timeline.json")
|
||||
ResponseList<Status> getUserTimelineByScreenName(@Query("screen_name") String screenName, @Query Paging paging) throws MicroBlogException;
|
||||
ResponseList<Status> getUserTimelineByScreenName(@Query("screen_name") String screenName,
|
||||
@Query Paging paging, @Query TimelineOption option) throws MicroBlogException;
|
||||
}
|
||||
|
|
|
@ -0,0 +1,38 @@
|
|||
/*
|
||||
* Twidere - Twitter client for Android
|
||||
*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package org.mariotaku.microblog.library.twitter.model;
|
||||
|
||||
import org.mariotaku.restfu.http.SimpleValueMap;
|
||||
|
||||
/**
|
||||
* Created by mariotaku on 2017/3/27.
|
||||
*/
|
||||
|
||||
public class TimelineOption extends SimpleValueMap {
|
||||
public void setExcludeReplies(boolean excludeReplies) {
|
||||
put("exclude_replies", excludeReplies);
|
||||
}
|
||||
|
||||
public void setIncludeRetweets(boolean includeRetweets) {
|
||||
put("include_rts", includeRetweets);
|
||||
}
|
||||
}
|
|
@ -94,6 +94,7 @@ public interface IntentConstants {
|
|||
String EXTRA_SINCE_SORT_ID = "since_sort_id";
|
||||
String EXTRA_STATUS_ID = "status_id";
|
||||
String EXTRA_SCREEN_NAME = "screen_name";
|
||||
String EXTRA_EXCLUDE_REPLIES = "exclude_replies";
|
||||
String EXTRA_SCREEN_NAMES = "screen_names";
|
||||
String EXTRA_LIST_NAME = "list_name";
|
||||
String EXTRA_GROUP_NAME = "group_name";
|
||||
|
|
|
@ -198,7 +198,7 @@ dependencies {
|
|||
|
||||
task svgToDrawable(type: SvgDrawableTask) {
|
||||
// specify where to pick SVG from
|
||||
from = files('src/main/svg/drawable')
|
||||
from = files(android.sourceSets.collect { "src/${it.name}/svg/drawable" })
|
||||
// specify the android res folder
|
||||
to = file('src/main/res-svg2png')
|
||||
// override files only if necessary
|
||||
|
@ -215,7 +215,7 @@ task svgToDrawable(type: SvgDrawableTask) {
|
|||
|
||||
task svgToMipmap(type: SvgDrawableTask) {
|
||||
// specify where to pick SVG from
|
||||
from = files('src/main/svg/mipmap')
|
||||
from = files(android.sourceSets.collect { "src/${it.name}/svg/mipmap" })
|
||||
// specify the android res folder
|
||||
to = file('src/main/res-svg2png')
|
||||
// override files only if necessary
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
c0f1eb42515bb3fdf53ff429103f8806bbe97830
|
|
@ -95,13 +95,14 @@ public class TwitterWrapper implements Constants {
|
|||
return user;
|
||||
}
|
||||
if (id != null) {
|
||||
final ResponseList<Status> timeline = twitter.getUserTimeline(id, paging);
|
||||
final ResponseList<Status> timeline = twitter.getUserTimeline(id, paging, null);
|
||||
for (final Status status : timeline) {
|
||||
final User user = status.getUser();
|
||||
if (TextUtils.equals(user.getId(), id)) return user;
|
||||
}
|
||||
} else {
|
||||
final ResponseList<Status> timeline = twitter.getUserTimelineByScreenName(screenName, paging);
|
||||
final ResponseList<Status> timeline = twitter.getUserTimelineByScreenName(screenName,
|
||||
paging, null);
|
||||
for (final Status status : timeline) {
|
||||
final User user = status.getUser();
|
||||
if (searchScreenName.equalsIgnoreCase(user.getScreenName()))
|
||||
|
|
|
@ -0,0 +1,29 @@
|
|||
/*
|
||||
* 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.ktextension
|
||||
|
||||
import android.support.v4.app.DialogFragment
|
||||
import android.support.v4.app.FragmentManager
|
||||
|
||||
fun FragmentManager.dismissDialogFragment(tag: String): Boolean {
|
||||
val f = findFragmentByTag(tag) as? DialogFragment ?: return false
|
||||
f.dismiss()
|
||||
return true
|
||||
}
|
|
@ -6,6 +6,7 @@ import android.os.AsyncTask
|
|||
import android.os.Bundle
|
||||
import android.support.v4.app.DialogFragment
|
||||
import android.util.Log
|
||||
import org.mariotaku.ktextension.dismissDialogFragment
|
||||
import org.mariotaku.twidere.Constants.*
|
||||
import org.mariotaku.twidere.R
|
||||
import org.mariotaku.twidere.constant.IntentConstants
|
||||
|
@ -105,11 +106,8 @@ class DataExportActivity : BaseActivity(), DataExportImportTypeSelectorDialogFra
|
|||
}
|
||||
|
||||
override fun onPostExecute(result: Boolean?) {
|
||||
activity.executeAfterFragmentResumed {
|
||||
val activity = it as DataExportActivity
|
||||
val fm = activity.supportFragmentManager
|
||||
val f = fm.findFragmentByTag(FRAGMENT_TAG) as? DialogFragment
|
||||
f?.dismiss()
|
||||
activity.executeAfterFragmentResumed { activity ->
|
||||
activity.supportFragmentManager.dismissDialogFragment(FRAGMENT_TAG)
|
||||
}
|
||||
if (result != null && result) {
|
||||
activity.setResult(Activity.RESULT_OK)
|
||||
|
|
|
@ -5,6 +5,7 @@ import android.os.AsyncTask
|
|||
import android.os.Bundle
|
||||
import android.support.v4.app.DialogFragment
|
||||
import android.util.Log
|
||||
import org.mariotaku.ktextension.dismissDialogFragment
|
||||
import org.mariotaku.twidere.R
|
||||
import org.mariotaku.twidere.TwidereConstants.*
|
||||
import org.mariotaku.twidere.fragment.DataExportImportTypeSelectorDialogFragment
|
||||
|
@ -107,11 +108,8 @@ class DataImportActivity : BaseActivity(), DataExportImportTypeSelectorDialogFra
|
|||
}
|
||||
|
||||
override fun onPostExecute(result: Boolean?) {
|
||||
activity.executeAfterFragmentResumed {
|
||||
val activity = it as DataImportActivity
|
||||
val fm = activity.supportFragmentManager
|
||||
val f = fm.findFragmentByTag(FRAGMENT_TAG) as? DialogFragment
|
||||
f?.dismiss()
|
||||
activity.executeAfterFragmentResumed { activity ->
|
||||
activity.supportFragmentManager.dismissDialogFragment(FRAGMENT_TAG)
|
||||
}
|
||||
if (result != null && result) {
|
||||
activity.setResult(RESULT_OK)
|
||||
|
@ -148,11 +146,8 @@ class DataImportActivity : BaseActivity(), DataExportImportTypeSelectorDialogFra
|
|||
}
|
||||
|
||||
override fun onPostExecute(flags: Int?) {
|
||||
activity.executeAfterFragmentResumed {
|
||||
val activity = it as DataImportActivity
|
||||
val fm = activity.supportFragmentManager
|
||||
val f = fm.findFragmentByTag(FRAGMENT_TAG) as? DialogFragment
|
||||
f?.dismiss()
|
||||
activity.executeAfterFragmentResumed { activity ->
|
||||
activity.supportFragmentManager.dismissDialogFragment(FRAGMENT_TAG)
|
||||
}
|
||||
val df = DataExportImportTypeSelectorDialogFragment()
|
||||
val args = Bundle()
|
||||
|
|
|
@ -684,7 +684,7 @@ class HomeActivity : BaseActivity(), OnClickListener, OnPageChangeListener, Supp
|
|||
val accountKey = uri?.getQueryParameter(QUERY_PARAM_ACCOUNT_KEY)?.let(UserKey::valueOf)
|
||||
val adapter = pagerAdapter
|
||||
for (i in 0 until adapter.count) {
|
||||
val tab = adapter.getTab(i)
|
||||
val tab = adapter.get(i)
|
||||
if (tabType == Tab.getTypeAlias(tab.type)) {
|
||||
val args = tab.args
|
||||
if (args != null && CustomTabUtils.hasAccountId(this, args,
|
||||
|
@ -788,7 +788,7 @@ class HomeActivity : BaseActivity(), OnClickListener, OnPageChangeListener, Supp
|
|||
|
||||
private fun setupHomeTabs() {
|
||||
pagerAdapter.clear()
|
||||
pagerAdapter.addTabs(CustomTabUtils.getHomeTabs(this))
|
||||
pagerAdapter.addAll(CustomTabUtils.getHomeTabs(this))
|
||||
val hasNoTab = pagerAdapter.count == 0
|
||||
emptyTabHint.visibility = if (hasNoTab) View.VISIBLE else View.GONE
|
||||
mainPager.visibility = if (hasNoTab) View.GONE else View.VISIBLE
|
||||
|
|
|
@ -38,7 +38,7 @@ import org.mariotaku.twidere.view.iface.PagerIndicator.TabListener
|
|||
import org.mariotaku.twidere.view.iface.PagerIndicator.TabProvider
|
||||
import java.util.*
|
||||
|
||||
class SupportTabsAdapter @JvmOverloads constructor(
|
||||
class SupportTabsAdapter(
|
||||
private val context: Context,
|
||||
fm: FragmentManager,
|
||||
private val indicator: PagerIndicator? = null
|
||||
|
@ -47,35 +47,18 @@ class SupportTabsAdapter @JvmOverloads constructor(
|
|||
var hasMultipleColumns: Boolean = false
|
||||
var preferredColumnWidth: Float = 0f
|
||||
|
||||
private val tab = ArrayList<SupportTabSpec>()
|
||||
var tabs = ArrayList<SupportTabSpec>()
|
||||
set(value) {
|
||||
field = tabs
|
||||
notifyDataSetChanged()
|
||||
}
|
||||
|
||||
init {
|
||||
clear()
|
||||
}
|
||||
|
||||
fun addTab(cls: Class<out Fragment>, args: Bundle? = null, name: String,
|
||||
icon: DrawableHolder? = null, type: String? = null, position: Int = 0, tag: String? = null) {
|
||||
addTab(SupportTabSpec(name = name, icon = icon, cls = cls, args = args,
|
||||
position = position, type = type, tag = tag))
|
||||
}
|
||||
|
||||
fun addTab(spec: SupportTabSpec) {
|
||||
tab.add(spec)
|
||||
notifyDataSetChanged()
|
||||
}
|
||||
|
||||
fun addTabs(specs: Collection<SupportTabSpec>) {
|
||||
tab.addAll(specs)
|
||||
notifyDataSetChanged()
|
||||
}
|
||||
|
||||
fun clear() {
|
||||
tab.clear()
|
||||
notifyDataSetChanged()
|
||||
}
|
||||
|
||||
override fun getCount(): Int {
|
||||
return tab.size
|
||||
return this.tabs.size
|
||||
}
|
||||
|
||||
override fun getItemPosition(obj: Any?): Int {
|
||||
|
@ -90,7 +73,7 @@ class SupportTabsAdapter @JvmOverloads constructor(
|
|||
}
|
||||
|
||||
override fun getPageTitle(position: Int): CharSequence? {
|
||||
return tab[position].name
|
||||
return this.tabs[position].name
|
||||
}
|
||||
|
||||
override fun getPageWidth(position: Int): Float {
|
||||
|
@ -109,8 +92,8 @@ class SupportTabsAdapter @JvmOverloads constructor(
|
|||
}
|
||||
|
||||
override fun getItem(position: Int): Fragment {
|
||||
val fragment = Fragment.instantiate(context, tab[position].cls.name)
|
||||
fragment.arguments = getPageArguments(tab[position], position)
|
||||
val fragment = Fragment.instantiate(context, this.tabs[position].cls.name)
|
||||
fragment.arguments = getPageArguments(this.tabs[position], position)
|
||||
return fragment
|
||||
}
|
||||
|
||||
|
@ -119,16 +102,9 @@ class SupportTabsAdapter @JvmOverloads constructor(
|
|||
}
|
||||
|
||||
override fun getPageIcon(position: Int): Drawable {
|
||||
return getTabIconDrawable(context, tab[position].icon)
|
||||
return getTabIconDrawable(context, this.tabs[position].icon)
|
||||
}
|
||||
|
||||
fun getTab(position: Int): SupportTabSpec {
|
||||
return tab[position]
|
||||
}
|
||||
|
||||
val tabs: List<SupportTabSpec>
|
||||
get() = tab
|
||||
|
||||
override fun onPageReselected(position: Int) {
|
||||
if (context !is SupportFragmentCallback) return
|
||||
val f = context.currentVisibleFragment
|
||||
|
@ -151,8 +127,33 @@ class SupportTabsAdapter @JvmOverloads constructor(
|
|||
return false
|
||||
}
|
||||
|
||||
fun setTabLabel(position: Int, label: CharSequence) {
|
||||
tab.filter { position == it.position }.forEach { it.name = label }
|
||||
fun add(cls: Class<out Fragment>, args: Bundle? = null, name: String,
|
||||
icon: DrawableHolder? = null, type: String? = null, position: Int = 0, tag: String? = null) {
|
||||
add(SupportTabSpec(name = name, icon = icon, cls = cls, args = args,
|
||||
position = position, type = type, tag = tag))
|
||||
}
|
||||
|
||||
fun add(spec: SupportTabSpec) {
|
||||
this.tabs.add(spec)
|
||||
notifyDataSetChanged()
|
||||
}
|
||||
|
||||
fun addAll(specs: Collection<SupportTabSpec>) {
|
||||
this.tabs.addAll(specs)
|
||||
notifyDataSetChanged()
|
||||
}
|
||||
|
||||
fun get(position: Int): SupportTabSpec {
|
||||
return this.tabs[position]
|
||||
}
|
||||
|
||||
fun clear() {
|
||||
this.tabs.clear()
|
||||
notifyDataSetChanged()
|
||||
}
|
||||
|
||||
fun setLabel(position: Int, label: CharSequence) {
|
||||
this.tabs.filter { position == it.position }.forEach { it.name = label }
|
||||
notifyDataSetChanged()
|
||||
}
|
||||
|
||||
|
|
|
@ -37,7 +37,7 @@ abstract class AbsToolbarTabPagesFragment : BaseFragment(), RefreshScrollTopInte
|
|||
SupportFragmentCallback, IBaseFragment.SystemWindowsInsetsCallback, ControlBarOffsetListener,
|
||||
HideUiOnScroll, OnPageChangeListener, IToolBarSupportFragment, KeyboardShortcutCallback {
|
||||
|
||||
private lateinit var pagerAdapter: SupportTabsAdapter
|
||||
protected lateinit var pagerAdapter: SupportTabsAdapter
|
||||
override val toolbar: Toolbar
|
||||
get() = toolbarContainer.toolbar
|
||||
|
||||
|
@ -53,6 +53,8 @@ abstract class AbsToolbarTabPagesFragment : BaseFragment(), RefreshScrollTopInte
|
|||
|
||||
|
||||
addTabs(pagerAdapter)
|
||||
toolbarTabs.notifyDataSetChanged()
|
||||
|
||||
toolbarContainer.setOnSizeChangedListener { _, _, _, _, _ ->
|
||||
val pageLimit = viewPager.offscreenPageLimit
|
||||
val currentItem = viewPager.currentItem
|
||||
|
@ -71,7 +73,7 @@ abstract class AbsToolbarTabPagesFragment : BaseFragment(), RefreshScrollTopInte
|
|||
val initialTab = arguments?.getString(EXTRA_INITIAL_TAB)
|
||||
if (initialTab != null) {
|
||||
for (i in 0 until pagerAdapter.count) {
|
||||
if (initialTab == pagerAdapter.getTab(i).tag) {
|
||||
if (initialTab == pagerAdapter.get(i).tag) {
|
||||
viewPager.currentItem = i
|
||||
break
|
||||
}
|
||||
|
|
|
@ -30,8 +30,8 @@ class GroupFragment : AbsToolbarTabPagesFragment(), LoaderCallbacks<SingleRespon
|
|||
|
||||
override fun addTabs(adapter: SupportTabsAdapter) {
|
||||
val args = arguments
|
||||
adapter.addTab(cls = GroupTimelineFragment::class.java, args = args, name = getString(R.string.title_statuses), tag = "statuses")
|
||||
adapter.addTab(cls = GroupMembersFragment::class.java, args = args, name = getString(R.string.members), tag = "members")
|
||||
adapter.add(cls = GroupTimelineFragment::class.java, args = args, name = getString(R.string.title_statuses), tag = "statuses")
|
||||
adapter.add(cls = GroupMembersFragment::class.java, args = args, name = getString(R.string.members), tag = "members")
|
||||
}
|
||||
|
||||
override fun onActivityCreated(savedInstanceState: Bundle?) {
|
||||
|
|
|
@ -32,11 +32,11 @@ class ListsFragment : AbsToolbarTabPagesFragment() {
|
|||
}
|
||||
|
||||
override fun addTabs(adapter: SupportTabsAdapter) {
|
||||
adapter.addTab(cls = UserListsOwnershipsFragment::class.java, args = arguments,
|
||||
adapter.add(cls = UserListsOwnershipsFragment::class.java, args = arguments,
|
||||
name = getString(R.string.title_user_list_ownerships))
|
||||
adapter.addTab(cls = UserListSubscriptionsFragment::class.java, args = arguments,
|
||||
adapter.add(cls = UserListSubscriptionsFragment::class.java, args = arguments,
|
||||
name = getString(R.string.title_user_list_subscriptions))
|
||||
adapter.addTab(cls = UserListMembershipsFragment::class.java, args = arguments,
|
||||
adapter.add(cls = UserListMembershipsFragment::class.java, args = arguments,
|
||||
name = getString(R.string.title_user_list_memberships))
|
||||
}
|
||||
}
|
||||
|
|
|
@ -46,6 +46,7 @@ class ProgressDialogFragment : BaseDialogFragment() {
|
|||
f.show(fm, tag)
|
||||
return f
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -114,9 +114,9 @@ class SearchFragment : AbsToolbarTabPagesFragment(), RefreshScrollTopInterface,
|
|||
|
||||
|
||||
override fun addTabs(adapter: SupportTabsAdapter) {
|
||||
adapter.addTab(cls = StatusesSearchFragment::class.java, args = arguments,
|
||||
adapter.add(cls = StatusesSearchFragment::class.java, args = arguments,
|
||||
name = getString(R.string.search_type_statuses), icon = DrawableHolder.resource(R.drawable.ic_action_twitter))
|
||||
adapter.addTab(cls = SearchUsersFragment::class.java, args = arguments,
|
||||
adapter.add(cls = SearchUsersFragment::class.java, args = arguments,
|
||||
name = getString(R.string.search_type_users), icon = DrawableHolder.resource(R.drawable.ic_action_user))
|
||||
}
|
||||
|
||||
|
|
|
@ -119,7 +119,6 @@ import org.mariotaku.twidere.model.event.FriendshipTaskEvent
|
|||
import org.mariotaku.twidere.model.event.FriendshipUpdatedEvent
|
||||
import org.mariotaku.twidere.model.event.ProfileUpdatedEvent
|
||||
import org.mariotaku.twidere.model.event.TaskStateChangedEvent
|
||||
import org.mariotaku.twidere.model.tab.DrawableHolder
|
||||
import org.mariotaku.twidere.model.util.*
|
||||
import org.mariotaku.twidere.provider.TwidereDataStore.CachedRelationships
|
||||
import org.mariotaku.twidere.provider.TwidereDataStore.CachedUsers
|
||||
|
@ -373,10 +372,10 @@ class UserFragment : BaseFragment(), OnClickListener, OnLinkClickListener,
|
|||
actionBar.subtitle = null
|
||||
return
|
||||
}
|
||||
val spec = pagerAdapter.getTab(viewPager.currentItem)
|
||||
val spec = pagerAdapter.get(viewPager.currentItem)
|
||||
assert(spec.type != null)
|
||||
when (spec.type) {
|
||||
TAB_TYPE_STATUSES -> {
|
||||
TAB_TYPE_STATUSES, TAB_TYPE_STATUSES_WITH_REPLIES -> {
|
||||
actionBar.subtitle = resources.getQuantityString(R.plurals.N_statuses,
|
||||
user.statuses_count.toInt(), user.statuses_count)
|
||||
}
|
||||
|
@ -1415,16 +1414,24 @@ class UserFragment : BaseFragment(), OnClickListener, OnLinkClickListener,
|
|||
tabArgs.putParcelable(EXTRA_USER_KEY, args.getParcelable<Parcelable>(EXTRA_USER_KEY))
|
||||
tabArgs.putString(EXTRA_SCREEN_NAME, args.getString(EXTRA_SCREEN_NAME))
|
||||
}
|
||||
pagerAdapter.addTab(cls = UserTimelineFragment::class.java, args = tabArgs, name = getString(R.string.title_statuses),
|
||||
icon = DrawableHolder.resource(R.drawable.ic_action_quote), type = TAB_TYPE_STATUSES, position = TAB_POSITION_STATUSES)
|
||||
pagerAdapter.addTab(cls = UserMediaTimelineFragment::class.java, args = tabArgs, name = getString(R.string.media),
|
||||
icon = DrawableHolder.resource(R.drawable.ic_action_gallery), type = TAB_TYPE_MEDIA, position = TAB_POSITION_MEDIA)
|
||||
pagerAdapter.add(cls = UserTimelineFragment::class.java, args = Bundle(tabArgs).apply {
|
||||
putBoolean(EXTRA_EXCLUDE_REPLIES, true)
|
||||
}, name = getString(R.string.title_statuses), type = TAB_TYPE_STATUSES,
|
||||
position = TAB_POSITION_STATUSES)
|
||||
pagerAdapter.add(cls = UserTimelineFragment::class.java, args = tabArgs,
|
||||
name = getString(R.string.title_statuses_and_replies), type = TAB_TYPE_STATUSES_WITH_REPLIES,
|
||||
position = TAB_POSITION_STATUSES)
|
||||
pagerAdapter.add(cls = UserMediaTimelineFragment::class.java, args = tabArgs,
|
||||
name = getString(R.string.media), type = TAB_TYPE_MEDIA,
|
||||
position = TAB_POSITION_MEDIA)
|
||||
if (preferences.getBoolean(KEY_I_WANT_MY_STARS_BACK)) {
|
||||
pagerAdapter.addTab(cls = UserFavoritesFragment::class.java, args = tabArgs, name = getString(R.string.title_favorites),
|
||||
icon = DrawableHolder.resource(R.drawable.ic_action_star), type = TAB_TYPE_FAVORITES, position = TAB_POSITION_FAVORITES)
|
||||
pagerAdapter.add(cls = UserFavoritesFragment::class.java, args = tabArgs,
|
||||
name = getString(R.string.title_favorites), type = TAB_TYPE_FAVORITES,
|
||||
position = TAB_POSITION_FAVORITES)
|
||||
} else {
|
||||
pagerAdapter.addTab(cls = UserFavoritesFragment::class.java, args = tabArgs, name = getString(R.string.title_likes),
|
||||
icon = DrawableHolder.resource(R.drawable.ic_action_heart), type = TAB_TYPE_FAVORITES, position = TAB_POSITION_FAVORITES)
|
||||
pagerAdapter.add(cls = UserFavoritesFragment::class.java, args = tabArgs,
|
||||
name = getString(R.string.title_likes), type = TAB_TYPE_FAVORITES,
|
||||
position = TAB_POSITION_FAVORITES)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1736,6 +1743,7 @@ class UserFragment : BaseFragment(), OnClickListener, OnLinkClickListener,
|
|||
private val TAB_POSITION_MEDIA = 1
|
||||
private val TAB_POSITION_FAVORITES = 2
|
||||
private val TAB_TYPE_STATUSES = "statuses"
|
||||
private val TAB_TYPE_STATUSES_WITH_REPLIES = "statuses_with_replies"
|
||||
private val TAB_TYPE_MEDIA = "media"
|
||||
private val TAB_TYPE_FAVORITES = "favorites"
|
||||
}
|
||||
|
|
|
@ -153,9 +153,9 @@ class UserListFragment : AbsToolbarTabPagesFragment(), OnClickListener,
|
|||
tabArgs.putString(EXTRA_LIST_ID, args.getString(EXTRA_LIST_ID))
|
||||
tabArgs.putString(EXTRA_LIST_NAME, args.getString(EXTRA_LIST_NAME))
|
||||
}
|
||||
adapter.addTab(cls = UserListTimelineFragment::class.java, args = tabArgs, name = getString(R.string.title_statuses))
|
||||
adapter.addTab(cls = UserListMembersFragment::class.java, args = tabArgs, name = getString(R.string.members))
|
||||
adapter.addTab(cls = UserListSubscribersFragment::class.java, args = tabArgs, name = getString(R.string.subscribers))
|
||||
adapter.add(cls = UserListTimelineFragment::class.java, args = tabArgs, name = getString(R.string.title_statuses))
|
||||
adapter.add(cls = UserListMembersFragment::class.java, args = tabArgs, name = getString(R.string.members))
|
||||
adapter.add(cls = UserListSubscribersFragment::class.java, args = tabArgs, name = getString(R.string.subscribers))
|
||||
}
|
||||
|
||||
override fun onStart() {
|
||||
|
|
|
@ -42,7 +42,7 @@ import com.twitter.Validator
|
|||
import kotlinx.android.synthetic.main.fragment_user_profile_editor.*
|
||||
import org.mariotaku.abstask.library.AbstractTask
|
||||
import org.mariotaku.abstask.library.TaskStarter
|
||||
import org.mariotaku.kpreferences.get
|
||||
import org.mariotaku.ktextension.dismissDialogFragment
|
||||
import org.mariotaku.microblog.library.MicroBlog
|
||||
import org.mariotaku.microblog.library.MicroBlogException
|
||||
import org.mariotaku.microblog.library.twitter.model.ProfileUpdate
|
||||
|
@ -51,7 +51,6 @@ import org.mariotaku.twidere.R
|
|||
import org.mariotaku.twidere.TwidereConstants.*
|
||||
import org.mariotaku.twidere.activity.ColorPickerDialogActivity
|
||||
import org.mariotaku.twidere.activity.ThemedMediaPickerActivity
|
||||
import org.mariotaku.twidere.constant.profileImageStyleKey
|
||||
import org.mariotaku.twidere.extension.loadProfileBanner
|
||||
import org.mariotaku.twidere.extension.loadProfileImage
|
||||
import org.mariotaku.twidere.extension.model.newMicroBlogInstance
|
||||
|
@ -407,9 +406,9 @@ class UserProfileEditorFragment : BaseFragment(), OnSizeChangedListener, TextWat
|
|||
return false
|
||||
}
|
||||
|
||||
override fun afterExecute(handler: UserProfileEditorFragment?, result: SingleResponse<ParcelableUser>) {
|
||||
if (handler == null) return
|
||||
val activity = handler.activity ?: return
|
||||
override fun afterExecute(callback: UserProfileEditorFragment?, result: SingleResponse<ParcelableUser>) {
|
||||
if (callback == null) return
|
||||
val activity = callback.activity ?: return
|
||||
if (result.hasData()) {
|
||||
val account: AccountDetails? = result.extras.getParcelable(EXTRA_ACCOUNT)
|
||||
if (account != null) {
|
||||
|
@ -418,20 +417,16 @@ class UserProfileEditorFragment : BaseFragment(), OnSizeChangedListener, TextWat
|
|||
TaskStarter.execute(task)
|
||||
}
|
||||
}
|
||||
handler.executeAfterFragmentResumed { fragment ->
|
||||
val f = (fragment as UserProfileEditorFragment).fragmentManager.findFragmentByTag(DIALOG_FRAGMENT_TAG)
|
||||
if (f is DialogFragment) {
|
||||
f.dismissAllowingStateLoss()
|
||||
}
|
||||
f.activity.finish()
|
||||
callback.executeAfterFragmentResumed { fragment ->
|
||||
fragment.childFragmentManager.dismissDialogFragment(DIALOG_FRAGMENT_TAG)
|
||||
fragment.activity.finish()
|
||||
}
|
||||
}
|
||||
|
||||
override fun beforeExecute() {
|
||||
super.beforeExecute()
|
||||
callback?.executeAfterFragmentResumed { fragment ->
|
||||
val fm = (fragment as UserProfileEditorFragment).activity.supportFragmentManager
|
||||
val df = ProgressDialogFragment.show(fm, DIALOG_FRAGMENT_TAG)
|
||||
val df = ProgressDialogFragment.show(fragment.childFragmentManager, DIALOG_FRAGMENT_TAG)
|
||||
df.isCancelable = false
|
||||
}
|
||||
}
|
||||
|
@ -451,8 +446,8 @@ class UserProfileEditorFragment : BaseFragment(), OnSizeChangedListener, TextWat
|
|||
return TwitterWrapper.deleteProfileBannerImage(activity, accountKey)
|
||||
}
|
||||
|
||||
override fun afterExecute(handler: UserProfileEditorFragment?, result: SingleResponse<Boolean>) {
|
||||
super.afterExecute(handler, result)
|
||||
override fun afterExecute(callback: UserProfileEditorFragment?, result: SingleResponse<Boolean>) {
|
||||
super.afterExecute(callback, result)
|
||||
if (result.data != null) {
|
||||
getUserInfo()
|
||||
Toast.makeText(activity, R.string.message_toast_profile_banner_image_updated, Toast.LENGTH_SHORT).show()
|
||||
|
@ -473,8 +468,8 @@ class UserProfileEditorFragment : BaseFragment(), OnSizeChangedListener, TextWat
|
|||
private inner class UpdateProfileBannerImageTaskInternal(context: Context, accountKey: UserKey,
|
||||
imageUri: Uri, deleteImage: Boolean) : UpdateProfileBannerImageTask<UserProfileEditorFragment>(context, accountKey, imageUri, deleteImage) {
|
||||
|
||||
override fun afterExecute(handler: UserProfileEditorFragment?, result: SingleResponse<ParcelableUser>?) {
|
||||
super.afterExecute(handler, result)
|
||||
override fun afterExecute(callback: UserProfileEditorFragment?, result: SingleResponse<ParcelableUser>?) {
|
||||
super.afterExecute(callback, result)
|
||||
setUpdateState(false)
|
||||
getUserInfo()
|
||||
}
|
||||
|
@ -495,8 +490,8 @@ class UserProfileEditorFragment : BaseFragment(), OnSizeChangedListener, TextWat
|
|||
) : UpdateProfileBackgroundImageTask<UserProfileEditorFragment>(context, accountKey, imageUri,
|
||||
tile, deleteImage) {
|
||||
|
||||
override fun afterExecute(handler: UserProfileEditorFragment?, result: SingleResponse<ParcelableUser>) {
|
||||
super.afterExecute(handler, result)
|
||||
override fun afterExecute(callback: UserProfileEditorFragment?, result: SingleResponse<ParcelableUser>) {
|
||||
super.afterExecute(callback, result)
|
||||
setUpdateState(false)
|
||||
getUserInfo()
|
||||
}
|
||||
|
@ -515,8 +510,8 @@ class UserProfileEditorFragment : BaseFragment(), OnSizeChangedListener, TextWat
|
|||
deleteImage: Boolean
|
||||
) : UpdateProfileImageTask<UserProfileEditorFragment>(context, accountKey, imageUri, deleteImage) {
|
||||
|
||||
override fun afterExecute(handler: UserProfileEditorFragment?, result: SingleResponse<ParcelableUser>) {
|
||||
super.afterExecute(handler, result)
|
||||
override fun afterExecute(callback: UserProfileEditorFragment?, result: SingleResponse<ParcelableUser>) {
|
||||
super.afterExecute(callback, result)
|
||||
if (result.data != null) {
|
||||
displayUser(result.data)
|
||||
}
|
||||
|
|
|
@ -48,6 +48,7 @@ class UserTimelineFragment : ParcelableStatusesFragment() {
|
|||
val accountKey = Utils.getAccountKey(context, args)!!
|
||||
val userKey = args.getParcelable<UserKey>(EXTRA_USER_KEY)
|
||||
val screenName = args.getString(EXTRA_SCREEN_NAME)
|
||||
val excludeReplies = args.getBoolean(EXTRA_EXCLUDE_REPLIES)
|
||||
val result = ArrayList<String>()
|
||||
result.add(AUTHORITY_USER_TIMELINE)
|
||||
result.add("account=$accountKey")
|
||||
|
@ -58,6 +59,9 @@ class UserTimelineFragment : ParcelableStatusesFragment() {
|
|||
} else {
|
||||
return null
|
||||
}
|
||||
if (excludeReplies) {
|
||||
result.add("exclude_replies")
|
||||
}
|
||||
return result.toTypedArray()
|
||||
}
|
||||
|
||||
|
@ -91,9 +95,10 @@ class UserTimelineFragment : ParcelableStatusesFragment() {
|
|||
val screenName = args.getString(EXTRA_SCREEN_NAME)
|
||||
val tabPosition = args.getInt(EXTRA_TAB_POSITION, -1)
|
||||
val loadingMore = args.getBoolean(EXTRA_LOADING_MORE, false)
|
||||
val excludeReplies = args.getBoolean(EXTRA_EXCLUDE_REPLIES, false)
|
||||
val pinnedIds = if (adapter.hasPinnedStatuses) null else pinnedStatusIds
|
||||
return UserTimelineLoader(context, accountKey, userKey, screenName, sinceId, maxId, data,
|
||||
savedStatusesFileArgs, tabPosition, fromUser, loadingMore, pinnedIds)
|
||||
savedStatusesFileArgs, tabPosition, fromUser, loadingMore, pinnedIds, excludeReplies)
|
||||
}
|
||||
|
||||
override fun onStatusesLoaded(loader: Loader<List<ParcelableStatus>?>, data: List<ParcelableStatus>?) {
|
||||
|
|
|
@ -203,9 +203,7 @@ abstract class BaseFiltersImportFragment : AbsContentListRecyclerViewFragment<Se
|
|||
DataStoreUtils.addToFilter(context, selectedUsers, filterEverywhere)
|
||||
}.alwaysUi {
|
||||
executeAfterFragmentResumed(true) { fragment ->
|
||||
val fm = fragment.fragmentManager
|
||||
val df = fm.findFragmentByTag("import_progress") as? DialogFragment
|
||||
df?.dismiss()
|
||||
fragment.childFragmentManager.dismissDialogFragment("import_progress")
|
||||
}
|
||||
weakThis.get()?.adapter?.notifyDataSetChanged()
|
||||
}
|
||||
|
|
|
@ -32,11 +32,11 @@ class FiltersFragment : AbsToolbarTabPagesFragment() {
|
|||
}
|
||||
|
||||
override fun addTabs(adapter: SupportTabsAdapter) {
|
||||
adapter.addTab(cls = FilteredUsersFragment::class.java, name = getString(R.string.filter_type_users), tag = "users")
|
||||
adapter.addTab(cls = FilteredKeywordsFragment::class.java, name = getString(R.string.filter_type_keywords), tag = "keywords")
|
||||
adapter.addTab(cls = FilteredSourcesFragment::class.java, name = getString(R.string.filter_type_sources), tag = "sources")
|
||||
adapter.addTab(cls = FilteredLinksFragment::class.java, name = getString(R.string.filter_type_links), tag = "links")
|
||||
adapter.addTab(cls = FilterSettingsFragment::class.java, name = getString(R.string.settings), tag = "settings")
|
||||
adapter.add(cls = FilteredUsersFragment::class.java, name = getString(R.string.filter_type_users), tag = "users")
|
||||
adapter.add(cls = FilteredKeywordsFragment::class.java, name = getString(R.string.filter_type_keywords), tag = "keywords")
|
||||
adapter.add(cls = FilteredSourcesFragment::class.java, name = getString(R.string.filter_type_sources), tag = "sources")
|
||||
adapter.add(cls = FilteredLinksFragment::class.java, name = getString(R.string.filter_type_links), tag = "links")
|
||||
adapter.add(cls = FilterSettingsFragment::class.java, name = getString(R.string.settings), tag = "settings")
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -8,7 +8,6 @@ import android.content.DialogInterface
|
|||
import android.content.Intent
|
||||
import android.database.Cursor
|
||||
import android.os.Bundle
|
||||
import android.support.v4.app.DialogFragment
|
||||
import android.support.v4.app.LoaderManager
|
||||
import android.support.v4.content.CursorLoader
|
||||
import android.support.v4.content.Loader
|
||||
|
@ -138,8 +137,7 @@ class FiltersSubscriptionsFragment : BaseFragment(), LoaderManager.LoaderCallbac
|
|||
val fragmentRef = WeakReference(fragment)
|
||||
task.callback = {
|
||||
fragmentRef.get()?.executeAfterFragmentResumed { fragment ->
|
||||
val df = fragment.childFragmentManager.findFragmentByTag(FRAGMENT_TAG_RREFRESH_FILTERS) as? DialogFragment
|
||||
df?.dismiss()
|
||||
fragment.fragmentManager.dismissDialogFragment(FRAGMENT_TAG_RREFRESH_FILTERS)
|
||||
}
|
||||
}
|
||||
TaskStarter.execute(task)
|
||||
|
|
|
@ -32,6 +32,7 @@ import android.support.v4.app.DialogFragment
|
|||
import android.support.v4.app.FragmentActivity
|
||||
import android.support.v4.app.LoaderManager
|
||||
import android.support.v4.content.AsyncTaskLoader
|
||||
import android.support.v4.content.FixedAsyncTaskLoader
|
||||
import android.support.v4.content.Loader
|
||||
import android.support.v7.app.AlertDialog
|
||||
import android.support.v7.app.AppCompatActivity
|
||||
|
@ -473,7 +474,8 @@ class MessageConversationInfoFragment : BaseFragment(), IToolBarSupportFragment,
|
|||
internal class ConversationInfoLoader(
|
||||
context: Context,
|
||||
val accountKey: UserKey,
|
||||
val conversationId: String) : AsyncTaskLoader<ParcelableMessageConversation?>(context) {
|
||||
val conversationId: String
|
||||
) : FixedAsyncTaskLoader<ParcelableMessageConversation?>(context) {
|
||||
|
||||
override fun loadInBackground(): ParcelableMessageConversation? {
|
||||
val where = Expression.and(Expression.equalsArgs(Conversations.ACCOUNT_KEY),
|
||||
|
|
|
@ -28,6 +28,7 @@ import org.mariotaku.microblog.library.MicroBlogException
|
|||
import org.mariotaku.microblog.library.twitter.model.Paging
|
||||
import org.mariotaku.microblog.library.twitter.model.ResponseList
|
||||
import org.mariotaku.microblog.library.twitter.model.Status
|
||||
import org.mariotaku.microblog.library.twitter.model.TimelineOption
|
||||
import org.mariotaku.twidere.R
|
||||
import org.mariotaku.twidere.model.AccountDetails
|
||||
import org.mariotaku.twidere.model.ParcelableStatus
|
||||
|
@ -48,7 +49,8 @@ class UserTimelineLoader(
|
|||
tabPosition: Int,
|
||||
fromUser: Boolean,
|
||||
loadingMore: Boolean,
|
||||
val pinnedStatusIds: Array<String>?
|
||||
val pinnedStatusIds: Array<String>?,
|
||||
val excludeReplies: Boolean = false
|
||||
) : MicroBlogAPIStatusesLoader(context, accountId, sinceId, maxId, -1, data, savedStatusesArgs,
|
||||
tabPosition, fromUser, loadingMore) {
|
||||
|
||||
|
@ -77,10 +79,12 @@ class UserTimelineLoader(
|
|||
null
|
||||
}
|
||||
}
|
||||
val option = TimelineOption()
|
||||
option.setExcludeReplies(excludeReplies)
|
||||
if (userId != null) {
|
||||
return microBlog.getUserTimeline(userId.id, paging)
|
||||
return microBlog.getUserTimeline(userId.id, paging, option)
|
||||
} else if (screenName != null) {
|
||||
return microBlog.getUserTimelineByScreenName(screenName, paging)
|
||||
return microBlog.getUserTimelineByScreenName(screenName, paging, option)
|
||||
} else {
|
||||
throw MicroBlogException("Invalid user")
|
||||
}
|
||||
|
|
|
@ -27,8 +27,8 @@ open class UpdateProfileBackgroundImageTask<ResultHandler>(
|
|||
private val deleteImage: Boolean
|
||||
) : BaseAbstractTask<Any?, SingleResponse<ParcelableUser>, ResultHandler>(context) {
|
||||
|
||||
override fun afterExecute(handler: ResultHandler?, result: SingleResponse<ParcelableUser>) {
|
||||
super.afterExecute(handler, result)
|
||||
override fun afterExecute(callback: ResultHandler?, result: SingleResponse<ParcelableUser>) {
|
||||
super.afterExecute(callback, result)
|
||||
if (result.hasData()) {
|
||||
Utils.showOkMessage(context, R.string.message_toast_profile_banner_image_updated, false)
|
||||
bus.post(ProfileUpdatedEvent(result.data!!))
|
||||
|
|
|
@ -28,8 +28,8 @@ open class UpdateProfileBannerImageTask<ResultHandler>(
|
|||
|
||||
private val profileImageSize = context.getString(R.string.profile_image_size)
|
||||
|
||||
override fun afterExecute(handler: ResultHandler?, result: SingleResponse<ParcelableUser>?) {
|
||||
super.afterExecute(handler, result)
|
||||
override fun afterExecute(callback: ResultHandler?, result: SingleResponse<ParcelableUser>?) {
|
||||
super.afterExecute(callback, result)
|
||||
if (result!!.hasData()) {
|
||||
Utils.showOkMessage(context, R.string.message_toast_profile_banner_image_updated, false)
|
||||
bus.post(ProfileUpdatedEvent(result.data!!))
|
||||
|
|
|
@ -52,8 +52,8 @@ open class UpdateProfileImageTask<ResultHandler>(
|
|||
|
||||
}
|
||||
|
||||
override fun afterExecute(handler: ResultHandler?, result: SingleResponse<ParcelableUser>) {
|
||||
super.afterExecute(handler, result)
|
||||
override fun afterExecute(callback: ResultHandler?, result: SingleResponse<ParcelableUser>) {
|
||||
super.afterExecute(callback, result)
|
||||
if (result.hasData()) {
|
||||
Utils.showOkMessage(context, R.string.profile_image_updated, false)
|
||||
bus.post(ProfileUpdatedEvent(result.data!!))
|
||||
|
|
|
@ -70,7 +70,7 @@ class GetTrendsTask(
|
|||
}
|
||||
}
|
||||
|
||||
override fun afterExecute(handler: Any?, result: Unit) {
|
||||
override fun afterExecute(callback: Any?, result: Unit) {
|
||||
bus.post(TrendsRefreshedEvent())
|
||||
}
|
||||
|
||||
|
|
|
@ -85,7 +85,7 @@ class UpdateStatusTask(
|
|||
stateCallback.beforeExecute()
|
||||
}
|
||||
|
||||
override fun afterExecute(handler: Any?, result: UpdateStatusResult) {
|
||||
override fun afterExecute(callback: Any?, result: UpdateStatusResult) {
|
||||
stateCallback.afterExecute(result)
|
||||
logUpdateStatus(params.first, result)
|
||||
}
|
||||
|
|
|
@ -147,9 +147,9 @@ class CardPollViewController : ContainerView.ViewController() {
|
|||
cardData.putString("selected_choice", (i + 1).toString())
|
||||
val task = object : AbstractTask<CardDataMap, ParcelableCardEntity, CardPollViewController>() {
|
||||
|
||||
override fun afterExecute(handler: CardPollViewController?, result: ParcelableCardEntity?) {
|
||||
override fun afterExecute(callback: CardPollViewController?, result: ParcelableCardEntity?) {
|
||||
result ?: return
|
||||
handler?.displayAndReloadPoll(result, status)
|
||||
callback?.displayAndReloadPoll(result, status)
|
||||
}
|
||||
|
||||
override fun doLongOperation(cardDataMap: CardDataMap): ParcelableCardEntity? {
|
||||
|
|
|
@ -71,6 +71,7 @@
|
|||
<!-- [verb] e.g. An action label on a tweet to like this tweet. Formerly Twitter favorite. -->
|
||||
<string name="action_like">Like</string>
|
||||
<string name="action_liking">liking</string>
|
||||
<string name="action_manage_in_buffer">Manage in Buffer</string>
|
||||
<string name="action_mark_as_read">Mark as read</string>
|
||||
<string name="action_modifying_lists">modifying lists</string>
|
||||
<string name="action_mute">Mute</string>
|
||||
|
@ -1155,12 +1156,14 @@
|
|||
<string name="title_open_source_license">Open source license</string>
|
||||
<string name="title_premium_features_name">Twidere ∞</string>
|
||||
<string name="title_quick_action">Quick action</string>
|
||||
<string name="title_scheduled_statuses">Scheduled tweets</string>
|
||||
<string name="title_search">Search</string>
|
||||
<string name="title_select_users">Select users</string>
|
||||
<string name="title_set_nickname">Set nickname</string>
|
||||
<string name="title_sign_in_to_buffer">Sign in to Buffer</string>
|
||||
<string name="title_status">Tweet</string>
|
||||
<string name="title_statuses">Tweets</string>
|
||||
<string name="title_statuses_and_replies">Tweets & replies</string>
|
||||
<string name="title_statuses_scheduling">Tweets scheduling</string>
|
||||
<string name="title_streaming">Streaming</string>
|
||||
<string name="title_subscription_name">Name</string>
|
||||
|
@ -1263,5 +1266,5 @@
|
|||
<string name="users_statuses">User\'s tweets</string>
|
||||
|
||||
<string name="vibration">Vibration</string>
|
||||
<string name="title_scheduled_statuses">Scheduled tweets</string>
|
||||
<string name="action_buffer_disconnect">Disconnect from Buffer</string>
|
||||
</resources>
|
||||
|
|
Loading…
Reference in New Issue