├── .idea ├── .name ├── .gitignore ├── compiler.xml ├── render.experimental.xml ├── vcs.xml ├── AndroidProjectSystem.xml ├── deploymentTargetDropDown.xml ├── migrations.xml ├── gradle.xml ├── runConfigurations.xml ├── appInsightsSettings.xml └── deploymentTargetSelector.xml ├── app ├── .gitignore ├── src │ ├── main │ │ ├── res │ │ │ ├── mipmap-hdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.webp │ │ │ ├── mipmap-mdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.webp │ │ │ ├── mipmap-xhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.webp │ │ │ ├── mipmap-xxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.webp │ │ │ ├── mipmap-xxxhdpi │ │ │ │ ├── chessboard.jpg │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.webp │ │ │ ├── drawable │ │ │ │ ├── bracket_vert_open.9.png │ │ │ │ ├── bracket_horiz_close.9.png │ │ │ │ ├── bracket_horiz_open.9.png │ │ │ │ ├── bracket_vert_close.9.png │ │ │ │ ├── chessboard.xml │ │ │ │ ├── ic_void.xml │ │ │ │ ├── layer_visible.xml │ │ │ │ ├── ic_add.xml │ │ │ │ ├── ic_done.xml │ │ │ │ ├── ic_expand_more.xml │ │ │ │ ├── ic_format_italic.xml │ │ │ │ ├── ic_arrow_upward.xml │ │ │ │ ├── ic_format_strikethrough.xml │ │ │ │ ├── brush_tip_shape.xml │ │ │ │ ├── ic_arrow_downward.xml │ │ │ │ ├── ic_delete.xml │ │ │ │ ├── ic_crop.xml │ │ │ │ ├── ic_arrow_back.xml │ │ │ │ ├── ic_clear.xml │ │ │ │ ├── ic_close.xml │ │ │ │ ├── ic_info.xml │ │ │ │ ├── ic_format_align_center.xml │ │ │ │ ├── ic_layers.xml │ │ │ │ ├── ic_transform.xml │ │ │ │ ├── ic_movie.xml │ │ │ │ ├── ic_contrast.xml │ │ │ │ ├── ic_image.xml │ │ │ │ ├── ic_photo_size_select_actual.xml │ │ │ │ ├── ic_filter_b_and_w.xml │ │ │ │ ├── ic_folder_open.xml │ │ │ │ ├── ic_format_align_right.xml │ │ │ │ ├── ic_format_underlined.xml │ │ │ │ ├── ic_format_align_left.xml │ │ │ │ ├── ic_redo.xml │ │ │ │ ├── ic_undo.xml │ │ │ │ ├── ic_edit.xml │ │ │ │ ├── ic_content_copy.xml │ │ │ │ ├── ic_insert_drive_file.xml │ │ │ │ ├── ic_save.xml │ │ │ │ ├── ic_create_new_folder.xml │ │ │ │ ├── ic_brightness_5.xml │ │ │ │ ├── ic_more_horiz.xml │ │ │ │ ├── ic_more_vert.xml │ │ │ │ ├── ic_fit_screen.xml │ │ │ │ ├── ic_drive_file_rename_outline.xml │ │ │ │ ├── ic_filter.xml │ │ │ │ ├── ic_push_pin.xml │ │ │ │ ├── ic_flip.xml │ │ │ │ ├── ic_opacity.xml │ │ │ │ ├── ic_visibility.xml │ │ │ │ ├── ic_content_paste.xml │ │ │ │ ├── ic_grid_on.xml │ │ │ │ ├── ic_history.xml │ │ │ │ ├── ic_format_bold.xml │ │ │ │ ├── ic_rotate_90_degrees_cw.xml │ │ │ │ ├── ic_access_time.xml │ │ │ │ ├── ic_save_as.xml │ │ │ │ ├── ic_photo_size_select_large.xml │ │ │ │ ├── ic_select_all.xml │ │ │ │ ├── ic_balance.xml │ │ │ │ ├── ic_deselect.xml │ │ │ │ ├── ic_content_cut.xml │ │ │ │ ├── ic_palette.xml │ │ │ │ ├── ic_visibility_off.xml │ │ │ │ ├── ic_settings.xml │ │ │ │ └── ic_language.xml │ │ │ ├── xml │ │ │ │ └── provider_paths.xml │ │ │ ├── menu │ │ │ │ ├── color_picker.xml │ │ │ │ ├── action_mode_color.xml │ │ │ │ ├── palette.xml │ │ │ │ ├── proj_tab.xml │ │ │ │ ├── frame.xml │ │ │ │ ├── action_mode_transformer.xml │ │ │ │ └── tools.xml │ │ │ ├── layout │ │ │ │ ├── bracket.xml │ │ │ │ ├── settings_activity.xml │ │ │ │ ├── progress_indicator.xml │ │ │ │ ├── item_color.xml │ │ │ │ ├── slider.xml │ │ │ │ ├── color_picker_hsv.xml │ │ │ │ ├── frame_list.xml │ │ │ │ ├── top_app_bar.xml │ │ │ │ ├── options_bucket_fill.xml │ │ │ │ ├── edit_text.xml │ │ │ │ ├── animation_trimmer.xml │ │ │ │ ├── options_gradient.xml │ │ │ │ ├── options_eyedropper.xml │ │ │ │ ├── fill_with_clip.xml │ │ │ │ ├── item_frame.xml │ │ │ │ ├── merge_as_hidden.xml │ │ │ │ ├── lighting.xml │ │ │ │ ├── file_name.xml │ │ │ │ ├── options_patcher.xml │ │ │ │ ├── color_picker_tabs.xml │ │ │ │ ├── options_gradient_line.xml │ │ │ │ ├── options_brush.xml │ │ │ │ ├── options_eraser.xml │ │ │ │ ├── options_pencil.xml │ │ │ │ ├── options_clone_stamp.xml │ │ │ │ ├── options_shape.xml │ │ │ │ ├── options_text.xml │ │ │ │ ├── options_magic_paint.xml │ │ │ │ ├── options_transformer.xml │ │ │ │ ├── color_picker.xml │ │ │ │ ├── new_image.xml │ │ │ │ ├── options_magic_eraser.xml │ │ │ │ ├── noise_generator.xml │ │ │ │ ├── new_guide.xml │ │ │ │ └── layer_list.xml │ │ │ ├── mipmap-anydpi-v26 │ │ │ │ └── ic_launcher_round.xml │ │ │ ├── color │ │ │ │ └── item_checked.xml │ │ │ ├── values │ │ │ │ ├── colors.xml │ │ │ │ └── themes.xml │ │ │ ├── values-land │ │ │ │ └── styles.xml │ │ │ ├── drawable-v24 │ │ │ │ └── ic_launcher_foreground.xml │ │ │ └── layout-land │ │ │ │ └── color_picker.xml │ │ ├── java │ │ │ └── com │ │ │ │ └── misterchan │ │ │ │ └── iconeditor │ │ │ │ ├── Guide.java │ │ │ │ ├── util │ │ │ │ ├── RunnableRunnable.java │ │ │ │ ├── CanvasUtils.java │ │ │ │ └── LightingToLevels.java │ │ │ │ ├── tool │ │ │ │ ├── Shape.java │ │ │ │ ├── Ruler.java │ │ │ │ ├── Gradient.java │ │ │ │ ├── TextTool.java │ │ │ │ ├── CloneStamp.java │ │ │ │ ├── MagicPaint.java │ │ │ │ ├── BrushTool.java │ │ │ │ └── MagicEraser.java │ │ │ │ ├── listener │ │ │ │ ├── OnAdapterViewItemSelectedListener.java │ │ │ │ ├── OnItemSelectedListener.java │ │ │ │ ├── OnCBCheckedListener.java │ │ │ │ ├── OnSliderValueChangeListener.java │ │ │ │ ├── OnButtonCheckedListener.java │ │ │ │ ├── AfterTextChangedListener.java │ │ │ │ ├── OnRSChangeListener.java │ │ │ │ ├── OnSliderChangeListener.java │ │ │ │ └── OnCircularRSChangeListener.java │ │ │ │ ├── ui │ │ │ │ ├── CoordinateConversions.java │ │ │ │ ├── ViewModel.java │ │ │ │ └── ColorAdapter.java │ │ │ │ ├── FloatingLayer.java │ │ │ │ ├── Reference.java │ │ │ │ ├── ColorRange.java │ │ │ │ ├── DrawingPrimitivePreview.java │ │ │ │ ├── colorpicker │ │ │ │ ├── HslColorPicker.java │ │ │ │ ├── XyzColorPicker.java │ │ │ │ ├── LabColorPicker.java │ │ │ │ ├── CmykColorPicker.java │ │ │ │ ├── XyYColorPicker.java │ │ │ │ └── YuvColorPicker.java │ │ │ │ ├── CellGrid.java │ │ │ │ ├── dialog │ │ │ │ ├── FilterDialog.java │ │ │ │ ├── NewImageDialog.java │ │ │ │ ├── FillWithClipDialog.java │ │ │ │ ├── BitmapConfigModifier.java │ │ │ │ ├── EditNumberDialog.java │ │ │ │ ├── SliderDialog.java │ │ │ │ └── MatrixManager.java │ │ │ │ ├── Project.java │ │ │ │ └── ImageStateAccumulator.java │ │ └── AndroidManifest.xml │ ├── test │ │ └── java │ │ │ └── com │ │ │ └── misterchan │ │ │ └── iconeditor │ │ │ └── ExampleUnitTest.java │ └── androidTest │ │ └── java │ │ └── com │ │ └── misterchan │ │ └── iconeditor │ │ └── ExampleInstrumentedTest.java ├── proguard-rules.pro └── build.gradle ├── .github └── ISSUE_TEMPLATE │ ├── config.yml │ └── new-issue.md ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── README.md ├── .gitignore ├── settings.gradle ├── gradle.properties └── gradlew.bat /.idea/.name: -------------------------------------------------------------------------------- 1 | IconEditor -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | -------------------------------------------------------------------------------- /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MISTER-CHAN/icon-editor/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MISTER-CHAN/icon-editor/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MISTER-CHAN/icon-editor/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MISTER-CHAN/icon-editor/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MISTER-CHAN/icon-editor/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/chessboard.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MISTER-CHAN/icon-editor/HEAD/app/src/main/res/mipmap-xxxhdpi/chessboard.jpg -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MISTER-CHAN/icon-editor/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/bracket_vert_open.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MISTER-CHAN/icon-editor/HEAD/app/src/main/res/drawable/bracket_vert_open.9.png -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Icon Editor # 2 | **Requirement:** Android 12 or above 3 | **Third Party Library:** [Android NDK GIF](https://github.com/waynejo/android-ndk-gif) 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bracket_horiz_close.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MISTER-CHAN/icon-editor/HEAD/app/src/main/res/drawable/bracket_horiz_close.9.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/bracket_horiz_open.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MISTER-CHAN/icon-editor/HEAD/app/src/main/res/drawable/bracket_horiz_open.9.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/bracket_vert_close.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MISTER-CHAN/icon-editor/HEAD/app/src/main/res/drawable/bracket_vert_close.9.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MISTER-CHAN/icon-editor/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MISTER-CHAN/icon-editor/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MISTER-CHAN/icon-editor/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MISTER-CHAN/icon-editor/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MISTER-CHAN/icon-editor/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/render.experimental.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/chessboard.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/xml/provider_paths.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | -------------------------------------------------------------------------------- /.idea/AndroidProjectSystem.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /.idea/deploymentTargetDropDown.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/misterchan/iconeditor/Guide.java: -------------------------------------------------------------------------------- 1 | package com.misterchan.iconeditor; 2 | 3 | public class Guide { 4 | public static final boolean ORIENTATION_HORIZONTAL = false, ORIENTATION_VERTICAL = true; 5 | 6 | public boolean orientation; 7 | public int position; 8 | } 9 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Mon Jun 16 23:21:44 CST 2025 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.2-bin.zip 5 | zipStoreBase=GRADLE_USER_HOME 6 | zipStorePath=wrapper/dists 7 | -------------------------------------------------------------------------------- /app/src/main/java/com/misterchan/iconeditor/util/RunnableRunnable.java: -------------------------------------------------------------------------------- 1 | package com.misterchan.iconeditor.util; 2 | 3 | public interface RunnableRunnable { 4 | /** 5 | * @param wait Wait for the lock. 6 | */ 7 | void runRunnable(final Runnable target, final boolean wait); 8 | } 9 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/caches 5 | /.idea/libraries 6 | /.idea/modules.xml 7 | /.idea/workspace.xml 8 | /.idea/navEditor.xml 9 | /.idea/assetWizardSettings.xml 10 | .DS_Store 11 | /build 12 | /captures 13 | .externalNativeBuild 14 | .cxx 15 | local.properties 16 | -------------------------------------------------------------------------------- /app/src/main/res/menu/color_picker.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | -------------------------------------------------------------------------------- /.idea/migrations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/layout/bracket.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_void.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/color/item_checked.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/layer_visible.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/java/com/misterchan/iconeditor/tool/Shape.java: -------------------------------------------------------------------------------- 1 | package com.misterchan.iconeditor.tool; 2 | 3 | import android.graphics.Canvas; 4 | import android.graphics.Rect; 5 | 6 | public interface Shape { 7 | Rect mapRect(int x0, int y0, int x1, int y1); 8 | 9 | String drawShapeOntoCanvas(Canvas canvas, int x0, int y0, int x1, int y1); 10 | } 11 | -------------------------------------------------------------------------------- /app/src/main/res/layout/settings_activity.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 9 | -------------------------------------------------------------------------------- /app/src/main/java/com/misterchan/iconeditor/listener/OnAdapterViewItemSelectedListener.java: -------------------------------------------------------------------------------- 1 | package com.misterchan.iconeditor.listener; 2 | 3 | import android.widget.AdapterView; 4 | 5 | public interface OnAdapterViewItemSelectedListener extends AdapterView.OnItemSelectedListener { 6 | @Override 7 | default void onNothingSelected(AdapterView parent) { 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/misterchan/iconeditor/ui/CoordinateConversions.java: -------------------------------------------------------------------------------- 1 | package com.misterchan.iconeditor.ui; 2 | 3 | public interface CoordinateConversions { 4 | int toBitmapX(float x); 5 | 6 | int toBitmapY(float y); 7 | 8 | float toViewX(int x); 9 | 10 | float toViewX(float x); 11 | 12 | float toViewY(int y); 13 | 14 | float toViewY(float y); 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_add.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_done.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_expand_more.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_format_italic.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_arrow_upward.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_format_strikethrough.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/brush_tip_shape.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_arrow_downward.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/java/com/misterchan/iconeditor/tool/Ruler.java: -------------------------------------------------------------------------------- 1 | package com.misterchan.iconeditor.tool; 2 | 3 | public class Ruler { 4 | public boolean enabled = false; 5 | public int startX, startY; 6 | public int stopX, stopY; 7 | 8 | public void set(int startX, int startY, int stopX, int stopY) { 9 | this.startX = startX; 10 | this.startY = startY; 11 | this.stopX = stopX; 12 | this.stopY = stopY; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_delete.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | pluginManagement { 2 | repositories { 3 | gradlePluginPortal() 4 | google() 5 | mavenCentral() 6 | } 7 | } 8 | dependencyResolutionManagement { 9 | repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) 10 | repositories { 11 | google() 12 | mavenCentral() 13 | maven { url 'https://repo1.maven.org/maven2' } 14 | } 15 | } 16 | rootProject.name = "IconEditor" 17 | include ':app' 18 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_crop.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_arrow_back.xml: -------------------------------------------------------------------------------- 1 | 8 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_clear.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_close.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_info.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_format_align_center.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_layers.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_transform.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/java/com/misterchan/iconeditor/listener/OnItemSelectedListener.java: -------------------------------------------------------------------------------- 1 | package com.misterchan.iconeditor.listener; 2 | 3 | import android.view.View; 4 | import android.widget.AdapterView; 5 | 6 | public interface OnItemSelectedListener extends AdapterView.OnItemSelectedListener { 7 | 8 | @Override 9 | void onItemSelected(AdapterView parent, View view, int position, long id); 10 | 11 | @Override 12 | default void onNothingSelected(AdapterView parent) { 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_movie.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #FFD0BCFF 4 | #FFCCC2DC 5 | #FFEFB8C8 6 | #FFFFFFFF 7 | 8 | #FF6650A4 9 | #FF625B71 10 | #FF7D5260 11 | #FF000000 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_contrast.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_image.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_photo_size_select_actual.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/test/java/com/misterchan/iconeditor/ExampleUnitTest.java: -------------------------------------------------------------------------------- 1 | package com.misterchan.iconeditor; 2 | 3 | import org.junit.Test; 4 | 5 | import static org.junit.Assert.*; 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * @see Testing documentation 11 | */ 12 | public class ExampleUnitTest { 13 | @Test 14 | public void addition_isCorrect() { 15 | assertEquals(4, 2 + 2); 16 | } 17 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_filter_b_and_w.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_folder_open.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_format_align_right.xml: -------------------------------------------------------------------------------- 1 | 8 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_format_underlined.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/java/com/misterchan/iconeditor/listener/OnCBCheckedListener.java: -------------------------------------------------------------------------------- 1 | package com.misterchan.iconeditor.listener; 2 | 3 | import android.widget.CompoundButton; 4 | 5 | public interface OnCBCheckedListener extends CompoundButton.OnCheckedChangeListener { 6 | 7 | void onChecked(CompoundButton buttonView); 8 | 9 | @Override 10 | default void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 11 | if (isChecked) { 12 | onChecked(buttonView); 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_format_align_left.xml: -------------------------------------------------------------------------------- 1 | 8 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_redo.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_undo.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_edit.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_content_copy.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_insert_drive_file.xml: -------------------------------------------------------------------------------- 1 | 8 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_save.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_create_new_folder.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/new-issue.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: New issue 3 | about: Open a new issue 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | 16 | -------------------------------------------------------------------------------- /app/src/main/java/com/misterchan/iconeditor/ui/ViewModel.java: -------------------------------------------------------------------------------- 1 | package com.misterchan.iconeditor.ui; 2 | 3 | import android.graphics.Color; 4 | 5 | import com.misterchan.iconeditor.Project; 6 | 7 | import java.util.ArrayList; 8 | import java.util.List; 9 | 10 | public class ViewModel extends androidx.lifecycle.ViewModel { 11 | private List projects; 12 | 13 | public List getProjects() { 14 | if (projects == null) { 15 | projects = new ArrayList<>(); 16 | } 17 | return projects; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_brightness_5.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_more_horiz.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_more_vert.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_fit_screen.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/menu/action_mode_color.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 9 | 12 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_drive_file_rename_outline.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_filter.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_push_pin.xml: -------------------------------------------------------------------------------- 1 | 7 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/java/com/misterchan/iconeditor/listener/OnSliderValueChangeListener.java: -------------------------------------------------------------------------------- 1 | package com.misterchan.iconeditor.listener; 2 | 3 | import androidx.annotation.NonNull; 4 | 5 | import com.google.android.material.slider.Slider; 6 | 7 | public interface OnSliderValueChangeListener extends Slider.OnChangeListener { 8 | void onValueChange(@NonNull Slider slider, float value); 9 | 10 | @Override 11 | default void onValueChange(@NonNull Slider slider, float value, boolean fromUser) { 12 | if (fromUser) { 13 | onValueChange(slider, value); 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_flip.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_opacity.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/layout/progress_indicator.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_visibility.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/java/com/misterchan/iconeditor/FloatingLayer.java: -------------------------------------------------------------------------------- 1 | package com.misterchan.iconeditor; 2 | 3 | import android.graphics.Bitmap; 4 | 5 | public interface FloatingLayer { 6 | default boolean hasRect() { 7 | return false; 8 | } 9 | 10 | Bitmap getBitmap(); 11 | 12 | default int getLeft() { 13 | return 0; 14 | } 15 | 16 | default int getTop() { 17 | return 0; 18 | } 19 | 20 | default int getWidth() { 21 | return getBitmap().getWidth(); 22 | } 23 | 24 | default int getHeight() { 25 | return getBitmap().getHeight(); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_content_paste.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_grid_on.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_history.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_color.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 12 | 13 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_format_bold.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_rotate_90_degrees_cw.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/layout/slider.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 15 | -------------------------------------------------------------------------------- /app/src/main/java/com/misterchan/iconeditor/listener/OnButtonCheckedListener.java: -------------------------------------------------------------------------------- 1 | package com.misterchan.iconeditor.listener; 2 | 3 | import androidx.annotation.IdRes; 4 | 5 | import com.google.android.material.button.MaterialButtonToggleGroup; 6 | 7 | public interface OnButtonCheckedListener extends MaterialButtonToggleGroup.OnButtonCheckedListener { 8 | void onButtonChecked(MaterialButtonToggleGroup group, @IdRes int checkedId); 9 | 10 | default void onButtonChecked(MaterialButtonToggleGroup group, @IdRes int checkedId, boolean isChecked) { 11 | if (isChecked) { 12 | onButtonChecked(group, checkedId); 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_access_time.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_save_as.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/java/com/misterchan/iconeditor/listener/AfterTextChangedListener.java: -------------------------------------------------------------------------------- 1 | package com.misterchan.iconeditor.listener; 2 | 3 | import android.text.Editable; 4 | import android.text.TextWatcher; 5 | 6 | public interface AfterTextChangedListener extends TextWatcher { 7 | 8 | void afterTextChanged(String s); 9 | 10 | @Override 11 | default void afterTextChanged(Editable s) { 12 | afterTextChanged(s.toString()); 13 | } 14 | 15 | @Override 16 | default void beforeTextChanged(CharSequence s, int start, int count, int after) { 17 | } 18 | 19 | @Override 20 | default void onTextChanged(CharSequence s, int start, int before, int count) { 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_photo_size_select_large.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/layout/color_picker_hsv.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 13 | 14 | 19 | -------------------------------------------------------------------------------- /app/src/main/java/com/misterchan/iconeditor/Reference.java: -------------------------------------------------------------------------------- 1 | package com.misterchan.iconeditor; 2 | 3 | import android.graphics.Bitmap; 4 | import android.graphics.Rect; 5 | 6 | public class Reference { 7 | private Bitmap bitmap; 8 | 9 | public Bitmap bm() { 10 | return bitmap; 11 | } 12 | 13 | public void recycle() { 14 | if (bitmap != null) { 15 | bitmap.recycle(); 16 | bitmap = null; 17 | } 18 | } 19 | 20 | public boolean recycled() { 21 | return bitmap == null; 22 | } 23 | 24 | public void set(Bitmap bm) { 25 | recycle(); 26 | if (bm == null) { 27 | return; 28 | } 29 | bitmap = bm; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_select_all.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_balance.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/layout/frame_list.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_deselect.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /app/src/main/res/layout/top_app_bar.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 11 | 12 | 17 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/menu/palette.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 13 | 14 | 15 | 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_content_cut.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/java/com/misterchan/iconeditor/listener/OnRSChangeListener.java: -------------------------------------------------------------------------------- 1 | package com.misterchan.iconeditor.listener; 2 | 3 | import androidx.annotation.NonNull; 4 | 5 | import com.google.android.material.slider.RangeSlider; 6 | 7 | public interface OnRSChangeListener extends RangeSlider.OnChangeListener, RangeSlider.OnSliderTouchListener { 8 | void onChange(@NonNull RangeSlider slider, boolean stopped); 9 | 10 | @Override 11 | default void onStartTrackingTouch(@NonNull RangeSlider slider) { 12 | } 13 | 14 | @Override 15 | default void onStopTrackingTouch(@NonNull RangeSlider slider) { 16 | onChange(slider, true); 17 | } 18 | 19 | @Override 20 | default void onValueChange(@NonNull RangeSlider slider, float value, boolean fromUser) { 21 | if (fromUser) { 22 | onChange(slider, false); 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 19 | 20 | -------------------------------------------------------------------------------- /app/src/main/java/com/misterchan/iconeditor/listener/OnSliderChangeListener.java: -------------------------------------------------------------------------------- 1 | package com.misterchan.iconeditor.listener; 2 | 3 | import androidx.annotation.NonNull; 4 | import androidx.annotation.Nullable; 5 | 6 | import com.google.android.material.slider.Slider; 7 | 8 | public interface OnSliderChangeListener extends Slider.OnChangeListener, Slider.OnSliderTouchListener { 9 | void onChange(@Nullable Slider slider, float value, boolean stopped); 10 | 11 | @Override 12 | default void onStartTrackingTouch(@NonNull Slider slider) { 13 | } 14 | 15 | @Override 16 | default void onStopTrackingTouch(@NonNull Slider slider) { 17 | onChange(slider, slider.getValue(), true); 18 | } 19 | 20 | @Override 21 | default void onValueChange(@NonNull Slider slider, float value, boolean fromUser) { 22 | if (fromUser) { 23 | onChange(slider, value, false); 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_palette.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/androidTest/java/com/misterchan/iconeditor/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.misterchan.iconeditor; 2 | 3 | import android.content.Context; 4 | 5 | import androidx.test.platform.app.InstrumentationRegistry; 6 | import androidx.test.ext.junit.runners.AndroidJUnit4; 7 | 8 | import org.junit.Test; 9 | import org.junit.runner.RunWith; 10 | 11 | import static org.junit.Assert.*; 12 | 13 | /** 14 | * Instrumented test, which will execute on an Android device. 15 | * 16 | * @see Testing documentation 17 | */ 18 | @RunWith(AndroidJUnit4.class) 19 | public class ExampleInstrumentedTest { 20 | @Test 21 | public void useAppContext() { 22 | // Context of the app under test. 23 | Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); 24 | assertEquals("com.misterchan.iconeditor", appContext.getPackageName()); 25 | } 26 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_visibility_off.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/menu/proj_tab.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 10 | 11 | 16 | 21 | 22 | -------------------------------------------------------------------------------- /app/src/main/res/layout/options_bucket_fill.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 12 | 13 | 18 | 19 |