diff --git a/twidere.component.common/build.gradle b/twidere.component.common/build.gradle index d9a1ec0fc..27197225d 100644 --- a/twidere.component.common/build.gradle +++ b/twidere.component.common/build.gradle @@ -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' diff --git a/twidere.extension.twitlonger/build.gradle b/twidere.extension.twitlonger/build.gradle index 8b4e75963..d0bb2c946 100644 --- a/twidere.extension.twitlonger/build.gradle +++ b/twidere.extension.twitlonger/build.gradle @@ -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']) diff --git a/twidere/build.gradle b/twidere/build.gradle index d6f69e1c5..7993fd4b4 100644 --- a/twidere/build.gradle +++ b/twidere/build.gradle @@ -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' } diff --git a/twidere/src/main/java/android/support/v7/app/ThemedAppCompatDelegateFactory.java b/twidere/src/main/java/android/support/v7/app/ThemedAppCompatDelegateFactory.java index 0c6b63d9d..616280289 100644 --- a/twidere/src/main/java/android/support/v7/app/ThemedAppCompatDelegateFactory.java +++ b/twidere/src/main/java/android/support/v7/app/ThemedAppCompatDelegateFactory.java @@ -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; diff --git a/twidere/src/main/java/edu/tsinghua/hotmobi/model/MediaDownloadEvent.java b/twidere/src/main/java/edu/tsinghua/hotmobi/model/MediaDownloadEvent.java new file mode 100644 index 000000000..4d59d6902 --- /dev/null +++ b/twidere/src/main/java/edu/tsinghua/hotmobi/model/MediaDownloadEvent.java @@ -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 CREATOR = new Creator() { + 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; + } +} diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/MediaViewerActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/support/MediaViewerActivity.java index 913ed0867..11885864f 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/MediaViewerActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/support/MediaViewerActivity.java @@ -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().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; diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/ThemedAppCompatActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/support/ThemedAppCompatActivity.java index 1e311c2ae..8708b2c34 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/ThemedAppCompatActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/support/ThemedAppCompatActivity.java @@ -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 diff --git a/twidere/src/main/java/org/mariotaku/twidere/app/TwidereApplication.java b/twidere/src/main/java/org/mariotaku/twidere/app/TwidereApplication.java index 283468cdf..2394d9300 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/app/TwidereApplication.java +++ b/twidere/src/main/java/org/mariotaku/twidere/app/TwidereApplication.java @@ -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; } } diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/AsyncTwitterWrapper.java b/twidere/src/main/java/org/mariotaku/twidere/util/AsyncTwitterWrapper.java index 88c5ccb73..7a25b3ac9 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/util/AsyncTwitterWrapper.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/AsyncTwitterWrapper.java @@ -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 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 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); }