Skip to content

Commit

Permalink
shared animation works and test, fixed warnings and test app (#175)
Browse files Browse the repository at this point in the history
* shared animation works and test, fixed warnings and test app

* fixed naming schemes, passed view through ImageViewFactory
  • Loading branch information
KirkBushman authored and Piasy committed Oct 13, 2019
1 parent 7611327 commit 5404ff9
Show file tree
Hide file tree
Showing 22 changed files with 440 additions and 144 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,10 @@ public class BigImageView extends FrameLayout implements ImageLoader.Callback {
private View mProgressIndicatorView;
private ImageView mFailureImageView;

private boolean mDelayMainImage = false;

private ImageSaveCallback mImageSaveCallback;
private ImageShownCallback mImageShownCallback;
private ImageLoader.Callback mUserCallback;
private File mCurrentImageFile;
private Uri mUri;
Expand Down Expand Up @@ -286,6 +289,10 @@ public void setImageSaveCallback(ImageSaveCallback imageSaveCallback) {
mImageSaveCallback = imageSaveCallback;
}

public void setImageShownCallback(ImageShownCallback imageCycleCallback) {
mImageShownCallback = imageCycleCallback;
}

public void setProgressIndicator(ProgressIndicator progressIndicator) {
mProgressIndicator = progressIndicator;
}
Expand Down Expand Up @@ -342,17 +349,34 @@ public void showImage(Uri uri) {
}

public void showImage(final Uri thumbnail, final Uri uri) {
showImage(thumbnail, uri, false);
}

public void showImage(final Uri thumbnail, final Uri uri, final boolean delayMainImage) {
mThumbnail = thumbnail;
mUri = uri;

clearThumbnailAndProgressIndicator();
mImageLoader.loadImage(hashCode(), uri, mInternalCallback);

mDelayMainImage = delayMainImage;
if (mDelayMainImage) {
BigImageViewer.prefetch(uri);
mImageLoader.loadImage(hashCode(), thumbnail, mInternalCallback);
} else {
mImageLoader.loadImage(hashCode(), uri, mInternalCallback);
}

if (mFailureImageView != null) {
mFailureImageView.setVisibility(GONE);
}
}

public void loadMainImageNow() {

mDelayMainImage = false;
mImageLoader.loadImage(hashCode(), mUri, mInternalCallback);
}

public void cancel() {
mImageLoader.cancel(hashCode());
}
Expand All @@ -362,9 +386,9 @@ public SubsamplingScaleImageView getSSIV() {
}

@Override
public void onCacheHit(final int imageType, File image) {
public void onCacheHit(final int imageType, final File image) {
mCurrentImageFile = image;
doShowImage(imageType, image);
doShowImage(imageType, image, mDelayMainImage);

if (mUserCallback != null) {
mUserCallback.onCacheHit(imageType, image);
Expand All @@ -375,7 +399,7 @@ public void onCacheHit(final int imageType, File image) {
public void onCacheMiss(final int imageType, final File image) {
mCurrentImageFile = image;
mTempImages.add(image);
doShowImage(imageType, image);
doShowImage(imageType, image, mDelayMainImage);

if (mUserCallback != null) {
mUserCallback.onCacheMiss(imageType, image);
Expand Down Expand Up @@ -502,32 +526,63 @@ public void onAnimationRepeat(Animation animation) {
}

@UiThread
private void doShowImage(final int imageType, final File image) {
if (mMainView != null) {
removeView(mMainView);
}
private void doShowImage(final int imageType, final File image, final boolean useThumbnailView) {

mMainView = mViewFactory.createMainView(getContext(), imageType, image, mInitScaleType);
if (mMainView == null) {
onFail(new RuntimeException("Image type not supported: "
+ ImageInfoExtractor.typeName(imageType)));
return;
}
if (useThumbnailView) {

if(mThumbnailView != null) {
removeView(mThumbnailView);
}

addView(mMainView, ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT);
mMainView.setOnClickListener(mOnClickListener);
mMainView.setOnLongClickListener(mOnLongClickListener);
mThumbnailView = mViewFactory.createThumbnailView(getContext(), Uri.fromFile(image), mThumbnailScaleType);
if (mThumbnailView != null) {

addView(mThumbnailView, ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT);
mThumbnailView.setOnClickListener(mOnClickListener);
mThumbnailView.setOnLongClickListener(mOnLongClickListener);

((ImageView) mThumbnailView).setAdjustViewBounds(true);
((ImageView) mThumbnailView).setScaleType(ImageView.ScaleType.FIT_START);
((ImageView) mThumbnailView).setImageURI(Uri.fromFile(image));

if (mImageShownCallback != null) {
mImageShownCallback.onThumbnailShown();
}
}

} else {

if (mMainView != null) {
removeView(mMainView);
}

mMainView = mViewFactory.createMainView(getContext(), imageType, image, mInitScaleType);
if (mMainView == null) {
onFail(new RuntimeException("Image type not supported: "
+ ImageInfoExtractor.typeName(imageType)));
return;
}

if (mMainView instanceof SubsamplingScaleImageView) {
mSSIV = (SubsamplingScaleImageView) mMainView;
addView(mMainView, ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT);
mMainView.setOnClickListener(mOnClickListener);
mMainView.setOnLongClickListener(mOnLongClickListener);

mSSIV.setMinimumTileDpi(160);
if (mMainView instanceof SubsamplingScaleImageView) {
mSSIV = (SubsamplingScaleImageView) mMainView;

setOptimizeDisplay(mOptimizeDisplay);
setInitScaleType(mInitScaleType);
mSSIV.setMinimumTileDpi(160);

mSSIV.setImage(ImageSource.uri(Uri.fromFile(image)));
setOptimizeDisplay(mOptimizeDisplay);
setInitScaleType(mInitScaleType);

mSSIV.setImage(ImageSource.uri(Uri.fromFile(image)));

if (mImageShownCallback != null) {
mImageShownCallback.onMainImageShown();
}
}
}

if (mFailureImageView != null) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.github.piasy.biv.view;

import androidx.annotation.UiThread;

@UiThread
public interface ImageShownCallback {

void onThumbnailShown();
void onMainImageShown();
}
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,6 @@ protected View createAnimatedImageView(Context context, int imageType, File imag
}

public View createThumbnailView(Context context, Uri thumbnail, ImageView.ScaleType scaleType) {
return null;
return new ImageView(context);
}
}
4 changes: 3 additions & 1 deletion app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@

apply plugin: 'com.android.application'
apply plugin: 'com.github.ben-manes.versions'
apply plugin: 'kotlin-android'

android {
compileSdkVersion rootProject.ext.androidCompileSdkVersion
Expand Down Expand Up @@ -72,8 +73,9 @@ android {
}

dependencies {
implementation "androidx.core:core-ktx:1.1.0"
implementation "androidx.appcompat:appcompat:1.1.0"
implementation "androidx.recyclerview:recyclerview:1.0.0"
implementation "androidx.recyclerview:recyclerview:1.1.0-beta05"
implementation "com.google.android.material:material:$materialVersion"

implementation('com.tbruyelle.rxpermissions2:rxpermissions:0.9.5') {
Expand Down
5 changes: 3 additions & 2 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,7 @@
~ SOFTWARE.
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.github.piasy.biv.example">
package="com.github.piasy.biv.example">

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

Expand Down Expand Up @@ -52,6 +51,8 @@
<activity android:name=".CustomSSIVActivity"/>
<activity android:name=".RecyclerViewActivity"/>
<activity android:name=".ImageTypesActivity"/>
<activity android:name=".FirstAnimActivity" android:theme="@style/TransitionTheme"/>
<activity android:name=".SecondAnimActivity" android:theme="@style/TransitionTheme"/>
</application>

</manifest>
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.github.piasy.biv.example

import android.os.Bundle
import android.widget.ImageView
import androidx.appcompat.app.AppCompatActivity
import com.bumptech.glide.Glide
import com.bumptech.glide.load.engine.DiskCacheStrategy

class FirstAnimActivity : AppCompatActivity() {

companion object {
private const val THUMB_URL = "https://preview.redd.it/nahhvcadsbo21.jpg?width=216&crop=smart&auto=webp&s=c560e5774d7f43e178c1f0faad09315cdb86c203"
private const val SOURCE_URL = "https://i.redd.it/nahhvcadsbo21.jpg"
}

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_anim_first)

val thumb = findViewById<ImageView>(R.id.thumbView)
thumb.setOnClickListener {

SecondAnimActivity.start(this, thumb, THUMB_URL, SOURCE_URL)
}

val glide = Glide.with(this)
glide.asBitmap()
.load(THUMB_URL)
.into(thumb)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,14 +25,16 @@
package com.github.piasy.biv.example;

import android.Manifest;
import android.app.Dialog;
import android.net.Uri;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.TextView;
import android.widget.Toast;

import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;

import com.github.piasy.biv.BigImageViewer;
Expand All @@ -55,7 +57,7 @@ public class LongImageActivity extends AppCompatActivity {
private Disposable mPermissionRequest;
private Disposable mQrCodeDecode;

private Dialog dialog;
private AlertDialog dialog;

@Override
protected void onCreate(Bundle savedInstanceState) {
Expand All @@ -73,36 +75,13 @@ public void onClick(View v) {
}
});

dialog = new Dialog(this);
dialog.setTitle(R.string.long_click_actions);
dialog.setContentView(R.layout.dialog_long_image);

final WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
lp.copyFrom(dialog.getWindow().getAttributes());
lp.width = WindowManager.LayoutParams.MATCH_PARENT;
dialog.getWindow().setAttributes(lp);

final TextView textScan = dialog.findViewById(R.id.action_scan_qr);
final TextView textSave = dialog.findViewById(R.id.action_save_image);

textScan.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
decodeQrCode();
}
});

textSave.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
saveImage();
}
});

mBigImageView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {

dialog = showDialog();
dialog.show();

return true;
}
});
Expand Down Expand Up @@ -141,10 +120,6 @@ protected void onDestroy() {
disposePermissionRequest();
disposeQrCodeDecode();

if (dialog.isShowing()) {
dialog.dismiss();
}

BigImageViewer.imageLoader().cancelAll();
}

Expand Down Expand Up @@ -195,6 +170,33 @@ public void accept(Throwable throwable) throws Exception {
});
}

private AlertDialog showDialog() {

final ViewGroup container = findViewById(R.id.container);
final AlertDialog.Builder builder = new AlertDialog.Builder(LongImageActivity.this);
final View rootView = LayoutInflater.from(LongImageActivity.this).inflate(R.layout.dialog_long_image, container, false);
builder.setView(rootView);

final TextView textScan = rootView.findViewById(R.id.action_scan_qr);
final TextView textSave = rootView.findViewById(R.id.action_save_image);

textScan.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
decodeQrCode();
}
});

textSave.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
saveImage();
}
});

return builder.create();
}

private void disposePermissionRequest() {
if (mPermissionRequest != null) {
mPermissionRequest.dispose();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,5 +84,11 @@ public void onClick(View v) {
startActivity(new Intent(MainActivity.this, ImageTypesActivity.class));
}
});
findViewById(R.id.mSharedTransition).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(MainActivity.this, FirstAnimActivity.class));
}
});
}
}
Loading

0 comments on commit 5404ff9

Please sign in to comment.