separated tweets and tweets w/ replies

This commit is contained in:
Mariotaku Lee 2017-03-27 11:08:09 +08:00
parent 5d91cd05b3
commit 0cc43f5b9c
No known key found for this signature in database
GPG Key ID: 15C10F89D7C33535
34 changed files with 220 additions and 134 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -0,0 +1 @@
c0f1eb42515bb3fdf53ff429103f8806bbe97830

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -46,6 +46,7 @@ class ProgressDialogFragment : BaseDialogFragment() {
f.show(fm, tag)
return f
}
}
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -70,7 +70,7 @@ class GetTrendsTask(
}
}
override fun afterExecute(handler: Any?, result: Unit) {
override fun afterExecute(callback: Any?, result: Unit) {
bus.post(TrendsRefreshedEvent())
}

View File

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

View File

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

View File

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