mirror of
https://github.com/TwidereProject/Twidere-Android
synced 2025-02-17 04:00:48 +01:00
set user color improvements
This commit is contained in:
parent
21bc95e054
commit
3922219794
@ -152,7 +152,7 @@ public interface TwidereConstants extends SharedPreferenceConstants, IntentConst
|
||||
int REQUEST_EDIT_API = 5;
|
||||
int REQUEST_BROWSER_SIGN_IN = 6;
|
||||
int REQUEST_SET_COLOR = 7;
|
||||
int REQUEST_SAVE_FILE = 8;
|
||||
int REQUEST_SET_NICKNAME = 8;
|
||||
int REQUEST_EDIT_IMAGE = 9;
|
||||
int REQUEST_EXTENSION_COMPOSE = 10;
|
||||
int REQUEST_ADD_TAB = 11;
|
||||
|
@ -30,9 +30,9 @@ import com.hannesdorfmann.parcelableplease.annotation.ParcelableThisPlease;
|
||||
|
||||
import org.mariotaku.library.objectcursor.annotation.CursorField;
|
||||
import org.mariotaku.library.objectcursor.annotation.CursorObject;
|
||||
import org.mariotaku.twidere.model.util.LoganSquareCursorFieldConverter;
|
||||
import org.mariotaku.twidere.model.util.UserKeyConverter;
|
||||
import org.mariotaku.twidere.model.util.UserKeyCursorFieldConverter;
|
||||
import org.mariotaku.twidere.model.util.LoganSquareCursorFieldConverter;
|
||||
import org.mariotaku.twidere.model.util.UserKeysConverter;
|
||||
import org.mariotaku.twidere.model.util.UserKeysCursorFieldConverter;
|
||||
import org.mariotaku.twidere.provider.TwidereDataStore.Activities;
|
||||
@ -131,7 +131,39 @@ public class ParcelableActivity implements Comparable<ParcelableActivity>, Parce
|
||||
public boolean status_user_following;
|
||||
|
||||
@ParcelableThisPlease
|
||||
@JsonField(name = "account_color")
|
||||
@CursorField(Activities.ACCOUNT_COLOR)
|
||||
public int account_color;
|
||||
@ParcelableThisPlease
|
||||
@JsonField(name = "status_user_color")
|
||||
@CursorField(Activities.STATUS_USER_COLOR)
|
||||
public int status_user_color;
|
||||
@ParcelableThisPlease
|
||||
@JsonField(name = "status_quoted_user_color")
|
||||
@CursorField(Activities.STATUS_QUOTED_USER_COLOR)
|
||||
public int status_quoted_user_color;
|
||||
@ParcelableThisPlease
|
||||
@JsonField(name = "status_retweet_user_color")
|
||||
@CursorField(Activities.STATUS_RETWEET_USER_COLOR)
|
||||
public int status_retweet_user_color;
|
||||
|
||||
@ParcelableThisPlease
|
||||
@JsonField(name = "status_user_nickname")
|
||||
@CursorField(Activities.STATUS_USER_NICKNAME)
|
||||
public String status_user_nickname;
|
||||
@ParcelableThisPlease
|
||||
@JsonField(name = "status_quoted_user_nickname")
|
||||
@CursorField(Activities.STATUS_QUOTED_USER_NICKNAME)
|
||||
public String status_quoted_user_nickname;
|
||||
@ParcelableThisPlease
|
||||
@JsonField(name = "status_retweet_user_nickname")
|
||||
@CursorField(Activities.STATUS_RETWEET_USER_NICKNAME)
|
||||
public String status_retweet_user_nickname;
|
||||
@ParcelableThisPlease
|
||||
@JsonField(name = "status_in_reply_to_user_nickname")
|
||||
@CursorField(Activities.STATUS_IN_REPLY_TO_USER_NICKNAME)
|
||||
public String status_in_reply_to_user_nickname;
|
||||
|
||||
|
||||
public transient UserKey[] after_filtered_source_ids;
|
||||
public transient ParcelableUser[] after_filtered_sources;
|
||||
|
@ -88,7 +88,7 @@ public class ParcelableStatus implements Parcelable, Comparable<ParcelableStatus
|
||||
public long position_key;
|
||||
@ParcelableThisPlease
|
||||
@JsonField(name = "user_id", typeConverter = UserKeyConverter.class)
|
||||
@CursorField(value = Statuses.USER_ID, converter = UserKeyCursorFieldConverter.class)
|
||||
@CursorField(value = Statuses.USER_KEY, converter = UserKeyCursorFieldConverter.class)
|
||||
public UserKey user_key;
|
||||
@ParcelableThisPlease
|
||||
@JsonField(name = "retweet_id")
|
||||
@ -96,7 +96,7 @@ public class ParcelableStatus implements Parcelable, Comparable<ParcelableStatus
|
||||
public String retweet_id;
|
||||
@ParcelableThisPlease
|
||||
@JsonField(name = "retweeted_by_user_id", typeConverter = UserKeyConverter.class)
|
||||
@CursorField(value = Statuses.RETWEETED_BY_USER_ID, converter = UserKeyCursorFieldConverter.class)
|
||||
@CursorField(value = Statuses.RETWEETED_BY_USER_KEY, converter = UserKeyCursorFieldConverter.class)
|
||||
@Nullable
|
||||
public UserKey retweeted_by_user_key;
|
||||
@ParcelableThisPlease
|
||||
|
@ -807,7 +807,7 @@ public interface TwidereDataStore {
|
||||
* User's ID of the status.<br>
|
||||
* Type: INTEGER (long)
|
||||
*/
|
||||
String USER_ID = "user_id";
|
||||
String USER_KEY = "user_id";
|
||||
|
||||
String IN_REPLY_TO_STATUS_ID = "in_reply_to_status_id";
|
||||
|
||||
@ -829,7 +829,7 @@ public interface TwidereDataStore {
|
||||
|
||||
String RETWEET_TIMESTAMP = "retweet_timestamp";
|
||||
|
||||
String RETWEETED_BY_USER_ID = "retweeted_by_user_id";
|
||||
String RETWEETED_BY_USER_KEY = "retweeted_by_user_id";
|
||||
|
||||
String RETWEETED_BY_USER_NAME = "retweeted_by_user_name";
|
||||
|
||||
@ -890,11 +890,11 @@ public interface TwidereDataStore {
|
||||
String RETWEET_USER_NICKNAME = "retweet_user_nickname";
|
||||
String IN_REPLY_TO_USER_NICKNAME = "in_reply_to_user_nickname";
|
||||
|
||||
String[] COLUMNS = {_ID, ACCOUNT_KEY, STATUS_ID, SORT_ID, USER_ID, STATUS_TIMESTAMP,
|
||||
String[] COLUMNS = {_ID, ACCOUNT_KEY, STATUS_ID, SORT_ID, USER_KEY, STATUS_TIMESTAMP,
|
||||
TEXT_HTML, TEXT_PLAIN, TEXT_UNESCAPED, USER_NAME, USER_SCREEN_NAME,
|
||||
USER_PROFILE_IMAGE_URL, IN_REPLY_TO_STATUS_ID, IN_REPLY_TO_USER_ID, IN_REPLY_TO_USER_NAME,
|
||||
IN_REPLY_TO_USER_SCREEN_NAME, SOURCE, LOCATION, RETWEET_COUNT, FAVORITE_COUNT, REPLY_COUNT,
|
||||
RETWEET_ID, RETWEET_TIMESTAMP, RETWEETED_BY_USER_ID, RETWEETED_BY_USER_NAME,
|
||||
RETWEET_ID, RETWEET_TIMESTAMP, RETWEETED_BY_USER_KEY, RETWEETED_BY_USER_NAME,
|
||||
RETWEETED_BY_USER_SCREEN_NAME, RETWEETED_BY_USER_PROFILE_IMAGE, QUOTED_ID, QUOTED_TEXT_HTML,
|
||||
QUOTED_TEXT_PLAIN, QUOTED_TEXT_UNESCAPED, QUOTED_TIMESTAMP, QUOTED_SOURCE, QUOTED_USER_KEY,
|
||||
QUOTED_USER_NAME, QUOTED_USER_SCREEN_NAME, QUOTED_USER_PROFILE_IMAGE,
|
||||
@ -937,6 +937,17 @@ public interface TwidereDataStore {
|
||||
String STATUS_QUOTE_SPANS = "status_quote_spans";
|
||||
String STATUS_USER_FOLLOWING = "status_user_following";
|
||||
String IS_GAP = "status_is_gap";
|
||||
|
||||
String ACCOUNT_COLOR = "account_color";
|
||||
String STATUS_USER_COLOR = "status_user_color";
|
||||
String STATUS_QUOTED_USER_COLOR = "status_quoted_user_color";
|
||||
String STATUS_RETWEET_USER_COLOR = "status_retweet_user_color";
|
||||
|
||||
String STATUS_USER_NICKNAME = "status_user_nickname";
|
||||
String STATUS_QUOTED_USER_NICKNAME = "status_quoted_user_nickname";
|
||||
String STATUS_RETWEET_USER_NICKNAME = "status_retweet_user_nickname";
|
||||
String STATUS_IN_REPLY_TO_USER_NICKNAME = "status_in_reply_to_user_nickname";
|
||||
|
||||
String MIN_SORT_POSITION = "min_position";
|
||||
String MAX_SORT_POSITION = "max_position";
|
||||
|
||||
@ -959,12 +970,16 @@ public interface TwidereDataStore {
|
||||
IS_GAP, MIN_SORT_POSITION, MAX_SORT_POSITION, SOURCES, SOURCE_IDS, TARGET_STATUSES, TARGET_USERS,
|
||||
TARGET_USER_LISTS, TARGET_OBJECT_STATUSES, TARGET_OBJECT_USER_LISTS, TARGET_OBJECT_USERS,
|
||||
STATUS_RETWEET_ID, STATUS_USER_FOLLOWING, INSERTED_DATE, MIN_REQUEST_POSITION,
|
||||
MAX_REQUEST_POSITION, POSITION_KEY};
|
||||
MAX_REQUEST_POSITION, POSITION_KEY, ACCOUNT_COLOR, STATUS_USER_COLOR,
|
||||
STATUS_QUOTED_USER_COLOR, STATUS_RETWEET_USER_COLOR, STATUS_USER_NICKNAME,
|
||||
STATUS_QUOTED_USER_NICKNAME, STATUS_RETWEET_USER_NICKNAME,
|
||||
STATUS_IN_REPLY_TO_USER_NICKNAME};
|
||||
String[] TYPES = {TYPE_PRIMARY_KEY, TYPE_TEXT, TYPE_TEXT, TYPE_INT, TYPE_INT, TYPE_INT,
|
||||
TYPE_INT, TYPE_INT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT,
|
||||
TYPE_BOOLEAN, TYPE_INT, TYPE_INT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT,
|
||||
TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_INT, TYPE_BOOLEAN, INSERTED_DATE_TYPE, TYPE_TEXT,
|
||||
TYPE_TEXT, TYPE_INT};
|
||||
TYPE_TEXT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_TEXT, TYPE_TEXT,
|
||||
TYPE_TEXT, TYPE_TEXT};
|
||||
|
||||
String DEFAULT_SORT_ORDER = TIMESTAMP + " DESC";
|
||||
|
||||
|
@ -34,7 +34,7 @@ import static org.mariotaku.twidere.annotation.PreferenceType.STRING;
|
||||
public interface Constants extends TwidereConstants {
|
||||
|
||||
String DATABASES_NAME = "twidere.sqlite";
|
||||
int DATABASES_VERSION = 138;
|
||||
int DATABASES_VERSION = 139;
|
||||
|
||||
int MENU_GROUP_STATUS_EXTENSION = 10;
|
||||
int MENU_GROUP_COMPOSE_EXTENSION = 11;
|
||||
|
@ -1091,6 +1091,7 @@ public class ComposeActivity extends BaseActivity implements OnMenuItemClickList
|
||||
}
|
||||
if (!ArrayUtils.isEmpty(status.mentions)) {
|
||||
for (ParcelableUserMention mention : status.mentions) {
|
||||
if (mention.key.equals(status.account_key)) continue;
|
||||
mentions.add(mention.screen_name);
|
||||
}
|
||||
mentions.addAll(mExtractor.extractMentionedScreennames(status.quoted_text_plain));
|
||||
|
@ -365,35 +365,23 @@ public abstract class CursorActivitiesFragment extends AbsActivitiesFragment {
|
||||
protected ObjectCursor<ParcelableActivity> createObjectCursor(Cursor cursor, ObjectCursor.CursorIndices<ParcelableActivity> indices) {
|
||||
final String[] filteredUserIds = DataStoreUtils.getFilteredUserIds(getContext());
|
||||
final ParcelableAccount[] accounts = ParcelableAccountUtils.getAccounts(getContext(), mAccountKeys);
|
||||
return new ActivityCursor(cursor, indices, filteredUserIds, accounts);
|
||||
return new ActivityCursor(cursor, indices, filteredUserIds);
|
||||
}
|
||||
|
||||
public static class ActivityCursor extends ObjectCursor<ParcelableActivity> {
|
||||
|
||||
private final String[] filteredUserIds;
|
||||
private final ParcelableAccount[] accounts;
|
||||
|
||||
public ActivityCursor(Cursor cursor, CursorIndices<ParcelableActivity> indies, String[] filteredUserIds, ParcelableAccount[] accounts) {
|
||||
public ActivityCursor(Cursor cursor, CursorIndices<ParcelableActivity> indies,
|
||||
String[] filteredUserIds) {
|
||||
super(cursor, indies);
|
||||
this.filteredUserIds = filteredUserIds;
|
||||
this.accounts = accounts;
|
||||
}
|
||||
|
||||
public String[] getFilteredUserIds() {
|
||||
return filteredUserIds;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ParcelableActivity get(Cursor cursor, CursorIndices<ParcelableActivity> indices) {
|
||||
final ParcelableActivity activity = super.get(cursor, indices);
|
||||
for (ParcelableAccount account : accounts) {
|
||||
if (account.account_key.equals(activity.account_key)) {
|
||||
activity.account_color = account.color;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return activity;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -325,9 +325,16 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
|
||||
if (data == null) return;
|
||||
final int color = data.getIntExtra(EXTRA_COLOR, Color.TRANSPARENT);
|
||||
mUserColorNameManager.setUserColor(status.user_key, color);
|
||||
status.user_color = color;
|
||||
} else if (resultCode == ColorPickerDialogActivity.RESULT_CLEARED) {
|
||||
mUserColorNameManager.clearUserColor(status.user_key);
|
||||
status.user_color = 0;
|
||||
}
|
||||
final Bundle args = getArguments();
|
||||
if (args.containsKey(EXTRA_STATUS)) {
|
||||
args.putParcelable(EXTRA_STATUS, status);
|
||||
}
|
||||
getLoaderManager().restartLoader(LOADER_ID_DETAIL_STATUS, args, this);
|
||||
break;
|
||||
}
|
||||
case REQUEST_SELECT_ACCOUNT: {
|
||||
@ -566,6 +573,10 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
|
||||
final Bundle dataExtra = data.getExtras();
|
||||
final ParcelableCredentials credentials = dataExtra.getParcelable(EXTRA_ACCOUNT);
|
||||
if (mStatusAdapter.setStatus(status, credentials)) {
|
||||
Bundle args = getArguments();
|
||||
if (args.containsKey(EXTRA_STATUS)) {
|
||||
args.putParcelable(EXTRA_STATUS, status);
|
||||
}
|
||||
mStatusAdapter.setLoadMoreSupportedPosition(IndicatorPosition.BOTH);
|
||||
mStatusAdapter.setData(null);
|
||||
loadConversation(status, null, null);
|
||||
@ -2221,9 +2232,10 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
|
||||
final ParcelableStatus old = mStatus;
|
||||
mStatus = status;
|
||||
mStatusAccount = credentials;
|
||||
final boolean changed = !CompareUtils.objectEquals(old, status);
|
||||
notifyDataSetChanged();
|
||||
updateItemDecoration();
|
||||
return !CompareUtils.objectEquals(old, status);
|
||||
return changed;
|
||||
}
|
||||
|
||||
private void updateItemDecoration() {
|
||||
|
@ -37,6 +37,7 @@ import org.mariotaku.twidere.util.dagger.GeneralComponentHelper;
|
||||
import javax.inject.Inject;
|
||||
|
||||
import static org.mariotaku.twidere.constant.IntentConstants.EXTRA_ACCOUNT;
|
||||
import static org.mariotaku.twidere.constant.IntentConstants.EXTRA_STATUS;
|
||||
import static org.mariotaku.twidere.util.Utils.findStatus;
|
||||
|
||||
/**
|
||||
@ -89,6 +90,12 @@ public class ParcelableStatusLoader extends AsyncTaskLoader<SingleResponse<Parce
|
||||
|
||||
@Override
|
||||
protected void onStartLoading() {
|
||||
if (!mOmitIntentExtra && mExtras != null) {
|
||||
final ParcelableStatus status = mExtras.getParcelable(EXTRA_STATUS);
|
||||
if (status != null) {
|
||||
deliverResult(SingleResponse.getInstance(status));
|
||||
}
|
||||
}
|
||||
forceLoad();
|
||||
}
|
||||
|
||||
|
@ -94,19 +94,25 @@ public class ParcelableActivityUtils {
|
||||
|
||||
@Nullable
|
||||
public static ParcelableStatus getActivityStatus(@NonNull ParcelableActivity activity) {
|
||||
final ParcelableStatus status;
|
||||
if (Activity.Action.MENTION.equals(activity.action)) {
|
||||
final ParcelableStatus status = activity.target_object_statuses[0];
|
||||
status.account_color = activity.account_color;
|
||||
return status;
|
||||
status = activity.target_object_statuses[0];
|
||||
} else if (Activity.Action.REPLY.equals(activity.action)) {
|
||||
final ParcelableStatus status = activity.target_statuses[0];
|
||||
status.account_color = activity.account_color;
|
||||
return status;
|
||||
status = activity.target_statuses[0];
|
||||
} else if (Activity.Action.QUOTE.equals(activity.action)) {
|
||||
final ParcelableStatus status = activity.target_statuses[0];
|
||||
status.account_color = activity.account_color;
|
||||
return status;
|
||||
status = activity.target_statuses[0];
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
return null;
|
||||
status.account_color = activity.account_color;
|
||||
status.user_color = activity.status_user_color;
|
||||
status.retweet_user_color = activity.status_retweet_user_color;
|
||||
status.quoted_user_color = activity.status_quoted_user_color;
|
||||
|
||||
status.user_nickname = activity.status_user_nickname;
|
||||
status.in_reply_to_user_nickname = activity.status_in_reply_to_user_nickname;
|
||||
status.retweet_user_nickname = activity.status_retweet_user_nickname;
|
||||
status.quoted_user_nickname = activity.status_quoted_user_nickname;
|
||||
return status;
|
||||
}
|
||||
}
|
||||
|
@ -1302,12 +1302,12 @@ public final class TwidereDataProvider extends ContentProvider implements Consta
|
||||
final String filteredSelection = DataStoreUtils.buildStatusFilterWhereClause(Statuses.TABLE_NAME,
|
||||
selection).getSQL();
|
||||
final String[] selectionArgs = {accountKey.toString()};
|
||||
final String[] userProjection = {Statuses.USER_ID, Statuses.USER_NAME, Statuses.USER_SCREEN_NAME};
|
||||
final String[] userProjection = {Statuses.USER_KEY, Statuses.USER_NAME, Statuses.USER_SCREEN_NAME};
|
||||
final String[] statusProjection = {Statuses.STATUS_ID};
|
||||
final Cursor statusCursor = mDatabaseWrapper.query(Statuses.TABLE_NAME, statusProjection,
|
||||
filteredSelection, selectionArgs, null, null, Statuses.DEFAULT_SORT_ORDER);
|
||||
final Cursor userCursor = mDatabaseWrapper.query(Statuses.TABLE_NAME, userProjection,
|
||||
filteredSelection, selectionArgs, Statuses.USER_ID, null, Statuses.DEFAULT_SORT_ORDER);
|
||||
filteredSelection, selectionArgs, Statuses.USER_KEY, null, Statuses.DEFAULT_SORT_ORDER);
|
||||
//noinspection TryFinallyCanBeTryWithResources
|
||||
try {
|
||||
final int usersCount = userCursor.getCount();
|
||||
|
@ -326,7 +326,7 @@ public class StreamingService extends Service implements Constants {
|
||||
|
||||
@Override
|
||||
public void onScrubGeo(final long userId, final long upToStatusId) {
|
||||
final String where = Expression.and(Expression.equalsArgs(Statuses.USER_ID),
|
||||
final String where = Expression.and(Expression.equalsArgs(Statuses.USER_KEY),
|
||||
Expression.greaterEqualsArgs(Statuses.SORT_ID)).getSQL();
|
||||
final String[] whereArgs = {String.valueOf(userId), String.valueOf(upToStatusId)};
|
||||
final ContentValues values = new ContentValues();
|
||||
|
@ -50,7 +50,7 @@ public class CreateUserBlockTask extends AbsFriendshipOperationTask {
|
||||
for (final Uri uri : TwidereDataStore.STATUSES_URIS) {
|
||||
final Expression where = Expression.and(
|
||||
Expression.equalsArgs(TwidereDataStore.AccountSupportColumns.ACCOUNT_KEY),
|
||||
Expression.equalsArgs(TwidereDataStore.Statuses.USER_ID)
|
||||
Expression.equalsArgs(TwidereDataStore.Statuses.USER_KEY)
|
||||
);
|
||||
final String[] whereArgs = {args.accountKey.toString(), args.userKey.toString()};
|
||||
resolver.delete(uri, where.getSQL(), whereArgs);
|
||||
|
@ -44,7 +44,7 @@ public class CreateUserMuteTask extends AbsFriendshipOperationTask {
|
||||
for (final Uri uri : TwidereDataStore.STATUSES_URIS) {
|
||||
final Expression where = Expression.and(
|
||||
Expression.equalsArgs(Statuses.ACCOUNT_KEY),
|
||||
Expression.equalsArgs(Statuses.USER_ID)
|
||||
Expression.equalsArgs(Statuses.USER_KEY)
|
||||
);
|
||||
final String[] whereArgs = {args.accountKey.toString(), args.userKey.toString()};
|
||||
resolver.delete(uri, where.getSQL(), whereArgs);
|
||||
|
@ -42,8 +42,8 @@ public class DestroyFriendshipTask extends AbsFriendshipOperationTask {
|
||||
protected void succeededWorker(@NonNull Twitter twitter, @NonNull ParcelableCredentials credentials, @NonNull Arguments args, @NonNull ParcelableUser user) {
|
||||
Utils.setLastSeen(context, user.key, -1);
|
||||
final Expression where = Expression.and(Expression.equalsArgs(TwidereDataStore.Statuses.ACCOUNT_KEY),
|
||||
Expression.or(Expression.equalsArgs(TwidereDataStore.Statuses.USER_ID),
|
||||
Expression.equalsArgs(TwidereDataStore.Statuses.RETWEETED_BY_USER_ID)));
|
||||
Expression.or(Expression.equalsArgs(TwidereDataStore.Statuses.USER_KEY),
|
||||
Expression.equalsArgs(TwidereDataStore.Statuses.RETWEETED_BY_USER_KEY)));
|
||||
final String[] whereArgs = {args.userKey.toString(), args.userKey.toString(),
|
||||
args.userKey.toString()};
|
||||
final ContentResolver resolver = context.getContentResolver();
|
||||
|
@ -33,6 +33,7 @@ import org.mariotaku.twidere.util.ErrorInfoStore;
|
||||
import org.mariotaku.twidere.util.ReadStateManager;
|
||||
import org.mariotaku.twidere.util.SharedPreferencesWrapper;
|
||||
import org.mariotaku.twidere.util.TwitterAPIFactory;
|
||||
import org.mariotaku.twidere.util.UserColorNameManager;
|
||||
import org.mariotaku.twidere.util.content.ContentResolverUtils;
|
||||
import org.mariotaku.twidere.util.dagger.GeneralComponentHelper;
|
||||
|
||||
@ -56,6 +57,8 @@ public abstract class GetActivitiesTask extends AbstractTask<RefreshTaskParam, O
|
||||
protected ErrorInfoStore errorInfoStore;
|
||||
@Inject
|
||||
protected ReadStateManager readStateManager;
|
||||
@Inject
|
||||
protected UserColorNameManager userColorNameManager;
|
||||
|
||||
public GetActivitiesTask(Context context) {
|
||||
this.context = context;
|
||||
@ -104,7 +107,7 @@ public abstract class GetActivitiesTask extends AbstractTask<RefreshTaskParam, O
|
||||
// We should delete old activities has intersection with new items
|
||||
try {
|
||||
final ResponseList<Activity> activities = getActivities(twitter, credentials, paging);
|
||||
storeActivities(cr, loadItemLimit, accountKey, noItemsBefore, activities, sinceId, maxId);
|
||||
storeActivities(cr, loadItemLimit, credentials, noItemsBefore, activities, sinceId, maxId);
|
||||
if (saveReadPosition) {
|
||||
saveReadPosition(accountKey, credentials, twitter);
|
||||
}
|
||||
@ -128,7 +131,7 @@ public abstract class GetActivitiesTask extends AbstractTask<RefreshTaskParam, O
|
||||
@NonNull
|
||||
protected abstract String getErrorInfoKey();
|
||||
|
||||
private void storeActivities(ContentResolver cr, int loadItemLimit, UserKey accountKey,
|
||||
private void storeActivities(ContentResolver cr, int loadItemLimit, ParcelableCredentials credentials,
|
||||
boolean noItemsBefore, ResponseList<Activity> activities,
|
||||
final String sinceId, final String maxId) {
|
||||
long[] deleteBound = new long[2];
|
||||
@ -136,7 +139,7 @@ public abstract class GetActivitiesTask extends AbstractTask<RefreshTaskParam, O
|
||||
List<ContentValues> valuesList = new ArrayList<>();
|
||||
for (Activity activity : activities) {
|
||||
final ParcelableActivity parcelableActivity = ParcelableActivityUtils.fromActivity(activity,
|
||||
accountKey, false);
|
||||
credentials.account_key, false);
|
||||
if (deleteBound[0] < 0) {
|
||||
deleteBound[0] = parcelableActivity.min_sort_position;
|
||||
} else {
|
||||
@ -147,7 +150,8 @@ public abstract class GetActivitiesTask extends AbstractTask<RefreshTaskParam, O
|
||||
} else {
|
||||
deleteBound[1] = Math.max(deleteBound[1], parcelableActivity.max_sort_position);
|
||||
}
|
||||
final ContentValues values = ContentValuesCreator.createActivity(parcelableActivity);
|
||||
final ContentValues values = ContentValuesCreator.createActivity(parcelableActivity,
|
||||
credentials, userColorNameManager);
|
||||
values.put(Activities.INSERTED_DATE, System.currentTimeMillis());
|
||||
valuesList.add(values);
|
||||
}
|
||||
@ -157,7 +161,7 @@ public abstract class GetActivitiesTask extends AbstractTask<RefreshTaskParam, O
|
||||
Expression.greaterEqualsArgs(Activities.MIN_SORT_POSITION),
|
||||
Expression.lesserEqualsArgs(Activities.MAX_SORT_POSITION)
|
||||
);
|
||||
final String[] whereArgs = {accountKey.toString(), String.valueOf(deleteBound[0]),
|
||||
final String[] whereArgs = {credentials.account_key.toString(), String.valueOf(deleteBound[0]),
|
||||
String.valueOf(deleteBound[1])};
|
||||
int rowsDeleted = cr.delete(getContentUri(), where.getSQL(), whereArgs);
|
||||
// Why loadItemLimit / 2? because it will not acting strange in most cases
|
||||
@ -175,7 +179,7 @@ public abstract class GetActivitiesTask extends AbstractTask<RefreshTaskParam, O
|
||||
final String noGapWhere = Expression.and(Expression.equalsArgs(Activities.ACCOUNT_KEY),
|
||||
Expression.equalsArgs(Activities.MIN_REQUEST_POSITION),
|
||||
Expression.equalsArgs(Activities.MAX_REQUEST_POSITION)).getSQL();
|
||||
final String[] noGapWhereArgs = {accountKey.toString(), maxId, maxId};
|
||||
final String[] noGapWhereArgs = {credentials.toString(), maxId, maxId};
|
||||
cr.update(getContentUri(), noGapValues, noGapWhere, noGapWhereArgs);
|
||||
}
|
||||
}
|
||||
|
@ -33,6 +33,7 @@ import org.mariotaku.twidere.api.twitter.model.User;
|
||||
import org.mariotaku.twidere.model.Draft;
|
||||
import org.mariotaku.twidere.model.ParcelableActivity;
|
||||
import org.mariotaku.twidere.model.ParcelableActivityValuesCreator;
|
||||
import org.mariotaku.twidere.model.ParcelableCredentials;
|
||||
import org.mariotaku.twidere.model.ParcelableDirectMessage;
|
||||
import org.mariotaku.twidere.model.ParcelableDirectMessageValuesCreator;
|
||||
import org.mariotaku.twidere.model.ParcelableMedia;
|
||||
@ -201,11 +202,24 @@ public final class ContentValuesCreator implements TwidereConstants {
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public static ContentValues createActivity(final ParcelableActivity activity) {
|
||||
public static ContentValues createActivity(final ParcelableActivity activity,
|
||||
ParcelableCredentials credentials, UserColorNameManager manager) {
|
||||
final ContentValues values = new ContentValues();
|
||||
final ParcelableStatus status = ParcelableActivityUtils.getActivityStatus(activity);
|
||||
if (status != null) {
|
||||
ParcelableStatusUtils.updateExtraInformation(status, credentials, manager);
|
||||
createStatusActivity(status, values);
|
||||
|
||||
activity.account_color = status.account_color;
|
||||
activity.status_user_color = status.user_color;
|
||||
activity.status_retweet_user_color = status.retweet_user_color;
|
||||
activity.status_quoted_user_color = status.quoted_user_color;
|
||||
|
||||
activity.status_user_nickname = status.user_nickname;
|
||||
activity.status_in_reply_to_user_nickname = status.in_reply_to_user_nickname;
|
||||
activity.status_retweet_user_nickname = status.retweet_user_nickname;
|
||||
activity.status_quoted_user_nickname = status.quoted_user_nickname;
|
||||
|
||||
}
|
||||
ParcelableActivityValuesCreator.writeTo(activity, values);
|
||||
return values;
|
||||
|
@ -317,8 +317,8 @@ public class DataStoreUtils implements Constants {
|
||||
.from(new Tables(Filters.Users.TABLE_NAME))
|
||||
.build();
|
||||
final Expression filteredUsersWhere = Expression.or(
|
||||
Expression.in(new Column(new Table(table), Statuses.USER_ID), filteredUsersQuery),
|
||||
Expression.in(new Column(new Table(table), Statuses.RETWEETED_BY_USER_ID), filteredUsersQuery),
|
||||
Expression.in(new Column(new Table(table), Statuses.USER_KEY), filteredUsersQuery),
|
||||
Expression.in(new Column(new Table(table), Statuses.RETWEETED_BY_USER_KEY), filteredUsersQuery),
|
||||
Expression.in(new Column(new Table(table), Statuses.QUOTED_USER_KEY), filteredUsersQuery)
|
||||
);
|
||||
final SQLSelectQuery.Builder filteredIdsQueryBuilder = SQLQueryBuilder
|
||||
|
@ -65,6 +65,8 @@ import org.mariotaku.twidere.util.menu.TwidereMenuInfo;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import static org.mariotaku.twidere.TwidereConstants.*;
|
||||
|
||||
/**
|
||||
* Created by mariotaku on 15/4/12.
|
||||
*/
|
||||
@ -216,7 +218,7 @@ public class MenuUtils implements Constants {
|
||||
final MenuItem translate = menu.findItem(R.id.translate);
|
||||
if (translate != null) {
|
||||
final boolean isOfficialKey = Utils.isOfficialCredentials(context, account);
|
||||
final SharedPreferencesWrapper prefs = SharedPreferencesWrapper.getInstance(context, TwidereConstants.SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE);
|
||||
final SharedPreferencesWrapper prefs = SharedPreferencesWrapper.getInstance(context, SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE);
|
||||
final boolean forcePrivateApis = prefs.getBoolean(SharedPreferenceConstants.KEY_FORCE_USING_PRIVATE_APIS, false);
|
||||
setMenuItemAvailability(menu, R.id.translate, forcePrivateApis || isOfficialKey);
|
||||
}
|
||||
@ -311,9 +313,9 @@ public class MenuUtils implements Constants {
|
||||
intent.putExtra(IntentConstants.EXTRA_CLEAR_BUTTON, color != 0);
|
||||
intent.putExtra(IntentConstants.EXTRA_ALPHA_SLIDER, false);
|
||||
if (fragment != null) {
|
||||
fragment.startActivityForResult(intent, TwidereConstants.REQUEST_SET_COLOR);
|
||||
fragment.startActivityForResult(intent, REQUEST_SET_COLOR);
|
||||
} else if (context instanceof Activity) {
|
||||
((Activity) context).startActivityForResult(intent, TwidereConstants.REQUEST_SET_COLOR);
|
||||
((Activity) context).startActivityForResult(intent, REQUEST_SET_COLOR);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -323,7 +325,11 @@ public class MenuUtils implements Constants {
|
||||
}
|
||||
case R.id.set_nickname: {
|
||||
final String nick = colorNameManager.getUserNickname(status.user_key);
|
||||
SetUserNicknameDialogFragment.show(fm, status.user_key, nick);
|
||||
final SetUserNicknameDialogFragment df = SetUserNicknameDialogFragment.show(fm,
|
||||
status.user_key, nick);
|
||||
if (fragment != null) {
|
||||
df.setTargetFragment(fragment, REQUEST_SET_NICKNAME);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case R.id.open_with_account: {
|
||||
@ -331,9 +337,9 @@ public class MenuUtils implements Constants {
|
||||
intent.setClass(context, AccountSelectorActivity.class);
|
||||
intent.putExtra(IntentConstants.EXTRA_SINGLE_SELECTION, true);
|
||||
if (fragment != null) {
|
||||
fragment.startActivityForResult(intent, TwidereConstants.REQUEST_SELECT_ACCOUNT);
|
||||
fragment.startActivityForResult(intent, REQUEST_SELECT_ACCOUNT);
|
||||
} else if (context instanceof Activity) {
|
||||
((Activity) context).startActivityForResult(intent, TwidereConstants.REQUEST_SELECT_ACCOUNT);
|
||||
((Activity) context).startActivityForResult(intent, REQUEST_SELECT_ACCOUNT);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -349,7 +355,7 @@ public class MenuUtils implements Constants {
|
||||
try {
|
||||
context.startActivity(item.getIntent());
|
||||
} catch (final ActivityNotFoundException e) {
|
||||
Log.w(TwidereConstants.LOGTAG, e);
|
||||
Log.w(LOGTAG, e);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
@ -19,13 +19,17 @@
|
||||
|
||||
package org.mariotaku.twidere.util;
|
||||
|
||||
import android.content.ContentResolver;
|
||||
import android.content.ContentValues;
|
||||
import android.content.Context;
|
||||
import android.content.SharedPreferences;
|
||||
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
|
||||
import android.graphics.Color;
|
||||
import android.net.Uri;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.annotation.WorkerThread;
|
||||
|
||||
import org.mariotaku.sqliteqb.library.Expression;
|
||||
import org.mariotaku.twidere.TwidereConstants;
|
||||
import org.mariotaku.twidere.api.twitter.model.User;
|
||||
import org.mariotaku.twidere.model.ParcelableStatus;
|
||||
@ -33,6 +37,8 @@ import org.mariotaku.twidere.model.ParcelableUser;
|
||||
import org.mariotaku.twidere.model.ParcelableUserList;
|
||||
import org.mariotaku.twidere.model.UserKey;
|
||||
import org.mariotaku.twidere.model.util.UserKeyUtils;
|
||||
import org.mariotaku.twidere.provider.TwidereDataStore.Activities;
|
||||
import org.mariotaku.twidere.provider.TwidereDataStore.Statuses;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
@ -42,8 +48,10 @@ import static android.text.TextUtils.isEmpty;
|
||||
public class UserColorNameManager implements TwidereConstants {
|
||||
|
||||
private final SharedPreferences mColorPreferences, mNicknamePreferences;
|
||||
private final Context mContext;
|
||||
|
||||
public UserColorNameManager(Context context) {
|
||||
mContext = context;
|
||||
mColorPreferences = context.getSharedPreferences(USER_COLOR_PREFERENCES_NAME, Context.MODE_PRIVATE);
|
||||
mNicknamePreferences = context.getSharedPreferences(USER_NICKNAME_PREFERENCES_NAME, Context.MODE_PRIVATE);
|
||||
}
|
||||
@ -68,30 +76,91 @@ public class UserColorNameManager implements TwidereConstants {
|
||||
mNicknamePreferences.registerOnSharedPreferenceChangeListener(new OnNickPreferenceChangeListener(listener));
|
||||
}
|
||||
|
||||
public void clearUserColor(@NonNull final UserKey userId) {
|
||||
public void clearUserColor(@NonNull final UserKey userKey) {
|
||||
final SharedPreferences.Editor editor = mColorPreferences.edit();
|
||||
editor.remove(userId.toString());
|
||||
final String userKeyString = userKey.toString();
|
||||
updateColor(userKeyString, 0);
|
||||
editor.remove(userKeyString);
|
||||
editor.apply();
|
||||
}
|
||||
|
||||
public void setUserColor(@NonNull final UserKey userKey, final int color) {
|
||||
final SharedPreferences.Editor editor = mColorPreferences.edit();
|
||||
editor.putInt(userKey.toString(), color);
|
||||
final String userKeyString = userKey.toString();
|
||||
updateColor(userKeyString, color);
|
||||
editor.putInt(userKeyString, color);
|
||||
editor.apply();
|
||||
}
|
||||
|
||||
public void setUserNickname(@NonNull final UserKey userKey, final String nickname) {
|
||||
final SharedPreferences.Editor editor = mNicknamePreferences.edit();
|
||||
editor.putString(userKey.toString(), nickname);
|
||||
final String userKeyString = userKey.toString();
|
||||
updateNickname(userKeyString, null);
|
||||
editor.putString(userKeyString, nickname);
|
||||
editor.apply();
|
||||
}
|
||||
|
||||
public void clearUserNickname(@NonNull final UserKey userKey) {
|
||||
final SharedPreferences.Editor editor = mNicknamePreferences.edit();
|
||||
editor.remove(userKey.toString());
|
||||
final String userKeyString = userKey.toString();
|
||||
updateNickname(userKeyString, null);
|
||||
editor.remove(userKeyString);
|
||||
editor.apply();
|
||||
}
|
||||
|
||||
private void updateColor(String userKey, int color) {
|
||||
final ContentResolver cr = mContext.getContentResolver();
|
||||
ContentValues cv = new ContentValues();
|
||||
updateColumn(cr, Statuses.CONTENT_URI, userKey, Statuses.USER_COLOR, Statuses.USER_KEY,
|
||||
color, cv);
|
||||
updateColumn(cr, Statuses.CONTENT_URI, userKey, Statuses.QUOTED_USER_COLOR,
|
||||
Statuses.QUOTED_USER_KEY, color, cv);
|
||||
updateColumn(cr, Statuses.CONTENT_URI, userKey, Statuses.RETWEET_USER_COLOR,
|
||||
Statuses.RETWEETED_BY_USER_KEY, color, cv);
|
||||
|
||||
updateColumn(cr, Activities.AboutMe.CONTENT_URI, userKey, Activities.STATUS_USER_COLOR,
|
||||
Activities.STATUS_USER_ID, color, cv);
|
||||
updateColumn(cr, Activities.AboutMe.CONTENT_URI, userKey, Activities.STATUS_RETWEET_USER_COLOR,
|
||||
Activities.STATUS_RETWEETED_BY_USER_ID, color, cv);
|
||||
updateColumn(cr, Activities.AboutMe.CONTENT_URI, userKey, Activities.STATUS_QUOTED_USER_COLOR,
|
||||
Activities.STATUS_QUOTED_USER_ID, color, cv);
|
||||
}
|
||||
|
||||
private void updateNickname(String userKey, String nickname) {
|
||||
final ContentResolver cr = mContext.getContentResolver();
|
||||
ContentValues cv = new ContentValues();
|
||||
updateColumn(cr, Statuses.CONTENT_URI, userKey, Statuses.USER_NICKNAME, Statuses.USER_KEY,
|
||||
nickname, cv);
|
||||
updateColumn(cr, Statuses.CONTENT_URI, userKey, Statuses.QUOTED_USER_NICKNAME,
|
||||
Statuses.QUOTED_USER_KEY, nickname, cv);
|
||||
updateColumn(cr, Statuses.CONTENT_URI, userKey, Statuses.RETWEET_USER_NICKNAME,
|
||||
Statuses.RETWEETED_BY_USER_KEY, nickname, cv);
|
||||
|
||||
updateColumn(cr, Activities.AboutMe.CONTENT_URI, userKey, Activities.STATUS_USER_NICKNAME,
|
||||
Activities.STATUS_USER_ID, nickname, cv);
|
||||
updateColumn(cr, Activities.AboutMe.CONTENT_URI, userKey, Activities.STATUS_RETWEET_USER_NICKNAME,
|
||||
Activities.STATUS_RETWEETED_BY_USER_ID, nickname, cv);
|
||||
updateColumn(cr, Activities.AboutMe.CONTENT_URI, userKey, Activities.STATUS_QUOTED_USER_NICKNAME,
|
||||
Activities.STATUS_QUOTED_USER_ID, nickname, cv);
|
||||
}
|
||||
|
||||
private static void updateColumn(ContentResolver cr, Uri uri, String userKey, String valueColumn,
|
||||
String whereColumn, int value, ContentValues temp) {
|
||||
temp.clear();
|
||||
temp.put(valueColumn, value);
|
||||
cr.update(uri, temp, Expression.equalsArgs(whereColumn).getSQL(),
|
||||
new String[]{userKey});
|
||||
}
|
||||
|
||||
|
||||
private static void updateColumn(ContentResolver cr, Uri uri, String userKey, String valueColumn,
|
||||
String whereColumn, String value, ContentValues temp) {
|
||||
temp.clear();
|
||||
temp.put(valueColumn, value);
|
||||
cr.update(uri, temp, Expression.equalsArgs(whereColumn).getSQL(),
|
||||
new String[]{userKey});
|
||||
}
|
||||
|
||||
@WorkerThread
|
||||
public String getDisplayName(final ParcelableUser user, final boolean nameFirst) {
|
||||
return getDisplayName(user.key, user.name, user.screen_name, nameFirst);
|
||||
|
Loading…
x
Reference in New Issue
Block a user