From 9c91d7a799e332cf4d98dca6bb3fc9dc0f95189b Mon Sep 17 00:00:00 2001 From: Tanvi Dadu Date: Thu, 26 Apr 2018 03:18:58 +0530 Subject: [PATCH] Zoom (#1300) * Basic Zoom feature added along with button to control it * Pinch Zoom added * Merge Conflicts Resolved * Icons Changed * Compressed the high resolution images * Fixed null pointer exception * Fixed null pointer exception * Fixed exception * Fixed error * Fixed Resource availability issue --- app/build.gradle | 1 + .../upload/MultipleUploadListFragment.java | 1 - .../nrw/commons/upload/ShareActivity.java | 223 ++++++++++++++++++ .../commons/upload/SingleUploadFragment.java | 3 + .../drawable-hdpi/ic_zoom_in_white_24dp.png | Bin 0 -> 422 bytes .../drawable-hdpi/ic_zoom_out_white_24dp.png | Bin 0 -> 412 bytes .../drawable-mdpi/ic_zoom_in_white_24dp.png | Bin 0 -> 257 bytes .../drawable-mdpi/ic_zoom_out_white_24dp.png | Bin 0 -> 249 bytes .../drawable-xhdpi/ic_zoom_in_white_24dp.png | Bin 0 -> 486 bytes .../drawable-xhdpi/ic_zoom_out_white_24dp.png | Bin 0 -> 470 bytes .../drawable-xxhdpi/ic_zoom_in_white_24dp.png | Bin 0 -> 737 bytes .../ic_zoom_out_white_24dp.png | Bin 0 -> 731 bytes .../ic_zoom_in_white_24dp.png | Bin 0 -> 954 bytes .../ic_zoom_out_white_24dp.png | Bin 0 -> 925 bytes .../res/drawable/ic_zoom_in_white_24dp.png | Bin 0 -> 422 bytes .../res/drawable/ic_zoom_out_white_24dp.png | Bin 0 -> 412 bytes app/src/main/res/layout/activity_share.xml | 31 ++- .../res/layout/fragment_single_upload.xml | 1 + .../main/res/layout/layout_upload_item.xml | 1 + 19 files changed, 259 insertions(+), 2 deletions(-) create mode 100644 app/src/main/res/drawable-hdpi/ic_zoom_in_white_24dp.png create mode 100644 app/src/main/res/drawable-hdpi/ic_zoom_out_white_24dp.png create mode 100644 app/src/main/res/drawable-mdpi/ic_zoom_in_white_24dp.png create mode 100644 app/src/main/res/drawable-mdpi/ic_zoom_out_white_24dp.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_zoom_in_white_24dp.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_zoom_out_white_24dp.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_zoom_in_white_24dp.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_zoom_out_white_24dp.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_zoom_in_white_24dp.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_zoom_out_white_24dp.png create mode 100644 app/src/main/res/drawable/ic_zoom_in_white_24dp.png create mode 100644 app/src/main/res/drawable/ic_zoom_out_white_24dp.png diff --git a/app/build.gradle b/app/build.gradle index 5bafd3f15..3a7547d58 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -10,6 +10,7 @@ dependencies { implementation 'com.github.nicolas-raoul:Quadtree:ac16ea8035bf07' implementation 'fr.avianey.com.viewpagerindicator:library:2.4.1.1@aar' implementation 'in.yuvi:http.fluent:1.3' + implementation 'com.github.chrisbanes:PhotoView:2.0.0' implementation 'com.android.volley:volley:1.0.0' implementation 'ch.acra:acra:4.9.2' implementation 'org.mediawiki:api:1.3' diff --git a/app/src/main/java/fr/free/nrw/commons/upload/MultipleUploadListFragment.java b/app/src/main/java/fr/free/nrw/commons/upload/MultipleUploadListFragment.java index 5b39b92f7..34fe1d0cb 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/MultipleUploadListFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/MultipleUploadListFragment.java @@ -11,7 +11,6 @@ import android.text.Editable; import android.text.TextUtils; import android.text.TextWatcher; import android.util.DisplayMetrics; -import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; diff --git a/app/src/main/java/fr/free/nrw/commons/upload/ShareActivity.java b/app/src/main/java/fr/free/nrw/commons/upload/ShareActivity.java index aca17601c..aea703f5e 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/ShareActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/ShareActivity.java @@ -2,33 +2,50 @@ package fr.free.nrw.commons.upload; import android.Manifest; import android.app.Activity; +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.animation.AnimatorSet; +import android.animation.ObjectAnimator; import android.content.ContentResolver; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageManager; +import android.graphics.Bitmap; +import android.graphics.BitmapRegionDecoder; +import android.graphics.Point; +import android.graphics.Rect; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.Environment; import android.os.ParcelFileDescriptor; +import android.provider.MediaStore; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.annotation.RequiresApi; +import android.support.design.widget.FloatingActionButton; import android.support.design.widget.Snackbar; import android.support.graphics.drawable.VectorDrawableCompat; import android.support.v4.app.ActivityCompat; import android.support.v4.app.FragmentManager; import android.support.v4.content.ContextCompat; +import android.support.v4.graphics.BitmapCompat; import android.support.v7.app.AlertDialog; +import android.util.Log; import android.view.MenuItem; import android.view.View; +import android.view.WindowManager; +import android.view.animation.DecelerateInterpolator; +import android.view.inputmethod.InputMethodManager; import android.widget.TextView; import android.widget.Toast; import com.facebook.drawee.generic.GenericDraweeHierarchyBuilder; import com.facebook.drawee.view.SimpleDraweeView; +import com.github.chrisbanes.photoview.PhotoView; + import java.io.File; import java.io.FileNotFoundException; @@ -63,8 +80,11 @@ import fr.free.nrw.commons.utils.ImageUtils; import fr.free.nrw.commons.mwapi.MediaWikiApi; import timber.log.Timber; + + import static fr.free.nrw.commons.upload.ExistingFileAsync.Result.DUPLICATE_PROCEED; import static fr.free.nrw.commons.upload.ExistingFileAsync.Result.NO_DUPLICATE; +import static java.lang.Long.min; /** * Activity for the title/desc screen after image is selected. Also starts processing image @@ -120,6 +140,12 @@ public class ShareActivity private boolean haveCheckedForOtherImages = false; private boolean isNearbyUpload = false; + private Animator CurrentAnimator; + private long ShortAnimationDuration; + private FloatingActionButton zoomInButton; + private FloatingActionButton zoomOutButton; + + /** * Called when user taps the submit button. */ @@ -257,6 +283,18 @@ public class ShareActivity if (mediaUri != null) { backgroundImageView.setImageURI(mediaUri); } + zoomInButton = (FloatingActionButton) findViewById(R.id.media_upload_zoom_in); + try { + zoomInButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + zoomImageFromThumb(backgroundImageView, mediaUri); + } + }); + } catch (Exception e){ + Log.i("exception", e.toString()); + } + zoomOutButton = (FloatingActionButton) findViewById(R.id.media_upload_zoom_out); if (savedInstanceState != null) { contribution = savedInstanceState.getParcelable("contribution"); @@ -690,4 +728,189 @@ public class ShareActivity } } } + + private void zoomImageFromThumb(final View thumbView, Uri imageuri ) { + // If there's an animation in progress, cancel it + // immediately and proceed with this one. + if (CurrentAnimator != null) { + CurrentAnimator.cancel(); + } + hideKeyboard(ShareActivity.this); + InputStream input = null; + Bitmap scaled = null; + try { + input = this.getContentResolver().openInputStream(imageuri); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + BitmapRegionDecoder decoder = null; + try { + decoder = BitmapRegionDecoder.newInstance(input, false); + } catch (IOException e) { + e.printStackTrace(); + } + Bitmap bitmap = decoder.decodeRegion(new Rect(10, 10, 50, 50), null); + try { + //Compress the Image + System.gc(); + Runtime rt = Runtime.getRuntime(); + long maxMemory = rt.freeMemory(); + bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), imageuri); + int bitmapByteCount= BitmapCompat.getAllocationByteCount(bitmap); + long height = bitmap.getHeight(); + long width = bitmap.getWidth(); + long calHeight = (long) ((height * maxMemory)/(bitmapByteCount * 1.1)); + long calWidth = (long) ((width * maxMemory)/(bitmapByteCount * 1.1)); + scaled = Bitmap.createScaledBitmap(bitmap,(int) Math.min(width,calWidth), (int) Math.min(height,calHeight), true); + } catch (IOException e) { + } catch (NullPointerException e){ + scaled = bitmap; + } + // Load the high-resolution "zoomed-in" image. + PhotoView expandedImageView = (PhotoView) findViewById( + R.id.expanded_image); + expandedImageView.setImageBitmap(scaled); + + + + // Calculate the starting and ending bounds for the zoomed-in image. + // This step involves lots of math. Yay, math. + final Rect startBounds = new Rect(); + final Rect finalBounds = new Rect(); + final Point globalOffset = new Point(); + + // The start bounds are the global visible rectangle of the thumbnail, + // and the final bounds are the global visible rectangle of the container + // view. Also set the container view's offset as the origin for the + // bounds, since that's the origin for the positioning animation + // properties (X, Y). + thumbView.getGlobalVisibleRect(startBounds); + findViewById(R.id.container) + .getGlobalVisibleRect(finalBounds, globalOffset); + startBounds.offset(-globalOffset.x, -globalOffset.y); + finalBounds.offset(-globalOffset.x, -globalOffset.y); + + // Adjust the start bounds to be the same aspect ratio as the final + // bounds using the "center crop" technique. This prevents undesirable + // stretching during the animation. Also calculate the start scaling + // factor (the end scaling factor is always 1.0). + float startScale; + if ((float) finalBounds.width() / finalBounds.height() + > (float) startBounds.width() / startBounds.height()) { + // Extend start bounds horizontally + startScale = (float) startBounds.height() / finalBounds.height(); + float startWidth = startScale * finalBounds.width(); + float deltaWidth = (startWidth - startBounds.width()) / 2; + startBounds.left -= deltaWidth; + startBounds.right += deltaWidth; + } else { + // Extend start bounds vertically + startScale = (float) startBounds.width() / finalBounds.width(); + float startHeight = startScale * finalBounds.height(); + float deltaHeight = (startHeight - startBounds.height()) / 2; + startBounds.top -= deltaHeight; + startBounds.bottom += deltaHeight; + } + + // Hide the thumbnail and show the zoomed-in view. When the animation + // begins, it will position the zoomed-in view in the place of the + // thumbnail. + thumbView.setAlpha(0f); + expandedImageView.setVisibility(View.VISIBLE); + zoomOutButton.setVisibility(View.VISIBLE); + zoomInButton.setVisibility(View.GONE); + + // Set the pivot point for SCALE_X and SCALE_Y transformations + // to the top-left corner of the zoomed-in view (the default + // is the center of the view). + expandedImageView.setPivotX(0f); + expandedImageView.setPivotY(0f); + + // Construct and run the parallel animation of the four translation and + // scale properties (X, Y, SCALE_X, and SCALE_Y). + AnimatorSet set = new AnimatorSet(); + set + .play(ObjectAnimator.ofFloat(expandedImageView, View.X, + startBounds.left, finalBounds.left)) + .with(ObjectAnimator.ofFloat(expandedImageView, View.Y, + startBounds.top, finalBounds.top)) + .with(ObjectAnimator.ofFloat(expandedImageView, View.SCALE_X, + startScale, 1f)) + .with(ObjectAnimator.ofFloat(expandedImageView, + View.SCALE_Y, startScale, 1f)); + set.setDuration(ShortAnimationDuration); + set.setInterpolator(new DecelerateInterpolator()); + set.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + CurrentAnimator = null; + } + + @Override + public void onAnimationCancel(Animator animation) { + CurrentAnimator = null; + } + }); + set.start(); + CurrentAnimator = set; + + // Upon clicking the zoomed-in image, it should zoom back down + // to the original bounds and show the thumbnail instead of + // the expanded image. + final float startScaleFinal = startScale; + zoomOutButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if (CurrentAnimator != null) { + CurrentAnimator.cancel(); + } + zoomOutButton.setVisibility(View.GONE); + zoomInButton.setVisibility(View.VISIBLE); + + // Animate the four positioning/sizing properties in parallel, + // back to their original values. + AnimatorSet set = new AnimatorSet(); + set.play(ObjectAnimator + .ofFloat(expandedImageView, View.X, startBounds.left)) + .with(ObjectAnimator + .ofFloat(expandedImageView, + View.Y,startBounds.top)) + .with(ObjectAnimator + .ofFloat(expandedImageView, + View.SCALE_X, startScaleFinal)) + .with(ObjectAnimator + .ofFloat(expandedImageView, + View.SCALE_Y, startScaleFinal)); + set.setDuration(ShortAnimationDuration); + set.setInterpolator(new DecelerateInterpolator()); + set.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + thumbView.setAlpha(1f); + expandedImageView.setVisibility(View.GONE); + CurrentAnimator = null; + } + + @Override + public void onAnimationCancel(Animator animation) { + thumbView.setAlpha(1f); + expandedImageView.setVisibility(View.GONE); + CurrentAnimator = null; + } + }); + set.start(); + CurrentAnimator = set; + + } + + }); + } + public static void hideKeyboard(Activity activity) { + View view = activity.findViewById(R.id.titleEdit | R.id.descEdit); + if (view != null) { + InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE); + imm.hideSoftInputFromWindow(view.getWindowToken(), 0); + } + } + } diff --git a/app/src/main/java/fr/free/nrw/commons/upload/SingleUploadFragment.java b/app/src/main/java/fr/free/nrw/commons/upload/SingleUploadFragment.java index a88d03c03..d0e38dafe 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/SingleUploadFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/SingleUploadFragment.java @@ -11,6 +11,7 @@ import android.net.Uri; import android.os.Bundle; import android.preference.PreferenceManager; import android.support.annotation.NonNull; +import android.support.design.widget.FloatingActionButton; import android.support.v4.view.ViewCompat; import android.support.v7.app.AlertDialog; import android.text.Editable; @@ -61,6 +62,7 @@ public class SingleUploadFragment extends CommonsDaggerSupportFragment { @BindView(R.id.share_license_summary) TextView licenseSummaryView; @BindView(R.id.licenseSpinner) Spinner licenseSpinner; + @Inject @Named("default_preferences") SharedPreferences prefs; @Inject @Named("direct_nearby_upload_prefs") SharedPreferences directPrefs; @@ -346,6 +348,7 @@ public class SingleUploadFragment extends CommonsDaggerSupportFragment { } } + private void showInfoAlert (int titleStringID, int messageStringID){ new AlertDialog.Builder(getContext()) .setTitle(titleStringID) diff --git a/app/src/main/res/drawable-hdpi/ic_zoom_in_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_zoom_in_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..637329408a28249f61fd4aee845891b153a466ac GIT binary patch literal 422 zcmV;X0a^ZuP)_r!kZa!Q5tM<9G1lvl#Np6PVfYXTMr9oR$7- zJ+I)+m7cE3mSYcqne|dAIk1q=42;!fP_k_T0N}-$b--Po%Ifx9y0_4n8#`TI@fdKc z4xpeqS!x9+soeo?)FBj5w|OdAo%*2;ppd!&^kXQdf)kZf{Z;QMs1GQvUxpAwAFi^H QT>t<807*qoM6N<$f(6mHd;kCd literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/ic_zoom_out_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_zoom_out_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..7772ceea714619719877d3bab5fb286a9e0979bb GIT binary patch literal 412 zcmV;N0b~A&P)I|w$@3Bq7y zv4zOu7Z|26$(1wN+VeM;!_UX%!X13hqGQFL6Jv+AWCn3k%N>%*!0ksx1-Of$6L8j^zd3!Mb~ggE7#f4JJ)Z&q?JfiJ7&-)#kBZho6GL0z z!BV>D08C>j^91&j#mqf8ilKoLG*%PEAK=+nG31L!P}}_THXXxp-@jIP0k19;Ml$OT z+yiRMG1SGbne^0PDi5J98!CU#vt!GEn>3ZwZ98{oX09=H)IISOa4ip@Aj2e;fa2tC z09W!53aIN86+i*?QyxMAbp;s5P)zl|Q9z9seWM_sP@LbDcsnH${Es030000P#jd(6VUXdS7krMY%m884WHAk4%peJ{CfmfjuxI(qY* z|C!miR-0v*4NhJZ6P1+~b%t2twOExuG4=E>f{ z*|(j?#1}qQ8B668jgqlc8Z=7AQfcs^WGqGFL&1nK00z(x^&Ee&XK3jnD0nN2y@!K)v3ewzpR#T-|!dGh9lY1-Lgkp@eAr=1H*8jNvDI}Z#JPl+LZ(#{1{ z8oc0~cDDFPgHLSI&I~tidGhX#NxE3!W@&8b#iu*I(#^<9(-)4abTjqs@P)DsU(V<-p+}yyASTR^cTolit=r#Oy)H?{uUPBaF?GfD_%%#Bt=$ye8=Gow- zC>p1&eM>6q=N}f-4{Ca(sVQyDb3%t6B_%y_j+sMjt3O)h4}*GO_YXeTuE|6M4cZGIj13GAHL0|*z#s>7zCWF8<+KUY+ z(T4oRl|0l!dy4~x{~LIZd!nh}6V0H#+JGEwJqT=~3L?J@{lqqS|o9Ik~=fu-0# zn(%;DFpAV{jAyhv#0sq7x~(C`=%DraX$ORJTm_3CPM3Jbb&A9Q8C`r=Y%ooW7Bg&e zjjv=P4iLua5~@Tyi~)pKE50nE(I)07*qoM6N<$f=v0>=Kufz literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_zoom_out_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_zoom_out_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..8c6ccea7b868ef0e31882985e38a4b3d7ae6bd64 GIT binary patch literal 470 zcmV;{0V)28P)@ECRS1d$?5Z6Jtjf0}N2MKW-LS$%#nZ{n4xBz+$j-($m{mq*< zk)tQ?nRyqJ^m(L#fvA|{m?j-kQaUs^VpjhOYy2R~1FQO5jBrjrXOvYO-*_ZXi*Xgh z2#+{jE?8%hA%>Y^gG;;?Wfj3W&J*+cgaz6-rwYd!&UZ$YfeN=cD+R(`88cNc)+x& z=nIVTjJZ=NR&j2rC<9|OFED4j(_l$%%=Iii(Q*hv*{DA|)<)rp_}JN-U70 z6QecWj}Ea-4fkqnG5D6CehzrOAN0Ki=p6;TX0b$~xu6V3_^V91d7w{R;lB#m=72IT zoI48S$kIxTRJLdNn}@NW97slD&OB&=B@kd@L+tZ$JyQjdbODcK~qt`~x>g8#~U+;}c|9MVi+Dm5_1)K%+=I8lX$0YyeOX(uD@- z8L71a;hF>2hV-NXsw2e$fMQ5>!vBUyBE4vUD*xLZDk0?qfX0w^H9!kU%K<=ZNOKyX z9MXM&m--QDL<7`G4QawBXbP!Hy9UUxg>+5Q2dJG}q)m(tXb^kfeJotZ-WM&9;V1T{ zJ+7O<-X2B|)Q5#+c_PhVA=UY;2{L@cS<&?_$=zAU*(^pEl%R~W8zxD(o}A(qXNSbK zL54IHoWTRDjM76JF_QE!#u|?_R-{EAWXK9BQ0HWHL54JC{B=kX>5Pmn$dF(O3vbn# zB~A_4fY!&~cJT>w#nj*r1AgRW=>3@_BHQ!OwIs%se|>@I;*#F4$#` zk%qs}kHJZX=1hh&oSl$X1}TtI;edp6>Yro?ffOFdkZvFylL`kUq>~0xw*p9;6eh@! z@=h{@Mfyc|I3OV%tAO-L!U-E>=;l~BA%lb@oKQhR5>ChWf5+zFT&`y>)@|;qnM3Dk{ zX35aj2$@%Ga7X3bvCcp}WnS=!f9C^z^^keQ0)BJPJc-)sbn_Xv?9o*_ooAfko&xDw ztxmblHx|f{rkNPcq{*_#Wd)^9eVxZ;n{~!0@d`8JjB#GJaoT68>?pq_S!H&L70>*6 z?Tc>To=G1}j(dyg)fBS(&ZJK&XHh$vUD?_!2h!fSel4L5>nJB3$R}I~c2!5G-FmY| z9qDnw-qNZel(qU!+>uUjCHO%Np*c}-AppN5_!$kMyeOCnzz++4Q$y%f6b$ex(Ifa1 z4WXha*eu4YM$Ai!;cE?{k|-DpAQThBr7)~eN(|p<2o=J1hU6{F2H-~ozoj8GD+(?K z;FkqIts#^V1up}1>hFRd(hzF1-m)=Adcu0kT8u_m7e&uWIgl-U73`YP2?N%Re&;~G zx5$@9D}1yH=X_GHEo$57g+9;sEHO+ENn)hvVT5I?@BCTMCZiwH6_i|ZOt=0j?Kw*9 zT0e!3^pz6KTeqiLN=y-_$r?LUS2BiPc6{h;|GMa&@xz+@V?;lz-2O%7mNnUxIj)P6 zF|;zs44a&AO^F*$*kYO??-Rj(yV<3Zdbq)4r$c^k8ejnCpjGa zaG0aB-2rj_Ac(hE?F@L%2ZE}SZCAi|ToHyE-?k&*xyQ#pVV+@+ zJi$Tr56Kn}9haya(k24#ap>~#AGExU<&sb|5ip4A6G>kiWvHR**B?+s_1gDVBdGRt z2RuTx;&C+q;Bmzos)u?5W{}mnA1EM>jcihHzy-1eM4$k{60$R$0SQ!30|)e?vh)Rv zB0E6@4iJ=(z0nttM>Zck!2Pf43fMw697@1TWb66@%E*$T1f-Fb^aWIqbs?l_jvCaB z?7hB#Yh)dv1jLYizUu+@UH=MwG+HyK`0pv=wc44DoP^id;x`bm zVF=U&a{+=FvpD!+GeHc2pwVx-1LVn2q*c5Bdu$PIg1=?`?9r?p<;>&mR}%s9JY7>3Mim} c0tyJ;AK9!R=?G29w*UYD07*qoM6N<$g1^0>_y7O^ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_zoom_out_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_zoom_out_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..d85e242b97041c9907ee8e2c94417645c034edbd GIT binary patch literal 925 zcmV;O17iG%P)KhH-uTH!aML{-J?H`c7zwK5;MQKT|Me!dHL3}|J zrHG>2rCTGSAXQR9T#9YNcNB@0)2v7A(pEqx3sh-Em5X$0bCKqE z!gxlY&BK1)6V@s@Z4Q27jdm#WqoT)t)~M$>^Bkd|(cwG(z~ve{^bG`D$K@$0MTG@wedL51#4nVobwSZ!4^?b$=v5QQ zvVyHjR{pV#$JpNRy_!V83brNr$02MV=~WBpr;P1@d}9gQ3AKnJY!BoYJF#6;2;9Kd zBcC{rX@eaKfix9NXXF#FFVa%`9cBHyxM>Q zrg{0o9ZW~m1{}k5Q@&8d)T=fii)mTDP{PzD0}YaaZcOjw3+tFVWS~JZkizsyzOas| zLk1co11U@u`9cX(mkcyW2D&kQkS`Q5^{EZ$$5fOr+{ScNZNPC%cjXHOObcoQ7BMZ# z7ltwYsWza9X-K}1#{RpwVUh*PXl>$IXmC(m%X!4LWdGTg%D2`NQ~fK^;7Twy?UkmD*dhE#RXHijVUge#BEe@!6a@YiVG%i8&O;^fm>d2!8mSt#RX%y_r!kZa!Q5tM<9G1lvl#Np6PVfYXTMr9oR$7- zJ+I)+m7cE3mSYcqne|dAIk1q=42;!fP_k_T0N}-$b--Po%Ifx9y0_4n8#`TI@fdKc z4xpeqS!x9+soeo?)FBj5w|OdAo%*2;ppd!&^kXQdf)kZf{Z;QMs1GQvUxpAwAFi^H QT>t<807*qoM6N<$f(6mHd;kCd literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ic_zoom_out_white_24dp.png b/app/src/main/res/drawable/ic_zoom_out_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..7772ceea714619719877d3bab5fb286a9e0979bb GIT binary patch literal 412 zcmV;N0b~A&P)I|w$@3Bq7y zv4zOu7Z|26$(1wN+VeM;!_UX%!X13hqGQFL6Jv+AWCn3k%N>%*!0ksx1-Of$6L8j^zd3!Mb~ggE7#f4JJ)Z&q?JfiJ7&-)#kBZho6GL0z z!BV>D08C>j^91&j#mqf8ilKoLG*%PEAK=+nG31L!P}}_THXXxp-@jIP0k19;Ml$OT z+yiRMG1SGbne^0PDi5J98!CU#vt!GEn>3ZwZ98{oX09=H)IISOa4ip@Aj2e;fa2tC z09W!53aIN86+i*?QyxMAbp;s5P)zl|Q9z9seWM_sP@LbDcsnH${Es030000 + android:background="?attr/mainBackground" + android:id="@+id/container"> + + + + + + + + diff --git a/app/src/main/res/layout/layout_upload_item.xml b/app/src/main/res/layout/layout_upload_item.xml index fb552560a..155664d91 100644 --- a/app/src/main/res/layout/layout_upload_item.xml +++ b/app/src/main/res/layout/layout_upload_item.xml @@ -34,6 +34,7 @@ android:textColor="#FFFFFFFF" style="?android:textAppearanceSmall" /> + \ No newline at end of file