1
0
mirror of https://github.com/TwidereProject/Twidere-Android synced 2025-02-17 04:00:48 +01:00

improved user info update

This commit is contained in:
Mariotaku Lee 2016-03-08 15:44:46 +08:00
parent 5e6fbc12c2
commit 2ad1fc3ef0
17 changed files with 141 additions and 146 deletions

View File

@ -21,40 +21,30 @@ package org.mariotaku.twidere.model;
import android.content.ContentValues;
import android.database.Cursor;
import android.location.Location;
import android.os.Parcel;
import android.os.Parcelable;
import android.support.annotation.Nullable;
import com.bluelinelabs.logansquare.annotation.JsonField;
import com.bluelinelabs.logansquare.annotation.JsonObject;
import com.hannesdorfmann.parcelableplease.annotation.ParcelablePlease;
import com.hannesdorfmann.parcelableplease.annotation.ParcelableThisPlease;
import org.mariotaku.library.objectcursor.converter.CursorFieldConverter;
import org.mariotaku.twidere.api.twitter.model.GeoLocation;
import org.mariotaku.twidere.util.ParseUtils;
import java.lang.reflect.ParameterizedType;
@ParcelablePlease
@JsonObject
public class ParcelableLocation implements Parcelable {
@ParcelableThisPlease
@JsonField(name = "latitude")
public double latitude;
@ParcelableThisPlease
@JsonField(name = "longitude")
public double longitude;
public static final Parcelable.Creator<ParcelableLocation> CREATOR = new Parcelable.Creator<ParcelableLocation>() {
@Override
public ParcelableLocation createFromParcel(final Parcel in) {
return new ParcelableLocation(in);
}
@Override
public ParcelableLocation[] newArray(final int size) {
return new ParcelableLocation[size];
}
};
public ParcelableLocation() {
}
@ -63,54 +53,6 @@ public class ParcelableLocation implements Parcelable {
this.longitude = longitude;
}
public ParcelableLocation(@Nullable final GeoLocation location) {
latitude = location != null ? location.getLatitude() : Double.NaN;
longitude = location != null ? location.getLongitude() : Double.NaN;
}
public ParcelableLocation(@Nullable final Location location) {
latitude = location != null ? location.getLatitude() : Double.NaN;
longitude = location != null ? location.getLongitude() : Double.NaN;
}
public ParcelableLocation(final Parcel in) {
latitude = in.readDouble();
longitude = in.readDouble();
}
@Nullable
public static ParcelableLocation fromString(@Nullable final String locationString) {
if (locationString == null) return null;
final String[] longlat = locationString.split(",");
if (longlat.length != 2) {
return null;
}
ParcelableLocation obj = new ParcelableLocation();
try {
obj.latitude = Double.parseDouble(longlat[0]);
obj.longitude = Double.parseDouble(longlat[1]);
} catch (NumberFormatException e) {
return null;
}
if (isValidLocation(obj)) return obj;
return null;
}
public static String toString(final ParcelableLocation location) {
if (!isValidLocation(location)) return null;
return toString(location.latitude, location.longitude);
}
public static String toString(double latitude, double longitude) {
return latitude + "," + longitude;
}
@Override
public int describeContents() {
return hashCode();
}
@Override
public boolean equals(final Object obj) {
if (this == obj) return true;
@ -124,24 +66,6 @@ public class ParcelableLocation implements Parcelable {
return true;
}
@Nullable
public static ParcelableLocation fromGeoLocation(@Nullable GeoLocation geoLocation) {
if (geoLocation == null) return null;
return new ParcelableLocation(geoLocation);
}
@Nullable
public static ParcelableLocation fromLocation(@Nullable Location location) {
if (location == null) return null;
return new ParcelableLocation(location);
}
public String getHumanReadableString(int decimalDigits) {
return String.format("%s,%s", ParseUtils.parsePrettyDecimal(latitude, decimalDigits),
ParseUtils.parsePrettyDecimal(longitude, decimalDigits));
}
@Override
public int hashCode() {
final int prime = 31;
@ -154,46 +78,63 @@ public class ParcelableLocation implements Parcelable {
return result;
}
public boolean isValid() {
return isValidLocation(latitude, longitude);
}
public static boolean isValidLocation(double latitude, double longitude) {
return !Double.isNaN(latitude) && !Double.isNaN(longitude);
}
public GeoLocation toGeoLocation() {
return isValid() ? new GeoLocation(latitude, longitude) : null;
}
@Override
public String toString() {
return "ParcelableLocation{latitude=" + latitude + ", longitude=" + longitude + "}";
return latitude + "," + longitude;
}
@Override
public void writeToParcel(final Parcel out, final int flags) {
out.writeDouble(latitude);
out.writeDouble(longitude);
}
@Nullable
public static ParcelableLocation valueOf(@Nullable final String locationString) {
if (locationString == null) return null;
final String[] longlat = locationString.split(",");
if (longlat.length != 2) {
return null;
}
public static boolean isValidLocation(final ParcelableLocation location) {
return location != null && location.isValid();
}
public static GeoLocation toGeoLocation(final ParcelableLocation location) {
return isValidLocation(location) ? location.toGeoLocation() : null;
ParcelableLocation obj = new ParcelableLocation();
try {
obj.latitude = Double.parseDouble(longlat[0]);
obj.longitude = Double.parseDouble(longlat[1]);
} catch (NumberFormatException e) {
return null;
}
if (Double.isNaN(obj.latitude) || Double.isNaN(obj.longitude)) return null;
return obj;
}
public static class Converter implements CursorFieldConverter<ParcelableLocation> {
@Override
public ParcelableLocation parseField(Cursor cursor, int columnIndex, ParameterizedType fieldType) {
return ParcelableLocation.fromString(cursor.getString(columnIndex));
return valueOf(cursor.getString(columnIndex));
}
@Override
public void writeField(ContentValues values, ParcelableLocation object, String columnName, ParameterizedType fieldType) {
values.put(columnName, ParcelableLocation.toString(object));
if (object == null) return;
values.put(columnName, object.toString());
}
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
ParcelableLocationParcelablePlease.writeToParcel(this, dest, flags);
}
public static final Creator<ParcelableLocation> CREATOR = new Creator<ParcelableLocation>() {
public ParcelableLocation createFromParcel(Parcel source) {
ParcelableLocation target = new ParcelableLocation();
ParcelableLocationParcelablePlease.readFromParcel(target, source);
return target;
}
public ParcelableLocation[] newArray(int size) {
return new ParcelableLocation[size];
}
};
}

View File

@ -50,17 +50,6 @@ public final class ParseUtils implements TwidereConstants {
return String.valueOf(object);
}
public static String parsePrettyDecimal(double num, int decimalDigits) {
String result = String.format(Locale.US, "%." + decimalDigits + "f", num);
int dotIdx = result.lastIndexOf('.');
if (dotIdx == -1) return result;
int i;
for (i = result.length() - 1; i >= 0; i--) {
if (result.charAt(i) != '0') break;
}
return result.substring(0, i == dotIdx ? dotIdx : i + 1);
}
public static int parseColor(String str, int def) {
if (isEmpty(str)) return def;
try {

View File

@ -117,6 +117,7 @@ import org.mariotaku.twidere.model.ParcelableUser;
import org.mariotaku.twidere.model.UserKey;
import org.mariotaku.twidere.model.draft.UpdateStatusActionExtra;
import org.mariotaku.twidere.model.util.ParcelableAccountUtils;
import org.mariotaku.twidere.model.util.ParcelableLocationUtils;
import org.mariotaku.twidere.preference.ServicePickerPreference;
import org.mariotaku.twidere.provider.TwidereDataStore.Drafts;
import org.mariotaku.twidere.service.BackgroundOperationService;
@ -1244,7 +1245,7 @@ public class ComposeActivity extends ThemedFragmentActivity implements OnMenuIte
private void setRecentLocation(ParcelableLocation location) {
if (location != null) {
mLocationText.setText(location.getHumanReadableString(3));
mLocationText.setText(ParcelableLocationUtils.getHumanReadableString(location, 3));
} else {
mLocationText.setText(R.string.unknown_location);
}
@ -1397,7 +1398,7 @@ public class ComposeActivity extends ThemedFragmentActivity implements OnMenuIte
public void onLocationChanged(final Location location) {
final ComposeActivity activity = mActivityRef.get();
if (activity == null) return;
activity.setRecentLocation(ParcelableLocation.fromLocation(location));
activity.setRecentLocation(ParcelableLocationUtils.fromLocation(location));
}
@Override

View File

@ -243,7 +243,7 @@ public abstract class AbsActivitiesFragment<Data> extends AbsContentListRecycler
public final Loader<Data> onCreateLoader(int id, Bundle args) {
final boolean fromUser = args.getBoolean(EXTRA_FROM_USER);
args.remove(EXTRA_FROM_USER);
return onCreateStatusesLoader(getActivity(), args, fromUser);
return onCreateActivitiesLoader(getActivity(), args, fromUser);
}
@Override
@ -527,8 +527,8 @@ public abstract class AbsActivitiesFragment<Data> extends AbsContentListRecycler
protected abstract boolean hasMoreData(Data data);
protected abstract Loader<Data> onCreateStatusesLoader(final Context context, final Bundle args,
final boolean fromUser);
protected abstract Loader<Data> onCreateActivitiesLoader(final Context context, final Bundle args,
final boolean fromUser);
protected abstract void onLoadingFinished();

View File

@ -101,9 +101,9 @@ public abstract class CursorActivitiesFragment extends AbsActivitiesFragment<Lis
public abstract Uri getContentUri();
@Override
protected Loader<List<ParcelableActivity>> onCreateStatusesLoader(final Context context,
final Bundle args,
final boolean fromUser) {
protected Loader<List<ParcelableActivity>> onCreateActivitiesLoader(final Context context,
final Bundle args,
final boolean fromUser) {
final Uri uri = getContentUri();
final String table = getTableNameByUri(uri);
final String sortOrder = getSortOrder();

View File

@ -119,6 +119,7 @@ import org.mariotaku.twidere.model.UserKey;
import org.mariotaku.twidere.model.message.FavoriteTaskEvent;
import org.mariotaku.twidere.model.message.StatusListChangedEvent;
import org.mariotaku.twidere.model.util.ParcelableActivityUtils;
import org.mariotaku.twidere.model.util.ParcelableLocationUtils;
import org.mariotaku.twidere.model.util.ParcelableMediaUtils;
import org.mariotaku.twidere.model.util.ParcelableStatusUtils;
import org.mariotaku.twidere.model.util.ParcelableUserUtils;
@ -1086,8 +1087,8 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
if (!TextUtils.isEmpty(placeFullName)) {
locationView.setVisibility(View.VISIBLE);
locationView.setText(placeFullName);
locationView.setClickable(ParcelableLocation.isValidLocation(location));
} else if (ParcelableLocation.isValidLocation(location)) {
locationView.setClickable(ParcelableLocationUtils.isValidLocation(location));
} else if (ParcelableLocationUtils.isValidLocation(location)) {
locationView.setVisibility(View.VISIBLE);
locationView.setText(R.string.view_map);
locationView.setClickable(true);
@ -1215,7 +1216,7 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
}
case R.id.location_view: {
final ParcelableLocation location = status.location;
if (!ParcelableLocation.isValidLocation(location)) return;
if (!ParcelableLocationUtils.isValidLocation(location)) return;
IntentUtils.openMap(adapter.getContext(), location.latitude, location.longitude);
break;
}

View File

@ -114,10 +114,8 @@ public final class ParcelableUserLoader extends AsyncTaskLoader<SingleResponse<P
try {
final User twitterUser = TwitterWrapper.tryShowUser(twitter, mUserId, mScreenName);
final ContentValues cachedUserValues = createCachedUser(twitterUser);
final long userId = twitterUser.getId();
resolver.insert(CachedUsers.CONTENT_URI, cachedUserValues);
final ParcelableUser user = ParcelableUserUtils.fromUser(twitterUser, accountKey);
user.account_color = accountColor;
return SingleResponse.getInstance(user);
} catch (final TwitterException e) {

View File

@ -68,7 +68,7 @@ public class ListResponse<Data> extends AbstractList<Data> implements Response<L
@Override
public boolean isEmpty() {
return list != null && list.isEmpty();
return list == null || list.isEmpty();
}
@Override

View File

@ -7,6 +7,7 @@ import android.support.annotation.NonNull;
import com.bluelinelabs.logansquare.annotation.JsonField;
import com.bluelinelabs.logansquare.annotation.JsonObject;
import org.mariotaku.twidere.TwidereConstants;
import org.mariotaku.twidere.constant.IntentConstants;
import org.mariotaku.twidere.model.UserKey;
@ -16,7 +17,7 @@ import java.util.Arrays;
* Created by mariotaku on 16/3/6.
*/
@JsonObject
public class TabArguments implements IntentConstants {
public class TabArguments implements TwidereConstants {
@JsonField(name = "account_id")
long accountId = -1;

View File

@ -0,0 +1,48 @@
package org.mariotaku.twidere.model.util;
import android.location.Location;
import android.support.annotation.Nullable;
import org.mariotaku.twidere.api.twitter.model.GeoLocation;
import org.mariotaku.twidere.model.ParcelableLocation;
import org.mariotaku.twidere.util.InternalParseUtils;
/**
* Created by mariotaku on 16/3/8.
*/
public class ParcelableLocationUtils {
public static String getHumanReadableString(ParcelableLocation obj, int decimalDigits) {
return String.format("%s,%s", InternalParseUtils.parsePrettyDecimal(obj.latitude, decimalDigits),
InternalParseUtils.parsePrettyDecimal(obj.longitude, decimalDigits));
}
@Nullable
public static ParcelableLocation fromGeoLocation(@Nullable GeoLocation geoLocation) {
if (geoLocation == null) return null;
final ParcelableLocation result = new ParcelableLocation();
result.latitude = geoLocation.getLatitude();
result.longitude = geoLocation.getLongitude();
return result;
}
@Nullable
public static ParcelableLocation fromLocation(@Nullable Location location) {
if (location == null) return null;
final ParcelableLocation result = new ParcelableLocation();
result.latitude = location.getLatitude();
result.longitude = location.getLongitude();
return result;
}
public static boolean isValidLocation(final ParcelableLocation location) {
return location != null && !Double.isNaN(location.latitude) && !Double.isNaN(location.longitude);
}
public static GeoLocation toGeoLocation(final ParcelableLocation location) {
return isValidLocation(location) ? new GeoLocation(location.latitude, location.longitude) : null;
}
public static boolean isValidLocation(double latitude, double longitude) {
return !Double.isNaN(latitude) && !Double.isNaN(longitude);
}
}

View File

@ -8,7 +8,6 @@ import org.mariotaku.twidere.api.twitter.model.Place;
import org.mariotaku.twidere.api.twitter.model.Status;
import org.mariotaku.twidere.api.twitter.model.User;
import org.mariotaku.twidere.api.twitter.model.UserMentionEntity;
import org.mariotaku.twidere.model.ParcelableLocation;
import org.mariotaku.twidere.model.ParcelableStatus;
import org.mariotaku.twidere.model.UserKey;
import org.mariotaku.twidere.util.HtmlEscapeHelper;
@ -68,7 +67,7 @@ public class ParcelableStatusUtils {
result.quoted_timestamp = quoted.getCreatedAt().getTime();
result.quoted_source = quoted.getSource();
result.quoted_media = ParcelableMediaUtils.fromStatus(quoted);
result.quoted_location = ParcelableLocation.fromGeoLocation(quoted.getGeoLocation());
result.quoted_location = ParcelableLocationUtils.fromGeoLocation(quoted.getGeoLocation());
result.quoted_place_full_name = getPlaceFullName(quoted.getPlace());
result.quoted_user_id = UserKeyUtils.fromUser(quoted_user);
@ -116,7 +115,7 @@ public class ParcelableStatusUtils {
result.media = ParcelableMediaUtils.fromStatus(status);
result.text_plain = InternalTwitterContentUtils.unescapeTwitterStatusText(status.getText());
result.source = status.getSource();
result.location = ParcelableLocation.fromGeoLocation(status.getGeoLocation());
result.location = ParcelableLocationUtils.fromGeoLocation(status.getGeoLocation());
result.is_favorite = status.isFavorited();
result.text_unescaped = HtmlEscapeHelper.toPlainText(result.text_html);
if (result.account_key.maybeEquals(result.retweeted_by_user_id)) {

View File

@ -61,7 +61,6 @@ import org.mariotaku.twidere.api.twitter.model.ErrorInfo;
import org.mariotaku.twidere.api.twitter.model.MediaUploadResponse;
import org.mariotaku.twidere.api.twitter.model.Status;
import org.mariotaku.twidere.api.twitter.model.StatusUpdate;
import org.mariotaku.twidere.api.twitter.model.UserMentionEntity;
import org.mariotaku.twidere.app.TwidereApplication;
import org.mariotaku.twidere.model.Draft;
import org.mariotaku.twidere.model.DraftCursorIndices;
@ -70,7 +69,6 @@ import org.mariotaku.twidere.model.MediaUploadResult;
import org.mariotaku.twidere.model.ParcelableAccount;
import org.mariotaku.twidere.model.ParcelableCredentials;
import org.mariotaku.twidere.model.ParcelableDirectMessage;
import org.mariotaku.twidere.model.ParcelableLocation;
import org.mariotaku.twidere.model.ParcelableMediaUpdate;
import org.mariotaku.twidere.model.ParcelableStatus;
import org.mariotaku.twidere.model.ParcelableStatusUpdate;
@ -84,6 +82,7 @@ import org.mariotaku.twidere.model.draft.UpdateStatusActionExtra;
import org.mariotaku.twidere.model.util.ParcelableAccountUtils;
import org.mariotaku.twidere.model.util.ParcelableCredentialsUtils;
import org.mariotaku.twidere.model.util.ParcelableDirectMessageUtils;
import org.mariotaku.twidere.model.util.ParcelableLocationUtils;
import org.mariotaku.twidere.model.util.ParcelableStatusUpdateUtils;
import org.mariotaku.twidere.model.util.ParcelableStatusUtils;
import org.mariotaku.twidere.model.util.ParcelableUserMentionUtils;
@ -646,7 +645,7 @@ public class BackgroundOperationService extends IntentService implements Constan
status.inReplyToStatusId(statusUpdate.in_reply_to_status.id);
}
if (statusUpdate.location != null) {
status.location(ParcelableLocation.toGeoLocation(statusUpdate.location));
status.location(ParcelableLocationUtils.toGeoLocation(statusUpdate.location));
}
if (uploader == null && hasMedia) {
final long[] mediaIds = new long[statusUpdate.media.length];

View File

@ -32,7 +32,7 @@ public class UpdateAccountInfoTask extends AbstractTask<Pair<UserKey, Parcelable
final ContentResolver resolver = context.getContentResolver();
final UserKey accountKey = params.first;
final ParcelableUser user = params.second;
if (!Utils.isMyAccount(context, user.key)) {
if (!Utils.isMyAccount(context, user.key) || user.is_cache) {
return null;
}

View File

@ -905,8 +905,10 @@ public class DataStoreUtils implements Constants {
Expression.likeRaw(new Column(Accounts.ACCOUNT_KEY), "?||\'@%\'")).getSQL();
whereArgs = new String[]{String.valueOf(accountId), String.valueOf(accountId)};
} else {
where = Expression.equalsArgs(Accounts.ACCOUNT_KEY).getSQL();
whereArgs = new String[]{String.valueOf(accountKey.toString())};
where = Expression.or(Expression.equalsArgs(Accounts.ACCOUNT_KEY),
Expression.equalsArgs(Accounts.ACCOUNT_KEY)).getSQL();
whereArgs = new String[]{String.valueOf(accountKey.toString()),
String.valueOf(accountId)};
}
return cr.query(Accounts.CONTENT_URI, columns, where, whereArgs, null);
}
@ -916,12 +918,15 @@ public class DataStoreUtils implements Constants {
final long... ids) {
if (ids == null) return null;
final ContentResolver cr = context.getContentResolver();
Expression[] expressions = new Expression[ids.length];
Expression[] expressions = new Expression[ids.length + 1];
for (int i = 0, j = ids.length; i < j; i++) {
expressions[i] = Expression.likeRaw(new Column(Accounts.ACCOUNT_KEY), "?||\'@%\'");
}
expressions[ids.length] = Expression.inArgs(new Column(Accounts.ACCOUNT_KEY), ids.length);
final String where = Expression.or(expressions).getSQL();
final String[] whereArgs = TwidereArrayUtils.toStringArray(ids);
final String[] whereArgs = new String[ids.length * 2];
System.arraycopy(TwidereArrayUtils.toStringArray(ids), 0, whereArgs, 0, ids.length);
System.arraycopy(whereArgs, 0, whereArgs, ids.length, ids.length);
return cr.query(Accounts.CONTENT_URI, columns, where, whereArgs, null);
}

View File

@ -25,12 +25,12 @@ import org.mariotaku.twidere.constant.SharedPreferenceConstants;
import org.mariotaku.twidere.fragment.support.SensitiveContentWarningDialogFragment;
import org.mariotaku.twidere.fragment.support.UserFragment;
import org.mariotaku.twidere.model.ParcelableDirectMessage;
import org.mariotaku.twidere.model.ParcelableLocation;
import org.mariotaku.twidere.model.ParcelableMedia;
import org.mariotaku.twidere.model.ParcelableStatus;
import org.mariotaku.twidere.model.ParcelableUser;
import org.mariotaku.twidere.model.ParcelableUserList;
import org.mariotaku.twidere.model.UserKey;
import org.mariotaku.twidere.model.util.ParcelableLocationUtils;
import java.util.ArrayList;
import java.util.List;
@ -273,7 +273,7 @@ public class IntentUtils implements Constants {
}
public static void openMap(@NonNull final Context context, final double latitude, final double longitude) {
if (!ParcelableLocation.isValidLocation(latitude, longitude)) return;
if (!ParcelableLocationUtils.isValidLocation(latitude, longitude)) return;
final Uri.Builder builder = new Uri.Builder();
builder.scheme(SCHEME_TWIDERE);
builder.authority(AUTHORITY_MAP);

View File

@ -14,6 +14,7 @@ import org.mariotaku.twidere.constant.IntentConstants;
import java.io.IOException;
import java.io.StringWriter;
import java.util.Iterator;
import java.util.Locale;
import java.util.Set;
/**
@ -99,4 +100,15 @@ public class InternalParseUtils {
return CompatibilityConstants.EXTRA_ACCOUNT_ID.equals(key) || IntentConstants.EXTRA_USER_ID.equals(key) || IntentConstants.EXTRA_STATUS_ID.equals(key)
|| IntentConstants.EXTRA_LIST_ID.equals(key);
}
public static String parsePrettyDecimal(double num, int decimalDigits) {
String result = String.format(Locale.US, "%." + decimalDigits + "f", num);
int dotIdx = result.lastIndexOf('.');
if (dotIdx == -1) return result;
int i;
for (i = result.length() - 1; i >= 0; i--) {
if (result.charAt(i) != '0') break;
}
return result.substring(0, i == dotIdx ? dotIdx : i + 1);
}
}

View File

@ -25,6 +25,7 @@ import org.mariotaku.twidere.model.ParcelableLocation;
import org.mariotaku.twidere.model.ParcelableMedia;
import org.mariotaku.twidere.model.ParcelableStatus;
import org.mariotaku.twidere.model.UserKey;
import org.mariotaku.twidere.model.util.ParcelableLocationUtils;
import org.mariotaku.twidere.util.AsyncTwitterWrapper;
import org.mariotaku.twidere.util.HtmlSpanBuilder;
import org.mariotaku.twidere.util.MediaLoaderWrapper;
@ -551,7 +552,7 @@ public class StatusViewHolder extends ViewHolder implements Constants, IStatusVi
extraTypeView.setImageResource(sensitive ? R.drawable.ic_action_warning : R.drawable.ic_action_gallery);
}
extraTypeView.setVisibility(View.VISIBLE);
} else if (ParcelableLocation.isValidLocation(location) || !TextUtils.isEmpty(placeFullName)) {
} else if (ParcelableLocationUtils.isValidLocation(location) || !TextUtils.isEmpty(placeFullName)) {
extraTypeView.setImageResource(R.drawable.ic_action_location);
extraTypeView.setVisibility(View.VISIBLE);
} else {