1
0
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:
Mariotaku Lee 2016-03-22 20:31:01 +08:00
parent 21bc95e054
commit 3922219794
20 changed files with 219 additions and 65 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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