Full Code of iQueSoft/iQuePhoto for AI

master cd7050d5358f cached
282 files
468.7 KB
142.1k tokens
983 symbols
1 requests
Download .txt
Showing preview only (550K chars total). Download the full file or copy to clipboard to get everything.
Repository: iQueSoft/iQuePhoto
Branch: master
Commit: cd7050d5358f
Files: 282
Total size: 468.7 KB

Directory structure:
gitextract_crye9wp4/

├── README.md
└── iQuePhoto/
    ├── .gitignore
    ├── .idea/
    │   ├── compiler.xml
    │   ├── copyright/
    │   │   └── profiles_settings.xml
    │   ├── dictionaries/
    │   │   └── Sergey.xml
    │   ├── gradle.xml
    │   ├── misc.xml
    │   ├── modules.xml
    │   ├── runConfigurations.xml
    │   └── vcs.xml
    ├── app/
    │   ├── .gitignore
    │   ├── build.gradle
    │   ├── proguard-rules.pro
    │   └── src/
    │       ├── androidTest/
    │       │   └── java/
    │       │       └── net/
    │       │           └── iquesoft/
    │       │               └── iquephoto/
    │       │                   └── ApplicationTest.java
    │       ├── main/
    │       │   ├── AndroidManifest.xml
    │       │   ├── assets/
    │       │   │   └── fonts/
    │       │   │       ├── Abys-Regular.otf
    │       │   │       ├── Blacksword.otf
    │       │   │       ├── Souses.otf
    │       │   │       └── SummerHearts-Regular.otf
    │       │   ├── java/
    │       │   │   └── net/
    │       │   │       └── iquesoft/
    │       │   │           └── iquephoto/
    │       │   │               ├── App.java
    │       │   │               ├── adapters/
    │       │   │               │   ├── AdjustAdapter.java
    │       │   │               │   ├── ColorAdapter.java
    │       │   │               │   ├── FiltersAdapter.java
    │       │   │               │   ├── FontsAdapter.java
    │       │   │               │   ├── FramesAdapter.java
    │       │   │               │   ├── ImageAlbumsAdapter.java
    │       │   │               │   ├── ImagesAdapter.java
    │       │   │               │   ├── OverlaysAdapter.java
    │       │   │               │   ├── SizesAdapter.java
    │       │   │               │   ├── StickerSetAdapter.java
    │       │   │               │   ├── StickersAdapter.java
    │       │   │               │   └── ToolsAdapter.java
    │       │   │               ├── core/
    │       │   │               │   ├── EditorListener.java
    │       │   │               │   ├── EditorView.java
    │       │   │               │   ├── ImageEditorView.java
    │       │   │               │   ├── ImageEditorViewPresenter.java
    │       │   │               │   ├── enums/
    │       │   │               │   │   ├── EditorMode.java
    │       │   │               │   │   └── EditorTool.java
    │       │   │               │   └── model/
    │       │   │               │       ├── Drawing.java
    │       │   │               │       ├── EditorFrame.java
    │       │   │               │       ├── EditorImage.java
    │       │   │               │       ├── EditorLinearTiltShift.java
    │       │   │               │       ├── EditorRadialTiltShift.java
    │       │   │               │       ├── EditorSticker.java
    │       │   │               │       ├── EditorText.java
    │       │   │               │       ├── EditorTiltShift.java
    │       │   │               │       └── EditorVignette.java
    │       │   │               ├── di/
    │       │   │               │   ├── AppComponent.java
    │       │   │               │   └── modules/
    │       │   │               │       ├── AppModule.java
    │       │   │               │       └── EditorModule.java
    │       │   │               ├── graphics/
    │       │   │               │   ├── CircleSizeDrawable.java
    │       │   │               │   ├── ColorCircleDrawable.java
    │       │   │               │   └── SquareFrameLayout.java
    │       │   │               ├── models/
    │       │   │               │   ├── Adjust.java
    │       │   │               │   ├── BrushSize.java
    │       │   │               │   ├── EditorColor.java
    │       │   │               │   ├── Filter.java
    │       │   │               │   ├── Font.java
    │       │   │               │   ├── Frame.java
    │       │   │               │   ├── Image.java
    │       │   │               │   ├── ImageAlbum.java
    │       │   │               │   ├── Overlay.java
    │       │   │               │   ├── ParcelablePaint.java
    │       │   │               │   ├── Sticker.java
    │       │   │               │   ├── StickersSet.java
    │       │   │               │   ├── Text.java
    │       │   │               │   └── Tool.java
    │       │   │               ├── presentation/
    │       │   │               │   ├── presenters/
    │       │   │               │   │   ├── activity/
    │       │   │               │   │   │   ├── EditorActivityPresenter.java
    │       │   │               │   │   │   ├── GalleryActivityPresenter.java
    │       │   │               │   │   │   ├── HomeActivityPresenter.java
    │       │   │               │   │   │   └── PreviewActivityPresenter.java
    │       │   │               │   │   └── fragment/
    │       │   │               │   │       ├── AddTextPresenter.java
    │       │   │               │   │       ├── AdjustPresenter.java
    │       │   │               │   │       ├── ColorsPresenter.java
    │       │   │               │   │       ├── DrawingPresenter.java
    │       │   │               │   │       ├── FiltersPresenter.java
    │       │   │               │   │       ├── FontsPresenter.java
    │       │   │               │   │       ├── FramesPresenter.java
    │       │   │               │   │       ├── GalleryAlbumsPresenter.java
    │       │   │               │   │       ├── GalleryImagesPresenter.java
    │       │   │               │   │       ├── ImageAdjustmentPresenter.java
    │       │   │               │   │       ├── OverlaysPresenter.java
    │       │   │               │   │       ├── StickersPresenter.java
    │       │   │               │   │       ├── StickersSetPresenter.java
    │       │   │               │   │       ├── TiltShiftFragmentPresenter.java
    │       │   │               │   │       ├── ToolsPresenter.java
    │       │   │               │   │       ├── TransformPresenter.java
    │       │   │               │   │       └── TransparencyPresenter.java
    │       │   │               │   └── views/
    │       │   │               │       ├── activity/
    │       │   │               │       │   ├── CameraActivityView.java
    │       │   │               │       │   ├── EditorActivityView.java
    │       │   │               │       │   ├── GalleryView.java
    │       │   │               │       │   ├── HomeView.java
    │       │   │               │       │   └── PreviewView.java
    │       │   │               │       └── fragment/
    │       │   │               │           ├── AddTextView.java
    │       │   │               │           ├── AdjustView.java
    │       │   │               │           ├── ColorsView.java
    │       │   │               │           ├── DrawingView.java
    │       │   │               │           ├── FiltersView.java
    │       │   │               │           ├── FontsView.java
    │       │   │               │           ├── FramesView.java
    │       │   │               │           ├── GalleryAlbumsView.java
    │       │   │               │           ├── GalleryImagesView.java
    │       │   │               │           ├── ImageAdjustmentView.java
    │       │   │               │           ├── IntensityView.java
    │       │   │               │           ├── OverlaysView.java
    │       │   │               │           ├── StickersSetView.java
    │       │   │               │           ├── StickersView.java
    │       │   │               │           ├── TiltShiftView.java
    │       │   │               │           ├── ToolsView.java
    │       │   │               │           ├── TransformHorizontalView.java
    │       │   │               │           ├── TransformStraightenView.java
    │       │   │               │           ├── TransformVerticalView.java
    │       │   │               │           └── TransformView.java
    │       │   │               ├── tasks/
    │       │   │               │   ├── DecodeScaledImageAsyncTask.java
    │       │   │               │   ├── ImageCacheSaveTask.java
    │       │   │               │   ├── ImageFetchTask.java
    │       │   │               │   └── ImageSaveTask.java
    │       │   │               ├── ui/
    │       │   │               │   ├── activities/
    │       │   │               │   │   ├── EditorActivity.java
    │       │   │               │   │   ├── GalleryActivity.java
    │       │   │               │   │   ├── HomeActivity.java
    │       │   │               │   │   └── PreviewActivity.java
    │       │   │               │   ├── dialogs/
    │       │   │               │   │   ├── ColorPickerDialog.java
    │       │   │               │   │   ├── FontPickerDialog.java
    │       │   │               │   │   └── LoadingDialog.java
    │       │   │               │   └── fragments/
    │       │   │               │       ├── AdjustFragment.java
    │       │   │               │       ├── DrawingFragment.java
    │       │   │               │       ├── FiltersFragment.java
    │       │   │               │       ├── FontsFragment.java
    │       │   │               │       ├── FramesFragment.java
    │       │   │               │       ├── GalleryAlbumsFragment.java
    │       │   │               │       ├── GalleryImagesFragment.java
    │       │   │               │       ├── ImageAdjustmentFragment.java
    │       │   │               │       ├── OverlaysFragment.java
    │       │   │               │       ├── StickersFragment.java
    │       │   │               │       ├── StickersSetFragment.java
    │       │   │               │       ├── TextFragment.java
    │       │   │               │       ├── TiltShiftFragment.java
    │       │   │               │       ├── ToolFragment.java
    │       │   │               │       ├── ToolsFragment.java
    │       │   │               │       ├── TransformFragment.java
    │       │   │               │       └── TransparencyFragment.java
    │       │   │               └── utils/
    │       │   │                   ├── BitmapUtil.java
    │       │   │                   ├── LogHelper.java
    │       │   │                   ├── MatrixUtil.java
    │       │   │                   ├── MotionEventUtil.java
    │       │   │                   ├── RectUtil.java
    │       │   │                   ├── SizeUtil.java
    │       │   │                   └── ToolbarUtil.java
    │       │   └── res/
    │       │       ├── anim/
    │       │       │   ├── slide_down.xml
    │       │       │   └── slide_up.xml
    │       │       ├── drawable/
    │       │       │   ├── ic_add.xml
    │       │       │   ├── ic_add_40.xml
    │       │       │   ├── ic_add_circle.xml
    │       │       │   ├── ic_add_circle_white_24dp.xml
    │       │       │   ├── ic_adjust_white_50dp.xml
    │       │       │   ├── ic_apply_40.xml
    │       │       │   ├── ic_arrow_back_white_24dp.xml
    │       │       │   ├── ic_blur_linear.xml
    │       │       │   ├── ic_blur_off.xml
    │       │       │   ├── ic_blur_radial.xml
    │       │       │   ├── ic_brightness.xml
    │       │       │   ├── ic_brush_color.xml
    │       │       │   ├── ic_camera.xml
    │       │       │   ├── ic_cancel_40.xml
    │       │       │   ├── ic_check.xml
    │       │       │   ├── ic_check_40.xml
    │       │       │   ├── ic_clear.xml
    │       │       │   ├── ic_close_white_24dp.xml
    │       │       │   ├── ic_color.xml
    │       │       │   ├── ic_contrast.xml
    │       │       │   ├── ic_crop.xml
    │       │       │   ├── ic_delete_on.xml
    │       │       │   ├── ic_disappointed_white_150dp.xml
    │       │       │   ├── ic_drawing_white_50dp.xml
    │       │       │   ├── ic_eraser.xml
    │       │       │   ├── ic_expand.xml
    │       │       │   ├── ic_expand_less.xml
    │       │       │   ├── ic_exposure.xml
    │       │       │   ├── ic_fade.xml
    │       │       │   ├── ic_filter_40.xml
    │       │       │   ├── ic_filter_white_50dp.xml
    │       │       │   ├── ic_flags.xml
    │       │       │   ├── ic_flash_auto.xml
    │       │       │   ├── ic_flash_off.xml
    │       │       │   ├── ic_flash_on.xml
    │       │       │   ├── ic_flip_camera.xml
    │       │       │   ├── ic_font.xml
    │       │       │   ├── ic_font_bold.xml
    │       │       │   ├── ic_font_italic.xml
    │       │       │   ├── ic_format_bold.xml
    │       │       │   ├── ic_format_color_text_black_24dp.xml
    │       │       │   ├── ic_format_italic.xml
    │       │       │   ├── ic_format_underlined.xml
    │       │       │   ├── ic_frame_white_50dp.xml
    │       │       │   ├── ic_gallery_white_100dp.xml
    │       │       │   ├── ic_h_flip_white_35dp.xml
    │       │       │   ├── ic_instagram.xml
    │       │       │   ├── ic_intensity.xml
    │       │       │   ├── ic_left.xml
    │       │       │   ├── ic_letters_white_50dp.xml
    │       │       │   ├── ic_loop.xml
    │       │       │   ├── ic_magic_stick.xml
    │       │       │   ├── ic_overlay_white_50dp.xml
    │       │       │   ├── ic_perspective_horizontal.xml
    │       │       │   ├── ic_perspective_vertical.xml
    │       │       │   ├── ic_radial.xml
    │       │       │   ├── ic_rotate_left_white_35dp.xml
    │       │       │   ├── ic_rotate_right_white_35dp.xml
    │       │       │   ├── ic_rotation.xml
    │       │       │   ├── ic_saturation.xml
    │       │       │   ├── ic_settings.xml
    │       │       │   ├── ic_shadows.xml
    │       │       │   ├── ic_share.xml
    │       │       │   ├── ic_stiker_white_50dp.xml
    │       │       │   ├── ic_straighten.xml
    │       │       │   ├── ic_tilt_shift_white_50dp.xml
    │       │       │   ├── ic_tint.xml
    │       │       │   ├── ic_transform_white_50dp.xml
    │       │       │   ├── ic_undo.xml
    │       │       │   ├── ic_v_flip_white_35dp.xml
    │       │       │   ├── ic_vignette_white_50dp.xml
    │       │       │   └── ic_warmth.xml
    │       │       ├── layout/
    │       │       │   ├── activity_editor.xml
    │       │       │   ├── activity_gallery.xml
    │       │       │   ├── activity_home.xml
    │       │       │   ├── activity_preview.xml
    │       │       │   ├── dialog_argb_color_picker.xml
    │       │       │   ├── dialog_color_picker.xml
    │       │       │   ├── dialog_font_picker.xml
    │       │       │   ├── dialog_loading.xml
    │       │       │   ├── fragment_adjust.xml
    │       │       │   ├── fragment_camera_filters.xml
    │       │       │   ├── fragment_drawing.xml
    │       │       │   ├── fragment_filters.xml
    │       │       │   ├── fragment_fonts.xml
    │       │       │   ├── fragment_frames.xml
    │       │       │   ├── fragment_gallery_albums.xml
    │       │       │   ├── fragment_gallery_images.xml
    │       │       │   ├── fragment_overlay.xml
    │       │       │   ├── fragment_show_stickers.xml
    │       │       │   ├── fragment_slider_control.xml
    │       │       │   ├── fragment_stickers.xml
    │       │       │   ├── fragment_text.xml
    │       │       │   ├── fragment_tilt_shift.xml
    │       │       │   ├── fragment_tools.xml
    │       │       │   ├── fragment_transform.xml
    │       │       │   ├── fragment_transform_horizontal.xml
    │       │       │   ├── fragment_transform_straighten.xml
    │       │       │   ├── fragment_transform_vertical.xml
    │       │       │   ├── fragment_transparency.xml
    │       │       │   ├── item_adjust.xml
    │       │       │   ├── item_brush_size.xml
    │       │       │   ├── item_color.xml
    │       │       │   ├── item_filter.xml
    │       │       │   ├── item_font.xml
    │       │       │   ├── item_frame.xml
    │       │       │   ├── item_image.xml
    │       │       │   ├── item_image_album.xml
    │       │       │   ├── item_overlay.xml
    │       │       │   ├── item_sticker.xml
    │       │       │   ├── item_sticker_set.xml
    │       │       │   └── item_tool.xml
    │       │       ├── menu/
    │       │       │   ├── menu_crop.xml
    │       │       │   ├── menu_editor.xml
    │       │       │   ├── menu_share.xml
    │       │       │   └── menu_tool.xml
    │       │       ├── values/
    │       │       │   ├── attrs.xml
    │       │       │   ├── colors.xml
    │       │       │   ├── dimens.xml
    │       │       │   ├── strings.xml
    │       │       │   └── styles.xml
    │       │       ├── values-v21/
    │       │       │   └── styles.xml
    │       │       ├── values-w820dp/
    │       │       │   └── dimens.xml
    │       │       └── xml/
    │       │           └── provider_paths.xml
    │       └── test/
    │           └── java/
    │               └── net/
    │                   └── iquesoft/
    │                       └── iquephoto/
    │                           └── ExampleUnitTest.java
    ├── build.gradle
    ├── gradle/
    │   └── wrapper/
    │       ├── gradle-wrapper.jar
    │       └── gradle-wrapper.properties
    ├── gradle.properties
    ├── gradlew
    ├── gradlew.bat
    └── settings.gradle

================================================
FILE CONTENTS
================================================

================================================
FILE: README.md
================================================
# iQuePhoto - Android Image Editor App (Alpha version).

![iQuePhoto](/iQuePhoto.png)

**iQuePhoto** is simple and omnipotent image editor which is based on [MVP] (https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93presenter) architecture pattern with [Dependency Injection] (https://en.wikipedia.org/wiki/Dependency_injection) and uses [Reactive Extensions] (http://reactivex.io/intro.html) for UI events. The Image Editor made on Custom View and it shows how is powerful can be Views on Android.

##  App features
* `Crop`
* `Filters`
* `Adjust`
* `Stickers`
* `Overlays`
* `Frames`
* `Transform`
* `Vignette`
* `Tilt-Shift`
* `Drawing`
* `Text`

## Compatibility
**API Level:** Compatible with Android 5.0 or higher.

## Dependencies
* [Dagger2](https://github.com/google/dagger) - A fast dependency injector for Android and Java.
* [Moxy](https://github.com/Arello-Mobile/Moxy) - Moxy is a library that help to use MVP pattern when you do the Android Application. Without problems of lifecycle and boilerplate code!
* [Butter Knife] (https://github.com/JakeWharton/butterknife) - Bind Android views and callbacks to fields and methods.
* [Picasso] (https://github.com/square/picasso) - A powerful image downloading and caching library for Android.
* [RxJava] (https://github.com/ReactiveX/RxJava) & [RxAndroid] (https://github.com/ReactiveX/RxAndroid) - RxJava is a Java VM implementation of Reactive Extensions: a library for composing asynchronous and event-based programs by using observable sequences. It extends the observer pattern to support sequences of data/events and adds operators that allow you to compose sequences together declaratively while abstracting away concerns about things like low-level threading, synchronization, thread-safety and concurrent data structures.
* [Retrolambda] (https://github.com/evant/gradle-retrolambda) - A Gradle plugin for getting Java lambda support in Java 6, 7 and Android.
* [RxPermissions] (https://github.com/tbruyelle/RxPermissions) - Android runtime permissions powered by RxJava.


================================================
FILE: iQuePhoto/.gitignore
================================================
*.iml
.gradle
/local.properties
/.idea/workspace.xml
/.idea/libraries
.DS_Store
/build
/captures


================================================
FILE: iQuePhoto/.idea/compiler.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="CompilerConfiguration">
    <resourceExtensions />
    <wildcardResourcePatterns>
      <entry name="!?*.java" />
      <entry name="!?*.form" />
      <entry name="!?*.class" />
      <entry name="!?*.groovy" />
      <entry name="!?*.scala" />
      <entry name="!?*.flex" />
      <entry name="!?*.kt" />
      <entry name="!?*.clj" />
      <entry name="!?*.aj" />
    </wildcardResourcePatterns>
    <annotationProcessing>
      <profile default="true" name="Default" enabled="false">
        <processorPath useClasspath="true" />
      </profile>
    </annotationProcessing>
  </component>
</project>

================================================
FILE: iQuePhoto/.idea/copyright/profiles_settings.xml
================================================
<component name="CopyrightManager">
  <settings default="" />
</component>

================================================
FILE: iQuePhoto/.idea/dictionaries/Sergey.xml
================================================
<component name="ProjectDictionaryState">
  <dictionary name="Sergey">
    <words>
      <w>emoji</w>
    </words>
  </dictionary>
</component>

================================================
FILE: iQuePhoto/.idea/gradle.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="GradleSettings">
    <option name="linkedExternalProjectsSettings">
      <GradleProjectSettings>
        <option name="distributionType" value="DEFAULT_WRAPPED" />
        <option name="externalProjectPath" value="$PROJECT_DIR$" />
        <option name="modules">
          <set>
            <option value="$PROJECT_DIR$" />
            <option value="$PROJECT_DIR$/app" />
          </set>
        </option>
        <option name="resolveModulePerSourceSet" value="false" />
      </GradleProjectSettings>
    </option>
  </component>
</project>

================================================
FILE: iQuePhoto/.idea/misc.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="EntryPointsManager">
    <entry_points version="2.0" />
  </component>
  <component name="NullableNotNullManager">
    <option name="myDefaultNullable" value="android.support.annotation.Nullable" />
    <option name="myDefaultNotNull" value="android.support.annotation.NonNull" />
    <option name="myNullables">
      <value>
        <list size="4">
          <item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.Nullable" />
          <item index="1" class="java.lang.String" itemvalue="javax.annotation.Nullable" />
          <item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.Nullable" />
          <item index="3" class="java.lang.String" itemvalue="android.support.annotation.Nullable" />
        </list>
      </value>
    </option>
    <option name="myNotNulls">
      <value>
        <list size="4">
          <item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.NotNull" />
          <item index="1" class="java.lang.String" itemvalue="javax.annotation.Nonnull" />
          <item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.NonNull" />
          <item index="3" class="java.lang.String" itemvalue="android.support.annotation.NonNull" />
        </list>
      </value>
    </option>
  </component>
  <component name="ProjectLevelVcsManager" settingsEditedManually="false">
    <OptionsSetting value="true" id="Add" />
    <OptionsSetting value="true" id="Remove" />
    <OptionsSetting value="true" id="Checkout" />
    <OptionsSetting value="true" id="Update" />
    <OptionsSetting value="true" id="Status" />
    <OptionsSetting value="true" id="Edit" />
    <ConfirmationsSetting value="0" id="Add" />
    <ConfirmationsSetting value="0" id="Remove" />
  </component>
  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" assert-keyword="true" jdk-15="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
    <output url="file://$PROJECT_DIR$/build/classes" />
  </component>
  <component name="ProjectType">
    <option name="id" value="Android" />
  </component>
</project>

================================================
FILE: iQuePhoto/.idea/modules.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="ProjectModuleManager">
    <modules>
      <module fileurl="file://$PROJECT_DIR$/app/app.iml" filepath="$PROJECT_DIR$/app/app.iml" />
      <module fileurl="file://$PROJECT_DIR$/iQuePhoto.iml" filepath="$PROJECT_DIR$/iQuePhoto.iml" />
    </modules>
  </component>
</project>

================================================
FILE: iQuePhoto/.idea/runConfigurations.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="RunConfigurationProducerService">
    <option name="ignoredProducers">
      <set>
        <option value="org.jetbrains.plugins.gradle.execution.test.runner.AllInPackageGradleConfigurationProducer" />
        <option value="org.jetbrains.plugins.gradle.execution.test.runner.TestClassGradleConfigurationProducer" />
        <option value="org.jetbrains.plugins.gradle.execution.test.runner.TestMethodGradleConfigurationProducer" />
      </set>
    </option>
  </component>
</project>

================================================
FILE: iQuePhoto/.idea/vcs.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="VcsDirectoryMappings">
    <mapping directory="$PROJECT_DIR$/.." vcs="Git" />
  </component>
</project>

================================================
FILE: iQuePhoto/app/.gitignore
================================================
/build


================================================
FILE: iQuePhoto/app/build.gradle
================================================
apply plugin: 'com.android.application'
apply plugin: 'android-apt'
apply plugin: 'me.tatarka.retrolambda'

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.2"

    defaultConfig {
        applicationId "net.iquesoft.iquephoto"
        minSdkVersion 21
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"

        renderscriptTargetApi 18
        renderscriptSupportModeEnabled true
    }
    lintOptions {
        abortOnError false
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile 'com.android.support:appcompat-v7:25.1.1'
    compile 'com.android.support:support-v4:25.1.1'
    compile 'com.android.support:recyclerview-v7:25.1.1'
    compile 'com.android.support:cardview-v7:25.1.1'
    compile 'com.android.support:design:25.1.1'

    compile 'com.arello-mobile:moxy:1.4.4'
    compile 'com.arello-mobile:moxy-app-compat:1.4.4'
    apt 'com.arello-mobile:moxy-compiler:1.4.4'

    compile 'com.jakewharton:butterknife:8.4.0'
    apt 'com.jakewharton:butterknife-compiler:8.4.0'

    compile 'com.google.dagger:dagger:2.8'
    apt 'com.google.dagger:dagger-compiler:2.8'

    compile 'com.isseiaoki:simplecropview:1.1.4'
    compile 'org.adw.library:discrete-seekbar:1.0.1'
    compile 'com.tbruyelle.rxpermissions:rxpermissions:0.7.0@aar'
    compile 'com.squareup.picasso:picasso:2.5.2'
    compile 'io.reactivex:rxjava:1.1.6'
    compile 'io.reactivex:rxandroid:1.2.1'
    testCompile 'junit:junit:4.12'
}

================================================
FILE: iQuePhoto/app/proguard-rules.pro
================================================
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in C:\Users\Sergey\AppData\Local\Android\Sdk/filters/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
#   http://developer.android.com/guide/developing/filters/proguard.html

# Add any project specific keep options here:

# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
#   public *;
#}


================================================
FILE: iQuePhoto/app/src/androidTest/java/net/iquesoft/iquephoto/ApplicationTest.java
================================================
package net.iquesoft.iquephoto;

import android.app.Application;
import android.test.ApplicationTestCase;

/**
 * <a href="http://d.android.com/tools/testing/testing_android.html">Testing Fundamentals</a>
 */
public class ApplicationTest extends ApplicationTestCase<Application> {
    public ApplicationTest() {
        super(Application.class);
    }
}

================================================
FILE: iQuePhoto/app/src/main/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="net.iquesoft.iquephoto">

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

    <uses-feature android:name="android.hardware.camera" />
    <uses-feature android:name="android.hardware.camera.flash" />
    <uses-feature android:name="android.hardware.camera.autofocus" />

    <application
        android:name=".App"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme.NoActionBar">
        <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="${applicationId}.provider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/provider_paths" />
        </provider>

        <activity
            android:name=".ui.activities.HomeActivity"
            android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".ui.activities.GalleryActivity"
            android:screenOrientation="portrait" />
        <activity
            android:name=".ui.activities.EditorActivity"
            android:screenOrientation="portrait" />
        <activity
            android:name=".ui.activities.PreviewActivity"
            android:screenOrientation="portrait" />
    </application>
</manifest>

================================================
FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/App.java
================================================
package net.iquesoft.iquephoto;

import android.app.Application;

import net.iquesoft.iquephoto.di.AppComponent;
import net.iquesoft.iquephoto.di.DaggerAppComponent;
import net.iquesoft.iquephoto.di.modules.AppModule;

public class App extends Application {
    private static AppComponent sAppComponent;

    @Override
    public void onCreate() {
        super.onCreate();

        sAppComponent = DaggerAppComponent.builder()
                .appModule(new AppModule(this))
                .build();
    }

    public static AppComponent getAppComponent() {
        return sAppComponent;
    }
}

================================================
FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/adapters/AdjustAdapter.java
================================================
package net.iquesoft.iquephoto.adapters;

import android.content.Context;
import android.support.v4.content.res.ResourcesCompat;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;

import net.iquesoft.iquephoto.R;
import net.iquesoft.iquephoto.models.Adjust;

import java.util.List;

import butterknife.BindView;
import butterknife.ButterKnife;

public class AdjustAdapter extends RecyclerView.Adapter<AdjustAdapter.ViewHolder> {
    private Context mContext;
    
    private List<Adjust> mAdjustList;

    private OnAdjustClickListener mOnAdjustClickListener;

    public interface OnAdjustClickListener {
        void onAdjustClick(Adjust adjust);
    }

    public void setOnAdjustClickListener(OnAdjustClickListener onAdjustClickListener) {
        mOnAdjustClickListener = onAdjustClickListener;
    }

    public AdjustAdapter(List<Adjust> adjustList) {
        mAdjustList = adjustList;
    }

    @Override
    public AdjustAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        mContext = parent.getContext();

        View view = LayoutInflater.from(mContext).inflate(R.layout.item_adjust, parent, false);

        return new AdjustAdapter.ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(AdjustAdapter.ViewHolder holder, int position) {
        final Adjust adjust = mAdjustList.get(position);

        holder.button.setText(mContext.getText(adjust.getTitle()));
        holder.button.setCompoundDrawablesWithIntrinsicBounds(null,
                ResourcesCompat.getDrawable(mContext.getResources(), adjust.getIcon(), null),
                null, null);

        holder.button.setOnClickListener(view -> mOnAdjustClickListener.onAdjustClick(adjust));
    }

    @Override
    public int getItemCount() {
        return mAdjustList.size();
    }

    class ViewHolder extends RecyclerView.ViewHolder {
        @BindView(R.id.button_adjust)
        Button button;

        ViewHolder(View itemView) {
            super(itemView);

            ButterKnife.bind(this, itemView);
        }
    }
}

================================================
FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/adapters/ColorAdapter.java
================================================
package net.iquesoft.iquephoto.adapters;

import android.content.Context;
import android.support.v4.content.res.ResourcesCompat;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;

import net.iquesoft.iquephoto.R;
import net.iquesoft.iquephoto.graphics.ColorCircleDrawable;
import net.iquesoft.iquephoto.models.EditorColor;

import java.util.List;

import butterknife.BindView;
import butterknife.ButterKnife;

public class ColorAdapter extends RecyclerView.Adapter<ColorAdapter.ViewHolder> {
    private int mSelectedColorPosition = 0;

    private Context mContext;

    private List<EditorColor> mEditorColorsList;

    private OnColorClickListener mOnColorClickListener;

    public interface OnColorClickListener {
        void onClick(EditorColor editorColor);
    }

    public void setOnColorClickListener(OnColorClickListener onColorClickListener) {
        mOnColorClickListener = onColorClickListener;
    }

    public ColorAdapter(List<EditorColor> editorColors) {
        mEditorColorsList = editorColors;
    }

    @Override
    public ColorAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        mContext = parent.getContext();

        View view = LayoutInflater.from(mContext).inflate(R.layout.item_color, parent, false);

        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(ColorAdapter.ViewHolder holder, int position) {
        final EditorColor color = mEditorColorsList.get(position);

        holder.imageView.setImageDrawable(new ColorCircleDrawable(
                ResourcesCompat.getColor(mContext.getResources(), color.getColor(), null))
        );

        if (mSelectedColorPosition == holder.getAdapterPosition()) {
            mOnColorClickListener.onClick(color);
            ((ColorCircleDrawable) holder.imageView.getDrawable()).setSelected(true);
        } else {
            ((ColorCircleDrawable) holder.imageView.getDrawable()).setSelected(false);
        }

        holder.imageView.setOnClickListener(view -> {
            notifyItemChanged(mSelectedColorPosition);
            mSelectedColorPosition = holder.getAdapterPosition();
            notifyItemChanged(holder.getAdapterPosition());

        });
    }

    @Override
    public int getItemCount() {
        return mEditorColorsList.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        @BindView(R.id.image_view_color)
        ImageView imageView;

        public ViewHolder(View itemView) {
            super(itemView);

            ButterKnife.bind(this, itemView);
        }
    }
}

================================================
FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/adapters/FiltersAdapter.java
================================================
package net.iquesoft.iquephoto.adapters;

import android.content.Context;
import android.graphics.ColorMatrixColorFilter;
import android.net.Uri;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import com.squareup.picasso.Picasso;

import net.iquesoft.iquephoto.R;
import net.iquesoft.iquephoto.models.Filter;

import java.util.List;

import butterknife.BindView;
import butterknife.ButterKnife;

public class FiltersAdapter extends RecyclerView.Adapter<FiltersAdapter.ViewHolder> {
    private int mCurrentPosition = 0;

    private Context mContext;

    private Uri mImageUri;
    private List<Filter> mFiltersList;

    private OnFilterClickListener mOnFilterClickListener;

    public interface OnFilterClickListener {
        void onFilterClicked(Filter filter);

        void onIntensityClicked();
    }
    
    public void setFiltersListener(OnFilterClickListener onFilterClickListener) {
        mOnFilterClickListener = onFilterClickListener;
    }

    public FiltersAdapter(Uri uri, List<Filter> filters) {
        mImageUri = uri;
        mFiltersList = filters;
    }

    @Override
    public FiltersAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        mContext = parent.getContext();

        View view = LayoutInflater.from(mContext).inflate(R.layout.item_filter, parent, false);

        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(FiltersAdapter.ViewHolder holder, int position) {
        final Filter filter = mFiltersList.get(position);

        holder.filterTitle.setText(filter.getTitle());

        Picasso.with(mContext)
                .load(mImageUri)
                .fit()
                .centerCrop()
                .noPlaceholder()
                .into(holder.filterImageView);

        holder.filterImageView.setColorFilter(new ColorMatrixColorFilter(filter.getColorMatrix()));

        if (mCurrentPosition == position) {
            mOnFilterClickListener.onFilterClicked(filter);
            holder.filterChecked.setVisibility(View.VISIBLE);
        } else
            holder.filterChecked.setVisibility(View.GONE);

        holder.filterImageView.setOnClickListener(view -> {
            notifyItemChanged(mCurrentPosition);
            if (mCurrentPosition != position) {
                mCurrentPosition = position;
                notifyItemChanged(position);
            } else {
                mOnFilterClickListener.onIntensityClicked();
            }
        });
    }

    @Override
    public int getItemCount() {
        return mFiltersList.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        @BindView(R.id.text_view_filter_title)
        TextView filterTitle;

        @BindView(R.id.image_view_filter)
        ImageView filterImageView;

        @BindView(R.id.image_view_filter_checked)
        ImageView filterChecked;

        public ViewHolder(View itemView) {
            super(itemView);

            ButterKnife.bind(this, itemView);
        }
    }
}

================================================
FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/adapters/FontsAdapter.java
================================================
package net.iquesoft.iquephoto.adapters;

import android.content.Context;
import android.graphics.Typeface;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import net.iquesoft.iquephoto.R;
import net.iquesoft.iquephoto.models.Font;

import java.util.List;

import butterknife.BindView;
import butterknife.ButterKnife;

// TODO: Add default font and select it.
public class FontsAdapter extends RecyclerView.Adapter<FontsAdapter.ViewHolder> {

    private int mSelectedFontPosition = 0;

    private Context mContext;

    // TODO: Show fonts with user text.
    private String mText = null;

    private List<Font> mFontsList;

    private OnFontClickListener mOnFontClickListener;

    public interface OnFontClickListener {
        void onClick(Font font);
    }

    public void setOnFontClickListener(OnFontClickListener onFontClickListener) {
        mOnFontClickListener = onFontClickListener;
    }

    public FontsAdapter(List<Font> fonts) {
        mFontsList = fonts;
    }

    @Override
    public FontsAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        mContext = parent.getContext();

        View view = LayoutInflater.from(mContext).inflate(R.layout.item_font, parent, false);

        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(FontsAdapter.ViewHolder holder, int position) {
        final Font font = mFontsList.get(position);

        holder.fontFamilyTextView.setText(font.getTitle());

        holder.fontPreviewTextView.setTypeface(getTypeface(font.getPath()));

        holder.itemView.setOnClickListener(view -> {
            notifyItemChanged(mSelectedFontPosition);
            mSelectedFontPosition = position;
            notifyItemChanged(position);
        });

        /*if (mSelectedFontPosition == position) {
            mOnFontClickListener.onFilterClicked(font);
            holder.fontSelectedImageView.setVisibility(View.VISIBLE);
        } else {
            holder.fontSelectedImageView.setVisibility(View.GONE);
        }*/

    }

    @Override
    public int getItemCount() {
        return mFontsList.size();
    }

    private Typeface getTypeface(String path) {
        return Typeface.createFromAsset(mContext.getAssets(), path);
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        @BindView(R.id.fontPreviewTextView)
        TextView fontPreviewTextView;

        @BindView(R.id.fontFamilyTextView)
        TextView fontFamilyTextView;

        public ViewHolder(View itemView) {
            super(itemView);

            ButterKnife.bind(this, itemView);
        }
    }
}


================================================
FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/adapters/FramesAdapter.java
================================================
package net.iquesoft.iquephoto.adapters;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import com.squareup.picasso.Picasso;

import net.iquesoft.iquephoto.R;
import net.iquesoft.iquephoto.models.Frame;

import java.util.List;

import butterknife.BindView;
import butterknife.ButterKnife;

public class FramesAdapter extends RecyclerView.Adapter<FramesAdapter.ViewHolder> {
    private int mCurrentPosition = 0;

    private Context mContext;

    private List<Frame> mFramesList;

    private OnFrameClickListener mOnFrameClickListener;

    public interface OnFrameClickListener {
        void onClick(Frame frame);
    }

    public void setFramesListener(OnFrameClickListener onFrameClickListener) {
        mOnFrameClickListener = onFrameClickListener;
    }

    public FramesAdapter(List<Frame> framesList) {
        mFramesList = framesList;
    }

    @Override
    public FramesAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        mContext = parent.getContext();

        View view = LayoutInflater.from(mContext).inflate(R.layout.item_frame, parent, false);

        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(FramesAdapter.ViewHolder holder, int position) {
        Frame frame = mFramesList.get(position);

        holder.title.setText(frame.getTitle());

        Picasso.with(mContext)
                .load(frame.getImage())
                .into(holder.image);
        
        if (mCurrentPosition == position) {
            if (mOnFrameClickListener != null)
                mOnFrameClickListener.onClick(frame);
            holder.frameSelected.setVisibility(View.VISIBLE);
        } else
            holder.frameSelected.setVisibility(View.GONE);


        holder.image.setOnClickListener(view -> {
            notifyItemChanged(mCurrentPosition);
            mCurrentPosition = position;
            notifyItemChanged(position);
        });
    }

    @Override
    public int getItemCount() {
        return mFramesList.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        @BindView(R.id.frameTitle)
        TextView title;

        @BindView(R.id.frameImage)
        ImageView image;

        @BindView(R.id.frameChecked)
        ImageView frameSelected;

        public ViewHolder(View itemView) {
            super(itemView);

            ButterKnife.bind(this, itemView);
        }
    }
}



================================================
FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/adapters/ImageAlbumsAdapter.java
================================================
package net.iquesoft.iquephoto.adapters;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;

import com.squareup.picasso.Callback;
import com.squareup.picasso.Picasso;

import net.iquesoft.iquephoto.R;
import net.iquesoft.iquephoto.models.ImageAlbum;

import java.util.List;

import butterknife.BindView;
import butterknife.ButterKnife;

public class ImageAlbumsAdapter extends RecyclerView.Adapter<ImageAlbumsAdapter.ViewHolder> {
    private Context mContext;

    private List<ImageAlbum> mImageAlbums;

    private OnAlbumClickListener mOnAlbumClickListener;

    public void setOnAlbumClickListener(OnAlbumClickListener onAlbumClickListener) {
        mOnAlbumClickListener = onAlbumClickListener;
    }

    public interface OnAlbumClickListener {
        void onAlbumClick(ImageAlbum imageAlbum);
    }

    public ImageAlbumsAdapter(List<ImageAlbum> imageAlbums) {
        mImageAlbums = imageAlbums;
    }

    @Override
    public ImageAlbumsAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        mContext = parent.getContext();

        View view = LayoutInflater.from(mContext).inflate(R.layout.item_image_album, parent, false);

        return new ImageAlbumsAdapter.ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(ImageAlbumsAdapter.ViewHolder holder, int position) {
        ImageAlbum imageAlbum = mImageAlbums.get(position);

        Picasso.with(mContext)
                .load("file://" + imageAlbum.getImages().get(0).getPath())
                .resize(250, 250)
                .centerCrop()
                .into(holder.folderImage, new Callback() {
                    @Override
                    public void onSuccess() {
                        holder.progressBar.setVisibility(View.GONE);
                    }

                    @Override
                    public void onError() {

                    }
                });

        holder.title.setText(
                imageAlbum.getName() + " (" + String.valueOf(imageAlbum.getImages().size()) + ")"
        );

        holder.itemView.setOnClickListener(view -> {
            mOnAlbumClickListener.onAlbumClick(imageAlbum);
        });
    }

    @Override
    public int getItemCount() {
        return mImageAlbums.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        @BindView(R.id.text_view_album_title)
        TextView title;

        @BindView(R.id.image_view_album_image)
        ImageView folderImage;

        @BindView(R.id.progress_bar_gallery_album)
        ProgressBar progressBar;

        public ViewHolder(View itemView) {
            super(itemView);

            ButterKnife.bind(this, itemView);
        }
    }
}

================================================
FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/adapters/ImagesAdapter.java
================================================
package net.iquesoft.iquephoto.adapters;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.ProgressBar;

import com.squareup.picasso.Callback;
import com.squareup.picasso.Picasso;

import net.iquesoft.iquephoto.R;
import net.iquesoft.iquephoto.models.Image;

import java.util.List;

import butterknife.BindView;
import butterknife.ButterKnife;

public class ImagesAdapter extends RecyclerView.Adapter<ImagesAdapter.ViewHolder> {
    private Context mContext;

    private List<Image> mImageList;

    private OnImageClickListener mListener;

    public void setOnImageClickListener(OnImageClickListener listener) {
        mListener = listener;
    }

    public interface OnImageClickListener {
        void onClick(Image image);
    }

    public ImagesAdapter(List<Image> imageList) {
        mImageList = imageList;
    }

    @Override
    public ImagesAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        mContext = parent.getContext();

        LayoutInflater inflater = LayoutInflater.from(mContext);

        View view = inflater.inflate(R.layout.item_image, parent, false);

        return new ImagesAdapter.ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(ImagesAdapter.ViewHolder holder, int position) {
        Image image = mImageList.get(position);

        Picasso.with(mContext)
                .load("file://" + image.getPath())
                .resize(250, 250)
                .centerCrop()
                .into(holder.image, new Callback() {
                    @Override
                    public void onSuccess() {
                        holder.progressBar.setVisibility(View.GONE);
                    }

                    @Override
                    public void onError() {

                    }
                });

        holder.image.setOnClickListener(v -> mListener.onClick(image));
    }

    @Override
    public int getItemCount() {
        return mImageList.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        @BindView(R.id.image_view_gallery_image)
        ImageView image;

        @BindView(R.id.progress_bar_gallery_image)
        ProgressBar progressBar;

        public ViewHolder(View itemView) {
            super(itemView);

            ButterKnife.bind(this, itemView);
        }
    }
}

================================================
FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/adapters/OverlaysAdapter.java
================================================
package net.iquesoft.iquephoto.adapters;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import com.squareup.picasso.Picasso;

import net.iquesoft.iquephoto.R;
import net.iquesoft.iquephoto.models.Overlay;

import java.util.List;

import butterknife.BindView;
import butterknife.ButterKnife;

public class OverlaysAdapter extends RecyclerView.Adapter<OverlaysAdapter.ViewHolder> {
    private int mCurrentPosition = 0;

    private Context mContext;

    private List<Overlay> mOverlayList;

    private OnOverlayClickListener mOnOverlayClickListener;

    public interface OnOverlayClickListener {
        void onClick(Overlay overlay);
    }

    public void setOnOverlayClickListener(OnOverlayClickListener onOverlayClickListener) {
        mOnOverlayClickListener = onOverlayClickListener;
    }

    public OverlaysAdapter(List<Overlay> overlayList) {
        mOverlayList = overlayList;
    }

    @Override
    public OverlaysAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        mContext = parent.getContext();

        View view = LayoutInflater.from(mContext).inflate(R.layout.item_overlay, parent, false);

        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(OverlaysAdapter.ViewHolder holder, int position) {
        final Overlay overlay = mOverlayList.get(position);

        holder.title.setText(overlay.getTitle());

        Picasso.with(mContext)
                .load(overlay.getImage())
                .fit()
                .centerCrop()
                .noPlaceholder()
                .into(holder.image);

        if (mCurrentPosition == position) {
            mOnOverlayClickListener.onClick(overlay);
            holder.overlaySelected.setVisibility(View.VISIBLE);
        } else
            holder.overlaySelected.setVisibility(View.GONE);

        holder.image.setOnClickListener(view -> {
            notifyItemChanged(mCurrentPosition);
            mCurrentPosition = position;
            notifyItemChanged(position);
        });
    }

    @Override
    public int getItemCount() {
        return mOverlayList.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        @BindView(R.id.text_view_overlay_title)
        TextView title;

        @BindView(R.id.image_view_overlay)
        ImageView image;

        @BindView(R.id.image_view_overlay_checked)
        ImageView overlaySelected;

        public ViewHolder(View itemView) {
            super(itemView);

            ButterKnife.bind(this, itemView);
        }
    }
}

================================================
FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/adapters/SizesAdapter.java
================================================
package net.iquesoft.iquephoto.adapters;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;

import net.iquesoft.iquephoto.R;
import net.iquesoft.iquephoto.graphics.CircleSizeDrawable;
import net.iquesoft.iquephoto.models.BrushSize;

import java.util.List;

import butterknife.BindView;
import butterknife.ButterKnife;

public class SizesAdapter extends RecyclerView.Adapter<SizesAdapter.ViewHolder> {
    private int mSelectedColorPosition = 0;

    private List<BrushSize> mSizes;

    private OnSizeClickListener mOnSizeClickListener;

    public interface OnSizeClickListener {
        void onClick(BrushSize size);
    }

    public void setOnSizeClickListener(OnSizeClickListener onSizeClickListener) {
        mOnSizeClickListener = onSizeClickListener;
    }

    public SizesAdapter(List<BrushSize> sizes) {
        mSizes = sizes;
        mSelectedColorPosition = sizes.size() / 2;
    }

    @Override
    public SizesAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        Context context = parent.getContext();

        View view = LayoutInflater.from(context).inflate(R.layout.item_brush_size, parent, false);

        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(SizesAdapter.ViewHolder holder, int position) {
        final BrushSize size = mSizes.get(position);

        holder.sizeImageView.setImageDrawable(new CircleSizeDrawable(size.getSize()));

        if (mSelectedColorPosition == holder.getAdapterPosition()) {
            mOnSizeClickListener.onClick(size);
            ((CircleSizeDrawable) holder.sizeImageView.getDrawable()).setSelected(true);
        } else {
            ((CircleSizeDrawable) holder.sizeImageView.getDrawable()).setSelected(false);
        }

        holder.sizeImageView.setOnClickListener(view -> {
            notifyItemChanged(mSelectedColorPosition);
            mSelectedColorPosition = holder.getAdapterPosition();
            notifyItemChanged(holder.getAdapterPosition());
        });
    }

    @Override
    public int getItemCount() {
        return mSizes.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        @BindView(R.id.sizeImageView)
        ImageView sizeImageView;

        public ViewHolder(View itemView) {
            super(itemView);

            ButterKnife.bind(this, itemView);
        }
    }
}

================================================
FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/adapters/StickerSetAdapter.java
================================================
package net.iquesoft.iquephoto.adapters;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import com.squareup.picasso.Picasso;

import net.iquesoft.iquephoto.R;
import net.iquesoft.iquephoto.models.StickersSet;

import java.util.List;

import butterknife.BindView;
import butterknife.ButterKnife;

public class StickerSetAdapter extends RecyclerView.Adapter<StickerSetAdapter.ViewHolder> {
    private Context mContext;

    private List<StickersSet> mStickersSets;

    private OnStickerSetClickListener mOnStickersSetClickListener;

    public interface OnStickerSetClickListener {
        void onClick(StickersSet stickersSet);
    }

    public void setStickerSetClickListener(OnStickerSetClickListener onStickerSetClickListener) {
        mOnStickersSetClickListener = onStickerSetClickListener;
    }

    public StickerSetAdapter(List<StickersSet> stickersSets) {
        mStickersSets = stickersSets;
    }

    @Override
    public StickerSetAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        mContext = parent.getContext();

        View view = LayoutInflater.from(mContext).inflate(R.layout.item_sticker_set, parent, false);

        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(StickerSetAdapter.ViewHolder holder, int position) {
        final StickersSet stickersSet = mStickersSets.get(position);

        holder.title.setText(stickersSet.getTitle());

        Picasso.with(mContext)
                .load(stickersSet.getIcon())
                .fit()
                .centerCrop()
                .noPlaceholder()
                .into(holder.image);

        holder.itemView.setOnClickListener(view -> mOnStickersSetClickListener.onClick(stickersSet));
    }
    
    @Override
    public int getItemCount() {
        return mStickersSets.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        @BindView(R.id.text_view_stickers_sets_title)
        TextView title;

        @BindView(R.id.image_view_stickers_sets_image)
        ImageView image;

        public ViewHolder(View itemView) {
            super(itemView);

            ButterKnife.bind(this, itemView);
        }
    }
}

================================================
FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/adapters/StickersAdapter.java
================================================
package net.iquesoft.iquephoto.adapters;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;

import com.squareup.picasso.Picasso;

import net.iquesoft.iquephoto.R;
import net.iquesoft.iquephoto.models.Sticker;

import java.util.List;

import butterknife.BindView;
import butterknife.ButterKnife;

public class StickersAdapter extends RecyclerView.Adapter<StickersAdapter.ViewHolder> {
    private Context mContext;

    private List<Sticker> mStickersList;

    private OnStickerClickListener mOnStickerClickListener;

    public interface OnStickerClickListener {
        void onClick(Sticker sticker);
    }

    public void setOnStickerClickListener(OnStickerClickListener onStickerClickListener) {
        mOnStickerClickListener = onStickerClickListener;
    }

    public StickersAdapter(List<Sticker> stickers) {
        mStickersList = stickers;
    }

    @Override
    public StickersAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        mContext = parent.getContext();

        View view = LayoutInflater.from(mContext).inflate(R.layout.item_sticker, parent, false);

        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(StickersAdapter.ViewHolder holder, int position) {
        final Sticker sticker = mStickersList.get(position);

        Picasso.with(mContext)
                .load(sticker.getImage())
                .fit()
                .centerCrop()
                .noPlaceholder()
                .into(holder.sticker);

        holder.sticker.setOnClickListener(view -> mOnStickerClickListener.onClick(sticker));
    }

    @Override
    public int getItemCount() {
        return mStickersList.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        @BindView(R.id.image_view_sticker)
        ImageView sticker;

        public ViewHolder(View itemView) {
            super(itemView);

            ButterKnife.bind(this, itemView);
        }
    }
}

================================================
FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/adapters/ToolsAdapter.java
================================================
package net.iquesoft.iquephoto.adapters;

import android.content.Context;
import android.support.v4.content.res.ResourcesCompat;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;

import net.iquesoft.iquephoto.R;
import net.iquesoft.iquephoto.models.Tool;

import java.util.List;

import butterknife.BindView;
import butterknife.ButterKnife;

public class ToolsAdapter extends RecyclerView.Adapter<ToolsAdapter.ViewHolder> {
    private Context mContext;

    private List<Tool> mToolsList;

    private OnToolsClickListener mOnToolsClickListener;

    public interface OnToolsClickListener {
        void onClick(Tool tool);
    }

    public void setOnToolsClickListener(OnToolsClickListener onToolsClickListener) {
        mOnToolsClickListener = onToolsClickListener;
    }

    public ToolsAdapter(List<Tool> tools) {
        mToolsList = tools;
    }

    @Override
    public ToolsAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        mContext = parent.getContext();

        LayoutInflater inflater = LayoutInflater.from(mContext);

        View view = inflater.inflate(R.layout.item_tool, parent, false);

        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(ToolsAdapter.ViewHolder holder, int position) {
        final Tool tool = mToolsList.get(position);

        holder.button.setText(mContext.getResources().getString(tool.getTitle()));

        holder.button.setCompoundDrawablesWithIntrinsicBounds(null,
                ResourcesCompat.getDrawable(mContext.getResources(), tool.getIcon(), null),
                null, null);

        holder.button.setOnClickListener(view -> mOnToolsClickListener.onClick(tool));
    }
    
    @Override
    public int getItemCount() {
        return mToolsList.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        @BindView(R.id.button_tool)
        Button button;

        public ViewHolder(View itemView) {
            super(itemView);

            ButterKnife.bind(this, itemView);
        }
    }
}

================================================
FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/core/EditorListener.java
================================================
package net.iquesoft.iquephoto.core;

import android.graphics.Paint;
import android.net.Uri;

public interface EditorListener {
    void onTransparencyHandleButtonClicked(Paint paint);

    void hasChanges(int count);

    void onAppliedImageSaved(Uri uri);
}

================================================
FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/core/EditorView.java
================================================
package net.iquesoft.iquephoto.core;

import android.graphics.Bitmap;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.RectF;

import com.arellomobile.mvp.MvpView;

import net.iquesoft.iquephoto.core.enums.EditorTool;
import net.iquesoft.iquephoto.core.model.Drawing;
import net.iquesoft.iquephoto.core.model.EditorLinearTiltShift;
import net.iquesoft.iquephoto.core.model.EditorSticker;
import net.iquesoft.iquephoto.core.model.EditorText;
import net.iquesoft.iquephoto.core.model.EditorRadialTiltShift;
import net.iquesoft.iquephoto.core.model.EditorVignette;

import java.util.List;

interface EditorView extends MvpView {
    void setupImage(Bitmap bitmap, Matrix imageMatrix, RectF imageRect);

    void showOriginalImage(boolean display);

    void onToolChanged(EditorTool tool);

    void onImageAdjusted(Paint paint);

    void onOverlayChanged(Bitmap bitmap, Matrix matrix, Paint paint);

    void onFilterChanged(Paint paint);

    void onFrameChanged(Bitmap bitmap, Matrix matrix);

    void onTextAdded(List<EditorText> texts);

    void onStickerAdded(List<EditorSticker> stickers);

    void onVignetteUpdated(EditorVignette vignette);

    void onRadialTiltShiftUpdated(EditorRadialTiltShift radialTiltShift);

    void onLinearTiltShiftUpdated(EditorLinearTiltShift linearTiltShift);

    void onStraightenTransformChanged(Matrix transformMatrix);

    void updateDrawing(Paint paint, Path path);

    void updateDrawing(List<Drawing> drawings);

    void updateView();

    void onApplyChanges();

    void enableDrawingCache();
}

================================================
FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/core/ImageEditorView.java
================================================
package net.iquesoft.iquephoto.core;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.ColorMatrix;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.RectF;
import android.support.annotation.ColorInt;
import android.support.annotation.IntRange;
import android.support.annotation.NonNull;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;

import com.arellomobile.mvp.MvpDelegate;
import com.arellomobile.mvp.presenter.InjectPresenter;
import com.arellomobile.mvp.presenter.ProvidePresenter;

import net.iquesoft.iquephoto.core.enums.EditorTool;
import net.iquesoft.iquephoto.core.model.Drawing;
import net.iquesoft.iquephoto.core.model.EditorLinearTiltShift;
import net.iquesoft.iquephoto.core.model.EditorSticker;
import net.iquesoft.iquephoto.core.model.EditorText;
import net.iquesoft.iquephoto.core.model.EditorRadialTiltShift;
import net.iquesoft.iquephoto.core.model.EditorVignette;
import net.iquesoft.iquephoto.models.Text;

import java.util.List;

import static net.iquesoft.iquephoto.core.enums.EditorTool.NONE;

public class ImageEditorView extends View implements EditorView {
    private final static String TAG = ImageEditorView.class.getSimpleName();

    @InjectPresenter
    ImageEditorViewPresenter mPresenter;

    @ProvidePresenter
    ImageEditorViewPresenter provideImageEditorViewPresenter() {
        return new ImageEditorViewPresenter(getContext());
    }

    private MvpDelegate mParentDelegate;
    private MvpDelegate<ImageEditorView> mMvpDelegate;

    private boolean mIsOriginalImageDisplayed;

    private Bitmap mImageBitmap;
    private Bitmap mSupportBitmap;
    private Bitmap mAlteredImageBitmap;

    private EditorTool mCurrentTool = NONE;

    private Matrix mImageMatrix;
    private Matrix mSupportMatrix;
    private Matrix mTransformMatrix = new Matrix();

    private RectF mImageRect;

    private Path mDrawingPath;

    private Paint mBitmapPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
    private Paint mFilterPaint;
    private Paint mOverlayPaint;
    private Paint mAdjustPaint;
    private Paint mDrawingPaint;

    private EditorVignette mVignette;
    private EditorRadialTiltShift mRadialTiltShift;
    private EditorLinearTiltShift mLinearTiltShift;

    private List<Drawing> mDrawings;
    private List<EditorText> mTexts;
    private List<EditorSticker> mStickers;

    public ImageEditorView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public void setMvpDelegate(MvpDelegate patentDelegate) {
        mParentDelegate = patentDelegate;

        getMvpDelegate().onCreate();
        getMvpDelegate().onAttach();

        Log.i(TAG, "setMvpDelegate(...)");
    }

    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        super.onLayout(changed, left, top, right, bottom);
        Log.i(TAG, "onLayout(...)");
        mPresenter.setupBitmapOnView(getAlteredImageBitmap(), getWidth(), getHeight());
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        Log.i(TAG, "onDraw(...)");

        final Bitmap bitmap = getAlteredImageBitmap();

        if (mImageRect != null && bitmap != null) {
            canvas.clipRect(mImageRect);

            canvas.drawBitmap(bitmap, mImageMatrix, mBitmapPaint);

            switch (mCurrentTool) {
                case NONE:
                    if (mIsOriginalImageDisplayed) {
                        canvas.drawBitmap(mImageBitmap, mImageMatrix, mBitmapPaint);
                    } else {
                        canvas.drawBitmap(bitmap, mImageMatrix, mBitmapPaint);
                    }
                    break;
                case FILTERS:
                    canvas.drawBitmap(bitmap, mImageMatrix, mFilterPaint);
                    break;
                case OVERLAY:
                    canvas.drawBitmap(mSupportBitmap, mSupportMatrix, mOverlayPaint);
                    break;
                case FRAMES:
                    canvas.drawBitmap(mSupportBitmap, mSupportMatrix, mBitmapPaint);
                    break;
                case DRAWING:
                    drawing(canvas);
                    break;
                case STICKERS:
                    drawStickers(canvas);
                    break;
                case TEXT:
                    drawTexts(canvas);
                    break;
                case VIGNETTE:
                    mVignette.draw(canvas);
                    break;
                case TRANSFORM_STRAIGHTEN:
                    canvas.drawBitmap(bitmap, mTransformMatrix, mBitmapPaint);
                    break;
                case RADIAL_TILT_SHIFT:
                    mRadialTiltShift.draw(canvas, bitmap, mImageMatrix, mBitmapPaint);
                    break;
                case LINEAR_TILT_SHIFT:
                    mLinearTiltShift.draw(canvas, bitmap, mImageMatrix, mBitmapPaint);
                    break;
                default:
                    canvas.drawBitmap(bitmap, mImageMatrix, mAdjustPaint);
                    break;
            }
        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        mPresenter.viewTouched(event);

        return true;
    }

    @Override
    protected void onDetachedFromWindow() {
        super.onDetachedFromWindow();

        getMvpDelegate().onSaveInstanceState();
        getMvpDelegate().onDetach();
    }

    public MvpDelegate<ImageEditorView> getMvpDelegate() {
        if (mMvpDelegate != null) {
            return mMvpDelegate;
        }

        mMvpDelegate = new MvpDelegate<>(this);
        mMvpDelegate.setParentDelegate(mParentDelegate, String.valueOf(getId()));

        return mMvpDelegate;
    }

    public void setImageBitmap(@NonNull Bitmap bitmap) {
        Log.i(TAG, "setImageBitmap(...)");
        mImageBitmap = bitmap;
    }

    public Bitmap getAlteredImageBitmap() {
        if (mAlteredImageBitmap != null) {
            return mAlteredImageBitmap;
        }

        return mImageBitmap;
    }

    public void undo() {
        mPresenter.undo();
    }

    public void changeTool(EditorTool tool) {
        mPresenter.changeTool(tool);
    }

    public void applyChanges() {
        mPresenter.applyChanges();
    }

    public void setUndoListener(EditorListener editorListener) {
        mPresenter.setEditorListener(editorListener);
    }

    public void addText(Text text) {
        mPresenter.addText(text);
    }

    public void addSticker(Bitmap bitmap) {
        mPresenter.addSticker(bitmap);
    }

    public void setFilter(ColorMatrix colorMatrix) {
        mPresenter.setFilter(colorMatrix);
    }

    public void setFrame(@NonNull Bitmap bitmap) {
        mPresenter.setFrame(bitmap);
    }

    public void setOverlay(@NonNull Bitmap bitmap) {
        mPresenter.setOverlay(bitmap);
    }

    public void setFilterIntensity(@IntRange(from = -100, to = 100) int value) {
        mPresenter.changeFilterIntensity(value);
    }

    public void setVignetteIntensity(@IntRange(from = -100, to = 100) int value) {
        mPresenter.changeVignetteMask(value);
    }

    public void setOverlayIntensity(@IntRange(from = -100, to = 100) int value) {
        mPresenter.changeOverlayIntensity(value);
    }

    public void setBrightnessValue(@IntRange(from = -100, to = 100) int value) {
        mPresenter.changeBrightness(value);
    }

    public void setContrastValue(@IntRange(from = -100, to = 100) int value) {
        mPresenter.changeContrast(value);
    }

    public void setSaturationValue(@IntRange(from = -100, to = 100) int value) {
        mPresenter.changeSaturation(value);
    }

    public void setWarmthValue(@IntRange(from = -100, to = 100) int value) {
        mPresenter.changeWarmth(value);
    }

    public void setStraightenTransformValue(@IntRange(from = -30, to = 30) int value) {
        mPresenter.changeStraightenTransform(value);
    }

    public void setBrushColor(@ColorInt int color) {
        mPresenter.changeBrushColor(color);
    }

    public void setBrushSize(float size) {
        mPresenter.changeBrushSize(size);
    }

    private void drawTexts(Canvas canvas) {
        if (mTexts != null) {
            for (EditorText text : mTexts) {
                text.draw(canvas);
            }
        }
    }

    private void drawStickers(Canvas canvas) {
        if (mStickers != null) {
            for (EditorSticker sticker : mStickers) {
                sticker.draw(canvas);
            }
        }
    }

    private void drawing(Canvas canvas) {
        if (mDrawings != null) {
            if (!mDrawings.isEmpty()) {
                for (Drawing drawing : mDrawings) {
                    canvas.drawPath(drawing.getPath(), drawing.getPaint());
                }
            }
        }
        if (mDrawingPath != null) {
            if (!mDrawingPath.isEmpty()) {
                canvas.drawPath(mDrawingPath, mDrawingPaint);
            }
        }
    }

    @Override
    public void setupImage(Bitmap bitmap, Matrix imageMatrix, RectF imageRect) {
        if (mImageBitmap == null) {
            mImageBitmap = bitmap;
        } else {
            mAlteredImageBitmap = bitmap;
        }

        mImageMatrix = imageMatrix;
        mImageRect = imageRect;

        invalidate();
    }

    @Override
    public void showOriginalImage(boolean display) {
        mIsOriginalImageDisplayed = display;

        invalidate();
    }

    @Override
    public void onToolChanged(EditorTool tool) {
        mCurrentTool = tool;

        invalidate();
    }

    @Override
    public void onImageAdjusted(Paint paint) {
        if (mAdjustPaint == null) {
            mAdjustPaint = paint;
        }

        invalidate();
    }

    @Override
    public void onOverlayChanged(Bitmap bitmap, Matrix matrix, Paint paint) {
        mSupportBitmap = bitmap;
        mSupportMatrix = matrix;
        mOverlayPaint = paint;

        invalidate();
    }

    @Override
    public void onFilterChanged(Paint paint) {
        if (mFilterPaint == null) {
            mFilterPaint = paint;
        }

        invalidate();
    }

    @Override
    public void onFrameChanged(Bitmap bitmap, Matrix matrix) {
        mSupportBitmap = bitmap;
        mSupportMatrix = matrix;

        invalidate();
    }

    @Override
    public void onTextAdded(List<EditorText> texts) {
        if (mTexts == null) {
            mTexts = texts;
        }

        invalidate();
    }

    @Override
    public void onStickerAdded(List<EditorSticker> stickers) {
        if (mStickers == null) {
            mStickers = stickers;
        }

        invalidate();
    }

    @Override
    public void onVignetteUpdated(EditorVignette vignette) {
        if (mVignette == null) {
            mVignette = vignette;
        }

        invalidate();
    }

    @Override
    public void onRadialTiltShiftUpdated(EditorRadialTiltShift radialTiltShift) {
        if (mRadialTiltShift == null) {
            mRadialTiltShift = radialTiltShift;
        }

        invalidate();
    }

    @Override
    public void onLinearTiltShiftUpdated(EditorLinearTiltShift linearTiltShift) {
        if (mLinearTiltShift == null) {
            mLinearTiltShift = linearTiltShift;
        }

        invalidate();
    }

    @Override
    public void onStraightenTransformChanged(Matrix transformMatrix) {
        if (mTransformMatrix == null) {
            mTransformMatrix = transformMatrix;
        }

        invalidate();
    }

    @Override
    public void updateDrawing(Paint paint, Path path) {
        if (mDrawingPaint == null && mDrawingPath == null) {
            mDrawingPaint = paint;
            mDrawingPath = path;
        }

        invalidate();
    }

    @Override
    public void updateDrawing(List<Drawing> drawings) {
        if (mDrawings == null) {
            mDrawings = drawings;
        }

        invalidate();
    }

    @Override
    public void updateView() {
        invalidate();
    }

    @Override
    public void onApplyChanges() {
        invalidate();

        setDrawingCacheEnabled(true);
        mPresenter.applyChanges(getDrawingCache());
    }

    @Override
    public void enableDrawingCache() {
        setDrawingCacheEnabled(false);
    }
}

================================================
FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/core/ImageEditorViewPresenter.java
================================================
package net.iquesoft.iquephoto.core;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.ColorMatrix;
import android.graphics.ColorMatrixColorFilter;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.RectF;
import android.net.Uri;
import android.support.annotation.NonNull;
import android.support.v8.renderscript.Allocation;
import android.support.v8.renderscript.Element;
import android.support.v8.renderscript.RenderScript;
import android.support.v8.renderscript.ScriptIntrinsicBlur;
import android.util.Log;
import android.view.MotionEvent;

import com.arellomobile.mvp.InjectViewState;
import com.arellomobile.mvp.MvpPresenter;

import net.iquesoft.iquephoto.core.enums.EditorMode;
import net.iquesoft.iquephoto.core.enums.EditorTool;
import net.iquesoft.iquephoto.core.model.Drawing;
import net.iquesoft.iquephoto.core.model.EditorImage;
import net.iquesoft.iquephoto.core.model.EditorLinearTiltShift;
import net.iquesoft.iquephoto.core.model.EditorRadialTiltShift;
import net.iquesoft.iquephoto.core.model.EditorSticker;
import net.iquesoft.iquephoto.core.model.EditorText;
import net.iquesoft.iquephoto.core.model.EditorVignette;
import net.iquesoft.iquephoto.models.Text;
import net.iquesoft.iquephoto.tasks.ImageCacheSaveTask;
import net.iquesoft.iquephoto.utils.LogHelper;

import java.util.ArrayList;
import java.util.List;

import rx.Observable;
import rx.subjects.PublishSubject;

import static net.iquesoft.iquephoto.core.enums.EditorTool.NONE;

@InjectViewState
public class ImageEditorViewPresenter extends MvpPresenter<EditorView> {
    private float mLastX;
    private float mLastY;

    private int mViewWidth;
    private int mViewHeight;

    private Context mContext;

    private EditorText mTouchedText;
    private EditorSticker mTouchedSticker;

    private EditorTool mCurrentTool = NONE;
    private EditorMode mCurrentMode = EditorMode.NONE;

    private EditorVignette mVignette;
    private EditorRadialTiltShift mRadialTiltShift;
    private EditorLinearTiltShift mLinearTiltShift;
    private EditorListener mEditorListener;

    private Bitmap mImageBitmap;
    private Bitmap mSupportBitmap;
    private Bitmap mBlurredBitmap;

    private Paint mDrawingPaint = new Paint();
    private Paint mBitmapPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
    private Paint mFilterPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
    private Paint mAdjustPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
    private Paint mOverlayPaint = new Paint(Paint.ANTI_ALIAS_FLAG);

    private Path mDrawingPath = new Path();

    private RectF mImageRect;

    private Matrix mImageMatrix = new Matrix();
    private Matrix mSupportMatrix = new Matrix();
    private Matrix mTransformMatrix = new Matrix();

    private ColorMatrix mColorMatrix = new ColorMatrix();

    private List<EditorText> mTexts = new ArrayList<>();
    private List<EditorSticker> mStickers = new ArrayList<>();
    private List<Drawing> mDrawings = new ArrayList<>();
    private List<EditorImage> mImages = new ArrayList<>();

    private PublishSubject<MotionEvent> mTouchSubject = PublishSubject.create();

    ImageEditorViewPresenter(@NonNull Context context) {
        mOverlayPaint.setAlpha(150);
        initDrawingPaint();

        mContext = context;

        initializeMotionEventObservables();
    }

    private void initDrawingPaint() {
        mDrawingPaint.setStyle(Paint.Style.STROKE);
        mDrawingPaint.setColor(Color.BLUE);
        mDrawingPaint.setStrokeCap(Paint.Cap.ROUND);
        mDrawingPaint.setStrokeJoin(Paint.Join.ROUND);
        mDrawingPaint.setStrokeWidth(Drawing.DEFAULT_STROKE_WIDTH);
    }

    private void initializeMotionEventObservables() {
        Observable<MotionEvent> touchObservable = mTouchSubject.asObservable();
        Observable<MotionEvent> actionDownObservable =
                touchObservable.filter(event ->
                        event.getActionMasked() == MotionEvent.ACTION_DOWN);
        Observable<MotionEvent> actionPointerDownObservable =
                touchObservable.filter(event ->
                        event.getActionMasked() == MotionEvent.ACTION_POINTER_DOWN);
        Observable<MotionEvent> actionMoveObservable =
                touchObservable.filter(event ->
                        event.getActionMasked() == MotionEvent.ACTION_MOVE);
        Observable<MotionEvent> actionUpObservable =
                touchObservable.filter(event ->
                        event.getActionMasked() == MotionEvent.ACTION_UP);
        Observable<MotionEvent> actionPointerUpObservable =
                touchObservable.filter(event ->
                        event.getActionMasked() == MotionEvent.ACTION_POINTER_UP);
        actionDownObservable.subscribe(event -> {
            actionDown(event);
            actionMoveObservable.
                    takeUntil(actionUpObservable
                            .doOnNext(upEvent ->
                                    actionUp()
                            ))
                    .subscribe(this::actionMove);
        });
        actionPointerDownObservable.subscribe(event -> {
                    actionPointerDown(event);
                    actionMoveObservable.takeUntil(
                            actionPointerUpObservable.doOnNext(pointerUpEvent ->
                                    actionPointerUp()
                            ))
                            .subscribe(this::actionMove);
                }
        );
    }

    private void actionDown(MotionEvent event) {
        Log.i("Observable", "Action: Down.");
        switch (mCurrentTool) {
            case NONE:
                // FIXME: setupImageOnView(...)
                getViewState().showOriginalImage(true);
                break;
            case DRAWING:
                brushActionDown(event);
                break;
            case TEXT:
                textActionDown(event);
                break;
            case STICKERS:
                stickerActionDown(event);
                break;
            case VIGNETTE:
                mVignette.actionDown(event);
                getViewState().onVignetteUpdated(mVignette);
                break;
            case RADIAL_TILT_SHIFT:
                mRadialTiltShift.actionDown(event);
                getViewState().onRadialTiltShiftUpdated(mRadialTiltShift);
                break;
        }
    }

    private void actionPointerDown(MotionEvent event) {
        Log.i("Observable", "Action: Pointer Down.");
        switch (mCurrentTool) {
            case NONE:
                break;
            case VIGNETTE:
                mVignette.actionPointerDown(event);
                getViewState().onVignetteUpdated(mVignette);
                break;
            case RADIAL_TILT_SHIFT:
                mRadialTiltShift.actionPointerDown(event);
                getViewState().onRadialTiltShiftUpdated(mRadialTiltShift);
                break;
            case LINEAR_TILT_SHIFT:
                mLinearTiltShift.actionPointerDown(event);
                getViewState().onLinearTiltShiftUpdated(mLinearTiltShift);
                break;
        }
    }

    private void actionMove(MotionEvent event) {
        Log.i("Observable", "Action: Move.");
        switch (mCurrentTool) {
            case NONE:
                break;
            case DRAWING:
                brushActionMove(event);
                break;
            case TEXT:
                textActionMove(event);
                break;
            case STICKERS:
                stickerActionMove(event);
                break;
            case VIGNETTE:
                mVignette.actionMove(event);
                getViewState().onVignetteUpdated(mVignette);
                break;
            case RADIAL_TILT_SHIFT:
                mRadialTiltShift.actionMove(event);
                getViewState().onRadialTiltShiftUpdated(mRadialTiltShift);
                break;
            case LINEAR_TILT_SHIFT:
                mLinearTiltShift.actionMove(event);
                getViewState().onLinearTiltShiftUpdated(mLinearTiltShift);
                break;
        }
    }

    private void actionPointerUp() {
        Log.i("Observable", "Action: Pointer Up.");
        mCurrentMode = EditorMode.NONE;
        switch (mCurrentTool) {
            case VIGNETTE:
                mVignette.actionPointerUp();
                getViewState().onVignetteUpdated(mVignette);
                break;
            case RADIAL_TILT_SHIFT:
                mRadialTiltShift.actionPointerUp();
                getViewState().onRadialTiltShiftUpdated(mRadialTiltShift);
                break;
            case LINEAR_TILT_SHIFT:
                mLinearTiltShift.actionPointerUp();
                getViewState().onLinearTiltShiftUpdated(mLinearTiltShift);
                break;
        }
    }

    private void actionUp() {
        Log.i("Observable", "Action: Up.");
        mCurrentMode = EditorMode.NONE;
        switch (mCurrentTool) {
            case NONE:
                // FIXME: setupImageOnView(...)
                getViewState().showOriginalImage(false);
                break;
            case DRAWING:
                brushActionUp();
                break;
            case TEXT:
                if (mTouchedText != null) {
                    mTouchedText.resetHelperFrameOpacity();
                }
                break;
            case STICKERS:
                if (mTouchedSticker != null) {
                    mTouchedSticker.setStickerTouched(false);

                    getViewState().updateView();
                }
                break;
            case VIGNETTE:
                mVignette.actionUp();
                getViewState().onVignetteUpdated(mVignette);
                break;
            case RADIAL_TILT_SHIFT:
                mRadialTiltShift.actionUp();
                getViewState().onRadialTiltShiftUpdated(mRadialTiltShift);
                break;
            case LINEAR_TILT_SHIFT:
                mLinearTiltShift.actionUp();
                getViewState().onLinearTiltShiftUpdated(mLinearTiltShift);
                break;
        }
    }

    void setupBitmapOnView(Bitmap bitmap, int width, int height) {
        mViewWidth = width;
        mViewHeight = height;

        if (mImageBitmap == null) {
            mImageBitmap = bitmap;
        }

        RectF viewRect = new RectF(0, 0, mViewWidth, mViewHeight);
        mImageRect = new RectF(0, 0, bitmap.getWidth(), bitmap.getHeight());

        LogHelper.logRect("mViewRect", viewRect);

        mImageMatrix.reset();
        mImageMatrix.setRectToRect(mImageRect, viewRect, Matrix.ScaleToFit.CENTER);
        mImageMatrix.mapRect(mImageRect);

        mTransformMatrix.set(mImageMatrix);

        if (mVignette == null) {
            mVignette = new EditorVignette(mViewWidth, mViewHeight);
        }

        LogHelper.logRect("mImageRect", mImageRect);
        LogHelper.logMatrix("mImageMatrix", mImageMatrix);

        getViewState().setupImage(bitmap, mImageMatrix, mImageRect);
    }

    void viewTouched(MotionEvent event) {
        mTouchSubject.onNext(event);
    }

    void applyChanges() {
        switch (mCurrentTool) {
            case STICKERS:
                for (EditorSticker sticker : mStickers) {
                    sticker.setHelpFrameEnabled(false);
                }
                break;
            case TEXT:
                for (EditorText text : mTexts) {
                    text.setHelpFrameEnabled(false);
                }
                break;
            case VIGNETTE:
                mVignette.setHelpOvalEnabled(false);
                break;
            case RADIAL_TILT_SHIFT:
                mRadialTiltShift.setHelpOvalEnabled(false);
                break;
            case LINEAR_TILT_SHIFT:
                mLinearTiltShift.setHelpOvalEnabled(false);
                break;
        }

        getViewState().onApplyChanges();
    }

    void applyChanges(@NonNull Bitmap bitmap) {
        mImages.add(new EditorImage(mCurrentTool, bitmap));

        ImageCacheSaveTask imageCacheSaveTask = new ImageCacheSaveTask(mContext, bitmap);
        imageCacheSaveTask.setOnImageLoadedListener(new ImageCacheSaveTask.OnImageCacheSaveListener() {
            @Override
            public void onSaveStarted() {
                Log.i("ImageCache", "Started");
            }

            @Override
            public void onImageSaved(Uri uri) {
                mEditorListener.onAppliedImageSaved(uri);
                Log.i("ImageCache", "Finished");

                setupBitmapOnView(getAlteredBitmap(), mViewWidth, mViewHeight);
            }
        });

        imageCacheSaveTask.execute();

        mEditorListener.hasChanges(mImages.size());
    }

    public void setFilter(ColorMatrix colorMatrix) {
        mFilterPaint.setColorFilter(new ColorMatrixColorFilter(colorMatrix));

        getViewState().onFilterChanged(mFilterPaint);
    }

    void changeFilterIntensity(int value) {
        mFilterPaint.setAlpha(value);

        getViewState().onFilterChanged(mFilterPaint);
    }

    void changeOverlayIntensity(int value) {
        mOverlayPaint.setAlpha(value);
    }

    void changeVignetteMask(int value) {
        mVignette.updateMask(value);

        getViewState().onVignetteUpdated(mVignette);
    }

    void changeBrightness(int value) {
        float brightness = value / 2;

        mColorMatrix.reset();
        mColorMatrix.set(new float[]{
                1, 0, 0, 0, brightness,
                0, 1, 0, 0, brightness,
                0, 0, 1, 0, brightness,
                0, 0, 0, 1, 0
        });

        mAdjustPaint.setColorFilter(new ColorMatrixColorFilter(mColorMatrix));

        getViewState().onImageAdjusted(mAdjustPaint);
    }

    void changeContrast(int value) {
        float input = value / 100f;
        float scale = input + 1f;
        float contrast = (-0.5f * scale + 0.5f) * 255f;

        mColorMatrix.reset();
        mColorMatrix.set(
                new float[]{
                        scale, 0, 0, 0, contrast,
                        0, scale, 0, 0, contrast,
                        0, 0, scale, 0, contrast,
                        0, 0, 0, 1, 0}
        );

        mAdjustPaint.setColorFilter(
                new ColorMatrixColorFilter(mColorMatrix));

        getViewState().onImageAdjusted(mAdjustPaint);
    }

    void changeSaturation(int value) {
        float saturation = (value + 100) / 100f;

        mColorMatrix.reset();
        mColorMatrix.setSaturation(saturation);

        mAdjustPaint.setColorFilter(new ColorMatrixColorFilter(mColorMatrix));

        getViewState().onImageAdjusted(mAdjustPaint);
    }

    void changeWarmth(int value) {
        float warmth = (value / 220) / 2;

        mColorMatrix.reset();
        mColorMatrix.set(
                new float[]{
                        1, 0, 0, warmth, 0,
                        0, 1, 0, warmth / 2, 0,
                        0, 0, 1, warmth / 4, 0,
                        0, 0, 0, 1, 0
                });
        mAdjustPaint.setColorFilter(new ColorMatrixColorFilter(mColorMatrix));

        getViewState().onImageAdjusted(mAdjustPaint);
    }

    void changeBrushSize(float size) {
        mDrawingPaint.setStrokeWidth(size);
    }

    void changeBrushColor(int color) {
        mDrawingPaint.setColor(color);
    }

    void changeStraightenTransform(int value) {
        mTransformMatrix.set(mImageMatrix);

        float width = mImageRect.width();
        float height = mImageRect.height();

        if (width >= height) {
            width = mImageRect.height();
            height = mImageRect.width();
        }

        float alpha = (float) Math.atan(height / width);

        float length1 = (width / 2) / (float) Math.cos(alpha - Math.abs(Math.toRadians(value)));
        float length2 = (float) Math.sqrt(Math.pow(width / 2, 2) + Math.pow(height / 2, 2));

        float scale = length2 / length1;

        float centerX = mImageRect.centerX();
        float centerY = mImageRect.centerY();

        float dX = centerX * (1 - scale);
        float dY = centerY * (1 - scale);

        mTransformMatrix.postScale(scale, scale);
        mTransformMatrix.postTranslate(dX, dY);
        mTransformMatrix.postRotate(value, centerX, centerY);

        getViewState().onStraightenTransformChanged(mTransformMatrix);
    }

    public void setFrame(Bitmap bitmap) {
        getViewState().onFrameChanged(bitmap, getSupportMatrix(bitmap));
    }

    public void setOverlay(Bitmap bitmap) {
        mSupportBitmap = bitmap;

        getViewState().onOverlayChanged(bitmap, getSupportMatrix(bitmap), mOverlayPaint);
    }

    void addText(Text text) {
        EditorText editorText = new EditorText(text);
        editorText.setX(mImageRect.centerX());
        editorText.setY(mImageRect.centerY());

        mTexts.add(editorText);

        getViewState().onTextAdded(mTexts);
    }

    void addSticker(Bitmap bitmap) {
        mStickers.add(new EditorSticker(bitmap, mImageRect));

        getViewState().onStickerAdded(mStickers);
    }

    public void changeTool(EditorTool tool) {
        mCurrentTool = tool;

        if (!mTexts.isEmpty()) {
            mTexts.clear();
        }
        if (!mStickers.isEmpty()) {
            mStickers.clear();
        }

        if (!mDrawings.isEmpty()) {
            mDrawings.clear();
        }

        switch (mCurrentTool) {
            case VIGNETTE:
                mVignette.updateRect(mImageRect);
                mVignette.setHelpOvalEnabled(true);
                getViewState().onVignetteUpdated(mVignette);
                break;
            case RADIAL_TILT_SHIFT:
                if (mRadialTiltShift == null) {
                    mRadialTiltShift = new EditorRadialTiltShift(mViewWidth, mViewHeight);
                }
                mBlurredBitmap =
                        getBlurBitmap(
                                mContext, getAlteredBitmap(),
                                mImageBitmap.getWidth(),
                                mImageBitmap.getHeight()
                        );
                mRadialTiltShift.updateRect(mImageRect);
                mRadialTiltShift.updateBlurBitmap(mBlurredBitmap);
                mRadialTiltShift.setHelpOvalEnabled(true);
                getViewState().onRadialTiltShiftUpdated(mRadialTiltShift);
                break;
            case LINEAR_TILT_SHIFT:
                if (mLinearTiltShift == null) {
                    mLinearTiltShift = new EditorLinearTiltShift(mViewWidth, mViewHeight);
                }
                mBlurredBitmap =
                        getBlurBitmap(
                                mContext, getAlteredBitmap(),
                                mImageBitmap.getWidth(),
                                mImageBitmap.getHeight()
                        );
                mLinearTiltShift.updateRect(mImageRect);
                mLinearTiltShift.updateBlurBitmap(mBlurredBitmap);
                mLinearTiltShift.setHelpOvalEnabled(true);
                getViewState().onLinearTiltShiftUpdated(mLinearTiltShift);
                break;
            default:
                mColorMatrix.reset();
                mAdjustPaint.setColorFilter(new ColorMatrixColorFilter(mColorMatrix));
                break;
        }

        getViewState().onToolChanged(tool);
    }

    void setEditorListener(EditorListener editorListener) {
        mEditorListener = editorListener;
    }

    void undo() {
        if (!mImages.isEmpty()) {
            mImages.remove(mImages.size() - 1);
            mEditorListener.hasChanges(mImages.size());
            setupBitmapOnView(getAlteredBitmap(), mViewWidth, mViewHeight);
        } else {
            setupBitmapOnView(mImageBitmap, mViewWidth, mViewHeight);
        }
    }

    private Matrix getSupportMatrix(Bitmap bitmap) {
        float sX = mImageRect.width() / bitmap.getWidth();
        float sY = mImageRect.height() / bitmap.getHeight();

        LogHelper.logMatrix("mSupportMatrix before (View)", mSupportMatrix);

        mSupportMatrix.reset();
        mSupportMatrix.postScale(sX, sY);
        mSupportMatrix.postTranslate(mImageRect.left, mImageRect.top);

        LogHelper.logMatrix("mSupportMatrix after (View)", mSupportMatrix);

        return mSupportMatrix;
    }

    private void textActionDown(MotionEvent event) {
        for (int i = mTexts.size() - 1; i >= 0; i--) {
            EditorText editorText = mTexts.get(i);

            if (editorText.isInside(event)) {
                mTouchedText = editorText;
                mCurrentMode = EditorMode.MOVE;

                mTouchedText.setHelperFrameOpacity();

                mLastX = event.getX();
                mLastY = event.getY();

                return;
            } else if (editorText.isInDeleteHandleButton(event)) {
                mTouchedText = null;
                mCurrentMode = EditorMode.NONE;

                mTexts.remove(i);
                getViewState().updateView();
                return;
            } else if (editorText.isInResizeAndScaleHandleButton(event)) {
                mTouchedText = editorText;

                mTouchedText.setHelperFrameOpacity();

                mLastX = editorText.getRotateAndScaleHandleDstRect().centerX();
                mLastY = editorText.getRotateAndScaleHandleDstRect().centerY();

                mCurrentMode = EditorMode.ROTATE_AND_SCALE;
                return;

            } else if (editorText.isInFrontHandleButton(event)) {
                EditorText temp = mTexts.remove(i);
                mTexts.add(temp);
                getViewState().updateView();
                return;
            } else if (editorText.isInTransparencyHandleButton(event)) {
                mEditorListener.onTransparencyHandleButtonClicked(editorText.getPaint());
                return;
            }
        }

        mTouchedText = null;
        mCurrentMode = EditorMode.NONE;
    }

    private void stickerActionDown(MotionEvent event) {
        for (int i = mStickers.size() - 1; i >= 0; i--) {
            EditorSticker editorSticker = mStickers.get(i);

            if (editorSticker.isInside(event)) {
                mTouchedSticker = editorSticker;
                mCurrentMode = EditorMode.MOVE;

                mTouchedSticker.setStickerTouched(true);

                mLastX = event.getX();
                mLastY = event.getY();

                return;
            } else if (editorSticker.isInDeleteHandleButton(event)) {
                mTouchedSticker = null;

                mCurrentMode = EditorMode.NONE;

                mStickers.remove(i);

                getViewState().updateView();
                return;
            } else if (editorSticker.isInScaleAndRotateHandleButton(event)) {
                mTouchedSticker = editorSticker;
                mCurrentMode = EditorMode.ROTATE_AND_SCALE;

                mTouchedSticker.setStickerTouched(true);

                mLastX = event.getX();
                mLastY = event.getY();
                return;
            } else if (editorSticker.isInFrontHandleButton(event)) {
                mCurrentMode = EditorMode.NONE;

                mStickers.add(mStickers.remove(i));

                getViewState().updateView();
                return;
            } else if (editorSticker.isInTransparencyHandleButton(event)) {
                mEditorListener.onTransparencyHandleButtonClicked(editorSticker.getPaint());
                return;
            }
        }

        mTouchedSticker = null;

        mCurrentMode = EditorMode.NONE;
    }

    private void brushActionDown(MotionEvent event) {
        Log.i("Drawing", "Brush down");
        mLastX = event.getX();
        mLastY = event.getY();

        mDrawingPath.reset();

        mDrawingPath.moveTo(mLastX, mLastY);

        getViewState().updateDrawing(mDrawingPaint, mDrawingPath);
    }

    private void brushActionMove(MotionEvent event) {
        Log.i("Drawing", "Brush move");

        float dX = event.getX() + mLastX;
        float dY = event.getY() + mLastY;

        mDrawingPath.quadTo(mLastX, mLastY, dX / 2, dY / 2);

        mLastX = event.getX();
        mLastY = event.getY();

        getViewState().updateDrawing(mDrawingPaint, mDrawingPath);
    }

    private void brushActionUp() {
        Log.i("Drawing", "Brush up");

        mDrawingPath.lineTo(mLastX, mLastY);
        mDrawings.add(new Drawing(new Paint(mDrawingPaint), new Path(mDrawingPath)));

        mDrawingPath.reset();

        getViewState().updateDrawing(mDrawings);
    }

    private void textActionMove(MotionEvent event) {
        if (mTouchedText != null) {
            switch (mCurrentMode) {
                case MOVE:
                    float distanceX = event.getX() - mLastX;
                    float distanceY = event.getY() - mLastY;

                    float newX = mTouchedText.getX() + distanceX;
                    float newY = mTouchedText.getY() + distanceY;

                    mTouchedText.setX(newX);
                    mTouchedText.setY(newY);

                    mLastX = event.getX();
                    mLastY = event.getY();

                    break;
                case ROTATE_AND_SCALE:
                    mTouchedText.updateRotateAndScale(
                            getDeltaX(event),
                            getDeltaY(event)
                    );

                    mLastX = event.getX();
                    mLastY = event.getY();

                    break;
            }

            getViewState().updateView();
        }
    }

    private void stickerActionMove(MotionEvent event) {
        if (mTouchedSticker != null) {
            switch (mCurrentMode) {
                case MOVE:
                    mTouchedSticker.actionMove(
                            getDeltaX(event),
                            getDeltaY(event)
                    );

                    mLastX = event.getX();
                    mLastY = event.getY();

                    break;
                case ROTATE_AND_SCALE:
                    mTouchedSticker.updateRotateAndScale(
                            getDeltaX(event),
                            getDeltaY(event)
                    );

                    mLastX = event.getX();
                    mLastY = event.getY();

                    break;
            }

            getViewState().updateView();
        }
    }

    private Bitmap getAlteredBitmap() {
        if (!mImages.isEmpty()) {
            return mImages.get(mImages.size() - 1).getBitmap();
        }

        return mImageBitmap;
    }

    private Bitmap getBlurBitmap(Context context, Bitmap bitmap, int width, int height) {
        Bitmap src = bitmap.copy(bitmap.getConfig(), true);
        Bitmap scaledBitmap = Bitmap.createScaledBitmap(src, width, height, false);
        Bitmap outputBitmap = Bitmap.createBitmap(scaledBitmap);

        RenderScript rs = RenderScript.create(context);
        ScriptIntrinsicBlur theIntrinsic = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));
        Allocation tmpIn = Allocation.createFromBitmap(rs, scaledBitmap);
        Allocation tmpOut = Allocation.createFromBitmap(rs, outputBitmap);
        theIntrinsic.setRadius(10f);
        theIntrinsic.setInput(tmpIn);
        theIntrinsic.forEach(tmpOut);
        tmpOut.copyTo(outputBitmap);

        return outputBitmap;
    }

    private float getDeltaX(MotionEvent event) {
        return event.getX() - mLastX;
    }

    private float getDeltaY(MotionEvent event) {
        return event.getY() - mLastY;
    }
}

================================================
FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/core/enums/EditorMode.java
================================================
package net.iquesoft.iquephoto.core.enums;

public enum EditorMode {
    NONE, MOVE, ROTATE_AND_SCALE, RESIZE_HEIGHT, RESIZE_WIDTH
}


================================================
FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/core/enums/EditorTool.java
================================================
package net.iquesoft.iquephoto.core.enums;

public enum EditorTool {
    NONE, FILTERS, ADJUST, OVERLAY, STICKERS, FRAMES, TEXT, DRAWING, RADIAL_TILT_SHIFT, LINEAR_TILT_SHIFT, VIGNETTE, BRIGHTNESS,
    CONTRAST, SATURATION, WARMTH, EXPOSURE, SHADOWS, TINT, FADE, TRANSFORM, TRANSFORM_VERTICAL, TRANSFORM_HORIZONTAL,
    TRANSFORM_STRAIGHTEN;
}


================================================
FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/core/model/Drawing.java
================================================
package net.iquesoft.iquephoto.core.model;

import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.support.annotation.NonNull;

public class Drawing {
    public static final float DEFAULT_STROKE_WIDTH = 5f;
    public static final int DEFAULT_COLOR = Color.BLACK;

    private Paint mPaint;
    private Path mPath;

    public Drawing(@NonNull Paint paint, @NonNull Path path) {
        mPaint = paint;
        mPath = path;
    }

    public Paint getPaint() {
        return mPaint;
    }

    public Path getPath() {
        return mPath;
    }
}

================================================
FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/core/model/EditorFrame.java
================================================
package net.iquesoft.iquephoto.core.model;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.Paint;

import net.iquesoft.iquephoto.R;
import net.iquesoft.iquephoto.utils.BitmapUtil;
import net.iquesoft.iquephoto.utils.LogHelper;
import net.iquesoft.iquephoto.utils.SizeUtil;

public class EditorFrame {
    static final int EDITOR_FRAME_PADDING = 25;

    private Paint mFramePaint;

    private Bitmap mDeleteHandleBitmap;
    private Bitmap mTransparencyHandleBitmap;
    private Bitmap mResizeHandleBitmap;
    private Bitmap mFrontHandleBitmap;

    public EditorFrame(Context context) {
        initializeFramePaint();
        initializeHandlesBitmap(context);
    }

    private void initializeFramePaint() {
        mFramePaint = new Paint();
        mFramePaint.setColor(Color.WHITE);
        mFramePaint.setAntiAlias(true);
        mFramePaint.setDither(true);
        mFramePaint.setStyle(Paint.Style.STROKE);
        mFramePaint.setStrokeWidth(SizeUtil.dp2px(3.5f));
        mFramePaint.setAlpha(175);
    }
    
    private void initializeHandlesBitmap(Context context) {
        mDeleteHandleBitmap = BitmapUtil.drawable2Bitmap(context, R.drawable.ic_handle_delete);
        mResizeHandleBitmap = BitmapUtil.drawable2Bitmap(context, R.drawable.ic_handle_scale_rotate);
        mFrontHandleBitmap = BitmapUtil.drawable2Bitmap(context, R.drawable.ic_handle_front);
        mTransparencyHandleBitmap =
                BitmapUtil.drawable2Bitmap(context, R.drawable.ic_handle_transparency);

        LogHelper.logBitmap("mDeleteHandleBitmap", mDeleteHandleBitmap);
        LogHelper.logBitmap("mResizeHandleBitmap", mResizeHandleBitmap);
        LogHelper.logBitmap("mFrontHandleBitmap", mFrontHandleBitmap);
        LogHelper.logBitmap("mTransparencyHandleBitmap", mTransparencyHandleBitmap);
    }

    public Paint getFramePaint() {
        return mFramePaint;
    }

    public Bitmap getDeleteHandleBitmap() {
        return mDeleteHandleBitmap;
    }

    public Bitmap getTransparencyHandleBitmap() {
        return mTransparencyHandleBitmap;
    }

    public Bitmap getResizeHandleBitmap() {
        return mResizeHandleBitmap;
    }

    public Bitmap getFrontHandleBitmap() {
        return mFrontHandleBitmap;
    }
}


================================================
FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/core/model/EditorImage.java
================================================
package net.iquesoft.iquephoto.core.model;

import android.graphics.Bitmap;

import net.iquesoft.iquephoto.core.enums.EditorTool;

public class EditorImage {
    private EditorTool mCommand;
    private Bitmap mBitmap;

    public EditorImage(EditorTool command, Bitmap bitmap) {
        mCommand = command;
        mBitmap = bitmap;
    }

    public EditorTool getCommand() {
        return mCommand;
    }

    public Bitmap getBitmap() {
        return mBitmap;
    }

}

================================================
FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/core/model/EditorLinearTiltShift.java
================================================
package net.iquesoft.iquephoto.core.model;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.LinearGradient;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.RectF;
import android.graphics.Shader;
import android.support.annotation.NonNull;
import android.view.MotionEvent;

import net.iquesoft.iquephoto.core.enums.EditorMode;
import net.iquesoft.iquephoto.utils.MotionEventUtil;
import net.iquesoft.iquephoto.utils.RectUtil;

import static net.iquesoft.iquephoto.core.enums.EditorMode.MOVE;
import static net.iquesoft.iquephoto.core.enums.EditorMode.NONE;
import static net.iquesoft.iquephoto.core.enums.EditorMode.ROTATE_AND_SCALE;

// TODO: Linear tilt shift.
// TODO: Rotate linear tilt shift.
public class EditorLinearTiltShift {
    private float mFeather = 0.7f;
    private float mGradientInset = 100;
    private float mFocusHeight;
    private float mControlPointTolerance = 20;
    private float mRotateAngle;

    private float mPreX;
    private float mPreY;

    private boolean mIsShowHelpOval = true;

    private int mViewWidth;
    private int mViewHeight;

    private float mPreDistance;

    private Context mContext;

    private Paint mPaint;
    private Paint mShaderPaint;
    private Paint mTiltShiftLinearPaint;
    private Paint mTiltShiftLinearControlPaint;

    private Bitmap mBlurBitmap;

    private RectF mBitmapRect;
    private RectF mTiltShiftLinearRect;
    private RectF mTempTiltShiftLinearRect;
    private RectF mTiltShiftLinearControlRect;

    private Matrix mGradientMatrix;

    private LinearGradient mLinearGradient;

    private EditorMode mMode = NONE;

    public EditorLinearTiltShift(int viewWidth, int viewHeight) {
        mViewWidth = viewWidth;
        mViewHeight = viewHeight;

        initialize();
    }

    private void initialize() {
        mPaint = new Paint();

        mTiltShiftLinearControlPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        mTiltShiftLinearControlPaint.setColor(Color.WHITE);
        mTiltShiftLinearControlPaint.setStyle(Paint.Style.STROKE);
        mTiltShiftLinearControlPaint.setStrokeWidth(5f);
        mTiltShiftLinearControlPaint.setAlpha(125);
        mTiltShiftLinearControlPaint.setDither(true);

        mTiltShiftLinearPaint = new Paint();
        mTiltShiftLinearPaint.setAntiAlias(true);
        mTiltShiftLinearPaint.setFilterBitmap(false);
        mTiltShiftLinearPaint.setDither(true);

        mGradientMatrix = new Matrix();

        mBitmapRect = new RectF();
        mTiltShiftLinearRect = new RectF();
        mTempTiltShiftLinearRect = new RectF();
        mTiltShiftLinearControlRect = new RectF();

        mShaderPaint = new Paint();
        mShaderPaint.setAntiAlias(true);
        mShaderPaint.setFilterBitmap(false);
        mShaderPaint.setDither(true);
        mShaderPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));

        updateGradientRect();

        mControlPointTolerance *= 1.5f;
        mGradientInset = 0;
    }

    public void draw(@NonNull Canvas canvas, @NonNull Bitmap bitmap, @NonNull Matrix matrix, @NonNull Paint paint) {
        if (!mTiltShiftLinearRect.isEmpty()) {

            canvas.drawBitmap(bitmap, matrix, paint);

            canvas.saveLayer(mBitmapRect, mPaint, Canvas.CLIP_TO_LAYER_SAVE_FLAG);

            mTiltShiftLinearControlRect.set(mTiltShiftLinearRect);
            //mTiltShiftLinearControlRect.inset(-mGradientInset, -mGradientInset);

            if (mBlurBitmap != null) {
                canvas.drawBitmap(mBlurBitmap, matrix, paint);
            }

            canvas.drawRect(mTiltShiftLinearControlRect, mShaderPaint);

            canvas.restore();

            //mTiltShiftLinearControlRect.set(mTiltShiftLinearRect);
            if (mIsShowHelpOval) {
                canvas.drawRect(mTiltShiftLinearControlRect, mTiltShiftLinearControlPaint);
            }
        }
    }

    public void updateRect(RectF bitmapRect) {
        mFocusHeight = bitmapRect.height() / 2;

        mTiltShiftLinearRect.set(
                bitmapRect.left,
                bitmapRect.centerY() - mFocusHeight / 2,
                bitmapRect.right,
                bitmapRect.centerY() + mFocusHeight / 2);

        mBitmapRect.set(bitmapRect);

        updateGradientMatrix(mTiltShiftLinearRect);

        setPaintAlpha(125);
    }

    public void updateBlurBitmap(@NonNull Bitmap blurBitmap) {
        mBlurBitmap = blurBitmap;
    }

    public void updateGradientRect() {
        final float[] anchors = new float[]{0, mFeather, 1};

        float start = 0;
        float bottom = 0;

        mLinearGradient = new android.graphics.LinearGradient(
                0, start, 0, bottom, 0xffffffff, 0x00ffffff, Shader.TileMode.CLAMP
        );

        updateGradientMatrix(mTiltShiftLinearRect);
    }

    public void updateGradientShader(float value, Paint paint) {
        mFeather = value;

        final int[] colors = new int[]{0xff000000, 0xff000000, 0};
        final float[] positions = new float[]{0, 0, 1, 1};

        /*mRadialGradient = new android.graphics.RadialGradient(
                0, 0, 1, colors, anchors, Shader.TileMode.CLAMP
        );*/

        mLinearGradient = new android.graphics.LinearGradient(
                0, 0, 2, 2, colors, positions, Shader.TileMode.CLAMP
        );
        paint.setShader(mLinearGradient);
        updateGradientMatrix(mTiltShiftLinearRect);
    }

    private void updateGradientMatrix(RectF rectF) {
        mGradientMatrix.reset();
        mGradientMatrix.postTranslate(rectF.centerX(), rectF.centerY());
        mGradientMatrix.postScale(rectF.height() / 2, rectF.height() / 2, rectF.centerX(), rectF.centerY());
        mLinearGradient.setLocalMatrix(mGradientMatrix);
    }

    public void actionMove(MotionEvent event) {
        mTempTiltShiftLinearRect.set(mTiltShiftLinearRect);

        switch (mMode) {
            case MOVE:
                float distanceX = event.getX() - mPreX;
                float distanceY = event.getY() - mPreY;

                mTempTiltShiftLinearRect.offsetTo(distanceX, distanceY);
                break;
            case ROTATE_AND_SCALE:
                float dist = MotionEventUtil.getDelta(event);
                float scale = ((dist - mPreDistance) / displayDistance());

                mPreDistance = dist;

                scale += 1;
                scale *= scale;

                RectUtil.scaleRect(mTempTiltShiftLinearRect, scale);

                mFocusHeight = mTempTiltShiftLinearRect.height();
                break;
        }

        if (mTempTiltShiftLinearRect.width() > mControlPointTolerance
                && mTempTiltShiftLinearRect.height() > mControlPointTolerance) {
            if (isTiltShiftInRect()) {
                mTiltShiftLinearRect.set(mTempTiltShiftLinearRect);

                mPreX = event.getX();
                mPreY = event.getY();
            }

            updateGradientMatrix(mTiltShiftLinearRect);

            //ViewCompat.postInvalidateOnAnimation(mImageEditorView);
        }
    }

    public void actionDown(MotionEvent event) {
        mPreX = event.getX();
        mPreY = event.getY();

        mMode = MOVE;
    }

    public void actionPointerDown(MotionEvent event) {
        mMode = ROTATE_AND_SCALE;
    }

    public void actionUp() {
        mMode = NONE;
    }

    public void actionPointerUp() {
        mMode = NONE;
    }

    public void setPaintAlpha(int value) {

    }

    public int getPaintAlpha() {
        return 0;
    }

    private float displayDistance() {
        return (float) Math.sqrt(mViewWidth * mViewWidth + mViewHeight * mViewHeight);
    }

    private boolean isTiltShiftInRect() {
        return mBitmapRect.contains(
                mTempTiltShiftLinearRect.centerX(),
                mTempTiltShiftLinearRect.centerY()
        );
    }

    public void setHelpOvalEnabled(boolean enabled) {
        mIsShowHelpOval = enabled;
    }
}

================================================
FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/core/model/EditorRadialTiltShift.java
================================================
package net.iquesoft.iquephoto.core.model;

import android.animation.Animator;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.RadialGradient;
import android.graphics.RectF;
import android.graphics.Shader;
import android.support.annotation.NonNull;
import android.view.MotionEvent;

import net.iquesoft.iquephoto.core.enums.EditorMode;
import net.iquesoft.iquephoto.utils.MotionEventUtil;
import net.iquesoft.iquephoto.utils.RectUtil;

import static net.iquesoft.iquephoto.core.enums.EditorMode.*;

// TODO: FadeIn and FadeOut Animators.
public class EditorRadialTiltShift {
    private static final int FADEOUT_DELAY = 1000;

    private float mFeather = 0.7f;
    private float mFocusRadius;
    private float mGradientInset = 100;
    private float mControlPointTolerance = 20;

    private float mPreX;
    private float mPreY;

    private int mViewWidth;
    private int mViewHeight;

    private boolean mIsShowHelpOval = true;

    private float mPreDistance;

    private Bitmap mBitmap;
    private Bitmap mBlurBitmap;

    private Paint mPaint;
    private Paint mShaderPaint;
    private Paint mTiltShiftRadialPaint;
    private Paint mTiltShiftRadialControlPaint;

    private RectF mBitmapRect = new RectF();
    private RectF mRadialTiltShiftRect;
    private RectF mRadialTiltShiftTempRect;
    private RectF mRadialTiltShiftControlRect;

    private Matrix mGradientMatrix;

    private RadialGradient mRadialGradient;

    private Animator mFadeInAnimator;
    private Animator mFadeOutAnimator;

    private EditorMode mMode = NONE;

    public EditorRadialTiltShift(int viewWidth, int viewHeight) {
        mViewWidth = viewWidth;
        mViewHeight = viewHeight;
        initialize();
    }

    public void initialize() {
        mPaint = new Paint();

        mTiltShiftRadialControlPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        mTiltShiftRadialControlPaint.setColor(Color.WHITE);
        mTiltShiftRadialControlPaint.setStrokeWidth(5f);
        mTiltShiftRadialControlPaint.setStyle(Paint.Style.STROKE);
        mTiltShiftRadialControlPaint.setAlpha(125);
        mTiltShiftRadialControlPaint.setDither(true);

        mTiltShiftRadialPaint = new Paint();
        mTiltShiftRadialPaint.setAntiAlias(true);
        mTiltShiftRadialPaint.setFilterBitmap(false);
        mTiltShiftRadialPaint.setDither(true);

        mGradientMatrix = new Matrix();

        mRadialTiltShiftRect = new RectF();
        mRadialTiltShiftControlRect = new RectF();
        mRadialTiltShiftTempRect = new RectF();

        mShaderPaint = new Paint();
        mShaderPaint.setAntiAlias(true);
        mShaderPaint.setFilterBitmap(false);
        mShaderPaint.setDither(true);
        mShaderPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));

        updateGradientShader();

        mControlPointTolerance *= 1.5f;

        mGradientInset = 0;

        //mFadeInAnimator = ObjectAnimator.ofFloat(mImageEditorView, "paintAlpha", 0, 125);
        //mFadeOutAnimator = ObjectAnimator.ofFloat(mImageEditorView, "paintAlpha", 125, 0);
        //mFadeOutAnimator.setStartDelay(FADEOUT_DELAY);
    }

    public void draw(@NonNull Canvas canvas, @NonNull Bitmap bitmap, @NonNull Matrix matrix, @NonNull Paint paint) {
        if (!mRadialTiltShiftRect.isEmpty()) {

            canvas.drawBitmap(bitmap, matrix, paint);

            canvas.saveLayer(mBitmapRect, mPaint, Canvas.CLIP_TO_LAYER_SAVE_FLAG);

            mRadialTiltShiftControlRect.set(mRadialTiltShiftRect);
            mRadialTiltShiftControlRect.inset(-mGradientInset, -mGradientInset);

            if (mBlurBitmap != null) {
                canvas.drawBitmap(mBlurBitmap, matrix, paint);
            }

            canvas.drawCircle(
                    mRadialTiltShiftControlRect.centerX(),
                    mRadialTiltShiftControlRect.centerY(),
                    mFocusRadius,
                    mShaderPaint
            );

            canvas.restore();

            mRadialTiltShiftControlRect.set(mRadialTiltShiftRect);

            if (mIsShowHelpOval) {
                canvas.drawCircle(
                        mRadialTiltShiftRect.centerX(),
                        mRadialTiltShiftRect.centerY(),
                        mFocusRadius,
                        mTiltShiftRadialControlPaint
                );
            }
        }
    }

    public void updateRect(RectF bitmapRect) {
        if (bitmapRect.height() <= bitmapRect.width()) {
            mFocusRadius = bitmapRect.height() / 3;
        } else {
            mFocusRadius = bitmapRect.width() / 3;
        }

        mRadialTiltShiftRect.set(0, 0, mFocusRadius, mFocusRadius);

        mRadialTiltShiftRect.offsetTo(
                bitmapRect.centerX() - mFocusRadius / 2,
                bitmapRect.centerY() - mFocusRadius / 2
        );

        mBitmapRect.set(bitmapRect);

        updateGradientMatrix(mRadialTiltShiftRect);

        setPaintAlpha(125);
        //mFadeOutAnimator.start();
    }

    private void updateGradientShader() {
        final int[] colors = new int[]{0xff000000, 0xff000000, 0};
        final float[] anchors = new float[]{0, mFeather, 1};

        mRadialGradient = new android.graphics.RadialGradient(
                0, 0, 1, colors, anchors, Shader.TileMode.CLAMP
        );
        updateGradientMatrix(mRadialTiltShiftRect);
        mShaderPaint.setShader(mRadialGradient);
    }

    public void updateBlurBitmap(@NonNull Bitmap bitmap) {
        mBlurBitmap = bitmap;
    }

    private void updateGradientMatrix(RectF rectF) {
        mGradientMatrix.reset();
        mGradientMatrix.postTranslate(rectF.centerX(), rectF.centerY());
        mGradientMatrix.postScale(rectF.height() / 2, rectF.height() / 2, rectF.centerX(), rectF.centerY());
        mRadialGradient.setLocalMatrix(mGradientMatrix);
    }

    public void actionDown(MotionEvent event) {
        //mFadeOutAnimator.cancel();

        if (getPaintAlpha() != 125) {
            // mFadeInAnimator.start();
        }

        if (event.getPointerCount() == 1) {
            mMode = MOVE;
        }

        mPreX = event.getX();
        mPreY = event.getY();
    }

    public void actionMove(MotionEvent event) {
        mRadialTiltShiftTempRect.set(mRadialTiltShiftRect);

        switch (mMode) {
            case MOVE:
                float distanceX = event.getX() - mPreX;
                float distanceY = event.getY() - mPreY;

                mRadialTiltShiftTempRect.offset(distanceX, distanceY);
                break;
            case ROTATE_AND_SCALE:
                float dist = MotionEventUtil.getDelta(event);
                float scale = ((dist - mPreDistance) / displayDistance());

                mPreDistance = dist;

                scale += 1;
                scale *= scale;

                RectUtil.scaleRect(mRadialTiltShiftTempRect, scale);

                mFocusRadius = mRadialTiltShiftTempRect.height();

                break;
        }

        if (mRadialTiltShiftTempRect.width() > mControlPointTolerance
                && mRadialTiltShiftTempRect.height() > mControlPointTolerance) {
            if (isTiltShiftInRect()) {
                mRadialTiltShiftRect.set(mRadialTiltShiftTempRect);

                mPreX = event.getX();
                mPreY = event.getY();
            }

            updateGradientMatrix(mRadialTiltShiftRect);

        }
    }

    public void actionPointerDown(MotionEvent event) {
        if (event.getPointerCount() == 2) {
            mPreDistance = MotionEventUtil.getDelta(event);
            mMode = ROTATE_AND_SCALE;
        }
    }

    public void actionUp() {
        // mFadeOutAnimator.start();

        mMode = NONE;
    }

    public void actionPointerUp() {
        mMode = NONE;
    }

    public void setPaintAlpha(int value) {
        mTiltShiftRadialControlPaint.setAlpha(value);
        //mImageEditorView.postInvalidate();
    }

    public int getPaintAlpha() {
        return mTiltShiftRadialControlPaint.getAlpha();
    }

    private float displayDistance() {
        return (float) Math.sqrt(mViewWidth * mViewWidth + mViewHeight * mViewHeight);
    }

    private boolean isTiltShiftInRect() {
        return mBitmapRect.contains(
                mRadialTiltShiftTempRect.centerX(),
                mRadialTiltShiftTempRect.centerY()
        );
    }

    public void setHelpOvalEnabled(boolean enabled) {
        mIsShowHelpOval = enabled;
    }
}

================================================
FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/core/model/EditorSticker.java
================================================
package net.iquesoft.iquephoto.core.model;

import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.RectF;
import android.support.annotation.NonNull;
import android.util.Log;
import android.view.MotionEvent;

import net.iquesoft.iquephoto.App;
import net.iquesoft.iquephoto.utils.MatrixUtil;
import net.iquesoft.iquephoto.utils.RectUtil;

import javax.inject.Inject;

public class EditorSticker {
    private static final float MIN_SCALE = 0.15f;
    private static final int HELP_BOX_PAD = 25;
    private static final int BUTTON_WIDTH = 30;

    private float mRotateAngle = 0;

    private float mInitWidth;

    private boolean mIsDrawHelperFrame = true;

    private Bitmap mBitmap;

    private Paint mPaint;
    private Paint mHelperFramePaint;

    private Matrix mMatrix;

    private RectF mImageRect;

    private RectF mDstRect;

    private RectF mFrameRect;

    private Rect mDeleteHandleSrcRect;
    private Rect mFrontHandleSrcRect;
    private Rect mTransparencyHandleSrcRect;
    private Rect mScaleAndRotateHandleSrcRect;

    private RectF mDeleteHandleDstRect;
    private RectF mFrontHandleDstRect;
    private RectF mTransparencyHandleDstRect;
    private RectF mScaleAndRotateHandleDstRect;

    @Inject
    EditorFrame mEditorFrame;

    public EditorSticker(Bitmap bitmap, RectF imageRect) {
        mBitmap = bitmap;

        mImageRect = imageRect;

        App.getAppComponent().inject(this);

        mPaint = new Paint();
        mHelperFramePaint = new Paint(mEditorFrame.getFramePaint());

        initialize();
    }

    private void initialize() {
        int stickerWidth = Math.min(mBitmap.getWidth(), (int) mImageRect.width() >> 1);
        int stickerHeight = stickerWidth * mBitmap.getHeight() / mBitmap.getWidth();

        float left = mImageRect.centerX() - (stickerWidth / 2);
        float top = mImageRect.centerY() - (stickerHeight / 2);

        mDstRect = new RectF(left, top, left + stickerWidth, top + stickerHeight);

        mMatrix = new Matrix();
        mMatrix.postTranslate(mDstRect.left, mDstRect.top);
        mMatrix.postScale((float) stickerWidth / mBitmap.getWidth(),
                (float) stickerHeight / mBitmap.getHeight(), mDstRect.left,
                mDstRect.top);

        mInitWidth = mDstRect.width();

        mFrameRect = new RectF(mDstRect);
        updateFrameRect();

        mTransparencyHandleSrcRect = new Rect(0, 0, mEditorFrame.getDeleteHandleBitmap().getWidth(),
                mEditorFrame.getDeleteHandleBitmap().getHeight());
        mDeleteHandleSrcRect = new Rect(0, 0, mEditorFrame.getResizeHandleBitmap().getWidth(),
                mEditorFrame.getResizeHandleBitmap().getHeight());
        mScaleAndRotateHandleSrcRect = new Rect(0, 0, mEditorFrame.getTransparencyHandleBitmap().getWidth(),
                mEditorFrame.getTransparencyHandleBitmap().getHeight());
        mFrontHandleSrcRect = new Rect(0, 0, mEditorFrame.getFrontHandleBitmap().getWidth(),
                mEditorFrame.getFrontHandleBitmap().getHeight());

        int handleHalfSize = mEditorFrame.getDeleteHandleBitmap().getWidth() / 2;

        mDeleteHandleDstRect = new RectF(0, 0, handleHalfSize << 1, handleHalfSize << 1);
        mScaleAndRotateHandleDstRect = new RectF(0, 0, handleHalfSize << 1, handleHalfSize << 1);
        mFrontHandleDstRect = new RectF(0, 0, handleHalfSize << 1, handleHalfSize << 1);
        mTransparencyHandleDstRect = new RectF(0, 0, handleHalfSize << 1, handleHalfSize << 1);
    }

    private void updateFrameRect() {
        mFrameRect.left -= HELP_BOX_PAD;
        mFrameRect.right += HELP_BOX_PAD;
        mFrameRect.top -= HELP_BOX_PAD;
        mFrameRect.bottom += HELP_BOX_PAD;
    }

    public void setStickerTouched(boolean isTouched) {
        if (isTouched) {
            mHelperFramePaint.setAlpha(255);
        } else {
            mHelperFramePaint.set(mEditorFrame.getFramePaint());
        }
    }

    public void actionMove(float dx, float dy) {
        mMatrix.postTranslate(dx, dy);

        mDstRect.offset(dx, dy);

        mFrameRect.offset(dx, dy);

        Log.i("Sticker", "Move: " + "\n" + "X = " + MatrixUtil.getMatrixX(mMatrix) +
                "\n" + "Y = " + MatrixUtil.getMatrixY(mMatrix));
    }

    public void updateRotateAndScale(final float dx, final float dy) {
        float stickerCenterX = mDstRect.centerX();
        float stickerCenterY = mDstRect.centerY();

        float handleCenterX = mScaleAndRotateHandleDstRect.centerX();
        float handleCenterY = mScaleAndRotateHandleDstRect.centerY();

        float n_x = handleCenterX + dx;
        float n_y = handleCenterY + dy;

        float xa = handleCenterX - stickerCenterX;
        float ya = handleCenterY - stickerCenterY;

        float xb = n_x - stickerCenterX;
        float yb = n_y - stickerCenterY;

        float srcLen = (float) Math.sqrt(xa * xa + ya * ya);
        float curLen = (float) Math.sqrt(xb * xb + yb * yb);

        float scale = curLen / srcLen;

        float newWidth = mDstRect.width() * scale;
        if (newWidth / mInitWidth < MIN_SCALE) {
            return;
        }

        mMatrix.postScale(scale, scale, mDstRect.centerX(),
                mDstRect.centerY());

        RectUtil.scaleRect(mDstRect, scale);

        mFrameRect.set(mDstRect);
        updateFrameRect();

        mScaleAndRotateHandleDstRect.offsetTo(mFrameRect.right - BUTTON_WIDTH, mFrameRect.bottom
                - BUTTON_WIDTH);
        mDeleteHandleDstRect.offsetTo(mFrameRect.left - BUTTON_WIDTH, mFrameRect.top
                - BUTTON_WIDTH);

        double cos = (xa * xb + ya * yb) / (srcLen * curLen);
        if (cos > 1 || cos < -1)
            return;
        float angle = (float) Math.toDegrees(Math.acos(cos));

        float calMatrix = xa * yb - xb * ya;

        int flag = calMatrix > 0 ? 1 : -1;
        angle = flag * angle;

        mRotateAngle += angle;
        mMatrix.postRotate(angle, mDstRect.centerX(),
                mDstRect.centerY());

        RectUtil.rotateRect(mScaleAndRotateHandleDstRect, mDstRect.centerX(),
                mDstRect.centerY(), mRotateAngle);
        RectUtil.rotateRect(mDeleteHandleDstRect, mDstRect.centerX(),
                mDstRect.centerY(), mRotateAngle);

        Log.i("Sticker", "Scale = " + MatrixUtil.getScale(mMatrix) + "\n" +
                "Angle = " + MatrixUtil.getAngle(mMatrix));
    }

    public void draw(@NonNull Canvas canvas) {
        canvas.drawBitmap(mBitmap, mMatrix, mPaint);

        if (mIsDrawHelperFrame) drawHelperFrame(canvas);
    }

    private void drawHelperFrame(Canvas canvas) {
        canvas.save();
        canvas.rotate(mRotateAngle, mFrameRect.centerX(), mFrameRect.centerY());

        canvas.drawRect(mFrameRect, mHelperFramePaint);
        canvas.restore();

        int offsetValue = ((int) mDeleteHandleDstRect.width()) >> 1;

        mDeleteHandleDstRect.offsetTo(
                mFrameRect.left - offsetValue,
                mFrameRect.top - offsetValue
        );

        mScaleAndRotateHandleDstRect.offsetTo(
                mFrameRect.right - offsetValue,
                mFrameRect.bottom - offsetValue
        );

        mTransparencyHandleDstRect.offsetTo(
                mFrameRect.right - offsetValue,
                mFrameRect.top - offsetValue
        );

        mFrontHandleDstRect.offsetTo(
                mFrameRect.left - offsetValue,
                mFrameRect.bottom - offsetValue
        );

        RectUtil.rotateRect(mDeleteHandleDstRect, mFrameRect.centerX(),
                mFrameRect.centerY(), mRotateAngle);

        RectUtil.rotateRect(mTransparencyHandleDstRect, mFrameRect.centerX(),
                mFrameRect.centerY(), mRotateAngle);

        RectUtil.rotateRect(mScaleAndRotateHandleDstRect, mFrameRect.centerX(),
                mFrameRect.centerY(), mRotateAngle);

        RectUtil.rotateRect(mFrontHandleDstRect, mFrameRect.centerX(),
                mFrameRect.centerY(), mRotateAngle);

        canvas.drawBitmap(mEditorFrame.getDeleteHandleBitmap(),
                mDeleteHandleSrcRect,
                mDeleteHandleDstRect,
                null);

        canvas.drawBitmap(mEditorFrame.getTransparencyHandleBitmap(),
                mTransparencyHandleSrcRect,
                mTransparencyHandleDstRect,
                null);

        canvas.drawBitmap(mEditorFrame.getResizeHandleBitmap(),
                mScaleAndRotateHandleSrcRect,
                mScaleAndRotateHandleDstRect,
                null);

        canvas.drawBitmap(mEditorFrame.getFrontHandleBitmap(),
                mFrontHandleSrcRect,
                mFrontHandleDstRect,
                null);
    }

    public boolean isInside(MotionEvent event) {
        return mDstRect.contains(event.getX(), event.getY());
    }

    public boolean isInDeleteHandleButton(MotionEvent event) {
        return mDeleteHandleDstRect.contains(event.getX(), event.getY());
    }

    public boolean isInScaleAndRotateHandleButton(MotionEvent event) {
        return mScaleAndRotateHandleDstRect.contains(event.getX(), event.getY());
    }

    public boolean isInFrontHandleButton(MotionEvent event) {
        return mFrontHandleDstRect.contains(event.getX(), event.getY());
    }

    public boolean isInTransparencyHandleButton(MotionEvent event) {
        return mTransparencyHandleDstRect.contains(event.getX(), event.getY());
    }

    public Paint getPaint() {
        return mPaint;
    }

    public void setHelpFrameEnabled(boolean enabled) {
        mIsDrawHelperFrame = enabled;
    }
}

================================================
FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/core/model/EditorText.java
================================================
package net.iquesoft.iquephoto.core.model;

import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Typeface;
import android.support.annotation.NonNull;
import android.text.TextPaint;
import android.view.MotionEvent;

import net.iquesoft.iquephoto.App;
import net.iquesoft.iquephoto.models.Text;
import net.iquesoft.iquephoto.utils.RectUtil;
import net.iquesoft.iquephoto.utils.SizeUtil;

import javax.inject.Inject;

import static net.iquesoft.iquephoto.core.model.EditorFrame.EDITOR_FRAME_PADDING;

public class EditorText {
    static final int DEFAULT_COLOR = Color.BLACK;
    private static final float DEFAULT_TEXT_SIZE = 120;

    private String mText;

    private int mColor;
    private int mOpacity = 255;

    private float mX;
    private float mY;

    private float mScale = 1;

    private float mRotateAngle = 0;

    private boolean mIsDrawHelperFrame = true;

    private Typeface mTypeface;

    private Paint mHelperFramePaint;
    private TextPaint mTextPaint;

    private Rect mTextRect;

    private Rect mDeleteHandleSrcRect;
    private Rect mFrontHandleSrcRect;
    private Rect mTransparencyHandleSrcRect;
    private Rect mResizeAndScaleHandleSrcRect;

    private RectF mFrameRect;

    private RectF mDeleteHandleDstRect;
    private RectF mFrontHandleDstRect;
    private RectF mTransparencyHandleDstRect;
    private RectF mResizeAndScaleHandleDstRect;

    @Inject
    EditorFrame mEditorFrame;

    public EditorText(Text text) {
        mText = text.getText();

        mTypeface = text.getTypeface();

        mColor = text.getColor();

        App.getAppComponent().inject(this);

        mHelperFramePaint = new Paint(mEditorFrame.getFramePaint());

        initTextPaint();
        initEditorText();
    }

    private void initEditorText() {
        mTextRect = new Rect();
        mFrameRect = new RectF();

        mTransparencyHandleSrcRect = new Rect(0, 0, mEditorFrame.getDeleteHandleBitmap().getWidth(),
                mEditorFrame.getDeleteHandleBitmap().getHeight());
        mDeleteHandleSrcRect = new Rect(0, 0, mEditorFrame.getResizeHandleBitmap().getWidth(),
                mEditorFrame.getResizeHandleBitmap().getHeight());
        mResizeAndScaleHandleSrcRect = new Rect(0, 0, mEditorFrame.getTransparencyHandleBitmap().getWidth(),
                mEditorFrame.getTransparencyHandleBitmap().getHeight());
        mFrontHandleSrcRect = new Rect(0, 0, mEditorFrame.getFrontHandleBitmap().getWidth(),
                mEditorFrame.getFrontHandleBitmap().getHeight());

        int handleHalfSize = mEditorFrame.getDeleteHandleBitmap().getWidth() / 2;

        mDeleteHandleDstRect = new RectF(0, 0, handleHalfSize << 1, handleHalfSize << 1);
        mResizeAndScaleHandleDstRect = new RectF(0, 0, handleHalfSize << 1, handleHalfSize << 1);
        mFrontHandleDstRect = new RectF(0, 0, handleHalfSize << 1, handleHalfSize << 1);
        mTransparencyHandleDstRect = new RectF(0, 0, handleHalfSize << 1, handleHalfSize << 1);
    }

    private void initTextPaint() {
        mTextPaint = new TextPaint();
        mTextPaint.setAntiAlias(true);
        mTextPaint.setColor(mColor);
        mTextPaint.setAlpha(mOpacity);

        mTextPaint.setTextSize(SizeUtil.dp2px(DEFAULT_TEXT_SIZE));
        mTextPaint.setTypeface(mTypeface);
        mTextPaint.setTextAlign(Paint.Align.CENTER);
    }

    public void draw(@NonNull Canvas canvas) {
        mTextPaint.getTextBounds(mText, 0, mText.length(), mTextRect);

        mTextRect.offset((int) mX - (mTextRect.width() >> 1), (int) mY);

        mFrameRect.set(mTextRect.left - SizeUtil.dp2px(EDITOR_FRAME_PADDING), mTextRect.top - SizeUtil.dp2px(EDITOR_FRAME_PADDING),
                mTextRect.right + SizeUtil.dp2px(EDITOR_FRAME_PADDING), mTextRect.bottom + SizeUtil.dp2px(EDITOR_FRAME_PADDING));

        RectUtil.scaleRect(mFrameRect, mScale);

        canvas.save();
        canvas.scale(mScale, mScale, mFrameRect.centerX(), mFrameRect.centerY());
        canvas.rotate(mRotateAngle, mFrameRect.centerX(), mFrameRect.centerY());
        canvas.drawText(mText, mX, mY, mTextPaint);
        canvas.restore();

        if (mIsDrawHelperFrame) {
            drawHelperFrame(canvas);
        }
    }

    private void drawHelperFrame(Canvas canvas) {
        int offsetValue = ((int) mDeleteHandleDstRect.width()) >> 1;

        mDeleteHandleDstRect.offsetTo(mFrameRect.left - offsetValue, mFrameRect.top - offsetValue);
        mResizeAndScaleHandleDstRect.offsetTo(mFrameRect.right - offsetValue, mFrameRect.bottom - offsetValue);
        mTransparencyHandleDstRect.offsetTo(mFrameRect.right - offsetValue, mFrameRect.top - offsetValue);
        mFrontHandleDstRect.offsetTo(mFrameRect.left - offsetValue, mFrameRect.bottom - offsetValue);

        RectUtil.rotateRect(mDeleteHandleDstRect, mFrameRect.centerX(),
                mFrameRect.centerY(), mRotateAngle);

        RectUtil.rotateRect(mTransparencyHandleDstRect, mFrameRect.centerX(),
                mFrameRect.centerY(), mRotateAngle);

        RectUtil.rotateRect(mResizeAndScaleHandleDstRect, mFrameRect.centerX(),
                mFrameRect.centerY(), mRotateAngle);

        RectUtil.rotateRect(mFrontHandleDstRect, mFrameRect.centerX(),
                mFrameRect.centerY(), mRotateAngle);

        canvas.save();
        canvas.rotate(mRotateAngle, mFrameRect.centerX(), mFrameRect.centerY());
        canvas.drawRect(mFrameRect, mHelperFramePaint);
        canvas.restore();

        canvas.drawBitmap(mEditorFrame.getDeleteHandleBitmap(),
                mDeleteHandleSrcRect, mDeleteHandleDstRect, null);
        canvas.drawBitmap(mEditorFrame.getTransparencyHandleBitmap(),
                mTransparencyHandleSrcRect, mTransparencyHandleDstRect, null);
        canvas.drawBitmap(mEditorFrame.getResizeHandleBitmap(),
                mResizeAndScaleHandleSrcRect, mResizeAndScaleHandleDstRect, null);
        canvas.drawBitmap(mEditorFrame.getFrontHandleBitmap(),
                mFrontHandleSrcRect, mFrontHandleDstRect, null);
    }

    public void setX(float x) {
        mX = x;
    }

    public void setY(float y) {
        mY = y;
    }

    public float getX() {
        return mX;
    }

    public float getY() {
        return mY;
    }

    public RectF getRotateAndScaleHandleDstRect() {
        return mResizeAndScaleHandleDstRect;
    }

    public RectF getResizeHandleDstRect() {
        return mResizeAndScaleHandleDstRect;
    }

    public void setHelperFrameOpacity() {
        mHelperFramePaint.setAlpha(255);
    }

    public void resetHelperFrameOpacity() {
        mHelperFramePaint.set(mEditorFrame.getFramePaint());
    }

    public void updateRotateAndScale(float distanceX, float distanceY) {
        float frameCenterX = mFrameRect.centerX();
        float frameCenterY = mFrameRect.centerY();

        float handleCenterX = mResizeAndScaleHandleDstRect.centerX();
        float handleCenterY = mResizeAndScaleHandleDstRect.centerY();

        float newX = handleCenterX + distanceX;
        float newY = handleCenterY + distanceY;

        float xa = handleCenterX - frameCenterX;
        float ya = handleCenterY - frameCenterY;

        float xb = newX - frameCenterX;
        float yb = newY - frameCenterY;

        float sourceLength = (float) Math.sqrt(Math.pow(xa, 2) + Math.pow(ya, 2));
        float currentLength = (float) Math.sqrt(Math.pow(xb, 2) + Math.pow(yb, 2));

        float scale = currentLength / sourceLength;

        mScale *= scale;

        float newWidth = mFrameRect.width() * mScale;

        if (newWidth < 70) {
            mScale /= scale;
            return;
        }

        double cos = (xa * xb + ya * yb) / (sourceLength * currentLength);

        if (cos > 1 || cos < -1) return;

        float angle = (float) Math.toDegrees(Math.acos(cos));
        float calMatrix = xa * yb - xb * ya;

        int flag = calMatrix > 0 ? 1 : -1;
        angle = flag * angle;

        mRotateAngle += angle;
    }

    public boolean isInside(MotionEvent event) {
        return mFrameRect.contains(event.getX(), event.getY());
    }

    public boolean isInDeleteHandleButton(MotionEvent event) {
        return mDeleteHandleDstRect.contains(event.getX(), event.getY());
    }

    public boolean isInFrontHandleButton(MotionEvent event) {
        return mFrontHandleDstRect.contains(event.getX(), event.getY());
    }

    // TODO: Stickers transparency.
    public boolean isInTransparencyHandleButton(MotionEvent event) {
        return mTransparencyHandleDstRect.contains(event.getX(), event.getY());
    }

    public boolean isInResizeAndScaleHandleButton(MotionEvent event) {
        return mResizeAndScaleHandleDstRect.contains(event.getX(), event.getY());
    }

    public void setHelpFrameEnabled(boolean enabled) {
        mIsDrawHelperFrame = enabled;
    }

    public Paint getPaint() {
        return mTextPaint;
    }
}

================================================
FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/core/model/EditorTiltShift.java
================================================
package net.iquesoft.iquephoto.core.model;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.RectF;
import android.view.MotionEvent;

public interface EditorTiltShift {

    void initialize(Context context);

    void draw(Canvas canvas, Bitmap bitmap, Matrix matrix, Paint paint);

    void updateRect(RectF bitmapRect);

    void updateGradientRect();

    void updateGradientShader(float value, final Paint paint);

    void updateGradientMatrix(RectF rectF);

    void actionMove(MotionEvent event);

    void actionDown(MotionEvent event);

    void actionPointerDown(MotionEvent event);

    void actionUp();

    void actionPointerUp();

    void setPaintAlpha(int value);

    int getPaintAlpha();
}


================================================
FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/core/model/EditorVignette.java
================================================
package net.iquesoft.iquephoto.core.model;

import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.DashPathEffect;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.RadialGradient;
import android.graphics.RectF;
import android.graphics.Shader;
import android.support.annotation.NonNull;
import android.util.Log;
import android.view.MotionEvent;

import net.iquesoft.iquephoto.core.enums.EditorMode;
import net.iquesoft.iquephoto.utils.LogHelper;
import net.iquesoft.iquephoto.utils.MatrixUtil;
import net.iquesoft.iquephoto.utils.MotionEventUtil;
import net.iquesoft.iquephoto.utils.RectUtil;

import static net.iquesoft.iquephoto.core.enums.EditorMode.*;

public class EditorVignette {
    private static final String TAG = "Vignette";
    private static final int FADEOUT_DELAY = 3000;

    private float mFeather = 0.7f;

    private float mPreX;
    private float mPreY;

    private int mViewWidth;
    private int mViewHeight;

    private float mPreDistance;

    private float mGradientInset = 100;
    private float mControlPointTolerance = 20;

    private boolean mIsShowHelpOval = true;

    private Paint mPaint = new Paint();
    private Paint mShaderPaint;
    private Paint mVignettePaint;
    private Paint mVignetteControlPaint;

    private RectF mBitmapRect = new RectF();
    private RectF mVignetteRect;
    private RectF mTempVignetteRect = new RectF();
    private RectF mVignetteControlRect = new RectF();

    private RadialGradient mRadialGradient;

    private Matrix mGradientMatrix;

    private EditorMode mMode = NONE;

    public EditorVignette(int viewWidth, int viewHeight) {
        mViewWidth = viewWidth;
        mViewHeight = viewHeight;

        initializeVignette();
    }

    private void initializeVignette() {
        mVignetteControlPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        mVignetteControlPaint.setColor(Color.WHITE);
        mVignetteControlPaint.setStrokeWidth(5f);
        mVignetteControlPaint.setStyle(Paint.Style.STROKE);
        mVignetteControlPaint.setAlpha(125);
        mVignetteControlPaint.setDither(true);
        mVignetteControlPaint.setPathEffect(
                new DashPathEffect(
                        new float[]{10, 20}, 0)
        );

        mVignettePaint = new Paint();
        mVignettePaint.setAntiAlias(true);
        mVignettePaint.setFilterBitmap(false);
        mVignettePaint.setDither(true);

        mGradientMatrix = new Matrix();
        mVignetteRect = new RectF();

        updateMask(55);

        mShaderPaint = new Paint();
        mShaderPaint.setAntiAlias(true);
        mShaderPaint.setFilterBitmap(false);
        mShaderPaint.setDither(true);
        mShaderPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));

        updateGradientShader(mFeather, mShaderPaint);

        mControlPointTolerance = mControlPointTolerance * 1.5f;

        mGradientInset = 0;
    }

    public void updateMask(int value) {
        if (value >= 0) {
            mVignettePaint.setColor(Color.BLACK);
        } else {
            mVignettePaint.setColor(Color.WHITE);
        }

        value = Math.max(Math.min(Math.abs(value), 100), 0);
        value *= 2.55;

        mVignetteControlPaint.setAlpha(125);
        mVignettePaint.setAlpha(value);
    }

    private void updateGradientShader(float value, final Paint paint) {
        mFeather = value;

        final int[] colors = new int[]{0xff000000, 0xff000000, 0};
        final float[] anchors = new float[]{0, mFeather, 1};

        mRadialGradient = new android.graphics.RadialGradient(
                0, 0, 1, colors, anchors, Shader.TileMode.CLAMP
        );
        paint.setShader(mRadialGradient);
        updateGradientMatrix(mVignetteRect);
    }

    private void updateGradientMatrix(RectF rectF) {
        mGradientMatrix.reset();
        mGradientMatrix.postTranslate(rectF.centerX(), rectF.centerY());
        mGradientMatrix.postScale(rectF.width() / 2, rectF.height() / 2, rectF.centerX(), rectF.centerY());
        mRadialGradient.setLocalMatrix(mGradientMatrix);
    }

    /**
     * Reset the Vignette Rect when Tool changed.
     */
    public void updateRect(RectF bitmapRect) {
        mVignetteRect.set(bitmapRect);
        mVignetteRect.inset(mControlPointTolerance, mControlPointTolerance);

        mBitmapRect.set(bitmapRect);

        Log.i(TAG, "Is Reset!");

        updateGradientMatrix(mVignetteRect);
    }

    /**
     * @param canvas is a view canvas if you want to draw on image canvas call prepareToDraw().
     */
    public void draw(@NonNull Canvas canvas) {
        if (!mVignetteRect.isEmpty()) {
            canvas.saveLayer(mBitmapRect, mPaint, Canvas.CLIP_TO_LAYER_SAVE_FLAG);

            mVignetteControlRect.set(mVignetteRect);
            mVignetteControlRect.inset(-mGradientInset, -mGradientInset);

            canvas.drawRect(mBitmapRect, mVignettePaint);
            canvas.drawOval(mVignetteControlRect, mShaderPaint);

            canvas.restore();

            if (mIsShowHelpOval) {
                mVignetteControlRect.inset(50, 50);
                canvas.drawOval(mVignetteControlRect, mVignetteControlPaint);
            }
        }
    }

    public void actionDown(MotionEvent motionEvent) {
        mMode = MOVE;

        Log.i(TAG, "Action: Down \n" +
                "Mode: " + mMode.name());

        mPreX = motionEvent.getX();
        mPreY = motionEvent.getY();
    }

    public void actionPointerDown(MotionEvent event) {
        if (event.getPointerCount() == 2) {
            float angle = MotionEventUtil.getAngle(event);

            if (angle < 0) {
                angle += 180;
            }

            if (angle > 36 && angle < 72 || angle > 108 && angle < 144) {
                mPreDistance = MotionEventUtil.getDelta(event);
                mMode = ROTATE_AND_SCALE;
            } else if (angle >= 72 && angle <= 108) {
                mMode = RESIZE_HEIGHT;
            } else {
                mMode = RESIZE_WIDTH;
            }

            Log.i(TAG, "Action: Pointer Down" + "\n"
                    + "Angle: " + String.valueOf(angle) + "\n"
                    + "Mode: " + mMode.name());
        }
    }

    public void actionMove(MotionEvent event) {
        mTempVignetteRect.set(mVignetteRect);

        float distanceX = event.getX() - mPreX;
        float distanceY = event.getY() - mPreY;

        Log.i(TAG, "Action: Move \n" +
                "Mode: " + mMode.name());

        switch (mMode) {
            case MOVE:
                mTempVignetteRect.offset(distanceX, distanceY);
                break;
            case ROTATE_AND_SCALE:
                float dist = MotionEventUtil.getDelta(event);
                float displayDistance = MotionEventUtil.getDisplayDistance(
                        mViewWidth,
                        mViewHeight
                );

                float scale = ((dist - mPreDistance) / displayDistance);

                mPreDistance = dist;

                scale += 1;
                scale *= scale;

                RectUtil.scaleRect(mTempVignetteRect, scale);
                break;
            case RESIZE_HEIGHT:
                mTempVignetteRect.inset(0, distanceY);
                break;
            case RESIZE_WIDTH:
                mTempVignetteRect.inset(-distanceX, 0);
                break;
        }

        if (mTempVignetteRect.width() > mControlPointTolerance
                && mTempVignetteRect.height() > mControlPointTolerance) {
            if (isVignetteInRect()) {
                mVignetteRect.set(mTempVignetteRect);

                mPreX = event.getX();
                mPreY = event.getY();
            }

            updateGradientMatrix(mVignetteRect);
        }
    }

    public void actionUp() {
        mMode = NONE;
        Log.i(TAG, "Action: Up \n" +
                "Mode: " + mMode.name());
    }

    public void actionPointerUp() {
        mMode = MOVE;
        Log.i(TAG, "Action: Pointer Up \n" +
                "Mode: " + mMode.name());
    }

    public void prepareToDraw(@NonNull Canvas canvas, @NonNull Matrix matrix) {
        LogHelper.logRect("Vignette - before", mVignetteRect);

        float scale = MatrixUtil.getScale(matrix);

        float x = MatrixUtil.getMatrixX(matrix);
        float y = MatrixUtil.getMatrixY(matrix);

        float newLeft = (mVignetteRect.left - x) / scale;
        float newTop = (mVignetteRect.top - y) / scale;

        mVignetteRect.offsetTo(newLeft, newTop);

        mVignetteRect.right /= scale;
        mVignetteRect.bottom /= scale;

        updateGradientMatrix(mVignetteRect);

        mIsShowHelpOval = false;

        mBitmapRect.set(0, 0, canvas.getWidth(), canvas.getHeight()); // To save layer.

        LogHelper.logRect("Vignette - after", mVignetteRect);
    }

    private boolean isVignetteInRect() {
        return mBitmapRect.contains(
                mTempVignetteRect.centerX(),
                mTempVignetteRect.centerY()
        );
    }

    public void setHelpOvalEnabled(boolean enabled) {
        mIsShowHelpOval = enabled;
    }
}

================================================
FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/di/AppComponent.java
================================================
package net.iquesoft.iquephoto.di;

import android.content.Context;

import net.iquesoft.iquephoto.core.model.EditorSticker;
import net.iquesoft.iquephoto.core.model.EditorText;
import net.iquesoft.iquephoto.di.modules.AppModule;
import net.iquesoft.iquephoto.di.modules.EditorModule;
import net.iquesoft.iquephoto.presentation.presenters.fragment.AdjustPresenter;
import net.iquesoft.iquephoto.presentation.presenters.fragment.ColorsPresenter;
import net.iquesoft.iquephoto.presentation.presenters.fragment.DrawingPresenter;
import net.iquesoft.iquephoto.presentation.presenters.fragment.FiltersPresenter;
import net.iquesoft.iquephoto.presentation.presenters.fragment.FontsPresenter;
import net.iquesoft.iquephoto.presentation.presenters.fragment.FramesPresenter;
import net.iquesoft.iquephoto.presentation.presenters.fragment.OverlaysPresenter;
import net.iquesoft.iquephoto.presentation.presenters.fragment.StickersPresenter;
import net.iquesoft.iquephoto.presentation.presenters.fragment.StickersSetPresenter;
import net.iquesoft.iquephoto.presentation.presenters.fragment.ToolsPresenter;
import net.iquesoft.iquephoto.ui.dialogs.FontPickerDialog;

import javax.inject.Singleton;

import dagger.Component;

@Singleton
@Component(modules = {AppModule.class, EditorModule.class})
public interface AppComponent {
    Context getContext();

    void inject(ToolsPresenter toolsPresenter);

    void inject(AdjustPresenter adjustPresenter);

    void inject(FiltersPresenter filtersPresenter);

    void inject(OverlaysPresenter overlaysPresenter);

    void inject(FramesPresenter framesPresenter);

    void inject(StickersSetPresenter stickersSetPresenter);

    void inject(StickersPresenter stickersPresenter);

    void inject(ColorsPresenter colorsPresenter);

    void inject(DrawingPresenter drawingPresenter);

    void inject(FontsPresenter fontsPresenter);

    void inject(FontPickerDialog fontPickerDialog);

    void inject(EditorSticker editorSticker);

    void inject(EditorText editorText);
}

================================================
FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/di/modules/AppModule.java
================================================
package net.iquesoft.iquephoto.di.modules;

import android.content.Context;

import javax.inject.Singleton;

import dagger.Module;
import dagger.Provides;

@Module
public class AppModule {
    private Context mContext;

    public AppModule(Context context) {
        mContext = context;
    }

    @Provides
    @Singleton
    Context provideContext() {
        return mContext;
    }
}

================================================
FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/di/modules/EditorModule.java
================================================
package net.iquesoft.iquephoto.di.modules;

import android.graphics.ColorMatrix;

import net.iquesoft.iquephoto.App;
import net.iquesoft.iquephoto.R;
import net.iquesoft.iquephoto.core.model.EditorFrame;
import net.iquesoft.iquephoto.models.Adjust;
import net.iquesoft.iquephoto.models.BrushSize;
import net.iquesoft.iquephoto.models.EditorColor;
import net.iquesoft.iquephoto.models.Filter;
import net.iquesoft.iquephoto.models.Font;
import net.iquesoft.iquephoto.models.Frame;
import net.iquesoft.iquephoto.models.Overlay;
import net.iquesoft.iquephoto.models.Sticker;
import net.iquesoft.iquephoto.models.StickersSet;
import net.iquesoft.iquephoto.models.Tool;
import net.iquesoft.iquephoto.ui.fragments.ImageAdjustmentFragment;
import net.iquesoft.iquephoto.ui.fragments.TextFragment;
import net.iquesoft.iquephoto.ui.fragments.AdjustFragment;
import net.iquesoft.iquephoto.ui.fragments.DrawingFragment;
import net.iquesoft.iquephoto.ui.fragments.FiltersFragment;
import net.iquesoft.iquephoto.ui.fragments.FramesFragment;
import net.iquesoft.iquephoto.ui.fragments.OverlaysFragment;
import net.iquesoft.iquephoto.ui.fragments.StickersSetFragment;
import net.iquesoft.iquephoto.ui.fragments.TiltShiftFragment;
import net.iquesoft.iquephoto.ui.fragments.TransformFragment;

import java.util.Arrays;
import java.util.List;

import dagger.Module;
import dagger.Provides;

import static net.iquesoft.iquephoto.core.enums.EditorTool.BRIGHTNESS;
import static net.iquesoft.iquephoto.core.enums.EditorTool.CONTRAST;
import static net.iquesoft.iquephoto.core.enums.EditorTool.SATURATION;
import static net.iquesoft.iquephoto.core.enums.EditorTool.VIGNETTE;
import static net.iquesoft.iquephoto.core.enums.EditorTool.WARMTH;

@Module
public class EditorModule {
    @Provides
    List<Tool> provideTools() {
        return Arrays.asList(
                new Tool(R.string.filters, R.drawable.ic_filter_white_50dp, FiltersFragment.newInstance()),
                new Tool(R.string.adjust, R.drawable.ic_adjust_white_50dp, new AdjustFragment()),
                new Tool(R.string.overlay, R.drawable.ic_overlay_white_50dp, new OverlaysFragment()),
                new Tool(R.string.stickers, R.drawable.ic_stiker_white_50dp, new StickersSetFragment()),
                new Tool(R.string.frames, R.drawable.ic_frame_white_50dp, new FramesFragment()),
                new Tool(R.string.transform, R.drawable.ic_transform_white_50dp, new TransformFragment()),
                new Tool(R.string.vignette, R.drawable.ic_vignette_white_50dp, ImageAdjustmentFragment.newInstance(VIGNETTE)),
                new Tool(R.string.tilt_shift, R.drawable.ic_tilt_shift_white_50dp, new TiltShiftFragment()),
                new Tool(R.string.drawing, R.drawable.ic_drawing_white_50dp, new DrawingFragment()),
                new Tool(R.string.text, R.drawable.ic_letters_white_50dp, new TextFragment())
        );
    }

    @Provides
    List<Filter> provideFilters() {
        return Arrays.asList(
                new Filter("F02", new ColorMatrix(new float[]{
                        1, 0, 0, 0, 0,
                        0, 1, 0, 0, 0,
                        0.50f, 0, 1, 0, 0,
                        0, 0, 0, 1, 0})),
                new Filter("F03", new ColorMatrix(new float[]{
                        1.5f, 0, 0, 0, -40,
                        0, 1.5f, 0, 0, -40,
                        0, 0, 1.5f, 0, -40,
                        0, 0, 0, 1, 0})),
                new Filter("F01", new ColorMatrix(new float[]{
                        2, -1, 0, 0, 0,
                        -1, 2, 0, 0, 0,
                        0, -1, 2, 0, 0,
                        0, 0, 0, 1, 0})),
                new Filter("F12", new ColorMatrix(new float[]{ // TechColor mMatrix
                        1.9125277891456083f, -0.8545344976951645f, -0.09155508482755585f, 0, 11.793603434377337f,
                        -0.3087833385928097f, 1.7658908555458428f, -0.10601743074722245f, 0, -70.35205161461398f,
                        -0.231103377548616f, -0.7501899197440212f, 1.847597816108189f, 0, 30.950940869491138f,
                        0, 0, 0, 1, 0})),
                new Filter("F04", new ColorMatrix(new float[]{
                        1, 0, 0, 0.2f, 0,
                        0, 1, 0, 0, 0,
                        0, 0, 1, 0.2f, 0,
                        0, 0, 0, 1, 0})),
                new Filter("F05", new ColorMatrix(new float[]{
                        1, 0, 0, 0, 0,
                        0, 1.25f, 0, 0, 0,
                        0, 0, 0, 0.5f, 0,
                        0, 0, 0, 1, 0})),
                new Filter("F06", new ColorMatrix(new float[]{
                        1, 0, 0, 0, 0,
                        0, 0.5f, 0, 0, 0,
                        0, 0, 0, 0.5f, 0,
                        0, 0, 0, 1, 0})),
                new Filter("F07", new ColorMatrix(new float[]{
                        1, 0, 0, 0, 0,
                        0, 0, 0, 0, 0,
                        0, 0, 1, 1, 0,
                        0, 0, 0, 1, 0})),
                new Filter("F08", new ColorMatrix(new float[]{ // Polaroid mMatrix
                        1.438f, -0.062f, -0.062f, 0, 0,
                        -0.122f, 1.378f, -0.122f, 0, 0,
                        -0.016f, -0.016f, 1.483f, 0, 0,
                        0, 0, 0, 1, 0})),
                new Filter("F09", new ColorMatrix(new float[]{ // CodaChrome mMatrix
                        1.1285582396593525f, -0.3967382283601348f, -0.03992559172921793f, 0, 63.72958762196502f,
                        -0.16404339962244616f, 1.0835251566291304f, -0.05498805115633132f, 0, 24.732407896706203f,
                        -0.16786010706155763f, -0.5603416277695248f, 1.6014850761964943f, 0, 35.62982807460946f,
                        0, 0, 0, 1, 0})),

                new Filter("F10", new ColorMatrix(new float[]{ // LSD mMatrix
                        2, -0.4f, 0.5f, 0, 0,
                        -0.5f, 2, -0.4f, 0, 0,
                        -0.4f, -0.5f, 3, 0, 0,
                        0, 0, 0, 1, 0})),
                new Filter("F11", new ColorMatrix(new float[]{ // Vintage mMatrix
                        0.6279345635605994f, 0.3202183420819367f, -0.03965408211312453f, 0, 9.651285835294123f,
                        0.02578397704808868f, 0.6441188644374771f, 0.03259127616149294f, 0, 7.462829176470591f,
                        0.0466055556782719f, -0.0851232987247891f, 0.5241648018700465f, 0, 5.159190588235296f,
                        0, 0, 0, 1, 0})),
                new Filter("F13", new ColorMatrix(new float[]{ // Browni mMatrix
                        0.5997023498159715f, 0.34553243048391263f, -0.2708298674538042f, 0, 47.43192855600873f,
                        -0.037703249837783157f, 0.8609577587992641f, 0.15059552388459913f, 0, -36.96841498319127f,
                        0.24113635128153335f, -0.07441037908422492f, 0.44972182064877153f, 0, -7.562075277591283f,
                        0, 0, 0, 1, 0})),
                new Filter("BW01", new ColorMatrix(new float[]{
                        1, 0, 0, 0, 0,
                        1, 0, 0, 0, 0,
                        1, 0, 0, 0, 0,
                        0, 0, 0, 1, 0})),
                new Filter("BW02", new ColorMatrix(new float[]{
                        0, 1, 0, 0, 0,
                        0, 1, 0, 0, 0,
                        0, 1, 0, 0, 0,
                        0, 0, 0, 1, 0})),
                new Filter("BW03", new ColorMatrix(new float[]{
                        0, 0, 1, 0, 0,
                        0, 0, 1, 0, 0,
                        0, 0, 1, 0, 0,
                        0, 0, 0, 1, 0}))
        );
    }

    @Provides
    List<Adjust> provideAdjust() {
        return Arrays.asList(
                new Adjust(R.string.brightness, R.drawable.ic_brightness,
                        ImageAdjustmentFragment.newInstance(BRIGHTNESS)),
                new Adjust(R.string.contrast, R.drawable.ic_contrast,
                        ImageAdjustmentFragment.newInstance(CONTRAST)),
                new Adjust(R.string.saturation, R.drawable.ic_saturation,
                        ImageAdjustmentFragment.newInstance(SATURATION)),
                new Adjust(R.string.warmth, R.drawable.ic_warmth,
                        ImageAdjustmentFragment.newInstance(WARMTH))
                //  TODO: new Adjust(R.string.shadows, R.drawable.ic_shadows, ),
                // TODO: new Adjust(R.string.tint, R.drawable.ic_fade, TINT, ),
                // TODO: new Adjust(R.string.exposure, R.drawable.ic_exposure, EXPOSURE, ),
                // TODO: new Adjust(R.string.fade, R.drawable.ic_fade, )
        );
    }

    @Provides
    List<StickersSet> provideStickersSet() {
        return Arrays.asList(
                new StickersSet(R.string.emoji, R.drawable.s_emoji_02, getEmojiStickers()),
                new StickersSet(R.string.flags, R.drawable.s_flags, getFlagsStickers()),
                new StickersSet(R.string.christmas, R.drawable.s_christmas_01, getChristmasStickers()),
                new StickersSet(R.string.valentines_day, R.drawable.s_valentines_day_01, getValentinesDayStickers())
        );
    }

    @Provides
    List<Overlay> provideOverlays() {
        return Arrays.asList(
                new Overlay("D01", R.drawable.overlay_dust_02),
                new Overlay("D02", R.drawable.overlay_dust_03),
                new Overlay("FD01", R.drawable.overlay_fd_01),
                new Overlay("FD02", R.drawable.overlay_fd_02)
        );
    }

    @Provides
    List<Frame> provideFrames() {
        return Arrays.asList(
                new Frame("GRUNGE01", R.drawable.frame_grunge_01),
                new Frame("GRUNGE02", R.drawable.frame_grunge_02),
                new Frame("GRUNGE03", R.drawable.frame_grunge_03),
                new Frame("GRUNGE04", R.drawable.frame_grunge_04),
                new Frame("HL01", R.drawable.frame_h_01)
        );
    }

    @Provides
    List<Font> provideFonts() {
        return Arrays.asList(
                new Font("Souses", "Souses.otf"),
                new Font("Black Sword", "Blacksword.otf"),
                new Font("Summer Hearts", "SummerHearts-Regular.otf"),
                new Font("Cigarettes & Coffee", "CigarettesAndCoffee.ttf"),
                new Font("Abys", "Abys-Regular.otf"),
                new Font("Reis", "REIS-Regular.ttf"));
    }

    @Provides
    List<EditorColor> provideColors() {
        return Arrays.asList(
                new EditorColor(R.color.white),
                new EditorColor(R.color.black),
                new EditorColor(R.color.brown),
                new EditorColor(R.color.red),
                new EditorColor(R.color.crimson),
                new EditorColor(R.color.indian_red),
                new EditorColor(R.color.khaki),
                new EditorColor(R.color.yellow),
                new EditorColor(R.color.gold),
                new EditorColor(R.color.orange),
                new EditorColor(R.color.green_yellow),
                new EditorColor(R.color.spring_green),
                new EditorColor(R.color.lime),
                new EditorColor(R.color.olive_drab),
                new EditorColor(R.color.aqua),
                new EditorColor(R.color.sky_blue),
                new EditorColor(R.color.blue),
                new EditorColor(R.color.cyan),
                new EditorColor(R.color.magenta),
                new EditorColor(R.color.purple),
                new EditorColor(R.color.dark_violet),
                new EditorColor(R.color.indigo));
    }

    @Provides
    List<BrushSize> provideSizes() {
        return Arrays.asList(
                new BrushSize(5f),
                new BrushSize(7.5f),
                new BrushSize(10f),
                new BrushSize(12.5f),
                new BrushSize(15f),
                new BrushSize(17.5f),
                new BrushSize(20f),
                new BrushSize(22.5f),
                new BrushSize(25f),
                new BrushSize(27.5f)
        );
    }

    @Provides
    EditorFrame provideEditorFrame() {
        return new EditorFrame(App.getAppComponent().getContext());
    }

    private List<Sticker> getEmojiStickers() {
        return Arrays.asList(
                new Sticker(R.drawable.s_emoji_01),
                new Sticker(R.drawable.s_emoji_02),
                new Sticker(R.drawable.s_emoji_03),
                new Sticker(R.drawable.s_emoji_04),
                new Sticker(R.drawable.s_emoji_05),
                new Sticker(R.drawable.s_emoji_06),
                new Sticker(R.drawable.s_emoji_07));
    }

    private List<Sticker> getFlagsStickers() {
        return Arrays.asList(
                new Sticker(R.drawable.s_flag_01),
                new Sticker(R.drawable.s_flag_02),
                new Sticker(R.drawable.s_flag_03),
                new Sticker(R.drawable.s_flag_04),
                new Sticker(R.drawable.s_flag_05),
                new Sticker(R.drawable.s_flag_06));
    }

    private List<Sticker> getChristmasStickers() {
        return Arrays.asList(
                new Sticker(R.drawable.s_flag_01),
                new Sticker(R.drawable.s_flag_02),
                new Sticker(R.drawable.s_flag_03),
                new Sticker(R.drawable.s_flag_04),
                new Sticker(R.drawable.s_flag_05),
                new Sticker(R.drawable.s_flag_06));
    }

    private List<Sticker> getValentinesDayStickers() {
        return Arrays.asList(
                new Sticker(R.drawable.s_valentines_day_01),
                new Sticker(R.drawable.s_valentines_day_02),
                new Sticker(R.drawable.s_valentines_day_03),
                new Sticker(R.drawable.s_valentines_day_04));
    }
}

================================================
FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/graphics/CircleSizeDrawable.java
================================================
package net.iquesoft.iquephoto.graphics;

import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.ColorFilter;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.support.annotation.NonNull;

public class CircleSizeDrawable extends Drawable {
    private float mSize;

    private final Paint mPaint;

    public CircleSizeDrawable(final float size) {
        mSize = size;
        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        mPaint.setStrokeWidth(5f);
        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setColor(Color.GRAY);
    }

    @Override
    public void draw(@NonNull final Canvas canvas) {
        final Rect bounds = getBounds();
        canvas.drawCircle(bounds.centerX(), bounds.centerY(), mSize, mPaint);
    }

    @Override
    public void setAlpha(final int alpha) {
        mPaint.setAlpha(alpha);
    }

    @Override
    public void setColorFilter(final ColorFilter cf) {
        mPaint.setColorFilter(cf);
    }

    @Override
    public int getOpacity() {
        return PixelFormat.TRANSLUCENT;
    }

    public void setSelected(boolean isSelected) {
        if (isSelected) {
            mPaint.setColor(Color.RED);
        } else {
            mPaint.setColor(Color.GRAY);
        }

        invalidateSelf();
    }
}

================================================
FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/graphics/ColorCircleDrawable.java
================================================
package net.iquesoft.iquephoto.graphics;

import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.ColorFilter;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.support.annotation.NonNull;

public class ColorCircleDrawable extends Drawable {
    private boolean mIsSelected;

    private final Paint mPaint;
    private final Paint mColorPaint;

    public ColorCircleDrawable(final int color) {
        mColorPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        mColorPaint.setColor(color);

        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        mPaint.setColor(Color.LTGRAY);
        mPaint.setAlpha(155);
    }

    @Override
    public void draw(@NonNull final Canvas canvas) {
        //final int mRadius = 40;
        final Rect bounds = getBounds();

        if (mIsSelected) {
            canvas.drawCircle(bounds.centerX(), bounds.centerY(), bounds.height() / 2, mPaint);
        }

        canvas.drawCircle(bounds.centerX(), bounds.centerY(), bounds.height() / 3, mColorPaint);
    }

    @Override
    public void setAlpha(final int alpha) {
        mColorPaint.setAlpha(alpha);
    }

    @Override
    public void setColorFilter(final ColorFilter cf) {
        mColorPaint.setColorFilter(cf);
    }

    @Override
    public int getOpacity() {
        return PixelFormat.TRANSLUCENT;
    }

    public void setSelected(boolean isSelected) {
        mIsSelected = isSelected;

        invalidateSelf();
    }
}

================================================
FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/graphics/SquareFrameLayout.java
================================================
package net.iquesoft.iquephoto.graphics;

import android.content.Context;
import android.util.AttributeSet;
import android.widget.FrameLayout;

public class SquareFrameLayout extends FrameLayout {
    public SquareFrameLayout(Context context) {
        super(context);
    }

    public SquareFrameLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public SquareFrameLayout(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, widthMeasureSpec);
    }
}


================================================
FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/models/Adjust.java
================================================
package net.iquesoft.iquephoto.models;

import android.support.annotation.DrawableRes;
import android.support.annotation.NonNull;
import android.support.annotation.StringRes;
import android.support.v4.app.Fragment;

public class Adjust {
    @StringRes
    private int mTitle;

    @DrawableRes
    private int mIcon;

    private Fragment mFragment;

    public Adjust(@StringRes int title, @DrawableRes int icon, @NonNull Fragment fragment) {
        mTitle = title;
        mIcon = icon;
        mFragment = fragment;
    }

    public int getTitle() {
        return mTitle;
    }

    public int getIcon() {
        return mIcon;
    }

    public Fragment getFragment() {
        return mFragment;
    }
}

================================================
FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/models/BrushSize.java
================================================
package net.iquesoft.iquephoto.models;

public class BrushSize {
    private float mSize;

    public BrushSize(float size) {
        mSize = size;
    }

    public float getSize() {
        return mSize;
    }
}

================================================
FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/models/EditorColor.java
================================================
package net.iquesoft.iquephoto.models;

import android.support.annotation.ColorRes;

import net.iquesoft.iquephoto.R;

import java.util.Arrays;
import java.util.List;

public class EditorColor {
    @ColorRes
    private int mColor;

    public static List<EditorColor> getColorsList() {
        return Arrays.asList(editorColors);
    }

    private static EditorColor[] editorColors = {
            new EditorColor(R.color.brown),
            new EditorColor(R.color.red),
            new EditorColor(R.color.crimson),
            new EditorColor(R.color.indian_red),
            new EditorColor(R.color.khaki),
            new EditorColor(R.color.yellow),
            new EditorColor(R.color.gold),
            new EditorColor(R.color.orange),
            new EditorColor(R.color.green_yellow),
            new EditorColor(R.color.spring_green),
            new EditorColor(R.color.lime),
            new EditorColor(R.color.olive_drab),
            new EditorColor(R.color.aqua),
            new EditorColor(R.color.sky_blue),
            new EditorColor(R.color.blue),
            new EditorColor(R.color.cyan),
            new EditorColor(R.color.magenta),
            new EditorColor(R.color.purple),
            new EditorColor(R.color.dark_violet),
            new EditorColor(R.color.indigo)

    };

    public EditorColor(@ColorRes int color) {
        mColor = color;
    }

    public int getColor() {
        return mColor;
    }
}

================================================
FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/models/Filter.java
================================================
package net.iquesoft.iquephoto.models;

import android.graphics.ColorMatrix;

public class Filter {
    private String mTitle;
    private ColorMatrix mColorMatrix;

    public Filter(String title, ColorMatrix colorMatrix) {
        mTitle = title;
        mColorMatrix = colorMatrix;
    }

    public String getTitle() {
        return mTitle;
    }

    public ColorMatrix getColorMatrix() {
        return mColorMatrix;
    }
}

================================================
FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/models/Font.java
================================================
package net.iquesoft.iquephoto.models;

public class Font {
    private String mTitle;
    private String mPath;

    public Font(String title, String path) {
        mTitle = title;
        mPath = path;
    }

    public String getTitle() {
        return mTitle;
    }

    public String getPath() {
        return "fonts/" + mPath;
    }
}

================================================
FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/models/Frame.java
================================================
package net.iquesoft.iquephoto.models;

import android.support.annotation.DrawableRes;

public class Frame {
    private String mTitle;

    @DrawableRes
    private int mImage;

    public Frame(String title, @DrawableRes int image) {
        mTitle = title;
        mImage = image;
    }

    public String getTitle() {
        return mTitle;
    }

    public int getImage() {
        return mImage;
    }
}

================================================
FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/models/Image.java
================================================
package net.iquesoft.iquephoto.models;

import android.os.Parcel;
import android.os.Parcelable;

public class Image implements Parcelable {
    private int mId;
    private String mPath;

    public Image(int id, String path) {
        mId = id;
        mPath = path;
    }

    public int getId() {
        return mId;
    }

    public String getPath() {
        return mPath;
    }

    protected Image(Parcel in) {
        mId = in.readInt();
        mPath = in.readString();
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(mId);
        dest.writeString(mPath);
    }

    public static final Parcelable.Creator<Image> CREATOR = new Parcelable.Creator<Image>() {
        @Override
        public Image createFromParcel(Parcel in) {
            return new Image(in);
        }

        @Override
        public Image[] newArray(int size) {
            return new Image[size];
        }
    };
}

================================================
FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/models/ImageAlbum.java
================================================
package net.iquesoft.iquephoto.models;

import java.util.ArrayList;

public class ImageAlbum {

    private String mName;
    private ArrayList<Image> mImages;// = new ArrayList<>();

    public ImageAlbum(String name) {
        mName = name;
        mImages = new ArrayList<>();
    }

    public String getName() {
        return mName;
    }

    public ArrayList<Image> getImages() {
        return mImages;
    }
}

================================================
FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/models/Overlay.java
================================================
package net.iquesoft.iquephoto.models;

import android.support.annotation.DrawableRes;

public class Overlay {
    private String mTitle;

    @DrawableRes
    private int mImage;

    public Overlay(String title, @DrawableRes int image) {
        mTitle = title;
        mImage = image;
    }

    public String getTitle() {
        return mTitle;
    }

    public int getImage() {
        return mImage;
    }
}

================================================
FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/models/ParcelablePaint.java
================================================
package net.iquesoft.iquephoto.models;

import android.graphics.Paint;
import android.os.Parcel;
import android.os.Parcelable;
import android.support.annotation.IntRange;
import android.support.annotation.NonNull;

public class ParcelablePaint implements Parcelable {
    private Paint mPaint;

    public ParcelablePaint(@NonNull Paint paint) {
        mPaint = paint;
    }

    public Paint getPaint() {
        return mPaint;
    }

    public void setAlpha(@IntRange(from = 0, to = 255) int value) {
        mPaint.setAlpha(value);
    }

    protected ParcelablePaint(Parcel in) {
        mPaint = (Paint) in.readValue(Paint.class.getClassLoader());
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeValue(mPaint);
    }

    public static final Parcelable.Creator<ParcelablePaint> CREATOR = new Parcelable.Creator<ParcelablePaint>() {
        @Override
        public ParcelablePaint createFromParcel(Parcel in) {
            return new ParcelablePaint(in);
        }

        @Override
        public ParcelablePaint[] newArray(int size) {
            return new ParcelablePaint[size];
        }
    };
}

================================================
FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/models/Sticker.java
================================================
package net.iquesoft.iquephoto.models;

import android.os.Parcel;
import android.os.Parcelable;
import android.support.annotation.DrawableRes;

public class Sticker implements Parcelable {
    @DrawableRes
    private int mImage;

    public Sticker(@DrawableRes int image) {
        mImage = image;
    }

    public int getImage() {
        return mImage;
    }

    public void setImage(int image) {
        mImage = image;
    }

    protected Sticker(Parcel in) {
        mImage = in.readInt();
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel parcel, int i) {
        parcel.writeInt(mImage);
    }

    public static final Parcelable.Creator<Sticker> CREATOR = new Parcelable.Creator<Sticker>() {
        @Override
        public Sticker createFromParcel(Parcel in) {
            return new Sticker(in);
        }

        @Override
        public Sticker[] newArray(int size) {
            return new Sticker[size];
        }
    };
}

================================================
FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/models/StickersSet.java
================================================
package net.iquesoft.iquephoto.models;

import android.support.annotation.DrawableRes;
import android.support.annotation.StringRes;

import java.util.List;

public class StickersSet {
    @StringRes
    private int mTitle;

    @DrawableRes
    private int mIcon;

    private List<Sticker> mStickers;

    public StickersSet(@StringRes int title, @DrawableRes int icon, List<Sticker> stickers) {
        mTitle = title;
        mIcon = icon;
        mStickers = stickers;
    }

    public List<Sticker> getStickers() {
        return mStickers;
    }

    public int getTitle() {
        return mTitle;
    }

    public int getIcon() {
        return mIcon;
    }
}

================================================
FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/models/Text.java
================================================
package net.iquesoft.iquephoto.models;

import android.graphics.Typeface;

public class Text {
    private String mText;
    private Typeface mTypeface;
    private int mColor;

    public Text(String text, Typeface typeface, int color) {
        mText = text;
        mTypeface = typeface;
        mColor = color;
    }

    public String getText() {
        return mText;
    }

    public void setText(String text) {
        mText = text;
    }

    public Typeface getTypeface() {
        return mTypeface;
    }

    public void setTypeface(Typeface typeface) {
        mTypeface = typeface;
    }

    public int getColor() {
        return mColor;
    }

    public void setColor(int color) {
        mColor = color;
    }
}

================================================
FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/models/Tool.java
================================================
package net.iquesoft.iquephoto.models;

import android.support.annotation.DrawableRes;
import android.support.annotation.NonNull;
import android.support.annotation.StringRes;
import android.support.v4.app.Fragment;

public class Tool {
    @StringRes
    private int mTitle;

    @DrawableRes
    private int mIcon;

    private Fragment mFragment;

    public Tool(@StringRes int title, @DrawableRes int icon, @NonNull Fragment fragment) {
        mTitle = title;
        mIcon = icon;
        mFragment = fragment;
    }

    public int getIcon() {
        return mIcon;
    }

    public int getTitle() {
        return mTitle;
    }

    public Fragment getFragment() {
        return mFragment;
    }
}

================================================
FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/presenters/activity/EditorActivityPresenter.java
================================================
package net.iquesoft.iquephoto.presentation.presenters.activity;

import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.net.Uri;
import android.provider.MediaStore;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;

import com.arellomobile.mvp.InjectViewState;
import com.arellomobile.mvp.MvpPresenter;

import net.iquesoft.iquephoto.R;
import net.iquesoft.iquephoto.presentation.views.activity.EditorActivityView;
import net.iquesoft.iquephoto.tasks.ImageSaveTask;
import net.iquesoft.iquephoto.utils.LogHelper;

import java.io.IOException;

@InjectViewState
public class EditorActivityPresenter extends MvpPresenter<EditorActivityView> {
    public static final String INSTAGRAM_PACKAGE_NAME = "com.instagram.android";
    public static final String FACEBOOK_PACKAGE_NAME = "com.facebook.katana";

    private Uri mUri;

    private Bitmap mBitmap;

    private Context mContext;

    public EditorActivityPresenter(@NonNull Context context, @NonNull Intent intent) {
        mContext = context;

        try {
            mUri = intent.getData();

            mBitmap = MediaStore.Images.Media.getBitmap(
                    context.getContentResolver(), mUri
            );

            LogHelper.logBitmap("Cropped Bitmap", mBitmap);

            getViewState().startEditing(mBitmap);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void onBackPressed(@NonNull Bitmap alteredBitmap) {
        if (!mBitmap.sameAs(alteredBitmap)) {
            getViewState().showAlertDialog();
        } else {
            getViewState().navigateBack(false);
        }
    }

    public void setAlteredImageUri(@NonNull Uri uri) {
        mUri = uri;
    }

    public void save(@NonNull Bitmap bitmap) {
        new ImageSaveTask(mContext, bitmap).execute();
    }

    public void share(@Nullable String packageName) {
        if (isApplicationExist(mContext, packageName)) {
            getViewState().share(mUri, packageName);
        } else {
            switch (packageName) {
                case INSTAGRAM_PACKAGE_NAME:
                    getViewState().
                            showApplicationNotExistAlertDialog(R.string.instagram_alert, packageName);
                    break;
                case FACEBOOK_PACKAGE_NAME:
                    getViewState().
                            showApplicationNotExistAlertDialog(R.string.facebook_alert, packageName);
                    break;
            }
        }
    }

    private boolean isApplicationExist(Context context, @Nullable String packageName) {
        if (packageName == null) {
            return true;
        } else {
            try {
                context.getPackageManager().getApplicationInfo(packageName, 0);
                return true;
            } catch (PackageManager.NameNotFoundException e) {
                return false;
            }
        }
    }
}

================================================
FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/presenters/activity/GalleryActivityPresenter.java
================================================
package net.iquesoft.iquephoto.presentation.presenters.activity;

import com.arellomobile.mvp.InjectViewState;
import com.arellomobile.mvp.MvpPresenter;

import net.iquesoft.iquephoto.presentation.views.activity.GalleryView;

@InjectViewState
public class GalleryActivityPresenter extends MvpPresenter<GalleryView> {

    /*public void onBackPressed(RecyclerView recyclerView) {
        Object object = recyclerView.getAdapter();

        if (object != null) {
            String classSimpleName = object.getClass().getSimpleName();
            if (classSimpleName.equalsIgnoreCase(ImageAlbumsAdapter.class.getSimpleName()))
                getViewState().navigateBack();
            else
                getViewState.showFolders();
        } else
            getViewState.navigateBack();
    }*/
}


================================================
FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/presenters/activity/HomeActivityPresenter.java
================================================
package net.iquesoft.iquephoto.presentation.presenters.activity;

import android.annotation.SuppressLint;
import android.content.Context;
import android.net.Uri;
import android.os.Environment;
import android.support.annotation.NonNull;
import android.support.v4.content.FileProvider;

import com.arellomobile.mvp.InjectViewState;
import com.arellomobile.mvp.MvpPresenter;
import com.tbruyelle.rxpermissions.RxPermissions;

import net.iquesoft.iquephoto.R;
import net.iquesoft.iquephoto.presentation.views.activity.HomeView;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import static android.Manifest.permission.CAMERA;
import static android.Manifest.permission.READ_EXTERNAL_STORAGE;
import static android.app.Activity.RESULT_OK;
import static net.iquesoft.iquephoto.ui.activities.HomeActivity.REQ_CAMERA;

@InjectViewState
public class HomeActivityPresenter extends MvpPresenter<HomeView> {
    private String mCurrentPhotoPath;

    public void openCamera(@NonNull Context context) {
        checkPermission(context, CAMERA);
    }

    public void openGallery(@NonNull Context context) {
        checkPermission(context, READ_EXTERNAL_STORAGE);
    }

    public void startEditing(int requestCode, int resultCode) {
        if (requestCode == REQ_CAMERA && resultCode == RESULT_OK) {
            getViewState().startEditing(mCurrentPhotoPath);
        }
    }

    private void checkPermission(Context context, String permission) {
        RxPermissions.getInstance(context)
                .request(permission)
                .subscribe(granted -> {
                            if (granted) {
                                switch (permission) {
                                    case CAMERA:
                                        startCamera(context);
                                        break;
                                    case READ_EXTERNAL_STORAGE:
                                        getViewState().startGallery();
                                        break;
                                }
                            } else {
                                switch (permission) {
                                    case CAMERA:
                                        getViewState()
                                                .showPermissionDenied(R.string.camera_permission);
                                        break;
                                    case READ_EXTERNAL_STORAGE:
                                        getViewState()
                                                .showPermissionDenied(R.string.read_storage_permission);
                                        break;
                                }
                            }
                        }
                );
    }

    private void startCamera(Context context) {
        File photoFile = null;
        try {
            photoFile = createImageFile(context);
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        if (photoFile != null) {
            Uri photoURI = FileProvider.getUriForFile(context,
                    "net.iquesoft.iquephoto.provider",
                    photoFile);

            getViewState().startCamera(photoURI);
        }
    }

    private File createImageFile(Context context) throws IOException {
        @SuppressLint("SimpleDateFormat")
        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
        String imageFileName = "JPEG_" + timeStamp + "_";
        File storageDir = context.getExternalFilesDir(Environment.DIRECTORY_PICTURES);
        File image = File.createTempFile(
                imageFileName,  /* prefix */
                ".jpg",         /* suffix */
                storageDir      /* directory */
        );

        mCurrentPhotoPath = image.getAbsolutePath();

        return image;
    }
}

================================================
FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/presenters/activity/PreviewActivityPresenter.java
================================================
package net.iquesoft.iquephoto.presentation.presenters.activity;

import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.support.annotation.NonNull;
import android.support.design.widget.TabLayout;
import android.util.DisplayMetrics;

import com.arellomobile.mvp.InjectViewState;
import com.arellomobile.mvp.MvpPresenter;
import com.isseiaoki.simplecropview.CropImageView;
import com.isseiaoki.simplecropview.callback.CropCallback;
import com.isseiaoki.simplecropview.callback.SaveCallback;

import net.iquesoft.iquephoto.R;
import net.iquesoft.iquephoto.presentation.views.activity.PreviewView;
import net.iquesoft.iquephoto.tasks.DecodeScaledImageAsyncTask;
import net.iquesoft.iquephoto.ui.activities.PreviewActivity;

import static com.isseiaoki.simplecropview.CropImageView.CropMode.*;
import static net.iquesoft.iquephoto.tasks.DecodeScaledImageAsyncTask.*;

@InjectViewState
public class PreviewActivityPresenter extends MvpPresenter<PreviewView> {
    public PreviewActivityPresenter(@NonNull Context context, @NonNull Intent intent) {
        DecodeScaledImageAsyncTask decodeScaledImageAsyncTask =
                new DecodeScaledImageAsyncTask(context);
        decodeScaledImageAsyncTask.setProgressListener(new OnProgressListener() {
            @Override
            public void onStarted() {
                getViewState().showProgress();
            }

            @Override
            public void onFinished(Bitmap bitmap) {
                getViewState().setupImage(bitmap);
            }
        });
        decodeScaledImageAsyncTask.execute(intent.getStringExtra(PreviewActivity.IMAGE_PATH));

        initCropModes();
    }

    private static final int[] CROP_MODES = {
            R.string.crop_free,
            R.string.crop_original,
            R.string.crop_square,
            R.string.crop_3_4,
            R.string.crop_4_3,
            R.string.crop_9_16,
            R.string.crop_16_9
    };

    private CropCallback cropCallback = new CropCallback() {
        @Override
        public void onSuccess(Bitmap cropped) {

        }

        @Override
        public void onError() {

        }
    };

    private SaveCallback saveCallback = new SaveCallback() {
        @Override
        public void onSuccess(Uri outputUri) {
            getViewState().startEditingImage(outputUri);
            getViewState().dismissProgress();
        }

        @Override
        public void onError() {

        }
    };

    private void initCropModes() {
        for (int i = 0; i < CROP_MODES.length; i++) {
            if (i == 0) getViewState().createTab(CROP_MODES[i], true);
            else getViewState().createTab(CROP_MODES[i], false);
        }
    }

    public void changeCropMode(@NonNull TabLayout.Tab tab) {
        CropImageView.CropMode cropMode = FREE;

        switch (tab.getPosition()) {
            case 0:
                cropMode = FREE;
                break;
            case 1:
                cropMode = FIT_IMAGE;
                break;
            case 2:
                cropMode = SQUARE;
                break;
            case 3:
                cropMode = RATIO_3_4;
                break;
            case 4:
                cropMode = RATIO_4_3;
                break;
            case 5:
                cropMode = RATIO_9_16;
                break;
            case 6:
                cropMode = RATIO_16_9;
                break;
        }

        getViewState().onCropModeChanged(cropMode);
    }

    public void cropImage(Uri uri, CropImageView cropImageView) {
        getViewState().showProgress();
        cropImageView.startCrop(uri, cropCallback, saveCallback);
    }

    public void flipImageHorizontal(Bitmap bitmap) {
        Matrix matrix = new Matrix();
        matrix.preScale(-1, 1);

        Bitmap flippedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, false);
        if (flippedBitmap != null) {
            flippedBitmap.setDensity(DisplayMetrics.DENSITY_DEFAULT);
            Drawable drawable = new BitmapDrawable(flippedBitmap);
            getViewState().flipImage(drawable);
        }
    }

    public void flipImageVertical(Bitmap bitmap) {
        Matrix matrix = new Matrix();
        matrix.preScale(1, -1);

        Bitmap flippedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, false);
        if (flippedBitmap != null) {
            flippedBitmap.setDensity(DisplayMetrics.DENSITY_DEFAULT);
            Drawable drawable = new BitmapDrawable(flippedBitmap);
            getViewState().flipImage(drawable);
        }
    }
}

================================================
FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/presenters/fragment/AddTextPresenter.java
================================================
package net.iquesoft.iquephoto.presentation.presenters.fragment;

import android.content.Context;
import android.graphics.Typeface;
import android.support.annotation.NonNull;
import android.support.v4.content.res.ResourcesCompat;

import com.arellomobile.mvp.InjectViewState;
import com.arellomobile.mvp.MvpPresenter;

import net.iquesoft.iquephoto.R;
import net.iquesoft.iquephoto.models.EditorColor;
import net.iquesoft.iquephoto.models.Text;
import net.iquesoft.iquephoto.presentation.views.fragment.AddTextView;

@InjectViewState
public class AddTextPresenter extends MvpPresenter<AddTextView> {
    public void changeTextColor(@NonNull Context context, EditorColor editorColor) {
        int color = ResourcesCompat.getColor(context.getResources(), editorColor.getColor(), null);
    }

    public void addText(String text, Typeface typeface, int color) {
        if (!text.isEmpty()) {
            Text texts = new Text(text, typeface, color);
            getViewState().addText(texts);
        } else
            getViewState().showToastMessage(R.string.text_is_empty);
    }
}

================================================
FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/presenters/fragment/AdjustPresenter.java
================================================
package net.iquesoft.iquephoto.presentation.presenters.fragment;

import com.arellomobile.mvp.InjectViewState;
import com.arellomobile.mvp.MvpPresenter;

import net.iquesoft.iquephoto.App;
import net.iquesoft.iquephoto.models.Adjust;
import net.iquesoft.iquephoto.presentation.views.fragment.AdjustView;

import java.util.List;

import javax.inject.Inject;

import dagger.Lazy;

@InjectViewState
public class AdjustPresenter extends MvpPresenter<AdjustView> {
    @Inject
    Lazy<List<Adjust>> mAdjusts;

    public AdjustPresenter() {
        App.getAppComponent().inject(this);
        getViewState().setupAdapter(mAdjusts.get());
    }

    public void changeAdjust(Adjust adjust) {
        getViewState().adjustChanged(adjust.getFragment());
    }
}

================================================
FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/presenters/fragment/ColorsPresenter.java
================================================
package net.iquesoft.iquephoto.presentation.presenters.fragment;

import com.arellomobile.mvp.InjectViewState;
import com.arellomobile.mvp.MvpPresenter;

import net.iquesoft.iquephoto.App;
import net.iquesoft.iquephoto.models.EditorColor;
import net.iquesoft.iquephoto.presentation.views.fragment.ColorsView;

import java.util.List;

import javax.inject.Inject;

@InjectViewState
public class ColorsPresenter extends MvpPresenter<ColorsView> {
    @Inject
    List<EditorColor> mColors;

    public ColorsPresenter() {
        App.getAppComponent().inject(this);

        getViewState().setupAdapter(mColors);
    }

}

================================================
FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/presenters/fragment/DrawingPresenter.java
================================================
package net.iquesoft.iquephoto.presentation.presenters.fragment;

import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v4.content.res.ResourcesCompat;

import com.arellomobile.mvp.InjectViewState;
import com.arellomobile.mvp.MvpPresenter;

import net.iquesoft.iquephoto.App;
import net.iquesoft.iquephoto.models.BrushSize;
import net.iquesoft.iquephoto.models.EditorColor;
import net.iquesoft.iquephoto.presentation.views.fragment.DrawingView;

import java.util.List;

import javax.inject.Inject;

import dagger.Lazy;

@InjectViewState
public class DrawingPresenter extends MvpPresenter<DrawingView> {
    @Inject
    Lazy<List<BrushSize>> mSizes;

    @Inject
    Lazy<List<EditorColor>> mColors;

    public DrawingPresenter() {
        App.getAppComponent().inject(this);

        getViewState().setupSizesAdapter(mSizes.get());
        getViewState().setupColorsAdapter(mColors.get());
    }

    public void changeBrushColor(@NonNull Context context, EditorColor editorColor) {
        int color = ResourcesCompat.getColor(context.getResources(), editorColor.getColor(), null);

        getViewState().onBrushColorChanged(color);
    }
}

================================================
FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/presenters/fragment/FiltersPresenter.java
================================================
package net.iquesoft.iquephoto.presentation.presenters.fragment;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Paint;
import android.net.Uri;
import android.support.annotation.NonNull;

import com.arellomobile.mvp.InjectViewState;
import com.arellomobile.mvp.MvpPresenter;

import net.iquesoft.iquephoto.App;
import net.iquesoft.iquephoto.models.Filter;
import net.iquesoft.iquephoto.presentation.views.fragment.FiltersView;
import net.iquesoft.iquephoto.ui.fragments.TransparencyFragment;
import net.iquesoft.iquephoto.utils.BitmapUtil;

import java.util.List;

import javax.inject.Inject;

import dagger.Lazy;

@InjectViewState
public class FiltersPresenter extends MvpPresenter<FiltersView> {
    @Inject
    Lazy<List<Filter>> mFilters;

    public FiltersPresenter(@NonNull Context context, @NonNull Bitmap bitmap) {
        App.getAppComponent().inject(this);

        Uri uri = BitmapUtil.getUriOfBitmap(context, bitmap);

        getViewState().setupFiltersAdapter(uri, mFilters.get());
    }

    public void changeFilter(@NonNull Filter filter) {
        getViewState().filterChanged(filter.getColorMatrix());
    }

    public void changeFilterIntensity(@NonNull Paint filterPaint) {
        getViewState().onChangeFilterIntensityClicked(
                TransparencyFragment.newInstance(filterPaint)
        );
    }
}

================================================
FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/presenters/fragment/FontsPresenter.java
================================================
package net.iquesoft.iquephoto.presentation.presenters.fragment;

import com.arellomobile.mvp.InjectViewState;
import com.arellomobile.mvp.MvpPresenter;

import net.iquesoft.iquephoto.App;
import net.iquesoft.iquephoto.models.Font;
import net.iquesoft.iquephoto.presentation.views.fragment.FontsView;

import java.util.List;

import javax.inject.Inject;

@InjectViewState
public class FontsPresenter extends MvpPresenter<FontsView> {
    @Inject
    List<Font> mFonts;

    public FontsPresenter() {
        App.getAppComponent().inject(this);

        getViewState().setupAdapter(mFonts);
    }

}


================================================
FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/presenters/fragment/FramesPresenter.java
================================================
package net.iquesoft.iquephoto.presentation.presenters.fragment;

import android.content.Context;
import android.graphics.Bitmap;
import android.support.annotation.NonNull;

import com.arellomobile.mvp.InjectViewState;
import com.arellomobile.mvp.MvpPresenter;

import net.iquesoft.iquephoto.App;
import net.iquesoft.iquephoto.models.Frame;
import net.iquesoft.iquephoto.presentation.views.fragment.FramesView;
import net.iquesoft.iquephoto.utils.BitmapUtil;

import java.util.List;

import javax.inject.Inject;

import dagger.Lazy;

@InjectViewState
public class FramesPresenter extends MvpPresenter<FramesView> {
    @Inject
    Lazy<List<Frame>> mFrames;

    public FramesPresenter() {
        App.getAppComponent().inject(this);
        getViewState().setupAdapter(mFrames.get());
    }

    public void changeOverlay(@NonNull Context context, Frame frame) {
        Bitmap bitmap = BitmapUtil.drawable2Bitmap(context, frame.getImage());

        getViewState().onFrameChanged(bitmap);
    }
}

================================================
FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/presenters/fragment/GalleryAlbumsPresenter.java
================================================
package net.iquesoft.iquephoto.presentation.presenters.fragment;

import android.content.Context;

import com.arellomobile.mvp.InjectViewState;
import com.arellomobile.mvp.MvpPresenter;

import net.iquesoft.iquephoto.presentation.views.fragment.GalleryAlbumsView;
import net.iquesoft.iquephoto.tasks.ImageFetchTask;

@InjectViewState
public class GalleryAlbumsPresenter extends MvpPresenter<GalleryAlbumsView> {
    public void fetchImages(Context context) {
        ImageFetchTask imageFetchTask = new ImageFetchTask(context);
        imageFetchTask.setOnImageLoadedListener(albums -> {
            if (albums != null) {
                getViewState().setupAdapter(albums);
            } else {
                getViewState().showNoImages();
            }
        });
        imageFetchTask.execute();
    }
}

================================================
FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/presenters/fragment/GalleryImagesPresenter.java
================================================
package net.iquesoft.iquephoto.presentation.presenters.fragment;

import android.os.Bundle;
import android.support.annotation.NonNull;

import com.arellomobile.mvp.InjectViewState;
import com.arellomobile.mvp.MvpPresenter;

import net.iquesoft.iquephoto.models.Image;
import net.iquesoft.iquephoto.presentation.views.fragment.GalleryImagesView;
import net.iquesoft.iquephoto.ui.fragments.GalleryImagesFragment;

@InjectViewState
public class GalleryImagesPresenter extends MvpPresenter<GalleryImagesView> {
    public GalleryImagesPresenter(@NonNull Bundle bundle) {
        setupAlbumImages(bundle);
    }

    private void setupAlbumImages(Bundle bundle) {
        if (bundle != null) {
            getViewState().setupAdapter(
                    bundle.getParcelableArrayList(GalleryImagesFragment.ARG_PARAM)
            );
        }
    }

    public void setImageForEdit(Image image) {
        getViewState().editImage(image.getPath());
    }
}

================================================
FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/presenters/fragment/ImageAdjustmentPresenter.java
================================================
package net.iquesoft.iquephoto.presentation.presenters.fragment;

import android.os.Bundle;
import android.support.annotation.NonNull;
import android.util.Log;

import com.arellomobile.mvp.InjectViewState;
import com.arellomobile.mvp.MvpPresenter;

import net.iquesoft.iquephoto.R;
import net.iquesoft.iquephoto.core.enums.EditorTool;
import net.iquesoft.iquephoto.presentation.views.fragment.ImageAdjustmentView;
import net.iquesoft.iquephoto.ui.fragments.ImageAdjustmentFragment;

import static net.iquesoft.iquephoto.core.enums.EditorTool.NONE;

@InjectViewState
public class ImageAdjustmentPresenter extends MvpPresenter<ImageAdjustmentView> {
    private EditorTool mCurrentCommand = NONE;

    public ImageAdjustmentPresenter(@NonNull Bundle bundle) {
        mCurrentCommand =
                (EditorTool) bundle.getSerializable(ImageAdjustmentFragment.ARG_PARAM);

        assert mCurrentCommand != null;
        Log.i("ImageAdjustment", "Current tool = " + mCurrentCommand.name());

        setupSlider();
    }

    public void onResume() {
        switch (mCu
Download .txt
gitextract_crye9wp4/

├── README.md
└── iQuePhoto/
    ├── .gitignore
    ├── .idea/
    │   ├── compiler.xml
    │   ├── copyright/
    │   │   └── profiles_settings.xml
    │   ├── dictionaries/
    │   │   └── Sergey.xml
    │   ├── gradle.xml
    │   ├── misc.xml
    │   ├── modules.xml
    │   ├── runConfigurations.xml
    │   └── vcs.xml
    ├── app/
    │   ├── .gitignore
    │   ├── build.gradle
    │   ├── proguard-rules.pro
    │   └── src/
    │       ├── androidTest/
    │       │   └── java/
    │       │       └── net/
    │       │           └── iquesoft/
    │       │               └── iquephoto/
    │       │                   └── ApplicationTest.java
    │       ├── main/
    │       │   ├── AndroidManifest.xml
    │       │   ├── assets/
    │       │   │   └── fonts/
    │       │   │       ├── Abys-Regular.otf
    │       │   │       ├── Blacksword.otf
    │       │   │       ├── Souses.otf
    │       │   │       └── SummerHearts-Regular.otf
    │       │   ├── java/
    │       │   │   └── net/
    │       │   │       └── iquesoft/
    │       │   │           └── iquephoto/
    │       │   │               ├── App.java
    │       │   │               ├── adapters/
    │       │   │               │   ├── AdjustAdapter.java
    │       │   │               │   ├── ColorAdapter.java
    │       │   │               │   ├── FiltersAdapter.java
    │       │   │               │   ├── FontsAdapter.java
    │       │   │               │   ├── FramesAdapter.java
    │       │   │               │   ├── ImageAlbumsAdapter.java
    │       │   │               │   ├── ImagesAdapter.java
    │       │   │               │   ├── OverlaysAdapter.java
    │       │   │               │   ├── SizesAdapter.java
    │       │   │               │   ├── StickerSetAdapter.java
    │       │   │               │   ├── StickersAdapter.java
    │       │   │               │   └── ToolsAdapter.java
    │       │   │               ├── core/
    │       │   │               │   ├── EditorListener.java
    │       │   │               │   ├── EditorView.java
    │       │   │               │   ├── ImageEditorView.java
    │       │   │               │   ├── ImageEditorViewPresenter.java
    │       │   │               │   ├── enums/
    │       │   │               │   │   ├── EditorMode.java
    │       │   │               │   │   └── EditorTool.java
    │       │   │               │   └── model/
    │       │   │               │       ├── Drawing.java
    │       │   │               │       ├── EditorFrame.java
    │       │   │               │       ├── EditorImage.java
    │       │   │               │       ├── EditorLinearTiltShift.java
    │       │   │               │       ├── EditorRadialTiltShift.java
    │       │   │               │       ├── EditorSticker.java
    │       │   │               │       ├── EditorText.java
    │       │   │               │       ├── EditorTiltShift.java
    │       │   │               │       └── EditorVignette.java
    │       │   │               ├── di/
    │       │   │               │   ├── AppComponent.java
    │       │   │               │   └── modules/
    │       │   │               │       ├── AppModule.java
    │       │   │               │       └── EditorModule.java
    │       │   │               ├── graphics/
    │       │   │               │   ├── CircleSizeDrawable.java
    │       │   │               │   ├── ColorCircleDrawable.java
    │       │   │               │   └── SquareFrameLayout.java
    │       │   │               ├── models/
    │       │   │               │   ├── Adjust.java
    │       │   │               │   ├── BrushSize.java
    │       │   │               │   ├── EditorColor.java
    │       │   │               │   ├── Filter.java
    │       │   │               │   ├── Font.java
    │       │   │               │   ├── Frame.java
    │       │   │               │   ├── Image.java
    │       │   │               │   ├── ImageAlbum.java
    │       │   │               │   ├── Overlay.java
    │       │   │               │   ├── ParcelablePaint.java
    │       │   │               │   ├── Sticker.java
    │       │   │               │   ├── StickersSet.java
    │       │   │               │   ├── Text.java
    │       │   │               │   └── Tool.java
    │       │   │               ├── presentation/
    │       │   │               │   ├── presenters/
    │       │   │               │   │   ├── activity/
    │       │   │               │   │   │   ├── EditorActivityPresenter.java
    │       │   │               │   │   │   ├── GalleryActivityPresenter.java
    │       │   │               │   │   │   ├── HomeActivityPresenter.java
    │       │   │               │   │   │   └── PreviewActivityPresenter.java
    │       │   │               │   │   └── fragment/
    │       │   │               │   │       ├── AddTextPresenter.java
    │       │   │               │   │       ├── AdjustPresenter.java
    │       │   │               │   │       ├── ColorsPresenter.java
    │       │   │               │   │       ├── DrawingPresenter.java
    │       │   │               │   │       ├── FiltersPresenter.java
    │       │   │               │   │       ├── FontsPresenter.java
    │       │   │               │   │       ├── FramesPresenter.java
    │       │   │               │   │       ├── GalleryAlbumsPresenter.java
    │       │   │               │   │       ├── GalleryImagesPresenter.java
    │       │   │               │   │       ├── ImageAdjustmentPresenter.java
    │       │   │               │   │       ├── OverlaysPresenter.java
    │       │   │               │   │       ├── StickersPresenter.java
    │       │   │               │   │       ├── StickersSetPresenter.java
    │       │   │               │   │       ├── TiltShiftFragmentPresenter.java
    │       │   │               │   │       ├── ToolsPresenter.java
    │       │   │               │   │       ├── TransformPresenter.java
    │       │   │               │   │       └── TransparencyPresenter.java
    │       │   │               │   └── views/
    │       │   │               │       ├── activity/
    │       │   │               │       │   ├── CameraActivityView.java
    │       │   │               │       │   ├── EditorActivityView.java
    │       │   │               │       │   ├── GalleryView.java
    │       │   │               │       │   ├── HomeView.java
    │       │   │               │       │   └── PreviewView.java
    │       │   │               │       └── fragment/
    │       │   │               │           ├── AddTextView.java
    │       │   │               │           ├── AdjustView.java
    │       │   │               │           ├── ColorsView.java
    │       │   │               │           ├── DrawingView.java
    │       │   │               │           ├── FiltersView.java
    │       │   │               │           ├── FontsView.java
    │       │   │               │           ├── FramesView.java
    │       │   │               │           ├── GalleryAlbumsView.java
    │       │   │               │           ├── GalleryImagesView.java
    │       │   │               │           ├── ImageAdjustmentView.java
    │       │   │               │           ├── IntensityView.java
    │       │   │               │           ├── OverlaysView.java
    │       │   │               │           ├── StickersSetView.java
    │       │   │               │           ├── StickersView.java
    │       │   │               │           ├── TiltShiftView.java
    │       │   │               │           ├── ToolsView.java
    │       │   │               │           ├── TransformHorizontalView.java
    │       │   │               │           ├── TransformStraightenView.java
    │       │   │               │           ├── TransformVerticalView.java
    │       │   │               │           └── TransformView.java
    │       │   │               ├── tasks/
    │       │   │               │   ├── DecodeScaledImageAsyncTask.java
    │       │   │               │   ├── ImageCacheSaveTask.java
    │       │   │               │   ├── ImageFetchTask.java
    │       │   │               │   └── ImageSaveTask.java
    │       │   │               ├── ui/
    │       │   │               │   ├── activities/
    │       │   │               │   │   ├── EditorActivity.java
    │       │   │               │   │   ├── GalleryActivity.java
    │       │   │               │   │   ├── HomeActivity.java
    │       │   │               │   │   └── PreviewActivity.java
    │       │   │               │   ├── dialogs/
    │       │   │               │   │   ├── ColorPickerDialog.java
    │       │   │               │   │   ├── FontPickerDialog.java
    │       │   │               │   │   └── LoadingDialog.java
    │       │   │               │   └── fragments/
    │       │   │               │       ├── AdjustFragment.java
    │       │   │               │       ├── DrawingFragment.java
    │       │   │               │       ├── FiltersFragment.java
    │       │   │               │       ├── FontsFragment.java
    │       │   │               │       ├── FramesFragment.java
    │       │   │               │       ├── GalleryAlbumsFragment.java
    │       │   │               │       ├── GalleryImagesFragment.java
    │       │   │               │       ├── ImageAdjustmentFragment.java
    │       │   │               │       ├── OverlaysFragment.java
    │       │   │               │       ├── StickersFragment.java
    │       │   │               │       ├── StickersSetFragment.java
    │       │   │               │       ├── TextFragment.java
    │       │   │               │       ├── TiltShiftFragment.java
    │       │   │               │       ├── ToolFragment.java
    │       │   │               │       ├── ToolsFragment.java
    │       │   │               │       ├── TransformFragment.java
    │       │   │               │       └── TransparencyFragment.java
    │       │   │               └── utils/
    │       │   │                   ├── BitmapUtil.java
    │       │   │                   ├── LogHelper.java
    │       │   │                   ├── MatrixUtil.java
    │       │   │                   ├── MotionEventUtil.java
    │       │   │                   ├── RectUtil.java
    │       │   │                   ├── SizeUtil.java
    │       │   │                   └── ToolbarUtil.java
    │       │   └── res/
    │       │       ├── anim/
    │       │       │   ├── slide_down.xml
    │       │       │   └── slide_up.xml
    │       │       ├── drawable/
    │       │       │   ├── ic_add.xml
    │       │       │   ├── ic_add_40.xml
    │       │       │   ├── ic_add_circle.xml
    │       │       │   ├── ic_add_circle_white_24dp.xml
    │       │       │   ├── ic_adjust_white_50dp.xml
    │       │       │   ├── ic_apply_40.xml
    │       │       │   ├── ic_arrow_back_white_24dp.xml
    │       │       │   ├── ic_blur_linear.xml
    │       │       │   ├── ic_blur_off.xml
    │       │       │   ├── ic_blur_radial.xml
    │       │       │   ├── ic_brightness.xml
    │       │       │   ├── ic_brush_color.xml
    │       │       │   ├── ic_camera.xml
    │       │       │   ├── ic_cancel_40.xml
    │       │       │   ├── ic_check.xml
    │       │       │   ├── ic_check_40.xml
    │       │       │   ├── ic_clear.xml
    │       │       │   ├── ic_close_white_24dp.xml
    │       │       │   ├── ic_color.xml
    │       │       │   ├── ic_contrast.xml
    │       │       │   ├── ic_crop.xml
    │       │       │   ├── ic_delete_on.xml
    │       │       │   ├── ic_disappointed_white_150dp.xml
    │       │       │   ├── ic_drawing_white_50dp.xml
    │       │       │   ├── ic_eraser.xml
    │       │       │   ├── ic_expand.xml
    │       │       │   ├── ic_expand_less.xml
    │       │       │   ├── ic_exposure.xml
    │       │       │   ├── ic_fade.xml
    │       │       │   ├── ic_filter_40.xml
    │       │       │   ├── ic_filter_white_50dp.xml
    │       │       │   ├── ic_flags.xml
    │       │       │   ├── ic_flash_auto.xml
    │       │       │   ├── ic_flash_off.xml
    │       │       │   ├── ic_flash_on.xml
    │       │       │   ├── ic_flip_camera.xml
    │       │       │   ├── ic_font.xml
    │       │       │   ├── ic_font_bold.xml
    │       │       │   ├── ic_font_italic.xml
    │       │       │   ├── ic_format_bold.xml
    │       │       │   ├── ic_format_color_text_black_24dp.xml
    │       │       │   ├── ic_format_italic.xml
    │       │       │   ├── ic_format_underlined.xml
    │       │       │   ├── ic_frame_white_50dp.xml
    │       │       │   ├── ic_gallery_white_100dp.xml
    │       │       │   ├── ic_h_flip_white_35dp.xml
    │       │       │   ├── ic_instagram.xml
    │       │       │   ├── ic_intensity.xml
    │       │       │   ├── ic_left.xml
    │       │       │   ├── ic_letters_white_50dp.xml
    │       │       │   ├── ic_loop.xml
    │       │       │   ├── ic_magic_stick.xml
    │       │       │   ├── ic_overlay_white_50dp.xml
    │       │       │   ├── ic_perspective_horizontal.xml
    │       │       │   ├── ic_perspective_vertical.xml
    │       │       │   ├── ic_radial.xml
    │       │       │   ├── ic_rotate_left_white_35dp.xml
    │       │       │   ├── ic_rotate_right_white_35dp.xml
    │       │       │   ├── ic_rotation.xml
    │       │       │   ├── ic_saturation.xml
    │       │       │   ├── ic_settings.xml
    │       │       │   ├── ic_shadows.xml
    │       │       │   ├── ic_share.xml
    │       │       │   ├── ic_stiker_white_50dp.xml
    │       │       │   ├── ic_straighten.xml
    │       │       │   ├── ic_tilt_shift_white_50dp.xml
    │       │       │   ├── ic_tint.xml
    │       │       │   ├── ic_transform_white_50dp.xml
    │       │       │   ├── ic_undo.xml
    │       │       │   ├── ic_v_flip_white_35dp.xml
    │       │       │   ├── ic_vignette_white_50dp.xml
    │       │       │   └── ic_warmth.xml
    │       │       ├── layout/
    │       │       │   ├── activity_editor.xml
    │       │       │   ├── activity_gallery.xml
    │       │       │   ├── activity_home.xml
    │       │       │   ├── activity_preview.xml
    │       │       │   ├── dialog_argb_color_picker.xml
    │       │       │   ├── dialog_color_picker.xml
    │       │       │   ├── dialog_font_picker.xml
    │       │       │   ├── dialog_loading.xml
    │       │       │   ├── fragment_adjust.xml
    │       │       │   ├── fragment_camera_filters.xml
    │       │       │   ├── fragment_drawing.xml
    │       │       │   ├── fragment_filters.xml
    │       │       │   ├── fragment_fonts.xml
    │       │       │   ├── fragment_frames.xml
    │       │       │   ├── fragment_gallery_albums.xml
    │       │       │   ├── fragment_gallery_images.xml
    │       │       │   ├── fragment_overlay.xml
    │       │       │   ├── fragment_show_stickers.xml
    │       │       │   ├── fragment_slider_control.xml
    │       │       │   ├── fragment_stickers.xml
    │       │       │   ├── fragment_text.xml
    │       │       │   ├── fragment_tilt_shift.xml
    │       │       │   ├── fragment_tools.xml
    │       │       │   ├── fragment_transform.xml
    │       │       │   ├── fragment_transform_horizontal.xml
    │       │       │   ├── fragment_transform_straighten.xml
    │       │       │   ├── fragment_transform_vertical.xml
    │       │       │   ├── fragment_transparency.xml
    │       │       │   ├── item_adjust.xml
    │       │       │   ├── item_brush_size.xml
    │       │       │   ├── item_color.xml
    │       │       │   ├── item_filter.xml
    │       │       │   ├── item_font.xml
    │       │       │   ├── item_frame.xml
    │       │       │   ├── item_image.xml
    │       │       │   ├── item_image_album.xml
    │       │       │   ├── item_overlay.xml
    │       │       │   ├── item_sticker.xml
    │       │       │   ├── item_sticker_set.xml
    │       │       │   └── item_tool.xml
    │       │       ├── menu/
    │       │       │   ├── menu_crop.xml
    │       │       │   ├── menu_editor.xml
    │       │       │   ├── menu_share.xml
    │       │       │   └── menu_tool.xml
    │       │       ├── values/
    │       │       │   ├── attrs.xml
    │       │       │   ├── colors.xml
    │       │       │   ├── dimens.xml
    │       │       │   ├── strings.xml
    │       │       │   └── styles.xml
    │       │       ├── values-v21/
    │       │       │   └── styles.xml
    │       │       ├── values-w820dp/
    │       │       │   └── dimens.xml
    │       │       └── xml/
    │       │           └── provider_paths.xml
    │       └── test/
    │           └── java/
    │               └── net/
    │                   └── iquesoft/
    │                       └── iquephoto/
    │                           └── ExampleUnitTest.java
    ├── build.gradle
    ├── gradle/
    │   └── wrapper/
    │       ├── gradle-wrapper.jar
    │       └── gradle-wrapper.properties
    ├── gradle.properties
    ├── gradlew
    ├── gradlew.bat
    └── settings.gradle
Download .txt
SYMBOL INDEX (983 symbols across 131 files)

FILE: iQuePhoto/app/src/androidTest/java/net/iquesoft/iquephoto/ApplicationTest.java
  class ApplicationTest (line 9) | public class ApplicationTest extends ApplicationTestCase<Application> {
    method ApplicationTest (line 10) | public ApplicationTest() {

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/App.java
  class App (line 9) | public class App extends Application {
    method onCreate (line 12) | @Override
    method getAppComponent (line 21) | public static AppComponent getAppComponent() {

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/adapters/AdjustAdapter.java
  class AdjustAdapter (line 19) | public class AdjustAdapter extends RecyclerView.Adapter<AdjustAdapter.Vi...
    type OnAdjustClickListener (line 26) | public interface OnAdjustClickListener {
      method onAdjustClick (line 27) | void onAdjustClick(Adjust adjust);
    method setOnAdjustClickListener (line 30) | public void setOnAdjustClickListener(OnAdjustClickListener onAdjustCli...
    method AdjustAdapter (line 34) | public AdjustAdapter(List<Adjust> adjustList) {
    method onCreateViewHolder (line 38) | @Override
    method onBindViewHolder (line 47) | @Override
    method getItemCount (line 59) | @Override
    class ViewHolder (line 64) | class ViewHolder extends RecyclerView.ViewHolder {
      method ViewHolder (line 68) | ViewHolder(View itemView) {

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/adapters/ColorAdapter.java
  class ColorAdapter (line 20) | public class ColorAdapter extends RecyclerView.Adapter<ColorAdapter.View...
    type OnColorClickListener (line 29) | public interface OnColorClickListener {
      method onClick (line 30) | void onClick(EditorColor editorColor);
    method setOnColorClickListener (line 33) | public void setOnColorClickListener(OnColorClickListener onColorClickL...
    method ColorAdapter (line 37) | public ColorAdapter(List<EditorColor> editorColors) {
    method onCreateViewHolder (line 41) | @Override
    method onBindViewHolder (line 50) | @Override
    method getItemCount (line 73) | @Override
    class ViewHolder (line 78) | public class ViewHolder extends RecyclerView.ViewHolder {
      method ViewHolder (line 82) | public ViewHolder(View itemView) {

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/adapters/FiltersAdapter.java
  class FiltersAdapter (line 23) | public class FiltersAdapter extends RecyclerView.Adapter<FiltersAdapter....
    type OnFilterClickListener (line 33) | public interface OnFilterClickListener {
      method onFilterClicked (line 34) | void onFilterClicked(Filter filter);
      method onIntensityClicked (line 36) | void onIntensityClicked();
    method setFiltersListener (line 39) | public void setFiltersListener(OnFilterClickListener onFilterClickList...
    method FiltersAdapter (line 43) | public FiltersAdapter(Uri uri, List<Filter> filters) {
    method onCreateViewHolder (line 48) | @Override
    method onBindViewHolder (line 57) | @Override
    method getItemCount (line 89) | @Override
    class ViewHolder (line 94) | public class ViewHolder extends RecyclerView.ViewHolder {
      method ViewHolder (line 104) | public ViewHolder(View itemView) {

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/adapters/FontsAdapter.java
  class FontsAdapter (line 20) | public class FontsAdapter extends RecyclerView.Adapter<FontsAdapter.View...
    type OnFontClickListener (line 33) | public interface OnFontClickListener {
      method onClick (line 34) | void onClick(Font font);
    method setOnFontClickListener (line 37) | public void setOnFontClickListener(OnFontClickListener onFontClickList...
    method FontsAdapter (line 41) | public FontsAdapter(List<Font> fonts) {
    method onCreateViewHolder (line 45) | @Override
    method onBindViewHolder (line 54) | @Override
    method getItemCount (line 77) | @Override
    method getTypeface (line 82) | private Typeface getTypeface(String path) {
    class ViewHolder (line 86) | public class ViewHolder extends RecyclerView.ViewHolder {
      method ViewHolder (line 93) | public ViewHolder(View itemView) {

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/adapters/FramesAdapter.java
  class FramesAdapter (line 21) | public class FramesAdapter extends RecyclerView.Adapter<FramesAdapter.Vi...
    type OnFrameClickListener (line 30) | public interface OnFrameClickListener {
      method onClick (line 31) | void onClick(Frame frame);
    method setFramesListener (line 34) | public void setFramesListener(OnFrameClickListener onFrameClickListene...
    method FramesAdapter (line 38) | public FramesAdapter(List<Frame> framesList) {
    method onCreateViewHolder (line 42) | @Override
    method onBindViewHolder (line 51) | @Override
    method getItemCount (line 76) | @Override
    class ViewHolder (line 81) | public class ViewHolder extends RecyclerView.ViewHolder {
      method ViewHolder (line 91) | public ViewHolder(View itemView) {

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/adapters/ImageAlbumsAdapter.java
  class ImageAlbumsAdapter (line 23) | public class ImageAlbumsAdapter extends RecyclerView.Adapter<ImageAlbums...
    method setOnAlbumClickListener (line 30) | public void setOnAlbumClickListener(OnAlbumClickListener onAlbumClickL...
    type OnAlbumClickListener (line 34) | public interface OnAlbumClickListener {
      method onAlbumClick (line 35) | void onAlbumClick(ImageAlbum imageAlbum);
    method ImageAlbumsAdapter (line 38) | public ImageAlbumsAdapter(List<ImageAlbum> imageAlbums) {
    method onCreateViewHolder (line 42) | @Override
    method onBindViewHolder (line 51) | @Override
    method getItemCount (line 80) | @Override
    class ViewHolder (line 85) | public class ViewHolder extends RecyclerView.ViewHolder {
      method ViewHolder (line 95) | public ViewHolder(View itemView) {

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/adapters/ImagesAdapter.java
  class ImagesAdapter (line 22) | public class ImagesAdapter extends RecyclerView.Adapter<ImagesAdapter.Vi...
    method setOnImageClickListener (line 29) | public void setOnImageClickListener(OnImageClickListener listener) {
    type OnImageClickListener (line 33) | public interface OnImageClickListener {
      method onClick (line 34) | void onClick(Image image);
    method ImagesAdapter (line 37) | public ImagesAdapter(List<Image> imageList) {
    method onCreateViewHolder (line 41) | @Override
    method onBindViewHolder (line 52) | @Override
    method getItemCount (line 75) | @Override
    class ViewHolder (line 80) | public class ViewHolder extends RecyclerView.ViewHolder {
      method ViewHolder (line 87) | public ViewHolder(View itemView) {

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/adapters/OverlaysAdapter.java
  class OverlaysAdapter (line 21) | public class OverlaysAdapter extends RecyclerView.Adapter<OverlaysAdapte...
    type OnOverlayClickListener (line 30) | public interface OnOverlayClickListener {
      method onClick (line 31) | void onClick(Overlay overlay);
    method setOnOverlayClickListener (line 34) | public void setOnOverlayClickListener(OnOverlayClickListener onOverlay...
    method OverlaysAdapter (line 38) | public OverlaysAdapter(List<Overlay> overlayList) {
    method onCreateViewHolder (line 42) | @Override
    method onBindViewHolder (line 51) | @Override
    method getItemCount (line 77) | @Override
    class ViewHolder (line 82) | public class ViewHolder extends RecyclerView.ViewHolder {
      method ViewHolder (line 92) | public ViewHolder(View itemView) {

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/adapters/SizesAdapter.java
  class SizesAdapter (line 19) | public class SizesAdapter extends RecyclerView.Adapter<SizesAdapter.View...
    type OnSizeClickListener (line 26) | public interface OnSizeClickListener {
      method onClick (line 27) | void onClick(BrushSize size);
    method setOnSizeClickListener (line 30) | public void setOnSizeClickListener(OnSizeClickListener onSizeClickList...
    method SizesAdapter (line 34) | public SizesAdapter(List<BrushSize> sizes) {
    method onCreateViewHolder (line 39) | @Override
    method onBindViewHolder (line 48) | @Override
    method getItemCount (line 68) | @Override
    class ViewHolder (line 73) | public class ViewHolder extends RecyclerView.ViewHolder {
      method ViewHolder (line 77) | public ViewHolder(View itemView) {

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/adapters/StickerSetAdapter.java
  class StickerSetAdapter (line 21) | public class StickerSetAdapter extends RecyclerView.Adapter<StickerSetAd...
    type OnStickerSetClickListener (line 28) | public interface OnStickerSetClickListener {
      method onClick (line 29) | void onClick(StickersSet stickersSet);
    method setStickerSetClickListener (line 32) | public void setStickerSetClickListener(OnStickerSetClickListener onSti...
    method StickerSetAdapter (line 36) | public StickerSetAdapter(List<StickersSet> stickersSets) {
    method onCreateViewHolder (line 40) | @Override
    method onBindViewHolder (line 49) | @Override
    method getItemCount (line 65) | @Override
    class ViewHolder (line 70) | public class ViewHolder extends RecyclerView.ViewHolder {
      method ViewHolder (line 77) | public ViewHolder(View itemView) {

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/adapters/StickersAdapter.java
  class StickersAdapter (line 20) | public class StickersAdapter extends RecyclerView.Adapter<StickersAdapte...
    type OnStickerClickListener (line 27) | public interface OnStickerClickListener {
      method onClick (line 28) | void onClick(Sticker sticker);
    method setOnStickerClickListener (line 31) | public void setOnStickerClickListener(OnStickerClickListener onSticker...
    method StickersAdapter (line 35) | public StickersAdapter(List<Sticker> stickers) {
    method onCreateViewHolder (line 39) | @Override
    method onBindViewHolder (line 48) | @Override
    method getItemCount (line 62) | @Override
    class ViewHolder (line 67) | public class ViewHolder extends RecyclerView.ViewHolder {
      method ViewHolder (line 71) | public ViewHolder(View itemView) {

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/adapters/ToolsAdapter.java
  class ToolsAdapter (line 19) | public class ToolsAdapter extends RecyclerView.Adapter<ToolsAdapter.View...
    type OnToolsClickListener (line 26) | public interface OnToolsClickListener {
      method onClick (line 27) | void onClick(Tool tool);
    method setOnToolsClickListener (line 30) | public void setOnToolsClickListener(OnToolsClickListener onToolsClickL...
    method ToolsAdapter (line 34) | public ToolsAdapter(List<Tool> tools) {
    method onCreateViewHolder (line 38) | @Override
    method onBindViewHolder (line 49) | @Override
    method getItemCount (line 62) | @Override
    class ViewHolder (line 67) | public class ViewHolder extends RecyclerView.ViewHolder {
      method ViewHolder (line 71) | public ViewHolder(View itemView) {

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/core/EditorListener.java
  type EditorListener (line 6) | public interface EditorListener {
    method onTransparencyHandleButtonClicked (line 7) | void onTransparencyHandleButtonClicked(Paint paint);
    method hasChanges (line 9) | void hasChanges(int count);
    method onAppliedImageSaved (line 11) | void onAppliedImageSaved(Uri uri);

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/core/EditorView.java
  type EditorView (line 21) | interface EditorView extends MvpView {
    method setupImage (line 22) | void setupImage(Bitmap bitmap, Matrix imageMatrix, RectF imageRect);
    method showOriginalImage (line 24) | void showOriginalImage(boolean display);
    method onToolChanged (line 26) | void onToolChanged(EditorTool tool);
    method onImageAdjusted (line 28) | void onImageAdjusted(Paint paint);
    method onOverlayChanged (line 30) | void onOverlayChanged(Bitmap bitmap, Matrix matrix, Paint paint);
    method onFilterChanged (line 32) | void onFilterChanged(Paint paint);
    method onFrameChanged (line 34) | void onFrameChanged(Bitmap bitmap, Matrix matrix);
    method onTextAdded (line 36) | void onTextAdded(List<EditorText> texts);
    method onStickerAdded (line 38) | void onStickerAdded(List<EditorSticker> stickers);
    method onVignetteUpdated (line 40) | void onVignetteUpdated(EditorVignette vignette);
    method onRadialTiltShiftUpdated (line 42) | void onRadialTiltShiftUpdated(EditorRadialTiltShift radialTiltShift);
    method onLinearTiltShiftUpdated (line 44) | void onLinearTiltShiftUpdated(EditorLinearTiltShift linearTiltShift);
    method onStraightenTransformChanged (line 46) | void onStraightenTransformChanged(Matrix transformMatrix);
    method updateDrawing (line 48) | void updateDrawing(Paint paint, Path path);
    method updateDrawing (line 50) | void updateDrawing(List<Drawing> drawings);
    method updateView (line 52) | void updateView();
    method onApplyChanges (line 54) | void onApplyChanges();
    method enableDrawingCache (line 56) | void enableDrawingCache();

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/core/ImageEditorView.java
  class ImageEditorView (line 36) | public class ImageEditorView extends View implements EditorView {
    method provideImageEditorViewPresenter (line 42) | @ProvidePresenter
    method ImageEditorView (line 80) | public ImageEditorView(Context context, AttributeSet attrs) {
    method setMvpDelegate (line 84) | public void setMvpDelegate(MvpDelegate patentDelegate) {
    method onLayout (line 93) | @Override
    method onDraw (line 100) | @Override
    method onTouchEvent (line 157) | @Override
    method onDetachedFromWindow (line 164) | @Override
    method getMvpDelegate (line 172) | public MvpDelegate<ImageEditorView> getMvpDelegate() {
    method setImageBitmap (line 183) | public void setImageBitmap(@NonNull Bitmap bitmap) {
    method getAlteredImageBitmap (line 188) | public Bitmap getAlteredImageBitmap() {
    method undo (line 196) | public void undo() {
    method changeTool (line 200) | public void changeTool(EditorTool tool) {
    method applyChanges (line 204) | public void applyChanges() {
    method setUndoListener (line 208) | public void setUndoListener(EditorListener editorListener) {
    method addText (line 212) | public void addText(Text text) {
    method addSticker (line 216) | public void addSticker(Bitmap bitmap) {
    method setFilter (line 220) | public void setFilter(ColorMatrix colorMatrix) {
    method setFrame (line 224) | public void setFrame(@NonNull Bitmap bitmap) {
    method setOverlay (line 228) | public void setOverlay(@NonNull Bitmap bitmap) {
    method setFilterIntensity (line 232) | public void setFilterIntensity(@IntRange(from = -100, to = 100) int va...
    method setVignetteIntensity (line 236) | public void setVignetteIntensity(@IntRange(from = -100, to = 100) int ...
    method setOverlayIntensity (line 240) | public void setOverlayIntensity(@IntRange(from = -100, to = 100) int v...
    method setBrightnessValue (line 244) | public void setBrightnessValue(@IntRange(from = -100, to = 100) int va...
    method setContrastValue (line 248) | public void setContrastValue(@IntRange(from = -100, to = 100) int valu...
    method setSaturationValue (line 252) | public void setSaturationValue(@IntRange(from = -100, to = 100) int va...
    method setWarmthValue (line 256) | public void setWarmthValue(@IntRange(from = -100, to = 100) int value) {
    method setStraightenTransformValue (line 260) | public void setStraightenTransformValue(@IntRange(from = -30, to = 30)...
    method setBrushColor (line 264) | public void setBrushColor(@ColorInt int color) {
    method setBrushSize (line 268) | public void setBrushSize(float size) {
    method drawTexts (line 272) | private void drawTexts(Canvas canvas) {
    method drawStickers (line 280) | private void drawStickers(Canvas canvas) {
    method drawing (line 288) | private void drawing(Canvas canvas) {
    method setupImage (line 303) | @Override
    method showOriginalImage (line 317) | @Override
    method onToolChanged (line 324) | @Override
    method onImageAdjusted (line 331) | @Override
    method onOverlayChanged (line 340) | @Override
    method onFilterChanged (line 349) | @Override
    method onFrameChanged (line 358) | @Override
    method onTextAdded (line 366) | @Override
    method onStickerAdded (line 375) | @Override
    method onVignetteUpdated (line 384) | @Override
    method onRadialTiltShiftUpdated (line 393) | @Override
    method onLinearTiltShiftUpdated (line 402) | @Override
    method onStraightenTransformChanged (line 411) | @Override
    method updateDrawing (line 420) | @Override
    method updateDrawing (line 430) | @Override
    method updateView (line 439) | @Override
    method onApplyChanges (line 444) | @Override
    method enableDrawingCache (line 452) | @Override

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/core/ImageEditorViewPresenter.java
  class ImageEditorViewPresenter (line 45) | @InjectViewState
    method ImageEditorViewPresenter (line 93) | ImageEditorViewPresenter(@NonNull Context context) {
    method initDrawingPaint (line 102) | private void initDrawingPaint() {
    method initializeMotionEventObservables (line 110) | private void initializeMotionEventObservables() {
    method actionDown (line 147) | private void actionDown(MotionEvent event) {
    method actionPointerDown (line 174) | private void actionPointerDown(MotionEvent event) {
    method actionMove (line 194) | private void actionMove(MotionEvent event) {
    method actionPointerUp (line 223) | private void actionPointerUp() {
    method actionUp (line 242) | private void actionUp() {
    method setupBitmapOnView (line 280) | void setupBitmapOnView(Bitmap bitmap, int width, int height) {
    method viewTouched (line 309) | void viewTouched(MotionEvent event) {
    method applyChanges (line 313) | void applyChanges() {
    method applyChanges (line 339) | void applyChanges(@NonNull Bitmap bitmap) {
    method setFilter (line 363) | public void setFilter(ColorMatrix colorMatrix) {
    method changeFilterIntensity (line 369) | void changeFilterIntensity(int value) {
    method changeOverlayIntensity (line 375) | void changeOverlayIntensity(int value) {
    method changeVignetteMask (line 379) | void changeVignetteMask(int value) {
    method changeBrightness (line 385) | void changeBrightness(int value) {
    method changeContrast (line 401) | void changeContrast(int value) {
    method changeSaturation (line 421) | void changeSaturation(int value) {
    method changeWarmth (line 432) | void changeWarmth(int value) {
    method changeBrushSize (line 448) | void changeBrushSize(float size) {
    method changeBrushColor (line 452) | void changeBrushColor(int color) {
    method changeStraightenTransform (line 456) | void changeStraightenTransform(int value) {
    method setFrame (line 487) | public void setFrame(Bitmap bitmap) {
    method setOverlay (line 491) | public void setOverlay(Bitmap bitmap) {
    method addText (line 497) | void addText(Text text) {
    method addSticker (line 507) | void addSticker(Bitmap bitmap) {
    method changeTool (line 513) | public void changeTool(EditorTool tool) {
    method setEditorListener (line 572) | void setEditorListener(EditorListener editorListener) {
    method undo (line 576) | void undo() {
    method getSupportMatrix (line 586) | private Matrix getSupportMatrix(Bitmap bitmap) {
    method textActionDown (line 601) | private void textActionDown(MotionEvent event) {
    method stickerActionDown (line 648) | private void stickerActionDown(MotionEvent event) {
    method brushActionDown (line 698) | private void brushActionDown(MotionEvent event) {
    method brushActionMove (line 710) | private void brushActionMove(MotionEvent event) {
    method brushActionUp (line 724) | private void brushActionUp() {
    method textActionMove (line 735) | private void textActionMove(MotionEvent event) {
    method stickerActionMove (line 768) | private void stickerActionMove(MotionEvent event) {
    method getAlteredBitmap (line 797) | private Bitmap getAlteredBitmap() {
    method getBlurBitmap (line 805) | private Bitmap getBlurBitmap(Context context, Bitmap bitmap, int width...
    method getDeltaX (line 822) | private float getDeltaX(MotionEvent event) {
    method getDeltaY (line 826) | private float getDeltaY(MotionEvent event) {

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/core/enums/EditorMode.java
  type EditorMode (line 3) | public enum EditorMode {

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/core/enums/EditorTool.java
  type EditorTool (line 3) | public enum EditorTool {

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/core/model/Drawing.java
  class Drawing (line 8) | public class Drawing {
    method Drawing (line 15) | public Drawing(@NonNull Paint paint, @NonNull Path path) {
    method getPaint (line 20) | public Paint getPaint() {
    method getPath (line 24) | public Path getPath() {

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/core/model/EditorFrame.java
  class EditorFrame (line 13) | public class EditorFrame {
    method EditorFrame (line 23) | public EditorFrame(Context context) {
    method initializeFramePaint (line 28) | private void initializeFramePaint() {
    method initializeHandlesBitmap (line 38) | private void initializeHandlesBitmap(Context context) {
    method getFramePaint (line 51) | public Paint getFramePaint() {
    method getDeleteHandleBitmap (line 55) | public Bitmap getDeleteHandleBitmap() {
    method getTransparencyHandleBitmap (line 59) | public Bitmap getTransparencyHandleBitmap() {
    method getResizeHandleBitmap (line 63) | public Bitmap getResizeHandleBitmap() {
    method getFrontHandleBitmap (line 67) | public Bitmap getFrontHandleBitmap() {

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/core/model/EditorImage.java
  class EditorImage (line 7) | public class EditorImage {
    method EditorImage (line 11) | public EditorImage(EditorTool command, Bitmap bitmap) {
    method getCommand (line 16) | public EditorTool getCommand() {
    method getBitmap (line 20) | public Bitmap getBitmap() {

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/core/model/EditorLinearTiltShift.java
  class EditorLinearTiltShift (line 27) | public class EditorLinearTiltShift {
    method EditorLinearTiltShift (line 64) | public EditorLinearTiltShift(int viewWidth, int viewHeight) {
    method initialize (line 71) | private void initialize() {
    method draw (line 105) | public void draw(@NonNull Canvas canvas, @NonNull Bitmap bitmap, @NonN...
    method updateRect (line 130) | public void updateRect(RectF bitmapRect) {
    method updateBlurBitmap (line 146) | public void updateBlurBitmap(@NonNull Bitmap blurBitmap) {
    method updateGradientRect (line 150) | public void updateGradientRect() {
    method updateGradientShader (line 163) | public void updateGradientShader(float value, Paint paint) {
    method updateGradientMatrix (line 180) | private void updateGradientMatrix(RectF rectF) {
    method actionMove (line 187) | public void actionMove(MotionEvent event) {
    method actionDown (line 227) | public void actionDown(MotionEvent event) {
    method actionPointerDown (line 234) | public void actionPointerDown(MotionEvent event) {
    method actionUp (line 238) | public void actionUp() {
    method actionPointerUp (line 242) | public void actionPointerUp() {
    method setPaintAlpha (line 246) | public void setPaintAlpha(int value) {
    method getPaintAlpha (line 250) | public int getPaintAlpha() {
    method displayDistance (line 254) | private float displayDistance() {
    method isTiltShiftInRect (line 258) | private boolean isTiltShiftInRect() {
    method setHelpOvalEnabled (line 265) | public void setHelpOvalEnabled(boolean enabled) {

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/core/model/EditorRadialTiltShift.java
  class EditorRadialTiltShift (line 24) | public class EditorRadialTiltShift {
    method EditorRadialTiltShift (line 64) | public EditorRadialTiltShift(int viewWidth, int viewHeight) {
    method initialize (line 70) | public void initialize() {
    method draw (line 108) | public void draw(@NonNull Canvas canvas, @NonNull Bitmap bitmap, @NonN...
    method updateRect (line 144) | public void updateRect(RectF bitmapRect) {
    method updateGradientShader (line 166) | private void updateGradientShader() {
    method updateBlurBitmap (line 177) | public void updateBlurBitmap(@NonNull Bitmap bitmap) {
    method updateGradientMatrix (line 181) | private void updateGradientMatrix(RectF rectF) {
    method actionDown (line 188) | public void actionDown(MotionEvent event) {
    method actionMove (line 203) | public void actionMove(MotionEvent event) {
    method actionPointerDown (line 243) | public void actionPointerDown(MotionEvent event) {
    method actionUp (line 250) | public void actionUp() {
    method actionPointerUp (line 256) | public void actionPointerUp() {
    method setPaintAlpha (line 260) | public void setPaintAlpha(int value) {
    method getPaintAlpha (line 265) | public int getPaintAlpha() {
    method displayDistance (line 269) | private float displayDistance() {
    method isTiltShiftInRect (line 273) | private boolean isTiltShiftInRect() {
    method setHelpOvalEnabled (line 280) | public void setHelpOvalEnabled(boolean enabled) {

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/core/model/EditorSticker.java
  class EditorSticker (line 19) | public class EditorSticker {
    method EditorSticker (line 56) | public EditorSticker(Bitmap bitmap, RectF imageRect) {
    method initialize (line 69) | private void initialize() {
    method updateFrameRect (line 106) | private void updateFrameRect() {
    method setStickerTouched (line 113) | public void setStickerTouched(boolean isTouched) {
    method actionMove (line 121) | public void actionMove(float dx, float dy) {
    method updateRotateAndScale (line 132) | public void updateRotateAndScale(final float dx, final float dy) {
    method draw (line 194) | public void draw(@NonNull Canvas canvas) {
    method drawHelperFrame (line 200) | private void drawHelperFrame(Canvas canvas) {
    method isInside (line 262) | public boolean isInside(MotionEvent event) {
    method isInDeleteHandleButton (line 266) | public boolean isInDeleteHandleButton(MotionEvent event) {
    method isInScaleAndRotateHandleButton (line 270) | public boolean isInScaleAndRotateHandleButton(MotionEvent event) {
    method isInFrontHandleButton (line 274) | public boolean isInFrontHandleButton(MotionEvent event) {
    method isInTransparencyHandleButton (line 278) | public boolean isInTransparencyHandleButton(MotionEvent event) {
    method getPaint (line 282) | public Paint getPaint() {
    method setHelpFrameEnabled (line 286) | public void setHelpFrameEnabled(boolean enabled) {

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/core/model/EditorText.java
  class EditorText (line 22) | public class EditorText {
    method EditorText (line 62) | public EditorText(Text text) {
    method initEditorText (line 77) | private void initEditorText() {
    method initTextPaint (line 98) | private void initTextPaint() {
    method draw (line 109) | public void draw(@NonNull Canvas canvas) {
    method drawHelperFrame (line 130) | private void drawHelperFrame(Canvas canvas) {
    method setX (line 165) | public void setX(float x) {
    method setY (line 169) | public void setY(float y) {
    method getX (line 173) | public float getX() {
    method getY (line 177) | public float getY() {
    method getRotateAndScaleHandleDstRect (line 181) | public RectF getRotateAndScaleHandleDstRect() {
    method getResizeHandleDstRect (line 185) | public RectF getResizeHandleDstRect() {
    method setHelperFrameOpacity (line 189) | public void setHelperFrameOpacity() {
    method resetHelperFrameOpacity (line 193) | public void resetHelperFrameOpacity() {
    method updateRotateAndScale (line 197) | public void updateRotateAndScale(float distanceX, float distanceY) {
    method isInside (line 240) | public boolean isInside(MotionEvent event) {
    method isInDeleteHandleButton (line 244) | public boolean isInDeleteHandleButton(MotionEvent event) {
    method isInFrontHandleButton (line 248) | public boolean isInFrontHandleButton(MotionEvent event) {
    method isInTransparencyHandleButton (line 253) | public boolean isInTransparencyHandleButton(MotionEvent event) {
    method isInResizeAndScaleHandleButton (line 257) | public boolean isInResizeAndScaleHandleButton(MotionEvent event) {
    method setHelpFrameEnabled (line 261) | public void setHelpFrameEnabled(boolean enabled) {
    method getPaint (line 265) | public Paint getPaint() {

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/core/model/EditorTiltShift.java
  type EditorTiltShift (line 11) | public interface EditorTiltShift {
    method initialize (line 13) | void initialize(Context context);
    method draw (line 15) | void draw(Canvas canvas, Bitmap bitmap, Matrix matrix, Paint paint);
    method updateRect (line 17) | void updateRect(RectF bitmapRect);
    method updateGradientRect (line 19) | void updateGradientRect();
    method updateGradientShader (line 21) | void updateGradientShader(float value, final Paint paint);
    method updateGradientMatrix (line 23) | void updateGradientMatrix(RectF rectF);
    method actionMove (line 25) | void actionMove(MotionEvent event);
    method actionDown (line 27) | void actionDown(MotionEvent event);
    method actionPointerDown (line 29) | void actionPointerDown(MotionEvent event);
    method actionUp (line 31) | void actionUp();
    method actionPointerUp (line 33) | void actionPointerUp();
    method setPaintAlpha (line 35) | void setPaintAlpha(int value);
    method getPaintAlpha (line 37) | int getPaintAlpha();

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/core/model/EditorVignette.java
  class EditorVignette (line 25) | public class EditorVignette {
    method EditorVignette (line 60) | public EditorVignette(int viewWidth, int viewHeight) {
    method initializeVignette (line 67) | private void initializeVignette() {
    method updateMask (line 102) | public void updateMask(int value) {
    method updateGradientShader (line 116) | private void updateGradientShader(float value, final Paint paint) {
    method updateGradientMatrix (line 129) | private void updateGradientMatrix(RectF rectF) {
    method updateRect (line 139) | public void updateRect(RectF bitmapRect) {
    method draw (line 153) | public void draw(@NonNull Canvas canvas) {
    method actionDown (line 172) | public void actionDown(MotionEvent motionEvent) {
    method actionPointerDown (line 182) | public void actionPointerDown(MotionEvent event) {
    method actionMove (line 205) | public void actionMove(MotionEvent event) {
    method actionUp (line 255) | public void actionUp() {
    method actionPointerUp (line 261) | public void actionPointerUp() {
    method prepareToDraw (line 267) | public void prepareToDraw(@NonNull Canvas canvas, @NonNull Matrix matr...
    method isVignetteInRect (line 292) | private boolean isVignetteInRect() {
    method setHelpOvalEnabled (line 299) | public void setHelpOvalEnabled(boolean enabled) {

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/di/AppComponent.java
  type AppComponent (line 25) | @Singleton
    method getContext (line 28) | Context getContext();
    method inject (line 30) | void inject(ToolsPresenter toolsPresenter);
    method inject (line 32) | void inject(AdjustPresenter adjustPresenter);
    method inject (line 34) | void inject(FiltersPresenter filtersPresenter);
    method inject (line 36) | void inject(OverlaysPresenter overlaysPresenter);
    method inject (line 38) | void inject(FramesPresenter framesPresenter);
    method inject (line 40) | void inject(StickersSetPresenter stickersSetPresenter);
    method inject (line 42) | void inject(StickersPresenter stickersPresenter);
    method inject (line 44) | void inject(ColorsPresenter colorsPresenter);
    method inject (line 46) | void inject(DrawingPresenter drawingPresenter);
    method inject (line 48) | void inject(FontsPresenter fontsPresenter);
    method inject (line 50) | void inject(FontPickerDialog fontPickerDialog);
    method inject (line 52) | void inject(EditorSticker editorSticker);
    method inject (line 54) | void inject(EditorText editorText);

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/di/modules/AppModule.java
  class AppModule (line 10) | @Module
    method AppModule (line 14) | public AppModule(Context context) {
    method provideContext (line 18) | @Provides

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/di/modules/EditorModule.java
  class EditorModule (line 41) | @Module
    method provideTools (line 43) | @Provides
    method provideFilters (line 59) | @Provides
    method provideAdjust (line 146) | @Provides
    method provideStickersSet (line 164) | @Provides
    method provideOverlays (line 174) | @Provides
    method provideFrames (line 184) | @Provides
    method provideFonts (line 195) | @Provides
    method provideColors (line 206) | @Provides
    method provideSizes (line 233) | @Provides
    method provideEditorFrame (line 249) | @Provides
    method getEmojiStickers (line 254) | private List<Sticker> getEmojiStickers() {
    method getFlagsStickers (line 265) | private List<Sticker> getFlagsStickers() {
    method getChristmasStickers (line 275) | private List<Sticker> getChristmasStickers() {
    method getValentinesDayStickers (line 285) | private List<Sticker> getValentinesDayStickers() {

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/graphics/CircleSizeDrawable.java
  class CircleSizeDrawable (line 12) | public class CircleSizeDrawable extends Drawable {
    method CircleSizeDrawable (line 17) | public CircleSizeDrawable(final float size) {
    method draw (line 25) | @Override
    method setAlpha (line 31) | @Override
    method setColorFilter (line 36) | @Override
    method getOpacity (line 41) | @Override
    method setSelected (line 46) | public void setSelected(boolean isSelected) {

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/graphics/ColorCircleDrawable.java
  class ColorCircleDrawable (line 12) | public class ColorCircleDrawable extends Drawable {
    method ColorCircleDrawable (line 18) | public ColorCircleDrawable(final int color) {
    method draw (line 27) | @Override
    method setAlpha (line 39) | @Override
    method setColorFilter (line 44) | @Override
    method getOpacity (line 49) | @Override
    method setSelected (line 54) | public void setSelected(boolean isSelected) {

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/graphics/SquareFrameLayout.java
  class SquareFrameLayout (line 7) | public class SquareFrameLayout extends FrameLayout {
    method SquareFrameLayout (line 8) | public SquareFrameLayout(Context context) {
    method SquareFrameLayout (line 12) | public SquareFrameLayout(Context context, AttributeSet attrs) {
    method SquareFrameLayout (line 16) | public SquareFrameLayout(Context context, AttributeSet attrs, int defS...
    method onMeasure (line 20) | @Override

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/models/Adjust.java
  class Adjust (line 8) | public class Adjust {
    method Adjust (line 17) | public Adjust(@StringRes int title, @DrawableRes int icon, @NonNull Fr...
    method getTitle (line 23) | public int getTitle() {
    method getIcon (line 27) | public int getIcon() {
    method getFragment (line 31) | public Fragment getFragment() {

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/models/BrushSize.java
  class BrushSize (line 3) | public class BrushSize {
    method BrushSize (line 6) | public BrushSize(float size) {
    method getSize (line 10) | public float getSize() {

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/models/EditorColor.java
  class EditorColor (line 10) | public class EditorColor {
    method getColorsList (line 14) | public static List<EditorColor> getColorsList() {
    method EditorColor (line 42) | public EditorColor(@ColorRes int color) {
    method getColor (line 46) | public int getColor() {

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/models/Filter.java
  class Filter (line 5) | public class Filter {
    method Filter (line 9) | public Filter(String title, ColorMatrix colorMatrix) {
    method getTitle (line 14) | public String getTitle() {
    method getColorMatrix (line 18) | public ColorMatrix getColorMatrix() {

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/models/Font.java
  class Font (line 3) | public class Font {
    method Font (line 7) | public Font(String title, String path) {
    method getTitle (line 12) | public String getTitle() {
    method getPath (line 16) | public String getPath() {

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/models/Frame.java
  class Frame (line 5) | public class Frame {
    method Frame (line 11) | public Frame(String title, @DrawableRes int image) {
    method getTitle (line 16) | public String getTitle() {
    method getImage (line 20) | public int getImage() {

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/models/Image.java
  class Image (line 6) | public class Image implements Parcelable {
    method Image (line 10) | public Image(int id, String path) {
    method getId (line 15) | public int getId() {
    method getPath (line 19) | public String getPath() {
    method Image (line 23) | protected Image(Parcel in) {
    method describeContents (line 28) | @Override
    method writeToParcel (line 33) | @Override
    method createFromParcel (line 40) | @Override
    method newArray (line 45) | @Override

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/models/ImageAlbum.java
  class ImageAlbum (line 5) | public class ImageAlbum {
    method ImageAlbum (line 10) | public ImageAlbum(String name) {
    method getName (line 15) | public String getName() {
    method getImages (line 19) | public ArrayList<Image> getImages() {

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/models/Overlay.java
  class Overlay (line 5) | public class Overlay {
    method Overlay (line 11) | public Overlay(String title, @DrawableRes int image) {
    method getTitle (line 16) | public String getTitle() {
    method getImage (line 20) | public int getImage() {

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/models/ParcelablePaint.java
  class ParcelablePaint (line 9) | public class ParcelablePaint implements Parcelable {
    method ParcelablePaint (line 12) | public ParcelablePaint(@NonNull Paint paint) {
    method getPaint (line 16) | public Paint getPaint() {
    method setAlpha (line 20) | public void setAlpha(@IntRange(from = 0, to = 255) int value) {
    method ParcelablePaint (line 24) | protected ParcelablePaint(Parcel in) {
    method describeContents (line 28) | @Override
    method writeToParcel (line 33) | @Override
    method createFromParcel (line 39) | @Override
    method newArray (line 44) | @Override

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/models/Sticker.java
  class Sticker (line 7) | public class Sticker implements Parcelable {
    method Sticker (line 11) | public Sticker(@DrawableRes int image) {
    method getImage (line 15) | public int getImage() {
    method setImage (line 19) | public void setImage(int image) {
    method Sticker (line 23) | protected Sticker(Parcel in) {
    method describeContents (line 27) | @Override
    method writeToParcel (line 32) | @Override
    method createFromParcel (line 38) | @Override
    method newArray (line 43) | @Override

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/models/StickersSet.java
  class StickersSet (line 8) | public class StickersSet {
    method StickersSet (line 17) | public StickersSet(@StringRes int title, @DrawableRes int icon, List<S...
    method getStickers (line 23) | public List<Sticker> getStickers() {
    method getTitle (line 27) | public int getTitle() {
    method getIcon (line 31) | public int getIcon() {

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/models/Text.java
  class Text (line 5) | public class Text {
    method Text (line 10) | public Text(String text, Typeface typeface, int color) {
    method getText (line 16) | public String getText() {
    method setText (line 20) | public void setText(String text) {
    method getTypeface (line 24) | public Typeface getTypeface() {
    method setTypeface (line 28) | public void setTypeface(Typeface typeface) {
    method getColor (line 32) | public int getColor() {
    method setColor (line 36) | public void setColor(int color) {

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/models/Tool.java
  class Tool (line 8) | public class Tool {
    method Tool (line 17) | public Tool(@StringRes int title, @DrawableRes int icon, @NonNull Frag...
    method getIcon (line 23) | public int getIcon() {
    method getTitle (line 27) | public int getTitle() {
    method getFragment (line 31) | public Fragment getFragment() {

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/presenters/activity/EditorActivityPresenter.java
  class EditorActivityPresenter (line 22) | @InjectViewState
    method EditorActivityPresenter (line 33) | public EditorActivityPresenter(@NonNull Context context, @NonNull Inte...
    method onBackPressed (line 51) | public void onBackPressed(@NonNull Bitmap alteredBitmap) {
    method setAlteredImageUri (line 59) | public void setAlteredImageUri(@NonNull Uri uri) {
    method save (line 63) | public void save(@NonNull Bitmap bitmap) {
    method share (line 67) | public void share(@Nullable String packageName) {
    method isApplicationExist (line 84) | private boolean isApplicationExist(Context context, @Nullable String p...

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/presenters/activity/GalleryActivityPresenter.java
  class GalleryActivityPresenter (line 8) | @InjectViewState

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/presenters/activity/HomeActivityPresenter.java
  class HomeActivityPresenter (line 27) | @InjectViewState
    method openCamera (line 31) | public void openCamera(@NonNull Context context) {
    method openGallery (line 35) | public void openGallery(@NonNull Context context) {
    method startEditing (line 39) | public void startEditing(int requestCode, int resultCode) {
    method checkPermission (line 45) | private void checkPermission(Context context, String permission) {
    method startCamera (line 74) | private void startCamera(Context context) {
    method createImageFile (line 90) | private File createImageFile(Context context) throws IOException {

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/presenters/activity/PreviewActivityPresenter.java
  class PreviewActivityPresenter (line 29) | @InjectViewState
    method PreviewActivityPresenter (line 31) | public PreviewActivityPresenter(@NonNull Context context, @NonNull Int...
    method onSuccess (line 61) | @Override
    method onError (line 66) | @Override
    method onSuccess (line 73) | @Override
    method onError (line 79) | @Override
    method initCropModes (line 85) | private void initCropModes() {
    method changeCropMode (line 92) | public void changeCropMode(@NonNull TabLayout.Tab tab) {
    method cropImage (line 122) | public void cropImage(Uri uri, CropImageView cropImageView) {
    method flipImageHorizontal (line 127) | public void flipImageHorizontal(Bitmap bitmap) {
    method flipImageVertical (line 139) | public void flipImageVertical(Bitmap bitmap) {

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/presenters/fragment/AddTextPresenter.java
  class AddTextPresenter (line 16) | @InjectViewState
    method changeTextColor (line 18) | public void changeTextColor(@NonNull Context context, EditorColor edit...
    method addText (line 22) | public void addText(String text, Typeface typeface, int color) {

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/presenters/fragment/AdjustPresenter.java
  class AdjustPresenter (line 16) | @InjectViewState
    method AdjustPresenter (line 21) | public AdjustPresenter() {
    method changeAdjust (line 26) | public void changeAdjust(Adjust adjust) {

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/presenters/fragment/ColorsPresenter.java
  class ColorsPresenter (line 14) | @InjectViewState
    method ColorsPresenter (line 19) | public ColorsPresenter() {

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/presenters/fragment/DrawingPresenter.java
  class DrawingPresenter (line 21) | @InjectViewState
    method DrawingPresenter (line 29) | public DrawingPresenter() {
    method changeBrushColor (line 36) | public void changeBrushColor(@NonNull Context context, EditorColor edi...

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/presenters/fragment/FiltersPresenter.java
  class FiltersPresenter (line 24) | @InjectViewState
    method FiltersPresenter (line 29) | public FiltersPresenter(@NonNull Context context, @NonNull Bitmap bitm...
    method changeFilter (line 37) | public void changeFilter(@NonNull Filter filter) {
    method changeFilterIntensity (line 41) | public void changeFilterIntensity(@NonNull Paint filterPaint) {

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/presenters/fragment/FontsPresenter.java
  class FontsPresenter (line 14) | @InjectViewState
    method FontsPresenter (line 19) | public FontsPresenter() {

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/presenters/fragment/FramesPresenter.java
  class FramesPresenter (line 21) | @InjectViewState
    method FramesPresenter (line 26) | public FramesPresenter() {
    method changeOverlay (line 31) | public void changeOverlay(@NonNull Context context, Frame frame) {

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/presenters/fragment/GalleryAlbumsPresenter.java
  class GalleryAlbumsPresenter (line 11) | @InjectViewState
    method fetchImages (line 13) | public void fetchImages(Context context) {

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/presenters/fragment/GalleryImagesPresenter.java
  class GalleryImagesPresenter (line 13) | @InjectViewState
    method GalleryImagesPresenter (line 15) | public GalleryImagesPresenter(@NonNull Bundle bundle) {
    method setupAlbumImages (line 19) | private void setupAlbumImages(Bundle bundle) {
    method setImageForEdit (line 27) | public void setImageForEdit(Image image) {

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/presenters/fragment/ImageAdjustmentPresenter.java
  class ImageAdjustmentPresenter (line 17) | @InjectViewState
    method ImageAdjustmentPresenter (line 21) | public ImageAdjustmentPresenter(@NonNull Bundle bundle) {
    method onResume (line 31) | public void onResume() {
    method progressChanged (line 57) | public void progressChanged(int value) {
    method setupSlider (line 80) | private void setupSlider() {
    method getToolTitle (line 100) | private int getToolTitle() {

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/presenters/fragment/OverlaysPresenter.java
  class OverlaysPresenter (line 21) | @InjectViewState
    method OverlaysPresenter (line 26) | public OverlaysPresenter() {
    method changeOverlay (line 31) | public void changeOverlay(@NonNull Context context, Overlay overlay) {

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/presenters/fragment/StickersPresenter.java
  class StickersPresenter (line 29) | @InjectViewState
    method StickersPresenter (line 39) | public StickersPresenter(@NonNull Bundle bundle) {
    method setupStickersSet (line 44) | private void setupStickersSet(Bundle bundle) {
    method stickerClicked (line 57) | public void stickerClicked(@NonNull Context context, Sticker sticker) {

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/presenters/fragment/StickersSetPresenter.java
  class StickersSetPresenter (line 18) | @InjectViewState
    method StickersSetPresenter (line 23) | public StickersSetPresenter() {
    method stickersSetClicked (line 28) | public void stickersSetClicked(StickersSet stickersSet) {

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/presenters/fragment/TiltShiftFragmentPresenter.java
  class TiltShiftFragmentPresenter (line 9) | @InjectViewState
    method changeTiltShift (line 11) | public void changeTiltShift(EditorTool command) {

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/presenters/fragment/ToolsPresenter.java
  class ToolsPresenter (line 16) | @InjectViewState
    method ToolsPresenter (line 21) | public ToolsPresenter() {

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/presenters/fragment/TransformPresenter.java
  class TransformPresenter (line 9) | @InjectViewState
    method setupTransform (line 12) | public void setupTransform(EditorTool editorTool) {

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/presenters/fragment/TransparencyPresenter.java
  class TransparencyPresenter (line 15) | @InjectViewState
    method TransparencyPresenter (line 21) | public TransparencyPresenter(@NonNull Bundle bundle) {
    method progressChanged (line 30) | public void progressChanged(int value) {
    method cancelChanges (line 39) | public void cancelChanges() {
    method applyChanges (line 44) | public void applyChanges() {
    method getStringValue (line 48) | private String getStringValue(int value) {

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/views/activity/CameraActivityView.java
  type CameraActivityView (line 8) | public interface CameraActivityView extends MvpView {
    method setupCamera (line 9) | void setupCamera(Fragment fragment);
    method setupFragment (line 11) | void setupFragment(Fragment fragment);
    method hideFiltersButton (line 13) | void hideFiltersButton();
    method setFilter (line 15) | void setFilter(ColorMatrix colorMatrix);

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/views/activity/EditorActivityView.java
  type EditorActivityView (line 11) | public interface EditorActivityView extends MvpView {
    method startEditing (line 13) | void startEditing(Bitmap bitmap);
    method showLoading (line 15) | void showLoading();
    method hideLoading (line 17) | void hideLoading();
    method showAlertDialog (line 19) | void showAlertDialog();
    method showApplicationNotExistAlertDialog (line 21) | void showApplicationNotExistAlertDialog(@StringRes int messageBody, @N...
    method showToastMessage (line 23) | void showToastMessage(int stringResource);
    method navigateBack (line 25) | void navigateBack(boolean isFragment);
    method share (line 27) | void share(@NonNull Uri uri, @Nullable String packageName);

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/views/activity/GalleryView.java
  type GalleryView (line 7) | public interface GalleryView extends MvpView {
    method showImages (line 8) | void showImages(ImageAlbum imageAlbum);

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/views/activity/HomeView.java
  type HomeView (line 8) | public interface HomeView extends MvpView {
    method startGallery (line 9) | void startGallery();
    method startCamera (line 11) | void startCamera(Uri uri);
    method startEditing (line 13) | void startEditing(String photoPath);
    method showPermissionDenied (line 15) | void showPermissionDenied(@StringRes int message);

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/views/activity/PreviewView.java
  type PreviewView (line 11) | public interface PreviewView extends MvpView {
    method setupImage (line 13) | void setupImage(Bitmap bitmap);
    method onCropModeChanged (line 15) | void onCropModeChanged(CropImageView.CropMode cropMode);
    method startEditingImage (line 17) | void startEditingImage(Uri uri);
    method showProgress (line 19) | void showProgress();
    method flipImage (line 21) | void flipImage(Drawable drawable);
    method dismissProgress (line 23) | void dismissProgress();
    method createTab (line 25) | void createTab(@StringRes int title, boolean selected);

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/views/fragment/AddTextView.java
  type AddTextView (line 10) | public interface AddTextView extends MvpView {
    method addText (line 11) | void addText(Text text);
    method onTextColorChanged (line 13) | void onTextColorChanged(@ColorInt int color);
    method showToastMessage (line 15) | void showToastMessage(@StringRes int messageText);

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/views/fragment/AdjustView.java
  type AdjustView (line 13) | public interface AdjustView extends MvpView {
    method setupAdapter (line 14) | void setupAdapter(List<Adjust> adjusts);
    method adjustChanged (line 16) | @StateStrategyType(SkipStrategy.class)

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/views/fragment/ColorsView.java
  type ColorsView (line 9) | public interface ColorsView extends MvpView {
    method setupAdapter (line 10) | void setupAdapter(List<EditorColor> colors);

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/views/fragment/DrawingView.java
  type DrawingView (line 12) | public interface DrawingView extends MvpView {
    method setupSizesAdapter (line 13) | void setupSizesAdapter(List<BrushSize> sizes);
    method setupColorsAdapter (line 15) | void setupColorsAdapter(List<EditorColor> colors);
    method onBrushColorChanged (line 17) | void onBrushColorChanged(@ColorInt int color);

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/views/fragment/FiltersView.java
  type FiltersView (line 13) | public interface FiltersView extends MvpView {
    method setupFiltersAdapter (line 14) | void setupFiltersAdapter(Uri uri, List<Filter> filters);
    method filterChanged (line 16) | void filterChanged(ColorMatrix colorMatrix);
    method onChangeFilterIntensityClicked (line 18) | void onChangeFilterIntensityClicked(Fragment fragment);

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/views/fragment/FontsView.java
  type FontsView (line 9) | public interface FontsView extends MvpView {
    method setupAdapter (line 10) | void setupAdapter(List<Font> fonts);

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/views/fragment/FramesView.java
  type FramesView (line 11) | public interface FramesView extends MvpView {
    method setupAdapter (line 12) | void setupAdapter(List<Frame> frames);
    method onFrameChanged (line 14) | void onFrameChanged(Bitmap bitmap);

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/views/fragment/GalleryAlbumsView.java
  type GalleryAlbumsView (line 9) | public interface GalleryAlbumsView extends MvpView {
    method showNoImages (line 10) | void showNoImages();
    method setupAdapter (line 12) | void setupAdapter(List<ImageAlbum> imageAlbums);

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/views/fragment/GalleryImagesView.java
  type GalleryImagesView (line 9) | public interface GalleryImagesView extends MvpView {
    method setupAdapter (line 10) | void setupAdapter(List<Image> images);
    method editImage (line 12) | void editImage(String imagePath);

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/views/fragment/ImageAdjustmentView.java
  type ImageAdjustmentView (line 9) | public interface ImageAdjustmentView extends MvpView {
    method changeToolbarTitle (line 10) | void changeToolbarTitle(@StringRes int title);
    method changeToolbarSubtitle (line 12) | void changeToolbarSubtitle(@StringRes int subtitle);
    method onIntensityChanged (line 14) | void onIntensityChanged(int value);
    method onBrightnessChanged (line 16) | void onBrightnessChanged(int value);
    method onContrastChanged (line 18) | void onContrastChanged(int value);
    method onSaturationChanged (line 20) | void onSaturationChanged(int value);
    method onWarmthChanged (line 22) | void onWarmthChanged(int value);
    method onStraightenTransformChanged (line 24) | void onStraightenTransformChanged(int value);
    method onVignetteChanged (line 26) | void onVignetteChanged(int value);
    method setEditorTool (line 28) | void setEditorTool(EditorTool tool);
    method setSeekBarValues (line 30) | void setSeekBarValues(int minValue, int maxValue, int value);

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/views/fragment/IntensityView.java
  type IntensityView (line 5) | public interface IntensityView extends MvpView {
    method onTransparencyChanged (line 6) | void onTransparencyChanged(String value);

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/views/fragment/OverlaysView.java
  type OverlaysView (line 11) | public interface OverlaysView extends MvpView {
    method setupAdapter (line 12) | void setupAdapter(List<Overlay> overlays);
    method onOverlayChanged (line 14) | void onOverlayChanged(Bitmap bitmap);

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/views/fragment/StickersSetView.java
  type StickersSetView (line 15) | public interface StickersSetView extends MvpView {
    method setupAdapter (line 16) | void setupAdapter(List<StickersSet> stickersSets);
    method showStickers (line 18) | @StateStrategyType(SkipStrategy.class)

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/views/fragment/StickersView.java
  type StickersView (line 14) | public interface StickersView extends MvpView {
    method setupAdapter (line 15) | void setupAdapter(List<Sticker> stickers);
    method setupToolbarSubtitle (line 17) | void setupToolbarSubtitle(@StringRes int subtitle);
    method addSticker (line 19) | @StateStrategyType(SkipStrategy.class)

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/views/fragment/TiltShiftView.java
  type TiltShiftView (line 7) | public interface TiltShiftView extends MvpView {
    method onTiltShiftChanged (line 8) | void onTiltShiftChanged(EditorTool command);

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/views/fragment/ToolsView.java
  type ToolsView (line 9) | public interface ToolsView extends MvpView {
    method setupTools (line 10) | void setupTools(List<Tool> tools);

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/views/fragment/TransformHorizontalView.java
  type TransformHorizontalView (line 3) | public interface TransformHorizontalView {

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/views/fragment/TransformStraightenView.java
  type TransformStraightenView (line 3) | public interface TransformStraightenView {

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/views/fragment/TransformVerticalView.java
  type TransformVerticalView (line 3) | public interface TransformVerticalView {

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/views/fragment/TransformView.java
  type TransformView (line 5) | public interface TransformView extends MvpView {

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/tasks/DecodeScaledImageAsyncTask.java
  class DecodeScaledImageAsyncTask (line 15) | public class DecodeScaledImageAsyncTask extends AsyncTask<String, Void, ...
    type OnProgressListener (line 24) | public interface OnProgressListener {
      method onStarted (line 25) | void onStarted();
      method onFinished (line 27) | void onFinished(Bitmap bitmap);
    method DecodeScaledImageAsyncTask (line 30) | public DecodeScaledImageAsyncTask(Context context) {
    method onPreExecute (line 34) | @Override
    method doInBackground (line 41) | @Override
    method onPostExecute (line 46) | @Override
    method setProgressListener (line 51) | public void setProgressListener(OnProgressListener listener) {
    method calculateMaxBitmapSize (line 55) | private int calculateMaxBitmapSize(@NonNull Context context) {
    method calculateInSampleSize (line 82) | private int calculateInSampleSize(
    method decodeSampledBitmapFromFile (line 103) | private Bitmap decodeSampledBitmapFromFile(String path, int reqWidth, ...

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/tasks/ImageCacheSaveTask.java
  class ImageCacheSaveTask (line 16) | public class ImageCacheSaveTask extends AsyncTask<Void, Void, Uri> {
    type OnImageCacheSaveListener (line 22) | public interface OnImageCacheSaveListener {
      method onSaveStarted (line 23) | void onSaveStarted();
      method onImageSaved (line 25) | void onImageSaved(Uri uri);
    method setOnImageLoadedListener (line 28) | public void setOnImageLoadedListener(OnImageCacheSaveListener onImageC...
    method ImageCacheSaveTask (line 32) | public ImageCacheSaveTask(Context context, Bitmap bitmap) {
    method onPreExecute (line 37) | @Override
    method doInBackground (line 43) | @Override
    method onPostExecute (line 72) | @Override
    method getTempFile (line 79) | private File getTempFile(Context context) throws IOException {

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/tasks/ImageFetchTask.java
  class ImageFetchTask (line 17) | public class ImageFetchTask extends AsyncTask<Void, Void, List<ImageAlbu...
    type OnImageLoadedListener (line 29) | public interface OnImageLoadedListener {
      method onImageLoaded (line 30) | void onImageLoaded(List<ImageAlbum> imageAlba);
    method setOnImageLoadedListener (line 33) | public void setOnImageLoadedListener(OnImageLoadedListener listener) {
    method ImageFetchTask (line 37) | public ImageFetchTask(Context context) {
    method onPreExecute (line 41) | @Override
    method doInBackground (line 46) | @Override
    method onPostExecute (line 82) | @Override

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/tasks/ImageSaveTask.java
  class ImageSaveTask (line 20) | public class ImageSaveTask extends AsyncTask<Void, Void, Void> {
    method ImageSaveTask (line 31) | public ImageSaveTask(Context context, Bitmap bitmap) {
    method onPreExecute (line 38) | @Override
    method doInBackground (line 44) | @Override
    method onPostExecute (line 65) | @Override
    method getOutputMediaFile (line 73) | private File getOutputMediaFile() {

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/ui/activities/EditorActivity.java
  class EditorActivity (line 49) | public class EditorActivity extends MvpAppCompatActivity implements Edit...
    method provideEditorPresenter (line 53) | @ProvidePresenter
    method onCreate (line 76) | @Override
    method onCreateOptionsMenu (line 134) | @Override
    method onOptionsItemSelected (line 141) | @Override
    method showSharePopupMenu (line 155) | private void showSharePopupMenu() {
    method onDestroy (line 196) | @Override
    method onSupportNavigateUp (line 201) | @Override
    method onBackPressed (line 207) | @Override
    method startEditing (line 221) | @Override
    method showLoading (line 226) | @Override
    method hideLoading (line 231) | @Override
    method showAlertDialog (line 236) | @Override
    method showApplicationNotExistAlertDialog (line 248) | @Override
    method setupFragment (line 267) | public void setupFragment(Fragment fragment) {
    method showToastMessage (line 281) | @Override
    method navigateBack (line 286) | @Override
    method share (line 299) | @Override
    method onClickUndo (line 313) | @OnClick(R.id.button_undo)

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/ui/activities/GalleryActivity.java
  class GalleryActivity (line 21) | public class GalleryActivity extends MvpAppCompatActivity implements Gal...
    method onCreate (line 30) | @Override
    method onSupportNavigateUp (line 51) | @Override
    method onBackPressed (line 57) | @Override
    method showImages (line 68) | @Override

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/ui/activities/HomeActivity.java
  class HomeActivity (line 21) | public class HomeActivity extends MvpAppCompatActivity implements HomeVi...
    method onCreate (line 27) | @Override
    method onClickCamera (line 36) | @OnClick(R.id.button_camera)
    method onClickGallery (line 41) | @OnClick(R.id.gallery_button)
    method onActivityResult (line 46) | @Override
    method startGallery (line 52) | @Override
    method startCamera (line 58) | @Override
    method startEditing (line 67) | @Override
    method showPermissionDenied (line 74) | @Override

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/ui/activities/PreviewActivity.java
  class PreviewActivity (line 32) | public class PreviewActivity extends MvpAppCompatActivity implements Pre...
    method providePreviewPresenter (line 38) | @ProvidePresenter
    method onCreate (line 54) | @Override
    method onCreateOptionsMenu (line 87) | @Override
    method onOptionsItemSelected (line 94) | @Override
    method onSupportNavigateUp (line 105) | @Override
    method onClickFlipHorizontal (line 111) | @OnClick(R.id.button_flip_horizontal)
    method onClickFlipVertical (line 116) | @OnClick(R.id.button_flip_vertical)
    method onClickRotateLeft (line 121) | @OnClick(R.id.button_rotate_left)
    method onClickRotateRight (line 126) | @OnClick(R.id.button_rotate_right)
    method createSaveUri (line 131) | public Uri createSaveUri() {
    method setupImage (line 135) | @Override
    method onCropModeChanged (line 142) | @Override
    method startEditingImage (line 147) | @Override
    method showProgress (line 156) | @Override
    method flipImage (line 161) | @Override
    method dismissProgress (line 166) | @Override
    method createTab (line 171) | @Override

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/ui/dialogs/ColorPickerDialog.java
  class ColorPickerDialog (line 18) | public class ColorPickerDialog extends Dialog {
    type OnColorClickListener (line 26) | public interface OnColorClickListener {
      method onClick (line 27) | void onClick(EditorColor editorColor);
    method ColorPickerDialog (line 35) | public ColorPickerDialog(Context context) {
    method onCreate (line 42) | @Override
    method onClickApply (line 59) | @OnClick(R.id.applyColor)
    method onClickCancel (line 65) | @OnClick(R.id.cancelColor)
    method setOnColorClickListener (line 70) | public void setOnColorClickListener(OnColorClickListener onColorClickL...
    method onClickRGB (line 76) | @OnClick(R.id.rgbButton)
    method onClikcARGB (line 82) | @OnClick(R.id.argbButton)

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/ui/dialogs/FontPickerDialog.java
  class FontPickerDialog (line 26) | public class FontPickerDialog extends Dialog {
    type OnFontClickListener (line 40) | public interface OnFontClickListener {
      method onClick (line 41) | void onClick(Typeface typeface);
    method FontPickerDialog (line 47) | public FontPickerDialog(Context context) {
    method FontPickerDialog (line 52) | public FontPickerDialog(Context context, int themeResId) {
    method onCreate (line 57) | @Override
    method initFontsList (line 84) | private void initFontsList() {
    method setOnFontClickListener (line 95) | public void setOnFontClickListener(OnFontClickListener onFontClickList...
    method isItalic (line 99) | public boolean isItalic() {
    method setItalic (line 103) | public void setItalic(boolean italic) {
    method isBold (line 107) | public boolean isBold() {
    method setBold (line 111) | public void setBold(boolean bold) {
    method getText (line 115) | public String getText() {
    method setText (line 119) | public void setText(String text) {

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/ui/dialogs/LoadingDialog.java
  class LoadingDialog (line 12) | public class LoadingDialog extends Dialog {
    method LoadingDialog (line 14) | public LoadingDialog(Context context) {
    method onCreate (line 18) | @Override

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/ui/fragments/AdjustFragment.java
  class AdjustFragment (line 33) | public class AdjustFragment extends MvpAppCompatFragment implements Adju...
    method onCreate (line 42) | @Override
    method onCreateView (line 48) | @Override
    method onResume (line 57) | @Override
    method onDestroyView (line 66) | @Override
    method onPrepareOptionsMenu (line 72) | @Override
    method setupAdapter (line 78) | @Override
    method adjustChanged (line 88) | @Override

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/ui/fragments/DrawingFragment.java
  class DrawingFragment (line 31) | public class DrawingFragment extends ToolFragment implements DrawingView {
    method newInstance (line 45) | public static DrawingFragment newInstance() {
    method onCreate (line 49) | @Override
    method onCreateView (line 55) | @Override
    method onActivityCreated (line 64) | @Override
    method onResume (line 69) | @Override
    method onDestroyView (line 76) | @Override
    method setupSizesAdapter (line 82) | @Override
    method setupColorsAdapter (line 94) | @Override
    method onBrushColorChanged (line 106) | @Override

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/ui/fragments/FiltersFragment.java
  class FiltersFragment (line 34) | public class FiltersFragment extends ToolFragment implements FiltersView {
    method provideFilterPresenter (line 38) | @ProvidePresenter
    method newInstance (line 52) | public static FiltersFragment newInstance() {
    method FiltersFragment (line 56) | public FiltersFragment() {
    method onCreate (line 59) | @Override
    method onCreateView (line 65) | @Override
    method onActivityCreated (line 74) | @Override
    method onResume (line 79) | @Override
    method onDestroyView (line 86) | @Override
    method setupFiltersAdapter (line 92) | @Override
    method filterChanged (line 114) | @Override
    method onChangeFilterIntensityClicked (line 119) | @Override

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/ui/fragments/FontsFragment.java
  class FontsFragment (line 30) | public class FontsFragment extends ToolFragment implements FontsView {
    method newInstance (line 41) | public static FontsFragment newInstance() {
    method onCreate (line 45) | @Override
    method onCreateView (line 51) | @Override
    method onActivityCreated (line 60) | @Override
    method onResume (line 65) | @Override
    method onDestroyView (line 72) | @Override
    method onOptionsItemSelected (line 78) | @Override
    method setupAdapter (line 87) | @Override

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/ui/fragments/FramesFragment.java
  class FramesFragment (line 29) | public class FramesFragment extends ToolFragment implements FramesView {
    method onCreate (line 40) | @Override
    method onCreateView (line 46) | @Override
    method onActivityCreated (line 55) | @Override
    method onResume (line 60) | @Override
    method onDestroyView (line 67) | @Override
    method setupAdapter (line 73) | @Override
    method onFrameChanged (line 81) | @Override

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/ui/fragments/GalleryAlbumsFragment.java
  class GalleryAlbumsFragment (line 29) | public class GalleryAlbumsFragment extends MvpAppCompatFragment implemen...
    method onCreate (line 41) | @Override
    method onCreateView (line 46) | @Override
    method onActivityCreated (line 55) | @Override
    method onResume (line 60) | @Override
    method onDestroyView (line 66) | @Override
    method showNoImages (line 72) | @Override
    method setupAdapter (line 77) | @Override
    method onClickTakePhoto (line 90) | @OnClick(R.id.button_take_photo)

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/ui/fragments/GalleryImagesFragment.java
  class GalleryImagesFragment (line 29) | public class GalleryImagesFragment extends MvpAppCompatFragment implemen...
    method provideGalleryImagesPresenter (line 35) | @ProvidePresenter
    method newInstance (line 45) | public static GalleryImagesFragment newInstance(ArrayList<Image> image...
    method GalleryImagesFragment (line 55) | public GalleryImagesFragment() {
    method onCreateView (line 58) | @Override
    method onDestroyView (line 67) | @Override
    method setupAdapter (line 73) | @Override
    method editImage (line 83) | @Override

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/ui/fragments/ImageAdjustmentFragment.java
  class ImageAdjustmentFragment (line 27) | public class ImageAdjustmentFragment extends ToolFragment implements Ima...
    method provideImageAdjustmentPresenter (line 33) | @ProvidePresenter
    method newInstance (line 54) | public static ImageAdjustmentFragment newInstance(EditorTool editorToo...
    method ImageAdjustmentFragment (line 64) | public ImageAdjustmentFragment() {
    method onCreate (line 67) | @Override
    method onCreateView (line 74) | @Override
    method onResume (line 100) | @Override
    method onDestroyView (line 106) | @Override
    method changeToolbarTitle (line 112) | @Override
    method changeToolbarSubtitle (line 117) | @Override
    method onIntensityChanged (line 122) | @Override
    method onBrightnessChanged (line 129) | @Override
    method onContrastChanged (line 134) | @Override
    method onSaturationChanged (line 139) | @Override
    method onWarmthChanged (line 144) | @Override
    method onStraightenTransformChanged (line 149) | @Override
    method onVignetteChanged (line 154) | @Override
    method setEditorTool (line 159) | @Override
    method setSeekBarValues (line 164) | @Override

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/ui/fragments/OverlaysFragment.java
  class OverlaysFragment (line 29) | public class OverlaysFragment extends ToolFragment implements OverlaysVi...
    method onCreate (line 40) | @Override
    method onCreateView (line 47) | @Override
    method onResume (line 56) | @Override
    method onDestroyView (line 63) | @Override
    method setupAdapter (line 69) | @Override
    method onOverlayChanged (line 82) | @Override

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/ui/fragments/StickersFragment.java
  class StickersFragment (line 31) | public class StickersFragment extends ToolFragment implements StickersVi...
    method provideStickersPresenter (line 38) | @ProvidePresenter
    method newInstance (line 48) | public static StickersFragment newInstance(@StringRes int title, @NonN...
    method StickersFragment (line 60) | public StickersFragment() {
    method onActivityCreated (line 63) | @Override
    method onResume (line 68) | @Override
    method onCreateView (line 73) | @Override
    method onDestroyView (line 82) | @Override
    method setupAdapter (line 88) | @Override
    method setupToolbarSubtitle (line 101) | @Override
    method addSticker (line 106) | @Override

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/ui/fragments/StickersSetFragment.java
  class StickersSetFragment (line 32) | public class StickersSetFragment extends ToolFragment implements Sticker...
    method onCreate (line 43) | @Override
    method onCreateView (line 49) | @Override
    method onActivityCreated (line 58) | @Override
    method onResume (line 63) | @Override
    method onDestroyView (line 71) | @Override
    method setupAdapter (line 77) | @Override
    method showStickers (line 90) | @Override

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/ui/fragments/TextFragment.java
  class TextFragment (line 33) | public class TextFragment extends ToolFragment implements AddTextView {
    method newInstance (line 51) | public static TextFragment newInstance() {
    method onCreate (line 55) | @Override
    method onCreateView (line 61) | @Override
    method onActivityCreated (line 73) | @Override
    method onResume (line 78) | @Override
    method onDestroyView (line 85) | @Override
    method addText (line 91) | @Override
    method onTextColorChanged (line 96) | @Override
    method showToastMessage (line 101) | @Override
    method onClickAddText (line 106) | @OnClick(R.id.addTextButton)
    method onClickTextColorButton (line 111) | @OnClick(R.id.selectTextColorButton)
    method onClickTextButton (line 116) | @OnClick(R.id.selectFontButton)

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/ui/fragments/TiltShiftFragment.java
  class TiltShiftFragment (line 24) | public class TiltShiftFragment extends ToolFragment implements TiltShift...
    method onCreate (line 32) | @Override
    method onCreateView (line 39) | @Override
    method onActivityCreated (line 48) | @Override
    method onResume (line 53) | @Override
    method onDestroyView (line 61) | @Override
    method onTiltShiftChanged (line 67) | @Override
    method onClickLinear (line 72) | @OnClick(R.id.button_linear_tilt_shift)
    method onClickRadial (line 77) | @OnClick(R.id.button_radial_tilt_shift)

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/ui/fragments/ToolFragment.java
  class ToolFragment (line 11) | public abstract class ToolFragment extends MvpAppCompatFragment {
    method onCreate (line 12) | @Override
    method onPrepareOptionsMenu (line 18) | @Override
    method onCreateOptionsMenu (line 24) | @Override

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/ui/fragments/ToolsFragment.java
  class ToolsFragment (line 30) | public class ToolsFragment extends MvpAppCompatFragment implements Tools...
    method onActivityCreated (line 39) | @Override
    method onCreateView (line 44) | @Override
    method onResume (line 53) | @Override
    method onDestroyView (line 69) | @Override
    method setupTools (line 75) | @Override

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/ui/fragments/TransformFragment.java
  class TransformFragment (line 28) | public class TransformFragment extends MvpAppCompatFragment implements T...
    method onCreate (line 36) | @Override
    method onCreateView (line 43) | @Override
    method onActivityCreated (line 52) | @Override
    method onResume (line 57) | @Override
    method onDestroyView (line 66) | @Override
    method onPrepareOptionsMenu (line 72) | @Override
    method onClickTransformHorizontal (line 78) | @OnClick(R.id.transformHorizontalButton)
    method onClickTransformStraighten (line 85) | @OnClick(R.id.transformStraightenButton)
    method onClickTransformVertical (line 92) | @OnClick(R.id.transformVerticalButton)

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/ui/fragments/TransparencyFragment.java
  class TransparencyFragment (line 33) | public class TransparencyFragment extends MvpAppCompatFragment implement...
    method provideTransparencyPresenter (line 39) | @ProvidePresenter
    method newInstance (line 57) | public static TransparencyFragment newInstance(Paint paint) {
    method TransparencyFragment (line 67) | public TransparencyFragment() {
    method onCreate (line 70) | @Override
    method onPrepareOptionsMenu (line 78) | @Override
    method onCreateOptionsMenu (line 84) | @Override
    method onCreateView (line 90) | @Override
    method onActivityCreated (line 116) | @Override
    method onResume (line 121) | @Override
    method onDestroyView (line 126) | @Override
    method onTransparencyChanged (line 132) | @Override
    method onClickApply (line 138) | @OnClick(R.id.transparencyApplyButton)
    method onClickCancel (line 143) | @OnClick(R.id.transparencyCancelButton)

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/utils/BitmapUtil.java
  class BitmapUtil (line 21) | public class BitmapUtil {
    method getUriOfBitmap (line 22) | public static Uri getUriOfBitmap(Context context, Bitmap bitmap) {
    method drawable2Bitmap (line 43) | public static Bitmap drawable2Bitmap(Context context, int drawableId) {
    method vectorDrawable2Bitmap (line 58) | @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/utils/LogHelper.java
  class LogHelper (line 11) | public class LogHelper {
    method logBitmap (line 14) | public static void logBitmap(@NonNull String prefix, @NonNull Bitmap b...
    method logMatrix (line 22) | public static void logMatrix(@NonNull String prefix, @NonNull Matrix m...
    method logRect (line 35) | public static void logRect(@NonNull String prefix, @NonNull Rect rect) {
    method logRect (line 44) | public static void logRect(@NonNull String prefix, @NonNull RectF rect...
    method getMatrixValue (line 53) | private static float getMatrixValue(@NonNull Matrix matrix, @IntRange(...
    method getMatrixScale (line 60) | private static float getMatrixScale(@NonNull Matrix matrix) {
    method getMatrixAngle (line 65) | private static float getMatrixAngle(@NonNull Matrix matrix) {

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/utils/MatrixUtil.java
  class MatrixUtil (line 8) | public class MatrixUtil {
    method matrixInfo (line 11) | public static void matrixInfo(@NonNull String logPrefix, @NonNull Matr...
    method getMatrixValue (line 19) | private static float getMatrixValue(@NonNull Matrix matrix, @IntRange(...
    method getMatrixX (line 26) | public static float getMatrixX(@NonNull Matrix matrix) {
    method getMatrixY (line 30) | public static float getMatrixY(@NonNull Matrix matrix) {
    method getScale (line 34) | public static float getScale(@NonNull Matrix matrix) {
    method getAngle (line 39) | public static float getAngle(@NonNull Matrix matrix) {

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/utils/MotionEventUtil.java
  class MotionEventUtil (line 5) | public class MotionEventUtil {
    method getDisplayDistance (line 6) | public static float getDisplayDistance(int width, int height) {
    method getDelta (line 10) | public static float getDelta(MotionEvent event) {
    method getAngle (line 26) | public static float getAngle(MotionEvent event) {

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/utils/RectUtil.java
  class RectUtil (line 5) | public class RectUtil {
    method scaleRect (line 6) | public static void scaleRect(RectF rectF, float scale) {
    method scaleRect2 (line 22) | public static void scaleRect2(RectF rectF, float scale) {
    method rotateRect (line 29) | public static void rotateRect(RectF rectF, float centerX, float centerY,

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/utils/SizeUtil.java
  class SizeUtil (line 5) | public class SizeUtil {
    method dp2px (line 8) | public static float dp2px(float dp) {
    method px2dp (line 12) | public static float px2dp(float px) {
    method getDensity (line 16) | private static float getDensity() {

FILE: iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/utils/ToolbarUtil.java
  class ToolbarUtil (line 10) | public class ToolbarUtil {
    method showTitle (line 11) | public static void showTitle(boolean showTitle, @NonNull FragmentActiv...
    method updateTitle (line 18) | public static void updateTitle(@StringRes int title,
    method updateSubtitle (line 26) | public static void updateSubtitle(@StringRes int subtitle,
    method updateSubtitle (line 34) | public static void updateSubtitle(@Nullable String subtitle,

FILE: iQuePhoto/app/src/test/java/net/iquesoft/iquephoto/ExampleUnitTest.java
  class ExampleUnitTest (line 10) | public class ExampleUnitTest {
    method addition_isCorrect (line 11) | @Test
Condensed preview — 282 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (526K chars).
[
  {
    "path": "README.md",
    "chars": 2046,
    "preview": "# iQuePhoto - Android Image Editor App (Alpha version).\n\n![iQuePhoto](/iQuePhoto.png)\n\n**iQuePhoto** is simple and omnip"
  },
  {
    "path": "iQuePhoto/.gitignore",
    "chars": 97,
    "preview": "*.iml\n.gradle\n/local.properties\n/.idea/workspace.xml\n/.idea/libraries\n.DS_Store\n/build\n/captures\n"
  },
  {
    "path": "iQuePhoto/.idea/compiler.xml",
    "chars": 686,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"CompilerConfiguration\">\n    <resourceExt"
  },
  {
    "path": "iQuePhoto/.idea/copyright/profiles_settings.xml",
    "chars": 74,
    "preview": "<component name=\"CopyrightManager\">\n  <settings default=\"\" />\n</component>"
  },
  {
    "path": "iQuePhoto/.idea/dictionaries/Sergey.xml",
    "chars": 143,
    "preview": "<component name=\"ProjectDictionaryState\">\n  <dictionary name=\"Sergey\">\n    <words>\n      <w>emoji</w>\n    </words>\n  </d"
  },
  {
    "path": "iQuePhoto/.idea/gradle.xml",
    "chars": 626,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"GradleSettings\">\n    <option name=\"linke"
  },
  {
    "path": "iQuePhoto/.idea/misc.xml",
    "chars": 2226,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"EntryPointsManager\">\n    <entry_points v"
  },
  {
    "path": "iQuePhoto/.idea/modules.xml",
    "chars": 355,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"ProjectModuleManager\">\n    <modules>\n   "
  },
  {
    "path": "iQuePhoto/.idea/runConfigurations.xml",
    "chars": 564,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"RunConfigurationProducerService\">\n    <o"
  },
  {
    "path": "iQuePhoto/.idea/vcs.xml",
    "chars": 183,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"VcsDirectoryMappings\">\n    <mapping dire"
  },
  {
    "path": "iQuePhoto/app/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "iQuePhoto/app/build.gradle",
    "chars": 1800,
    "preview": "apply plugin: 'com.android.application'\napply plugin: 'android-apt'\napply plugin: 'me.tatarka.retrolambda'\n\nandroid {\n  "
  },
  {
    "path": "iQuePhoto/app/proguard-rules.pro",
    "chars": 676,
    "preview": "# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in C:"
  },
  {
    "path": "iQuePhoto/app/src/androidTest/java/net/iquesoft/iquephoto/ApplicationTest.java",
    "chars": 353,
    "preview": "package net.iquesoft.iquephoto;\n\nimport android.app.Application;\nimport android.test.ApplicationTestCase;\n\n/**\n * <a hre"
  },
  {
    "path": "iQuePhoto/app/src/main/AndroidManifest.xml",
    "chars": 2049,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package="
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/App.java",
    "chars": 598,
    "preview": "package net.iquesoft.iquephoto;\n\nimport android.app.Application;\n\nimport net.iquesoft.iquephoto.di.AppComponent;\nimport "
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/adapters/AdjustAdapter.java",
    "chars": 2171,
    "preview": "package net.iquesoft.iquephoto.adapters;\n\nimport android.content.Context;\nimport android.support.v4.content.res.Resource"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/adapters/ColorAdapter.java",
    "chars": 2703,
    "preview": "package net.iquesoft.iquephoto.adapters;\n\nimport android.content.Context;\nimport android.support.v4.content.res.Resource"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/adapters/FiltersAdapter.java",
    "chars": 3169,
    "preview": "package net.iquesoft.iquephoto.adapters;\n\nimport android.content.Context;\nimport android.graphics.ColorMatrixColorFilter"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/adapters/FontsAdapter.java",
    "chars": 2742,
    "preview": "package net.iquesoft.iquephoto.adapters;\n\nimport android.content.Context;\nimport android.graphics.Typeface;\nimport andro"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/adapters/FramesAdapter.java",
    "chars": 2608,
    "preview": "package net.iquesoft.iquephoto.adapters;\n\nimport android.content.Context;\nimport android.support.v7.widget.RecyclerView;"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/adapters/ImageAlbumsAdapter.java",
    "chars": 2923,
    "preview": "package net.iquesoft.iquephoto.adapters;\n\nimport android.content.Context;\nimport android.support.v7.widget.RecyclerView;"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/adapters/ImagesAdapter.java",
    "chars": 2502,
    "preview": "package net.iquesoft.iquephoto.adapters;\n\nimport android.content.Context;\nimport android.support.v7.widget.RecyclerView;"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/adapters/OverlaysAdapter.java",
    "chars": 2741,
    "preview": "package net.iquesoft.iquephoto.adapters;\n\nimport android.content.Context;\nimport android.support.v7.widget.RecyclerView;"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/adapters/SizesAdapter.java",
    "chars": 2520,
    "preview": "package net.iquesoft.iquephoto.adapters;\n\nimport android.content.Context;\nimport android.support.v7.widget.RecyclerView;"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/adapters/StickerSetAdapter.java",
    "chars": 2386,
    "preview": "package net.iquesoft.iquephoto.adapters;\n\nimport android.content.Context;\nimport android.support.v7.widget.RecyclerView;"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/adapters/StickersAdapter.java",
    "chars": 2122,
    "preview": "package net.iquesoft.iquephoto.adapters;\n\nimport android.content.Context;\nimport android.support.v7.widget.RecyclerView;"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/adapters/ToolsAdapter.java",
    "chars": 2170,
    "preview": "package net.iquesoft.iquephoto.adapters;\n\nimport android.content.Context;\nimport android.support.v4.content.res.Resource"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/core/EditorListener.java",
    "chars": 259,
    "preview": "package net.iquesoft.iquephoto.core;\n\nimport android.graphics.Paint;\nimport android.net.Uri;\n\npublic interface EditorLis"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/core/EditorView.java",
    "chars": 1616,
    "preview": "package net.iquesoft.iquephoto.core;\n\nimport android.graphics.Bitmap;\nimport android.graphics.Matrix;\nimport android.gra"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/core/ImageEditorView.java",
    "chars": 12434,
    "preview": "package net.iquesoft.iquephoto.core;\n\nimport android.content.Context;\nimport android.graphics.Bitmap;\nimport android.gra"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/core/ImageEditorViewPresenter.java",
    "chars": 27655,
    "preview": "package net.iquesoft.iquephoto.core;\n\nimport android.content.Context;\nimport android.graphics.Bitmap;\nimport android.gra"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/core/enums/EditorMode.java",
    "chars": 133,
    "preview": "package net.iquesoft.iquephoto.core.enums;\n\npublic enum EditorMode {\n    NONE, MOVE, ROTATE_AND_SCALE, RESIZE_HEIGHT, RE"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/core/enums/EditorTool.java",
    "chars": 344,
    "preview": "package net.iquesoft.iquephoto.core.enums;\n\npublic enum EditorTool {\n    NONE, FILTERS, ADJUST, OVERLAY, STICKERS, FRAME"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/core/model/Drawing.java",
    "chars": 602,
    "preview": "package net.iquesoft.iquephoto.core.model;\n\nimport android.graphics.Color;\nimport android.graphics.Paint;\nimport android"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/core/model/EditorFrame.java",
    "chars": 2309,
    "preview": "package net.iquesoft.iquephoto.core.model;\n\nimport android.content.Context;\nimport android.graphics.Bitmap;\nimport andro"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/core/model/EditorImage.java",
    "chars": 474,
    "preview": "package net.iquesoft.iquephoto.core.model;\n\nimport android.graphics.Bitmap;\n\nimport net.iquesoft.iquephoto.core.enums.Ed"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/core/model/EditorLinearTiltShift.java",
    "chars": 8130,
    "preview": "package net.iquesoft.iquephoto.core.model;\n\nimport android.content.Context;\nimport android.graphics.Bitmap;\nimport andro"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/core/model/EditorRadialTiltShift.java",
    "chars": 8633,
    "preview": "package net.iquesoft.iquephoto.core.model;\n\nimport android.animation.Animator;\nimport android.graphics.Bitmap;\nimport an"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/core/model/EditorSticker.java",
    "chars": 9663,
    "preview": "package net.iquesoft.iquephoto.core.model;\n\nimport android.graphics.Bitmap;\nimport android.graphics.Canvas;\nimport andro"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/core/model/EditorText.java",
    "chars": 8995,
    "preview": "package net.iquesoft.iquephoto.core.model;\n\nimport android.graphics.Canvas;\nimport android.graphics.Color;\nimport androi"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/core/model/EditorTiltShift.java",
    "chars": 842,
    "preview": "package net.iquesoft.iquephoto.core.model;\n\nimport android.content.Context;\nimport android.graphics.Bitmap;\nimport andro"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/core/model/EditorVignette.java",
    "chars": 9210,
    "preview": "package net.iquesoft.iquephoto.core.model;\n\nimport android.graphics.Canvas;\nimport android.graphics.Color;\nimport androi"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/di/AppComponent.java",
    "chars": 2011,
    "preview": "package net.iquesoft.iquephoto.di;\n\nimport android.content.Context;\n\nimport net.iquesoft.iquephoto.core.model.EditorStic"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/di/modules/AppModule.java",
    "chars": 387,
    "preview": "package net.iquesoft.iquephoto.di.modules;\n\nimport android.content.Context;\n\nimport javax.inject.Singleton;\n\nimport dagg"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/di/modules/EditorModule.java",
    "chars": 13746,
    "preview": "package net.iquesoft.iquephoto.di.modules;\n\nimport android.graphics.ColorMatrix;\n\nimport net.iquesoft.iquephoto.App;\nimp"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/graphics/CircleSizeDrawable.java",
    "chars": 1394,
    "preview": "package net.iquesoft.iquephoto.graphics;\n\nimport android.graphics.Canvas;\nimport android.graphics.Color;\nimport android."
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/graphics/ColorCircleDrawable.java",
    "chars": 1562,
    "preview": "package net.iquesoft.iquephoto.graphics;\n\nimport android.graphics.Canvas;\nimport android.graphics.Color;\nimport android."
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/graphics/SquareFrameLayout.java",
    "chars": 679,
    "preview": "package net.iquesoft.iquephoto.graphics;\n\nimport android.content.Context;\nimport android.util.AttributeSet;\nimport andro"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/models/Adjust.java",
    "chars": 711,
    "preview": "package net.iquesoft.iquephoto.models;\n\nimport android.support.annotation.DrawableRes;\nimport android.support.annotation"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/models/BrushSize.java",
    "chars": 213,
    "preview": "package net.iquesoft.iquephoto.models;\n\npublic class BrushSize {\n    private float mSize;\n\n    public BrushSize(float si"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/models/EditorColor.java",
    "chars": 1446,
    "preview": "package net.iquesoft.iquephoto.models;\n\nimport android.support.annotation.ColorRes;\n\nimport net.iquesoft.iquephoto.R;\n\ni"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/models/Filter.java",
    "chars": 431,
    "preview": "package net.iquesoft.iquephoto.models;\n\nimport android.graphics.ColorMatrix;\n\npublic class Filter {\n    private String m"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/models/Font.java",
    "chars": 343,
    "preview": "package net.iquesoft.iquephoto.models;\n\npublic class Font {\n    private String mTitle;\n    private String mPath;\n\n    pu"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/models/Frame.java",
    "chars": 410,
    "preview": "package net.iquesoft.iquephoto.models;\n\nimport android.support.annotation.DrawableRes;\n\npublic class Frame {\n    private"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/models/Image.java",
    "chars": 1024,
    "preview": "package net.iquesoft.iquephoto.models;\n\nimport android.os.Parcel;\nimport android.os.Parcelable;\n\npublic class Image impl"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/models/ImageAlbum.java",
    "chars": 419,
    "preview": "package net.iquesoft.iquephoto.models;\n\nimport java.util.ArrayList;\n\npublic class ImageAlbum {\n\n    private String mName"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/models/Overlay.java",
    "chars": 414,
    "preview": "package net.iquesoft.iquephoto.models;\n\nimport android.support.annotation.DrawableRes;\n\npublic class Overlay {\n    priva"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/models/ParcelablePaint.java",
    "chars": 1232,
    "preview": "package net.iquesoft.iquephoto.models;\n\nimport android.graphics.Paint;\nimport android.os.Parcel;\nimport android.os.Parce"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/models/Sticker.java",
    "chars": 1026,
    "preview": "package net.iquesoft.iquephoto.models;\n\nimport android.os.Parcel;\nimport android.os.Parcelable;\nimport android.support.a"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/models/StickersSet.java",
    "chars": 668,
    "preview": "package net.iquesoft.iquephoto.models;\n\nimport android.support.annotation.DrawableRes;\nimport android.support.annotation"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/models/Text.java",
    "chars": 731,
    "preview": "package net.iquesoft.iquephoto.models;\n\nimport android.graphics.Typeface;\n\npublic class Text {\n    private String mText;"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/models/Tool.java",
    "chars": 707,
    "preview": "package net.iquesoft.iquephoto.models;\n\nimport android.support.annotation.DrawableRes;\nimport android.support.annotation"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/presenters/activity/EditorActivityPresenter.java",
    "chars": 3020,
    "preview": "package net.iquesoft.iquephoto.presentation.presenters.activity;\n\nimport android.content.Context;\nimport android.content"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/presenters/activity/GalleryActivityPresenter.java",
    "chars": 799,
    "preview": "package net.iquesoft.iquephoto.presentation.presenters.activity;\n\nimport com.arellomobile.mvp.InjectViewState;\nimport co"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/presenters/activity/HomeActivityPresenter.java",
    "chars": 3911,
    "preview": "package net.iquesoft.iquephoto.presentation.presenters.activity;\n\nimport android.annotation.SuppressLint;\nimport android"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/presenters/activity/PreviewActivityPresenter.java",
    "chars": 4849,
    "preview": "package net.iquesoft.iquephoto.presentation.presenters.activity;\n\nimport android.content.Context;\nimport android.content"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/presenters/fragment/AddTextPresenter.java",
    "chars": 1084,
    "preview": "package net.iquesoft.iquephoto.presentation.presenters.fragment;\n\nimport android.content.Context;\nimport android.graphic"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/presenters/fragment/AdjustPresenter.java",
    "chars": 754,
    "preview": "package net.iquesoft.iquephoto.presentation.presenters.fragment;\n\nimport com.arellomobile.mvp.InjectViewState;\nimport co"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/presenters/fragment/ColorsPresenter.java",
    "chars": 618,
    "preview": "package net.iquesoft.iquephoto.presentation.presenters.fragment;\n\nimport com.arellomobile.mvp.InjectViewState;\nimport co"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/presenters/fragment/DrawingPresenter.java",
    "chars": 1187,
    "preview": "package net.iquesoft.iquephoto.presentation.presenters.fragment;\n\nimport android.content.Context;\nimport android.support"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/presenters/fragment/FiltersPresenter.java",
    "chars": 1373,
    "preview": "package net.iquesoft.iquephoto.presentation.presenters.fragment;\n\nimport android.content.Context;\nimport android.graphic"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/presenters/fragment/FontsPresenter.java",
    "chars": 599,
    "preview": "package net.iquesoft.iquephoto.presentation.presenters.fragment;\n\nimport com.arellomobile.mvp.InjectViewState;\nimport co"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/presenters/fragment/FramesPresenter.java",
    "chars": 998,
    "preview": "package net.iquesoft.iquephoto.presentation.presenters.fragment;\n\nimport android.content.Context;\nimport android.graphic"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/presenters/fragment/GalleryAlbumsPresenter.java",
    "chars": 810,
    "preview": "package net.iquesoft.iquephoto.presentation.presenters.fragment;\n\nimport android.content.Context;\n\nimport com.arellomobi"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/presenters/fragment/GalleryImagesPresenter.java",
    "chars": 950,
    "preview": "package net.iquesoft.iquephoto.presentation.presenters.fragment;\n\nimport android.os.Bundle;\nimport android.support.annot"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/presenters/fragment/ImageAdjustmentPresenter.java",
    "chars": 3859,
    "preview": "package net.iquesoft.iquephoto.presentation.presenters.fragment;\n\nimport android.os.Bundle;\nimport android.support.annot"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/presenters/fragment/OverlaysPresenter.java",
    "chars": 1022,
    "preview": "package net.iquesoft.iquephoto.presentation.presenters.fragment;\n\nimport android.content.Context;\nimport android.graphic"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/presenters/fragment/StickersPresenter.java",
    "chars": 2000,
    "preview": "package net.iquesoft.iquephoto.presentation.presenters.fragment;\n\nimport android.content.Context;\nimport android.graphic"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/presenters/fragment/StickersSetPresenter.java",
    "chars": 978,
    "preview": "package net.iquesoft.iquephoto.presentation.presenters.fragment;\n\nimport com.arellomobile.mvp.InjectViewState;\nimport co"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/presenters/fragment/TiltShiftFragmentPresenter.java",
    "chars": 489,
    "preview": "package net.iquesoft.iquephoto.presentation.presenters.fragment;\n\nimport com.arellomobile.mvp.InjectViewState;\nimport co"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/presenters/fragment/ToolsPresenter.java",
    "chars": 627,
    "preview": "package net.iquesoft.iquephoto.presentation.presenters.fragment;\n\nimport com.arellomobile.mvp.InjectViewState;\nimport co"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/presenters/fragment/TransformPresenter.java",
    "chars": 492,
    "preview": "package net.iquesoft.iquephoto.presentation.presenters.fragment;\n\nimport com.arellomobile.mvp.InjectViewState;\nimport co"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/presenters/fragment/TransparencyPresenter.java",
    "chars": 1483,
    "preview": "package net.iquesoft.iquephoto.presentation.presenters.fragment;\n\nimport android.graphics.Paint;\nimport android.os.Bundl"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/views/activity/CameraActivityView.java",
    "chars": 395,
    "preview": "package net.iquesoft.iquephoto.presentation.views.activity;\n\nimport android.graphics.ColorMatrix;\nimport android.support"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/views/activity/EditorActivityView.java",
    "chars": 725,
    "preview": "package net.iquesoft.iquephoto.presentation.views.activity;\n\nimport android.graphics.Bitmap;\nimport android.net.Uri;\nimp"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/views/activity/GalleryView.java",
    "chars": 242,
    "preview": "package net.iquesoft.iquephoto.presentation.views.activity;\n\nimport com.arellomobile.mvp.MvpView;\n\nimport net.iquesoft.i"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/views/activity/HomeView.java",
    "chars": 370,
    "preview": "package net.iquesoft.iquephoto.presentation.views.activity;\n\nimport android.net.Uri;\nimport android.support.annotation.S"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/views/activity/PreviewView.java",
    "chars": 637,
    "preview": "package net.iquesoft.iquephoto.presentation.views.activity;\n\nimport android.graphics.Bitmap;\nimport android.graphics.dra"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/views/fragment/AddTextView.java",
    "chars": 418,
    "preview": "package net.iquesoft.iquephoto.presentation.views.fragment;\n\nimport android.support.annotation.ColorInt;\nimport android."
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/views/fragment/AdjustView.java",
    "chars": 517,
    "preview": "package net.iquesoft.iquephoto.presentation.views.fragment;\n\nimport android.support.v4.app.Fragment;\n\nimport com.arellom"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/views/fragment/ColorsView.java",
    "chars": 271,
    "preview": "package net.iquesoft.iquephoto.presentation.views.fragment;\n\nimport com.arellomobile.mvp.MvpView;\n\nimport net.iquesoft.i"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/views/fragment/DrawingView.java",
    "chars": 475,
    "preview": "package net.iquesoft.iquephoto.presentation.views.fragment;\n\nimport android.support.annotation.ColorInt;\n\nimport com.are"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/views/fragment/FiltersView.java",
    "chars": 491,
    "preview": "package net.iquesoft.iquephoto.presentation.views.fragment;\n\nimport android.graphics.ColorMatrix;\nimport android.net.Uri"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/views/fragment/FontsView.java",
    "chars": 255,
    "preview": "package net.iquesoft.iquephoto.presentation.views.fragment;\n\nimport com.arellomobile.mvp.MvpView;\n\nimport net.iquesoft.i"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/views/fragment/FramesView.java",
    "chars": 333,
    "preview": "package net.iquesoft.iquephoto.presentation.views.fragment;\n\nimport android.graphics.Bitmap;\n\nimport com.arellomobile.mv"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/views/fragment/GalleryAlbumsView.java",
    "chars": 307,
    "preview": "package net.iquesoft.iquephoto.presentation.views.fragment;\n\nimport com.arellomobile.mvp.MvpView;\n\nimport net.iquesoft.i"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/views/fragment/GalleryImagesView.java",
    "chars": 305,
    "preview": "package net.iquesoft.iquephoto.presentation.views.fragment;\n\nimport com.arellomobile.mvp.MvpView;\n\nimport net.iquesoft.i"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/views/fragment/ImageAdjustmentView.java",
    "chars": 768,
    "preview": "package net.iquesoft.iquephoto.presentation.views.fragment;\n\nimport android.support.annotation.StringRes;\n\nimport com.ar"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/views/fragment/IntensityView.java",
    "chars": 196,
    "preview": "package net.iquesoft.iquephoto.presentation.views.fragment;\n\nimport com.arellomobile.mvp.MvpView;\n\npublic interface Inte"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/views/fragment/OverlaysView.java",
    "chars": 343,
    "preview": "package net.iquesoft.iquephoto.presentation.views.fragment;\n\nimport android.graphics.Bitmap;\n\nimport com.arellomobile.mv"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/views/fragment/StickersSetView.java",
    "chars": 646,
    "preview": "package net.iquesoft.iquephoto.presentation.views.fragment;\n\nimport android.support.annotation.StringRes;\n\nimport com.ar"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/views/fragment/StickersView.java",
    "chars": 609,
    "preview": "package net.iquesoft.iquephoto.presentation.views.fragment;\n\nimport android.graphics.Bitmap;\nimport android.support.anno"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/views/fragment/TiltShiftView.java",
    "chars": 252,
    "preview": "package net.iquesoft.iquephoto.presentation.views.fragment;\n\nimport com.arellomobile.mvp.MvpView;\n\nimport net.iquesoft.i"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/views/fragment/ToolsView.java",
    "chars": 253,
    "preview": "package net.iquesoft.iquephoto.presentation.views.fragment;\n\nimport com.arellomobile.mvp.MvpView;\n\nimport net.iquesoft.i"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/views/fragment/TransformHorizontalView.java",
    "chars": 107,
    "preview": "package net.iquesoft.iquephoto.presentation.views.fragment;\n\npublic interface TransformHorizontalView {\n\n}\n"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/views/fragment/TransformStraightenView.java",
    "chars": 107,
    "preview": "package net.iquesoft.iquephoto.presentation.views.fragment;\n\npublic interface TransformStraightenView {\n\n}\n"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/views/fragment/TransformVerticalView.java",
    "chars": 105,
    "preview": "package net.iquesoft.iquephoto.presentation.views.fragment;\n\npublic interface TransformVerticalView {\n\n}\n"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/presentation/views/fragment/TransformView.java",
    "chars": 150,
    "preview": "package net.iquesoft.iquephoto.presentation.views.fragment;\n\nimport com.arellomobile.mvp.MvpView;\n\npublic interface Tran"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/tasks/DecodeScaledImageAsyncTask.java",
    "chars": 3490,
    "preview": "package net.iquesoft.iquephoto.tasks;\n\nimport android.content.Context;\nimport android.graphics.Bitmap;\nimport android.gr"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/tasks/ImageCacheSaveTask.java",
    "chars": 2224,
    "preview": "package net.iquesoft.iquephoto.tasks;\n\nimport android.content.Context;\nimport android.graphics.Bitmap;\nimport android.ne"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/tasks/ImageFetchTask.java",
    "chars": 2791,
    "preview": "package net.iquesoft.iquephoto.tasks;\n\nimport android.content.Context;\nimport android.database.Cursor;\nimport android.os"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/tasks/ImageSaveTask.java",
    "chars": 2686,
    "preview": "package net.iquesoft.iquephoto.tasks;\n\nimport android.content.Context;\nimport android.graphics.Bitmap;\nimport android.os"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/ui/activities/EditorActivity.java",
    "chars": 11410,
    "preview": "package net.iquesoft.iquephoto.ui.activities;\n\nimport android.content.Intent;\nimport android.graphics.Bitmap;\nimport and"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/ui/activities/GalleryActivity.java",
    "chars": 2721,
    "preview": "package net.iquesoft.iquephoto.ui.activities;\n\nimport android.os.Bundle;\nimport android.support.v4.app.FragmentManager;\n"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/ui/activities/HomeActivity.java",
    "chars": 3117,
    "preview": "package net.iquesoft.iquephoto.ui.activities;\n\nimport android.content.Intent;\nimport android.net.Uri;\nimport android.os."
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/ui/activities/PreviewActivity.java",
    "chars": 4943,
    "preview": "package net.iquesoft.iquephoto.ui.activities;\n\nimport android.content.Intent;\nimport android.graphics.Bitmap;\nimport and"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/ui/dialogs/ColorPickerDialog.java",
    "chars": 2288,
    "preview": "package net.iquesoft.iquephoto.ui.dialogs;\n\nimport android.app.Dialog;\nimport android.content.Context;\nimport android.os"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/ui/dialogs/FontPickerDialog.java",
    "chars": 3002,
    "preview": "package net.iquesoft.iquephoto.ui.dialogs;\n\nimport android.app.Dialog;\nimport android.content.Context;\nimport android.gr"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/ui/dialogs/LoadingDialog.java",
    "chars": 789,
    "preview": "package net.iquesoft.iquephoto.ui.dialogs;\n\nimport android.app.Dialog;\nimport android.content.Context;\nimport android.gr"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/ui/fragments/AdjustFragment.java",
    "chars": 2903,
    "preview": "package net.iquesoft.iquephoto.ui.fragments;\n\nimport android.os.Bundle;\nimport android.support.v4.app.Fragment;\nimport a"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/ui/fragments/DrawingFragment.java",
    "chars": 3498,
    "preview": "package net.iquesoft.iquephoto.ui.fragments;\n\nimport android.os.Bundle;\nimport android.support.annotation.ColorInt;\nimpo"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/ui/fragments/FiltersFragment.java",
    "chars": 3845,
    "preview": "package net.iquesoft.iquephoto.ui.fragments;\n\nimport android.graphics.ColorMatrix;\nimport android.net.Uri;\nimport androi"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/ui/fragments/FontsFragment.java",
    "chars": 2816,
    "preview": "package net.iquesoft.iquephoto.ui.fragments;\n\nimport android.os.Bundle;\nimport android.support.v7.widget.LinearLayoutMan"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/ui/fragments/FramesFragment.java",
    "chars": 2630,
    "preview": "package net.iquesoft.iquephoto.ui.fragments;\n\nimport android.graphics.Bitmap;\nimport android.os.Bundle;\nimport android.s"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/ui/fragments/GalleryAlbumsFragment.java",
    "chars": 2906,
    "preview": "package net.iquesoft.iquephoto.ui.fragments;\n\nimport android.content.Intent;\nimport android.os.Bundle;\nimport android.su"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/ui/fragments/GalleryImagesFragment.java",
    "chars": 2795,
    "preview": "package net.iquesoft.iquephoto.ui.fragments;\n\nimport android.content.Intent;\nimport android.os.Bundle;\nimport android.su"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/ui/fragments/ImageAdjustmentFragment.java",
    "chars": 4971,
    "preview": "package net.iquesoft.iquephoto.ui.fragments;\n\nimport android.os.Bundle;\nimport android.support.annotation.StringRes;\nimp"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/ui/fragments/OverlaysFragment.java",
    "chars": 2607,
    "preview": "package net.iquesoft.iquephoto.ui.fragments;\n\nimport android.graphics.Bitmap;\nimport android.os.Bundle;\nimport android.s"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/ui/fragments/StickersFragment.java",
    "chars": 3342,
    "preview": "package net.iquesoft.iquephoto.ui.fragments;\n\nimport android.graphics.Bitmap;\nimport android.os.Bundle;\nimport android.s"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/ui/fragments/StickersSetFragment.java",
    "chars": 3064,
    "preview": "package net.iquesoft.iquephoto.ui.fragments;\n\nimport android.os.Bundle;\nimport android.support.annotation.StringRes;\nimp"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/ui/fragments/TextFragment.java",
    "chars": 3415,
    "preview": "package net.iquesoft.iquephoto.ui.fragments;\n\nimport android.content.Context;\nimport android.graphics.Color;\nimport andr"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/ui/fragments/TiltShiftFragment.java",
    "chars": 2482,
    "preview": "package net.iquesoft.iquephoto.ui.fragments;\n\nimport android.os.Bundle;\nimport android.view.LayoutInflater;\nimport andro"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/ui/fragments/ToolFragment.java",
    "chars": 787,
    "preview": "package net.iquesoft.iquephoto.ui.fragments;\n\nimport android.os.Bundle;\nimport android.view.Menu;\nimport android.view.Me"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/ui/fragments/ToolsFragment.java",
    "chars": 2703,
    "preview": "package net.iquesoft.iquephoto.ui.fragments;\n\nimport android.os.Bundle;\nimport android.support.v7.widget.LinearLayoutMan"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/ui/fragments/TransformFragment.java",
    "chars": 3115,
    "preview": "package net.iquesoft.iquephoto.ui.fragments;\n\nimport android.os.Bundle;\nimport android.view.LayoutInflater;\nimport andro"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/ui/fragments/TransparencyFragment.java",
    "chars": 4199,
    "preview": "package net.iquesoft.iquephoto.ui.fragments;\n\nimport android.graphics.Paint;\nimport android.os.Bundle;\nimport android.vi"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/utils/BitmapUtil.java",
    "chars": 2432,
    "preview": "package net.iquesoft.iquephoto.utils;\n\nimport android.content.Context;\nimport android.graphics.Bitmap;\nimport android.gr"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/utils/LogHelper.java",
    "chars": 2766,
    "preview": "package net.iquesoft.iquephoto.utils;\n\nimport android.graphics.Bitmap;\nimport android.graphics.Matrix;\nimport android.gr"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/utils/MatrixUtil.java",
    "chars": 1632,
    "preview": "package net.iquesoft.iquephoto.utils;\n\nimport android.graphics.Matrix;\nimport android.support.annotation.IntRange;\nimpor"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/utils/MotionEventUtil.java",
    "chars": 951,
    "preview": "package net.iquesoft.iquephoto.utils;\n\nimport android.view.MotionEvent;\n\npublic class MotionEventUtil {\n    public stati"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/utils/RectUtil.java",
    "chars": 1250,
    "preview": "package net.iquesoft.iquephoto.utils;\n\nimport android.graphics.RectF;\n\npublic class RectUtil {\n    public static void sc"
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/utils/SizeUtil.java",
    "chars": 538,
    "preview": "package net.iquesoft.iquephoto.utils;\n\nimport net.iquesoft.iquephoto.App;\n\npublic class SizeUtil {\n    //private static "
  },
  {
    "path": "iQuePhoto/app/src/main/java/net/iquesoft/iquephoto/utils/ToolbarUtil.java",
    "chars": 1746,
    "preview": "package net.iquesoft.iquephoto.utils;\n\nimport android.support.annotation.NonNull;\nimport android.support.annotation.Null"
  },
  {
    "path": "iQuePhoto/app/src/main/res/anim/slide_down.xml",
    "chars": 697,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:order"
  },
  {
    "path": "iQuePhoto/app/src/main/res/anim/slide_up.xml",
    "chars": 437,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <objectAnima"
  },
  {
    "path": "iQuePhoto/app/src/main/res/drawable/ic_add.xml",
    "chars": 308,
    "preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"30dp\"\n    android:height=\"30dp\"\n  "
  },
  {
    "path": "iQuePhoto/app/src/main/res/drawable/ic_add_40.xml",
    "chars": 308,
    "preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"40dp\"\n    android:height=\"40dp\"\n  "
  },
  {
    "path": "iQuePhoto/app/src/main/res/drawable/ic_add_circle.xml",
    "chars": 399,
    "preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\""
  },
  {
    "path": "iQuePhoto/app/src/main/res/drawable/ic_add_circle_white_24dp.xml",
    "chars": 381,
    "preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"30dp\"\n    android:height=\"30dp\"\n  "
  },
  {
    "path": "iQuePhoto/app/src/main/res/drawable/ic_adjust_white_50dp.xml",
    "chars": 1578,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:wi"
  },
  {
    "path": "iQuePhoto/app/src/main/res/drawable/ic_apply_40.xml",
    "chars": 323,
    "preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"40dp\"\n    android:height=\"40dp\"\n  "
  },
  {
    "path": "iQuePhoto/app/src/main/res/drawable/ic_arrow_back_white_24dp.xml",
    "chars": 350,
    "preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\""
  },
  {
    "path": "iQuePhoto/app/src/main/res/drawable/ic_blur_linear.xml",
    "chars": 960,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:wi"
  },
  {
    "path": "iQuePhoto/app/src/main/res/drawable/ic_blur_off.xml",
    "chars": 1556,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:wi"
  },
  {
    "path": "iQuePhoto/app/src/main/res/drawable/ic_blur_radial.xml",
    "chars": 1060,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:wi"
  },
  {
    "path": "iQuePhoto/app/src/main/res/drawable/ic_brightness.xml",
    "chars": 616,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:wi"
  },
  {
    "path": "iQuePhoto/app/src/main/res/drawable/ic_brush_color.xml",
    "chars": 3126,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:wi"
  },
  {
    "path": "iQuePhoto/app/src/main/res/drawable/ic_camera.xml",
    "chars": 1421,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:wi"
  },
  {
    "path": "iQuePhoto/app/src/main/res/drawable/ic_cancel_40.xml",
    "chars": 374,
    "preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"40dp\"\n    android:height=\"40dp\"\n  "
  },
  {
    "path": "iQuePhoto/app/src/main/res/drawable/ic_check.xml",
    "chars": 323,
    "preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"60dp\"\n    android:height=\"60dp\"\n  "
  },
  {
    "path": "iQuePhoto/app/src/main/res/drawable/ic_check_40.xml",
    "chars": 323,
    "preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"40dp\"\n    android:height=\"40dp\"\n  "
  },
  {
    "path": "iQuePhoto/app/src/main/res/drawable/ic_clear.xml",
    "chars": 374,
    "preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"40dp\"\n    android:height=\"40dp\"\n  "
  },
  {
    "path": "iQuePhoto/app/src/main/res/drawable/ic_close_white_24dp.xml",
    "chars": 374,
    "preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n  "
  },
  {
    "path": "iQuePhoto/app/src/main/res/drawable/ic_color.xml",
    "chars": 804,
    "preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"40dp\"\n    android:height=\"40dp\"\n  "
  },
  {
    "path": "iQuePhoto/app/src/main/res/drawable/ic_contrast.xml",
    "chars": 448,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:wi"
  },
  {
    "path": "iQuePhoto/app/src/main/res/drawable/ic_crop.xml",
    "chars": 367,
    "preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"50dp\"\n    android:height=\"50dp\"\n  "
  },
  {
    "path": "iQuePhoto/app/src/main/res/drawable/ic_delete_on.xml",
    "chars": 668,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:wi"
  },
  {
    "path": "iQuePhoto/app/src/main/res/drawable/ic_disappointed_white_150dp.xml",
    "chars": 3247,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:wi"
  },
  {
    "path": "iQuePhoto/app/src/main/res/drawable/ic_drawing_white_50dp.xml",
    "chars": 2760,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:wi"
  },
  {
    "path": "iQuePhoto/app/src/main/res/drawable/ic_eraser.xml",
    "chars": 720,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:wi"
  },
  {
    "path": "iQuePhoto/app/src/main/res/drawable/ic_expand.xml",
    "chars": 333,
    "preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"30dp\"\n        android:height=\""
  },
  {
    "path": "iQuePhoto/app/src/main/res/drawable/ic_expand_less.xml",
    "chars": 319,
    "preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"30dp\"\n    android:height=\"30dp\"\n  "
  },
  {
    "path": "iQuePhoto/app/src/main/res/drawable/ic_exposure.xml",
    "chars": 725,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:wi"
  },
  {
    "path": "iQuePhoto/app/src/main/res/drawable/ic_fade.xml",
    "chars": 1254,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:wi"
  },
  {
    "path": "iQuePhoto/app/src/main/res/drawable/ic_filter_40.xml",
    "chars": 2301,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:wi"
  },
  {
    "path": "iQuePhoto/app/src/main/res/drawable/ic_filter_white_50dp.xml",
    "chars": 2371,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:wi"
  },
  {
    "path": "iQuePhoto/app/src/main/res/drawable/ic_flags.xml",
    "chars": 783,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:wi"
  },
  {
    "path": "iQuePhoto/app/src/main/res/drawable/ic_flash_auto.xml",
    "chars": 398,
    "preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"50dp\"\n        android:height=\""
  },
  {
    "path": "iQuePhoto/app/src/main/res/drawable/ic_flash_off.xml",
    "chars": 388,
    "preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"50dp\"\n        android:height=\""
  },
  {
    "path": "iQuePhoto/app/src/main/res/drawable/ic_flash_on.xml",
    "chars": 299,
    "preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"50dp\"\n    android:height=\"50dp\"\n  "
  },
  {
    "path": "iQuePhoto/app/src/main/res/drawable/ic_flip_camera.xml",
    "chars": 1232,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:wi"
  },
  {
    "path": "iQuePhoto/app/src/main/res/drawable/ic_font.xml",
    "chars": 751,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:wi"
  },
  {
    "path": "iQuePhoto/app/src/main/res/drawable/ic_font_bold.xml",
    "chars": 1009,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:wi"
  },
  {
    "path": "iQuePhoto/app/src/main/res/drawable/ic_font_italic.xml",
    "chars": 1751,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:wi"
  },
  {
    "path": "iQuePhoto/app/src/main/res/drawable/ic_format_bold.xml",
    "chars": 556,
    "preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\""
  },
  {
    "path": "iQuePhoto/app/src/main/res/drawable/ic_format_color_text_black_24dp.xml",
    "chars": 479,
    "preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n  "
  },
  {
    "path": "iQuePhoto/app/src/main/res/drawable/ic_format_italic.xml",
    "chars": 337,
    "preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\""
  },
  {
    "path": "iQuePhoto/app/src/main/res/drawable/ic_format_underlined.xml",
    "chars": 419,
    "preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\""
  },
  {
    "path": "iQuePhoto/app/src/main/res/drawable/ic_frame_white_50dp.xml",
    "chars": 1646,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:wi"
  },
  {
    "path": "iQuePhoto/app/src/main/res/drawable/ic_gallery_white_100dp.xml",
    "chars": 1382,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:wi"
  },
  {
    "path": "iQuePhoto/app/src/main/res/drawable/ic_h_flip_white_35dp.xml",
    "chars": 1321,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:wi"
  },
  {
    "path": "iQuePhoto/app/src/main/res/drawable/ic_instagram.xml",
    "chars": 1420,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:wi"
  },
  {
    "path": "iQuePhoto/app/src/main/res/drawable/ic_intensity.xml",
    "chars": 639,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:wi"
  },
  {
    "path": "iQuePhoto/app/src/main/res/drawable/ic_left.xml",
    "chars": 319,
    "preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"40dp\"\n    android:height=\"40dp\"\n  "
  },
  {
    "path": "iQuePhoto/app/src/main/res/drawable/ic_letters_white_50dp.xml",
    "chars": 2046,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:wi"
  },
  {
    "path": "iQuePhoto/app/src/main/res/drawable/ic_loop.xml",
    "chars": 543,
    "preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"50dp\"\n        android:height=\""
  },
  {
    "path": "iQuePhoto/app/src/main/res/drawable/ic_magic_stick.xml",
    "chars": 1098,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:wi"
  },
  {
    "path": "iQuePhoto/app/src/main/res/drawable/ic_overlay_white_50dp.xml",
    "chars": 1094,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:wi"
  },
  {
    "path": "iQuePhoto/app/src/main/res/drawable/ic_perspective_horizontal.xml",
    "chars": 478,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:wi"
  }
]

// ... and 82 more files (download for full content)

About this extraction

This page contains the full source code of the iQueSoft/iQuePhoto GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 282 files (468.7 KB), approximately 142.1k tokens, and a symbol index with 983 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!