1
0
mirror of https://github.com/TwidereProject/Twidere-Android synced 2025-02-02 09:46:51 +01:00

using databases for public timelines

improved link handler title
This commit is contained in:
Mariotaku Lee 2017-10-08 17:24:54 +08:00
parent d98c25c453
commit 9eb346a5ed
No known key found for this signature in database
GPG Key ID: 15C10F89D7C33535
80 changed files with 955 additions and 515 deletions

View File

@ -6,7 +6,7 @@ buildscript {
maven { url 'https://maven.google.com' }
}
dependencies {
classpath 'com.android.tools.build:gradle:3.0.0-beta6'
classpath 'com.android.tools.build:gradle:3.0.0-beta7'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
@ -20,7 +20,7 @@ allprojects {
projectVersionName = '3.6.33'
globalCompileSdkVersion = 26
globalBuildToolsVersion = '26.0.1'
globalBuildToolsVersion = '26.0.2'
}
repositories {
@ -79,7 +79,7 @@ subprojects {
ACRA : '4.9.2',
AbstractTask : '0.9.5',
Dagger : '2.11',
StethoBeanShellREPL : '0.1',
StethoBeanShellREPL : '0.3',
]
}

View File

@ -217,6 +217,8 @@ public interface TwidereConstants extends SharedPreferenceConstants, IntentConst
int TABLE_ID_CACHED_STATUSES = 62;
int TABLE_ID_CACHED_HASHTAGS = 63;
int TABLE_ID_CACHED_RELATIONSHIPS = 64;
int TABLE_ID_PUBLIC_TIMELINE = 71;
int TABLE_ID_NETWORK_PUBLIC_TIMELINE = 72;
int VIRTUAL_TABLE_ID_PERMISSIONS = 104;
int VIRTUAL_TABLE_ID_CACHED_USERS_WITH_RELATIONSHIP = 121;
int VIRTUAL_TABLE_ID_CACHED_USERS_WITH_SCORE = 122;

View File

@ -213,7 +213,6 @@ public class ParcelableActivity extends ParcelableStatus implements Parcelable {
", spans=" + Arrays.toString(spans) +
", quoted_spans=" + Arrays.toString(quoted_spans) +
", account_color=" + account_color +
", inserted_date=" + inserted_date +
", filter_flags=" + filter_flags +
", filter_users=" + Arrays.toString(filter_users) +
", filter_sources=" + Arrays.toString(filter_sources) +
@ -221,6 +220,7 @@ public class ParcelableActivity extends ParcelableStatus implements Parcelable {
", filter_names=" + Arrays.toString(filter_names) +
", filter_texts='" + filter_texts + '\'' +
", filter_descriptions='" + filter_descriptions + '\'' +
", tab_id=" + tab_id +
", is_pinned_status=" + is_pinned_status +
", is_filtered=" + is_filtered +
'}';

View File

@ -323,9 +323,6 @@ public class ParcelableStatus implements Parcelable, Comparable<ParcelableStatus
@CursorField(Statuses.ACCOUNT_COLOR)
public int account_color;
@CursorField(Statuses.INSERTED_DATE)
public long inserted_date;
@FilterFlags
@JsonField(name = "filter_flags")
@CursorField(Statuses.FILTER_FLAGS)
@ -355,6 +352,9 @@ public class ParcelableStatus implements Parcelable, Comparable<ParcelableStatus
@CursorField(value = Statuses.FILTER_DESCRIPTIONS)
public String filter_descriptions;
@CursorField(Statuses.TAB_ID)
public long tab_id;
public transient boolean is_pinned_status;
public transient boolean is_filtered;
@ -457,7 +457,6 @@ public class ParcelableStatus implements Parcelable, Comparable<ParcelableStatus
", spans=" + Arrays.toString(spans) +
", quoted_spans=" + Arrays.toString(quoted_spans) +
", account_color=" + account_color +
", inserted_date=" + inserted_date +
", filter_flags=" + filter_flags +
", filter_users=" + Arrays.toString(filter_users) +
", filter_sources=" + Arrays.toString(filter_sources) +
@ -465,6 +464,7 @@ public class ParcelableStatus implements Parcelable, Comparable<ParcelableStatus
", filter_names=" + Arrays.toString(filter_names) +
", filter_texts='" + filter_texts + '\'' +
", filter_descriptions='" + filter_descriptions + '\'' +
", tab_id=" + tab_id +
", is_pinned_status=" + is_pinned_status +
", is_filtered=" + is_filtered +
'}';

View File

@ -63,11 +63,6 @@ public interface TwidereDataStore {
Uri CONTENT_URI_RAW_QUERY = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH_RAW_QUERY);
Uri CONTENT_URI_DATABASE_PREPARE = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH_DATABASE_PREPARE);
interface InsertedDateColumns {
String INSERTED_DATE = "inserted_date";
String INSERTED_DATE_TYPE = TYPE_INT;
}
interface AccountSupportColumns {
String ACCOUNT_KEY = "account_id";
@ -342,7 +337,7 @@ public interface TwidereDataStore {
String[] COLUMNS = {_ID, NAME, PATH};
}
interface Messages extends BaseColumns, InsertedDateColumns, AccountSupportColumns {
interface Messages extends BaseColumns, AccountSupportColumns {
String MESSAGE_ID = "message_id";
String CONVERSATION_ID = "conversation_id";
String MESSAGE_TYPE = "message_type";
@ -578,7 +573,7 @@ public interface TwidereDataStore {
String[] COLUMNS = {_ID, PACKAGE_NAME, PERMISSION};
}
interface Statuses extends BaseColumns, InsertedDateColumns, AccountSupportColumns {
interface Statuses extends BaseColumns, AccountSupportColumns {
String TABLE_NAME = "statuses";
String CONTENT_PATH = TABLE_NAME;
@ -738,6 +733,8 @@ public interface TwidereDataStore {
String FILTER_TEXTS = "filter_texts";
String FILTER_DESCRIPTIONS = "filter_descriptions";
String TAB_ID = "tab_id";
String DEFAULT_SORT_ORDER = TIMESTAMP + " DESC, " + SORT_ID + " DESC, " + ID
+ " DESC";
@ -745,9 +742,27 @@ public interface TwidereDataStore {
String[] TYPES = ParcelableStatusTableInfo.TYPES;
interface Public extends Statuses {
String CONTENT_PATH = "public_timeline";
String TABLE_NAME = "public_timeline";
@NonNull
Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH);
}
interface Activities extends Statuses, BaseColumns, InsertedDateColumns, AccountSupportColumns {
interface NetworkPublic extends Statuses {
String CONTENT_PATH = "network_public_timeline";
String TABLE_NAME = "network_public_timeline";
@NonNull
Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH);
}
}
interface Activities extends Statuses, BaseColumns, AccountSupportColumns {
String ACTIVITY_ID = "activity_id";

View File

@ -12,7 +12,7 @@ import org.junit.runner.RunWith
import org.mariotaku.twidere.R
import org.mariotaku.twidere.TwidereConstants
import org.mariotaku.twidere.TwidereConstants.SHARED_PREFERENCES_NAME
import org.mariotaku.twidere.task.twitter.UpdateStatusTask
import org.mariotaku.twidere.task.status.UpdateStatusTask
/**
* Created by mariotaku on 2016/12/7.

View File

@ -30,7 +30,7 @@ import org.mariotaku.twidere.model.UserKey;
public interface Constants extends TwidereConstants {
String DATABASES_NAME = "twidere.sqlite";
int DATABASES_VERSION = 188;
int DATABASES_VERSION = 190;
int EXTRA_FEATURES_NOTICE_VERSION = 2;

View File

@ -11,12 +11,16 @@ import java.lang.annotation.RetentionPolicy;
@StringDef({
ReadPositionTag.ACTIVITIES_ABOUT_ME,
ReadPositionTag.HOME_TIMELINE,
ReadPositionTag.PUBLIC_TIMELINE,
ReadPositionTag.NETWORK_PUBLIC_TIMELINE,
ReadPositionTag.DIRECT_MESSAGES,
ReadPositionTag.CUSTOM_TIMELINE,
})
@Retention(RetentionPolicy.SOURCE)
public @interface ReadPositionTag {
String HOME_TIMELINE = "home_timeline";
String PUBLIC_TIMELINE = "public_timeline";
String NETWORK_PUBLIC_TIMELINE = "network_public_timeline";
String ACTIVITIES_ABOUT_ME = "activities_about_me";
String DIRECT_MESSAGES = "direct_messages";
String CUSTOM_TIMELINE = "custom_timeline";

View File

@ -92,7 +92,7 @@ import org.mariotaku.twidere.provider.TwidereDataStore.Drafts
import org.mariotaku.twidere.service.LengthyOperationsService
import org.mariotaku.twidere.task.compose.AbsAddMediaTask
import org.mariotaku.twidere.task.compose.AbsDeleteMediaTask
import org.mariotaku.twidere.task.twitter.UpdateStatusTask
import org.mariotaku.twidere.task.status.UpdateStatusTask
import org.mariotaku.twidere.text.MarkForDeleteSpan
import org.mariotaku.twidere.text.style.EmojiSpan
import org.mariotaku.twidere.util.*

View File

@ -48,7 +48,10 @@ import org.mariotaku.twidere.Constants.*
import org.mariotaku.twidere.R
import org.mariotaku.twidere.activity.iface.IControlBarActivity
import org.mariotaku.twidere.activity.iface.IControlBarActivity.ControlBarShowHideHelper
import org.mariotaku.twidere.constant.*
import org.mariotaku.twidere.constant.CompatibilityConstants
import org.mariotaku.twidere.constant.IntentConstants
import org.mariotaku.twidere.constant.KeyboardShortcutConstants
import org.mariotaku.twidere.constant.floatingDetailedContentsKey
import org.mariotaku.twidere.exception.NoAccountException
import org.mariotaku.twidere.fragment.*
import org.mariotaku.twidere.fragment.drafts.DraftsFragment
@ -56,6 +59,8 @@ import org.mariotaku.twidere.fragment.filter.FiltersFragment
import org.mariotaku.twidere.fragment.filter.FiltersImportBlocksFragment
import org.mariotaku.twidere.fragment.filter.FiltersImportMutesFragment
import org.mariotaku.twidere.fragment.filter.FiltersSubscriptionsFragment
import org.mariotaku.twidere.fragment.group.GroupFragment
import org.mariotaku.twidere.fragment.group.UserGroupsFragment
import org.mariotaku.twidere.fragment.iface.IBaseFragment
import org.mariotaku.twidere.fragment.iface.IBaseFragment.SystemWindowInsetsCallback
import org.mariotaku.twidere.fragment.iface.IFloatingActionButtonFragment
@ -69,6 +74,9 @@ import org.mariotaku.twidere.fragment.search.MastodonSearchFragment
import org.mariotaku.twidere.fragment.search.SearchFragment
import org.mariotaku.twidere.fragment.status.StatusFragment
import org.mariotaku.twidere.fragment.statuses.*
import org.mariotaku.twidere.fragment.userlist.ListsFragment
import org.mariotaku.twidere.fragment.userlist.UserListFragment
import org.mariotaku.twidere.fragment.userlist.UserListMembershipsFragment
import org.mariotaku.twidere.fragment.users.*
import org.mariotaku.twidere.graphic.ActionBarColorDrawable
import org.mariotaku.twidere.graphic.EmptyDrawable
@ -82,11 +90,15 @@ import org.mariotaku.twidere.util.theme.getCurrentThemeResource
class LinkHandlerActivity : BaseActivity(), SystemWindowInsetsCallback, IControlBarActivity,
SupportFragmentCallback {
var subtitle: CharSequence? = null
set(value) {
field = value
setupActionBarOption()
}
private lateinit var multiSelectHandler: MultiSelectEventHandler
private lateinit var controlBarShowHideHelper: ControlBarShowHideHelper
private var finishOnly: Boolean = false
private var actionBarHeight: Int = 0
private var subtitle: CharSequence? = null
private var hideOffsetNotSupported: Boolean = false
private lateinit var fragmentLifecycleCallbacks: FragmentLifecycleCallbacks
@ -173,7 +185,6 @@ class LinkHandlerActivity : BaseActivity(), SystemWindowInsetsCallback, IControl
ft.replace(contentFragmentId, fragment, "content_fragment")
ft.commit()
}
setTitle(linkId, uri)
finishOnly = uri.getQueryParameter(QUERY_PARAM_FINISH_ONLY)?.toBoolean() == true
val theme = overrideTheme
@ -299,11 +310,6 @@ class LinkHandlerActivity : BaseActivity(), SystemWindowInsetsCallback, IControl
setupActionBarOption()
}
fun setSubtitle(subtitle: CharSequence?) {
this.subtitle = subtitle
setupActionBarOption()
}
override fun setControlBarVisibleAnimate(visible: Boolean, listener: ControlBarShowHideHelper.ControlBarAnimationListener?) {
// Currently only search page needs this pattern, so we only enable this feature for it.
actionsButton?.let { fab ->
@ -370,140 +376,6 @@ class LinkHandlerActivity : BaseActivity(), SystemWindowInsetsCallback, IControl
return getCurrentThemeResource(this, theme, R.style.Theme_Twidere)
}
private fun setTitle(linkId: Int, uri: Uri): Boolean {
setSubtitle(null)
when (linkId) {
LINK_ID_STATUS -> {
setTitle(R.string.title_status)
}
LINK_ID_USER -> {
setTitle(R.string.title_user)
}
LINK_ID_USER_TIMELINE -> {
setTitle(R.string.title_statuses)
}
LINK_ID_USER_FAVORITES -> {
if (preferences[iWantMyStarsBackKey]) {
setTitle(R.string.title_favorites)
} else {
setTitle(R.string.title_likes)
}
}
LINK_ID_USER_FOLLOWERS -> {
setTitle(R.string.title_followers)
}
LINK_ID_USER_FRIENDS -> {
setTitle(R.string.title_following)
}
LINK_ID_USER_BLOCKS -> {
setTitle(R.string.title_blocked_users)
}
LINK_ID_MUTES_USERS -> {
setTitle(R.string.action_twitter_muted_users)
}
LINK_ID_USER_LIST -> {
setTitle(R.string.title_user_list)
}
LINK_ID_GROUP -> {
setTitle(R.string.group)
}
LINK_ID_USER_LISTS -> {
setTitle(R.string.user_lists)
}
LINK_ID_USER_GROUPS -> {
setTitle(R.string.groups)
}
LINK_ID_USER_LIST_TIMELINE -> {
setTitle(R.string.list_timeline)
}
LINK_ID_USER_LIST_MEMBERS -> {
setTitle(R.string.list_members)
}
LINK_ID_USER_LIST_SUBSCRIBERS -> {
setTitle(R.string.list_subscribers)
}
LINK_ID_USER_LIST_MEMBERSHIPS -> {
setTitle(R.string.lists_following_user)
}
LINK_ID_SAVED_SEARCHES -> {
setTitle(R.string.saved_searches)
}
LINK_ID_USER_MENTIONS -> {
setTitle(R.string.user_mentions)
}
LINK_ID_INCOMING_FRIENDSHIPS -> {
setTitle(R.string.incoming_friendships)
}
LINK_ID_ITEMS -> {
}// TODO show title
LINK_ID_USER_MEDIA_TIMELINE -> {
setTitle(R.string.media)
}
LINK_ID_STATUS_RETWEETERS -> {
setTitle(R.string.title_users_retweeted_this)
}
LINK_ID_STATUS_FAVORITERS -> {
if (preferences[iWantMyStarsBackKey]) {
setTitle(R.string.title_users_favorited_this)
} else {
setTitle(R.string.title_users_liked_this)
}
}
LINK_ID_SEARCH -> {
setTitle(R.string.title_search)
setSubtitle(uri.getQueryParameter(QUERY_PARAM_QUERY))
}
LINK_ID_MASTODON_SEARCH -> {
setTitle(R.string.title_search)
setSubtitle(uri.getQueryParameter(QUERY_PARAM_QUERY))
}
LINK_ID_ACCOUNTS -> {
setTitle(R.string.title_accounts)
}
LINK_ID_MAP -> {
setTitle(R.string.action_view_map)
}
LINK_ID_PROFILE_EDITOR -> {
setTitle(R.string.title_edit_profile)
}
LINK_ID_MESSAGES -> {
title = getString(R.string.title_direct_messages)
}
LINK_ID_MESSAGES_CONVERSATION -> {
title = getString(R.string.title_direct_messages)
}
LINK_ID_MESSAGES_CONVERSATION_NEW -> {
title = getString(R.string.title_direct_messages_conversation_new)
}
LINK_ID_MESSAGES_CONVERSATION_INFO -> {
title = getString(R.string.title_direct_messages_conversation_info)
}
LINK_ID_INTERACTIONS -> {
title = getString(R.string.interactions)
}
LINK_ID_PUBLIC_TIMELINE -> {
title = getString(R.string.title_public_timeline)
}
LINK_ID_NETWORK_PUBLIC_TIMELINE -> {
title = getString(R.string.title_network_public_timeline)
}
LINK_ID_FILTERS_IMPORT_BLOCKS -> {
title = getString(R.string.title_select_users)
}
LINK_ID_FILTERS_IMPORT_MUTES -> {
title = getString(R.string.title_select_users)
}
LINK_ID_FILTERS_SUBSCRIPTIONS_ADD,
LINK_ID_FILTERS_SUBSCRIPTIONS -> {
title = getString(R.string.title_manage_filter_subscriptions)
}
else -> {
title = getString(R.string.app_name)
}
}
return true
}
private fun handleFragmentKeyboardShortcutRepeat(handler: KeyboardShortcutsHandler, keyCode: Int,
repeatCount: Int, event: KeyEvent, metaState: Int): Boolean {
val fragment = currentVisibleFragment

View File

@ -20,12 +20,16 @@
package org.mariotaku.twidere.extension
import android.support.v4.app.Fragment
import org.mariotaku.twidere.activity.LinkHandlerActivity
/**
* Created by mariotaku on 2017/10/4.
*/
var Fragment.title: CharSequence?
get() = activity.title
var Fragment.linkHandlerTitle: CharSequence?
get() = (activity as? LinkHandlerActivity)?.title
set(value) {
activity.title
(activity as? LinkHandlerActivity)?.title = value
}
var Fragment.linkHandlerSubtitle: CharSequence?
get() = (activity as? LinkHandlerActivity)?.subtitle
set(value) {
(activity as? LinkHandlerActivity)?.subtitle = value
}

View File

@ -11,7 +11,7 @@ import org.mariotaku.twidere.model.account.StatusNetAccountExtras
import org.mariotaku.twidere.model.account.TwitterAccountExtras
import org.mariotaku.twidere.model.account.cred.Credentials
import org.mariotaku.twidere.model.account.cred.OAuthCredentials
import org.mariotaku.twidere.task.twitter.UpdateStatusTask
import org.mariotaku.twidere.task.status.UpdateStatusTask
import org.mariotaku.twidere.util.InternalTwitterContentUtils
fun AccountDetails.isOfficial(context: Context): Boolean {

View File

@ -32,6 +32,7 @@ import org.mariotaku.twidere.adapter.AccountDetailsAdapter
import org.mariotaku.twidere.constant.IntentConstants.EXTRA_ACCOUNT_KEY
import org.mariotaku.twidere.constant.newDocumentApiKey
import org.mariotaku.twidere.extension.applyTheme
import org.mariotaku.twidere.extension.linkHandlerTitle
import org.mariotaku.twidere.extension.model.getAccountKey
import org.mariotaku.twidere.extension.model.setActivated
import org.mariotaku.twidere.extension.model.setColor
@ -59,6 +60,7 @@ class AccountsManagerFragment : BaseFragment(), LoaderManager.LoaderCallbacks<Li
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
setHasOptionsMenu(true)
linkHandlerTitle = getString(R.string.title_accounts)
val am = AccountManager.get(context)
adapter = AccountDetailsAdapter(context, requestManager).apply {
sortEnabled = true

View File

@ -46,7 +46,7 @@ import org.mariotaku.twidere.model.event.*
import org.mariotaku.twidere.model.pagination.SinceMaxPagination
import org.mariotaku.twidere.provider.TwidereDataStore.Activities
import org.mariotaku.twidere.provider.TwidereDataStore.Filters
import org.mariotaku.twidere.task.twitter.GetStatusesTask
import org.mariotaku.twidere.task.statuses.GetStatusesTask
import org.mariotaku.twidere.util.DataStoreUtils
import org.mariotaku.twidere.util.DataStoreUtils.getTableNameByUri
import org.mariotaku.twidere.util.ErrorInfoStore

View File

@ -50,7 +50,7 @@ import org.mariotaku.twidere.model.event.*
import org.mariotaku.twidere.model.pagination.SinceMaxPagination
import org.mariotaku.twidere.provider.TwidereDataStore.Filters
import org.mariotaku.twidere.provider.TwidereDataStore.Statuses
import org.mariotaku.twidere.task.twitter.GetStatusesTask
import org.mariotaku.twidere.task.statuses.GetStatusesTask
import org.mariotaku.twidere.util.DataStoreUtils
import org.mariotaku.twidere.util.ErrorInfoStore
import org.mariotaku.twidere.util.Utils
@ -256,6 +256,8 @@ abstract class CursorStatusesFragment : AbsStatusesFragment() {
}
private fun clearNotifications() {
val notificationType = notificationType
if (notificationType <= 0) return
if (context != null && userVisibleHint) {
for (accountKey in accountKeys) {
twitterWrapper.clearNotificationAsync(notificationType, accountKey)

View File

@ -77,7 +77,7 @@ class HomeTimelineFragment : CursorStatusesFragment() {
override fun processWhere(where: Expression, whereArgs: Array<String>): ParameterizedExpression {
val arguments = arguments
if (arguments != null) {
val extras = arguments.getParcelable<HomeTabExtras>(EXTRA_EXTRAS)
val extras = arguments.getParcelable<HomeTabExtras?>(EXTRA_EXTRAS)
if (extras != null) {
val expressions = ArrayList<Expression>()
val expressionArgs = ArrayList<String>()

View File

@ -20,14 +20,17 @@
package org.mariotaku.twidere.fragment
import android.content.Context
import android.os.Bundle
import com.bumptech.glide.RequestManager
import org.mariotaku.microblog.library.twitter.model.Activity
import org.mariotaku.sqliteqb.library.Expression
import org.mariotaku.twidere.R
import org.mariotaku.twidere.TwidereConstants.NOTIFICATION_ID_INTERACTIONS_TIMELINE
import org.mariotaku.twidere.adapter.ParcelableActivitiesAdapter
import org.mariotaku.twidere.annotation.FilterScope
import org.mariotaku.twidere.annotation.ReadPositionTag
import org.mariotaku.twidere.constant.IntentConstants.EXTRA_EXTRAS
import org.mariotaku.twidere.extension.linkHandlerTitle
import org.mariotaku.twidere.model.ParameterizedExpression
import org.mariotaku.twidere.model.RefreshTaskParam
import org.mariotaku.twidere.model.UserKey
@ -54,6 +57,11 @@ class InteractionsTimelineFragment : CursorActivitiesFragment() {
override val filterScopes: Int
get() = FilterScope.INTERACTIONS
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
linkHandlerTitle = getString(R.string.interactions)
}
override fun onCreateAdapter(context: Context, requestManager: RequestManager): ParcelableActivitiesAdapter {
val adapter = ParcelableActivitiesAdapter(context, requestManager)
val extras: InteractionsTabExtras? = arguments.getParcelable(EXTRA_EXTRAS)

View File

@ -31,8 +31,10 @@ import com.squareup.otto.Subscribe
import kotlinx.android.synthetic.main.fragment_content_listview.*
import org.mariotaku.microblog.library.twitter.model.ResponseList
import org.mariotaku.microblog.library.twitter.model.SavedSearch
import org.mariotaku.twidere.R
import org.mariotaku.twidere.adapter.SavedSearchesAdapter
import org.mariotaku.twidere.constant.IntentConstants.EXTRA_ACCOUNT_KEY
import org.mariotaku.twidere.extension.linkHandlerTitle
import org.mariotaku.twidere.loader.SavedSearchesLoader
import org.mariotaku.twidere.model.UserKey
import org.mariotaku.twidere.model.event.SavedSearchDestroyedEvent
@ -54,6 +56,8 @@ class SavedSearchesListFragment : AbsContentListViewFragment<SavedSearchesAdapte
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
linkHandlerTitle = getString(R.string.saved_searches)
listView.onItemClickListener = this
listView.onItemLongClickListener = this
loaderManager.initLoader(0, null, this)

View File

@ -654,6 +654,7 @@ class UserFragment : BaseFragment(), OnClickListener, OnLinkClickListener,
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
linkHandlerTitle = getString(R.string.title_user)
val activity = activity
nameFirst = preferences[nameFirstKey]
cardBackgroundColor = ThemeUtils.getCardBackgroundColor(activity,

View File

@ -1,22 +0,0 @@
package org.mariotaku.twidere.fragment
import android.content.Context
import android.os.Bundle
import android.support.v4.content.Loader
import org.mariotaku.twidere.constant.IntentConstants.*
import org.mariotaku.twidere.loader.group.UserGroupsLoader
import org.mariotaku.twidere.model.ParcelableGroup
import org.mariotaku.twidere.model.UserKey
/**
* Created by mariotaku on 16/3/9.
*/
class UserGroupsFragment : ParcelableGroupsFragment() {
override fun onCreateUserListsLoader(context: Context, args: Bundle, fromUser: Boolean): Loader<List<ParcelableGroup>?> {
val accountKey = args.getParcelable<UserKey>(EXTRA_ACCOUNT_KEY)
val userKey = args.getParcelable<UserKey>(EXTRA_USER_KEY)
val screenName = args.getString(EXTRA_SCREEN_NAME)
return UserGroupsLoader(context, accountKey, userKey, screenName, adapter.getData())
}
}

View File

@ -50,6 +50,8 @@ import org.mariotaku.twidere.TwidereConstants.*
import org.mariotaku.twidere.activity.ColorPickerDialogActivity
import org.mariotaku.twidere.activity.ThemedMediaPickerActivity
import org.mariotaku.twidere.annotation.AccountType
import org.mariotaku.twidere.annotation.ImageShapeStyle
import org.mariotaku.twidere.extension.linkHandlerTitle
import org.mariotaku.twidere.extension.loadProfileBanner
import org.mariotaku.twidere.extension.loadProfileImage
import org.mariotaku.twidere.extension.model.api.mastodon.toParcelable
@ -77,6 +79,44 @@ class UserProfileEditorFragment : BaseFragment(), OnSizeChangedListener,
private var userInfoLoaderInitialized: Boolean = false
private var getUserInfoCalled: Boolean = false
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
setHasOptionsMenu(true)
linkHandlerTitle = getString(R.string.title_edit_profile)
if (!Utils.isMyAccount(activity, accountKey)) {
activity.finish()
return
}
val lengthChecker = TwitterValidatorMETLengthChecker(Validator())
editDescription.setLengthChecker(lengthChecker)
profileImage.setOnClickListener(this)
profileBanner.setOnClickListener(this)
profileBackground.setOnClickListener(this)
editProfileImage.setOnClickListener(this)
editProfileBanner.setOnClickListener(this)
editProfileBackground.setOnClickListener(this)
setLinkColor.setOnClickListener(this)
setBackgroundColor.setOnClickListener(this)
val savedUser = savedInstanceState?.getParcelable<ParcelableUser?>(EXTRA_USER)
val savedAccount = savedInstanceState?.getParcelable<AccountDetails?>(EXTRA_ACCOUNT)
if (savedInstanceState != null && savedUser != null && savedAccount != null) {
displayUser(savedUser, savedAccount)
editName.setText(savedInstanceState.getString(EXTRA_NAME, savedUser.name))
editLocation.setText(savedInstanceState.getString(EXTRA_LOCATION, savedUser.location))
editDescription.setText(savedInstanceState.getString(EXTRA_DESCRIPTION,
ParcelableUserUtils.getExpandedDescription(savedUser)))
editUrl.setText(savedInstanceState.getString(EXTRA_URL, savedUser.url_expanded))
} else {
getUserInfo()
}
}
override fun onClick(view: View) {
val user = user ?: return
val account = account ?: return
@ -145,6 +185,7 @@ class UserProfileEditorFragment : BaseFragment(), OnSizeChangedListener,
inflater.inflate(R.menu.menu_profile_editor, menu)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
R.id.save -> {
@ -164,44 +205,6 @@ class UserProfileEditorFragment : BaseFragment(), OnSizeChangedListener,
return super.onOptionsItemSelected(item)
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
setHasOptionsMenu(true)
if (!Utils.isMyAccount(activity, accountKey)) {
activity.finish()
return
}
val lengthChecker = TwitterValidatorMETLengthChecker(Validator())
editDescription.setLengthChecker(lengthChecker)
profileImage.setOnClickListener(this)
profileBanner.setOnClickListener(this)
profileBackground.setOnClickListener(this)
editProfileImage.setOnClickListener(this)
editProfileBanner.setOnClickListener(this)
editProfileBackground.setOnClickListener(this)
setLinkColor.setOnClickListener(this)
setBackgroundColor.setOnClickListener(this)
val savedUser = savedInstanceState?.getParcelable<ParcelableUser?>(EXTRA_USER)
val savedAccount = savedInstanceState?.getParcelable<AccountDetails?>(EXTRA_ACCOUNT)
if (savedInstanceState != null && savedUser != null && savedAccount != null) {
displayUser(savedUser, savedAccount)
editName.setText(savedInstanceState.getString(EXTRA_NAME, savedUser.name))
editLocation.setText(savedInstanceState.getString(EXTRA_LOCATION, savedUser.location))
editDescription.setText(savedInstanceState.getString(EXTRA_DESCRIPTION,
ParcelableUserUtils.getExpandedDescription(savedUser)))
editUrl.setText(savedInstanceState.getString(EXTRA_URL, savedUser.url_expanded))
} else {
getUserInfo()
}
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putParcelable(EXTRA_USER, user)
@ -277,7 +280,8 @@ class UserProfileEditorFragment : BaseFragment(), OnSizeChangedListener,
editLocation.setText(user.location)
editUrl.setText(if (isEmpty(user.url_expanded)) user.url else user.url_expanded)
requestManager.loadProfileImage(context, user, 0).into(profileImage)
requestManager.loadProfileImage(context, user,
ImageShapeStyle.SHAPE_RECTANGLE).into(profileImage)
requestManager.loadProfileBanner(context, user, resources.displayMetrics.widthPixels)
.into(profileBanner)
requestManager.load(user.profile_background_url).into(profileBackground)

View File

@ -24,7 +24,7 @@ import org.mariotaku.ktextension.Bundle
import org.mariotaku.twidere.R
import org.mariotaku.twidere.adapter.SupportTabsAdapter
import org.mariotaku.twidere.constant.IntentConstants.EXTRA_ACTIONS
import org.mariotaku.twidere.extension.title
import org.mariotaku.twidere.extension.linkHandlerTitle
import org.mariotaku.twidere.fragment.AbsToolbarTabPagesFragment
import org.mariotaku.twidere.model.Draft
@ -35,7 +35,7 @@ import org.mariotaku.twidere.model.Draft
class DraftsFragment : AbsToolbarTabPagesFragment() {
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
title = getString(R.string.title_drafts)
linkHandlerTitle = getString(R.string.title_drafts)
}
override fun addTabs(adapter: SupportTabsAdapter) {

View File

@ -22,7 +22,7 @@ package org.mariotaku.twidere.fragment.filter
import android.os.Bundle
import org.mariotaku.twidere.R
import org.mariotaku.twidere.adapter.SupportTabsAdapter
import org.mariotaku.twidere.extension.title
import org.mariotaku.twidere.extension.linkHandlerTitle
import org.mariotaku.twidere.fragment.AbsToolbarTabPagesFragment
class FiltersFragment : AbsToolbarTabPagesFragment() {
@ -30,7 +30,7 @@ class FiltersFragment : AbsToolbarTabPagesFragment() {
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
setHasOptionsMenu(true)
title = getString(R.string.title_filters)
linkHandlerTitle = getString(R.string.title_filters)
}
override fun addTabs(adapter: SupportTabsAdapter) {

View File

@ -2,8 +2,10 @@ package org.mariotaku.twidere.fragment.filter
import android.content.Context
import android.os.Bundle
import org.mariotaku.twidere.R
import org.mariotaku.twidere.constant.IntentConstants
import org.mariotaku.twidere.constant.IntentConstants.EXTRA_PAGINATION
import org.mariotaku.twidere.extension.linkHandlerTitle
import org.mariotaku.twidere.loader.users.AbsRequestUsersLoader
import org.mariotaku.twidere.loader.users.UserBlocksLoader
import org.mariotaku.twidere.model.UserKey
@ -13,6 +15,10 @@ import org.mariotaku.twidere.model.UserKey
*/
class FiltersImportBlocksFragment : BaseFiltersImportFragment() {
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
linkHandlerTitle = getString(R.string.title_select_users)
}
override fun onCreateUsersLoader(context: Context, args: Bundle, fromUser: Boolean):
AbsRequestUsersLoader {

View File

@ -2,8 +2,10 @@ package org.mariotaku.twidere.fragment.filter
import android.content.Context
import android.os.Bundle
import org.mariotaku.twidere.R
import org.mariotaku.twidere.constant.IntentConstants
import org.mariotaku.twidere.constant.IntentConstants.EXTRA_ACCOUNT_KEY
import org.mariotaku.twidere.extension.linkHandlerTitle
import org.mariotaku.twidere.loader.users.AbsRequestUsersLoader
import org.mariotaku.twidere.loader.users.MutesUsersLoader
import org.mariotaku.twidere.model.UserKey
@ -13,6 +15,11 @@ import org.mariotaku.twidere.model.UserKey
*/
class FiltersImportMutesFragment : BaseFiltersImportFragment() {
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
linkHandlerTitle = getString(R.string.title_select_users)
}
override fun onCreateUsersLoader(context: Context, args: Bundle, fromUser: Boolean):
AbsRequestUsersLoader {
val accountKey = args.getParcelable<UserKey>(EXTRA_ACCOUNT_KEY)

View File

@ -59,6 +59,7 @@ class FiltersSubscriptionsFragment : BaseFragment(), LoaderManager.LoaderCallbac
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
setHasOptionsMenu(true)
linkHandlerTitle = getString(R.string.title_manage_filter_subscriptions)
adapter = FilterSubscriptionsAdapter(context)
listView.adapter = adapter

View File

@ -1,4 +1,23 @@
package org.mariotaku.twidere.fragment
/*
* 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.fragment.group
import android.content.Context
import android.nfc.NdefMessage
@ -13,6 +32,7 @@ import org.mariotaku.microblog.library.statusnet.model.Group
import org.mariotaku.twidere.Constants.*
import org.mariotaku.twidere.R
import org.mariotaku.twidere.adapter.SupportTabsAdapter
import org.mariotaku.twidere.fragment.AbsToolbarTabPagesFragment
import org.mariotaku.twidere.fragment.statuses.GroupTimelineFragment
import org.mariotaku.twidere.fragment.users.GroupMembersFragment
import org.mariotaku.twidere.model.ParcelableGroup

View File

@ -0,0 +1,49 @@
/*
* 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.fragment.group
import android.content.Context
import android.os.Bundle
import android.support.v4.content.Loader
import org.mariotaku.twidere.R
import org.mariotaku.twidere.constant.IntentConstants.*
import org.mariotaku.twidere.extension.linkHandlerTitle
import org.mariotaku.twidere.fragment.ParcelableGroupsFragment
import org.mariotaku.twidere.loader.group.UserGroupsLoader
import org.mariotaku.twidere.model.ParcelableGroup
import org.mariotaku.twidere.model.UserKey
/**
* Created by mariotaku on 16/3/9.
*/
class UserGroupsFragment : ParcelableGroupsFragment() {
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
linkHandlerTitle = getString(R.string.groups)
}
override fun onCreateUserListsLoader(context: Context, args: Bundle, fromUser: Boolean): Loader<List<ParcelableGroup>?> {
val accountKey = args.getParcelable<UserKey>(EXTRA_ACCOUNT_KEY)
val userKey = args.getParcelable<UserKey>(EXTRA_USER_KEY)
val screenName = args.getString(EXTRA_SCREEN_NAME)
return UserGroupsLoader(context, accountKey, userKey, screenName, adapter.getData())
}
}

View File

@ -91,7 +91,7 @@ import org.mariotaku.twidere.model.ParcelableMessageConversation.ConversationTyp
import org.mariotaku.twidere.model.ParcelableMessageConversation.ExtrasType
import org.mariotaku.twidere.model.util.AccountUtils
import org.mariotaku.twidere.provider.TwidereDataStore.Messages.Conversations
import org.mariotaku.twidere.task.twitter.UpdateStatusTask
import org.mariotaku.twidere.task.status.UpdateStatusTask
import org.mariotaku.twidere.task.twitter.message.AddParticipantsTask
import org.mariotaku.twidere.task.twitter.message.ClearMessagesTask
import org.mariotaku.twidere.task.twitter.message.DestroyConversationTask
@ -122,6 +122,8 @@ class MessageConversationInfoFragment : BaseFragment(), IToolBarSupportFragment,
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
setHasOptionsMenu(true)
linkHandlerTitle = getString(R.string.title_direct_messages_conversation_info)
val activity = this.activity
if (activity is AppCompatActivity) {

View File

@ -44,6 +44,7 @@ import org.mariotaku.twidere.R
import org.mariotaku.twidere.adapter.SelectableUsersAdapter
import org.mariotaku.twidere.constant.IntentConstants.*
import org.mariotaku.twidere.constant.nameFirstKey
import org.mariotaku.twidere.extension.linkHandlerTitle
import org.mariotaku.twidere.extension.model.isOfficial
import org.mariotaku.twidere.extension.queryOne
import org.mariotaku.twidere.extension.text.appendCompat
@ -98,6 +99,7 @@ class MessageNewConversationFragment : BaseFragment(), LoaderCallbacks<List<Parc
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
setHasOptionsMenu(true)
linkHandlerTitle = getString(R.string.title_direct_messages_conversation_new)
usersAdapter = SelectableUsersAdapter(context, requestManager)
recyclerView.adapter = usersAdapter
recyclerView.layoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false)

View File

@ -64,6 +64,7 @@ import org.mariotaku.twidere.constant.IntentConstants.*
import org.mariotaku.twidere.constant.nameFirstKey
import org.mariotaku.twidere.constant.newDocumentApiKey
import org.mariotaku.twidere.constant.profileImageStyleKey
import org.mariotaku.twidere.extension.linkHandlerTitle
import org.mariotaku.twidere.extension.loadProfileImage
import org.mariotaku.twidere.extension.model.*
import org.mariotaku.twidere.fragment.AbsContentListRecyclerViewFragment
@ -126,6 +127,7 @@ class MessagesConversationFragment : AbsContentListRecyclerViewFragment<Messages
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
setHasOptionsMenu(true)
linkHandlerTitle = getString(R.string.title_direct_messages)
val account = this.account ?: run {
activity?.finish()
return

View File

@ -49,6 +49,7 @@ import org.mariotaku.twidere.constant.IntentConstants.EXTRA_ACCOUNT_KEY
import org.mariotaku.twidere.constant.IntentConstants.EXTRA_ACCOUNT_TYPES
import org.mariotaku.twidere.constant.nameFirstKey
import org.mariotaku.twidere.constant.newDocumentApiKey
import org.mariotaku.twidere.extension.linkHandlerTitle
import org.mariotaku.twidere.extension.model.getTitle
import org.mariotaku.twidere.extension.model.user
import org.mariotaku.twidere.fragment.AbsContentListRecyclerViewFragment
@ -84,6 +85,7 @@ class MessagesEntriesFragment : AbsContentListRecyclerViewFragment<MessagesEntri
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
linkHandlerTitle = getString(R.string.title_direct_messages)
adapter.listener = this
adapter.loadMoreSupportedPosition = ILoadMoreSupportAdapter.END
loaderManager.initLoader(loaderId, null, this)

View File

@ -22,6 +22,9 @@ package org.mariotaku.twidere.fragment.search
import android.os.Bundle
import android.support.v4.content.Loader
import org.mariotaku.twidere.Constants.EXTRA_QUERY
import org.mariotaku.twidere.R
import org.mariotaku.twidere.extension.linkHandlerSubtitle
import org.mariotaku.twidere.extension.linkHandlerTitle
import org.mariotaku.twidere.fragment.ItemsListFragment
import org.mariotaku.twidere.loader.MastodonSearchLoader
@ -34,6 +37,12 @@ class MastodonSearchFragment : ItemsListFragment() {
val query: String
get() = arguments.getString(EXTRA_QUERY)
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
linkHandlerTitle = getString(R.string.title_search)
linkHandlerSubtitle = query
}
override fun onCreateLoader(id: Int, args: Bundle?): Loader<List<Any>?> {
return MastodonSearchLoader(context, accountKey, query)
}

View File

@ -41,6 +41,8 @@ import org.mariotaku.twidere.activity.QuickSearchBarActivity
import org.mariotaku.twidere.activity.iface.IControlBarActivity.ControlBarOffsetListener
import org.mariotaku.twidere.adapter.SupportTabsAdapter
import org.mariotaku.twidere.annotation.AccountType
import org.mariotaku.twidere.extension.linkHandlerSubtitle
import org.mariotaku.twidere.extension.linkHandlerTitle
import org.mariotaku.twidere.extension.model.getAccountType
import org.mariotaku.twidere.fragment.AbsToolbarTabPagesFragment
import org.mariotaku.twidere.fragment.iface.IBaseFragment.SystemWindowInsetsCallback
@ -85,6 +87,9 @@ class SearchFragment : AbsToolbarTabPagesFragment(), RefreshScrollTopInterface,
super.onActivityCreated(savedInstanceState)
setHasOptionsMenu(true)
linkHandlerTitle = getString(R.string.title_search)
linkHandlerSubtitle = query
if (savedInstanceState == null && !TextUtils.isEmpty(query)) {
val suggestions = SearchRecentSuggestions(activity,
RecentSearchProvider.AUTHORITY, RecentSearchProvider.MODE)

View File

@ -232,6 +232,7 @@ class StatusFragment : BaseFragment(), LoaderCallbacks<SingleResponse<Parcelable
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
setHasOptionsMenu(true)
linkHandlerTitle = getString(R.string.title_status)
Utils.setNdefPushMessageCallback(activity, CreateNdefMessageCallback {
val status = status ?: return@CreateNdefMessageCallback null
NdefMessage(arrayOf(NdefRecord.createUri(LinkCreator.getStatusWebLink(status))))

View File

@ -19,45 +19,86 @@
package org.mariotaku.twidere.fragment.statuses
import android.content.Context
import android.os.Bundle
import android.support.v4.content.Loader
import org.mariotaku.twidere.TwidereConstants.*
import org.mariotaku.twidere.fragment.ParcelableStatusesFragment
import org.mariotaku.twidere.loader.statuses.NetworkPublicTimelineLoader
import org.mariotaku.twidere.model.ParcelableStatus
import org.mariotaku.twidere.util.Utils
import org.mariotaku.abstask.library.TaskStarter
import org.mariotaku.sqliteqb.library.Expression
import org.mariotaku.twidere.R
import org.mariotaku.twidere.annotation.FilterScope
import org.mariotaku.twidere.annotation.ReadPositionTag
import org.mariotaku.twidere.constant.IntentConstants
import org.mariotaku.twidere.extension.linkHandlerTitle
import org.mariotaku.twidere.fragment.CursorStatusesFragment
import org.mariotaku.twidere.model.ParameterizedExpression
import org.mariotaku.twidere.model.RefreshTaskParam
import org.mariotaku.twidere.model.UserKey
import org.mariotaku.twidere.model.tab.extra.HomeTabExtras
import org.mariotaku.twidere.provider.TwidereDataStore.Statuses
import org.mariotaku.twidere.task.statuses.GetNetworkPublicTimelineTask
import org.mariotaku.twidere.util.DataStoreUtils
import org.mariotaku.twidere.util.ErrorInfoStore
import java.util.*
/**
* Created by mariotaku on 14/12/2.
*/
class NetworkPublicTimelineFragment : ParcelableStatusesFragment() {
class NetworkPublicTimelineFragment : CursorStatusesFragment() {
override val savedStatusesFileArgs: Array<String>?
get() {
val accountKey = Utils.getAccountKey(context, arguments)
val result = ArrayList<String>()
result.add(AUTHORITY_NETWORK_PUBLIC_TIMELINE)
result.add("account=$accountKey")
return result.toTypedArray()
override val errorInfoKey = ErrorInfoStore.KEY_NETWORK_PUBLIC_TIMELINE
override val contentUri = Statuses.NetworkPublic.CONTENT_URI
override val notificationType = 0
override val isFilterEnabled = true
override val readPositionTag = ReadPositionTag.PUBLIC_TIMELINE
override val timelineSyncTag: String?
get() = getTimelineSyncTag(accountKeys)
override val filterScopes: Int
get() = FilterScope.PUBLIC_TIMELINE
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
linkHandlerTitle = getString(R.string.title_network_public_timeline)
}
override val readPositionTagWithArguments: String?
get() {
val tabPosition = arguments.getInt(EXTRA_TAB_POSITION, -1)
if (tabPosition < 0) return null
return "networkpublic_timeline"
override fun updateRefreshState() {
val twitter = twitterWrapper
refreshing = twitter.isStatusTimelineRefreshing(contentUri)
}
override fun getStatuses(param: RefreshTaskParam): Boolean {
val task = GetNetworkPublicTimelineTask(context)
task.params = param
TaskStarter.execute(task)
return true
}
override fun processWhere(where: Expression, whereArgs: Array<String>): ParameterizedExpression {
val arguments = arguments
if (arguments != null) {
val extras = arguments.getParcelable<HomeTabExtras?>(IntentConstants.EXTRA_EXTRAS)
if (extras != null) {
val expressions = ArrayList<Expression>()
val expressionArgs = ArrayList<String>()
Collections.addAll(expressionArgs, *whereArgs)
expressions.add(where)
DataStoreUtils.processTabExtras(expressions, expressionArgs, extras)
val expression = Expression.and(*expressions.toTypedArray())
return ParameterizedExpression(expression, expressionArgs.toTypedArray())
}
}
return super.processWhere(where, whereArgs)
}
companion object {
fun getTimelineSyncTag(accountKeys: Array<UserKey>): String {
return "${ReadPositionTag.NETWORK_PUBLIC_TIMELINE}_${accountKeys.sorted().joinToString(",")}"
}
override fun onCreateStatusesLoader(context: Context, args: Bundle,
fromUser: Boolean): Loader<List<ParcelableStatus>?> {
refreshing = true
val data = adapterData
val accountKey = Utils.getAccountKey(context, args)
val tabPosition = args.getInt(EXTRA_TAB_POSITION, -1)
val loadingMore = args.getBoolean(EXTRA_LOADING_MORE, false)
return NetworkPublicTimelineLoader(context, accountKey, data, savedStatusesFileArgs,
tabPosition, fromUser, loadingMore)
}
}

View File

@ -19,45 +19,86 @@
package org.mariotaku.twidere.fragment.statuses
import android.content.Context
import android.os.Bundle
import android.support.v4.content.Loader
import org.mariotaku.twidere.TwidereConstants.*
import org.mariotaku.twidere.fragment.ParcelableStatusesFragment
import org.mariotaku.twidere.loader.statuses.PublicTimelineLoader
import org.mariotaku.twidere.model.ParcelableStatus
import org.mariotaku.twidere.util.Utils
import org.mariotaku.abstask.library.TaskStarter
import org.mariotaku.sqliteqb.library.Expression
import org.mariotaku.twidere.R
import org.mariotaku.twidere.annotation.FilterScope
import org.mariotaku.twidere.annotation.ReadPositionTag
import org.mariotaku.twidere.constant.IntentConstants.EXTRA_EXTRAS
import org.mariotaku.twidere.extension.linkHandlerTitle
import org.mariotaku.twidere.fragment.CursorStatusesFragment
import org.mariotaku.twidere.model.ParameterizedExpression
import org.mariotaku.twidere.model.RefreshTaskParam
import org.mariotaku.twidere.model.UserKey
import org.mariotaku.twidere.model.tab.extra.HomeTabExtras
import org.mariotaku.twidere.provider.TwidereDataStore.Statuses
import org.mariotaku.twidere.task.statuses.GetPublicTimelineTask
import org.mariotaku.twidere.util.DataStoreUtils
import org.mariotaku.twidere.util.ErrorInfoStore
import java.util.*
/**
* Created by mariotaku on 14/12/2.
*/
class PublicTimelineFragment : ParcelableStatusesFragment() {
class PublicTimelineFragment : CursorStatusesFragment() {
override val savedStatusesFileArgs: Array<String>?
get() {
val accountKey = Utils.getAccountKey(context, arguments)
val result = ArrayList<String>()
result.add(AUTHORITY_PUBLIC_TIMELINE)
result.add("account=$accountKey")
return result.toTypedArray()
override val errorInfoKey = ErrorInfoStore.KEY_PUBLIC_TIMELINE
override val contentUri = Statuses.Public.CONTENT_URI
override val notificationType = 0
override val isFilterEnabled = true
override val readPositionTag = ReadPositionTag.PUBLIC_TIMELINE
override val timelineSyncTag: String?
get() = getTimelineSyncTag(accountKeys)
override val filterScopes: Int
get() = FilterScope.PUBLIC_TIMELINE
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
linkHandlerTitle = getString(R.string.title_public_timeline)
}
override val readPositionTagWithArguments: String?
get() {
val tabPosition = arguments.getInt(EXTRA_TAB_POSITION, -1)
if (tabPosition < 0) return null
return "public_timeline"
override fun updateRefreshState() {
val twitter = twitterWrapper
refreshing = twitter.isStatusTimelineRefreshing(contentUri)
}
override fun getStatuses(param: RefreshTaskParam): Boolean {
val task = GetPublicTimelineTask(context)
task.params = param
TaskStarter.execute(task)
return true
}
override fun processWhere(where: Expression, whereArgs: Array<String>): ParameterizedExpression {
val arguments = arguments
if (arguments != null) {
val extras = arguments.getParcelable<HomeTabExtras?>(EXTRA_EXTRAS)
if (extras != null) {
val expressions = ArrayList<Expression>()
val expressionArgs = ArrayList<String>()
Collections.addAll(expressionArgs, *whereArgs)
expressions.add(where)
DataStoreUtils.processTabExtras(expressions, expressionArgs, extras)
val expression = Expression.and(*expressions.toTypedArray())
return ParameterizedExpression(expression, expressionArgs.toTypedArray())
}
}
return super.processWhere(where, whereArgs)
}
companion object {
fun getTimelineSyncTag(accountKeys: Array<UserKey>): String {
return "${ReadPositionTag.PUBLIC_TIMELINE}_${accountKeys.sorted().joinToString(",")}"
}
override fun onCreateStatusesLoader(context: Context, args: Bundle,
fromUser: Boolean): Loader<List<ParcelableStatus>?> {
refreshing = true
val data = adapterData
val accountKey = Utils.getAccountKey(context, args)
val tabPosition = args.getInt(EXTRA_TAB_POSITION, -1)
val loadingMore = args.getBoolean(EXTRA_LOADING_MORE, false)
return PublicTimelineLoader(context, accountKey, data, savedStatusesFileArgs, tabPosition,
fromUser, loadingMore)
}
}

View File

@ -22,7 +22,11 @@ package org.mariotaku.twidere.fragment.statuses
import android.content.Context
import android.os.Bundle
import android.support.v4.content.Loader
import org.mariotaku.kpreferences.get
import org.mariotaku.twidere.R
import org.mariotaku.twidere.TwidereConstants.*
import org.mariotaku.twidere.constant.iWantMyStarsBackKey
import org.mariotaku.twidere.extension.linkHandlerTitle
import org.mariotaku.twidere.fragment.ParcelableStatusesFragment
import org.mariotaku.twidere.loader.statuses.UserFavoritesLoader
import org.mariotaku.twidere.model.ParcelableStatus
@ -72,6 +76,15 @@ class UserFavoritesFragment : ParcelableStatusesFragment() {
return sb.toString()
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
linkHandlerTitle = if (preferences[iWantMyStarsBackKey]) {
getString(R.string.title_favorites)
} else {
getString(R.string.title_likes)
}
}
override fun onCreateStatusesLoader(context: Context, args: Bundle, fromUser: Boolean):
Loader<List<ParcelableStatus>?> {
refreshing = true

View File

@ -22,8 +22,10 @@ package org.mariotaku.twidere.fragment.statuses
import android.content.Context
import android.os.Bundle
import android.support.v4.content.Loader
import org.mariotaku.twidere.R
import org.mariotaku.twidere.TwidereConstants
import org.mariotaku.twidere.constant.IntentConstants.*
import org.mariotaku.twidere.extension.linkHandlerTitle
import org.mariotaku.twidere.fragment.ParcelableStatusesFragment
import org.mariotaku.twidere.loader.statuses.UserListTimelineLoader
import org.mariotaku.twidere.model.ParcelableStatus
@ -88,6 +90,11 @@ class UserListTimelineFragment : ParcelableStatusesFragment() {
return sb.toString()
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
linkHandlerTitle = getString(R.string.list_timeline)
}
override fun onCreateStatusesLoader(context: Context, args: Bundle, fromUser: Boolean):
Loader<List<ParcelableStatus>?> {
refreshing = true

View File

@ -22,7 +22,9 @@ package org.mariotaku.twidere.fragment.statuses
import android.content.Context
import android.os.Bundle
import android.support.v4.content.Loader
import org.mariotaku.twidere.R
import org.mariotaku.twidere.constant.IntentConstants.*
import org.mariotaku.twidere.extension.linkHandlerTitle
import org.mariotaku.twidere.fragment.AbsMediaStatusesFragment
import org.mariotaku.twidere.loader.statuses.MediaTimelineLoader
import org.mariotaku.twidere.model.ParcelableStatus
@ -33,6 +35,11 @@ import org.mariotaku.twidere.model.UserKey
*/
class UserMediaTimelineFragment : AbsMediaStatusesFragment() {
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
linkHandlerTitle = getString(R.string.media)
}
override fun onCreateStatusesLoader(context: Context, args: Bundle, fromUser: Boolean):
Loader<List<ParcelableStatus>?> {
val accountKey = args.getParcelable<UserKey?>(EXTRA_ACCOUNT_KEY)

View File

@ -22,7 +22,9 @@ package org.mariotaku.twidere.fragment.statuses
import android.content.Context
import android.os.Bundle
import android.support.v4.content.Loader
import org.mariotaku.twidere.R
import org.mariotaku.twidere.TwidereConstants.*
import org.mariotaku.twidere.extension.linkHandlerTitle
import org.mariotaku.twidere.loader.statuses.UserMentionsLoader
import org.mariotaku.twidere.model.ParcelableStatus
import org.mariotaku.twidere.model.UserKey
@ -42,6 +44,11 @@ class UserMentionsFragment : StatusesSearchFragment() {
return result.toTypedArray()
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
linkHandlerTitle = getString(R.string.user_mentions)
}
override fun onCreateStatusesLoader(context: Context,
args: Bundle,
fromUser: Boolean): Loader<List<ParcelableStatus>?> {

View File

@ -31,6 +31,7 @@ import org.mariotaku.twidere.R
import org.mariotaku.twidere.TwidereConstants.*
import org.mariotaku.twidere.constant.userTimelineFilterKey
import org.mariotaku.twidere.extension.applyTheme
import org.mariotaku.twidere.extension.linkHandlerTitle
import org.mariotaku.twidere.extension.onShow
import org.mariotaku.twidere.fragment.BaseDialogFragment
import org.mariotaku.twidere.fragment.ParcelableStatusesFragment
@ -100,6 +101,11 @@ class UserTimelineFragment : ParcelableStatusesFragment() {
override val timelineFilter: TimelineFilter?
get() = if (enableTimelineFilter) preferences[userTimelineFilterKey] else null
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
linkHandlerTitle = getString(R.string.title_statuses)
}
override fun onCreateStatusesLoader(context: Context, args: Bundle, fromUser: Boolean):
Loader<List<ParcelableStatus>?> {
refreshing = true

View File

@ -1,7 +1,7 @@
/*
* Twidere - Twitter client for Android
*
* Copyright (C) 2012-2014 Mariotaku Lee <mariotaku.lee@gmail.com>
* 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
@ -17,18 +17,21 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.mariotaku.twidere.fragment
package org.mariotaku.twidere.fragment.userlist
import android.os.Bundle
import org.mariotaku.twidere.R
import org.mariotaku.twidere.adapter.SupportTabsAdapter
import org.mariotaku.twidere.extension.linkHandlerTitle
import org.mariotaku.twidere.fragment.AbsToolbarTabPagesFragment
class ListsFragment : AbsToolbarTabPagesFragment() {
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
setHasOptionsMenu(true)
linkHandlerTitle = getString(R.string.user_lists)
}
override fun addTabs(adapter: SupportTabsAdapter) {

View File

@ -1,7 +1,7 @@
/*
* Twidere - Twitter client for Android
*
* Copyright (C) 2012-2014 Mariotaku Lee <mariotaku.lee@gmail.com>
* 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
@ -17,7 +17,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.mariotaku.twidere.fragment
package org.mariotaku.twidere.fragment.userlist
import android.app.Activity
import android.app.Dialog
@ -53,8 +53,10 @@ import org.mariotaku.twidere.adapter.SupportTabsAdapter
import org.mariotaku.twidere.app.TwidereApplication
import org.mariotaku.twidere.constant.newDocumentApiKey
import org.mariotaku.twidere.extension.applyTheme
import org.mariotaku.twidere.extension.linkHandlerTitle
import org.mariotaku.twidere.extension.model.api.microblog.toParcelable
import org.mariotaku.twidere.extension.onShow
import org.mariotaku.twidere.fragment.*
import org.mariotaku.twidere.fragment.iface.IBaseFragment.SystemWindowInsetsCallback
import org.mariotaku.twidere.fragment.iface.SupportFragmentCallback
import org.mariotaku.twidere.fragment.statuses.UserListTimelineFragment
@ -78,30 +80,34 @@ class UserListFragment : AbsToolbarTabPagesFragment(), OnClickListener,
var userList: ParcelableUserList? = null
private set
fun displayUserList(userList: ParcelableUserList?) {
val activity = activity ?: return
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
linkHandlerTitle = getString(R.string.title_user_list)
val activity = activity
setHasOptionsMenu(true)
Utils.setNdefPushMessageCallback(activity, CreateNdefMessageCallback {
val userList = userList ?: return@CreateNdefMessageCallback null
NdefMessage(arrayOf(NdefRecord.createUri(LinkCreator.getTwitterUserListLink(userList.user_screen_name, userList.name))))
})
getUserListInfo(false)
}
override fun onStart() {
super.onStart()
bus.register(this)
}
override fun onStop() {
bus.unregister(this)
super.onStop()
}
override fun onDestroyView() {
userList = null
loaderManager.destroyLoader(0)
this.userList = userList
if (userList != null) {
activity.title = userList.name
} else {
activity.setTitle(R.string.title_user_list)
}
activity.invalidateOptionsMenu()
}
fun getUserListInfo(omitIntentExtra: Boolean) {
val lm = loaderManager
lm.destroyLoader(0)
val args = Bundle(arguments)
args.putBoolean(EXTRA_OMIT_INTENT_EXTRA, omitIntentExtra)
if (!userListLoaderInitialized) {
lm.initLoader(0, args, this)
userListLoaderInitialized = true
} else {
lm.restartLoader(0, args, this)
}
super.onDestroyView()
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
@ -128,19 +134,6 @@ class UserListFragment : AbsToolbarTabPagesFragment(), OnClickListener,
super.onActivityResult(requestCode, resultCode, data)
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
val activity = activity
setHasOptionsMenu(true)
Utils.setNdefPushMessageCallback(activity, CreateNdefMessageCallback {
val userList = userList ?: return@CreateNdefMessageCallback null
NdefMessage(arrayOf(NdefRecord.createUri(LinkCreator.getTwitterUserListLink(userList.user_screen_name, userList.name))))
})
getUserListInfo(false)
}
override fun addTabs(adapter: SupportTabsAdapter) {
val args = arguments
val tabArgs = Bundle()
@ -163,22 +156,6 @@ class UserListFragment : AbsToolbarTabPagesFragment(), OnClickListener,
adapter.add(cls = UserListSubscribersFragment::class.java, args = tabArgs, name = getString(R.string.title_userlist_subscribers))
}
override fun onStart() {
super.onStart()
bus.register(this)
}
override fun onStop() {
bus.unregister(this)
super.onStop()
}
override fun onDestroyView() {
userList = null
loaderManager.destroyLoader(0)
super.onDestroyView()
}
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
inflater.inflate(R.menu.menu_user_list, menu)
}
@ -339,6 +316,32 @@ class UserListFragment : AbsToolbarTabPagesFragment(), OnClickListener,
}
}
fun displayUserList(userList: ParcelableUserList?) {
val activity = activity ?: return
loaderManager.destroyLoader(0)
this.userList = userList
if (userList != null) {
linkHandlerTitle = userList.name
} else {
linkHandlerTitle = getString(R.string.title_user_list)
}
activity.invalidateOptionsMenu()
}
fun getUserListInfo(omitIntentExtra: Boolean) {
val lm = loaderManager
lm.destroyLoader(0)
val args = Bundle(arguments)
args.putBoolean(EXTRA_OMIT_INTENT_EXTRA, omitIntentExtra)
if (!userListLoaderInitialized) {
lm.initLoader(0, args, this)
userListLoaderInitialized = true
} else {
lm.restartLoader(0, args, this)
}
}
internal class ParcelableUserListLoader(
context: Context,
private val omitIntentExtra: Boolean,

View File

@ -1,7 +1,7 @@
/*
* Twidere - Twitter client for Android
*
* Copyright (C) 2012-2014 Mariotaku Lee <mariotaku.lee@gmail.com>
* 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
@ -17,18 +17,26 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.mariotaku.twidere.fragment
package org.mariotaku.twidere.fragment.userlist
import android.content.Context
import android.os.Bundle
import android.support.v4.content.Loader
import org.mariotaku.twidere.R
import org.mariotaku.twidere.constant.IntentConstants.*
import org.mariotaku.twidere.extension.linkHandlerTitle
import org.mariotaku.twidere.fragment.ParcelableUserListsFragment
import org.mariotaku.twidere.loader.userlists.UserListMembershipsLoader
import org.mariotaku.twidere.model.ParcelableUserList
import org.mariotaku.twidere.model.UserKey
class UserListMembershipsFragment : ParcelableUserListsFragment() {
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
linkHandlerTitle = getString(R.string.lists_following_user)
}
override fun onCreateUserListsLoader(context: Context,
args: Bundle, fromUser: Boolean): Loader<List<ParcelableUserList>> {
val accountKey = args.getParcelable<UserKey?>(EXTRA_ACCOUNT_KEY)

View File

@ -1,7 +1,7 @@
/*
* Twidere - Twitter client for Android
*
* Copyright (C) 2012-2014 Mariotaku Lee <mariotaku.lee@gmail.com>
* 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
@ -17,12 +17,13 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.mariotaku.twidere.fragment
package org.mariotaku.twidere.fragment.userlist
import android.content.Context
import android.os.Bundle
import android.support.v4.content.Loader
import org.mariotaku.twidere.constant.IntentConstants.*
import org.mariotaku.twidere.fragment.ParcelableUserListsFragment
import org.mariotaku.twidere.loader.userlists.UserListSubscriptionsLoader
import org.mariotaku.twidere.model.ParcelableUserList
import org.mariotaku.twidere.model.UserKey

View File

@ -1,7 +1,7 @@
/*
* Twidere - Twitter client for Android
*
* Copyright (C) 2012-2014 Mariotaku Lee <mariotaku.lee@gmail.com>
* 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
@ -17,7 +17,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.mariotaku.twidere.fragment
package org.mariotaku.twidere.fragment.userlist
import android.content.Context
import android.os.Bundle
@ -29,6 +29,8 @@ import com.squareup.otto.Subscribe
import org.mariotaku.ktextension.setItemAvailability
import org.mariotaku.twidere.R
import org.mariotaku.twidere.constant.IntentConstants.*
import org.mariotaku.twidere.fragment.CreateUserListDialogFragment
import org.mariotaku.twidere.fragment.ParcelableUserListsFragment
import org.mariotaku.twidere.loader.userlists.UserListOwnershipsLoader
import org.mariotaku.twidere.model.ParcelableUserList
import org.mariotaku.twidere.model.UserKey

View File

@ -23,10 +23,12 @@ import android.annotation.SuppressLint
import android.content.Context
import android.os.Bundle
import com.bumptech.glide.RequestManager
import org.mariotaku.twidere.R
import org.mariotaku.twidere.TwidereConstants.USER_TYPE_FANFOU_COM
import org.mariotaku.twidere.adapter.ParcelableUsersAdapter
import org.mariotaku.twidere.adapter.iface.IUsersAdapter
import org.mariotaku.twidere.constant.IntentConstants.EXTRA_ACCOUNT_KEY
import org.mariotaku.twidere.extension.linkHandlerTitle
import org.mariotaku.twidere.fragment.ParcelableUsersFragment
import org.mariotaku.twidere.loader.users.AbsRequestUsersLoader
import org.mariotaku.twidere.loader.users.IncomingFriendshipsLoader
@ -38,6 +40,11 @@ import org.mariotaku.twidere.view.holder.UserViewHolder
class IncomingFriendshipsFragment : ParcelableUsersFragment(), IUsersAdapter.RequestClickListener {
override val showFollow: Boolean = false
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
linkHandlerTitle = getString(R.string.incoming_friendships)
}
override fun onCreateUsersLoader(context: Context, args: Bundle, fromUser: Boolean):
AbsRequestUsersLoader {
val accountKey = args.getParcelable<UserKey?>(EXTRA_ACCOUNT_KEY)

View File

@ -21,7 +21,9 @@ package org.mariotaku.twidere.fragment.users
import android.content.Context
import android.os.Bundle
import org.mariotaku.twidere.R
import org.mariotaku.twidere.constant.IntentConstants.EXTRA_ACCOUNT_KEY
import org.mariotaku.twidere.extension.linkHandlerTitle
import org.mariotaku.twidere.fragment.ParcelableUsersFragment
import org.mariotaku.twidere.loader.users.AbsRequestUsersLoader
import org.mariotaku.twidere.loader.users.MutesUsersLoader
@ -30,6 +32,11 @@ import org.mariotaku.twidere.model.event.FriendshipTaskEvent
class MutesUsersListFragment : ParcelableUsersFragment() {
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
linkHandlerTitle = getString(R.string.action_twitter_muted_users)
}
override fun onCreateUsersLoader(context: Context, args: Bundle, fromUser: Boolean):
AbsRequestUsersLoader {
val accountKey = args.getParcelable<UserKey?>(EXTRA_ACCOUNT_KEY)

View File

@ -22,16 +22,28 @@ package org.mariotaku.twidere.fragment.users
import android.content.Context
import android.os.Bundle
import com.bumptech.glide.RequestManager
import org.mariotaku.kpreferences.get
import org.mariotaku.twidere.R
import org.mariotaku.twidere.adapter.ParcelableUsersAdapter
import org.mariotaku.twidere.adapter.iface.ILoadMoreSupportAdapter
import org.mariotaku.twidere.constant.IntentConstants.EXTRA_ACCOUNT_KEY
import org.mariotaku.twidere.constant.IntentConstants.EXTRA_STATUS_ID
import org.mariotaku.twidere.constant.iWantMyStarsBackKey
import org.mariotaku.twidere.extension.linkHandlerTitle
import org.mariotaku.twidere.fragment.ParcelableUsersFragment
import org.mariotaku.twidere.loader.users.AbsRequestUsersLoader
import org.mariotaku.twidere.loader.users.StatusFavoritersLoader
import org.mariotaku.twidere.model.UserKey
class StatusFavoritersListFragment : ParcelableUsersFragment() {
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
linkHandlerTitle = if (preferences[iWantMyStarsBackKey]) {
getString(R.string.title_users_favorited_this)
} else {
getString(R.string.title_users_liked_this)
}
}
override fun onCreateUsersLoader(context: Context, args: Bundle, fromUser: Boolean):
AbsRequestUsersLoader {

View File

@ -21,8 +21,10 @@ package org.mariotaku.twidere.fragment.users
import android.content.Context
import android.os.Bundle
import org.mariotaku.twidere.R
import org.mariotaku.twidere.constant.IntentConstants.EXTRA_ACCOUNT_KEY
import org.mariotaku.twidere.constant.IntentConstants.EXTRA_STATUS_ID
import org.mariotaku.twidere.extension.linkHandlerTitle
import org.mariotaku.twidere.fragment.ParcelableUsersFragment
import org.mariotaku.twidere.loader.users.AbsRequestUsersLoader
import org.mariotaku.twidere.loader.users.StatusRetweetersLoader
@ -30,6 +32,11 @@ import org.mariotaku.twidere.model.UserKey
class StatusRetweetersListFragment : ParcelableUsersFragment() {
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
linkHandlerTitle = getString(R.string.title_users_retweeted_this)
}
override fun onCreateUsersLoader(context: Context, args: Bundle, fromUser: Boolean):
AbsRequestUsersLoader {
val accountKey = args.getParcelable<UserKey?>(EXTRA_ACCOUNT_KEY)

View File

@ -21,7 +21,9 @@ package org.mariotaku.twidere.fragment.users
import android.content.Context
import android.os.Bundle
import org.mariotaku.twidere.R
import org.mariotaku.twidere.constant.IntentConstants.EXTRA_ACCOUNT_KEY
import org.mariotaku.twidere.extension.linkHandlerTitle
import org.mariotaku.twidere.fragment.ParcelableUsersFragment
import org.mariotaku.twidere.loader.users.AbsRequestUsersLoader
import org.mariotaku.twidere.loader.users.UserBlocksLoader
@ -30,6 +32,11 @@ import org.mariotaku.twidere.model.event.FriendshipTaskEvent
class UserBlocksListFragment : ParcelableUsersFragment() {
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
linkHandlerTitle = getString(R.string.title_blocked_users)
}
override fun onCreateUsersLoader(context: Context, args: Bundle, fromUser: Boolean):
AbsRequestUsersLoader {
val accountKey = args.getParcelable<UserKey?>(EXTRA_ACCOUNT_KEY)

View File

@ -21,7 +21,9 @@ package org.mariotaku.twidere.fragment.users
import android.content.Context
import android.os.Bundle
import org.mariotaku.twidere.R
import org.mariotaku.twidere.constant.IntentConstants.*
import org.mariotaku.twidere.extension.linkHandlerTitle
import org.mariotaku.twidere.fragment.ParcelableUsersFragment
import org.mariotaku.twidere.loader.users.AbsRequestUsersLoader
import org.mariotaku.twidere.loader.users.UserFollowersLoader
@ -30,6 +32,11 @@ import org.mariotaku.twidere.model.event.FriendshipTaskEvent
class UserFollowersFragment : ParcelableUsersFragment() {
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
linkHandlerTitle = getString(R.string.title_followers)
}
override fun onCreateUsersLoader(context: Context, args: Bundle, fromUser: Boolean):
AbsRequestUsersLoader {
val accountKey = args.getParcelable<UserKey?>(EXTRA_ACCOUNT_KEY)

View File

@ -21,7 +21,9 @@ package org.mariotaku.twidere.fragment.users
import android.content.Context
import android.os.Bundle
import org.mariotaku.twidere.R
import org.mariotaku.twidere.constant.IntentConstants.*
import org.mariotaku.twidere.extension.linkHandlerTitle
import org.mariotaku.twidere.fragment.ParcelableUsersFragment
import org.mariotaku.twidere.loader.users.AbsRequestUsersLoader
import org.mariotaku.twidere.loader.users.UserFriendsLoader
@ -30,6 +32,11 @@ import org.mariotaku.twidere.model.event.FriendshipTaskEvent
class UserFriendsFragment : ParcelableUsersFragment() {
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
linkHandlerTitle = getString(R.string.title_following)
}
override fun onCreateUsersLoader(context: Context, args: Bundle, fromUser: Boolean):
AbsRequestUsersLoader {
val accountKey = args.getParcelable<UserKey?>(EXTRA_ACCOUNT_KEY)

View File

@ -31,9 +31,10 @@ import org.mariotaku.kpreferences.get
import org.mariotaku.twidere.R
import org.mariotaku.twidere.constant.IntentConstants.*
import org.mariotaku.twidere.constant.nameFirstKey
import org.mariotaku.twidere.extension.linkHandlerTitle
import org.mariotaku.twidere.fragment.DeleteUserListMembersDialogFragment
import org.mariotaku.twidere.fragment.ParcelableUsersFragment
import org.mariotaku.twidere.fragment.UserListFragment
import org.mariotaku.twidere.fragment.userlist.UserListFragment
import org.mariotaku.twidere.loader.users.AbsRequestUsersLoader
import org.mariotaku.twidere.loader.users.UserListMembersLoader
import org.mariotaku.twidere.model.ParcelableUserList
@ -57,6 +58,7 @@ class UserListMembersFragment : ParcelableUsersFragment() {
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
linkHandlerTitle = getString(R.string.list_members)
registerForContextMenu(recyclerView)
}

View File

@ -21,7 +21,9 @@ package org.mariotaku.twidere.fragment.users
import android.content.Context
import android.os.Bundle
import org.mariotaku.twidere.R
import org.mariotaku.twidere.constant.IntentConstants.*
import org.mariotaku.twidere.extension.linkHandlerTitle
import org.mariotaku.twidere.fragment.ParcelableUsersFragment
import org.mariotaku.twidere.loader.users.AbsRequestUsersLoader
import org.mariotaku.twidere.loader.users.UserListSubscribersLoader
@ -29,6 +31,11 @@ import org.mariotaku.twidere.model.UserKey
class UserListSubscribersFragment : ParcelableUsersFragment() {
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
linkHandlerTitle = getString(R.string.list_subscribers)
}
override fun onCreateUsersLoader(context: Context, args: Bundle, fromUser: Boolean):
AbsRequestUsersLoader {
val listId = args.getString(EXTRA_LIST_ID)

View File

@ -41,7 +41,7 @@ import org.mariotaku.twidere.model.pagination.PaginatedList
import org.mariotaku.twidere.model.pagination.Pagination
import org.mariotaku.twidere.model.pagination.SinceMaxPagination
import org.mariotaku.twidere.model.util.AccountUtils
import org.mariotaku.twidere.task.twitter.GetStatusesTask
import org.mariotaku.twidere.task.statuses.GetStatusesTask
import org.mariotaku.twidere.util.DebugLog
import org.mariotaku.twidere.util.UserColorNameManager
import org.mariotaku.twidere.util.cache.JsonCache

View File

@ -6,7 +6,7 @@ import org.mariotaku.twidere.extension.model.draftActionTypeString
import org.mariotaku.twidere.extension.model.parcelableMediaTypeString
import org.mariotaku.twidere.model.Draft
import org.mariotaku.twidere.model.ParcelableMedia
import org.mariotaku.twidere.task.twitter.UpdateStatusTask
import org.mariotaku.twidere.task.status.UpdateStatusTask
import org.mariotaku.twidere.util.Analyzer
import java.io.IOException

View File

@ -64,7 +64,7 @@ import org.mariotaku.twidere.model.util.ParcelableStatusUpdateUtils
import org.mariotaku.twidere.provider.TwidereDataStore.Drafts
import org.mariotaku.twidere.task.CreateFavoriteTask
import org.mariotaku.twidere.task.RetweetStatusTask
import org.mariotaku.twidere.task.twitter.UpdateStatusTask
import org.mariotaku.twidere.task.status.UpdateStatusTask
import org.mariotaku.twidere.task.twitter.message.SendMessageTask
import org.mariotaku.twidere.util.deleteDrafts
import java.io.IOException

View File

@ -287,10 +287,9 @@ class StreamingService : BaseService() {
} else {
parcelableStatus.position_key = parcelableStatus.timestamp
}
parcelableStatus.inserted_date = currentTimeMillis
lastStatusTimestamps[0] = parcelableStatus.position_key
lastStatusTimestamps[1] = parcelableStatus.inserted_date
lastStatusTimestamps[1] = currentTimeMillis
val values = ObjectCursor.valuesCreatorFrom(ParcelableStatus::class.java)
.create(parcelableStatus)

View File

@ -32,7 +32,7 @@ import org.mariotaku.twidere.model.Draft
import org.mariotaku.twidere.model.UserKey
import org.mariotaku.twidere.model.util.AccountUtils
import org.mariotaku.twidere.provider.TwidereDataStore.Drafts
import org.mariotaku.twidere.task.twitter.UpdateStatusTask
import org.mariotaku.twidere.task.status.UpdateStatusTask
/**
* Created by mariotaku on 2017/4/20.

View File

@ -22,7 +22,7 @@ import org.mariotaku.twidere.model.draft.StatusObjectActionExtras
import org.mariotaku.twidere.model.event.FavoriteTaskEvent
import org.mariotaku.twidere.model.event.StatusListChangedEvent
import org.mariotaku.twidere.provider.TwidereDataStore.Statuses
import org.mariotaku.twidere.task.twitter.UpdateStatusTask
import org.mariotaku.twidere.task.status.UpdateStatusTask
import org.mariotaku.twidere.util.AsyncTwitterWrapper.Companion.calculateHashCode
import org.mariotaku.twidere.util.DataStoreUtils
import org.mariotaku.twidere.util.Utils

View File

@ -22,7 +22,7 @@ import org.mariotaku.twidere.model.draft.StatusObjectActionExtras
import org.mariotaku.twidere.model.event.StatusListChangedEvent
import org.mariotaku.twidere.model.event.StatusRetweetedEvent
import org.mariotaku.twidere.provider.TwidereDataStore.Statuses
import org.mariotaku.twidere.task.twitter.UpdateStatusTask
import org.mariotaku.twidere.task.status.UpdateStatusTask
import org.mariotaku.twidere.util.AsyncTwitterWrapper
import org.mariotaku.twidere.util.DataStoreUtils
import org.mariotaku.twidere.util.Utils

View File

@ -14,7 +14,7 @@ import org.mariotaku.twidere.model.ParcelableMedia
import org.mariotaku.twidere.model.ParcelableUser
import org.mariotaku.twidere.model.UserKey
import org.mariotaku.twidere.model.event.ProfileUpdatedEvent
import org.mariotaku.twidere.task.twitter.UpdateStatusTask
import org.mariotaku.twidere.task.status.UpdateStatusTask
import org.mariotaku.twidere.util.DebugLog
import java.io.IOException

View File

@ -17,7 +17,7 @@ import org.mariotaku.twidere.model.ParcelableMedia
import org.mariotaku.twidere.model.ParcelableUser
import org.mariotaku.twidere.model.UserKey
import org.mariotaku.twidere.model.event.ProfileUpdatedEvent
import org.mariotaku.twidere.task.twitter.UpdateStatusTask
import org.mariotaku.twidere.task.status.UpdateStatusTask
import org.mariotaku.twidere.util.DebugLog
import java.io.IOException

View File

@ -17,7 +17,7 @@ import org.mariotaku.twidere.model.ParcelableMedia
import org.mariotaku.twidere.model.ParcelableUser
import org.mariotaku.twidere.model.UserKey
import org.mariotaku.twidere.model.event.ProfileUpdatedEvent
import org.mariotaku.twidere.task.twitter.UpdateStatusTask
import org.mariotaku.twidere.task.status.UpdateStatusTask
import org.mariotaku.twidere.util.DebugLog
import java.io.IOException

View File

@ -1,4 +1,23 @@
package org.mariotaku.twidere.task.twitter
/*
* 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.task.status
import android.content.ContentResolver
import android.content.ContentValues
@ -69,7 +88,7 @@ import java.util.concurrent.TimeUnit
*/
class UpdateStatusTask(
context: Context,
internal val stateCallback: UpdateStatusTask.StateCallback
internal val stateCallback: StateCallback
) : BaseAbstractTask<Pair<ParcelableStatusUpdate, ScheduleInfo?>, UpdateStatusTask.UpdateStatusResult, Any?>(context) {
override fun doLongOperation(params: Pair<ParcelableStatusUpdate, ScheduleInfo?>): UpdateStatusResult {

View File

@ -0,0 +1,69 @@
/*
* 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.task.statuses
import android.content.Context
import android.net.Uri
import org.mariotaku.microblog.library.MicroBlog
import org.mariotaku.microblog.library.mastodon.Mastodon
import org.mariotaku.microblog.library.twitter.model.Paging
import org.mariotaku.microblog.library.twitter.model.Status
import org.mariotaku.twidere.alias.MastodonStatus
import org.mariotaku.twidere.annotation.FilterScope
import org.mariotaku.twidere.annotation.ReadPositionTag
import org.mariotaku.twidere.fragment.HomeTimelineFragment
import org.mariotaku.twidere.model.AccountDetails
import org.mariotaku.twidere.model.UserKey
import org.mariotaku.twidere.provider.TwidereDataStore.Statuses
import org.mariotaku.twidere.util.ErrorInfoStore
import org.mariotaku.twidere.util.sync.TimelineSyncManager
/**
* Created by mariotaku on 16/2/11.
*/
class GetHomeTimelineTask(context: Context) : GetStatusesTask(context) {
override val contentUri: Uri = Statuses.CONTENT_URI
override val filterScopes: Int = FilterScope.HOME
override val errorInfoKey: String = ErrorInfoStore.KEY_HOME_TIMELINE
override fun getTwitterStatuses(account: AccountDetails, twitter: MicroBlog, paging: Paging): List<Status> {
return twitter.getHomeTimeline(paging)
}
override fun getStatusNetStatuses(account: AccountDetails, statusNet: MicroBlog, paging: Paging): List<Status> {
return statusNet.getHomeTimeline(paging)
}
override fun getFanfouStatuses(account: AccountDetails, fanfou: MicroBlog, paging: Paging): List<Status> {
return fanfou.getHomeTimeline(paging)
}
override fun getMastodonStatuses(account: AccountDetails, mastodon: Mastodon, paging: Paging): List<MastodonStatus> {
return mastodon.getHomeTimeline(paging)
}
override fun syncFetchReadPosition(manager: TimelineSyncManager, accountKeys: Array<UserKey>) {
val tag = HomeTimelineFragment.getTimelineSyncTag(accountKeys)
manager.fetchSingle(ReadPositionTag.HOME_TIMELINE, tag)
}
}

View File

@ -0,0 +1,70 @@
/*
* 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.task.statuses
import android.content.Context
import android.net.Uri
import org.mariotaku.microblog.library.MicroBlog
import org.mariotaku.microblog.library.MicroBlogException
import org.mariotaku.microblog.library.mastodon.Mastodon
import org.mariotaku.microblog.library.twitter.model.Paging
import org.mariotaku.microblog.library.twitter.model.Status
import org.mariotaku.twidere.alias.MastodonStatus
import org.mariotaku.twidere.annotation.FilterScope
import org.mariotaku.twidere.annotation.ReadPositionTag
import org.mariotaku.twidere.fragment.statuses.NetworkPublicTimelineFragment
import org.mariotaku.twidere.model.AccountDetails
import org.mariotaku.twidere.model.UserKey
import org.mariotaku.twidere.provider.TwidereDataStore.Statuses
import org.mariotaku.twidere.util.ErrorInfoStore
import org.mariotaku.twidere.util.sync.TimelineSyncManager
/**
* Created by mariotaku on 16/2/11.
*/
class GetNetworkPublicTimelineTask(context: Context) : GetStatusesTask(context) {
override val contentUri: Uri = Statuses.NetworkPublic.CONTENT_URI
override val filterScopes: Int = FilterScope.PUBLIC_TIMELINE
override val errorInfoKey: String = ErrorInfoStore.KEY_NETWORK_PUBLIC_TIMELINE
override fun getTwitterStatuses(account: AccountDetails, twitter: MicroBlog, paging: Paging): List<Status> {
throw MicroBlogException("Network public timeline unsupported")
}
override fun getStatusNetStatuses(account: AccountDetails, statusNet: MicroBlog, paging: Paging): List<Status> {
return statusNet.getNetworkPublicTimeline(paging)
}
override fun getFanfouStatuses(account: AccountDetails, fanfou: MicroBlog, paging: Paging): List<Status> {
throw MicroBlogException("Network public timeline unsupported")
}
override fun getMastodonStatuses(account: AccountDetails, mastodon: Mastodon, paging: Paging): List<MastodonStatus> {
return mastodon.getPublicTimeline(paging, false)
}
override fun syncFetchReadPosition(manager: TimelineSyncManager, accountKeys: Array<UserKey>) {
val tag = NetworkPublicTimelineFragment.getTimelineSyncTag(accountKeys)
manager.fetchSingle(ReadPositionTag.NETWORK_PUBLIC_TIMELINE, tag)
}
}

View File

@ -0,0 +1,69 @@
/*
* 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.task.statuses
import android.content.Context
import android.net.Uri
import org.mariotaku.microblog.library.MicroBlog
import org.mariotaku.microblog.library.mastodon.Mastodon
import org.mariotaku.microblog.library.twitter.model.Paging
import org.mariotaku.microblog.library.twitter.model.Status
import org.mariotaku.twidere.alias.MastodonStatus
import org.mariotaku.twidere.annotation.FilterScope
import org.mariotaku.twidere.annotation.ReadPositionTag
import org.mariotaku.twidere.fragment.statuses.PublicTimelineFragment
import org.mariotaku.twidere.model.AccountDetails
import org.mariotaku.twidere.model.UserKey
import org.mariotaku.twidere.provider.TwidereDataStore.Statuses
import org.mariotaku.twidere.util.ErrorInfoStore
import org.mariotaku.twidere.util.sync.TimelineSyncManager
/**
* Created by mariotaku on 16/2/11.
*/
class GetPublicTimelineTask(context: Context) : GetStatusesTask(context) {
override val contentUri: Uri = Statuses.Public.CONTENT_URI
override val filterScopes: Int = FilterScope.PUBLIC_TIMELINE
override val errorInfoKey: String = ErrorInfoStore.KEY_PUBLIC_TIMELINE
override fun getTwitterStatuses(account: AccountDetails, twitter: MicroBlog, paging: Paging): List<Status> {
return twitter.getPublicTimeline(paging)
}
override fun getStatusNetStatuses(account: AccountDetails, statusNet: MicroBlog, paging: Paging): List<Status> {
return statusNet.getPublicTimeline(paging)
}
override fun getFanfouStatuses(account: AccountDetails, fanfou: MicroBlog, paging: Paging): List<Status> {
return fanfou.getPublicTimeline(paging)
}
override fun getMastodonStatuses(account: AccountDetails, mastodon: Mastodon, paging: Paging): List<MastodonStatus> {
return mastodon.getPublicTimeline(paging, true)
}
override fun syncFetchReadPosition(manager: TimelineSyncManager, accountKeys: Array<UserKey>) {
val tag = PublicTimelineFragment.getTimelineSyncTag(accountKeys)
manager.fetchSingle(ReadPositionTag.PUBLIC_TIMELINE, tag)
}
}

View File

@ -1,4 +1,23 @@
package org.mariotaku.twidere.task.twitter
/*
* 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.task.statuses
import android.accounts.AccountManager
import android.content.ContentValues
@ -6,25 +25,29 @@ import android.content.Context
import android.net.Uri
import org.mariotaku.abstask.library.TaskStarter
import org.mariotaku.kpreferences.get
import org.mariotaku.ktextension.addTo
import org.mariotaku.ktextension.toLongOr
import org.mariotaku.library.objectcursor.ObjectCursor
import org.mariotaku.microblog.library.MicroBlog
import org.mariotaku.microblog.library.MicroBlogException
import org.mariotaku.microblog.library.mastodon.Mastodon
import org.mariotaku.microblog.library.twitter.model.Paging
import org.mariotaku.microblog.library.twitter.model.Status
import org.mariotaku.sqliteqb.library.Columns
import org.mariotaku.sqliteqb.library.Expression
import org.mariotaku.twidere.R
import org.mariotaku.twidere.TwidereConstants.LOGTAG
import org.mariotaku.twidere.TwidereConstants.QUERY_PARAM_NOTIFY_CHANGE
import org.mariotaku.twidere.alias.MastodonStatus
import org.mariotaku.twidere.annotation.AccountType
import org.mariotaku.twidere.annotation.FilterScope
import org.mariotaku.twidere.constant.loadItemLimitKey
import org.mariotaku.twidere.exception.AccountNotFoundException
import org.mariotaku.twidere.extension.model.*
import org.mariotaku.twidere.extension.model.api.applyLoadLimit
import org.mariotaku.twidere.model.AccountDetails
import org.mariotaku.twidere.model.ParcelableStatus
import org.mariotaku.twidere.model.RefreshTaskParam
import org.mariotaku.twidere.model.UserKey
import org.mariotaku.twidere.extension.model.api.mastodon.toParcelable
import org.mariotaku.twidere.extension.model.api.toParcelable
import org.mariotaku.twidere.model.*
import org.mariotaku.twidere.model.event.GetStatusesTaskEvent
import org.mariotaku.twidere.model.task.GetTimelineResult
import org.mariotaku.twidere.model.util.AccountUtils
@ -48,6 +71,8 @@ abstract class GetStatusesTask(
) : BaseAbstractTask<RefreshTaskParam, List<Pair<GetTimelineResult<ParcelableStatus>?, Exception?>>,
(Boolean) -> Unit>(context) {
private val profileImageSize = context.getString(R.string.profile_image_size)
protected abstract val contentUri: Uri
@FilterScope
@ -129,10 +154,77 @@ abstract class GetStatusesTask(
}
@Throws(MicroBlogException::class)
protected abstract fun getStatuses(account: AccountDetails, paging: Paging): GetTimelineResult<ParcelableStatus>
protected fun getStatuses(account: AccountDetails, paging: Paging): GetTimelineResult<ParcelableStatus> {
when (account.type) {
AccountType.TWITTER -> {
val twitter = account.newMicroBlogInstance(context, MicroBlog::class.java)
val timeline = getTwitterStatuses(account, twitter, paging)
val statuses = timeline.map {
it.toParcelable(account, profileImageSize)
}
val hashtags = timeline.flatMap { status ->
status.entities?.hashtags?.map { it.text }.orEmpty()
}
return GetTimelineResult(account, statuses, extractMicroBlogUsers(timeline, account), hashtags)
}
AccountType.STATUSNET -> {
val statusnet = account.newMicroBlogInstance(context, MicroBlog::class.java)
val timeline = getStatusNetStatuses(account, statusnet, paging)
val statuses = timeline.map {
it.toParcelable(account, profileImageSize)
}
val hashtags = timeline.flatMap { status ->
status.entities?.hashtags?.map { it.text }.orEmpty()
}
return GetTimelineResult(account, statuses, extractMicroBlogUsers(timeline, account), hashtags)
}
AccountType.FANFOU -> {
val fanfou = account.newMicroBlogInstance(context, MicroBlog::class.java)
val timeline = getFanfouStatuses(account, fanfou, paging)
val statuses = timeline.map {
it.toParcelable(account, profileImageSize)
}
val hashtags = statuses.flatMap { status ->
return@flatMap status.extractFanfouHashtags()
}
return GetTimelineResult(account, statuses, extractMicroBlogUsers(timeline, account), hashtags)
}
AccountType.MASTODON -> {
val mastodon = account.newMicroBlogInstance(context, Mastodon::class.java)
val timeline = getMastodonStatuses(account, mastodon, paging)
return GetTimelineResult(account, timeline.map {
it.toParcelable(account)
}, timeline.flatMap { status ->
val mapResult = mutableListOf(status.account.toParcelable(account))
status.reblog?.account?.toParcelable(account)?.addTo(mapResult)
return@flatMap mapResult
}, timeline.flatMap { status ->
status.tags?.map { it.name }.orEmpty()
})
}
else -> throw UnsupportedOperationException()
}
}
protected abstract fun getTwitterStatuses(account: AccountDetails, twitter: MicroBlog, paging: Paging): List<Status>
protected abstract fun getStatusNetStatuses(account: AccountDetails, statusNet: MicroBlog, paging: Paging): List<Status>
protected abstract fun getFanfouStatuses(account: AccountDetails, fanfou: MicroBlog, paging: Paging): List<Status>
protected abstract fun getMastodonStatuses(account: AccountDetails, mastodon: Mastodon, paging: Paging): List<MastodonStatus>
protected abstract fun syncFetchReadPosition(manager: TimelineSyncManager, accountKeys: Array<UserKey>)
private fun extractMicroBlogUsers(timeline: List<Status>, account: AccountDetails): List<ParcelableUser> {
return timeline.flatMap { status ->
val mapResult = mutableListOf(status.user.toParcelable(account,
profileImageSize = profileImageSize))
status.retweetedStatus?.user?.toParcelable(account,
profileImageSize = profileImageSize)?.addTo(mapResult)
status.quotedStatus?.user?.toParcelable(account,
profileImageSize = profileImageSize)?.addTo(mapResult)
return@flatMap mapResult
}
}
private fun storeStatus(account: AccountDetails, statuses: List<ParcelableStatus>,
sinceId: String?, maxId: String?, sinceSortId: Long, maxSortId: Long,
loadItemLimit: Int, notify: Boolean): Int {
@ -156,7 +248,6 @@ abstract class GetStatusesTask(
statuses.forEachIndexed { i, status ->
status.position_key = getPositionKey(status.timestamp, status.sort_id, lastSortId,
sortDiff, i, statuses.size)
status.inserted_date = System.currentTimeMillis()
mediaPreloader.preloadStatus(status)
values[i] = creator.create(status)
if (minIdx == -1 || status < statuses[minIdx]) {

View File

@ -27,6 +27,7 @@ import org.mariotaku.twidere.model.task.GetTimelineResult
import org.mariotaku.twidere.model.util.AccountUtils
import org.mariotaku.twidere.provider.TwidereDataStore.Activities
import org.mariotaku.twidere.task.BaseAbstractTask
import org.mariotaku.twidere.task.statuses.GetStatusesTask
import org.mariotaku.twidere.util.DataStoreUtils
import org.mariotaku.twidere.util.DebugLog
import org.mariotaku.twidere.util.ErrorInfoStore
@ -154,7 +155,6 @@ abstract class GetActivitiesTask(
minPositionKey = activity.position_key
}
activity.inserted_date = System.currentTimeMillis()
valuesList.add(ObjectCursor.valuesCreatorFrom(ParcelableActivity::class.java)
.create(activity))
}

View File

@ -1,103 +0,0 @@
/*
* 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.task.twitter
import android.content.Context
import android.net.Uri
import org.mariotaku.ktextension.addTo
import org.mariotaku.microblog.library.MicroBlog
import org.mariotaku.microblog.library.MicroBlogException
import org.mariotaku.microblog.library.mastodon.Mastodon
import org.mariotaku.microblog.library.twitter.model.Paging
import org.mariotaku.twidere.R
import org.mariotaku.twidere.annotation.AccountType
import org.mariotaku.twidere.annotation.FilterScope
import org.mariotaku.twidere.annotation.ReadPositionTag
import org.mariotaku.twidere.extension.model.api.mastodon.toParcelable
import org.mariotaku.twidere.extension.model.api.toParcelable
import org.mariotaku.twidere.extension.model.extractFanfouHashtags
import org.mariotaku.twidere.extension.model.newMicroBlogInstance
import org.mariotaku.twidere.fragment.HomeTimelineFragment
import org.mariotaku.twidere.model.AccountDetails
import org.mariotaku.twidere.model.ParcelableStatus
import org.mariotaku.twidere.model.UserKey
import org.mariotaku.twidere.model.task.GetTimelineResult
import org.mariotaku.twidere.provider.TwidereDataStore.Statuses
import org.mariotaku.twidere.util.ErrorInfoStore
import org.mariotaku.twidere.util.sync.TimelineSyncManager
/**
* Created by mariotaku on 16/2/11.
*/
class GetHomeTimelineTask(context: Context) : GetStatusesTask(context) {
override val contentUri: Uri = Statuses.CONTENT_URI
override val filterScopes: Int = FilterScope.HOME
override val errorInfoKey: String = ErrorInfoStore.KEY_HOME_TIMELINE
private val profileImageSize = context.getString(R.string.profile_image_size)
@Throws(MicroBlogException::class)
override fun getStatuses(account: AccountDetails, paging: Paging): GetTimelineResult<ParcelableStatus> {
when (account.type) {
AccountType.MASTODON -> {
val mastodon = account.newMicroBlogInstance(context, Mastodon::class.java)
val timeline = mastodon.getHomeTimeline(paging)
return GetTimelineResult(account, timeline.map {
it.toParcelable(account)
}, timeline.flatMap { status ->
val mapResult = mutableListOf(status.account.toParcelable(account))
status.reblog?.account?.toParcelable(account)?.addTo(mapResult)
return@flatMap mapResult
}, timeline.flatMap { status ->
status.tags?.map { it.name }.orEmpty()
})
}
else -> {
val microBlog = account.newMicroBlogInstance(context, MicroBlog::class.java)
val timeline = microBlog.getHomeTimeline(paging)
val statuses = timeline.map {
it.toParcelable(account, profileImageSize)
}
val hashtags = if (account.type == AccountType.FANFOU) statuses.flatMap { status ->
return@flatMap status.extractFanfouHashtags()
} else timeline.flatMap { status ->
status.entities?.hashtags?.map { it.text }.orEmpty()
}
return GetTimelineResult(account, statuses, timeline.flatMap { status ->
val mapResult = mutableListOf(status.user.toParcelable(account,
profileImageSize = profileImageSize))
status.retweetedStatus?.user?.toParcelable(account,
profileImageSize = profileImageSize)?.addTo(mapResult)
status.quotedStatus?.user?.toParcelable(account,
profileImageSize = profileImageSize)?.addTo(mapResult)
return@flatMap mapResult
}, hashtags)
}
}
}
override fun syncFetchReadPosition(manager: TimelineSyncManager, accountKeys: Array<UserKey>) {
val tag = HomeTimelineFragment.getTimelineSyncTag(accountKeys)
manager.fetchSingle(ReadPositionTag.HOME_TIMELINE, tag)
}
}

View File

@ -41,8 +41,7 @@ import org.mariotaku.twidere.model.event.SendMessageTaskEvent
import org.mariotaku.twidere.model.util.ParcelableMessageUtils
import org.mariotaku.twidere.provider.TwidereDataStore.Messages.Conversations
import org.mariotaku.twidere.task.ExceptionHandlingAbstractTask
import org.mariotaku.twidere.task.twitter.UpdateStatusTask
import org.mariotaku.twidere.task.twitter.message.GetMessagesTask
import org.mariotaku.twidere.task.status.UpdateStatusTask
import org.mariotaku.twidere.task.twitter.message.GetMessagesTask.Companion.addConversation
import org.mariotaku.twidere.task.twitter.message.GetMessagesTask.Companion.addLocalConversations

View File

@ -52,7 +52,7 @@ import org.mariotaku.twidere.model.util.ParcelableRelationshipUtils
import org.mariotaku.twidere.provider.TwidereDataStore.*
import org.mariotaku.twidere.task.*
import org.mariotaku.twidere.task.twitter.GetActivitiesAboutMeTask
import org.mariotaku.twidere.task.twitter.GetHomeTimelineTask
import org.mariotaku.twidere.task.statuses.GetHomeTimelineTask
import org.mariotaku.twidere.task.twitter.GetSavedSearchesTask
import org.mariotaku.twidere.task.twitter.GetTrendsTask
import org.mariotaku.twidere.task.twitter.message.GetMessagesTask

View File

@ -113,6 +113,10 @@ object DataStoreUtils {
TABLE_ID_CACHED_HASHTAGS)
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, CachedRelationships.CONTENT_PATH,
TABLE_ID_CACHED_RELATIONSHIPS)
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, Statuses.Public.CONTENT_PATH,
TABLE_ID_PUBLIC_TIMELINE)
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, Statuses.NetworkPublic.CONTENT_PATH,
TABLE_ID_NETWORK_PUBLIC_TIMELINE)
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, SavedSearches.CONTENT_PATH,
TABLE_ID_SAVED_SEARCHES)
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, SearchHistory.CONTENT_PATH,
@ -453,6 +457,8 @@ object DataStoreUtils {
fun getTableNameById(id: Int): String? {
when (id) {
TABLE_ID_STATUSES -> return Statuses.TABLE_NAME
TABLE_ID_PUBLIC_TIMELINE -> return Statuses.Public.TABLE_NAME
TABLE_ID_NETWORK_PUBLIC_TIMELINE -> return Statuses.NetworkPublic.TABLE_NAME
TABLE_ID_ACTIVITIES_ABOUT_ME -> return Activities.AboutMe.TABLE_NAME
TABLE_ID_DRAFTS -> return Drafts.TABLE_NAME
TABLE_ID_FILTERED_USERS -> return Filters.Users.TABLE_NAME

View File

@ -84,6 +84,8 @@ class ErrorInfoStore(application: Context) {
val KEY_DIRECT_MESSAGES = "direct_messages"
val KEY_INTERACTIONS = "interactions"
val KEY_HOME_TIMELINE = "home_timeline"
val KEY_PUBLIC_TIMELINE = "public_timeline"
val KEY_NETWORK_PUBLIC_TIMELINE = "network_public_timeline"
val KEY_ACTIVITIES_BY_FRIENDS = "activities_by_friends"
val CODE_NO_DM_PERMISSION = 1

View File

@ -24,7 +24,7 @@ import org.mariotaku.twidere.provider.TwidereDataStore.Statuses
import org.mariotaku.twidere.task.filter.RefreshFiltersSubscriptionsTask
import org.mariotaku.twidere.task.filter.RefreshLaunchPresentationsTask
import org.mariotaku.twidere.task.twitter.GetActivitiesAboutMeTask
import org.mariotaku.twidere.task.twitter.GetHomeTimelineTask
import org.mariotaku.twidere.task.statuses.GetHomeTimelineTask
import org.mariotaku.twidere.task.twitter.message.GetMessagesTask
/**

View File

@ -49,8 +49,9 @@ class TwidereSQLiteOpenHelper(
) : SQLiteOpenHelper(context, name, null, version) {
override fun onCreate(db: SQLiteDatabase) {
createStatusesTables(db)
db.beginTransaction()
db.execSQL(createTable(Statuses.TABLE_NAME, Statuses.COLUMNS, Statuses.TYPES, true))
db.execSQL(createTable(Activities.AboutMe.TABLE_NAME, Activities.AboutMe.COLUMNS, Activities.AboutMe.TYPES, true))
db.execSQL(createTable(Drafts.TABLE_NAME, Drafts.COLUMNS, Drafts.TYPES, true))
db.setTransactionSuccessful()
@ -102,6 +103,16 @@ class TwidereSQLiteOpenHelper(
setupDefaultTabs(db)
}
private fun createStatusesTables(db: SQLiteDatabase) {
db.beginTransaction()
val tableNames = arrayOf(Statuses.TABLE_NAME, Statuses.Public.TABLE_NAME)
tableNames.forEach {
db.execSQL(createTable(it, Statuses.COLUMNS, Statuses.TYPES, true))
}
db.setTransactionSuccessful()
db.endTransaction()
}
private fun setupDefaultTabs(db: SQLiteDatabase) {
val creator = ObjectCursor.valuesCreatorFrom(Tab::class.java)
@ -225,8 +236,7 @@ class TwidereSQLiteOpenHelper(
db.execSQL(SQLQueryBuilder.dropIndex(true, "messages_inbox_index").sql)
db.execSQL(SQLQueryBuilder.dropIndex(true, "messages_outbox_index").sql)
}
safeUpgrade(db, Statuses.TABLE_NAME, Statuses.COLUMNS, Statuses.TYPES, true, null)
upgradeStatuses(db)
safeUpgrade(db, Activities.AboutMe.TABLE_NAME, Activities.AboutMe.COLUMNS,
Activities.AboutMe.TYPES, true, null)
migrateDrafts(db)
@ -263,6 +273,11 @@ class TwidereSQLiteOpenHelper(
db.endTransaction()
}
private fun upgradeStatuses(db: SQLiteDatabase) {
safeUpgrade(db, Statuses.TABLE_NAME, Statuses.COLUMNS, Statuses.TYPES, true, null)
safeUpgrade(db, Statuses.Public.TABLE_NAME, Statuses.COLUMNS, Statuses.TYPES, true, null)
}
private fun migrateDrafts(db: SQLiteDatabase) {
val draftsAlias = HashMap<String, String>()
draftsAlias.put(Drafts.MEDIA, "medias")

View File

@ -24,8 +24,8 @@ import android.content.Intent
import android.support.annotation.WorkerThread
import org.mariotaku.twidere.model.ParcelableStatusUpdate
import org.mariotaku.twidere.model.schedule.ScheduleInfo
import org.mariotaku.twidere.task.twitter.UpdateStatusTask
import org.mariotaku.twidere.task.twitter.UpdateStatusTask.PendingStatusUpdate
import org.mariotaku.twidere.task.status.UpdateStatusTask
import org.mariotaku.twidere.task.status.UpdateStatusTask.PendingStatusUpdate
import java.util.*
/**