diff --git a/app/build.gradle b/app/build.gradle index a3d95cd..b8e2842 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -11,7 +11,7 @@ android { minSdk 30 targetSdk 34 versionCode 1 - versionName '24.6.10' + versionName '24.7.1' testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } @@ -34,14 +34,14 @@ android { dependencies { implementation 'androidx.activity:activity:1.9.0' - implementation 'androidx.appcompat:appcompat:1.6.1' + implementation 'androidx.appcompat:appcompat:1.7.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' - implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.0' + implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.2' implementation 'androidx.preference:preference:1.2.1' implementation 'com.google.android.material:material:1.12.0' implementation('io.github.waynejo:androidndkgif:1.0.1') implementation(platform('org.jetbrains.kotlin:kotlin-bom:1.9.20')) testImplementation 'junit:junit:4.13.2' - androidTestImplementation 'androidx.test.ext:junit:1.1.5' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' + androidTestImplementation 'androidx.test.ext:junit:1.2.1' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1' } \ No newline at end of file diff --git a/app/src/main/java/com/misterchan/iconeditor/CellGrid.java b/app/src/main/java/com/misterchan/iconeditor/CellGrid.java index 8c04b78..4d08553 100644 --- a/app/src/main/java/com/misterchan/iconeditor/CellGrid.java +++ b/app/src/main/java/com/misterchan/iconeditor/CellGrid.java @@ -1,15 +1,42 @@ package com.misterchan.iconeditor; -import androidx.annotation.IntRange; +import android.graphics.Canvas; +import android.graphics.Paint; public class CellGrid { public boolean enabled = false; - @IntRange(from = 0) public int sizeX = 16, sizeY = 16; - @IntRange(from = 0) public int spacingX = 0, spacingY = 0; public int offsetX = 0, offsetY = 0; + + public void draw(Canvas canvas, float l, float t, float r, float b, float tx, float ty, float s, Paint paint) { + if (sizeX + spacingX > 1) { + final float scaledSizeX = sizeX * s, scaledSpacingX = spacingX * s; + float x = (tx >= 0.0f ? tx : tx % (scaledSizeX + scaledSpacingX)) + offsetX % (sizeX + spacingX) * s; + while (true) { + if (x >= l) canvas.drawLine(x, t, x, b, paint); + if ((x += scaledSizeX) > r) break; + if (spacingX != 0) { + if (x >= l) canvas.drawLine(x, t, x, b, paint); + if ((x += scaledSpacingX) > r) break; + } + } + } + if (sizeY + spacingY > 1) { + final float scaledSizeY = sizeY * s, scaledSpacingY = spacingY * s; + float y = (ty >= 0.0f ? ty : ty % (scaledSizeY + scaledSpacingY)) + offsetY % (sizeY + spacingY) * s; + if (y < ty) y += scaledSizeY + scaledSpacingY; + while (true) { + if (y >= t) canvas.drawLine(l, y, r, y, paint); + if ((y += scaledSizeY) > b) break; + if (spacingY != 0) { + if (y >= t) canvas.drawLine(l, y, r, y, paint); + if ((y += scaledSpacingY) > b) break; + } + } + } + } } diff --git a/app/src/main/java/com/misterchan/iconeditor/dialog/AnimationClipper.java b/app/src/main/java/com/misterchan/iconeditor/dialog/AnimationClipper.java index 2e7d46b..d34e101 100644 --- a/app/src/main/java/com/misterchan/iconeditor/dialog/AnimationClipper.java +++ b/app/src/main/java/com/misterchan/iconeditor/dialog/AnimationClipper.java @@ -32,7 +32,7 @@ public interface OnConfirmListener { public AnimationClipper(Context context, Project project, OnConfirmListener listener) { builder = new MaterialAlertDialogBuilder(context) - .setIcon(R.drawable.ic_content_cut).setTitle(R.string.clip) + .setIcon(R.drawable.ic_content_cut).setTitle(R.string.clip_verb) .setView(R.layout.animation_clipper) .setPositiveButton(R.string.ok, (dialog, which) -> listener.onConfirm(from, to)) diff --git a/app/src/main/java/com/misterchan/iconeditor/dialog/CellGridManager.java b/app/src/main/java/com/misterchan/iconeditor/dialog/CellGridManager.java index 9a5e72a..18fa6b1 100644 --- a/app/src/main/java/com/misterchan/iconeditor/dialog/CellGridManager.java +++ b/app/src/main/java/com/misterchan/iconeditor/dialog/CellGridManager.java @@ -40,34 +40,14 @@ public CellGridManager(Context context, CellGrid cellGrid, OnApplyListener onUpd .setView(R.layout.cell_grid); } - public void show() { - final AlertDialog dialog = builder.show(); - - cbEnabled = dialog.findViewById(R.id.cb_enabled); - tietSizeX = dialog.findViewById(R.id.tiet_size_x); - tietSizeY = dialog.findViewById(R.id.tiet_size_y); - tietSpacingX = dialog.findViewById(R.id.tiet_spacing_x); - tietSpacingY = dialog.findViewById(R.id.tiet_spacing_y); - tietOffsetX = dialog.findViewById(R.id.tiet_offset_x); - tietOffsetY = dialog.findViewById(R.id.tiet_offset_y); - - cbEnabled.setChecked(cellGrid.enabled); - tietSizeX.setText(String.valueOf(cellGrid.sizeX)); - tietSizeY.setText(String.valueOf(cellGrid.sizeY)); - tietSpacingX.setText(String.valueOf(cellGrid.spacingX)); - tietSpacingY.setText(String.valueOf(cellGrid.spacingY)); - tietOffsetX.setText(String.valueOf(cellGrid.offsetX)); - tietOffsetY.setText(String.valueOf(cellGrid.offsetY)); - } - private void onPositiveButtonClick(DialogInterface dialog, int which) { final int sizeX, sizeY, spacingX, spacingY, offsetX, offsetY; try { - sizeX = Integer.parseUnsignedInt(tietSizeX.getText().toString()); - sizeY = Integer.parseUnsignedInt(tietSizeY.getText().toString()); - spacingX = Integer.parseUnsignedInt(tietSpacingX.getText().toString()); - spacingY = Integer.parseUnsignedInt(tietSpacingY.getText().toString()); + sizeX = Integer.parseInt(tietSizeX.getText().toString()); + sizeY = Integer.parseInt(tietSizeY.getText().toString()); + spacingX = Integer.parseInt(tietSpacingX.getText().toString()); + spacingY = Integer.parseInt(tietSpacingY.getText().toString()); offsetX = Integer.parseInt(tietOffsetX.getText().toString()); offsetY = Integer.parseInt(tietOffsetY.getText().toString()); } catch (NumberFormatException e) { @@ -84,4 +64,24 @@ private void onPositiveButtonClick(DialogInterface dialog, int which) { onUpdateListener.onApply(); } + + public void show() { + final AlertDialog dialog = builder.show(); + + cbEnabled = dialog.findViewById(R.id.cb_enabled); + tietSizeX = dialog.findViewById(R.id.tiet_size_x); + tietSizeY = dialog.findViewById(R.id.tiet_size_y); + tietSpacingX = dialog.findViewById(R.id.tiet_spacing_x); + tietSpacingY = dialog.findViewById(R.id.tiet_spacing_y); + tietOffsetX = dialog.findViewById(R.id.tiet_offset_x); + tietOffsetY = dialog.findViewById(R.id.tiet_offset_y); + + cbEnabled.setChecked(cellGrid.enabled); + tietSizeX.setText(String.valueOf(cellGrid.sizeX)); + tietSizeY.setText(String.valueOf(cellGrid.sizeY)); + tietSpacingX.setText(String.valueOf(cellGrid.spacingX)); + tietSpacingY.setText(String.valueOf(cellGrid.spacingY)); + tietOffsetX.setText(String.valueOf(cellGrid.offsetX)); + tietOffsetY.setText(String.valueOf(cellGrid.offsetY)); + } } diff --git a/app/src/main/java/com/misterchan/iconeditor/tool/BrushTool.java b/app/src/main/java/com/misterchan/iconeditor/tool/BrushTool.java index b04df15..11e6616 100644 --- a/app/src/main/java/com/misterchan/iconeditor/tool/BrushTool.java +++ b/app/src/main/java/com/misterchan/iconeditor/tool/BrushTool.java @@ -8,9 +8,17 @@ import androidx.annotation.NonNull; +import com.misterchan.iconeditor.util.BitmapUtils; + public class BrushTool { public enum TipShape { - PRESET_BRUSH, REF + PRESET_BRUSH, CLIP; + + private static final TipShape[] values = values(); + + public static TipShape valueAt(int ordinal) { + return values[ordinal]; + } } private static final Paint PAINT = new Paint() { @@ -38,9 +46,10 @@ public void setToBrush(long color) { tipShape = TipShape.PRESET_BRUSH; } - public void setToRef(Bitmap src, long color) { + public void setToClip(Bitmap src, long color) { + if (src == null) return; set(src, color); - tipShape = TipShape.REF; + tipShape = TipShape.CLIP; } public void set(long color) { @@ -48,8 +57,10 @@ public void set(long color) { } private void set(@NonNull Bitmap src, long color) { - if (tipShape == TipShape.REF && this.src != null) this.src.recycle(); - this.src = src; + if (src != this.src) { + if (this.src != null) this.src.recycle(); + this.src = BitmapUtils.createBitmap(src); + } final Bitmap dst = Bitmap.createBitmap(src.getWidth(), src.getHeight(), Bitmap.Config.ARGB_8888); dst.eraseColor(color); new Canvas(dst).drawBitmap(src, 0.0f, 0.0f, PAINT); diff --git a/app/src/main/java/com/misterchan/iconeditor/ui/MainActivity.java b/app/src/main/java/com/misterchan/iconeditor/ui/MainActivity.java index 7de864a..2239aca 100644 --- a/app/src/main/java/com/misterchan/iconeditor/ui/MainActivity.java +++ b/app/src/main/java/com/misterchan/iconeditor/ui/MainActivity.java @@ -714,10 +714,7 @@ public void onDestroyActionMode(ActionMode mode) { final int checkedItem = brush.tipShape.ordinal(); new MaterialAlertDialogBuilder(this).setTitle(R.string.tip_shape) .setSingleChoiceItems(R.array.brush_tip_shapes, checkedItem, (dialog, which) -> { - updateBrush(switch (which) { - default -> BrushTool.TipShape.PRESET_BRUSH; - case 1 -> BrushTool.TipShape.REF; - }); + updateBrush(BrushTool.TipShape.valueAt(which)); }) .setPositiveButton(R.string.ok, null) .show(); @@ -2951,8 +2948,8 @@ public void onIVTouch(View v, MotionEvent event) { } case R.id.b_translation, R.id.b_scale, R.id.b_rotation, R.id.b_poly, R.id.b_mesh -> { final boolean isTransformerButtonChecked = switch (activityMain.tools.btgTools.getCheckedButtonId()) { - case R.id.b_translation, R.id.b_scale, R.id.b_rotation, R.id.b_poly, R.id.b_mesh -> - true; + case R.id.b_translation, R.id.b_scale, R.id.b_rotation, R.id.b_poly, + R.id.b_mesh -> true; default -> false; }; if (isChecked) { @@ -3180,7 +3177,6 @@ private boolean checkOrRequestPermission() { @SuppressLint("NonConstantResourceId") private boolean checkRefNecessity() { return switch (activityMain.tools.btgTools.getCheckedButtonId()) { - case R.id.b_brush -> brush.tipShape == BrushTool.TipShape.REF; case R.id.b_magic_eraser, R.id.b_magic_paint -> true; default -> false; }; @@ -3627,56 +3623,15 @@ private void drawGridOntoView() { for (float y = t; y <= b; y += scale) gridCanvas.drawLine(l, y, r, y, PAINT_GRID); } - gridCanvas.drawLine(l, t, l - 100.0f, t, PAINT_IMAGE_BOUND); - gridCanvas.drawLine(r, t, r + 100.0f, t, PAINT_IMAGE_BOUND); - gridCanvas.drawLine(r, t - 100.0f, r, t, PAINT_IMAGE_BOUND); - gridCanvas.drawLine(r, b, r, b + 100.0f, PAINT_IMAGE_BOUND); - gridCanvas.drawLine(r + 100.0f, b, r, b, PAINT_IMAGE_BOUND); - gridCanvas.drawLine(l, b, l - 100.0f, b, PAINT_IMAGE_BOUND); - gridCanvas.drawLine(l, b + 100.0f, l, b, PAINT_IMAGE_BOUND); - gridCanvas.drawLine(l, t, l, t - 100.0f, PAINT_IMAGE_BOUND); + CanvasUtils.drawRightAngles(gridCanvas, l, t, r, b, PAINT_IMAGE_BOUND); } final CellGrid cellGrid = project.cellGrid; if (cellGrid.enabled) { final Bitmap background = frame.getBackgroundLayer().bitmap; + final float l = translationX >= 0.0f ? translationX : translationX % scale, t = translationY >= 0.0f ? translationY : translationY % scale; final float r = Math.min(translationX + toScaled(background.getWidth()), viewWidth), b = Math.min(translationY + toScaled(background.getHeight()), viewHeight); - if (cellGrid.sizeX > 1) { - final float t = translationY >= 0.0f ? translationY : translationY % scale; - final float scaledSizeX = toScaled(cellGrid.sizeX), scaledSpacingX = toScaled(cellGrid.spacingX); - float x = (translationX >= 0.0f ? translationX : translationX % (scaledSizeX + scaledSpacingX)) - + toScaled(cellGrid.offsetX % (cellGrid.sizeX + cellGrid.spacingX)); - if (x < translationX) x += scaledSizeX + scaledSpacingX; - if (cellGrid.spacingX <= 0) { - do gridCanvas.drawLine(x, t, x, b, PAINT_CELL_GRID); - while ((x += scaledSizeX) <= r); - } else { - do { - gridCanvas.drawLine(x, t, x, b, PAINT_CELL_GRID); - if ((x += scaledSizeX) > r) break; - gridCanvas.drawLine(x, t, x, b, PAINT_CELL_GRID); - if ((x += scaledSpacingX) > r) break; - } while (true); - } - } - if (cellGrid.sizeY > 1) { - final float l = translationX >= 0.0f ? translationX : translationX % scale; - final float scaledSizeY = toScaled(cellGrid.sizeY), scaledSpacingY = toScaled(cellGrid.spacingY); - float y = (translationY >= 0.0f ? translationY : translationY % (scaledSizeY + scaledSpacingY)) - + toScaled(cellGrid.offsetY % (cellGrid.sizeY + cellGrid.spacingY)); - if (y < translationY) y += scaledSizeY + scaledSpacingY; - if (cellGrid.spacingY <= 0) { - do gridCanvas.drawLine(l, y, r, y, PAINT_CELL_GRID); - while ((y += scaledSizeY) <= b); - } else { - do { - gridCanvas.drawLine(l, y, r, y, PAINT_CELL_GRID); - if ((y += scaledSizeY) > b) break; - gridCanvas.drawLine(l, y, r, y, PAINT_CELL_GRID); - if ((y += scaledSpacingY) > b) break; - } while (true); - } - } + cellGrid.draw(gridCanvas, l, t, r, b, translationX, translationY, scale, PAINT_CELL_GRID); } for (final Guide guide : project.guides) { @@ -3904,12 +3859,9 @@ ActivityMainBinding getBinding() { } private FloatingLayer getCurrentFloatingLayer() { - if (!transformer.isRecycled()) { - return transformer; - } else if (!dpPreview.isRecycled()) { - return dpPreview; - } - return null; + return !transformer.isRecycled() ? transformer + : !dpPreview.isRecycled() ? dpPreview + : null; } private Rect getVisibleSubset() { @@ -4413,18 +4365,21 @@ private boolean onLayerOptionsItemSelected(MenuItem item, int itemId) { layer.paint.getAlpha())); } case R.id.i_layer_blend_mode_clear, - R.id.i_layer_blend_mode_src, R.id.i_layer_blend_mode_dst, - R.id.i_layer_blend_mode_src_over, R.id.i_layer_blend_mode_dst_over, - R.id.i_layer_blend_mode_src_in, R.id.i_layer_blend_mode_dst_in, - R.id.i_layer_blend_mode_src_out, R.id.i_layer_blend_mode_dst_out, - R.id.i_layer_blend_mode_src_atop, R.id.i_layer_blend_mode_dst_atop, - R.id.i_layer_blend_mode_xor, R.id.i_layer_blend_mode_plus, - R.id.i_layer_blend_mode_modulate, R.id.i_layer_blend_mode_screen, R.id.i_layer_blend_mode_overlay, - R.id.i_layer_blend_mode_darken, R.id.i_layer_blend_mode_lighten, - R.id.i_layer_blend_mode_color_dodge, R.id.i_layer_blend_mode_color_burn, - R.id.i_layer_blend_mode_hard_light, R.id.i_layer_blend_mode_soft_light, - R.id.i_layer_blend_mode_difference, R.id.i_layer_blend_mode_exclusion, R.id.i_layer_blend_mode_multiply, - R.id.i_layer_blend_mode_hue, R.id.i_layer_blend_mode_saturation, R.id.i_layer_blend_mode_color, R.id.i_layer_blend_mode_luminosity -> { + R.id.i_layer_blend_mode_src, R.id.i_layer_blend_mode_dst, + R.id.i_layer_blend_mode_src_over, R.id.i_layer_blend_mode_dst_over, + R.id.i_layer_blend_mode_src_in, R.id.i_layer_blend_mode_dst_in, + R.id.i_layer_blend_mode_src_out, R.id.i_layer_blend_mode_dst_out, + R.id.i_layer_blend_mode_src_atop, R.id.i_layer_blend_mode_dst_atop, + R.id.i_layer_blend_mode_xor, R.id.i_layer_blend_mode_plus, + R.id.i_layer_blend_mode_modulate, R.id.i_layer_blend_mode_screen, + R.id.i_layer_blend_mode_overlay, + R.id.i_layer_blend_mode_darken, R.id.i_layer_blend_mode_lighten, + R.id.i_layer_blend_mode_color_dodge, R.id.i_layer_blend_mode_color_burn, + R.id.i_layer_blend_mode_hard_light, R.id.i_layer_blend_mode_soft_light, + R.id.i_layer_blend_mode_difference, R.id.i_layer_blend_mode_exclusion, + R.id.i_layer_blend_mode_multiply, + R.id.i_layer_blend_mode_hue, R.id.i_layer_blend_mode_saturation, + R.id.i_layer_blend_mode_color, R.id.i_layer_blend_mode_luminosity -> { layer.paint.setBlendMode(switch (itemId) { case R.id.i_layer_blend_mode_clear -> BlendMode.CLEAR; case R.id.i_layer_blend_mode_src -> BlendMode.SRC; @@ -5862,12 +5817,8 @@ private float toViewYRel(int y) { private void updateBrush(BrushTool.TipShape tipShape) { if (tipShape == null) tipShape = brush.tipShape; switch (tipShape) { + case CLIP -> brush.setToClip(clipboard, paint.getColorLong()); case PRESET_BRUSH -> brush.setToBrush(paint.getColorLong()); - case REF -> { - updateReference(true); - if (brush.tipShape == BrushTool.TipShape.PRESET_BRUSH) - brush.setToRef(ref.bm(), paint.getColorLong()); - } } } @@ -5878,8 +5829,5 @@ private void updateReference() { private void updateReference(boolean nonNull) { final Bitmap rb = frame.mergeReferenceLayers(); ref.set(rb != null ? rb : nonNull || checkRefNecessity() ? BitmapUtils.createBitmap(bitmap) : null); - if (activityMain.tools.btgTools.getCheckedButtonId() == R.id.b_brush && brush.tipShape == BrushTool.TipShape.REF) { - brush.setToRef(ref.bm(), paint.getColorLong()); - } } } diff --git a/app/src/main/java/com/misterchan/iconeditor/util/CanvasUtils.java b/app/src/main/java/com/misterchan/iconeditor/util/CanvasUtils.java index cf323c8..2346c61 100644 --- a/app/src/main/java/com/misterchan/iconeditor/util/CanvasUtils.java +++ b/app/src/main/java/com/misterchan/iconeditor/util/CanvasUtils.java @@ -15,4 +15,15 @@ public static void drawInclusiveLine(Canvas canvas, int startX, int startY, int canvas.drawLine(startX, startY, stopX, stopY, paint); } + + public static void drawRightAngles(Canvas canvas, float l, float t, float r, float b, Paint paint) { + canvas.drawLine(l, t, l - 100.0f, t, paint); + canvas.drawLine(r, t, r + 100.0f, t, paint); + canvas.drawLine(r, t - 100.0f, r, t, paint); + canvas.drawLine(r, b, r, b + 100.0f, paint); + canvas.drawLine(r + 100.0f, b, r, b, paint); + canvas.drawLine(l, b, l - 100.0f, b, paint); + canvas.drawLine(l, b + 100.0f, l, b, paint); + canvas.drawLine(l, t, l, t - 100.0f, paint); + } } diff --git a/app/src/main/res/layout/cell_grid.xml b/app/src/main/res/layout/cell_grid.xml index d799f84..2587037 100644 --- a/app/src/main/res/layout/cell_grid.xml +++ b/app/src/main/res/layout/cell_grid.xml @@ -47,7 +47,7 @@ android:layout_height="wrap_content" android:backgroundTint="@android:color/transparent" android:hint="@string/x" - android:inputType="number" + android:inputType="numberSigned" android:textAlignment="textEnd" /> @@ -67,7 +67,7 @@ android:layout_height="wrap_content" android:backgroundTint="@android:color/transparent" android:hint="@string/y" - android:inputType="number" + android:inputType="numberSigned" android:textAlignment="textEnd" /> @@ -96,7 +96,7 @@ android:layout_height="wrap_content" android:backgroundTint="@android:color/transparent" android:hint="@string/x" - android:inputType="number" + android:inputType="numberSigned" android:textAlignment="textEnd" /> @@ -116,7 +116,7 @@ android:layout_height="wrap_content" android:backgroundTint="@android:color/transparent" android:hint="@string/y" - android:inputType="number" + android:inputType="numberSigned" android:textAlignment="textEnd" /> diff --git a/app/src/main/res/menu/frame.xml b/app/src/main/res/menu/frame.xml index 5060831..6e24d92 100644 --- a/app/src/main/res/menu/frame.xml +++ b/app/src/main/res/menu/frame.xml @@ -31,6 +31,6 @@ android:id="@+id/i_frame_clip" android:icon="@drawable/ic_content_cut" android:iconTint="?attr/colorOnSurfaceVariant" - android:title="@string/clip" /> + android:title="@string/clip_verb" /> \ No newline at end of file diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 26d462c..18a7f34 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -40,7 +40,8 @@ 清除 清除目标 清除参考线 - 剪辑 + 剪贴簿数据 + 剪辑 剪贴 克隆笔 关闭 diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 78e2fb1..53199ab 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -40,7 +40,8 @@ 淸除 淸除目標 淸除參考線 - 剪輯 + 剪貼簿數據 + 剪輯 剪裁 克隆筆 關閉 diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 34ef474..fa7e431 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -16,7 +16,7 @@ @string/preset_brush - @string/reference + @string/clip_noun diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 94c6570..51adb52 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -50,7 +50,8 @@ Clear Clear Destination Clear Guides - Clip + Clip + Clip Clipped Cloner Close diff --git a/build.gradle b/build.gradle index 58a3bbb..f58ae3f 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. plugins { - id 'com.android.application' version '8.4.1' apply false - id 'com.android.library' version '8.4.1' apply false + id 'com.android.application' version '8.5.0' apply false + id 'com.android.library' version '8.5.0' apply false } tasks.register('clean', Delete) { diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index df03796..6c1bd69 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Tue May 21 17:02:37 HKT 2024 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists