2015-04-24 08:14:33 +02:00
|
|
|
/*
|
|
|
|
* Twidere - Twitter client for Android
|
|
|
|
*
|
|
|
|
* Copyright (C) 2012-2014 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.util;
|
|
|
|
|
2016-03-22 13:31:01 +01:00
|
|
|
import android.content.ContentResolver;
|
|
|
|
import android.content.ContentValues;
|
2015-04-24 08:14:33 +02:00
|
|
|
import android.content.Context;
|
|
|
|
import android.content.SharedPreferences;
|
|
|
|
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
|
|
|
|
import android.graphics.Color;
|
2016-03-22 13:31:01 +01:00
|
|
|
import android.net.Uri;
|
2016-03-07 18:25:18 +01:00
|
|
|
import android.support.annotation.NonNull;
|
2016-03-22 05:46:05 +01:00
|
|
|
import android.support.annotation.WorkerThread;
|
2015-04-24 08:14:33 +02:00
|
|
|
|
2016-03-22 13:31:01 +01:00
|
|
|
import org.mariotaku.sqliteqb.library.Expression;
|
2015-04-24 08:14:33 +02:00
|
|
|
import org.mariotaku.twidere.TwidereConstants;
|
2016-05-13 07:08:02 +02:00
|
|
|
import org.mariotaku.microblog.library.twitter.model.User;
|
2015-04-24 08:14:33 +02:00
|
|
|
import org.mariotaku.twidere.model.ParcelableStatus;
|
|
|
|
import org.mariotaku.twidere.model.ParcelableUser;
|
|
|
|
import org.mariotaku.twidere.model.ParcelableUserList;
|
2016-03-07 18:25:18 +01:00
|
|
|
import org.mariotaku.twidere.model.UserKey;
|
|
|
|
import org.mariotaku.twidere.model.util.UserKeyUtils;
|
2016-03-22 13:31:01 +01:00
|
|
|
import org.mariotaku.twidere.provider.TwidereDataStore.Activities;
|
|
|
|
import org.mariotaku.twidere.provider.TwidereDataStore.Statuses;
|
2015-04-24 08:14:33 +02:00
|
|
|
|
|
|
|
import java.util.Map;
|
|
|
|
import java.util.Set;
|
|
|
|
|
|
|
|
import static android.text.TextUtils.isEmpty;
|
|
|
|
|
|
|
|
public class UserColorNameManager implements TwidereConstants {
|
|
|
|
|
|
|
|
private final SharedPreferences mColorPreferences, mNicknamePreferences;
|
2016-03-22 13:31:01 +01:00
|
|
|
private final Context mContext;
|
2015-04-24 08:14:33 +02:00
|
|
|
|
|
|
|
public UserColorNameManager(Context context) {
|
2016-03-22 13:31:01 +01:00
|
|
|
mContext = context;
|
2015-04-24 08:14:33 +02:00
|
|
|
mColorPreferences = context.getSharedPreferences(USER_COLOR_PREFERENCES_NAME, Context.MODE_PRIVATE);
|
|
|
|
mNicknamePreferences = context.getSharedPreferences(USER_NICKNAME_PREFERENCES_NAME, Context.MODE_PRIVATE);
|
|
|
|
}
|
|
|
|
|
2016-03-22 05:46:05 +01:00
|
|
|
public static String decideDisplayName(final String nickname, final String name,
|
2016-03-21 16:28:03 +01:00
|
|
|
final String screenName, final boolean nameFirst) {
|
|
|
|
if (!isEmpty(nickname)) return nickname;
|
|
|
|
return nameFirst && !isEmpty(name) ? name : "@" + screenName;
|
|
|
|
}
|
|
|
|
|
2016-03-22 05:46:05 +01:00
|
|
|
public static String decideNickname(String nick, String name) {
|
|
|
|
return isEmpty(nick) ? name : nick;
|
2016-03-21 16:28:03 +01:00
|
|
|
}
|
|
|
|
|
2016-02-01 07:58:34 +01:00
|
|
|
public void registerColorChangedListener(final UserColorChangedListener listener) {
|
2015-04-24 08:14:33 +02:00
|
|
|
|
2016-02-01 07:58:34 +01:00
|
|
|
mColorPreferences.registerOnSharedPreferenceChangeListener(new OnColorPreferenceChangeListener(listener));
|
2015-04-24 08:14:33 +02:00
|
|
|
}
|
|
|
|
|
2016-02-01 07:58:34 +01:00
|
|
|
public void registerNicknameChangedListener(final UserNicknameChangedListener listener) {
|
2015-04-24 08:14:33 +02:00
|
|
|
|
2016-02-01 07:58:34 +01:00
|
|
|
mNicknamePreferences.registerOnSharedPreferenceChangeListener(new OnNickPreferenceChangeListener(listener));
|
2015-04-24 08:14:33 +02:00
|
|
|
}
|
|
|
|
|
2016-03-22 13:31:01 +01:00
|
|
|
public void clearUserColor(@NonNull final UserKey userKey) {
|
2015-04-24 08:14:33 +02:00
|
|
|
final SharedPreferences.Editor editor = mColorPreferences.edit();
|
2016-03-22 13:31:01 +01:00
|
|
|
final String userKeyString = userKey.toString();
|
|
|
|
updateColor(userKeyString, 0);
|
|
|
|
editor.remove(userKeyString);
|
2015-04-24 08:14:33 +02:00
|
|
|
editor.apply();
|
|
|
|
}
|
|
|
|
|
2016-03-21 16:28:03 +01:00
|
|
|
public void setUserColor(@NonNull final UserKey userKey, final int color) {
|
2015-04-24 08:14:33 +02:00
|
|
|
final SharedPreferences.Editor editor = mColorPreferences.edit();
|
2016-03-22 13:31:01 +01:00
|
|
|
final String userKeyString = userKey.toString();
|
|
|
|
updateColor(userKeyString, color);
|
|
|
|
editor.putInt(userKeyString, color);
|
2015-04-24 08:14:33 +02:00
|
|
|
editor.apply();
|
|
|
|
}
|
|
|
|
|
2016-03-21 16:28:03 +01:00
|
|
|
public void setUserNickname(@NonNull final UserKey userKey, final String nickname) {
|
2015-04-24 08:14:33 +02:00
|
|
|
final SharedPreferences.Editor editor = mNicknamePreferences.edit();
|
2016-03-22 13:31:01 +01:00
|
|
|
final String userKeyString = userKey.toString();
|
|
|
|
updateNickname(userKeyString, null);
|
|
|
|
editor.putString(userKeyString, nickname);
|
2015-04-24 08:14:33 +02:00
|
|
|
editor.apply();
|
|
|
|
}
|
|
|
|
|
2016-03-21 16:28:03 +01:00
|
|
|
public void clearUserNickname(@NonNull final UserKey userKey) {
|
2015-04-24 08:14:33 +02:00
|
|
|
final SharedPreferences.Editor editor = mNicknamePreferences.edit();
|
2016-03-22 13:31:01 +01:00
|
|
|
final String userKeyString = userKey.toString();
|
|
|
|
updateNickname(userKeyString, null);
|
|
|
|
editor.remove(userKeyString);
|
2015-04-24 08:14:33 +02:00
|
|
|
editor.apply();
|
|
|
|
}
|
|
|
|
|
2016-03-22 13:31:01 +01:00
|
|
|
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,
|
2016-03-26 14:42:41 +01:00
|
|
|
Activities.STATUS_USER_KEY, color, cv);
|
2016-03-22 13:31:01 +01:00
|
|
|
updateColumn(cr, Activities.AboutMe.CONTENT_URI, userKey, Activities.STATUS_RETWEET_USER_COLOR,
|
2016-03-31 15:18:44 +02:00
|
|
|
Activities.STATUS_RETWEETED_BY_USER_KEY, color, cv);
|
2016-03-22 13:31:01 +01:00
|
|
|
updateColumn(cr, Activities.AboutMe.CONTENT_URI, userKey, Activities.STATUS_QUOTED_USER_COLOR,
|
2016-03-31 15:18:44 +02:00
|
|
|
Activities.STATUS_QUOTED_USER_KEY, color, cv);
|
2016-03-22 13:31:01 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
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,
|
2016-03-26 14:42:41 +01:00
|
|
|
Activities.STATUS_USER_KEY, nickname, cv);
|
2016-03-22 13:31:01 +01:00
|
|
|
updateColumn(cr, Activities.AboutMe.CONTENT_URI, userKey, Activities.STATUS_RETWEET_USER_NICKNAME,
|
2016-03-31 15:18:44 +02:00
|
|
|
Activities.STATUS_RETWEETED_BY_USER_KEY, nickname, cv);
|
2016-03-22 13:31:01 +01:00
|
|
|
updateColumn(cr, Activities.AboutMe.CONTENT_URI, userKey, Activities.STATUS_QUOTED_USER_NICKNAME,
|
2016-03-31 15:18:44 +02:00
|
|
|
Activities.STATUS_QUOTED_USER_KEY, nickname, cv);
|
2016-03-22 13:31:01 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
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});
|
|
|
|
}
|
|
|
|
|
2016-03-22 05:46:05 +01:00
|
|
|
@WorkerThread
|
2016-03-21 16:28:03 +01:00
|
|
|
public String getDisplayName(final ParcelableUser user, final boolean nameFirst) {
|
|
|
|
return getDisplayName(user.key, user.name, user.screen_name, nameFirst);
|
2015-04-24 08:14:33 +02:00
|
|
|
}
|
|
|
|
|
2016-03-22 05:46:05 +01:00
|
|
|
@WorkerThread
|
2016-03-21 16:28:03 +01:00
|
|
|
public String getDisplayName(final User user, final boolean nameFirst) {
|
|
|
|
return getDisplayName(UserKeyUtils.fromUser(user), user.getName(), user.getScreenName(), nameFirst);
|
2015-04-24 08:14:33 +02:00
|
|
|
}
|
|
|
|
|
2016-03-22 05:46:05 +01:00
|
|
|
@WorkerThread
|
2016-03-21 16:28:03 +01:00
|
|
|
public String getDisplayName(final ParcelableUserList user, final boolean nameFirst) {
|
|
|
|
return getDisplayName(user.user_key, user.user_name, user.user_screen_name, nameFirst);
|
2015-04-24 08:14:33 +02:00
|
|
|
}
|
|
|
|
|
2016-03-22 05:46:05 +01:00
|
|
|
@WorkerThread
|
2016-03-21 16:28:03 +01:00
|
|
|
public String getDisplayName(final ParcelableStatus status, final boolean nameFirst) {
|
|
|
|
return getDisplayName(status.user_key, status.user_name, status.user_screen_name, nameFirst);
|
2016-03-07 18:25:18 +01:00
|
|
|
}
|
|
|
|
|
2016-03-22 05:46:05 +01:00
|
|
|
@WorkerThread
|
2016-03-07 18:25:18 +01:00
|
|
|
public String getDisplayName(@NonNull final UserKey userId, final String name,
|
2016-03-21 16:28:03 +01:00
|
|
|
final String screenName, final boolean nameFirst) {
|
|
|
|
return getDisplayName(userId.toString(), name, screenName, nameFirst);
|
2015-04-24 08:14:33 +02:00
|
|
|
}
|
|
|
|
|
2016-03-22 05:46:05 +01:00
|
|
|
@WorkerThread
|
2016-03-07 18:25:18 +01:00
|
|
|
public String getDisplayName(@NonNull final String userId, final String name,
|
2016-03-21 16:28:03 +01:00
|
|
|
final String screenName, final boolean nameFirst) {
|
2016-03-22 05:46:05 +01:00
|
|
|
final String nick = getUserNicknameInternal(userId);
|
2016-03-21 16:28:03 +01:00
|
|
|
return decideDisplayName(nick, name, screenName, nameFirst);
|
2016-03-07 18:25:18 +01:00
|
|
|
}
|
|
|
|
|
2016-03-22 05:46:05 +01:00
|
|
|
@WorkerThread
|
2016-03-21 16:28:03 +01:00
|
|
|
public int getUserColor(@NonNull final UserKey userId) {
|
|
|
|
return getUserColor(userId.toString());
|
2016-03-07 18:25:18 +01:00
|
|
|
}
|
|
|
|
|
2016-03-22 05:46:05 +01:00
|
|
|
@WorkerThread
|
2016-03-21 16:28:03 +01:00
|
|
|
public int getUserColor(@NonNull final String userId) {
|
|
|
|
return mColorPreferences.getInt(userId, Color.TRANSPARENT);
|
2015-04-24 08:14:33 +02:00
|
|
|
}
|
|
|
|
|
2016-03-22 05:46:05 +01:00
|
|
|
@WorkerThread
|
|
|
|
public String getUserNickname(@NonNull final UserKey userKey) {
|
2016-03-21 16:28:03 +01:00
|
|
|
final String userKeyString = userKey.toString();
|
|
|
|
if (mNicknamePreferences.contains(userKey.getId())) {
|
|
|
|
String nick = mNicknamePreferences.getString(userKey.getId(), null);
|
|
|
|
SharedPreferences.Editor editor = mNicknamePreferences.edit();
|
|
|
|
editor.remove(userKey.getId());
|
|
|
|
editor.putString(userKeyString, nick);
|
|
|
|
editor.apply();
|
|
|
|
return nick;
|
|
|
|
}
|
|
|
|
return mNicknamePreferences.getString(userKeyString, null);
|
2016-03-07 18:25:18 +01:00
|
|
|
}
|
|
|
|
|
2016-03-22 05:46:05 +01:00
|
|
|
@WorkerThread
|
2016-03-07 18:25:18 +01:00
|
|
|
public String getUserNickname(@NonNull final UserKey userId, final String name) {
|
2016-03-22 05:46:05 +01:00
|
|
|
final String nick = getUserNickname(userId);
|
|
|
|
return decideNickname(nick, name);
|
2016-03-07 18:25:18 +01:00
|
|
|
}
|
|
|
|
|
2016-03-22 05:46:05 +01:00
|
|
|
@WorkerThread
|
2016-03-21 16:28:03 +01:00
|
|
|
public String getUserNickname(@NonNull final String userId, final String name) {
|
2016-03-22 05:46:05 +01:00
|
|
|
final String nick = getUserNicknameInternal(userId);
|
|
|
|
return decideNickname(nick, name);
|
2015-04-24 08:14:33 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
public Set<? extends Map.Entry<String, ?>> getNameEntries() {
|
|
|
|
return mNicknamePreferences.getAll().entrySet();
|
|
|
|
}
|
|
|
|
|
2016-03-22 05:46:05 +01:00
|
|
|
@WorkerThread
|
|
|
|
private String getUserNicknameInternal(@NonNull final String userId) {
|
|
|
|
return mNicknamePreferences.getString(userId, null);
|
2016-01-04 03:02:23 +01:00
|
|
|
}
|
|
|
|
|
2016-02-01 07:58:34 +01:00
|
|
|
public interface UserColorChangedListener {
|
2016-03-07 18:25:18 +01:00
|
|
|
void onUserColorChanged(@NonNull UserKey userId, int color);
|
2015-04-24 08:14:33 +02:00
|
|
|
}
|
|
|
|
|
2016-02-01 07:58:34 +01:00
|
|
|
public interface UserNicknameChangedListener {
|
2016-03-07 18:25:18 +01:00
|
|
|
void onUserNicknameChanged(@NonNull UserKey userId, String nick);
|
2015-04-24 08:14:33 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
private static final class OnColorPreferenceChangeListener implements OnSharedPreferenceChangeListener {
|
|
|
|
|
2016-02-01 07:58:34 +01:00
|
|
|
private final UserColorChangedListener mListener;
|
2015-04-24 08:14:33 +02:00
|
|
|
|
2016-02-01 07:58:34 +01:00
|
|
|
OnColorPreferenceChangeListener(final UserColorChangedListener listener) {
|
2015-04-24 08:14:33 +02:00
|
|
|
mListener = listener;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void onSharedPreferenceChanged(final SharedPreferences sharedPreferences, final String key) {
|
2016-03-07 18:25:18 +01:00
|
|
|
final UserKey userId = UserKey.valueOf(key);
|
|
|
|
if (mListener != null && userId != null) {
|
2015-04-24 08:14:33 +02:00
|
|
|
mListener.onUserColorChanged(userId, sharedPreferences.getInt(key, 0));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
private static final class OnNickPreferenceChangeListener implements OnSharedPreferenceChangeListener {
|
|
|
|
|
2016-02-01 07:58:34 +01:00
|
|
|
private final UserNicknameChangedListener mListener;
|
2015-04-24 08:14:33 +02:00
|
|
|
|
2016-02-01 07:58:34 +01:00
|
|
|
OnNickPreferenceChangeListener(final UserNicknameChangedListener listener) {
|
2015-04-24 08:14:33 +02:00
|
|
|
mListener = listener;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void onSharedPreferenceChanged(final SharedPreferences sharedPreferences, final String key) {
|
2016-03-07 18:25:18 +01:00
|
|
|
final UserKey userId = UserKey.valueOf(key);
|
|
|
|
if (mListener != null && userId != null) {
|
2015-04-24 08:14:33 +02:00
|
|
|
mListener.onUserNicknameChanged(userId, sharedPreferences.getString(key, null));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|