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

make fanfou favorite work

This commit is contained in:
Mariotaku Lee 2016-03-11 20:28:46 +08:00
parent 5a96097e10
commit 25714f06b9
9 changed files with 199 additions and 44 deletions

View File

@ -36,11 +36,11 @@ android {
}
dependencies {
apt 'com.bluelinelabs:logansquare-compiler:1.3.4'
apt 'com.bluelinelabs:logansquare-compiler:1.3.7'
apt 'com.hannesdorfmann.parcelableplease:processor:1.0.2'
apt 'com.github.mariotaku.ObjectCursor:processor:0.9.6'
compile 'com.android.support:support-annotations:23.2.0'
compile 'com.bluelinelabs:logansquare:1.3.4'
compile 'com.android.support:support-annotations:23.2.1'
compile 'com.bluelinelabs:logansquare:1.3.7'
compile 'com.github.mariotaku.RestFu:library:0.9.24'
compile 'com.hannesdorfmann.parcelableplease:annotation:1.0.2'
compile 'com.github.mariotaku.ObjectCursor:core:0.9.6'

View File

@ -37,7 +37,7 @@ android {
}
dependencies {
apt 'com.bluelinelabs:logansquare-compiler:1.3.4'
apt 'com.bluelinelabs:logansquare-compiler:1.3.7'
compile 'com.github.mariotaku.RestFu:urlconnection:0.9.24'
compile project(':twidere.library.extension')
compile fileTree(dir: 'libs', include: ['*.jar'])

View File

@ -74,17 +74,17 @@ repositories {
dependencies {
// wearApp project(':twidere.wear')
apt 'com.bluelinelabs:logansquare-compiler:1.3.4'
androidTestApt 'com.bluelinelabs:logansquare-compiler:1.3.4'
apt 'com.bluelinelabs:logansquare-compiler:1.3.7'
androidTestApt 'com.bluelinelabs:logansquare-compiler:1.3.7'
apt 'com.hannesdorfmann.parcelableplease:processor:1.0.2'
apt 'com.google.dagger:dagger-compiler:2.0.2'
apt "com.github.mariotaku.ObjectCursor:processor:0.9.6"
compile 'com.android.support:multidex:1.0.1'
compile 'com.android.support:support-v13:23.2.0'
compile 'com.android.support:appcompat-v7:23.2.0'
compile 'com.android.support:cardview-v7:23.2.0'
compile 'com.android.support:recyclerview-v7:23.2.0'
compile 'com.android.support:support-v13:23.2.1'
compile 'com.android.support:appcompat-v7:23.2.1'
compile 'com.android.support:cardview-v7:23.2.1'
compile 'com.android.support:recyclerview-v7:23.2.1'
compile 'com.twitter:twitter-text:1.13.0'
compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
compile 'com.squareup:otto:1.3.8'
@ -103,7 +103,7 @@ dependencies {
compile 'com.squareup:tape:1.2.3'
compile 'org.apache.commons:commons-lang3:3.4'
compile 'commons-primitives:commons-primitives:1.0'
compile 'com.bluelinelabs:logansquare:1.3.4'
compile 'com.bluelinelabs:logansquare:1.3.7'
compile 'org.jraf:android-switch-backport:2.0.1'
compile 'com.makeramen:roundedimageview:2.1.1'
compile 'com.soundcloud.android:android-crop:1.0.1@aar'
@ -114,8 +114,8 @@ dependencies {
compile 'com.lnikkila:extendedtouchview:0.1.0'
compile 'com.google.dagger:dagger:2.0.2'
compile 'org.attoparser:attoparser:1.4.0.RELEASE'
compile 'com.github.mariotaku.MediaViewerLibrary:base:0.9.12'
compile 'com.github.mariotaku.MediaViewerLibrary:subsample-image-view:0.9.12'
compile 'com.github.mariotaku.MediaViewerLibrary:base:0.9.13'
compile 'com.github.mariotaku.MediaViewerLibrary:subsample-image-view:0.9.13'
compile 'com.github.mariotaku.SQLiteQB:library:0.9.6'
compile 'com.github.mariotaku.ObjectCursor:core:0.9.6'
@ -137,7 +137,7 @@ dependencies {
testCompile 'junit:junit:4.12'
androidTestCompile 'com.android.support:support-annotations:23.2.0'
androidTestCompile 'com.android.support:support-annotations:23.2.1'
androidTestCompile 'com.android.support.test:runner:0.5'
androidTestCompile 'com.android.support.test:rules:0.5'
}

View File

@ -46,14 +46,14 @@ public class ThemedAppCompatDelegateFactory implements Constants {
public static ThemedAppCompatDelegate create(@NonNull final IThemedActivity themed,
@NonNull final AppCompatCallback callback) {
final Activity activity = (Activity) themed;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
return new ThemedAppCompatDelegate(themed, activity, activity.getWindow(), callback);
} else {
throw new UnsupportedOperationException();
}
}
public static final class ThemedAppCompatDelegate extends AppCompatDelegateImplV11 {
public static final class ThemedAppCompatDelegate extends AppCompatDelegateImplV14 {
private final IThemedActivity themed;
private KeyListener keyListener;

View File

@ -0,0 +1,76 @@
package edu.tsinghua.hotmobi.model;
import android.content.Context;
import android.os.Parcel;
import android.os.Parcelable;
import android.support.annotation.NonNull;
import com.bluelinelabs.logansquare.annotation.JsonField;
import com.bluelinelabs.logansquare.annotation.JsonObject;
import com.hannesdorfmann.parcelableplease.annotation.ParcelablePlease;
import org.mariotaku.twidere.model.ParcelableMedia;
/**
* Created by mariotaku on 16/3/11.
*/
@JsonObject
@ParcelablePlease
public class MediaDownloadEvent extends BaseEvent implements Parcelable {
@ParcelableMedia.Type
@JsonField(name = "type")
int type;
@JsonField(name = "url")
String url;
@JsonField(name = "media_url")
String mediaUrl;
@JsonField(name = "size")
long size;
public void setMedia(ParcelableMedia media) {
this.type = media.type;
this.url = media.url;
this.mediaUrl = media.media_url;
}
public void setSize(long size) {
this.size = size;
}
@NonNull
@Override
public String getLogFileName() {
return "media_download";
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
MediaDownloadEventParcelablePlease.writeToParcel(this, dest, flags);
}
public static final Creator<MediaDownloadEvent> CREATOR = new Creator<MediaDownloadEvent>() {
public MediaDownloadEvent createFromParcel(Parcel source) {
MediaDownloadEvent target = new MediaDownloadEvent();
MediaDownloadEventParcelablePlease.readFromParcel(target, source);
return target;
}
public MediaDownloadEvent[] newArray(int size) {
return new MediaDownloadEvent[size];
}
};
public static MediaDownloadEvent create(Context context, ParcelableMedia media, long total) {
final MediaDownloadEvent event = new MediaDownloadEvent();
event.markStart(context);
event.setMedia(media);
event.setSize(total);
return event;
}
}

View File

@ -22,6 +22,7 @@ import android.app.Activity;
import android.app.DialogFragment;
import android.app.FragmentManager;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.media.MediaPlayer;
@ -81,9 +82,9 @@ import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.iface.IExtendedActivity;
import org.mariotaku.twidere.fragment.ProgressDialogFragment;
import org.mariotaku.twidere.model.UserKey;
import org.mariotaku.twidere.model.ParcelableMedia;
import org.mariotaku.twidere.model.ParcelableStatus;
import org.mariotaku.twidere.model.UserKey;
import org.mariotaku.twidere.provider.CacheProvider;
import org.mariotaku.twidere.task.SaveFileTask;
import org.mariotaku.twidere.task.SaveImageToGalleryTask;
@ -102,6 +103,9 @@ import java.util.concurrent.TimeUnit;
import javax.inject.Inject;
import edu.tsinghua.hotmobi.HotMobiLogger;
import edu.tsinghua.hotmobi.model.MediaDownloadEvent;
public final class MediaViewerActivity extends AbsMediaViewerActivity implements Constants,
AppCompatCallback, TaskStackBuilder.SupportParentable, ActionBarDrawerToggle.DelegateProvider,
IExtendedActivity {
@ -225,31 +229,28 @@ public final class MediaViewerActivity extends AbsMediaViewerActivity implements
@Override
protected MediaViewerFragment instantiateMediaFragment(int position) {
final ParcelableMedia media = getMedia()[position];
final Bundle args = new Bundle();
final Intent intent = getIntent();
args.putParcelable(EXTRA_ACCOUNT_KEY, intent.getParcelableExtra(EXTRA_ACCOUNT_KEY));
args.putParcelable(EXTRA_MEDIA, media);
args.putParcelable(EXTRA_STATUS, intent.getParcelableExtra(EXTRA_STATUS));
switch (media.type) {
case ParcelableMedia.Type.IMAGE: {
final Bundle args = new Bundle();
args.putParcelable(EXTRA_ACCOUNT_KEY, getIntent().getParcelableExtra(EXTRA_ACCOUNT_KEY));
args.putParcelable(ImagePageFragment.EXTRA_MEDIA_URI, Uri.parse(media.media_url));
return (MediaViewerFragment) Fragment.instantiate(this,
ImagePageFragment.class.getName(), args);
}
case ParcelableMedia.Type.ANIMATED_GIF:
case ParcelableMedia.Type.CARD_ANIMATED_GIF: {
final Bundle args = new Bundle();
args.putBoolean(VideoPageFragment.EXTRA_LOOP, true);
args.putParcelable(EXTRA_MEDIA, media);
return (MediaViewerFragment) Fragment.instantiate(this,
VideoPageFragment.class.getName(), args);
}
case ParcelableMedia.Type.VIDEO: {
final Bundle args = new Bundle();
args.putParcelable(EXTRA_MEDIA, media);
return (MediaViewerFragment) Fragment.instantiate(this,
VideoPageFragment.class.getName(), args);
}
case ParcelableMedia.Type.EXTERNAL_PLAYER: {
final Bundle args = new Bundle();
args.putParcelable(EXTRA_MEDIA, media);
return (MediaViewerFragment) Fragment.instantiate(this,
ExternalBrowserPageFragment.class.getName(), args);
}
@ -821,11 +822,12 @@ public final class MediaViewerActivity extends AbsMediaViewerActivity implements
public static class ImagePageFragment extends SubsampleImageViewerFragment {
private int mMediaLoadState;
private MediaDownloadEvent mMediaDownloadEvent;
@Override
protected Object getDownloadExtra() {
final MediaExtra mediaExtra = new MediaExtra();
mediaExtra.setAccountKey(getArguments().<UserKey>getParcelable(EXTRA_ACCOUNT_KEY));
mediaExtra.setAccountKey(getAccountKey());
final Uri origDownloadUri = super.getDownloadUri();
final Uri downloadUri = getDownloadUri();
if (origDownloadUri != null && downloadUri != null) {
@ -899,6 +901,33 @@ public final class MediaViewerActivity extends AbsMediaViewerActivity implements
protected void setupImageView(SubsamplingScaleImageView imageView) {
imageView.setMaxScale(getResources().getDisplayMetrics().density);
}
private ParcelableMedia getMedia() {
return getArguments().getParcelable(EXTRA_MEDIA);
}
private UserKey getAccountKey() {
return getArguments().getParcelable(EXTRA_ACCOUNT_KEY);
}
@Override
public void onDownloadStart(long total) {
super.onDownloadStart(total);
final Context context = getContext();
if (context != null) {
mMediaDownloadEvent = MediaDownloadEvent.create(context, getMedia(), total);
} else {
mMediaDownloadEvent = null;
}
}
@Override
public void onDownloadFinished() {
super.onDownloadFinished();
if (mMediaDownloadEvent != null) {
HotMobiLogger.getInstance(getContext()).log(getAccountKey(), mMediaDownloadEvent);
}
}
}
public static class VideoPageFragment extends CacheDownloadMediaViewerFragment
@ -928,6 +957,7 @@ public final class MediaViewerActivity extends AbsMediaViewerActivity implements
private VideoPlayProgressRunnable mVideoProgressRunnable;
private MediaPlayer mMediaPlayer;
private int mMediaPlayerError;
private MediaDownloadEvent mMediaDownloadEvent;
@Override
protected Object getDownloadExtra() {
@ -958,9 +988,6 @@ public final class MediaViewerActivity extends AbsMediaViewerActivity implements
return Uri.parse(bestVideoUrlAndType.first);
}
private ParcelableMedia getMedia() {
return getArguments().getParcelable(EXTRA_MEDIA);
}
@Override
protected void displayMedia(CacheDownloadLoader.Result result) {
@ -1162,6 +1189,33 @@ public final class MediaViewerActivity extends AbsMediaViewerActivity implements
return inflater.inflate(R.layout.layout_media_viewer_texture_video_view, container, false);
}
@Override
public void onDownloadStart(long total) {
super.onDownloadStart(total);
final Context context = getContext();
if (context != null) {
mMediaDownloadEvent = MediaDownloadEvent.create(context, getMedia(), total);
} else {
mMediaDownloadEvent = null;
}
}
@Override
public void onDownloadFinished() {
super.onDownloadFinished();
if (mMediaDownloadEvent != null) {
HotMobiLogger.getInstance(getContext()).log(getAccountKey(), mMediaDownloadEvent);
}
}
private ParcelableMedia getMedia() {
return getArguments().getParcelable(EXTRA_MEDIA);
}
private UserKey getAccountKey() {
return getArguments().getParcelable(EXTRA_ACCOUNT_KEY);
}
private static class VideoPlayProgressRunnable implements Runnable {
private final Handler mHandler;

View File

@ -139,7 +139,8 @@ public abstract class ThemedAppCompatActivity extends AppCompatActivity implemen
mCurrentThemeBackgroundOption = getThemeBackgroundOption();
mCurrentThemeFontFamily = getThemeFontFamily();
super.onApplyThemeResource(theme, resId, first);
ThemeUtils.applyToolbarItemColor(this, getActionBarToolbar(), mCurrentThemeColor);
final Toolbar actionBarToolbar = getActionBarToolbar();
ThemeUtils.applyToolbarItemColor(this, actionBarToolbar, mCurrentThemeColor);
}
@Override

View File

@ -115,7 +115,6 @@ public class TwidereApplication extends Application implements Constants,
StrictModeUtils.detectAllVmPolicy();
}
super.onCreate();
resetTheme(getSharedPreferences());
initializeAsyncTask();
initDebugMode();
initBugReport();
@ -252,7 +251,7 @@ public class TwidereApplication extends Application implements Constants,
break;
}
case KEY_THEME: {
resetTheme(preferences);
// resetTheme(preferences);
break;
}
}

View File

@ -55,6 +55,8 @@ import org.mariotaku.twidere.api.twitter.model.User;
import org.mariotaku.twidere.api.twitter.model.UserList;
import org.mariotaku.twidere.api.twitter.model.UserListUpdate;
import org.mariotaku.twidere.model.ListResponse;
import org.mariotaku.twidere.model.ParcelableAccount;
import org.mariotaku.twidere.model.ParcelableCredentials;
import org.mariotaku.twidere.model.ParcelableStatus;
import org.mariotaku.twidere.model.ParcelableUser;
import org.mariotaku.twidere.model.ParcelableUserList;
@ -73,6 +75,8 @@ import org.mariotaku.twidere.model.message.StatusRetweetedEvent;
import org.mariotaku.twidere.model.message.UserListCreatedEvent;
import org.mariotaku.twidere.model.message.UserListDestroyedEvent;
import org.mariotaku.twidere.model.message.UsersBlockedEvent;
import org.mariotaku.twidere.model.util.ParcelableAccountUtils;
import org.mariotaku.twidere.model.util.ParcelableCredentialsUtils;
import org.mariotaku.twidere.model.util.ParcelableStatusUtils;
import org.mariotaku.twidere.model.util.ParcelableUserListUtils;
import org.mariotaku.twidere.model.util.ParcelableUserUtils;
@ -699,11 +703,23 @@ public class AsyncTwitterWrapper extends TwitterWrapper {
@Override
protected SingleResponse<ParcelableStatus> doInBackground(final Object... params) {
final Twitter twitter = TwitterAPIFactory.getTwitterInstance(mContext, mAccountKey, true);
final ParcelableCredentials credentials = ParcelableCredentialsUtils.getCredentials(mContext, mAccountKey);
if (credentials == null) return SingleResponse.getInstance();
final Twitter twitter = TwitterAPIFactory.getTwitterInstance(mContext, credentials, true, true);
if (twitter == null) return SingleResponse.getInstance();
try {
final ParcelableStatus result = ParcelableStatusUtils.fromStatus(twitter.createFavorite(mStatusId),
mAccountKey, false);
final ParcelableStatus result;
switch (ParcelableAccountUtils.getAccountType(credentials)) {
case ParcelableAccount.Type.FANFOU: {
result = ParcelableStatusUtils.fromStatus(twitter.createFanfouFavorite(mStatusId),
mAccountKey, false);
break;
}
default: {
result = ParcelableStatusUtils.fromStatus(twitter.createFavorite(mStatusId),
mAccountKey, false);
}
}
Utils.setLastSeen(mContext, result.mentions, System.currentTimeMillis());
final ContentValues values = new ContentValues();
values.put(Statuses.IS_FAVORITE, true);
@ -1151,17 +1167,26 @@ public class AsyncTwitterWrapper extends TwitterWrapper {
@Override
protected SingleResponse<ParcelableStatus> doInBackground(final Object... params) {
final Twitter twitter = TwitterAPIFactory.getTwitterInstance(mContext, mAccountKey, true);
if (twitter == null) {
return SingleResponse.getInstance();
}
final ParcelableCredentials credentials = ParcelableCredentialsUtils.getCredentials(mContext, mAccountKey);
if (credentials == null) return SingleResponse.getInstance();
final Twitter twitter = TwitterAPIFactory.getTwitterInstance(mContext, credentials, true, true);
if (twitter == null) return SingleResponse.getInstance();
try {
final ParcelableStatus status = ParcelableStatusUtils.fromStatus(twitter.destroyFavorite(mStatusId),
mAccountKey, false);
final ParcelableStatus result;
switch (ParcelableAccountUtils.getAccountType(credentials)) {
case ParcelableAccount.Type.FANFOU: {
result = ParcelableStatusUtils.fromStatus(twitter.destroyFanfouFavorite(mStatusId),
mAccountKey, false);
break;
}
default: {
result = ParcelableStatusUtils.fromStatus(twitter.destroyFavorite(mStatusId),
mAccountKey, false);
}
}
final ContentValues values = new ContentValues();
values.put(Statuses.IS_FAVORITE, false);
values.put(Statuses.FAVORITE_COUNT, status.favorite_count - 1);
values.put(Statuses.FAVORITE_COUNT, result.favorite_count - 1);
final Expression where = Expression.and(Expression.equalsArgs(Statuses.ACCOUNT_KEY),
Expression.or(Expression.equalsArgs(Statuses.STATUS_ID),
Expression.equalsArgs(Statuses.RETWEET_ID)));
@ -1169,7 +1194,7 @@ public class AsyncTwitterWrapper extends TwitterWrapper {
for (final Uri uri : TwidereDataStore.STATUSES_URIS) {
mResolver.update(uri, values, where.getSQL(), whereArgs);
}
return SingleResponse.getInstance(status);
return SingleResponse.getInstance(result);
} catch (final TwitterException e) {
return SingleResponse.getInstance(e);
}