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 99bdf8a204..7ea325cbec 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 @@ -76,6 +76,9 @@ import java.io.File; +import pl.droidsonroids.gif.GifTextureView; +import pl.droidsonroids.gif.InputSource.FileSource; + public final class MediaViewerActivity extends ThemedActionBarActivity implements Constants, OnPageChangeListener { @@ -368,15 +371,19 @@ public static final class ImagePageFragment extends BaseSupportFragment implements DownloadListener, LoaderCallbacks, OnLayoutChangeListener, OnClickListener { private SubsamplingScaleImageView mImageView; + private GifTextureView mGifImageView; private ProgressWheel mProgressBar; private boolean mLoaderInitialized; private float mContentLength; private SaveImageTask mSaveImageTask; + private File mImageFile; + @Override public void onBaseViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onBaseViewCreated(view, savedInstanceState); mImageView = (SubsamplingScaleImageView) view.findViewById(R.id.image_view); + mGifImageView = (GifTextureView) view.findViewById(R.id.gif_image_view); mProgressBar = (ProgressWheel) view.findViewById(R.id.progress); } @@ -405,29 +412,27 @@ private ParcelableMedia getMedia() { @Override public void onLoadFinished(final Loader loader, final TileImageLoader.Result data) { if (data.hasData()) { - mImageView.setVisibility(View.VISIBLE); - mImageView.setTag(data.file); + mImageFile = data.file; if (data.useDecoder) { + mGifImageView.setVisibility(View.GONE); + mImageView.setVisibility(View.VISIBLE); mImageView.setImage(ImageSource.uri(Uri.fromFile(data.file))); } else if ("image/gif".equals(data.options.outMimeType)) { -// try { -// final FileDescriptor fd = new RandomAccessFile(data.file, "r").getFD(); -// mImageView.setImageDrawable(new GifDrawable(fd)); -// } catch (IOException e) { -// mImageView.setImage(null); -// mImageView.setTag(null); -// mImageView.setVisibility(View.GONE); -// Utils.showErrorMessage(getActivity(), null, e, true); -// } + mGifImageView.setVisibility(View.VISIBLE); + mImageView.setVisibility(View.GONE); + mGifImageView.setInputSource(new FileSource(data.file)); updateScaleLimit(); } else { + mGifImageView.setVisibility(View.GONE); + mImageView.setVisibility(View.VISIBLE); mImageView.setImage(ImageSource.bitmap(data.bitmap)); updateScaleLimit(); } } else { mImageView.recycle(); - mImageView.setTag(null); + mImageFile = null; mImageView.setVisibility(View.GONE); + mGifImageView.setVisibility(View.GONE); Utils.showErrorMessage(getActivity(), null, data.exception, true); } mProgressBar.setVisibility(View.GONE); @@ -451,28 +456,26 @@ public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Override public void onPrepareOptionsMenu(Menu menu) { super.onPrepareOptionsMenu(menu); - final Object imageTag = mImageView.getTag(); + final File file = mImageFile; final boolean isLoading = getLoaderManager().hasRunningLoaders(); - final boolean hasImage = imageTag instanceof File; + final boolean hasImage = file != null && file.exists(); MenuUtils.setMenuItemAvailability(menu, R.id.refresh, !hasImage && !isLoading); MenuUtils.setMenuItemAvailability(menu, R.id.share, hasImage && !isLoading); MenuUtils.setMenuItemAvailability(menu, R.id.save, hasImage && !isLoading); - if (hasImage) { - final MenuItem shareItem = menu.findItem(R.id.share); - final ShareActionProvider shareProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(shareItem); - final File file = (File) imageTag; - final Intent intent = new Intent(Intent.ACTION_SEND); - final Uri fileUri = Uri.fromFile(file); - intent.setDataAndType(fileUri, Utils.getImageMimeType(file)); - intent.putExtra(Intent.EXTRA_STREAM, fileUri); - final MediaViewerActivity activity = (MediaViewerActivity) getActivity(); - if (activity.hasStatus()) { - final ParcelableStatus status = activity.getStatus(); - intent.putExtra(Intent.EXTRA_TEXT, Utils.getStatusShareText(activity, status)); - intent.putExtra(Intent.EXTRA_SUBJECT, Utils.getStatusShareSubject(activity, status)); - } - shareProvider.setShareIntent(intent); + if (!hasImage) return; + final MenuItem shareItem = menu.findItem(R.id.share); + final ShareActionProvider shareProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(shareItem); + final Intent intent = new Intent(Intent.ACTION_SEND); + final Uri fileUri = Uri.fromFile(file); + intent.setDataAndType(fileUri, Utils.getImageMimeType(file)); + intent.putExtra(Intent.EXTRA_STREAM, fileUri); + final MediaViewerActivity activity = (MediaViewerActivity) getActivity(); + if (activity.hasStatus()) { + final ParcelableStatus status = activity.getStatus(); + intent.putExtra(Intent.EXTRA_TEXT, Utils.getStatusShareText(activity, status)); + intent.putExtra(Intent.EXTRA_SUBJECT, Utils.getStatusShareSubject(activity, status)); } + shareProvider.setShareIntent(intent); } @Override @@ -501,14 +504,11 @@ public boolean onOptionsItemSelected(MenuItem item) { private void saveToGallery() { if (mSaveImageTask != null && mSaveImageTask.getStatus() == Status.RUNNING) return; - final Object imageTag = mImageView.getTag(); - final boolean hasImage = imageTag instanceof File; - if (hasImage) { - mSaveImageTask = new SaveImageTask(getActivity(), (File) imageTag); - mSaveImageTask.execute(); - } else { - - } + final File file = mImageFile; + final boolean hasImage = file != null && file.exists(); + if (!hasImage) return; + mSaveImageTask = new SaveImageTask(getActivity(), file); + mSaveImageTask.execute(); } private void openInBrowser() { diff --git a/twidere/src/main/java/org/mariotaku/twidere/loader/support/TileImageLoader.java b/twidere/src/main/java/org/mariotaku/twidere/loader/support/TileImageLoader.java index c8230460fb..7a85ca99a2 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/loader/support/TileImageLoader.java +++ b/twidere/src/main/java/org/mariotaku/twidere/loader/support/TileImageLoader.java @@ -154,7 +154,7 @@ protected void onStartLoading() { private void dump(final InputStream is, final OutputStream os) throws IOException { - final byte buffer[] = new byte[1024]; + final byte buffer[] = new byte[128]; int rc = is.read(buffer, 0, buffer.length); long downloaded = 0; while (rc > 0) { diff --git a/twidere/src/main/res/layout/fragment_media_page_image.xml b/twidere/src/main/res/layout/fragment_media_page_image.xml index d8292fcd35..d0b5e0e238 100644 --- a/twidere/src/main/res/layout/fragment_media_page_image.xml +++ b/twidere/src/main/res/layout/fragment_media_page_image.xml @@ -23,6 +23,12 @@ android:layout_width="match_parent" android:layout_height="match_parent"> + +