[
  {
    "path": ".gitignore",
    "content": "# build app files\n*.apk\n*.ap_\n\n# ignore crashlytics config\ncom_crashlytics_export_strings.xml\n\n# Dalvik files\n*.dex\n\n# Java class files\n*.class\n\n# Generated files\nbin/\ngen/\nbuild/\nlint.xml\nproguard/\n\n# Local configs\nlocal.properties\n\n# roboelectric\ntmp/\n\n# Eclipse workspace\n.metadata/\n.checkstyle\n\n# intelli J\n.idea\n*.iml\n*.ipr\n*.iws\n\n# mac\n.Trashes\n.DS_Store\n\n# Win\nThumbs.db\n\n# Vim\n*.swp\n\n#emacs\n*.*~\n\n# Keystore\nkeystore.properties\n\n# Gradle\n.gradle\n"
  },
  {
    "path": ".travis.yml",
    "content": "language: android\njdk: oraclejdk8\nenv:\n global:\n    - ANDROID_SDK=android-29\n    - ANDROID_BUILD_TOOLS_VERSION=28.0.3\n    - ANDROID_ABI=armeabi-v7a\n    - ANDROID_EMULATOR_SDK=android-22\n    - ADB_INSTALL_TIMEOUT=10\nandroid:\n  components:\n    - tools\n    - $ANDROID_SDK\n    - $ANDROID_EMULATOR_SDK\n    - build-tools-$ANDROID_BUILD_TOOLS_VERSION\n    - google-google_play_services\n    - extra-google-m2repository \n    - extra-android-m2repository\n    - addon-google_apis-google-22\n    - sys-img-${ANDROID_ABI}-${ANDROID_EMULATOR_SDK}\nlicenses:\n    - 'android-sdk-preview-license-.+'\n    - 'android-sdk-license-.+'\n    - 'google-gdk-license-.+'\nbefore_cache:\n  - rm -f  $HOME/.gradle/caches/modules-2/modules-2.lock\n  - rm -fr $HOME/.gradle/caches/*/plugin-resolution/\ncache:\n  directories:\n    - $HOME/.gradle/caches/\n    - $HOME/.gradle/wrapper/\n    - $HOME/.android/build-cache\nbefore_script:\n  - echo no | android create avd --force -n test -t $ANDROID_EMULATOR_SDK --abi $ANDROID_ABI\n  - emulator -avd test -no-skin -no-audio -no-window &\n  - android-wait-for-emulator\n  - adb shell input keyevent 82 &\nscript:\n  - ./gradlew clean build connectedAndroidTest -PdisablePreDex\n\nnotifications:\n  email: false\n"
  },
  {
    "path": "README.md",
    "content": "⚠️ ⚠️ ⚠️ ⚠️ ⚠️ ⚠️ ⚠️ ⚠️ ⚠️ \n\n**WARNING: This library is no longer maintained.**\n\n⚠️ ⚠️ ⚠️ ⚠️ ⚠️ ⚠️ ⚠️ ⚠️ ⚠️ \n\nThank you for using and contributing! 🙇\n\n---\n\n# Laevatein\n\nPhoto image selection activity set library.\n\n## Screen Shot\n\n![Selection Activity](https://raw.githubusercontent.com/nohana/Laevatein/master/documents/ss-1.png)\n![Album List on DrawerMenu](https://raw.githubusercontent.com/nohana/Laevatein/master/documents/ss-2.png)\n![Selected List](https://raw.githubusercontent.com/nohana/Laevatein/master/documents/ss-3.png)\n\n## Usage\n\nCall photo image selection activity by the following code snipet.\n\n```java\npublic class SomeActivity extends Activity {\n  public static final int REQUEST_CODE_CHOOSE = 1;\n  @Override\n  protected void onCreate(Bundle savedInstanceState) {\n    super.onCreate(savedInstanceState);\n    setContentView(R.layout.activity_some);\n  }\n\n  @Override\n  protected void onActivityResult(int requestCode, int resultcode, Intent data) {\n    super.onActivityResult(requestCode, resultCode, data);\n    switch (requestCode) {\n    case REQUEST_CODE_CHOOSE:\n      if (resultCode == RESULT_OK) {\n        // Get result and proceed your work from here...\n        List<Uri> selected = Laevatein.obtainResult(data);\n      }\n      break;\n    default:\n      break;\n    }\n  }\n\n  public void onClickButton(View view) {\n    // call chooser on click button like this\n    Laevatein.from(this).choose(MimeType.of(MimeType.JPEG)).forResult(REQUEST_CODE_CHOOSE);\n  }\n}\n```\n\nAnd you'll get the selection result on `Activity#onActivityResult(int, int, Intent)`.\n\n## Features\n\nLaevatein provides some APIs to customize selector behaviour for your spec.\n\n### Selectable count limitation\n\nSet selectable count with `count(int, int)`.\nDefault is `0 <= count <= 1`.\n\n```java\nLaevatein.from(this)\n        .choose(MimeType.of(MimeType.JPEG))\n        .count(0, 10)  // minimum = 0, max = 10, so 0 <= count <= 10;\n        .forResult(REQUEST_CODE_CHOOSE);\n```\n\n### Selectable photo quality limitation\n\nSet selectable photo quality by pixel count with `quality(int, int)`.\nDefault is `0 <= pixels <= Integer.MAX_VALUE`.\n\n```java\nLaevatein.from(this)\n        .choose(MimeType.of(MimeType.JPEG))\n        .quality(30000, Integer.MAX_VALUE)  // minimum = 30000px, max = Integer.MAX_VALUEpx, so 30000px <= count <= Integer.MAX_VALUEpx;\n        .forResult(REQUEST_CODE_CHOOSE);\n```\n\n### Selectable photo size limitation\n\nSet selectable photo size by pixel with `size(int, int)`.\nDefault is `0 <= pixels <= Integer.MAX_VALUE`.\n\n```java\nLaevatein.from(this)\n        .choose(MimeType.of(MimeType.JPEG))\n        .size(300, 400)  // minimum width = 300px, minimum height = 400px;\n        .forResult(REQUEST_CODE_CHOOSE);\n```\n\n### Selectable photo size limitation\n\nSet selectable photo size by pixel with `size(int, int, int, int)`.\nDefault is `0 <= pixels <= Integer.MAX_VALUE`.\n\n```java\nLaevatein.from(this)\n        .choose(MimeType.of(MimeType.JPEG))\n        .size(300, 400, Integer.MAX_VALUE, Integer.MAX_VALUE)  // minimum width = 300px, minimum height = 400px, max width = Integer.MAX_VALUEpx, max height = Integer.MAX_VALUEpx;\n        .forResult(REQUEST_CODE_CHOOSE);\n```\n\n### Use custom cell layout\n\nSet your layout and ids for the image cell with `bindEachImageWith(int, int, int)`.\n\n```java\nLaevatein.from(this)\n        .choose(MimeType.of(MimeType.JPEG))\n        .bindEachImageWith(R.layout.my_cell, R.id.my_cell_image_view, R.id.my_cell_check_box)\n        .forResult(REQUEST_CODE_CHOOSE);\n```\n\n### Resume selection with previously selected photos\n\nSet defaultly selected URIs with `resume(List<Uri>)`.\n\n```java\nList<Uri> mSelectedList;\n\nLaevatein.from(this)\n        .choose(MimeType.of(MimeType.JPEG))\n        .resume(mSelectedList)\n        .forResult(REQUEST_CODE_CHOOSE);\n```\n\n### Call camera from the selection activity\n\nSet flag to enable camera capture from the selection activity with `capture(boolean)`.\n\n```java\nLaevatein.from(this)\n        .choose(MimeType.of(MimeType.JPEG))\n        .capture(true)\n        .forResult(REQUEST_CODE_CHOOSE);\n```\n\n### Customize theme\n\nChange Laevatein's theme with `theme(int)`.\n\n```java\nLaevatein.from(this)\n        .theme(R.style.OriginalTheme)\n        .choose(MimeType.of(MimeType.JPEG))\n        .forResult(REQUEST_CODE_CHOOSE);\n```\n\nTheme must implement these parameter at least.\n\n```xml\n<style name=\"OriginalTheme\" parent=\"Theme.AppCompat.Light.NoActionBar\">\n    <item name=\"l_drawerStyle\">@style/L_DrawerMenu</item>\n    <item name=\"l_drawerItemStyle\">@style/L_DrawerMenuItem</item>\n    <item name=\"l_gridStyle\">@style/L_Grid</item>\n    <item name=\"l_counterStyle\">@style/L_Counter</item>\n</style>\n```\n\n## Sample App\n\nSample application is available [here](https://deploygate.com/distributions/b43dc74fc4025bbb8587f179f5b8464418cca559).\n[<img src=\"https://dply.me/orf0t9/button/large\" alt=\"Try it on your device via DeployGate\">](https://dply.me/orf0t9#install)\n\n## Download\n\nVia Gradle\n\nfor Android Studio ~2.x\n\n```groovy\nrepositories {\n    mavenCentral()\n}\nandroid {\n    dependencies {\n        compile 'jp.co.nohana:Laevatein:2.3.2@aar'\n    }\n}\n```\n\nfor Android Studio 3.x~\n\n```groovy\nrepositories {\n    mavenCentral()\n}\nandroid {\n    dependencies {\n        implementation 'jp.co.nohana:Laevatein:2.3.2'\n    }\n}\n```\n\n## Acknowledgement\n\nThis library depends on the following libraries.\n\n1. [Picasso](https://github.com/square/picasso) by Square Inc.\n2. [ImageViewZoom](https://github.com/sephiroth74/ImageViewZoom) by Alessandro Crugnola\n3. [Amalgam](https://github.com/nohana/Amalgam) by nohana, Inc.\n4. [CompoundContainers](https://github.com/KeithYokoma/CompoundContainers) by KeithYokoma\n5. [AndroidDeviceCompatibility](https://github.com/mixi-inc/Android-Device-Compatibility) by mixi, Inc.\n6. [PermissionsDispatcher](https://github.com/hotchemi/PermissionsDispatcher) by Shintaro Katafuchi, Marcel Schnelle, Yoshinori Isogai\n\n## License\n\nThis library is licensed under Apache License v2.\n\n```\nCopyright (C) 2014 nohana, Inc. All rights reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use\nthis file except in compliance with the License. You may obtain a copy of the\nLicense at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed\nunder the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR\nCONDITIONS OF ANY KIND, either express or implied. See the License for the\nspecific language governing permissions and limitations under the License.\n```\n\n\n[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/nohana/laevatein/trend.png)](https://bitdeli.com/free \"Bitdeli Badge\")\n\n"
  },
  {
    "path": "build.gradle",
    "content": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\n\nbuildscript {\n    repositories {\n        google()\n        jcenter()\n    }\n    dependencies {\n        classpath 'com.android.tools.build:gradle:3.5.3'\n    }\n}\n\nallprojects {\n    repositories {\n        google()\n        jcenter()\n    }\n}\n"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "content": "#Thu Nov 30 10:11:36 JST 2017\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-5.6.4-all.zip\n"
  },
  {
    "path": "gradle.properties",
    "content": "# Project-wide Gradle settings.\n# IDE (e.g. Android Studio) users:\n# Settings specified in this file will override any Gradle settings\n# configured through the IDE.\n# For more details on how to configure your build environment visit\n# http://www.gradle.org/docs/current/userguide/build_environment.html\n# Specifies the JVM arguments used for the daemon process.\n# The setting is particularly useful for tweaking memory settings.\n# Default value: -Xmx10248m -XX:MaxPermSize=256m\n# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8\n# When configured, Gradle will run in incubating parallel mode.\n# This option should only be used with decoupled projects. More details, visit\n# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects\n# org.gradle.parallel=true\nVERSION_NAME=3.1.0\nVERSION_CODE=26\nGROUP=jp.co.nohana\nPOM_DESCRIPTION=Photo image selection activity set library. Currently under development.\nPOM_URL=https://github.com/nohana/Laevatein\nPOM_SCM_URL=https://github.com/nohana/Laevatein\nPOM_SCM_CONNECTION=scm:git@github.com:nohana/Laevatein.git\nPOM_SCM_DEV_CONNECTION=scm:git@github.com:nohana/Laevatein.git\nPOM_LICENCE_NAME=The Apache Software License, Version 2.0\nPOM_LICENCE_URL=http://www.apache.org/licenses/LICENSE-2.0.txt\nPOM_LICENCE_DIST=repo\nPOM_DEVELOPER_ID=nohana\nPOM_DEVELOPER_NAME=nohana,Inc.\nANDROID_BUILD_TARGET_SDK_VERSION=29\nANDROID_BUILD_TOOLS_VERSION=29.0.3\nANDROID_BUILD_SDK_VERSION=29\nandroid.useAndroidX=true\nandroid.enableJetifier=true\n"
  },
  {
    "path": "gradlew",
    "content": "#!/usr/bin/env bash\n\n##############################################################################\n##\n##  Gradle start up script for UN*X\n##\n##############################################################################\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS=\"\"\n\nAPP_NAME=\"Gradle\"\nAPP_BASE_NAME=`basename \"$0\"`\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=\"maximum\"\n\nwarn ( ) {\n    echo \"$*\"\n}\n\ndie ( ) {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n}\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\ncase \"`uname`\" in\n  CYGWIN* )\n    cygwin=true\n    ;;\n  Darwin* )\n    darwin=true\n    ;;\n  MINGW* )\n    msys=true\n    ;;\nesac\n\n# For Cygwin, ensure paths are in UNIX format before anything is touched.\nif $cygwin ; then\n    [ -n \"$JAVA_HOME\" ] && JAVA_HOME=`cygpath --unix \"$JAVA_HOME\"`\nfi\n\n# Attempt to set APP_HOME\n# Resolve links: $0 may be a link\nPRG=\"$0\"\n# Need this for relative symlinks.\nwhile [ -h \"$PRG\" ] ; do\n    ls=`ls -ld \"$PRG\"`\n    link=`expr \"$ls\" : '.*-> \\(.*\\)$'`\n    if expr \"$link\" : '/.*' > /dev/null; then\n        PRG=\"$link\"\n    else\n        PRG=`dirname \"$PRG\"`\"/$link\"\n    fi\ndone\nSAVED=\"`pwd`\"\ncd \"`dirname \\\"$PRG\\\"`/\" >&-\nAPP_HOME=\"`pwd -P`\"\ncd \"$SAVED\" >&-\n\nCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=\"$JAVA_HOME/jre/sh/java\"\n    else\n        JAVACMD=\"$JAVA_HOME/bin/java\"\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=\"java\"\n    which java >/dev/null 2>&1 || die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\nfi\n\n# Increase the maximum file descriptors if we can.\nif [ \"$cygwin\" = \"false\" -a \"$darwin\" = \"false\" ] ; then\n    MAX_FD_LIMIT=`ulimit -H -n`\n    if [ $? -eq 0 ] ; then\n        if [ \"$MAX_FD\" = \"maximum\" -o \"$MAX_FD\" = \"max\" ] ; then\n            MAX_FD=\"$MAX_FD_LIMIT\"\n        fi\n        ulimit -n $MAX_FD\n        if [ $? -ne 0 ] ; then\n            warn \"Could not set maximum file descriptor limit: $MAX_FD\"\n        fi\n    else\n        warn \"Could not query maximum file descriptor limit: $MAX_FD_LIMIT\"\n    fi\nfi\n\n# For Darwin, add options to specify how the application appears in the dock\nif $darwin; then\n    GRADLE_OPTS=\"$GRADLE_OPTS \\\"-Xdock:name=$APP_NAME\\\" \\\"-Xdock:icon=$APP_HOME/media/gradle.icns\\\"\"\nfi\n\n# For Cygwin, switch paths to Windows format before running java\nif $cygwin ; then\n    APP_HOME=`cygpath --path --mixed \"$APP_HOME\"`\n    CLASSPATH=`cygpath --path --mixed \"$CLASSPATH\"`\n\n    # We build the pattern for arguments to be converted via cygpath\n    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`\n    SEP=\"\"\n    for dir in $ROOTDIRSRAW ; do\n        ROOTDIRS=\"$ROOTDIRS$SEP$dir\"\n        SEP=\"|\"\n    done\n    OURCYGPATTERN=\"(^($ROOTDIRS))\"\n    # Add a user-defined pattern to the cygpath arguments\n    if [ \"$GRADLE_CYGPATTERN\" != \"\" ] ; then\n        OURCYGPATTERN=\"$OURCYGPATTERN|($GRADLE_CYGPATTERN)\"\n    fi\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    i=0\n    for arg in \"$@\" ; do\n        CHECK=`echo \"$arg\"|egrep -c \"$OURCYGPATTERN\" -`\n        CHECK2=`echo \"$arg\"|egrep -c \"^-\"`                                 ### Determine if an option\n\n        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition\n            eval `echo args$i`=`cygpath --path --ignore --mixed \"$arg\"`\n        else\n            eval `echo args$i`=\"\\\"$arg\\\"\"\n        fi\n        i=$((i+1))\n    done\n    case $i in\n        (0) set -- ;;\n        (1) set -- \"$args0\" ;;\n        (2) set -- \"$args0\" \"$args1\" ;;\n        (3) set -- \"$args0\" \"$args1\" \"$args2\" ;;\n        (4) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" ;;\n        (5) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" ;;\n        (6) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" ;;\n        (7) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" ;;\n        (8) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" ;;\n        (9) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" \"$args8\" ;;\n    esac\nfi\n\n# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules\nfunction splitJvmOpts() {\n    JVM_OPTS=(\"$@\")\n}\neval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS\nJVM_OPTS[${#JVM_OPTS[*]}]=\"-Dorg.gradle.appname=$APP_BASE_NAME\"\n\nexec \"$JAVACMD\" \"${JVM_OPTS[@]}\" -classpath \"$CLASSPATH\" org.gradle.wrapper.GradleWrapperMain \"$@\"\n"
  },
  {
    "path": "gradlew.bat",
    "content": "@if \"%DEBUG%\" == \"\" @echo off\r\n@rem ##########################################################################\r\n@rem\r\n@rem  Gradle startup script for Windows\r\n@rem\r\n@rem ##########################################################################\r\n\r\n@rem Set local scope for the variables with windows NT shell\r\nif \"%OS%\"==\"Windows_NT\" setlocal\r\n\r\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\r\nset DEFAULT_JVM_OPTS=\r\n\r\nset DIRNAME=%~dp0\r\nif \"%DIRNAME%\" == \"\" set DIRNAME=.\r\nset APP_BASE_NAME=%~n0\r\nset APP_HOME=%DIRNAME%\r\n\r\n@rem Find java.exe\r\nif defined JAVA_HOME goto findJavaFromJavaHome\r\n\r\nset JAVA_EXE=java.exe\r\n%JAVA_EXE% -version >NUL 2>&1\r\nif \"%ERRORLEVEL%\" == \"0\" goto init\r\n\r\necho.\r\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\r\necho.\r\necho Please set the JAVA_HOME variable in your environment to match the\r\necho location of your Java installation.\r\n\r\ngoto fail\r\n\r\n:findJavaFromJavaHome\r\nset JAVA_HOME=%JAVA_HOME:\"=%\r\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\r\n\r\nif exist \"%JAVA_EXE%\" goto init\r\n\r\necho.\r\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%\r\necho.\r\necho Please set the JAVA_HOME variable in your environment to match the\r\necho location of your Java installation.\r\n\r\ngoto fail\r\n\r\n:init\r\n@rem Get command-line arguments, handling Windowz variants\r\n\r\nif not \"%OS%\" == \"Windows_NT\" goto win9xME_args\r\nif \"%@eval[2+2]\" == \"4\" goto 4NT_args\r\n\r\n:win9xME_args\r\n@rem Slurp the command line arguments.\r\nset CMD_LINE_ARGS=\r\nset _SKIP=2\r\n\r\n:win9xME_args_slurp\r\nif \"x%~1\" == \"x\" goto execute\r\n\r\nset CMD_LINE_ARGS=%*\r\ngoto execute\r\n\r\n:4NT_args\r\n@rem Get arguments from the 4NT Shell from JP Software\r\nset CMD_LINE_ARGS=%$\r\n\r\n:execute\r\n@rem Setup the command line\r\n\r\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\r\n\r\n@rem Execute Gradle\r\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%\r\n\r\n:end\r\n@rem End local scope for the variables with windows NT shell\r\nif \"%ERRORLEVEL%\"==\"0\" goto mainEnd\r\n\r\n:fail\r\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\r\nrem the _cmd.exe /c_ return code!\r\nif  not \"\" == \"%GRADLE_EXIT_CONSOLE%\" exit 1\r\nexit /b 1\r\n\r\n:mainEnd\r\nif \"%OS%\"==\"Windows_NT\" endlocal\r\n\r\n:omega\r\n"
  },
  {
    "path": "laevatein/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "laevatein/build.gradle",
    "content": "apply plugin: 'com.android.library'\n\nandroid {\n    compileSdkVersion 29\n\n    defaultConfig {\n        minSdkVersion 14\n        targetSdkVersion 29\n\n        testInstrumentationRunner \"androidx.test.runner.AndroidJUnitRunner\"\n    }\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_1_7\n        targetCompatibility JavaVersion.VERSION_1_7\n    }\n    lintOptions {\n        abortOnError false\n    }\n    testOptions.unitTests.includeAndroidResources true\n\n    useLibrary 'android.test.mock'\n}\n\ndependencies {\n    implementation fileTree(dir: 'libs', include: ['*.jar'])\n    implementation 'androidx.legacy:legacy-support-v4:1.0.0'\n    implementation 'androidx.appcompat:appcompat:1.1.0'\n    implementation 'androidx.annotation:annotation:1.1.0'\n    implementation 'com.google.android.material:material:1.1.0'\n    implementation 'androidx.exifinterface:exifinterface:1.1.0'\n    implementation(\"com.github.bumptech.glide:glide:4.11.0\") {\n        exclude group: 'com.android.support', module: 'support-fragment'\n    }\n    annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'\n    implementation 'it.sephiroth.android.library.imagezoom:library:1.0.4'\n    implementation 'jp.co.nohana:Amalgam:0.4.0@aar'\n\n    // Robolectric\n    testImplementation 'junit:junit:4.13'\n    testImplementation 'androidx.test:core:1.2.0'\n    testImplementation 'androidx.test:runner:1.2.0'\n    testImplementation 'androidx.test:rules:1.2.0'\n    testImplementation 'androidx.test.ext:junit:1.1.1'\n\n    testImplementation 'junit:junit:4.13'\n    testImplementation 'org.robolectric:robolectric:4.3'\n    testImplementation 'org.mockito:mockito-all:1.10.19'\n\n    androidTestImplementation 'androidx.test:runner:1.2.0'\n}\n\napply from: 'https://raw.github.com/chrisbanes/gradle-mvn-push/master/gradle-mvn-push.gradle'\n\nafterEvaluate {\n    androidJavadocs.failOnError false\n    androidJavadocs.classpath += project.android.libraryVariants.toList().first().javaCompile.classpath\n}\n\napply plugin: 'idea'\n\nidea {\n    module {\n        testOutputDir = file('build/test-classes/debug')\n    }\n}\n"
  },
  {
    "path": "laevatein/gradle.properties",
    "content": "POM_NAME=Laevatein\nPOM_ARTIFACT_ID=Laevatein\nPOM_PACKAGING=aar"
  },
  {
    "path": "laevatein/proguard-rules.txt",
    "content": "# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in /Library/android-sdk-macosx/tools/proguard/proguard-android.txt\n# You can edit the include path and order by changing the ProGuard\n# include property in project.properties.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# Add any project specific keep options here:\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n\n-dontwarn com.squareup.okhttp.**"
  },
  {
    "path": "laevatein/src/androidTest/java/com/laevatein/MimeTypeTest.java",
    "content": "package com.laevatein;\n\nimport android.net.Uri;\nimport android.test.mock.MockContentResolver;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\n\nimport androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner;\n\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertTrue;\n\n@RunWith(AndroidJUnit4ClassRunner.class)\npublic class MimeTypeTest {\n    @Test\n    public void typeCheck() throws Exception {\n        MockContentResolver resolver = new MockContentResolver();\n\n        {\n            assertTrue(MimeType.JPEG.checkType(resolver, Uri.parse(\"file://hogehoge/fugafuga/image.jpg\")));\n            assertTrue(MimeType.JPEG.checkType(resolver, Uri.parse(\"file://hogehoge/fugafuga/image.jpeg\")));\n            assertFalse(MimeType.JPEG.checkType(resolver, Uri.parse(\"file://hogehoge/fugafuga/image.png\")));\n            assertFalse(MimeType.JPEG.checkType(resolver, Uri.parse(\"file://hogehoge/fugafuga/image.gif\")));\n            assertFalse(MimeType.JPEG.checkType(resolver, null));\n        }\n\n        {\n            assertFalse(MimeType.PNG.checkType(resolver, Uri.parse(\"file://hogehoge/fugafuga/image.jpg\")));\n            assertFalse(MimeType.PNG.checkType(resolver, Uri.parse(\"file://hogehoge/fugafuga/image.jpeg\")));\n            assertTrue(MimeType.PNG.checkType(resolver, Uri.parse(\"file://hogehoge/fugafuga/image.png\")));\n            assertFalse(MimeType.PNG.checkType(resolver, Uri.parse(\"file://hogehoge/fugafuga/image.gif\")));\n            assertFalse(MimeType.PNG.checkType(resolver, null));\n        }\n\n        {\n            assertFalse(MimeType.GIF.checkType(resolver, Uri.parse(\"file://hogehoge/fugafuga/image.jpg\")));\n            assertFalse(MimeType.GIF.checkType(resolver, Uri.parse(\"file://hogehoge/fugafuga/image.jpeg\")));\n            assertFalse(MimeType.GIF.checkType(resolver, Uri.parse(\"file://hogehoge/fugafuga/image.png\")));\n            assertTrue(MimeType.GIF.checkType(resolver, Uri.parse(\"file://hogehoge/fugafuga/image.gif\")));\n            assertFalse(MimeType.GIF.checkType(resolver, null));\n        }\n    }\n}\n"
  },
  {
    "path": "laevatein/src/main/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.laevatein\">\n\n    <uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\" />\n    <uses-permission android:name=\"android.permission.READ_EXTERNAL_STORAGE\" />\n\n\n    <application android:allowBackup=\"true\">\n        <activity android:name=\".ui.PhotoSelectionActivity\" />\n        <activity android:name=\".ui.ImagePreviewActivity\" />\n    </application>\n</manifest>"
  },
  {
    "path": "laevatein/src/main/java/com/laevatein/Laevatein.java",
    "content": "/*\n * Copyright (C) 2014 nohana, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an &quot;AS IS&quot; BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage com.laevatein;\n\nimport android.app.Activity;\nimport android.content.Intent;\nimport android.net.Uri;\nimport androidx.annotation.Nullable;\nimport androidx.fragment.app.Fragment;\n\nimport com.laevatein.ui.PhotoSelectionActivity;\n\nimport java.lang.ref.WeakReference;\nimport java.util.List;\nimport java.util.Set;\n\n/**\n * Photo selection activity set provider.\n * Use {@link #from(android.app.Activity)} to start selection activity with the specification you'd like.\n * And the result will be delivered to {@link Activity#onActivityResult(int, int, android.content.Intent)},\n * and use {@link #obtainResult(android.content.Intent)} for the convenience of receiving the selection result.\n *\n * @author KeithYokoma\n * @version 1.0.0\n * @since 2014/03/19\n */\n@SuppressWarnings(\"unused\") // public APIs\npublic final class Laevatein {\n    public static final String TAG = Laevatein.class.getSimpleName();\n    private final WeakReference<Activity> mContext;\n    private final WeakReference<Fragment> mFragment;\n\n    protected Laevatein(Activity context) {\n        mContext = new WeakReference<>(context);\n        mFragment = null;\n    }\n\n    protected Laevatein(Activity activity, Fragment fragment) {\n        mContext = new WeakReference<>(activity);\n        mFragment = new WeakReference<>(fragment);\n    }\n\n    /**\n     * Starts selection from the specified {@link android.app.Activity}.\n     *\n     * @param activity to start.\n     * @return the requester context wrapper.\n     */\n    public static Laevatein from(Activity activity) {\n        return new Laevatein(activity);\n    }\n\n    public static Laevatein from(Fragment fragment) {\n        return new Laevatein(fragment.getActivity(), fragment);\n    }\n\n    /**\n     * Obtains the selection result passed to your {@link Activity#onActivityResult(int, int, android.content.Intent)}.\n     *\n     * @param data the data.\n     * @return the selected {@link android.net.Uri}s.\n     */\n    public static List<Uri> obtainResult(Intent data) {\n        return data.getParcelableArrayListExtra(PhotoSelectionActivity.EXTRA_RESULT_SELECTION);\n    }\n\n    /**\n     * Specifies the MIME Type to select.\n     *\n     * @param mimeType the mime type of the photo you would like to choose.\n     * @return the specification builder context.\n     */\n    public SelectionSpecBuilder choose(Set<MimeType> mimeType) {\n        return new SelectionSpecBuilder(this, mimeType);\n    }\n\n    /**\n     * @return the actual requester context.\n     */\n    /* package */\n    @Nullable\n    Activity getActivity() {\n        return mContext.get();\n    }\n\n    /**\n     * @return the fragment that is responsible for result handling.\n     */\n    /* package */\n    @Nullable\n    Fragment getFragment() {\n        return mFragment != null ? mFragment.get() : null;\n    }\n}\n"
  },
  {
    "path": "laevatein/src/main/java/com/laevatein/MimeType.java",
    "content": "/*\n * Copyright (C) 2014 nohana, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an &quot;AS IS&quot; BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage com.laevatein;\n\nimport com.laevatein.internal.utils.PhotoMetadataUtils;\n\nimport android.content.ContentResolver;\nimport android.net.Uri;\nimport android.webkit.MimeTypeMap;\n\nimport java.util.EnumSet;\nimport java.util.HashSet;\nimport java.util.Locale;\nimport java.util.Set;\n\n/**\n * MIME Type enumeration to restrict selectable photo on the selection activity.\n * @author KeithYokoma\n * @since 2014/03/19\n * @version 1.0.0\n */\n@SuppressWarnings(\"unused\") // public APIs\npublic enum MimeType {\n    JPEG(\"image/jpeg\", new HashSet<String>() {{ add(\"jpg\"); add(\"jpeg\"); }}),\n    PNG(\"image/png\", new HashSet<String>() {{ add(\"png\"); }}),\n    GIF(\"image/gif\", new HashSet<String>() {{ add(\"gif\"); }});\n\n    private final String mMimeTypeName;\n    private final Set<String> mExtensions;\n\n    MimeType(String mimeTypeName, Set<String> extensions) {\n        mMimeTypeName = mimeTypeName;\n        mExtensions = extensions;\n    }\n\n    public static Set<MimeType> allOf() {\n        return EnumSet.allOf(MimeType.class);\n    }\n\n    public static Set<MimeType> of(MimeType type) {\n        return EnumSet.of(type);\n    }\n\n    public static Set<MimeType> of(MimeType type, MimeType... rest) {\n        return EnumSet.of(type, rest);\n    }\n\n    @Override\n    public String toString() {\n        return mMimeTypeName;\n    }\n\n    public boolean checkType(ContentResolver resolver, Uri uri) {\n        MimeTypeMap map = MimeTypeMap.getSingleton();\n        if (uri == null) {\n            return false;\n        }\n        String type = map.getExtensionFromMimeType(resolver.getType(uri));\n        for (String extension : mExtensions) {\n            if (extension.equals(type)) {\n                return true;\n            }\n            String path = PhotoMetadataUtils.getPath(resolver, uri);\n            if (path != null && path.toLowerCase(Locale.US).endsWith(extension)) {\n                return true;\n            }\n        }\n        return false;\n    }\n}\n"
  },
  {
    "path": "laevatein/src/main/java/com/laevatein/SelectionSpecBuilder.java",
    "content": "/*\n * Copyright (C) 2014 nohana, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an &quot;AS IS&quot; BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage com.laevatein;\n\nimport android.app.Activity;\nimport android.content.Intent;\nimport android.net.Uri;\nimport androidx.annotation.StringRes;\nimport androidx.annotation.StyleRes;\nimport androidx.core.app.ActivityCompat;\nimport androidx.core.app.ActivityOptionsCompat;\nimport androidx.fragment.app.Fragment;\nimport android.view.View;\n\nimport com.laevatein.internal.entity.CaptureResources;\nimport com.laevatein.internal.entity.CounterViewResources;\nimport com.laevatein.internal.entity.DialogResources;\nimport com.laevatein.internal.entity.ErrorViewResources;\nimport com.laevatein.internal.entity.ErrorViewSpec;\nimport com.laevatein.internal.entity.ItemViewResources;\nimport com.laevatein.internal.entity.PreviewViewResources;\nimport com.laevatein.internal.entity.SelectionSpec;\nimport com.laevatein.internal.entity.ViewResourceSpec;\nimport com.laevatein.ui.ImagePreviewActivity;\nimport com.laevatein.ui.PhotoSelectionActivity;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Set;\n\n/**\n * Fluent API for building photo select specification.\n *\n * @author KeithYokoma\n * @version 1.0.0\n * @since 2014/03/19\n */\n@SuppressWarnings(\"unused\") // public APIs\npublic final class SelectionSpecBuilder {\n    public static final String TAG = SelectionSpecBuilder.class.getSimpleName();\n    private final Laevatein mLaevatein;\n    private final Set<MimeType> mMimeType;\n    private final SelectionSpec mSelectionSpec;\n    @StyleRes\n    private int mActivityTheme;\n    private ItemViewResources mItemViewResources;\n    private CounterViewResources mCounterViewResources;\n    private PreviewViewResources mPreviewViewResources;\n    private ErrorViewResources mCountUnderErrorSpec;\n    private ErrorViewResources mCountOverErrorSpec;\n    private ErrorViewResources mUnderQualityErrorSpec;\n    private ErrorViewResources mOverQualityErrorSpec;\n    private ErrorViewResources mUnderSizeErrorSpec;\n    private ErrorViewResources mOverSizeErrorSpec;\n    private ErrorViewResources mTypeErrorSpec;\n    private DialogResources mConfirmDialogSpec;\n    private boolean mOpenDrawer = true;\n    private String mFileProviderAuthorities;\n    private boolean mEnableSelectedView;\n    private int mActivityOrientation;\n    private List<Uri> mResumeList;\n    private Class<? extends PhotoSelectionActivity> mPhotoSelectionActivityClass;\n    private Class<? extends ImagePreviewActivity> mPreviewActivityClass = ImagePreviewActivity.class;\n\n    /**\n     * Constructs a new specification builder on the context.\n     * @param laevatein a requester context wrapper.\n     * @param mimeType MimeType set to select.\n     */\n    /* package */ SelectionSpecBuilder(Laevatein laevatein, Set<MimeType> mimeType) {\n        mLaevatein = laevatein;\n        mMimeType = mimeType;\n        mSelectionSpec = new SelectionSpec();\n        mResumeList = new ArrayList<>();\n        mActivityOrientation = -1;\n    }\n\n    /**\n     * Sets the theme of activities.\n     *\n     * @param theme theme of activity\n     * @return the specification builder context.\n     */\n    public SelectionSpecBuilder theme(@StyleRes int theme) {\n        mActivityTheme = theme;\n        return this;\n    }\n\n    /**\n     * Sets the binding cell of the grid view with the specified layout resource for photo list.\n     * @param layoutId a layout resource id.\n     * @param imageViewId an id for the image view.\n     * @param checkBoxId an id for the check box.\n     * @param spanCount an span count for GridLayout.\n     */\n    public SelectionSpecBuilder bindEachImageWith(int layoutId, int imageViewId, int checkBoxId, int spanCount) {\n        mItemViewResources = new ItemViewResources(layoutId, imageViewId, checkBoxId, spanCount);\n        return this;\n    }\n\n    /**\n     * Sets counter view style of photo selection.\n     *\n     * @param viewPosition the position where counter view layouted\n     * @param textId counter text id.\n     * @return the specification builder context.\n     */\n    public SelectionSpecBuilder counterView(@CounterViewResources.VIEW_POSITION int viewPosition, @StringRes int textId) {\n        mCounterViewResources = new CounterViewResources(viewPosition, textId);\n        return this;\n    }\n\n    /**\n     * Sets the binding page of the ViewPager with the specified layout resource for photo list.\n     *\n     * @param layoutId    a layout resource id.\n     * @param imageViewId an id for the image view.\n     * @return the specification builder context.\n     */\n    public SelectionSpecBuilder bindPreviewImageWith(int layoutId, int imageViewId) {\n        mPreviewViewResources = new PreviewViewResources(layoutId, imageViewId);\n        return this;\n    }\n\n    /**\n     * Sets the limitation of a selectable count within the specified range.\n     * @param min minimum value to select.\n     * @param max maximum value to select.\n     * @return the specification builder context.\n     */\n    public SelectionSpecBuilder count(int min, int max) {\n        mSelectionSpec.setMinSelectable(min);\n        mSelectionSpec.setMaxSelectable(max);\n        return this;\n    }\n\n    /**\n     * Sets the error view specification for the error of count over.\n     * @param type error view type.\n     * @param errorMessageId an error message resource id.\n     * @return the specification builder context.\n     */\n    public SelectionSpecBuilder countUnder(ErrorViewResources.ViewType type, int errorMessageId) {\n        return countUnder(type, -1, errorMessageId);\n    }\n\n    /**\n     * Sets the error view specification for the error of count over.\n     * @param type error view type.\n     * @param errorTitleId an error title resource id. If type is not {@see ErrorViewResources.ViewType.DIALOG}, this parameter is ignored.\n     * @param errorMessageId an error message resource id.\n     * @return the specification builder context.\n     */\n    public SelectionSpecBuilder countUnder(ErrorViewResources.ViewType type, int errorTitleId, int errorMessageId) {\n        mCountUnderErrorSpec = type.createSpec(errorTitleId, errorMessageId);\n        return this;\n    }\n\n    /**\n     * Sets the error view specification for the error of count over.\n     * @param type error view type.\n     * @param errorMessageId an error message resource id.\n     * @return the specification builder context.\n     */\n    public SelectionSpecBuilder countOver(ErrorViewResources.ViewType type, int errorMessageId) {\n        return countOver(type, -1, errorMessageId);\n    }\n\n    /**\n     * Sets the error view specification for the error of count over.\n     * @param type error view type.\n     * @param errorTitleId an error title resource id. If type is not {@see ErrorViewResources.ViewType.DIALOG}, this parameter is ignored.\n     * @param errorMessageId an error message resource id.\n     * @return the specification builder context.\n     */\n    public SelectionSpecBuilder countOver(ErrorViewResources.ViewType type, int errorTitleId, int errorMessageId) {\n        mCountOverErrorSpec = type.createSpec(errorTitleId, errorMessageId);\n        return this;\n    }\n\n    /**\n     * Sets the flag to determine whether the list of which image has been selected should be shown or not.\n     * The flag is set as false by default.\n     * @param enableSelectedView the flag of visibility.\n     * @return the specification builder context.\n     */\n    public SelectionSpecBuilder enableSelectedView(boolean enableSelectedView) {\n        mEnableSelectedView = enableSelectedView;\n        return this;\n    }\n\n    /**\n     * Sets the error view specification for the error of quality un-satisfaction.\n     * @param type error view type.\n     * @param errorMessageId an error message resource id.\n     * @return the specification builder context.\n     */\n    public SelectionSpecBuilder underQuality(ErrorViewResources.ViewType type, int errorMessageId) {\n        return underQuality(type, -1, errorMessageId);\n    }\n\n    /**\n     * Sets the error view specification for the error of quality un-satisfaction.\n     * @param type error view type.\n     * @param errorTitleId an error title resource id. If type is not {@see ErrorViewResources.ViewType.DIALOG}, this parameter is ignored.\n     * @param errorMessageId an error message resource id.\n     * @return the specification builder context.\n     */\n    public SelectionSpecBuilder underQuality(ErrorViewResources.ViewType type, int errorTitleId, int errorMessageId) {\n        mUnderQualityErrorSpec = type.createSpec(errorTitleId, errorMessageId);\n        return this;\n    }\n\n    /**\n     * Sets the error view specification for the error of quality un-satisfaction..\n     * @param type error view type.\n     * @param errorMessageId an error message resource id.\n     * @return the specification builder context.\n     */\n    public SelectionSpecBuilder overQuality(ErrorViewResources.ViewType type, int errorMessageId) {\n        return overQuality(type, -1, errorMessageId);\n    }\n\n    /**\n     * Sets the error view specification for the error of quality un-satisfaction..\n     * @param type error view type.\n     * @param errorTitleId an error title resource id. If type is not {@see ErrorViewResources.ViewType.DIALOG}, this parameter is ignored.\n     * @param errorMessageId an error message resource id.\n     * @return the specification builder context.\n     */\n    public SelectionSpecBuilder overQuality(ErrorViewResources.ViewType type, int errorTitleId, int errorMessageId) {\n        mOverQualityErrorSpec = type.createSpec(errorTitleId, errorMessageId);\n        return this;\n    }\n\n    /**\n     * Sets the error view specification for the error of size un-satisfaction.\n     * @param type error view type.\n     * @param errorMessageId an error message resource id.\n     * @return the specification builder context.\n     */\n    public SelectionSpecBuilder underSize(ErrorViewResources.ViewType type, int errorMessageId) {\n        return underSize(type, -1, errorMessageId);\n    }\n\n    /**\n     * Sets the error view specification for the error of size un-satisfaction.\n     * @param type error view type.\n     * @param errorTitleId an error title resource id. If type is not {@see ErrorViewResources.ViewType.DIALOG}, this parameter is ignored.\n     * @param errorMessageId an error message resource id.\n     * @return the specification builder context.\n     */\n    public SelectionSpecBuilder underSize(ErrorViewResources.ViewType type, int errorTitleId, int errorMessageId) {\n        mUnderSizeErrorSpec = type.createSpec(errorTitleId, errorMessageId);\n        return this;\n    }\n\n    /**\n     * Sets the error view specification for the error of size un-satisfaction..\n     * @param type error view type.\n     * @param errorMessageId an error message resource id.\n     * @return the specification builder context.\n     */\n    public SelectionSpecBuilder overSize(ErrorViewResources.ViewType type, int errorMessageId) {\n        return overSize(type, -1, errorMessageId);\n    }\n\n    /**\n     * Sets the error view specification for the error of size un-satisfaction..\n     * @param type error view type.\n     * @param errorTitleId an error title resource id. If type is not {@see ErrorViewResources.ViewType.DIALOG}, this parameter is ignored.\n     * @param errorMessageId an error message resource id.\n     * @return the specification builder context.\n     */\n    public SelectionSpecBuilder overSize(ErrorViewResources.ViewType type, int errorTitleId, int errorMessageId) {\n        mOverSizeErrorSpec = type.createSpec(errorTitleId, errorMessageId);\n        return this;\n    }\n\n    /**\n     * Sets the error view specification for the error of type validation.\n     * @param type error view type.\n     * @param errorMessageId an error message resource id.\n     * @return the specification builder context.\n     */\n    public SelectionSpecBuilder invalidType(ErrorViewResources.ViewType type, int errorMessageId) {\n        return invalidType(type, -1, errorMessageId);\n    }\n\n    /**\n     * Sets the error view specification for the error of type validation.\n     * @param type error view type.\n     * @param errorTitleId an error title resource id. If type is not {@see ErrorViewResources.ViewType.DIALOG}, this parameter is ignored.\n     * @param errorMessageId an error message resource id.\n     * @return the specification builder context.\n     */\n    public SelectionSpecBuilder invalidType(ErrorViewResources.ViewType type, int errorTitleId, int errorMessageId) {\n        mTypeErrorSpec = type.createSpec(errorTitleId, errorMessageId);\n        return this;\n    }\n\n    /**\n     * Sets the error view specification for the press back without finish.\n     * @param errorMessageId an error message resource id.\n     * @return the specification builder context.\n     */\n    public SelectionSpecBuilder confirmDialog(int errorMessageId) {\n        return confirmDialog(-1, errorMessageId);\n    }\n\n    /**\n     * Sets the error view specification for the press back without finish.\n     * @param errorTitleId an error title resource id. If type is not {@see ErrorViewResources.ViewType.DIALOG}, this parameter is ignored.\n     * @param errorMessageId an error message resource id.\n     * @return the specification builder context.\n     */\n    public SelectionSpecBuilder confirmDialog(int errorTitleId, int errorMessageId) {\n        mConfirmDialogSpec = new DialogResources(errorTitleId, errorMessageId);\n        return this;\n    }\n\n    /**\n     * Sets the limitation of a selectable image quality by pixel count within the specified range.\n     * @param minPixel minimum value to select.\n     * @param maxPixel maximum value to select.\n     * @return the specification builder context.\n     */\n    public SelectionSpecBuilder quality(int minPixel, int maxPixel) {\n        mSelectionSpec.setMinPixels(minPixel);\n        mSelectionSpec.setMaxPixels(maxPixel);\n        return this;\n    }\n\n    /**\n     * Sets the limitation of a selectable image size by pixel count minimum.\n     *\n     * @param minWidth  minimum width value to select.\n     * @param minHeight minimum width value to select.\n     * @return the specification builder context.\n     */\n    public SelectionSpecBuilder size(int minWidth, int minHeight) {\n        size(minWidth, minHeight, Integer.MAX_VALUE, Integer.MAX_VALUE);\n        return this;\n    }\n\n    /**\n     * Sets the limitation of a selectable image size by pixel count minimum and maximum.\n     *\n     * @param minWidth  minimum width value to select.\n     * @param minHeight minimum width value to select.\n     * @param maxWidth  maximum height value to select.\n     * @param maxHeight maximum height value to select.\n     * @return the specification builder context.\n     */\n    public SelectionSpecBuilder size(int minWidth, int minHeight, int maxWidth, int maxHeight) {\n        mSelectionSpec.setMinSize(minWidth, minHeight);\n        mSelectionSpec.setMaxSize(maxWidth, maxHeight);\n        return this;\n    }\n\n    /**\n     * Sets the default selected album.\n     *\n     * @param albumId default selected album.\n     * @return the specification builder context.\n     */\n    public SelectionSpecBuilder albumId(String albumId) {\n        mSelectionSpec.setDefaultAlbumId(albumId);\n        return this;\n    }\n\n    /**\n     * Sets the Activity instead of PhotoSelectionActivity\n     * @param photoSelectionActivityClass an Activity called on photo selecting\n     * @return the specification builder context.\n     */\n    public SelectionSpecBuilder photoSelectionActivityClass(Class<? extends PhotoSelectionActivity> photoSelectionActivityClass) {\n        mPhotoSelectionActivityClass = photoSelectionActivityClass;\n        return this;\n    }\n\n    /**\n     * Sets the Activity instead of ImagePreviewActivity\n     *\n     * @param previewActivityClass an Activity called on photo preview\n     * @return the specification builder context.\n     */\n    public SelectionSpecBuilder previewActivityClass(Class<? extends ImagePreviewActivity> previewActivityClass) {\n        mPreviewActivityClass = previewActivityClass;\n        return this;\n    }\n\n    /**\n     * Sets the default selection to resume photo picking activity.\n     * @param uriList to set selected as default.\n     * @return the specification builder context.\n     */\n    public SelectionSpecBuilder resume(List<Uri> uriList) {\n        if (uriList == null) { // nothing to do.\n            return this;\n        }\n        mResumeList.addAll(uriList);\n        return this;\n    }\n\n    /**\n     * Determines whether opening NavigationDrawer on launch or not.\n     * This flag is true by default.\n     *\n     * @param open whether to open drawer or not.\n     * @return the specification builder context.\n     */\n    public SelectionSpecBuilder openDrawer(boolean open) {\n        mOpenDrawer = open;\n        return this;\n    }\n\n    /**\n     * Determines whether the photo capturing is enabled or not on the camera photo grid view.\n     * This flag is false by default.\n     *\n     * @param fileProviderAuthorities your FileProvider authorities name.\n     * @return the specification builder context.\n     */\n    public SelectionSpecBuilder enableCapture(String fileProviderAuthorities) {\n        mFileProviderAuthorities = fileProviderAuthorities;\n        return this;\n    }\n\n    /**\n     * Determines whether the photo capturing is enabled or not on the camera photo grid view.\n     * This flag is false by default.\n     *\n     * @return the specification builder context.\n     */\n    public SelectionSpecBuilder disableCapture() {\n        mFileProviderAuthorities = null;\n        return this;\n    }\n\n    public SelectionSpecBuilder restrictOrientation(int activityOrientation) {\n        mActivityOrientation = activityOrientation;\n        return this;\n    }\n\n    /**\n     * Start to select photo.\n     * @param requestCode identity of the requester activity.\n     */\n    public void forResult(int requestCode) {\n        forResultWithTransition(requestCode, null);\n    }\n\n    /**\n     * Start to select photo.\n     *\n     * @param requestCode identity of the requester activity.\n     * @param view        transition source view\n     */\n    public void forResultWithTransition(int requestCode, View view) {\n        Activity activity = mLaevatein.getActivity();\n        if (activity == null) {\n            return; // cannot continue;\n        }\n\n        mSelectionSpec.setMimeTypeSet(mMimeType);\n        if (mActivityTheme == 0) {\n            mActivityTheme = R.style.L_DefaultTheme;\n        }\n\n        ViewResourceSpec viewSpec = new ViewResourceSpec.Builder()\n                .setTheme(mActivityTheme)\n                .setPreviewClass(mPreviewActivityClass)\n                .setItemViewResources(mItemViewResources)\n                .setCounterViewResources(mCounterViewResources)\n                .setPreviewViewResources(mPreviewViewResources)\n                .setOpenDrawer(mOpenDrawer)\n                .setCaptureResources(new CaptureResources(mFileProviderAuthorities))\n                .setEnableSelectedView(mEnableSelectedView)\n                .setActivityOrientation(mActivityOrientation)\n                .create();\n        ErrorViewSpec errorSpec = new ErrorViewSpec.Builder()\n                .setCountUnderSpec(mCountUnderErrorSpec)\n                .setCountOverSpec(mCountOverErrorSpec)\n                .setOverQualitySpec(mOverQualityErrorSpec)\n                .setUnderQualitySpec(mUnderQualityErrorSpec)\n                .setOverSizeSpec(mOverSizeErrorSpec)\n                .setUnderSizeSpec(mUnderSizeErrorSpec)\n                .setTypeSpec(mTypeErrorSpec)\n                .setConfirmSpec(mConfirmDialogSpec)\n                .create();\n\n        if (mPhotoSelectionActivityClass == null) {\n            mPhotoSelectionActivityClass = PhotoSelectionActivity.class;\n        }\n\n        Intent intent = new Intent(activity, mPhotoSelectionActivityClass);\n        intent.putExtra(PhotoSelectionActivity.EXTRA_VIEW_SPEC, viewSpec);\n        intent.putExtra(PhotoSelectionActivity.EXTRA_ERROR_SPEC, errorSpec);\n        intent.putExtra(PhotoSelectionActivity.EXTRA_SELECTION_SPEC, mSelectionSpec);\n        intent.putParcelableArrayListExtra(PhotoSelectionActivity.EXTRA_RESUME_LIST, (ArrayList<? extends android.os.Parcelable>) mResumeList);\n\n        Fragment fragment = mLaevatein.getFragment();\n        if (fragment != null) {\n            fragment.startActivityForResult(intent, requestCode);\n        } else if (view != null) {\n            ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(activity,\n                    view, activity.getString(R.string.l_content_transition_name));\n            ActivityCompat.startActivityForResult(activity, intent, requestCode, options.toBundle());\n        } else {\n            activity.startActivityForResult(intent, requestCode);\n        }\n    }\n}\n"
  },
  {
    "path": "laevatein/src/main/java/com/laevatein/internal/entity/Album.java",
    "content": "/*\n * Copyright (C) 2014 nohana, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an &quot;AS IS&quot; BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage com.laevatein.internal.entity;\n\nimport com.laevatein.R;\n\nimport android.content.Context;\nimport android.database.Cursor;\nimport android.os.Parcel;\nimport android.os.Parcelable;\nimport android.provider.MediaStore;\n\nimport androidx.annotation.Nullable;\n\n/**\n * @author KeithYokoma\n * @since 2014/03/20\n * @version 1.0.0\n * @hide\n */\npublic class Album implements Parcelable {\n    public static final Creator<Album> CREATOR = new Creator<Album>() {\n        @Nullable\n        @Override\n        public Album createFromParcel(Parcel source) {\n            return new Album(source);\n        }\n\n        @Override\n        public Album[] newArray(int size) {\n            return new Album[size];\n        }\n    };\n    public static final String ALBUM_ID_ALL = String.valueOf(-1);\n    public static final String ALBUM_NAME_ALL = \"All\";\n    public static final String ALBUM_NAME_CAMERA = \"Camera\";\n    public static final String ALBUM_NAME_DOWNLOAD = \"Download\";\n    public static final String ALBUM_NAME_SCREEN_SHOT = \"Screenshots\";\n    private final String mId;\n    private final long mCoverId;\n    private final String mDisplayName;\n\n    /* package */ Album(String id, long coverId, String albumName) {\n        mId = id;\n        mCoverId = coverId;\n        mDisplayName = albumName;\n    }\n\n    /* package */ Album(Parcel source) {\n        mId = source.readString();\n        mCoverId = source.readLong();\n        mDisplayName = source.readString();\n    }\n\n    /**\n     * Constructs a new {@link com.laevatein.internal.entity.Album} entity from the {@link android.database.Cursor}.\n     * This method is not responsible for managing cursor resource, such as close, iterate, and so on.\n     * @param cursor to be converted.\n     * @return a new {@link com.laevatein.internal.entity.Album}.\n     */\n    public static Album valueOf(Cursor cursor) {\n        return new Album(\n                cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.BUCKET_ID)),\n                cursor.getLong(cursor.getColumnIndex(MediaStore.Images.Media._ID)),\n                cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.BUCKET_DISPLAY_NAME)));\n    }\n\n    @Override\n    public int describeContents() {\n        return 0;\n    }\n\n    @Override\n    public void writeToParcel(Parcel dest, int flags) {\n        dest.writeString(mId);\n        dest.writeLong(mCoverId);\n        dest.writeString(mDisplayName);\n    }\n\n    public String getId() {\n        return mId;\n    }\n\n    public long getCoverId() {\n        return mCoverId;\n    }\n\n    public String getDisplayName(Context context) {\n        if (isAll()) {\n            return context.getString(R.string.l_album_name_all);\n        }\n        if (isCamera()) {\n            return context.getString(R.string.l_album_name_camera);\n        }\n        if (ALBUM_NAME_DOWNLOAD.equals(mDisplayName)) {\n            return context.getString(R.string.l_album_name_download);\n        }\n        if (ALBUM_NAME_SCREEN_SHOT.equals(mDisplayName)) {\n            return context.getString(R.string.l_album_name_screen_shot);\n        }\n        return mDisplayName;\n    }\n\n    public boolean isAll() {\n        return ALBUM_ID_ALL.equals(mId);\n    }\n\n    public boolean isCamera() {\n        return ALBUM_NAME_CAMERA.equals(mDisplayName);\n    }\n}"
  },
  {
    "path": "laevatein/src/main/java/com/laevatein/internal/entity/CaptureResources.java",
    "content": "package com.laevatein.internal.entity;\n\nimport android.os.Parcel;\nimport android.os.Parcelable;\nimport androidx.annotation.Nullable;\n\npublic class CaptureResources implements Parcelable {\n\n    public static final Creator<CaptureResources> CREATOR = new Creator<CaptureResources>() {\n        @Override\n        public CaptureResources createFromParcel(Parcel in) {\n            return new CaptureResources(in);\n        }\n\n        @Override\n        public CaptureResources[] newArray(int size) {\n            return new CaptureResources[size];\n        }\n    };\n\n    @Nullable\n    private final String mFileProviderAuthorities;\n\n    public CaptureResources(@Nullable String fileProviderAuthorities) {\n        mFileProviderAuthorities = fileProviderAuthorities;\n    }\n\n    private CaptureResources(Parcel in) {\n        mFileProviderAuthorities = in.readString();\n    }\n\n    @Override\n    public void writeToParcel(Parcel dest, int flags) {\n        dest.writeString(mFileProviderAuthorities);\n    }\n\n    @Override\n    public int describeContents() {\n        return 0;\n    }\n\n    public boolean enabled() {\n        return mFileProviderAuthorities != null;\n    }\n\n    @Nullable\n    public String getFileProviderAuthorities() {\n        return mFileProviderAuthorities;\n    }\n}\n"
  },
  {
    "path": "laevatein/src/main/java/com/laevatein/internal/entity/CounterViewResources.java",
    "content": "package com.laevatein.internal.entity;\n\nimport android.os.Parcel;\nimport android.os.Parcelable;\nimport androidx.annotation.IntDef;\nimport androidx.annotation.StringRes;\n\nimport com.laevatein.R;\n\n/**\n * @author keishin.yokomaku\n * @since 2014/04/07\n */\npublic class CounterViewResources implements Parcelable {\n    public static final Creator<CounterViewResources> CREATOR = new Creator<CounterViewResources>() {\n        @Override\n        public CounterViewResources createFromParcel(Parcel source) {\n            return new CounterViewResources(source);\n        }\n\n        @Override\n        public CounterViewResources[] newArray(int size) {\n            return new CounterViewResources[size];\n        }\n    };\n\n\n    @IntDef({LAYOUT_APP_BAR, LAYOUT_BOTTOM})\n    public @interface VIEW_POSITION {\n    }\n\n    public static final int LAYOUT_APP_BAR = 1;\n    public static final int LAYOUT_BOTTOM = 2;\n\n    private static volatile CounterViewResources sDefault;\n    @VIEW_POSITION\n    private final int mViewPosition;\n    @StringRes\n    private final int mTextId;\n\n    /* package */ CounterViewResources(Parcel source) {\n        mViewPosition = readViewPosition(source);\n        mTextId = source.readInt();\n    }\n\n    public CounterViewResources(@VIEW_POSITION int viewPosition, @StringRes int textId) {\n        mViewPosition = viewPosition;\n        mTextId = textId;\n    }\n\n    @Override\n    public int describeContents() {\n        return 0;\n    }\n\n    @Override\n    public void writeToParcel(Parcel dest, int flags) {\n        dest.writeInt(mViewPosition);\n        dest.writeInt(mTextId);\n    }\n\n    @VIEW_POSITION\n    public int getViewType() {\n        return mViewPosition;\n    }\n\n    @StringRes\n    public int getTextRes(){\n        return mTextId;\n    }\n\n    public static CounterViewResources getDefault() {\n        if (sDefault == null) {\n            sDefault = new CounterViewResources(LAYOUT_BOTTOM, R.string.l_format_selection_count);\n        }\n        return sDefault;\n    }\n\n    @VIEW_POSITION\n    private int readViewPosition(Parcel source) {\n        int result = source.readInt();\n        switch (result) {\n            case LAYOUT_APP_BAR:\n                return LAYOUT_APP_BAR;\n            case LAYOUT_BOTTOM:\n                return LAYOUT_BOTTOM;\n            default:\n                throw new IllegalArgumentException();\n        }\n    }\n}"
  },
  {
    "path": "laevatein/src/main/java/com/laevatein/internal/entity/DialogResources.java",
    "content": "package com.laevatein.internal.entity;\n\nimport android.os.Parcel;\nimport android.os.Parcelable;\n\n/**\n * @author hiroyuki.setp\n * @since 2017/01/11\n */\npublic class DialogResources implements Parcelable {\n    public static final Creator<DialogResources> CREATOR = new Creator<DialogResources>() {\n        @Override\n        public DialogResources createFromParcel(Parcel source) {\n            return new DialogResources(source);\n        }\n\n        @Override\n        public DialogResources[] newArray(int size) {\n            return new DialogResources[size];\n        }\n    };\n    private final int mTitleId;\n    private final int mMessageId;\n\n    /* package */ DialogResources(Parcel source) {\n        mTitleId = source.readInt();\n        mMessageId = source.readInt();\n    }\n\n    public DialogResources(int messageId) {\n        this(-1, messageId);\n    }\n\n    public DialogResources(int titleId, int messageId) {\n        mTitleId = titleId;\n        mMessageId = messageId;\n    }\n\n    @Override\n    public int describeContents() {\n        return 0;\n    }\n\n    @Override\n    public void writeToParcel(Parcel dest, int flags) {\n        dest.writeInt(mTitleId);\n        dest.writeInt(mMessageId);\n    }\n\n    public int getTitleId() {\n        return mTitleId;\n    }\n\n    public int getMessageId() {\n        return mMessageId;\n    }\n}\n"
  },
  {
    "path": "laevatein/src/main/java/com/laevatein/internal/entity/ErrorViewResources.java",
    "content": "package com.laevatein.internal.entity;\n\nimport android.os.Parcel;\nimport android.os.Parcelable;\n\n/**\n * @author keishin.yokomaku\n * @since 2014/04/07\n */\npublic class ErrorViewResources implements Parcelable {\n    public static final Creator<ErrorViewResources> CREATOR = new Creator<ErrorViewResources>() {\n        @Override\n        public ErrorViewResources createFromParcel(Parcel source) {\n            return new ErrorViewResources(source);\n        }\n\n        @Override\n        public ErrorViewResources[] newArray(int size) {\n            return new ErrorViewResources[size];\n        }\n    };\n    private final ViewType mViewType;\n    private final int mTitleId;\n    private final int mMessageId;\n\n    /* package */ ErrorViewResources(Parcel source) {\n        mViewType = (ViewType) source.readSerializable();\n        mTitleId = source.readInt();\n        mMessageId = source.readInt();\n    }\n\n    /* package */ ErrorViewResources(ViewType viewType, int messageId) {\n        this(viewType, -1, messageId);\n    }\n\n    /* package */ ErrorViewResources(ViewType viewType, int titleId, int messageId) {\n        mViewType = viewType;\n        mTitleId = titleId;\n        mMessageId = messageId;\n    }\n\n    /* package */ static ErrorViewResources asNoView() {\n        return new ErrorViewResources(ViewType.NONE, 0);\n    }\n\n    /* package */ static ErrorViewResources asAlertDialog(int titleId, int messageId) {\n        return new ErrorViewResources(ViewType.DIALOG, titleId, messageId);\n    }\n\n    /* package */  static ErrorViewResources asToast(int messageId) {\n        return new ErrorViewResources(ViewType.TOAST, messageId);\n    }\n\n    /* package */  static ErrorViewResources asSnackbar(int messageId) {\n        return new ErrorViewResources(ViewType.SNACKBAR, messageId);\n    }\n\n    @Override\n    public int describeContents() {\n        return 0;\n    }\n\n    @Override\n    public void writeToParcel(Parcel dest, int flags) {\n        dest.writeSerializable(mViewType);\n        dest.writeInt(mTitleId);\n        dest.writeInt(mMessageId);\n    }\n\n    public ViewType getViewType() {\n        return mViewType;\n    }\n\n    public int getTitleId() {\n        return mTitleId;\n    }\n\n    public int getMessageId() {\n        return mMessageId;\n    }\n\n    public boolean isNoView() {\n        return mViewType == ViewType.NONE;\n    }\n\n    public enum ViewType {\n        TOAST {\n            @Override\n            public ErrorViewResources createSpec(int titleId, int messageId) {\n                return ErrorViewResources.asToast(messageId);\n            }\n        },\n        SNACKBAR {\n            @Override\n            public ErrorViewResources createSpec(int titleId, int messageId) {\n                return ErrorViewResources.asSnackbar(messageId);\n            }\n        },\n        DIALOG {\n            @Override\n            public ErrorViewResources createSpec(int titleId, int messageId) {\n                return ErrorViewResources.asAlertDialog(titleId, messageId);\n            }\n        },\n        NONE {\n            @Override\n            public ErrorViewResources createSpec(int titleId, int messageId) {\n                return ErrorViewResources.asNoView();\n            }\n        };\n\n        public abstract ErrorViewResources createSpec(int titleId, int messageId);\n    }\n}\n"
  },
  {
    "path": "laevatein/src/main/java/com/laevatein/internal/entity/ErrorViewSpec.java",
    "content": "package com.laevatein.internal.entity;\n\nimport android.os.Parcel;\nimport android.os.Parcelable;\nimport androidx.annotation.Nullable;\n\nimport com.laevatein.R;\n\n/**\n * @author Keithyokoma\n * @since 2014/04/07\n * @version 1.0.0\n * @hide\n */\npublic class ErrorViewSpec implements Parcelable {\n    public static final Creator<ErrorViewSpec> CREATOR = new Creator<ErrorViewSpec>() {\n        @Override\n        @Nullable\n        public ErrorViewSpec createFromParcel(Parcel source) {\n            return new ErrorViewSpec(source);\n        }\n\n        @Override\n        public ErrorViewSpec[] newArray(int size) {\n            return new ErrorViewSpec[size];\n        }\n    };\n    private final ErrorViewResources mCountUnderErrorSpec;\n    private final ErrorViewResources mCountOverErrorSpec;\n    private final ErrorViewResources mUnderQualitySpec;\n    private final ErrorViewResources mOverQualitySpec;\n    private final ErrorViewResources mUnderSizeSpec;\n    private final ErrorViewResources mOverSizeSpec;\n    private final ErrorViewResources mTypeErrorSpec;\n    private final DialogResources mBackConfirmSpec;\n\n    /* package */ ErrorViewSpec(Parcel source) {\n        mCountUnderErrorSpec = source.readParcelable(ErrorViewResources.class.getClassLoader());\n        mCountOverErrorSpec = source.readParcelable(ErrorViewResources.class.getClassLoader());\n        mUnderQualitySpec = source.readParcelable(ErrorViewResources.class.getClassLoader());\n        mOverQualitySpec = source.readParcelable(ErrorViewResources.class.getClassLoader());\n        mUnderSizeSpec = source.readParcelable(ErrorViewResources.class.getClassLoader());\n        mOverSizeSpec = source.readParcelable(ErrorViewResources.class.getClassLoader());\n        mTypeErrorSpec = source.readParcelable(ErrorViewResources.class.getClassLoader());\n        mBackConfirmSpec = source.readParcelable(DialogResources.class.getClassLoader());\n    }\n\n    /* package */ ErrorViewSpec(ErrorViewResources countUnderSpec, ErrorViewResources countOverSpec,\n                                ErrorViewResources underQualitySpec, ErrorViewResources overQualitySpec,\n                                ErrorViewResources underSizeSpec, ErrorViewResources overSizeSpec,\n                                ErrorViewResources typeErrorSpec, DialogResources backConfirmSpec) {\n        mCountUnderErrorSpec = countUnderSpec;\n        mCountOverErrorSpec = countOverSpec;\n        mUnderQualitySpec = underQualitySpec;\n        mOverQualitySpec = overQualitySpec;\n        mUnderSizeSpec = underSizeSpec;\n        mOverSizeSpec = overSizeSpec;\n        mTypeErrorSpec = typeErrorSpec;\n        mBackConfirmSpec = backConfirmSpec;\n    }\n\n    @Override\n    public int describeContents() {\n        return 0;\n    }\n\n    @Override\n    public void writeToParcel(Parcel dest, int flags) {\n        dest.writeParcelable(mCountUnderErrorSpec, flags);\n        dest.writeParcelable(mCountOverErrorSpec, flags);\n        dest.writeParcelable(mUnderQualitySpec, flags);\n        dest.writeParcelable(mOverQualitySpec, flags);\n        dest.writeParcelable(mUnderSizeSpec, flags);\n        dest.writeParcelable(mOverSizeSpec, flags);\n        dest.writeParcelable(mTypeErrorSpec, flags);\n        dest.writeParcelable(mBackConfirmSpec, flags);\n    }\n\n    public ErrorViewResources getCountUnderErrorSpec() {\n        return mCountUnderErrorSpec;\n    }\n\n    public ErrorViewResources getCountOverErrorSpec() {\n        return mCountOverErrorSpec;\n    }\n\n    public ErrorViewResources getUnderQualitySpec() {\n        return mUnderQualitySpec;\n    }\n\n    public ErrorViewResources getOverQualitySpec() {\n        return mOverQualitySpec;\n    }\n\n    public ErrorViewResources getUnderSizeSpec() {\n        return mUnderSizeSpec;\n    }\n\n    public ErrorViewResources getOverSizeSpec() {\n        return mOverSizeSpec;\n    }\n\n    public ErrorViewResources getTypeErrorSpec() {\n        return mTypeErrorSpec;\n    }\n\n    public DialogResources getBackConfirmSpec() {\n        return mBackConfirmSpec;\n    }\n\n    public static class Builder {\n        private ErrorViewResources mCountUnderSpec;\n        private ErrorViewResources mCountOverSpec;\n        private ErrorViewResources mUnderQualitySpec;\n        private ErrorViewResources mOverQualitySpec;\n        private ErrorViewResources mUnderSizeSpec;\n        private ErrorViewResources mOverSizeSpec;\n        private ErrorViewResources mTypeSpec;\n        private DialogResources mBackSpec;\n\n        public Builder setCountUnderSpec(ErrorViewResources spec) {\n            mCountUnderSpec = spec;\n            return this;\n        }\n\n        public Builder setCountOverSpec(ErrorViewResources spec) {\n            mCountOverSpec = spec;\n            return this;\n        }\n\n        public Builder setUnderQualitySpec(ErrorViewResources spec) {\n            mUnderQualitySpec = spec;\n            return this;\n        }\n\n        public Builder setOverQualitySpec(ErrorViewResources spec) {\n            mOverQualitySpec = spec;\n            return this;\n        }\n\n        public Builder setUnderSizeSpec(ErrorViewResources spec) {\n            mUnderSizeSpec = spec;\n            return this;\n        }\n\n        public Builder setOverSizeSpec(ErrorViewResources spec) {\n            mOverSizeSpec = spec;\n            return this;\n        }\n\n        public Builder setTypeSpec(ErrorViewResources spec) {\n            mTypeSpec = spec;\n            return this;\n        }\n\n        public Builder setConfirmSpec(DialogResources spec) {\n            mBackSpec = spec;\n            return this;\n        }\n\n        public ErrorViewSpec create() {\n            if (mCountUnderSpec == null) {\n                mCountUnderSpec = ErrorViewResources.ViewType.NONE.createSpec(0, 0);\n            }\n            if (mCountOverSpec == null) {\n                mCountOverSpec = ErrorViewResources.ViewType.NONE.createSpec(0, 0);\n            }\n            if (mUnderQualitySpec == null) {\n                mUnderQualitySpec = ErrorViewResources.ViewType.DIALOG.createSpec(-1, R.string.l_error_quality);\n            }\n            if (mOverQualitySpec == null) {\n                mOverQualitySpec = ErrorViewResources.ViewType.DIALOG.createSpec(-1, R.string.l_error_quality);\n            }\n            if (mUnderSizeSpec == null) {\n                mUnderSizeSpec = ErrorViewResources.ViewType.DIALOG.createSpec(-1, R.string.l_error_size);\n            }\n            if (mOverSizeSpec == null) {\n                mOverSizeSpec = ErrorViewResources.ViewType.DIALOG.createSpec(-1, R.string.l_error_size);\n            }\n            if (mTypeSpec == null) {\n                mTypeSpec = ErrorViewResources.ViewType.DIALOG.createSpec(-1, R.string.l_error_invalid_format);\n            }\n            if (mBackSpec == null) {\n                mBackSpec = new DialogResources(R.string.l_confirm_dialog_title, R.string.l_confirm_dialog_message);\n            }\n            return new ErrorViewSpec(mCountUnderSpec, mCountOverSpec, mUnderQualitySpec,\n                    mOverQualitySpec, mUnderSizeSpec, mOverSizeSpec, mTypeSpec, mBackSpec);\n        }\n    }\n}\n"
  },
  {
    "path": "laevatein/src/main/java/com/laevatein/internal/entity/Item.java",
    "content": "/*\n * Copyright (C) 2014 nohana, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an &quot;AS IS&quot; BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage com.laevatein.internal.entity;\n\nimport android.content.ContentUris;\nimport android.database.Cursor;\nimport android.net.Uri;\nimport android.os.Parcel;\nimport android.os.Parcelable;\nimport android.provider.MediaStore;\n\nimport androidx.annotation.Nullable;\n\n/**\n * @author KeithYokoma\n * @since 2014/03/24\n * @version 1.0.0\n * @hide\n */\npublic class Item implements Parcelable {\n    public static final Creator<Item> CREATOR = new Creator<Item>() {\n        @Override\n        @Nullable\n        public Item createFromParcel(Parcel source) {\n            return new Item(source);\n        }\n\n        @Override\n        public Item[] newArray(int size) {\n            return new Item[size];\n        }\n    };\n    public static final long ITEM_ID_CAPTURE = -1;\n    public static final String ITEM_DISPLAY_NAME_CAPTURE = \"Capture\";\n    private final long mId;\n\n    /* package */ Item(long id) {\n        mId = id;\n    }\n\n    /* package */ Item(Parcel source) {\n        mId = source.readLong();\n    }\n\n    public static Item valueOf(Cursor cursor) {\n        return new Item(cursor.getLong(cursor.getColumnIndex(MediaStore.Images.Media._ID)));\n    }\n\n    @Override\n    public int describeContents() {\n        return 0;\n    }\n\n    @Override\n    public void writeToParcel(Parcel dest, int flags) {\n        dest.writeLong(mId);\n    }\n\n    public long getId() {\n        return mId;\n    }\n\n    public Uri buildContentUri() {\n        return ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, mId);\n    }\n\n    public boolean isCapture() {\n        return mId == ITEM_ID_CAPTURE;\n    }\n}"
  },
  {
    "path": "laevatein/src/main/java/com/laevatein/internal/entity/ItemViewResources.java",
    "content": "/*\n * Copyright (C) 2014 nohana, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an &quot;AS IS&quot; BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage com.laevatein.internal.entity;\n\nimport android.os.Parcel;\nimport android.os.Parcelable;\n\nimport com.laevatein.R;\n\n/**\n * @author KeithYokoma\n * @version 1.0.0\n * @hide\n * @since 2014/03/20\n */\npublic final class ItemViewResources implements Parcelable {\n    private static final int DEFAULT_SPAN_COUNT = 4;\n    public static final Creator<ItemViewResources> CREATOR = new Creator<ItemViewResources>() {\n        @Override\n        public ItemViewResources createFromParcel(Parcel source) {\n            return new ItemViewResources(source);\n        }\n\n        @Override\n        public ItemViewResources[] newArray(int size) {\n            return new ItemViewResources[size];\n        }\n    };\n    private static volatile ItemViewResources sDefault;\n    private final int mLayoutId;\n    private final int mImageViewId;\n    private final int mCheckBoxId;\n    private final int mSpanCount;\n\n    public ItemViewResources(int layoutId, int imageViewId, int checkBoxId, int spanCount) {\n        mLayoutId = layoutId;\n        mImageViewId = imageViewId;\n        mCheckBoxId = checkBoxId;\n        mSpanCount = spanCount;\n    }\n\n    /* package */ ItemViewResources(Parcel source) {\n        mLayoutId = source.readInt();\n        mImageViewId = source.readInt();\n        mCheckBoxId = source.readInt();\n        mSpanCount = source.readInt();\n    }\n\n    public static ItemViewResources getDefault() {\n        if (sDefault == null) {\n            sDefault = new ItemViewResources(R.layout.l_grid_item_default_photo, R.id.l_default_grid_image, R.id.l_default_check_box, DEFAULT_SPAN_COUNT);\n        }\n        return sDefault;\n    }\n\n    @Override\n    public int describeContents() {\n        return 0;\n    }\n\n    @Override\n    public void writeToParcel(Parcel dest, int flags) {\n        dest.writeInt(mLayoutId);\n        dest.writeInt(mImageViewId);\n        dest.writeInt(mCheckBoxId);\n        dest.writeInt(mSpanCount);\n    }\n\n    public int getLayoutId() {\n        return mLayoutId;\n    }\n\n    public int getImageViewId() {\n        return mImageViewId;\n    }\n\n    public int getCheckBoxId() {\n        return mCheckBoxId;\n    }\n\n    public int getSpanCount() {\n        return mSpanCount;\n    }\n}\n"
  },
  {
    "path": "laevatein/src/main/java/com/laevatein/internal/entity/PreviewViewResources.java",
    "content": "/*\n * Copyright (C) 2014 nohana, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an &quot;AS IS&quot; BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage com.laevatein.internal.entity;\n\nimport android.os.Parcel;\nimport android.os.Parcelable;\n\nimport com.laevatein.R;\n\n/**\n * @author HiroyukiSeto\n * @version 2.0.0\n * @hide\n * @since 2016/11/25\n */\npublic final class PreviewViewResources implements Parcelable {\n    public static final Creator<PreviewViewResources> CREATOR = new Creator<PreviewViewResources>() {\n        @Override\n        public PreviewViewResources createFromParcel(Parcel source) {\n            return new PreviewViewResources(source);\n        }\n\n        @Override\n        public PreviewViewResources[] newArray(int size) {\n            return new PreviewViewResources[size];\n        }\n    };\n    private static volatile PreviewViewResources sDefault;\n    private final int mLayoutId;\n    private final int mImageViewId;\n\n    public PreviewViewResources(int layoutId, int imageViewId) {\n        mLayoutId = layoutId;\n        mImageViewId = imageViewId;\n    }\n\n    /* package */ PreviewViewResources(Parcel source) {\n        mLayoutId = source.readInt();\n        mImageViewId = source.readInt();\n    }\n\n    public static PreviewViewResources getDefault() {\n        if (sDefault == null) {\n            sDefault = new PreviewViewResources(R.layout.l_fragment_default_preview, R.id.l_default_image_zoom_view);\n        }\n        return sDefault;\n    }\n\n    @Override\n    public int describeContents() {\n        return 0;\n    }\n\n    @Override\n    public void writeToParcel(Parcel dest, int flags) {\n        dest.writeInt(mLayoutId);\n        dest.writeInt(mImageViewId);\n    }\n\n    public int getLayoutId() {\n        return mLayoutId;\n    }\n\n    public int getImageViewId() {\n        return mImageViewId;\n    }\n}\n"
  },
  {
    "path": "laevatein/src/main/java/com/laevatein/internal/entity/SelectionSpec.java",
    "content": "/*\n * Copyright (C) 2014 nohana, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an &quot;AS IS&quot; BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage com.laevatein.internal.entity;\n\nimport android.os.Parcel;\nimport android.os.Parcelable;\n\nimport com.laevatein.MimeType;\n\nimport java.util.ArrayList;\nimport java.util.EnumSet;\nimport java.util.List;\nimport java.util.Set;\n\n/**\n * @author KeithYokoma\n * @since 2014/03/20\n * @version 1.0.0\n * @hide\n */\npublic final class SelectionSpec implements Parcelable {\n    public static final Creator<SelectionSpec> CREATOR = new Creator<SelectionSpec>() {\n        @Override\n        public SelectionSpec createFromParcel(Parcel source) {\n            return new SelectionSpec(source);\n        }\n\n        @Override\n        public SelectionSpec[] newArray(int size) {\n            return new SelectionSpec[size];\n        }\n    };\n    private int mMaxSelectable;\n    private int mMinSelectable;\n    private long mMinPixels;\n    private long mMaxPixels;\n    private int mMinWidthPixels;\n    private int mMinHeightPixels;\n    private int mMaxWidthPixels;\n    private int mMaxHeightPixels;\n    private Set<MimeType> mMimeTypeSet;\n    private String mDefaultAlbumId;\n\n    public SelectionSpec() {\n        mMinSelectable = 0;\n        mMaxSelectable = 1;\n        mMinPixels = 0L;\n        mMaxPixels = Long.MAX_VALUE;\n        mMinWidthPixels = 0;\n        mMinHeightPixels = 0;\n        mMaxWidthPixels = Integer.MAX_VALUE;\n        mMaxHeightPixels = Integer.MAX_VALUE;\n        mDefaultAlbumId = Album.ALBUM_ID_ALL;\n    }\n\n    /* package */ SelectionSpec(Parcel source) {\n        mMinSelectable = source.readInt();\n        mMaxSelectable = source.readInt();\n        mMinPixels = source.readLong();\n        mMaxPixels = source.readLong();\n        mMinWidthPixels = source.readInt();\n        mMinHeightPixels = source.readInt();\n        mMaxWidthPixels = source.readInt();\n        mMaxHeightPixels = source.readInt();\n        List<MimeType> list = new ArrayList<>();\n        source.readList(list, MimeType.class.getClassLoader());\n        mMimeTypeSet = EnumSet.copyOf(list);\n        mDefaultAlbumId = source.readString();\n    }\n\n    @Override\n    public int describeContents() {\n        return 0;\n    }\n\n    @Override\n    public void writeToParcel(Parcel dest, int flags) {\n        dest.writeInt(mMinSelectable);\n        dest.writeInt(mMaxSelectable);\n        dest.writeLong(mMinPixels);\n        dest.writeLong(mMaxPixels);\n        dest.writeInt(mMinWidthPixels);\n        dest.writeInt(mMinHeightPixels);\n        dest.writeInt(mMaxWidthPixels);\n        dest.writeInt(mMaxHeightPixels);\n        dest.writeList(new ArrayList<>(mMimeTypeSet));\n        dest.writeString(mDefaultAlbumId);\n    }\n\n    public void setMaxSelectable(int maxSelectable) {\n        mMaxSelectable = maxSelectable;\n    }\n\n    public void setMinSelectable(int minSelectable) {\n        mMinSelectable = minSelectable;\n    }\n\n    public void setMinPixels(long minPixels) {\n        mMinPixels = minPixels;\n    }\n\n    public void setMaxPixels(long maxPixels) {\n        mMaxPixels = maxPixels;\n    }\n\n    public void setMinSize(int minWidthPixels, int minHeightPixels) {\n        this.mMinWidthPixels = minWidthPixels;\n        this.mMinHeightPixels = minHeightPixels;\n    }\n\n    public void setMaxSize(int maxWidthPixels, int maxHeightPixels) {\n        this.mMaxWidthPixels = maxWidthPixels;\n        this.mMaxHeightPixels = maxHeightPixels;\n    }\n\n    public void setMimeTypeSet(Set<MimeType> set) {\n        mMimeTypeSet = set;\n    }\n\n    public void setDefaultAlbumId(String albumId) {\n        mDefaultAlbumId = albumId;\n    }\n\n    public int getMinSelectable() {\n        return mMinSelectable;\n    }\n\n    public int getMaxSelectable() {\n        return mMaxSelectable;\n    }\n\n    public long getMinPixels() {\n        return mMinPixels;\n    }\n\n    public long getMaxPixels() {\n        return mMaxPixels;\n    }\n\n    public int getMinWidthPixels() {\n        return mMinWidthPixels;\n    }\n\n    public int getMinHeightPixels() {\n        return mMinHeightPixels;\n    }\n\n    public int getMaxWidthPixels() {\n        return mMaxWidthPixels;\n    }\n\n    public int getMaxHeightPixels() {\n        return mMaxHeightPixels;\n    }\n\n    public Set<MimeType> getMimeTypeSet() {\n        return mMimeTypeSet;\n    }\n\n    public String getDefaultAlbumId() {\n        return mDefaultAlbumId;\n    }\n}\n"
  },
  {
    "path": "laevatein/src/main/java/com/laevatein/internal/entity/UncapableCause.java",
    "content": "/*\n * Copyright (C) 2014 nohana, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an &quot;AS IS&quot; BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage com.laevatein.internal.entity;\n\n/**\n * @author KeithYokoma\n * @since 2014/03/25\n * @version 1.0.0\n * @hide\n */\npublic enum UncapableCause {\n    OVER_COUNT {\n        @Override\n        public ErrorViewResources getErrorResources(ErrorViewSpec spec) {\n            return spec.getCountOverErrorSpec();\n        }\n    },\n    UNDER_QUALITY {\n        @Override\n        public ErrorViewResources getErrorResources(ErrorViewSpec spec) {\n            return spec.getUnderQualitySpec();\n        }\n    },\n    OVER_QUALITY {\n        @Override\n        public ErrorViewResources getErrorResources(ErrorViewSpec spec) {\n            return spec.getOverQualitySpec();\n        }\n    },\n    UNDER_SIZE {\n        @Override\n        public ErrorViewResources getErrorResources(ErrorViewSpec spec) {\n            return spec.getUnderSizeSpec();\n        }\n    },\n    OVER_SIZE {\n        @Override\n        public ErrorViewResources getErrorResources(ErrorViewSpec spec) {\n            return spec.getOverSizeSpec();\n        }\n    },\n    FILE_TYPE {\n        @Override\n        public ErrorViewResources getErrorResources(ErrorViewSpec spec) {\n            return spec.getTypeErrorSpec();\n        }\n    };\n\n    public abstract ErrorViewResources getErrorResources(ErrorViewSpec spec);\n}\n"
  },
  {
    "path": "laevatein/src/main/java/com/laevatein/internal/entity/ViewResourceSpec.java",
    "content": "package com.laevatein.internal.entity;\n\nimport android.content.pm.ActivityInfo;\nimport android.os.Parcel;\nimport android.os.Parcelable;\nimport androidx.annotation.Nullable;\nimport androidx.annotation.StyleRes;\n\nimport com.amalgam.os.ParcelUtils;\nimport com.laevatein.ui.ImagePreviewActivity;\n\n/**\n * @author keishin.yokomaku\n * @since 2014/04/07\n */\npublic class ViewResourceSpec implements Parcelable {\n    public static final Creator<ViewResourceSpec> CREATOR = new Creator<ViewResourceSpec>() {\n        @Override\n        @Nullable\n        public ViewResourceSpec createFromParcel(Parcel source) {\n            return new ViewResourceSpec(source);\n        }\n\n        @Override\n        public ViewResourceSpec[] newArray(int size) {\n            return new ViewResourceSpec[size];\n        }\n    };\n    public static final int DEFAULT_SCREEN_ORIENTATION = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; // no restriction\n    @StyleRes\n    private int mTheme;\n    private final Class<? extends ImagePreviewActivity> mPreviewActivityClass;\n    private final ItemViewResources mItemViewResources;\n    private final CounterViewResources mCounterViewResources;\n    private final PreviewViewResources mPreviewViewResources;\n    private final boolean mOpenDrawer;\n    private final CaptureResources mCaptureResources;\n    private final boolean mEnableSelectedView;\n    private final int mActivityOrientation;\n\n    /* package */ ViewResourceSpec(Parcel source) {\n        mTheme = source.readInt();\n        mPreviewActivityClass = (Class<? extends ImagePreviewActivity>) source.readSerializable();\n        mItemViewResources = source.readParcelable(ItemViewResources.class.getClassLoader());\n        mCounterViewResources = source.readParcelable(CounterViewResources.class.getClassLoader());\n        mPreviewViewResources = source.readParcelable(PreviewViewResources.class.getClassLoader());\n        mOpenDrawer = ParcelUtils.readBoolean(source);\n        mCaptureResources = source.readParcelable(CaptureResources.class.getClassLoader());\n        mEnableSelectedView = ParcelUtils.readBoolean(source);\n        mActivityOrientation = source.readInt();\n    }\n\n    /* package */ ViewResourceSpec(\n            @StyleRes int theme,\n            Class<? extends ImagePreviewActivity> previewActivityClass,\n            ItemViewResources itemViewResources,\n            CounterViewResources counterViewResources,\n            PreviewViewResources previewViewResources,\n            boolean openDrawer,\n            CaptureResources captureResources,\n            boolean enableSelectedView,\n            int activityOrientation) {\n        mTheme = theme;\n        mPreviewActivityClass = previewActivityClass;\n        mItemViewResources = itemViewResources;\n        mCounterViewResources = counterViewResources;\n        mPreviewViewResources = previewViewResources;\n        mOpenDrawer = openDrawer;\n        mCaptureResources = captureResources;\n        mEnableSelectedView = enableSelectedView;\n        mActivityOrientation = activityOrientation;\n    }\n\n    @Override\n    public int describeContents() {\n        return 0;\n    }\n\n    @Override\n    public void writeToParcel(Parcel dest, int flags) {\n        dest.writeInt(mTheme);\n        dest.writeSerializable(mPreviewActivityClass);\n        dest.writeParcelable(mItemViewResources, flags);\n        dest.writeParcelable(mCounterViewResources, flags);\n        dest.writeParcelable(mPreviewViewResources, flags);\n        ParcelUtils.writeBoolean(dest, mOpenDrawer);\n        dest.writeParcelable(mCaptureResources, flags);\n        ParcelUtils.writeBoolean(dest, mEnableSelectedView);\n        dest.writeInt(mActivityOrientation);\n    }\n\n    public static class Builder {\n        @StyleRes\n        private int mTheme;\n        private Class<? extends ImagePreviewActivity> mPreviewActivityClass;\n        private ItemViewResources mItemViewResources;\n        private CounterViewResources mCounterViewResources;\n        private PreviewViewResources mPreviewViewResources;\n        private boolean mOpenDrawer;\n        private CaptureResources mCaptureResources;\n        private boolean mEnableSelectedView;\n        private int mActivityOrientation;\n\n        public Builder setTheme(@StyleRes int theme) {\n            mTheme = theme;\n            return this;\n        }\n\n        public Builder setPreviewClass(Class<? extends ImagePreviewActivity> previewActivityClass) {\n            mPreviewActivityClass = previewActivityClass;\n            return this;\n        }\n\n        public Builder setItemViewResources(ItemViewResources itemViewResources) {\n            mItemViewResources = itemViewResources;\n            return this;\n        }\n\n        public Builder setCounterViewResources(CounterViewResources counterViewResources) {\n            mCounterViewResources = counterViewResources;\n            return this;\n        }\n\n        public Builder setPreviewViewResources(PreviewViewResources previewViewResources) {\n            mPreviewViewResources = previewViewResources;\n            return this;\n        }\n\n        public Builder setOpenDrawer(boolean openDrawer) {\n            mOpenDrawer = openDrawer;\n            return this;\n        }\n\n        public Builder setCaptureResources(CaptureResources captureResources) {\n            mCaptureResources = captureResources;\n            return this;\n        }\n\n        public Builder setEnableSelectedView(boolean enableSelectedView) {\n            mEnableSelectedView = enableSelectedView;\n            return this;\n        }\n\n        public Builder setActivityOrientation(int activityOrientation) {\n            mActivityOrientation = activityOrientation;\n            return this;\n        }\n\n        public ViewResourceSpec create() {\n            if (mItemViewResources == null) {\n                mItemViewResources = ItemViewResources.getDefault();\n            }\n            if (mCounterViewResources == null) {\n                mCounterViewResources = CounterViewResources.getDefault();\n            }\n            if (mPreviewViewResources == null) {\n                mPreviewViewResources = PreviewViewResources.getDefault();\n            }\n            return new ViewResourceSpec(mTheme, mPreviewActivityClass,\n                    mItemViewResources, mCounterViewResources, mPreviewViewResources, mOpenDrawer,\n                    mCaptureResources, mEnableSelectedView, mActivityOrientation);\n        }\n    }\n\n    public int getTheme() {\n        return mTheme;\n    }\n\n    public Class<? extends ImagePreviewActivity> getPreviewActivityClass() {\n        return mPreviewActivityClass;\n    }\n\n    public ItemViewResources getItemViewResources() {\n        return mItemViewResources;\n    }\n\n    public CounterViewResources getCounterViewResources() {\n        return mCounterViewResources;\n    }\n\n    public PreviewViewResources getPreviewViewResources() {\n        return mPreviewViewResources;\n    }\n\n    public boolean openDrawer() {\n        return mOpenDrawer;\n    }\n\n    public CaptureResources getCaptureResource() {\n        return mCaptureResources;\n    }\n\n    public boolean isEnableSelectedView() {\n        return mEnableSelectedView;\n    }\n\n    public boolean needActivityOrientationRestriction() {\n        return mActivityOrientation != DEFAULT_SCREEN_ORIENTATION;\n    }\n\n    public int getActivityOrientation() {\n        return mActivityOrientation;\n    }\n}\n"
  },
  {
    "path": "laevatein/src/main/java/com/laevatein/internal/loader/AlbumLoader.java",
    "content": "/*\n * Copyright (C) 2014 nohana, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an &quot;AS IS&quot; BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage com.laevatein.internal.loader;\n\nimport android.content.Context;\nimport android.database.Cursor;\nimport android.database.MatrixCursor;\nimport android.provider.MediaStore;\n\nimport androidx.loader.content.CursorLoader;\n\nimport com.laevatein.internal.entity.Album;\n\nimport java.util.LinkedHashMap;\nimport java.util.Map;\n\n/**\n * Wrapper for {@link CursorLoader} to merge custom cursors.\n * @author KeithYokoma\n * @since 2014/03/26\n * @version 1.0.0\n * @hide\n */\npublic class AlbumLoader extends CursorLoader {\n    public static final String TAG = AlbumLoader.class.getSimpleName();\n    private static final String[] PROJECTION = { MediaStore.Images.Media.BUCKET_ID, MediaStore.Images.Media.BUCKET_DISPLAY_NAME, MediaStore.Images.Media._ID };\n    private static final String BUCKET_ORDER_BY = \"datetaken DESC\";\n    private static final String MEDIA_ID_DUMMY = String.valueOf(-1);\n\n    public AlbumLoader(Context context) {\n        super(context, MediaStore.Images.Media.EXTERNAL_CONTENT_URI, PROJECTION, null, null, BUCKET_ORDER_BY);\n    }\n\n    @Override\n    public Cursor loadInBackground() {\n        Cursor albums = super.loadInBackground();\n\n        Map<String, BucketEntry> buckets = new LinkedHashMap<>();\n        if (albums != null) {\n            try {\n                while (albums.moveToNext()) {\n                    String bucketId = albums.getString(albums.getColumnIndex(MediaStore.Images.Media.BUCKET_ID));\n                    if (!buckets.containsKey(bucketId)) {\n                        buckets.put(bucketId, new BucketEntry(\n                                albums.getString(albums.getColumnIndex(MediaStore.Images.Media.BUCKET_DISPLAY_NAME)),\n                                albums.getString(albums.getColumnIndex(MediaStore.Images.Media._ID))\n                        ));\n                    }\n                }\n            } finally {\n                albums.close();\n            }\n        }\n\n        MatrixCursor allAlbum = new MatrixCursor(PROJECTION);\n        allAlbum.addRow(new String[]{Album.ALBUM_ID_ALL, Album.ALBUM_NAME_ALL, MEDIA_ID_DUMMY});\n        for (Map.Entry<String, BucketEntry> entry : buckets.entrySet()) {\n            BucketEntry bucket = entry.getValue();\n            allAlbum.addRow(new String[]{entry.getKey(), bucket.displayName, bucket.mediaId});\n        }\n\n        return allAlbum;\n    }\n\n    private static class BucketEntry {\n        private final String displayName;\n        private final String mediaId;\n\n        public BucketEntry(String displayName, String mediaId) {\n            this.displayName = displayName;\n            this.mediaId = mediaId;\n        }\n    }\n}"
  },
  {
    "path": "laevatein/src/main/java/com/laevatein/internal/loader/AlbumPhotoLoader.java",
    "content": "/*\n * Copyright (C) 2014 nohana, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an &quot;AS IS&quot; BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage com.laevatein.internal.loader;\n\nimport android.content.Context;\nimport android.database.Cursor;\nimport android.database.MatrixCursor;\nimport android.database.MergeCursor;\nimport android.net.Uri;\nimport android.provider.MediaStore;\nimport androidx.loader.content.CursorLoader;\n\nimport com.laevatein.internal.entity.Album;\nimport com.laevatein.internal.entity.Item;\nimport com.laevatein.internal.utils.MediaStoreUtils;\n\n/**\n * @author KeithYokoma\n * @version 1.0.0\n * @hide\n * @since 2014/03/27\n */\npublic class AlbumPhotoLoader extends CursorLoader {\n    public static final String TAG = AlbumPhotoLoader.class.getSimpleName();\n    private static final String[] PROJECTION = {MediaStore.Images.Media._ID, MediaStore.Images.Media.DISPLAY_NAME};\n    private static final String ORDER_BY = MediaStore.Images.Media._ID + \" DESC\";\n    private final boolean mEnableCapture;\n\n    public AlbumPhotoLoader(Context context, Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder, boolean capture) {\n        super(context, uri, projection, selection, selectionArgs, sortOrder);\n        mEnableCapture = capture;\n    }\n\n    public static CursorLoader newInstance(Context context, Album album) {\n        if (album.isAll()) {\n            return new AlbumPhotoLoader(context, MediaStore.Images.Media.EXTERNAL_CONTENT_URI, PROJECTION, null, null, ORDER_BY, false);\n        }\n        return newInstance(context, album, false);\n    }\n\n    public static CursorLoader newInstance(Context context, Album album, boolean capture) {\n        return new AlbumPhotoLoader(context, MediaStore.Images.Media.EXTERNAL_CONTENT_URI, PROJECTION,\n                MediaStore.Images.Media.BUCKET_ID + \" = ?\", new String[]{album.getId()}, ORDER_BY, capture);\n    }\n\n    @Override\n    public Cursor loadInBackground() {\n        Cursor result = super.loadInBackground();\n        if (!mEnableCapture || !MediaStoreUtils.hasCameraFeature(getContext())) {\n            return result;\n        }\n        MatrixCursor dummy = new MatrixCursor(PROJECTION);\n        dummy.addRow(new Object[]{Item.ITEM_ID_CAPTURE, Item.ITEM_DISPLAY_NAME_CAPTURE});\n        return new MergeCursor(new Cursor[]{dummy, result});\n    }\n}\n"
  },
  {
    "path": "laevatein/src/main/java/com/laevatein/internal/misc/ui/ConfirmationDialogFragment.java",
    "content": "/*\n * Copyright (C) 2014 nohana, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an &quot;AS IS&quot; BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage com.laevatein.internal.misc.ui;\n\nimport android.app.Dialog;\nimport android.content.Context;\nimport android.content.DialogInterface;\nimport android.os.Bundle;\nimport androidx.annotation.NonNull;\nimport androidx.fragment.app.DialogFragment;\nimport androidx.appcompat.app.AlertDialog;\n\nimport com.amalgam.os.BundleUtils;\nimport com.laevatein.R;\n\n/**\n * @author KeithYokoma\n * @since 2014/03/25\n * @version 1.0.0\n * @hide\n */\npublic class ConfirmationDialogFragment extends DialogFragment {\n    public static final String TAG = ConfirmationDialogFragment.class.getSimpleName();\n    private static final String ARGS_TITLE = BundleUtils.buildKey(ConfirmationDialogFragment.class, \"ARGS_TITLE\");\n    private static final String ARGS_MESSAGE = BundleUtils.buildKey(ConfirmationDialogFragment.class, \"ARGS_MESSAGE\");\n    private ConfirmationSelectionListener mListener;\n\n    public ConfirmationDialogFragment() {}\n\n    public static ConfirmationDialogFragment newInstance(int message) {\n        ConfirmationDialogFragment fragment = new ConfirmationDialogFragment();\n        Bundle args = new Bundle();\n        args.putInt(ARGS_MESSAGE, message);\n        fragment.setArguments(args);\n        return fragment;\n    }\n\n    public static ConfirmationDialogFragment newInstance(int title, int message) {\n        ConfirmationDialogFragment fragment = new ConfirmationDialogFragment();\n        Bundle args = new Bundle();\n        args.putInt(ARGS_TITLE, title);\n        args.putInt(ARGS_MESSAGE, message);\n        fragment.setArguments(args);\n        return fragment;\n    }\n\n    @Override\n    public void onAttach(Context context) {\n        super.onAttach(context);\n\n        try {\n            mListener = (ConfirmationSelectionListener) context;\n        } catch (ClassCastException e) {\n            throw new IllegalArgumentException(\"the host activity should implement ConfirmationSelectionListener\");\n        }\n    }\n\n    @NonNull\n    @Override\n    public Dialog onCreateDialog(Bundle savedInstanceState) {\n        int title = getArguments().getInt(ARGS_TITLE, -1);\n        if (title == -1) {\n            title = R.string.l_confirm_dialog_title;\n        }\n        int message = getArguments().getInt(ARGS_MESSAGE);\n        AlertDialog.Builder dialog = new AlertDialog.Builder(getActivity())\n                .setTitle(title)\n                .setMessage(message)\n                .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {\n                    @Override\n                    public void onClick(DialogInterface dialog, int which) {\n                        mListener.onPositive();\n                        dialog.dismiss();\n                    }\n                })\n                .setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {\n                    @Override\n                    public void onClick(DialogInterface dialog, int which) {\n                        mListener.onNegative();\n                        dialog.dismiss();\n                    }\n                });\n        return dialog.create();\n    }\n\n    public interface ConfirmationSelectionListener {\n        void onPositive();\n        void onNegative();\n    }\n}\n"
  },
  {
    "path": "laevatein/src/main/java/com/laevatein/internal/misc/ui/FragmentUtils.java",
    "content": "/*\n * Copyright (C) 2014 nohana, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an &quot;AS IS&quot; BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage com.laevatein.internal.misc.ui;\n\nimport android.app.Activity;\nimport android.content.Intent;\nimport android.os.Parcelable;\nimport androidx.fragment.app.Fragment;\nimport android.view.View;\n\n/**\n * @author KeithYokoma\n * @since 2014/03/20\n * @version 1.0.0\n * @hide\n */\npublic final class FragmentUtils {\n    private FragmentUtils() {}\n\n    public static <T extends Parcelable> T getIntentParcelableExtra(Fragment fragment, String key) {\n        Activity activity = fragment.getActivity();\n        Intent intent = activity.getIntent();\n        return intent.getParcelableExtra(key);\n    }\n\n    public static boolean getIntentBooleanExtra(Fragment fragment, String key, boolean fallback) {\n        Activity activity = fragment.getActivity();\n        Intent intent = activity.getIntent();\n        return intent.getBooleanExtra(key, fallback);\n    }\n\n    public static View findViewById(Fragment fragment, int id) {\n        View view = fragment.getView().findViewById(id);\n        if(view == null){\n            view = fragment.getView();\n        }\n        return view;\n    }\n}\n"
  },
  {
    "path": "laevatein/src/main/java/com/laevatein/internal/misc/ui/helper/options/OptionsMenu.java",
    "content": "/*\n * Copyright (C) 2014 nohana, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an &quot;AS IS&quot; BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage com.laevatein.internal.misc.ui.helper.options;\n\nimport android.app.Activity;\n\n/**\n * @author KeithYokoma\n * @since 2014/03/20\n * @version 1.0.0\n * @hide\n */\npublic interface OptionsMenu<A extends Activity, H extends OptionsMenuHandler<A, ?>> {\n    int getMenuId();\n    H getHandler();\n}"
  },
  {
    "path": "laevatein/src/main/java/com/laevatein/internal/misc/ui/helper/options/OptionsMenuHandler.java",
    "content": "/*\n * Copyright (C) 2014 nohana, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an &quot;AS IS&quot; BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage com.laevatein.internal.misc.ui.helper.options;\n\nimport android.app.Activity;\n\n/**\n * @author KeithYokoma\n * @since 2014/03/20\n * @version 1.0.0\n * @hide\n */\npublic interface OptionsMenuHandler<A extends Activity, E> {\n    boolean handle(A activity, E extra);\n}"
  },
  {
    "path": "laevatein/src/main/java/com/laevatein/internal/misc/widget/SquareGridViewItemRelativeLayout.java",
    "content": "/*\n * Copyright (C) 2014 nohana, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an &quot;AS IS&quot; BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage com.laevatein.internal.misc.widget;\n\nimport android.content.Context;\nimport android.util.AttributeSet;\nimport android.widget.RelativeLayout;\n\n/**\n * @author KeithYokoma\n * @since 2014/03/24\n * @version 1.0.0\n * @hide\n */\npublic class SquareGridViewItemRelativeLayout extends RelativeLayout {\n    public SquareGridViewItemRelativeLayout(Context context) {\n        this(context, null);\n    }\n\n    public SquareGridViewItemRelativeLayout(Context context, AttributeSet attrs) {\n        this(context, attrs, 0);\n    }\n\n    public SquareGridViewItemRelativeLayout(Context context, AttributeSet attrs, int defStyle) {\n        super(context, attrs, defStyle);\n    }\n\n    @Override\n    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {\n        super.onMeasure(widthMeasureSpec, widthMeasureSpec);\n    }\n}\n"
  },
  {
    "path": "laevatein/src/main/java/com/laevatein/internal/model/AlbumPhotoCollection.java",
    "content": "/*\n * Copyright (C) 2014 nohana, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an &quot;AS IS&quot; BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage com.laevatein.internal.model;\n\nimport android.content.Context;\nimport android.database.Cursor;\nimport android.os.Bundle;\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.fragment.app.FragmentActivity;\nimport androidx.loader.app.LoaderManager;\nimport androidx.loader.content.Loader;\n\nimport com.amalgam.os.BundleUtils;\nimport com.laevatein.internal.entity.Album;\nimport com.laevatein.internal.loader.AlbumPhotoLoader;\n\nimport java.lang.ref.WeakReference;\n\n/**\n * @author KeithYokoma\n * @since 2014/03/24\n * @version 1.0.0\n * @hide\n */\npublic class AlbumPhotoCollection implements LoaderManager.LoaderCallbacks<Cursor> {\n    private static final int LOADER_ID = 2;\n    private static final String ARGS_ALBUM = BundleUtils.buildKey(AlbumPhotoCollection.class, \"ARGS_ALBUM\");\n    private static final String ARGS_ENABLE_CAPTURE = BundleUtils.buildKey(AlbumPhotoCollection.class, \"ARGS_ENABLE_CAPTURE\");\n    private WeakReference<Context> mContext;\n    private LoaderManager mLoaderManager;\n    private AlbumPhotoCallbacks mCallbacks;\n\n    @Override\n    public Loader<Cursor> onCreateLoader(int id, Bundle args) {\n        Context context = mContext.get();\n        if (context == null) {\n            return null;\n        }\n\n        Album album = args.getParcelable(ARGS_ALBUM);\n        if (album == null) {\n            return null;\n        }\n\n        if (album.isCamera()) {\n            boolean capture = args.getBoolean(ARGS_ENABLE_CAPTURE, false);\n            return AlbumPhotoLoader.newInstance(context, album, capture);\n        }\n        return AlbumPhotoLoader.newInstance(context, album);\n    }\n\n    @Override\n    public void onLoadFinished(Loader<Cursor> loader, Cursor data) {\n        Context context = mContext.get();\n        if (context == null) {\n            return;\n        }\n\n        mCallbacks.onLoad(data);\n    }\n\n    @Override\n    public void onLoaderReset(Loader<Cursor> loader) {\n        Context context = mContext.get();\n        if (context == null) {\n            return;\n        }\n\n        mCallbacks.onReset();\n    }\n\n    public void onCreate(@NonNull FragmentActivity context, @NonNull AlbumPhotoCallbacks callbacks) {\n        mContext = new WeakReference<Context>(context);\n        mLoaderManager = context.getSupportLoaderManager();\n        mCallbacks = callbacks;\n    }\n\n    public void onDestroy() {\n        mLoaderManager.destroyLoader(LOADER_ID);\n        mCallbacks = null;\n    }\n\n    public void load(@Nullable Album target) {\n        load(target, false);\n    }\n\n    public void load(@Nullable Album target, boolean enableCapture) {\n        Bundle args = new Bundle();\n        args.putParcelable(ARGS_ALBUM, target);\n        args.putBoolean(ARGS_ENABLE_CAPTURE, enableCapture);\n        mLoaderManager.initLoader(LOADER_ID, args, this);\n    }\n\n    public interface AlbumPhotoCallbacks {\n        void onLoad(Cursor cursor);\n        void onReset();\n    }\n}\n"
  },
  {
    "path": "laevatein/src/main/java/com/laevatein/internal/model/DevicePhotoAlbumCollection.java",
    "content": "/*\n * Copyright (C) 2014 nohana, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an &quot;AS IS&quot; BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage com.laevatein.internal.model;\n\nimport com.amalgam.os.BundleUtils;\nimport com.laevatein.internal.loader.AlbumLoader;\n\nimport android.content.Context;\nimport android.database.Cursor;\nimport android.os.Bundle;\nimport androidx.fragment.app.FragmentActivity;\nimport androidx.loader.app.LoaderManager;\nimport androidx.loader.content.Loader;\n\nimport java.lang.ref.WeakReference;\n\n/**\n * @author KeithYokoma\n * @since 2014/03/24\n * @version 1.0.0\n * @hide\n */\npublic class DevicePhotoAlbumCollection implements LoaderManager.LoaderCallbacks<Cursor> {\n    private static final int LOADER_ID = 1;\n    private static final String STATE_CURRENT_SELECTION = BundleUtils.buildKey(DevicePhotoAlbumCollection.class, \"STATE_CURRENT_SELECTION\");\n    private WeakReference<Context> mContext;\n    private LoaderManager mLoaderManager;\n    private DevicePhotoAlbumCallbacks mCallbacks;\n    private int mCurrentSelection;\n\n    @Override\n    public Loader<Cursor> onCreateLoader(int id, Bundle args) {\n        Context context = mContext.get();\n        if (context == null) {\n            return null;\n        }\n        return new AlbumLoader(context);\n    }\n\n    @Override\n    public void onLoadFinished(Loader<Cursor> loader, Cursor data) {\n        Context context = mContext.get();\n        if (context == null) {\n            return;\n        }\n\n        mCallbacks.onLoad(data);\n    }\n\n    @Override\n    public void onLoaderReset(Loader<Cursor> loader) {\n        Context context = mContext.get();\n        if (context == null) {\n            return;\n        }\n\n        mCallbacks.onReset();\n    }\n\n    public void onCreate(FragmentActivity activity, DevicePhotoAlbumCallbacks callbacks) {\n        mContext = new WeakReference<Context>(activity);\n        mLoaderManager = activity.getSupportLoaderManager();\n        mCallbacks = callbacks;\n    }\n\n    public void onRestoreInstanceState(Bundle savedInstanceState) {\n        if (savedInstanceState == null) {\n            return;\n        }\n\n        mCurrentSelection = savedInstanceState.getInt(STATE_CURRENT_SELECTION);\n    }\n\n    public void onSaveInstanceState(Bundle outState) {\n        outState.putInt(STATE_CURRENT_SELECTION, mCurrentSelection);\n    }\n\n    public void onDestroy() {\n        mLoaderManager.destroyLoader(LOADER_ID);\n        mCallbacks = null;\n    }\n\n    public void loadAlbums() {\n        mLoaderManager.initLoader(LOADER_ID, null, this);\n    }\n\n    public int getCurrentSelection() {\n        return mCurrentSelection;\n    }\n\n    public void setStateCurrentSelection(int currentSelection) {\n        mCurrentSelection = currentSelection;\n    }\n\n    public interface DevicePhotoAlbumCallbacks {\n        void onLoad(Cursor cursor);\n        void onReset();\n    }\n}\n"
  },
  {
    "path": "laevatein/src/main/java/com/laevatein/internal/model/PreviewStateHolder.java",
    "content": "package com.laevatein.internal.model;\n\nimport android.app.Activity;\nimport android.net.Uri;\nimport android.os.Bundle;\n\nimport com.amalgam.os.BundleUtils;\nimport com.laevatein.ui.ImagePreviewActivity;\n\nimport java.lang.ref.WeakReference;\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * @author keishin.yokomaku\n * @since 2014/04/03\n */\npublic class PreviewStateHolder {\n    private static final String STATE_CHECKED = BundleUtils.buildKey(PreviewStateHolder.class, \"STATE_CHECKED\");\n    private ArrayList<Uri> mChecked;\n    private WeakReference<Activity> mContext;\n\n    public PreviewStateHolder(Activity activity) {\n        mContext = new WeakReference<>(activity);\n    }\n\n    public void onCreate() {\n        Activity activity = mContext.get();\n        if (activity == null) {\n            return;\n        }\n        mChecked = activity.getIntent().getParcelableArrayListExtra(ImagePreviewActivity.EXTRA_DEFAULT_CHECKED);\n    }\n\n    public void onRestoreInstanceState(Bundle savedInstanceState) {\n        if (savedInstanceState == null) {\n            return;\n        }\n        mChecked = savedInstanceState.getParcelableArrayList(STATE_CHECKED);\n    }\n\n    public void onSaveInstanceState(Bundle outState) {\n        outState.putParcelableArrayList(STATE_CHECKED, mChecked);\n    }\n\n    public boolean isChecked(Uri uri) {\n        return mChecked.contains(uri);\n    }\n\n    public void setChecked(Uri uri, boolean checked) {\n        if (checked && !mChecked.contains(uri)) {\n            mChecked.add(uri);\n        } else if (!checked) {\n            mChecked.remove(uri);\n        }\n    }\n\n    public int getCheckedCount() {\n        return mChecked.size();\n    }\n\n    public List<Uri> getAllChecked() {\n        return new ArrayList<>(mChecked);\n    }\n\n}\n"
  },
  {
    "path": "laevatein/src/main/java/com/laevatein/internal/model/SelectedUriCollection.java",
    "content": "/*\n * Copyright (C) 2014 nohana, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an &quot;AS IS&quot; BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage com.laevatein.internal.model;\n\nimport android.content.Context;\nimport android.net.Uri;\nimport android.os.Bundle;\n\nimport com.amalgam.os.BundleUtils;\nimport com.laevatein.internal.entity.SelectionSpec;\nimport com.laevatein.internal.entity.UncapableCause;\nimport com.laevatein.internal.utils.PhotoMetadataUtils;\n\nimport java.lang.ref.WeakReference;\nimport java.util.ArrayList;\nimport java.util.LinkedHashSet;\nimport java.util.List;\nimport java.util.Set;\n\n/**\n * @author KeithYokoma\n * @version 1.0.0\n * @hide\n * @since 2014/03/20\n */\npublic class SelectedUriCollection {\n    private static final String STATE_SELECTION = BundleUtils.buildKey(SelectedUriCollection.class, \"STATE_SELECTION\");\n    private final WeakReference<Context> mContext;\n    private Set<Uri> mUris;\n    private SelectionSpec mSpec;\n\n    public SelectedUriCollection(Context context) {\n        mContext = new WeakReference<>(context);\n    }\n\n    public void onCreate(Bundle savedInstanceState) {\n        if (savedInstanceState == null) {\n            mUris = new LinkedHashSet<>();\n        } else {\n            List<Uri> saved = savedInstanceState.getParcelableArrayList(STATE_SELECTION);\n            mUris = new LinkedHashSet<>(saved);\n        }\n    }\n\n    public void prepareSelectionSpec(SelectionSpec spec) {\n        mSpec = spec;\n    }\n\n    public void setDefaultSelection(List<Uri> uris) {\n        mUris.addAll(uris);\n    }\n\n    public void onSaveInstanceState(Bundle outState) {\n        outState.putParcelableArrayList(STATE_SELECTION, new ArrayList<>(mUris));\n    }\n\n    public boolean add(Uri uri) {\n        return mUris.add(uri);\n    }\n\n    public boolean remove(Uri uri) {\n        return mUris.remove(uri);\n    }\n\n    public void overwrite(ArrayList<Uri> uriLists) {\n        mUris.clear();\n        mUris.addAll(uriLists);\n    }\n\n    public List<Uri> asList() {\n        return new ArrayList<>(mUris);\n    }\n\n    public boolean isEmpty() {\n        return mUris == null || mUris.isEmpty();\n    }\n\n    public boolean isSelected(Uri uri) {\n        return mUris.contains(uri);\n    }\n\n    public UncapableCause isAcceptable(Uri uri) {\n        return PhotoMetadataUtils.isAcceptable(mContext.get(), mSpec, uri);\n    }\n\n    public boolean isCountInRange() {\n        return mSpec.getMinSelectable() <= mUris.size() && !isCountOver();\n    }\n\n    public boolean isCountOver() {\n        return mUris.size() > mSpec.getMaxSelectable();\n    }\n\n    public int count() {\n        return mUris.size();\n    }\n\n    public int maxCount() {\n        return mSpec.getMaxSelectable();\n    }\n}\n"
  },
  {
    "path": "laevatein/src/main/java/com/laevatein/internal/package-info.java",
    "content": "/**\n * This package contains various internal-use classes.\n * @author KeithYokoma\n * @since 2014/03/20\n * @version 1.0.0\n * @hide\n */\npackage com.laevatein.internal;"
  },
  {
    "path": "laevatein/src/main/java/com/laevatein/internal/ui/AlbumListFragment.java",
    "content": "/*\n * Copyright (C) 2014 nohana, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an &quot;AS IS&quot; BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage com.laevatein.internal.ui;\n\nimport android.content.Context;\nimport android.database.Cursor;\nimport android.os.Bundle;\nimport androidx.fragment.app.Fragment;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.AdapterView;\nimport android.widget.ListView;\n\nimport com.amalgam.os.BundleUtils;\nimport com.laevatein.R;\nimport com.laevatein.internal.entity.Album;\nimport com.laevatein.internal.misc.ui.FragmentUtils;\nimport com.laevatein.internal.model.DevicePhotoAlbumCollection;\nimport com.laevatein.internal.ui.helper.AlbumListViewHelper;\n\n/**\n * @author KeithYokoma\n * @version 1.0.0\n * @hide\n * @since 2014/03/20\n */\npublic class AlbumListFragment extends Fragment implements\n        AdapterView.OnItemClickListener,\n        DevicePhotoAlbumCollection.DevicePhotoAlbumCallbacks {\n    private static final String ARGS_ALBUM_ID = BundleUtils.buildKey(AlbumListFragment.class, \"ARGS_ALBUM_ID\");\n\n    private final DevicePhotoAlbumCollection mCollection = new DevicePhotoAlbumCollection();\n    private OnDirectorySelectListener mListener;\n    private String defaultAlbum;\n\n    public static AlbumListFragment newInstance(String defaultAlbumId) {\n        AlbumListFragment fragment = new AlbumListFragment();\n        Bundle args = new Bundle();\n        args.putString(ARGS_ALBUM_ID, defaultAlbumId);\n        fragment.setArguments(args);\n        return fragment;\n    }\n\n\n    @Override\n    public void onAttach(Context context) {\n        super.onAttach(context);\n        try {\n            mListener = (OnDirectorySelectListener) context;\n        } catch (ClassCastException e) {\n            throw new IllegalStateException(\"the host activity should implement OnDirectorySelectListener.\", e);\n        }\n    }\n\n    @Override\n    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {\n        return inflater.inflate(R.layout.l_fragment_list_album, container, false);\n    }\n\n    @Override\n    public void onActivityCreated(Bundle savedInstanceState) {\n        super.onActivityCreated(savedInstanceState);\n        AlbumListViewHelper.setUpHeader(this);\n        AlbumListViewHelper.setUpListView(this, this);\n        defaultAlbum = getArguments().getString(ARGS_ALBUM_ID);\n        mCollection.onCreate(getActivity(), this);\n        mCollection.onRestoreInstanceState(savedInstanceState);\n        ListView list = (ListView) FragmentUtils.findViewById(this, R.id.l_list_album);\n        if (list.getHeaderViewsCount() > 0 && mCollection.getCurrentSelection() == 0) {\n            mCollection.setStateCurrentSelection(1);\n        }\n        AlbumListViewHelper.setCheckedState(this, mCollection.getCurrentSelection());\n        mCollection.loadAlbums();\n    }\n\n    @Override\n    public void onSaveInstanceState(Bundle outState) {\n        mCollection.onSaveInstanceState(outState);\n        super.onSaveInstanceState(outState);\n    }\n\n    @Override\n    public void onDestroyView() {\n        mCollection.onDestroy();\n        super.onDestroyView();\n    }\n\n    @Override\n    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {\n        Cursor cursor = (Cursor) parent.getItemAtPosition(position);\n        if (cursor == null) {\n            //avoid moving selection to header\n            AlbumListViewHelper.setCheckedState(this, mCollection.getCurrentSelection());\n            return;\n        }\n        AlbumListViewHelper.callOnSelect(mListener, cursor);\n        AlbumListViewHelper.setCheckedState(this, position);\n        mCollection.setStateCurrentSelection(position);\n    }\n\n    @Override\n    public void onLoad(final Cursor cursor) {\n        AlbumListViewHelper.setCursor(this, cursor);\n        AlbumListViewHelper.callOnDefaultSelect(this, mListener, cursor, defaultAlbum, mCollection);\n    }\n\n    @Override\n    public void onReset() {\n        AlbumListViewHelper.setCursor(this, null);\n    }\n\n    public interface OnDirectorySelectListener {\n        void onSelect(Album album);\n    }\n}"
  },
  {
    "path": "laevatein/src/main/java/com/laevatein/internal/ui/PhotoGridFragment.java",
    "content": "/*\n * Copyright (C) 2014 nohana, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an &quot;AS IS&quot; BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage com.laevatein.internal.ui;\n\nimport android.database.Cursor;\nimport android.os.Bundle;\nimport androidx.fragment.app.Fragment;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport com.amalgam.os.BundleUtils;\nimport com.laevatein.R;\nimport com.laevatein.internal.entity.Album;\nimport com.laevatein.internal.entity.ViewResourceSpec;\nimport com.laevatein.internal.misc.ui.FragmentUtils;\nimport com.laevatein.internal.model.AlbumPhotoCollection;\nimport com.laevatein.internal.ui.adapter.AlbumPhotoAdapter;\nimport com.laevatein.internal.ui.helper.PhotoGridViewHelper;\nimport com.laevatein.ui.PhotoSelectionActivity;\n\n/**\n * @author KeithYokoma\n * @version 1.0.0\n * @hide\n * @since 2014/03/20\n */\npublic class PhotoGridFragment extends Fragment implements\n        AlbumPhotoCollection.AlbumPhotoCallbacks, AlbumPhotoAdapter.CheckStateListener {\n    public static final String TAG = PhotoGridFragment.class.getSimpleName();\n    public static final String ARGS_ALBUM = BundleUtils.buildKey(PhotoGridFragment.class, \"ARGS_ALBUM\");\n    private final AlbumPhotoCollection mPhotoCollection = new AlbumPhotoCollection();\n\n    public static PhotoGridFragment newInstance(Album album) {\n        PhotoGridFragment fragment = new PhotoGridFragment();\n        Bundle args = new Bundle();\n        args.putParcelable(ARGS_ALBUM, album);\n        fragment.setArguments(args);\n        return fragment;\n    }\n\n    @Override\n    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {\n        return inflater.inflate(R.layout.l_fragment_grid_photo, container, false);\n    }\n\n    @Override\n    public void onActivityCreated(Bundle savedInstanceState) {\n        super.onActivityCreated(savedInstanceState);\n        ViewResourceSpec resources = FragmentUtils.getIntentParcelableExtra(this, PhotoSelectionActivity.EXTRA_VIEW_SPEC);\n        Album album = getArguments().getParcelable(ARGS_ALBUM);\n        AlbumPhotoAdapter.BindViewListener listener;\n        try {\n            listener = (AlbumPhotoAdapter.BindViewListener) getActivity();\n        } catch (ClassCastException e) {\n            throw new IllegalStateException(\"the host activity should implement BindViewListener.\");\n        }\n        PhotoGridViewHelper.setUpGridView(this, resources, PhotoGridViewHelper.getSelectedPhotoSet(this), listener);\n        mPhotoCollection.onCreate(getActivity(), this);\n        mPhotoCollection.load(album, resources.getCaptureResource().enabled());\n        getActivity().setTitle(album.getDisplayName(getActivity()));\n    }\n\n    @Override\n    public void onDestroyView() {\n        PhotoGridViewHelper.tearDownGridView(this);\n        mPhotoCollection.onDestroy();\n        super.onDestroyView();\n    }\n\n    @Override\n    public void onLoad(Cursor cursor) {\n        PhotoGridViewHelper.setCursor(this, cursor);\n    }\n\n    @Override\n    public void onReset() {\n        PhotoGridViewHelper.setCursor(this, null);\n    }\n\n    @Override\n    public void onUpdate() {\n        getActivity().invalidateOptionsMenu();\n    }\n\n    public void refreshGrid() {\n        PhotoGridViewHelper.refreshView(this);\n    }\n}"
  },
  {
    "path": "laevatein/src/main/java/com/laevatein/internal/ui/PreviewFragment.java",
    "content": "package com.laevatein.internal.ui;\n\nimport android.net.Uri;\nimport android.os.Bundle;\nimport androidx.fragment.app.Fragment;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport com.amalgam.os.BundleUtils;\nimport com.bumptech.glide.Glide;\nimport com.bumptech.glide.Priority;\nimport com.bumptech.glide.request.RequestOptions;\nimport com.laevatein.internal.entity.PreviewViewResources;\n\nimport it.sephiroth.android.library.imagezoom.ImageViewTouch;\nimport it.sephiroth.android.library.imagezoom.ImageViewTouchBase;\n\n/**\n * Created by hiroyuki.seto on 15/06/16.\n *\n * @hide\n */\npublic class PreviewFragment extends Fragment {\n    private static final String ARGS_URI = BundleUtils.buildKey(PhotoGridFragment.class, \"ARGS_URI\");\n    private static final String ARGS_RESOURCES = BundleUtils.buildKey(PhotoGridFragment.class, \"ARGS_RESOURCES\");\n\n    private PreviewViewResources mViewResources;\n\n    public static PreviewFragment newInstance(Uri uri, PreviewViewResources resources) {\n        PreviewFragment fragment = new PreviewFragment();\n        Bundle bundle = new Bundle();\n        bundle.putParcelable(ARGS_URI, uri);\n        bundle.putParcelable(ARGS_RESOURCES, resources);\n        fragment.setArguments(bundle);\n        return fragment;\n    }\n\n    @Override\n    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {\n        mViewResources = getArguments().getParcelable(ARGS_RESOURCES);\n        return inflater.inflate(mViewResources.getLayoutId(), container, false);\n    }\n\n    @Override\n    public void onActivityCreated(Bundle savedInstanceState) {\n        super.onActivityCreated(savedInstanceState);\n\n        ImageViewTouch image = getView().findViewById(mViewResources.getImageViewId());\n        image.setDisplayType(ImageViewTouchBase.DisplayType.FIT_TO_SCREEN);\n        Uri uri = getArguments().getParcelable(ARGS_URI);\n        Glide.with(getActivity()).load(uri)\n                .apply(new RequestOptions().priority(Priority.HIGH).fitCenter().centerInside())\n                .into(image);\n    }\n\n    public void resetView() {\n        ((ImageViewTouch) getView()).resetMatrix();\n    }\n}\n"
  },
  {
    "path": "laevatein/src/main/java/com/laevatein/internal/ui/SelectedCountFragment.java",
    "content": "package com.laevatein.internal.ui;\n\nimport com.laevatein.R;\nimport com.laevatein.internal.ui.helper.SelectedCountViewHelper;\nimport com.laevatein.ui.PhotoSelectionActivity;\n\nimport android.content.Context;\nimport android.os.Bundle;\nimport androidx.fragment.app.Fragment;\nimport android.view.LayoutInflater;\nimport android.view.Menu;\nimport android.view.View;\nimport android.view.ViewGroup;\n\n/**\n * @author KeithYokoma\n * @since 2014/04/03\n * @version 1.0.0\n * @hide\n */\npublic class SelectedCountFragment extends Fragment {\n    private OnShowSelectedClickListener mListener;\n\n    @Override\n    public void onAttach(Context context) {\n        super.onAttach(context);\n\n        try {\n            mListener = (OnShowSelectedClickListener) context;\n        } catch (ClassCastException e) {\n            throw new IllegalStateException(\"the host activity should implement OnShowSelectedClickListener.\");\n        }\n\n    }\n\n    @Override\n    public void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setHasOptionsMenu(true);\n    }\n\n    @Override\n    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {\n        return inflater.inflate(R.layout.l_fragment_selected_count, container, false);\n    }\n\n    @Override\n    public void onActivityCreated(Bundle savedInstanceState) {\n        super.onActivityCreated(savedInstanceState);\n        SelectedCountViewHelper.setUpCountView(this);\n        SelectedCountViewHelper.updateCountView((PhotoSelectionActivity) getActivity(), this);\n    }\n\n    @Override\n    public void onPrepareOptionsMenu(Menu menu) {\n        super.onPrepareOptionsMenu(menu);\n        SelectedCountViewHelper.updateCountView((PhotoSelectionActivity) getActivity(), this); // bit hacky\n    }\n\n    public OnShowSelectedClickListener getListener() {\n        return mListener;\n    }\n\n    public interface OnShowSelectedClickListener {\n        void onClickSelectedView();\n    }\n}\n"
  },
  {
    "path": "laevatein/src/main/java/com/laevatein/internal/ui/SelectedPhotoGridFragment.java",
    "content": "/*\n * Copyright (C) 2014 nohana, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an &quot;AS IS&quot; BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage com.laevatein.internal.ui;\n\nimport android.os.Bundle;\nimport androidx.fragment.app.Fragment;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport com.laevatein.R;\nimport com.laevatein.internal.entity.ViewResourceSpec;\nimport com.laevatein.internal.misc.ui.FragmentUtils;\nimport com.laevatein.internal.ui.adapter.SelectedPhotoAdapter;\nimport com.laevatein.internal.ui.helper.SelectedGridViewHelper;\nimport com.laevatein.ui.PhotoSelectionActivity;\n\n/**\n * @author KeithYokoma\n * @since 2014/03/27\n * @version 1.0.0\n * @hide\n */\npublic class SelectedPhotoGridFragment extends Fragment implements SelectedPhotoAdapter.CheckStateListener {\n    public static final String TAG = SelectedPhotoGridFragment.class.getSimpleName();\n\n    public SelectedPhotoGridFragment() {\n    }\n\n    public static SelectedPhotoGridFragment newInstance() {\n        return new SelectedPhotoGridFragment();\n    }\n\n    @Override\n    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {\n        return inflater.inflate(R.layout.l_fragment_grid_photo, container, false);\n    }\n\n    @Override\n    public void onActivityCreated(Bundle savedInstanceState) {\n        super.onActivityCreated(savedInstanceState);\n        ViewResourceSpec resources = FragmentUtils.getIntentParcelableExtra(this, PhotoSelectionActivity.EXTRA_VIEW_SPEC);\n        getActivity().setTitle(R.string.l_album_name_selected);\n        SelectedGridViewHelper.setUpGridView(this, resources.getItemViewResources(), SelectedGridViewHelper.getSelectedPhotoSet(this));\n    }\n\n    @Override\n    public void onDestroyView() {\n\n        super.onDestroyView();\n    }\n\n    @Override\n    public void onUpdate() {\n        getActivity().invalidateOptionsMenu();\n    }\n}"
  },
  {
    "path": "laevatein/src/main/java/com/laevatein/internal/ui/adapter/AlbumPhotoAdapter.java",
    "content": "/*\n * Copyright (C) 2014 nohana, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an &quot;AS IS&quot; BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage com.laevatein.internal.ui.adapter;\n\nimport android.content.Context;\nimport android.database.Cursor;\nimport android.net.Uri;\nimport androidx.recyclerview.widget.RecyclerView;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.CheckBox;\nimport android.widget.ImageView;\n\nimport com.bumptech.glide.Glide;\nimport com.bumptech.glide.request.RequestOptions;\nimport com.laevatein.R;\nimport com.laevatein.internal.entity.CaptureResources;\nimport com.laevatein.internal.entity.Item;\nimport com.laevatein.internal.entity.ItemViewResources;\nimport com.laevatein.internal.entity.ViewResourceSpec;\nimport com.laevatein.internal.model.SelectedUriCollection;\nimport com.laevatein.internal.ui.helper.PhotoGridViewHelper;\n\n/**\n * @author KeithYokoma\n * @version 1.0.0\n * @hide\n * @since 2014/03/24\n */\npublic class AlbumPhotoAdapter extends RecyclerViewCursorAdapter<AlbumPhotoAdapter.ViewHolder> {\n    private final Context mContext;\n    private final ItemViewResources mResources;\n    private final CaptureResources mCaptureResources;\n    private final SelectedUriCollection mCollection;\n    private CheckStateListener mListener;\n    private BindViewListener mBindViewListener;\n\n    public AlbumPhotoAdapter(Context context, ViewResourceSpec resources, SelectedUriCollection collection, BindViewListener bindViewListener) {\n        super(null);\n        mContext = context;\n        mResources = resources.getItemViewResources();\n        mCaptureResources = resources.getCaptureResource();\n        mCollection = collection;\n        mBindViewListener = bindViewListener;\n    }\n\n    @Override\n    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {\n        View v = LayoutInflater.from(viewGroup.getContext()).inflate(mResources.getLayoutId(), viewGroup, false);\n        return new ViewHolder(v, mResources);\n    }\n\n    @Override\n    protected void onBindViewHolder(ViewHolder holder, Cursor cursor) {\n        final Item item = Item.valueOf(cursor);\n        holder.thumbnail.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                if (item.isCapture()) {\n                    if (mCaptureResources.getFileProviderAuthorities() == null) {\n                        throw new IllegalStateException();\n                    }\n                    PhotoGridViewHelper.callCamera(mContext, mCaptureResources.getFileProviderAuthorities());\n                } else {\n                    PhotoGridViewHelper.callPreview(mContext, item, mCollection.asList());\n                }\n            }\n        });\n        holder.checkBox.setVisibility(item.isCapture() ? View.GONE : View.VISIBLE);\n        holder.checkBox.setChecked(mCollection.isSelected(item.buildContentUri()));\n        holder.checkBox.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                PhotoGridViewHelper.syncCheckState(mContext, mCollection, item, (CheckBox) v);\n                PhotoGridViewHelper.callCheckStateListener(mListener);\n            }\n        });\n        if (item.isCapture()) {\n            holder.thumbnail.setImageResource(R.drawable.l_ic_capture);\n        } else {\n            Glide.with(mContext).load(item.buildContentUri())\n                    .apply(new RequestOptions().fitCenter().centerCrop())\n                    .into(holder.thumbnail);\n        }\n        mBindViewListener.onBindView(mContext, holder.itemView, item.buildContentUri());\n    }\n\n    public void registerCheckStateListener(CheckStateListener listener) {\n        mListener = listener;\n    }\n\n    public void unregisterCheckStateListener() {\n        mListener = null;\n    }\n\n    public interface CheckStateListener {\n        void onUpdate();\n    }\n\n    public interface BindViewListener {\n        /**\n         * Called when view is bound to data.\n         *\n         * @param context context of photo selection activity\n         * @param view    view of grid\n         * @param uri     uri of image in grid\n         */\n        void onBindView(Context context, View view, Uri uri);\n    }\n\n    static class ViewHolder extends RecyclerView.ViewHolder {\n        private final ImageView thumbnail;\n        private final CheckBox checkBox;\n\n        ViewHolder(View v, ItemViewResources resources) {\n            super(v);\n            thumbnail = v.findViewById(resources.getImageViewId());\n            checkBox = v.findViewById(resources.getCheckBoxId());\n        }\n    }\n}"
  },
  {
    "path": "laevatein/src/main/java/com/laevatein/internal/ui/adapter/DevicePhotoAlbumAdapter.java",
    "content": "/*\n * Copyright (C) 2014 nohana, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an &quot;AS IS&quot; BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage com.laevatein.internal.ui.adapter;\n\nimport android.content.Context;\nimport android.database.Cursor;\nimport androidx.cursoradapter.widget.CursorAdapter;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.TextView;\n\nimport com.amalgam.content.ContextUtils;\nimport com.laevatein.R;\nimport com.laevatein.internal.entity.Album;\n\n/**\n * @author KeithYokoma\n * @version 1.0.0\n * @hide\n * @since 2014/03/24\n */\npublic class DevicePhotoAlbumAdapter extends CursorAdapter {\n\n    public DevicePhotoAlbumAdapter(Context context, Cursor c) {\n        super(context, c, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);\n    }\n\n    @Override\n    public View newView(Context context, Cursor cursor, ViewGroup parent) {\n        LayoutInflater inflater = ContextUtils.getLayoutInflater(context);\n        return inflater.inflate(R.layout.l_list_item_default_album, parent, false);\n    }\n\n    @Override\n    public void bindView(View view, Context context, Cursor cursor) {\n        Album album = Album.valueOf(cursor);\n        TextView textView = view.findViewById(R.id.l_default_directory_label);\n        textView.setText(album.getDisplayName(context));\n    }\n}"
  },
  {
    "path": "laevatein/src/main/java/com/laevatein/internal/ui/adapter/PreviewPagerAdapter.java",
    "content": "package com.laevatein.internal.ui.adapter;\n\nimport android.net.Uri;\nimport androidx.fragment.app.Fragment;\nimport androidx.fragment.app.FragmentManager;\nimport androidx.fragment.app.FragmentPagerAdapter;\nimport android.view.ViewGroup;\n\nimport com.laevatein.internal.entity.PreviewViewResources;\nimport com.laevatein.internal.ui.PreviewFragment;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * Created by hiroyuki.seto on 15/06/16.\n *\n * @hide\n */\npublic class PreviewPagerAdapter extends FragmentPagerAdapter {\n\n    private ArrayList<Uri> mUris = new ArrayList<>();\n\n    private PreviewViewResources mPreviewViewResources;\n    private OnPrimaryItemSetListener mListener;\n\n    public PreviewPagerAdapter(FragmentManager manager, PreviewViewResources previewViewResources,\n                               OnPrimaryItemSetListener listener) {\n        super(manager);\n        mPreviewViewResources = previewViewResources;\n        mListener = listener;\n    }\n\n    @Override\n    public Fragment getItem(int position) {\n        return PreviewFragment.newInstance(mUris.get(position), mPreviewViewResources);\n    }\n\n    @Override\n    public int getCount() {\n        return mUris.size();\n    }\n\n    @Override\n    public void setPrimaryItem(ViewGroup container, int position, Object object) {\n        super.setPrimaryItem(container, position, object);\n        mListener.onPrimaryItemSet(position);\n    }\n\n    public Uri getUri(int position) {\n        return mUris.get(position);\n    }\n\n    public void addAll(List<Uri> uris) {\n        mUris.addAll(uris);\n    }\n\n    public interface OnPrimaryItemSetListener {\n        void onPrimaryItemSet(int position);\n    }\n\n}\n"
  },
  {
    "path": "laevatein/src/main/java/com/laevatein/internal/ui/adapter/RecyclerViewCursorAdapter.java",
    "content": "/*\n * This file is based on the code of `RecyclerViewCursorAdapter.java` in `Matisse`.\n *\n * https://github.com/zhihu/Matisse/blob/master/matisse/src/main/java/com/zhihu/matisse/internal/ui/adapter/RecyclerViewCursorAdapter.java\n */\npackage com.laevatein.internal.ui.adapter;\n\nimport android.database.Cursor;\nimport android.provider.MediaStore;\nimport androidx.recyclerview.widget.RecyclerView;\n\npublic abstract class RecyclerViewCursorAdapter<VH extends RecyclerView.ViewHolder> extends RecyclerView.Adapter<VH> {\n    private Cursor mCursor;\n    private int mRowIDColumn;\n\n    protected abstract void onBindViewHolder(VH holder, Cursor cursor);\n\n    RecyclerViewCursorAdapter(Cursor c) {\n        setHasStableIds(true);\n        swapCursor(c);\n    }\n\n    @Override\n    public void onBindViewHolder(VH holder, int position) {\n        if (!isDataValid(mCursor)) {\n            throw new IllegalStateException(\"Cannot bind view holder when cursor is in invalid state.\");\n        }\n        if (!mCursor.moveToPosition(position)) {\n            throw new IllegalStateException(\"Could not move cursor to position \" + position\n                    + \" when trying to bind view holder\");\n        }\n\n        onBindViewHolder(holder, mCursor);\n    }\n\n    @Override\n    public int getItemCount() {\n        if (isDataValid(mCursor)) {\n            return mCursor.getCount();\n        } else {\n            return 0;\n        }\n    }\n\n    @Override\n    public long getItemId(int position) {\n        if (!isDataValid(mCursor)) {\n            throw new IllegalStateException(\"Cannot lookup item id when cursor is in invalid state.\");\n        }\n        if (!mCursor.moveToPosition(position)) {\n            throw new IllegalStateException(\"Could not move cursor to position \" + position\n                    + \" when trying to get an item id\");\n        }\n\n        return mCursor.getLong(mRowIDColumn);\n    }\n\n    public void swapCursor(Cursor newCursor) {\n        if (newCursor == mCursor) {\n            return;\n        }\n\n        if (newCursor != null) {\n            mCursor = newCursor;\n            mRowIDColumn = mCursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns._ID);\n            notifyDataSetChanged();\n        } else {\n            notifyItemRangeRemoved(0, getItemCount());\n            mCursor = null;\n            mRowIDColumn = -1;\n        }\n    }\n\n    public Cursor getCursor() {\n        return mCursor;\n    }\n\n    private boolean isDataValid(Cursor cursor) {\n        return cursor != null && !cursor.isClosed();\n    }\n}\n"
  },
  {
    "path": "laevatein/src/main/java/com/laevatein/internal/ui/adapter/SelectedPhotoAdapter.java",
    "content": "/*\n * Copyright (C) 2014 nohana, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an &quot;AS IS&quot; BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage com.laevatein.internal.ui.adapter;\n\nimport android.content.Context;\nimport android.net.Uri;\nimport androidx.recyclerview.widget.RecyclerView;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.CheckBox;\nimport android.widget.CompoundButton;\nimport android.widget.ImageView;\n\nimport com.bumptech.glide.Glide;\nimport com.bumptech.glide.request.RequestOptions;\nimport com.laevatein.internal.entity.ItemViewResources;\nimport com.laevatein.internal.model.SelectedUriCollection;\nimport com.laevatein.internal.ui.helper.SelectedGridViewHelper;\n\nimport java.util.List;\n\n/**\n * @author KeithYokoma\n * @version 1.0.0\n * @hide\n * @since 2014/03/27\n */\npublic class SelectedPhotoAdapter extends RecyclerView.Adapter<SelectedPhotoAdapter.ViewHolder> {\n    public static final String TAG = SelectedPhotoAdapter.class.getSimpleName();\n    private final Context mContext;\n    private final ItemViewResources mResources;\n    private final SelectedUriCollection mCollection;\n    private CheckStateListener mListener;\n    private List<Uri> mUris;\n\n    public SelectedPhotoAdapter(Context context, ItemViewResources resources, SelectedUriCollection collection) {\n        mContext = context;\n        mResources = resources;\n        mCollection = collection;\n        mUris = collection.asList();\n    }\n\n    @Override\n    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {\n        View v = LayoutInflater.from(viewGroup.getContext()).inflate(mResources.getLayoutId(), viewGroup, false);\n        return new ViewHolder(v, mResources);\n    }\n\n    @Override\n    public void onBindViewHolder(ViewHolder holder, final int position) {\n        final Uri uri = mUris.get(position);\n        holder.checkBox.setChecked(mCollection.isSelected(uri));\n        holder.checkBox.setText(null);\n        holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {\n            @Override\n            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {\n                SelectedGridViewHelper.syncCollection(mCollection, uri, isChecked);\n                SelectedGridViewHelper.callCheckStateListener(mListener);\n            }\n        });\n        Glide.with(mContext).load(uri)\n                .apply(new RequestOptions().fitCenter().centerCrop())\n                .into(holder.thumbnail);\n    }\n\n    @Override\n    public int getItemCount() {\n        return mUris.size();\n    }\n\n    public void registerCheckStateListener(CheckStateListener listener) {\n        mListener = listener;\n    }\n\n    public void unregisterCheckStateListener() {\n        mListener = null;\n    }\n\n    public interface CheckStateListener {\n        void onUpdate();\n    }\n\n    static class ViewHolder extends RecyclerView.ViewHolder {\n        private final ImageView thumbnail;\n        private final CheckBox checkBox;\n\n        ViewHolder(View v, ItemViewResources resources) {\n            super(v);\n            thumbnail = v.findViewById(resources.getImageViewId());\n            checkBox = v.findViewById(resources.getCheckBoxId());\n        }\n    }\n}\n"
  },
  {
    "path": "laevatein/src/main/java/com/laevatein/internal/ui/helper/AlbumListViewHelper.java",
    "content": "/*\n * Copyright (C) 2014 nohana, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an &quot;AS IS&quot; BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage com.laevatein.internal.ui.helper;\n\nimport android.database.Cursor;\nimport androidx.fragment.app.Fragment;\nimport androidx.fragment.app.FragmentActivity;\nimport androidx.fragment.app.FragmentManager;\nimport androidx.cursoradapter.widget.CursorAdapter;\nimport android.util.TypedValue;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.widget.AdapterView;\nimport android.widget.HeaderViewListAdapter;\nimport android.widget.ListView;\n\nimport com.amalgam.os.HandlerUtils;\nimport com.laevatein.R;\nimport com.laevatein.internal.entity.Album;\nimport com.laevatein.internal.misc.ui.FragmentUtils;\nimport com.laevatein.internal.model.DevicePhotoAlbumCollection;\nimport com.laevatein.internal.ui.AlbumListFragment;\nimport com.laevatein.internal.ui.adapter.DevicePhotoAlbumAdapter;\n\n/**\n * @author KeithYokoma\n * @version 1.0.0\n * @hide\n * @since 2014/03/20\n */\npublic final class AlbumListViewHelper {\n    private AlbumListViewHelper() {\n        throw new AssertionError(\"oops! the utility class is about to be instantiated...\");\n    }\n\n    public static void setUpHeader(Fragment fragment) {\n        TypedValue value = new TypedValue();\n        fragment.getContext().getTheme().resolveAttribute(R.attr.l_drawerHeaderLayout, value, true);\n        if (value.resourceId == 0) {\n            return;\n        }\n        ListView listView = (ListView) FragmentUtils.findViewById(fragment, R.id.l_list_album);\n        LayoutInflater inflater = LayoutInflater.from(fragment.getContext());\n        View header = inflater.inflate(value.resourceId, listView, false);\n        listView.addHeaderView(header);\n    }\n\n    public static void setUpListView(Fragment fragment, AdapterView.OnItemClickListener listener) {\n        ListView listView = (ListView) FragmentUtils.findViewById(fragment, R.id.l_list_album);\n        listView.setOnItemClickListener(listener);\n        listView.setAdapter(new DevicePhotoAlbumAdapter(fragment.getActivity(), null));\n    }\n\n    public static void setCursor(Fragment fragment, Cursor cursor) {\n        ListView listView = (ListView) FragmentUtils.findViewById(fragment, R.id.l_list_album);\n        CursorAdapter adapter;\n        if (listView.getHeaderViewsCount() > 0) {\n            adapter = (CursorAdapter) ((HeaderViewListAdapter) listView.getAdapter()).getWrappedAdapter();\n        } else {\n            adapter = (CursorAdapter) listView.getAdapter();\n        }\n        adapter.swapCursor(cursor);\n    }\n\n    public static void callOnSelect(AlbumListFragment.OnDirectorySelectListener listener, Cursor cursor) {\n        Album album = Album.valueOf(cursor);\n        listener.onSelect(album);\n    }\n\n    public static void callOnDefaultSelect(final Fragment fragment, final AlbumListFragment.OnDirectorySelectListener listener, final Cursor cursor,\n                                           final String albumId, final DevicePhotoAlbumCollection collection) {\n        HandlerUtils.getMainHandler().post(new Runnable() {\n            @Override\n            public void run() {\n                FragmentActivity fragmentActivity = fragment.getActivity();\n                if (fragmentActivity == null) {\n                    return;\n                }\n\n                FragmentManager manager = fragmentActivity.getSupportFragmentManager();\n                Fragment f = manager.findFragmentById(R.id.l_container_grid_fragment);\n                if (f != null) {\n                    return;\n                }\n\n                cursor.moveToFirst();\n                do {\n                    Album item = Album.valueOf(cursor);\n                    if (item.getId().equals(albumId)) {\n                        ListView listView = (ListView) FragmentUtils.findViewById(fragment, R.id.l_list_album);\n                        int position = cursor.getPosition() + listView.getHeaderViewsCount();\n                        collection.setStateCurrentSelection(position);\n                        setCheckedState(fragment, position);\n                        listener.onSelect(item);\n                        return;\n                    }\n                } while (cursor.moveToNext());\n\n                cursor.moveToFirst();\n                callOnSelect(listener, cursor);\n                ListView listView = (ListView) FragmentUtils.findViewById(fragment, R.id.l_list_album);\n                setCheckedState(fragment, listView.getHeaderViewsCount());\n            }\n        });\n    }\n\n    public static void setCheckedState(Fragment fragment, int position) {\n        ListView listView = (ListView) FragmentUtils.findViewById(fragment, R.id.l_list_album);\n        listView.setItemChecked(position, true);\n    }\n}"
  },
  {
    "path": "laevatein/src/main/java/com/laevatein/internal/ui/helper/PhotoGridViewHelper.java",
    "content": "/*\n * Copyright (C) 2014 nohana, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an &quot;AS IS&quot; BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage com.laevatein.internal.ui.helper;\n\nimport android.content.Context;\nimport android.content.Intent;\nimport android.database.Cursor;\nimport android.net.Uri;\nimport androidx.fragment.app.Fragment;\nimport androidx.fragment.app.FragmentActivity;\nimport androidx.recyclerview.widget.GridLayoutManager;\nimport androidx.recyclerview.widget.RecyclerView;\nimport android.view.View;\nimport android.widget.CheckBox;\nimport android.widget.TextView;\n\nimport com.laevatein.R;\nimport com.laevatein.internal.entity.Album;\nimport com.laevatein.internal.entity.ErrorViewResources;\nimport com.laevatein.internal.entity.ErrorViewSpec;\nimport com.laevatein.internal.entity.Item;\nimport com.laevatein.internal.entity.UncapableCause;\nimport com.laevatein.internal.entity.ViewResourceSpec;\nimport com.laevatein.internal.model.SelectedUriCollection;\nimport com.laevatein.internal.ui.PhotoGridFragment;\nimport com.laevatein.internal.ui.adapter.AlbumPhotoAdapter;\nimport com.laevatein.internal.ui.adapter.RecyclerViewCursorAdapter;\nimport com.laevatein.internal.ui.widget.PhotoDecoration;\nimport com.laevatein.internal.utils.ErrorViewUtils;\nimport com.laevatein.internal.utils.MediaStoreUtils;\nimport com.laevatein.ui.ImagePreviewActivity;\nimport com.laevatein.ui.PhotoSelectionActivity;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * @author KeithYokoma\n * @version 1.0.0\n * @hide\n * @since 2014/03/24\n */\npublic final class PhotoGridViewHelper {\n    private PhotoGridViewHelper() {\n        throw new AssertionError(\"oops! the utility class is about to be instantiated...\");\n    }\n\n    public static SelectedUriCollection getSelectedPhotoSet(Fragment fragment) {\n        return ((PhotoSelectionActivity) fragment.getActivity()).getCollection();\n    }\n\n    public static void setUpGridView(Fragment fragment, ViewResourceSpec resources, SelectedUriCollection collection, AlbumPhotoAdapter.BindViewListener listener) {\n        RecyclerView recyclerView = fragment.getView().findViewById(R.id.l_recyclerview);\n        int spanCount = resources.getItemViewResources().getSpanCount();\n        recyclerView.setLayoutManager(new GridLayoutManager(fragment.getContext(), resources.getItemViewResources().getSpanCount()));\n        recyclerView.setHasFixedSize(true);\n        recyclerView.setDrawingCacheEnabled(true);\n        recyclerView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_LOW);\n\n        AlbumPhotoAdapter adapter = new AlbumPhotoAdapter(fragment.getActivity(), resources, collection, listener);\n        adapter.registerCheckStateListener((AlbumPhotoAdapter.CheckStateListener) fragment);\n\n        int spacing = fragment.getResources().getDimensionPixelSize(R.dimen.grid_spacing);\n        recyclerView.addItemDecoration(new PhotoDecoration(spanCount, spacing, false));\n        recyclerView.setAdapter(adapter);\n\n        TextView emptyMessage = fragment.getView().findViewById(R.id.l_label_empty);\n        if (adapter.getItemCount() == 0) {\n            emptyMessage.setVisibility(View.VISIBLE);\n            emptyMessage.setText(R.string.l_empty_photo);\n        } else {\n            emptyMessage.setVisibility(View.GONE);\n        }\n    }\n\n    public static void tearDownGridView(Fragment fragment) {\n        RecyclerView recyclerView = fragment.getView().findViewById(R.id.l_recyclerview);\n        AlbumPhotoAdapter adapter = (AlbumPhotoAdapter) recyclerView.getAdapter();\n        adapter.unregisterCheckStateListener();\n    }\n\n    public static void setCursor(Fragment fragment, Cursor cursor) {\n        RecyclerView recyclerView = fragment.getView().findViewById(R.id.l_recyclerview);\n        RecyclerViewCursorAdapter adapter = (RecyclerViewCursorAdapter) recyclerView.getAdapter();\n        adapter.swapCursor(cursor);\n\n        TextView emptyMessage = fragment.getView().findViewById(R.id.l_label_empty);\n        if (adapter.getItemCount() == 0) {\n            emptyMessage.setVisibility(View.VISIBLE);\n            emptyMessage.setText(R.string.l_empty_photo);\n        } else {\n            emptyMessage.setVisibility(View.GONE);\n        }\n    }\n\n    public static void refreshView(Fragment fragment) {\n        RecyclerView recyclerView = fragment.getView().findViewById(R.id.l_recyclerview);\n        RecyclerViewCursorAdapter adapter = (RecyclerViewCursorAdapter) recyclerView.getAdapter();\n        adapter.notifyDataSetChanged();\n    }\n\n    public static void callPreview(Context context, Item item, List<Uri> checked) {\n        PhotoSelectionActivity activity = (PhotoSelectionActivity) context;\n        ViewResourceSpec resources = activity.getIntent().getParcelableExtra(PhotoSelectionActivity.EXTRA_VIEW_SPEC);\n        Intent intent = new Intent(context, resources.getPreviewActivityClass());\n        Fragment fragment = activity.getSupportFragmentManager().findFragmentById(R.id.l_container_grid_fragment);\n        Album album = fragment.getArguments().getParcelable(PhotoGridFragment.ARGS_ALBUM);\n        intent.putExtra(ImagePreviewActivity.EXTRA_ALBUM, album);\n        intent.putExtra(ImagePreviewActivity.EXTRA_ITEM, item);\n        intent.putExtra(ImagePreviewActivity.EXTRA_ERROR_SPEC, activity.getIntent().getParcelableExtra(PhotoSelectionActivity.EXTRA_ERROR_SPEC));\n        intent.putExtra(ImagePreviewActivity.EXTRA_SELECTION_SPEC, activity.getIntent().getParcelableExtra(PhotoSelectionActivity.EXTRA_SELECTION_SPEC));\n        intent.putExtra(ImagePreviewActivity.EXTRA_VIEW_SPEC, activity.getIntent().getParcelableExtra(PhotoSelectionActivity.EXTRA_VIEW_SPEC));\n        intent.putParcelableArrayListExtra(ImagePreviewActivity.EXTRA_DEFAULT_CHECKED, (ArrayList<Uri>) checked);\n        activity.startActivityForResult(intent, PhotoSelectionActivity.REQUEST_CODE_PREVIEW);\n    }\n\n    public static void callCamera(Context context, String fileProviderAuthorities) {\n        PhotoSelectionActivity activity = (PhotoSelectionActivity) context;\n        MediaStoreUtils utils = activity.getMediaStoreUtils();\n        String preparedUri = utils.invokeCameraCapture(activity, fileProviderAuthorities, PhotoSelectionActivity.REQUEST_CODE_CAPTURE);\n        activity.prepareCapture(preparedUri);\n    }\n\n    public static void syncCheckState(Context context, SelectedUriCollection collection, Item item, CheckBox checkBox) {\n        Uri uri = item.buildContentUri();\n        if (collection.isSelected(uri)) {\n            removeSelection(collection, uri, checkBox);\n        } else {\n            addSelection(context, collection, uri, checkBox);\n        }\n    }\n\n    public static void removeSelection(SelectedUriCollection collection, Uri uri, CheckBox checkBox) {\n        collection.remove(uri);\n        checkBox.setChecked(false);\n    }\n\n    public static void addSelection(Context context, SelectedUriCollection collection, Uri uri, CheckBox checkBox) {\n        UncapableCause cause = collection.isAcceptable(uri);\n        FragmentActivity activity = (FragmentActivity) context;\n        ErrorViewSpec spec = activity.getIntent().getParcelableExtra(PhotoSelectionActivity.EXTRA_ERROR_SPEC);\n\n        if (cause == null) {\n            ErrorViewResources countSpec = spec.getCountOverErrorSpec();\n            collection.add(uri);\n            if (collection.isCountOver() && !countSpec.isNoView()) {\n                ErrorViewUtils.showErrorView(activity, countSpec);\n                collection.remove(uri);\n                checkBox.setChecked(false);\n                return;\n            }\n            checkBox.setChecked(true);\n        } else {\n            checkBox.setChecked(false);\n            ErrorViewUtils.showErrorView(activity, cause.getErrorResources(spec));\n        }\n    }\n\n    public static void callCheckStateListener(AlbumPhotoAdapter.CheckStateListener listener) {\n        if (listener == null) {\n            return;\n        }\n        listener.onUpdate();\n    }\n}"
  },
  {
    "path": "laevatein/src/main/java/com/laevatein/internal/ui/helper/PhotoSelectionActivityDrawerToggle.java",
    "content": "/*\n * Copyright (C) 2014 nohana, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an &quot;AS IS&quot; BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage com.laevatein.internal.ui.helper;\n\nimport android.app.Activity;\nimport androidx.fragment.app.FragmentActivity;\nimport androidx.core.view.GravityCompat;\nimport androidx.drawerlayout.widget.DrawerLayout;\nimport androidx.appcompat.app.ActionBar;\nimport androidx.appcompat.app.ActionBarDrawerToggle;\nimport androidx.appcompat.widget.Toolbar;\nimport android.view.View;\n\nimport com.laevatein.R;\n\n/**\n * @author KeithYokoma\n * @since 2014/03/24\n * @version 1.0.0\n * @hide\n */\npublic class PhotoSelectionActivityDrawerToggle extends ActionBarDrawerToggle {\n    private FragmentActivity mActivity;\n    /**\n     * Construct a new ActionBarDrawerToggle.\n     *\n     * <p>The given {@link android.app.Activity} will be linked to the specified {@link DrawerLayout}.\n     * The provided drawer indicator drawable will animate slightly off-screen as the drawer\n     * is opened, indicating that in the open state the drawer will move off-screen when pressed\n     * and in the closed state the drawer will move on-screen when pressed.</p>\n     *\n     * <p>String resources must be provided to describe the open/close drawer actions for\n     * accessibility services.</p>\n     *\n     * @param activity                  The Activity hosting the drawer\n     * @param drawerLayout              The DrawerLayout to link to the given Activity's ActionBar\n     */\n    public PhotoSelectionActivityDrawerToggle(Activity activity, DrawerLayout drawerLayout) {\n        super(activity, drawerLayout, R.string.l_content_desc_open_drawer, R.string.l_content_desc_close_drawer);\n        mActivity = (FragmentActivity) activity;\n        drawerLayout.setDrawerShadow(R.drawable.l_drawer_shadow, GravityCompat.START);\n    }\n\n    public PhotoSelectionActivityDrawerToggle(Activity activity, DrawerLayout drawerLayout,Toolbar toolbar) {\n        super(activity, drawerLayout, toolbar, R.string.l_content_desc_open_drawer, R.string.l_content_desc_close_drawer);\n        mActivity = (FragmentActivity) activity;\n        drawerLayout.setDrawerShadow(R.drawable.l_drawer_shadow, GravityCompat.START);\n    }\n\n    public void setUpActionBar(ActionBar actionBar) {\n        if (actionBar == null) {\n            return; // FIXME for now just check null or not to avoid NPE, consider compatibility layer to deal with tool bar later on.\n        }\n        actionBar.setDisplayHomeAsUpEnabled(true);\n        actionBar.setHomeButtonEnabled(true);\n    }\n\n    @Override\n    public void onDrawerClosed(View drawerView) {\n        super.onDrawerClosed(drawerView);\n        mActivity.invalidateOptionsMenu();\n    }\n\n    @Override\n    public void onDrawerOpened(View drawerView) {\n        super.onDrawerOpened(drawerView);\n        mActivity.invalidateOptionsMenu();\n    }\n}\n"
  },
  {
    "path": "laevatein/src/main/java/com/laevatein/internal/ui/helper/PhotoSelectionViewHelper.java",
    "content": "/*\n * Copyright (C) 2014 nohana, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an &quot;AS IS&quot; BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage com.laevatein.internal.ui.helper;\n\nimport com.google.android.material.appbar.AppBarLayout;\nimport androidx.fragment.app.Fragment;\nimport androidx.fragment.app.FragmentActivity;\nimport androidx.fragment.app.FragmentManager;\nimport androidx.core.view.GravityCompat;\nimport androidx.drawerlayout.widget.DrawerLayout;\nimport android.view.LayoutInflater;\nimport android.view.Menu;\nimport android.view.MenuItem;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.RelativeLayout;\n\nimport com.laevatein.R;\nimport com.laevatein.internal.entity.Album;\nimport com.laevatein.internal.entity.CounterViewResources;\nimport com.laevatein.internal.entity.ErrorViewResources;\nimport com.laevatein.internal.entity.ErrorViewSpec;\nimport com.laevatein.internal.entity.ViewResourceSpec;\nimport com.laevatein.internal.model.SelectedUriCollection;\nimport com.laevatein.internal.ui.AlbumListFragment;\nimport com.laevatein.internal.ui.PhotoGridFragment;\nimport com.laevatein.internal.ui.SelectedPhotoGridFragment;\nimport com.laevatein.ui.PhotoSelectionActivity;\n\n/**\n * @author KeithYokoma\n * @since 2014/03/25\n * @version 1.0.0\n * @hide\n */\npublic final class PhotoSelectionViewHelper {\n    private PhotoSelectionViewHelper() {\n        throw new AssertionError(\"oops! the utility class is about to be instantiated...\");\n    }\n\n    public static void setUpActivity(PhotoSelectionActivity activity) {\n        ViewResourceSpec spec = activity.getIntent().getParcelableExtra(PhotoSelectionActivity.EXTRA_VIEW_SPEC);\n        if (spec != null && spec.needActivityOrientationRestriction()) {\n            activity.setRequestedOrientation(spec.getActivityOrientation());\n        }\n    }\n\n    public static void setUpCounter(PhotoSelectionActivity activity) {\n        ViewResourceSpec spec = activity.getIntent().getParcelableExtra(PhotoSelectionActivity.EXTRA_VIEW_SPEC);\n        if (spec.getCounterViewResources().getViewType() == CounterViewResources.LAYOUT_APP_BAR) {\n            AppBarLayout appBar = activity.findViewById(R.id.l_app_bar);\n            LayoutInflater.from(activity).inflate(R.layout.l_view_counter, appBar);\n        } else {\n            RelativeLayout content = activity.findViewById(R.id.l_content);\n            View counter = LayoutInflater.from(activity).inflate(R.layout.l_view_counter, content, false);\n            RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);\n            params.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);\n            content.addView(counter, params);\n            View view = activity.findViewById(R.id.l_container_grid_fragment);\n            RelativeLayout.LayoutParams params2 = (RelativeLayout.LayoutParams) view.getLayoutParams();\n            params2.addRule(RelativeLayout.ABOVE, R.id.l_fragment_selected_count);\n        }\n    }\n\n    public static void refreshOptionsMenuState(PhotoSelectionActivity activity, SelectedUriCollection collection, Menu menu) {\n        if (collection == null) {\n            return;\n        }\n        ErrorViewSpec spec = activity.getIntent().getParcelableExtra(PhotoSelectionActivity.EXTRA_ERROR_SPEC);\n        ErrorViewResources res = spec.getCountUnderErrorSpec();\n        MenuItem select = menu.findItem(R.id.action_finish_select);\n        updateSelectMenuState(select, res, collection, activity.isDrawerOpen());\n    }\n\n    public static void updateSelectMenuState(MenuItem item, ErrorViewResources res, SelectedUriCollection collection, boolean drawerOpen) {\n        if (item == null) {\n            return;\n        }\n        item.setVisible(!drawerOpen);\n        if (res.isNoView()) {\n            item.setEnabled(!collection.isEmpty() && collection.isCountInRange());\n        } else {\n            item.setEnabled(!collection.isEmpty());\n        }\n    }\n\n    public static void setPhotoGridFragment(FragmentActivity activity, DrawerLayout drawer, Album album) {\n        Fragment fragment = PhotoGridFragment.newInstance(album);\n        FragmentManager manager = activity.getSupportFragmentManager();\n        manager.beginTransaction()\n                .replace(R.id.l_container_grid_fragment, fragment, PhotoGridFragment.TAG)\n                .commit();\n        if (((PhotoSelectionActivity) activity).isDrawerOpen()) {\n            drawer.closeDrawers();\n        } else {\n            ViewResourceSpec spec = activity.getIntent().getParcelableExtra(PhotoSelectionActivity.EXTRA_VIEW_SPEC);\n            if (spec.openDrawer()) {\n                drawer.openDrawer(GravityCompat.START);\n            }\n        }\n    }\n\n    public static void setAlbumList(FragmentActivity activity, String albumId) {\n        Fragment fragment = AlbumListFragment.newInstance(albumId);\n        FragmentManager manager = activity.getSupportFragmentManager();\n        manager.beginTransaction()\n                .add(R.id.l_container_album_list, fragment, PhotoGridFragment.TAG)\n                .commit();\n    }\n\n    public static void setSelectedGridFragment(FragmentActivity activity) {\n        Fragment fragment = SelectedPhotoGridFragment.newInstance();\n        FragmentManager manager = activity.getSupportFragmentManager();\n        manager.beginTransaction()\n                .replace(R.id.l_container_grid_fragment, fragment, PhotoGridFragment.TAG)\n                .commit();\n    }\n\n    public static void refreshGridView(FragmentActivity activity) {\n        FragmentManager manager = activity.getSupportFragmentManager();\n        Fragment fragment = manager.findFragmentByTag(PhotoGridFragment.TAG);\n        if (fragment instanceof PhotoGridFragment) {\n            ((PhotoGridFragment) fragment).refreshGrid();\n        }\n    }\n}\n"
  },
  {
    "path": "laevatein/src/main/java/com/laevatein/internal/ui/helper/PreviewHelper.java",
    "content": "/*\n * Copyright (C) 2014 nohana, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an &quot;AS IS&quot; BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage com.laevatein.internal.ui.helper;\n\nimport android.app.Activity;\nimport android.content.Intent;\nimport android.net.Uri;\nimport androidx.viewpager.widget.ViewPager;\nimport androidx.appcompat.app.ActionBar;\nimport androidx.appcompat.app.AppCompatActivity;\nimport androidx.appcompat.widget.Toolbar;\nimport android.view.Menu;\nimport android.view.MenuItem;\nimport android.widget.CheckBox;\nimport android.widget.CompoundButton;\n\nimport com.laevatein.R;\nimport com.laevatein.internal.entity.ErrorViewResources;\nimport com.laevatein.internal.entity.ErrorViewSpec;\nimport com.laevatein.internal.entity.Item;\nimport com.laevatein.internal.entity.PreviewViewResources;\nimport com.laevatein.internal.entity.SelectionSpec;\nimport com.laevatein.internal.entity.UncapableCause;\nimport com.laevatein.internal.entity.ViewResourceSpec;\nimport com.laevatein.ui.ImagePreviewActivity;\nimport com.laevatein.internal.ui.adapter.PreviewPagerAdapter;\nimport com.laevatein.internal.utils.ErrorViewUtils;\nimport com.laevatein.internal.utils.PhotoMetadataUtils;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * @author KeithYokoma\n * @version 1.0.0\n * @hide\n * @since 2014/03/24\n */\npublic final class PreviewHelper {\n    private PreviewHelper() {\n        throw new AssertionError(\"oops! the utility class is about to be instantiated...\");\n    }\n\n    public static void setUpActivity(ImagePreviewActivity activity) {\n        ViewResourceSpec spec = activity.getIntent().getParcelableExtra(ImagePreviewActivity.EXTRA_VIEW_SPEC);\n        if (spec != null && spec.needActivityOrientationRestriction()) {\n            activity.setRequestedOrientation(spec.getActivityOrientation());\n        }\n        PreviewViewResources previewViewResources;\n        if (spec != null && spec.getPreviewViewResources() != null) {\n            previewViewResources = spec.getPreviewViewResources();\n        } else {\n            previewViewResources = PreviewViewResources.getDefault();\n        }\n        PreviewPagerAdapter adapter = new PreviewPagerAdapter(activity.getSupportFragmentManager(),\n                previewViewResources, activity);\n        ViewPager pager = activity.findViewById(R.id.l_pager);\n        pager.setAdapter(adapter);\n    }\n\n    public static void setUpActionBar(AppCompatActivity activity) {\n        Toolbar toolbar = activity.findViewById(R.id.l_toolbar);\n        toolbar.setTitle(activity.getApplicationContext().getString(R.string.l_detail_photo_title));\n        activity.setSupportActionBar(toolbar);\n        ActionBar actionBar = activity.getSupportActionBar();\n        actionBar.setHomeButtonEnabled(true);\n        actionBar.setDisplayHomeAsUpEnabled(true);\n    }\n\n    public static void setUpActionItem(final ImagePreviewActivity activity, Menu menu) {\n        final MenuItem item = menu.findItem(R.id.l_action_selection_state);\n        if (item == null) {\n            return;\n        }\n        final Item photo = activity.getIntent().getParcelableExtra(ImagePreviewActivity.EXTRA_ITEM);\n        final SelectionSpec spec = activity.getIntent().getParcelableExtra(ImagePreviewActivity.EXTRA_SELECTION_SPEC);\n        final ErrorViewSpec errorSpec = activity.getIntent().getParcelableExtra(ImagePreviewActivity.EXTRA_ERROR_SPEC);\n        item.setActionView(R.layout.l_action_layout_checkbox);\n        final CheckBox checkBox = item.getActionView().findViewById(R.id.l_default_check_box);\n        checkBox.setChecked(activity.getStateHolder().isChecked(photo.buildContentUri()));\n        checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {\n            @Override\n            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {\n                ViewPager pager = activity.findViewById(R.id.l_pager);\n                Uri currentUri = ((PreviewPagerAdapter) pager.getAdapter()).getUri(pager.getCurrentItem());\n                if (!isChecked) {\n                    activity.getStateHolder().setChecked(currentUri, false);\n                    return;\n                }\n                UncapableCause cause = PhotoMetadataUtils\n                        .isAcceptable(activity, spec, currentUri);\n                int currentCount = activity.getStateHolder().getCheckedCount();\n                if (!activity.getStateHolder().isChecked(currentUri) && currentCount + 1 > spec.getMaxSelectable()) {\n                    cause = UncapableCause.OVER_COUNT;\n                }\n                if (cause == null) {\n                    activity.getStateHolder().setChecked(currentUri, true);\n                    return;\n                }\n\n                ErrorViewResources error = cause.getErrorResources(errorSpec);\n                ErrorViewUtils.showErrorView(activity, error);\n                checkBox.setChecked(false);\n                activity.getStateHolder().setChecked(currentUri, false);\n            }\n        });\n    }\n\n    public static void sendBackResult(ImagePreviewActivity activity) {\n        Intent intent = new Intent();\n        List<Uri> checked = activity.getStateHolder().getAllChecked();\n        intent.putParcelableArrayListExtra(ImagePreviewActivity.EXTRA_RESULT_CHECKED, (ArrayList<Uri>) checked);\n        activity.setResult(Activity.RESULT_OK, intent);\n    }\n}\n"
  },
  {
    "path": "laevatein/src/main/java/com/laevatein/internal/ui/helper/SelectedCountViewHelper.java",
    "content": "package com.laevatein.internal.ui.helper;\n\nimport android.view.View;\nimport android.widget.TextView;\n\nimport com.laevatein.R;\nimport com.laevatein.internal.entity.ViewResourceSpec;\nimport com.laevatein.internal.misc.ui.FragmentUtils;\nimport com.laevatein.internal.ui.SelectedCountFragment;\nimport com.laevatein.ui.PhotoSelectionActivity;\n\n/**\n * @author KeithYokoma\n * @version 1.0.0\n * @hide\n * @since 2014/04/04\n */\npublic final class SelectedCountViewHelper {\n    private SelectedCountViewHelper() {\n        throw new AssertionError(\"oops! the utility class is about to be instantiated...\");\n    }\n\n    public static void setUpCountView(final SelectedCountFragment fragment) {\n        TextView counter = (TextView) FragmentUtils.findViewById(fragment, R.id.l_container_count_view);\n        ViewResourceSpec spec = FragmentUtils.getIntentParcelableExtra(fragment, PhotoSelectionActivity.EXTRA_VIEW_SPEC);\n        counter.setEnabled(spec.isEnableSelectedView());\n        counter.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                fragment.getListener().onClickSelectedView();\n            }\n        });\n    }\n\n    public static void updateCountView(PhotoSelectionActivity activity, SelectedCountFragment fragment) {\n        if (activity == null || fragment == null || activity.getCollection() == null || fragment.getView() == null) {\n            return;\n        }\n        ViewResourceSpec spec = FragmentUtils.getIntentParcelableExtra(fragment, PhotoSelectionActivity.EXTRA_VIEW_SPEC);\n        TextView label = (TextView) FragmentUtils.findViewById(fragment, R.id.l_container_count_view);\n        int max = activity.getCollection().maxCount();\n        int current = activity.getCollection().count();\n        label.setText(activity.getString(spec.getCounterViewResources().getTextRes(), current, max));\n    }\n}\n"
  },
  {
    "path": "laevatein/src/main/java/com/laevatein/internal/ui/helper/SelectedGridViewHelper.java",
    "content": "/*\n * Copyright (C) 2014 nohana, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an &quot;AS IS&quot; BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage com.laevatein.internal.ui.helper;\n\nimport android.net.Uri;\nimport androidx.fragment.app.Fragment;\nimport androidx.recyclerview.widget.GridLayoutManager;\nimport androidx.recyclerview.widget.RecyclerView;\nimport android.view.View;\nimport android.widget.TextView;\n\nimport com.laevatein.R;\nimport com.laevatein.internal.entity.ItemViewResources;\nimport com.laevatein.internal.model.SelectedUriCollection;\nimport com.laevatein.internal.ui.adapter.SelectedPhotoAdapter;\nimport com.laevatein.internal.ui.widget.PhotoDecoration;\nimport com.laevatein.ui.PhotoSelectionActivity;\n\n/**\n * @author keishin.yokomaku\n * @version 1.0.0\n * @hide\n * @since 2014/03/27\n */\npublic final class SelectedGridViewHelper {\n    private SelectedGridViewHelper() {\n        throw new AssertionError(\"oops! the utility class is about to be instantiated...\");\n    }\n\n    public static SelectedUriCollection getSelectedPhotoSet(Fragment fragment) {\n        return ((PhotoSelectionActivity) fragment.getActivity()).getCollection();\n    }\n\n    public static void setUpGridView(Fragment fragment, ItemViewResources resources, SelectedUriCollection collection) {\n        RecyclerView recyclerView = fragment.getView().findViewById(R.id.l_recyclerview);\n        int spanCount = resources.getSpanCount();\n        recyclerView.setLayoutManager(new GridLayoutManager(fragment.getContext(), resources.getSpanCount()));\n        recyclerView.setHasFixedSize(true);\n        recyclerView.setDrawingCacheEnabled(true);\n        recyclerView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_LOW);\n\n        SelectedPhotoAdapter adapter = new SelectedPhotoAdapter(fragment.getActivity(), resources, collection);\n        adapter.registerCheckStateListener((SelectedPhotoAdapter.CheckStateListener) fragment);\n\n        int spacing = fragment.getResources().getDimensionPixelSize(R.dimen.grid_spacing);\n        recyclerView.addItemDecoration(new PhotoDecoration(spanCount, spacing, false));\n        recyclerView.setAdapter(adapter);\n\n        TextView emptyMessage = fragment.getView().findViewById(R.id.l_label_empty);\n        if (collection.asList().size() == 0) {\n            emptyMessage.setVisibility(View.VISIBLE);\n            emptyMessage.setText(R.string.l_empty_selection);\n        } else {\n            emptyMessage.setVisibility(View.GONE);\n        }\n    }\n\n    public static void tearDownGridView(Fragment fragment) {\n        RecyclerView recyclerView = fragment.getView().findViewById(R.id.l_recyclerview);\n        SelectedPhotoAdapter adapter = (SelectedPhotoAdapter) recyclerView.getAdapter();\n        adapter.unregisterCheckStateListener();\n    }\n\n    public static void syncCollection(SelectedUriCollection collection, Uri uri, boolean checked) {\n        if (checked) {\n            collection.add(uri);\n        } else {\n            collection.remove(uri);\n        }\n    }\n\n    public static void callCheckStateListener(SelectedPhotoAdapter.CheckStateListener listener) {\n        if (listener == null) {\n            return;\n        }\n        listener.onUpdate();\n    }\n}\n"
  },
  {
    "path": "laevatein/src/main/java/com/laevatein/internal/ui/helper/options/FinishSelectMenuHandler.java",
    "content": "/*\n * Copyright (C) 2014 nohana, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an &quot;AS IS&quot; BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage com.laevatein.internal.ui.helper.options;\n\nimport android.app.Activity;\nimport android.content.Intent;\nimport android.os.Parcelable;\n\nimport com.laevatein.internal.entity.ErrorViewResources;\nimport com.laevatein.internal.entity.ErrorViewSpec;\nimport com.laevatein.internal.model.SelectedUriCollection;\nimport com.laevatein.internal.utils.ErrorViewUtils;\nimport com.laevatein.ui.PhotoSelectionActivity;\n\nimport java.util.ArrayList;\n\n/**\n * @author KeithYokoma\n * @since 2014/03/25\n */\npublic class FinishSelectMenuHandler implements PhotoSelectionOptionsMenuHandler {\n    @Override\n    public boolean handle(PhotoSelectionActivity activity, Void extra) {\n        SelectedUriCollection collection = activity.getCollection();\n        if (collection.isCountInRange()) {\n            Intent intent = new Intent();\n            intent.putParcelableArrayListExtra(PhotoSelectionActivity.EXTRA_RESULT_SELECTION,\n                    (ArrayList<? extends Parcelable>) collection.asList());\n            activity.setResult(Activity.RESULT_OK, intent);\n            activity.finish();\n        } else {\n            ErrorViewSpec spec = activity.getIntent().getParcelableExtra(PhotoSelectionActivity.EXTRA_ERROR_SPEC);\n            ErrorViewResources res = spec.getCountUnderErrorSpec();\n            ErrorViewUtils.showErrorView(activity, res);\n        }\n        return true;\n    }\n}\n"
  },
  {
    "path": "laevatein/src/main/java/com/laevatein/internal/ui/helper/options/PhotoSelectionOptionsMenu.java",
    "content": "/*\n * Copyright (C) 2014 nohana, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an &quot;AS IS&quot; BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage com.laevatein.internal.ui.helper.options;\n\nimport android.view.MenuItem;\n\nimport com.laevatein.R;\nimport com.laevatein.internal.misc.ui.helper.options.OptionsMenu;\nimport com.laevatein.ui.PhotoSelectionActivity;\n\n/**\n * @author KeithYokoma\n * @version 1.0.0\n * @hide\n * @since 2014/03/20\n */\npublic enum PhotoSelectionOptionsMenu implements OptionsMenu<PhotoSelectionActivity, PhotoSelectionOptionsMenuHandler> {\n    SELECT(R.id.action_finish_select, new FinishSelectMenuHandler()),\n    UNKNOWN(-1, new UnknownMenuHandler()); // null object pattern\n\n    private final int mMenuId;\n    private final PhotoSelectionOptionsMenuHandler mHandler;\n\n    PhotoSelectionOptionsMenu(int menuId, PhotoSelectionOptionsMenuHandler handler) {\n        mMenuId = menuId;\n        mHandler = handler;\n    }\n\n    public static PhotoSelectionOptionsMenu valueOf(MenuItem item) {\n        for (PhotoSelectionOptionsMenu menu : values()) {\n            if (menu.getMenuId() == item.getItemId()) {\n                return menu;\n            }\n        }\n        return UNKNOWN;\n    }\n\n    @Override\n    public int getMenuId() {\n        return mMenuId;\n    }\n\n    @Override\n    public PhotoSelectionOptionsMenuHandler getHandler() {\n        return mHandler;\n    }\n}\n"
  },
  {
    "path": "laevatein/src/main/java/com/laevatein/internal/ui/helper/options/PhotoSelectionOptionsMenuHandler.java",
    "content": "/*\n * Copyright (C) 2014 nohana, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an &quot;AS IS&quot; BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage com.laevatein.internal.ui.helper.options;\n\nimport com.laevatein.internal.misc.ui.helper.options.OptionsMenuHandler;\nimport com.laevatein.ui.PhotoSelectionActivity;\n\n/**\n * @author KeithYokoma\n * @since 2014/03/20\n * @version 1.0.0\n * @hide\n */\npublic interface PhotoSelectionOptionsMenuHandler extends OptionsMenuHandler<PhotoSelectionActivity, Void> {}"
  },
  {
    "path": "laevatein/src/main/java/com/laevatein/internal/ui/helper/options/UnknownMenuHandler.java",
    "content": "/*\n * Copyright (C) 2014 nohana, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an &quot;AS IS&quot; BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage com.laevatein.internal.ui.helper.options;\n\nimport com.laevatein.ui.PhotoSelectionActivity;\n\n/**\n * @author KeithYokoma\n * @since 2014/03/25\n */\npublic class UnknownMenuHandler implements PhotoSelectionOptionsMenuHandler {\n    @Override\n    public boolean handle(PhotoSelectionActivity activity, Void extra) {\n        return false;\n    }\n}\n"
  },
  {
    "path": "laevatein/src/main/java/com/laevatein/internal/ui/widget/PhotoDecoration.java",
    "content": "package com.laevatein.internal.ui.widget;\n\nimport android.graphics.Rect;\nimport androidx.recyclerview.widget.RecyclerView;\nimport android.view.View;\n\npublic class PhotoDecoration extends RecyclerView.ItemDecoration {\n\n    private int mSpanCount;\n    private int mSpacing;\n    private boolean mIncludeEdge;\n\n    public PhotoDecoration(int spanCount, int spacing, boolean includeEdge) {\n        this.mSpanCount = spanCount;\n        this.mSpacing = spacing;\n        this.mIncludeEdge = includeEdge;\n    }\n\n    @Override\n    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {\n        int position = parent.getChildAdapterPosition(view);\n        int column = position % mSpanCount;\n\n        if (mIncludeEdge) {\n            outRect.left = mSpacing - column * mSpacing / mSpanCount;\n            outRect.right = (column + 1) * mSpacing / mSpanCount;\n            if (position < mSpanCount) {\n                outRect.top = mSpacing;\n            }\n            outRect.bottom = mSpacing;\n        } else {\n            outRect.left = column * mSpacing / mSpanCount;\n            outRect.right = mSpacing - (column + 1) * mSpacing / mSpanCount;\n            if (position >= mSpanCount) {\n                outRect.top = mSpacing;\n            }\n        }\n    }\n}"
  },
  {
    "path": "laevatein/src/main/java/com/laevatein/internal/utils/ErrorViewUtils.java",
    "content": "package com.laevatein.internal.utils;\n\nimport com.google.android.material.snackbar.Snackbar;\nimport androidx.fragment.app.FragmentActivity;\nimport android.widget.Toast;\n\nimport com.amalgam.app.SupportSimpleAlertDialogFragment;\nimport com.laevatein.internal.entity.DialogResources;\nimport com.laevatein.internal.entity.ErrorViewResources;\nimport com.laevatein.internal.misc.ui.ConfirmationDialogFragment;\n\n/**\n * @author KeithYokoma\n * @version 1.0.0\n * @hide\n * @since 2014/04/07\n */\npublic final class ErrorViewUtils {\n    private ErrorViewUtils() {\n        throw new AssertionError(\"oops! the utility class is about to be instantiated...\");\n    }\n\n    public static void showErrorView(FragmentActivity activity, ErrorViewResources resources) {\n        if (resources.isNoView()) {\n            return;\n        }\n\n        if (resources.getViewType() == ErrorViewResources.ViewType.DIALOG) {\n            if (resources.getTitleId() == -1) {\n                SupportSimpleAlertDialogFragment.newInstance(resources.getMessageId())\n                        .show(activity.getSupportFragmentManager(), SupportSimpleAlertDialogFragment.TAG);\n            } else {\n                SupportSimpleAlertDialogFragment.newInstance(resources.getTitleId(), resources.getMessageId())\n                        .show(activity.getSupportFragmentManager(), SupportSimpleAlertDialogFragment.TAG);\n            }\n        } else if (resources.getViewType() == ErrorViewResources.ViewType.TOAST) {\n            Toast.makeText(activity.getApplicationContext(), resources.getMessageId(), Toast.LENGTH_LONG).show();\n        } else if (resources.getViewType() == ErrorViewResources.ViewType.SNACKBAR) {\n            Snackbar.make(activity.findViewById(android.R.id.content), resources.getMessageId(), Snackbar.LENGTH_LONG).show();\n        }\n    }\n\n    public static void showConfirmDialog(FragmentActivity activity, DialogResources resources) {\n        if (resources.getTitleId() == -1) {\n            ConfirmationDialogFragment.newInstance(resources.getMessageId())\n                    .show(activity.getSupportFragmentManager(), ConfirmationDialogFragment.TAG);\n        } else {\n            ConfirmationDialogFragment.newInstance(resources.getTitleId(), resources.getMessageId())\n                    .show(activity.getSupportFragmentManager(), ConfirmationDialogFragment.TAG);\n        }\n    }\n}\n"
  },
  {
    "path": "laevatein/src/main/java/com/laevatein/internal/utils/ExifInterfaceUtils.java",
    "content": "package com.laevatein.internal.utils;\n\nimport androidx.exifinterface.media.ExifInterface;\nimport android.text.TextUtils;\nimport android.util.Log;\n\nimport java.io.IOException;\nimport java.text.ParseException;\nimport java.text.SimpleDateFormat;\nimport java.util.Date;\nimport java.util.TimeZone;\n\n/**\n * This class is based on this source code.\n * https://github.com/mixi-inc/Android-Device-Compatibility/blob/master/AndroidDeviceCompatibility/src/main/java/jp/mixi/compatibility/android/media/ExifInterfaceCompat.java\n * <p>\n * License\n * see: https://github.com/mixi-inc/Android-Device-Compatibility#license\n */\npublic class ExifInterfaceUtils {\n    public static final String TAG = ExifInterfaceUtils.class.getSimpleName();\n\n    /**\n     * Do not instantiate this class.\n     */\n    private ExifInterfaceUtils() {\n    }\n\n    private static Date getExifDateTime(String filepath) {\n        ExifInterface exif = null;\n        try {\n            exif = new ExifInterface(filepath);\n        } catch (IOException ex) {\n            Log.e(TAG, \"cannot read exif\", ex);\n            return null;\n        }\n\n        String date = exif.getAttribute(ExifInterface.TAG_DATETIME);\n        if (TextUtils.isEmpty(date)) {\n            return null;\n        }\n        try {\n            SimpleDateFormat formatter = new SimpleDateFormat(\"yyyy:MM:dd HH:mm:ss\");\n            formatter.setTimeZone(TimeZone.getTimeZone(\"UTC\"));\n            return formatter.parse(date);\n        } catch (ParseException e) {\n            Log.d(TAG, \"failed to parse date taken\", e);\n        }\n        return null;\n    }\n\n    /**\n     * Read exif info and get datetime value of the photo.\n     *\n     * @param filepath to get datetime\n     * @return when a photo taken.\n     */\n    public static long getExifDateTimeInMillis(String filepath) {\n        Date datetime = getExifDateTime(filepath);\n        if (datetime == null) {\n            return -1;\n        }\n        return datetime.getTime();\n    }\n}\n"
  },
  {
    "path": "laevatein/src/main/java/com/laevatein/internal/utils/MediaStoreUtils.java",
    "content": "package com.laevatein.internal.utils;\n\nimport android.annotation.TargetApi;\nimport android.app.Activity;\nimport android.content.ContentResolver;\nimport android.content.ContentUris;\nimport android.content.ContentValues;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.content.pm.PackageManager;\nimport android.database.ContentObserver;\nimport android.database.Cursor;\nimport android.net.Uri;\nimport android.os.Build;\nimport android.os.Environment;\nimport android.os.Handler;\nimport android.provider.MediaStore;\nimport androidx.exifinterface.media.ExifInterface;\nimport androidx.core.content.FileProvider;\nimport android.util.Log;\n\nimport java.io.File;\nimport java.io.FileInputStream;\nimport java.io.FileOutputStream;\nimport java.io.IOException;\nimport java.nio.channels.FileChannel;\nimport java.text.SimpleDateFormat;\nimport java.util.ArrayList;\nimport java.util.Date;\n\n/**\n * Compatibility class for the issue of various implementations of camera feature.\n * <p>\n * This class is based on this source code.\n * https://github.com/mixi-inc/Android-Device-Compatibility/blob/master/AndroidDeviceCompatibility/src/main/java/jp/mixi/compatibility/android/provider/MediaStoreCompat.java\n * <p>\n * License\n * see: https://github.com/mixi-inc/Android-Device-Compatibility#license\n */\npublic class MediaStoreUtils {\n    public static final String TAG = MediaStoreUtils.class.getSimpleName();\n    private static final String MEDIA_FILE_NAME_FORMAT = \"yyyyMMdd_HHmmss\";\n    private static final String MEDIA_FILE_EXTENSION = \".jpg\";\n    private static final String MEDIA_FILE_PREFIX = \"IMG_\";\n    private final String MEDIA_FILE_DIRECTORY;\n    private Context mContext;\n    private ContentObserver mObserver;\n    private ArrayList<PhotoContent> mRecentlyUpdatedPhotos;\n\n    /**\n     * Prepares to deal with various implementations of camera feature and {@link MediaStore}.\n     * You should call {@link MediaStoreUtils#destroy()} on destroying context.\n     *\n     * @param context a context\n     * @param handler a handler\n     */\n    public MediaStoreUtils(Context context, Handler handler) {\n        mContext = context;\n        MEDIA_FILE_DIRECTORY = context.getPackageName();\n        mObserver = new ContentObserver(handler) {\n            @Override\n            public void onChange(boolean selfChange) {\n                super.onChange(selfChange);\n                updateLatestPhotos();\n            }\n        };\n        mContext.getContentResolver().registerContentObserver(\n                MediaStore.Images.Media.EXTERNAL_CONTENT_URI, true, mObserver);\n    }\n\n    /**\n     * Checks whether the device has a camera feature or not.\n     *\n     * @param context a context to check for camera feature.\n     * @return true if the device has a camera feature. false otherwise.\n     */\n    public static final boolean hasCameraFeature(Context context) {\n        PackageManager pm = context.getApplicationContext().getPackageManager();\n        return pm.hasSystemFeature(PackageManager.FEATURE_CAMERA);\n    }\n\n    /**\n     * Invokes a camera capture activity.\n     *\n     * @param activity    the caller of the camera capture activity.\n     * @param requestCode activity result handling id.\n     * @return a file name to be saved as.\n     */\n    public String invokeCameraCapture(Activity activity, String fileProviderAuthorities, int requestCode) {\n        if (!hasCameraFeature(mContext)) return null;\n\n        File toSave = getOutputFile();\n        if (toSave == null) return null;\n\n        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);\n        intent.addCategory(Intent.CATEGORY_DEFAULT);\n        intent.putExtra(MediaStore.EXTRA_OUTPUT, FileProvider.getUriForFile(activity, fileProviderAuthorities, toSave));\n        intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);\n        activity.startActivityForResult(intent, requestCode);\n        return toSave.toString();\n    }\n\n    /**\n     * Should be called on destroying context to dereference to the {@link ContentObserver}.\n     */\n    public void destroy() {\n        mContext.getContentResolver().unregisterContentObserver(mObserver);\n    }\n\n    /**\n     * @param data        the result {@link Intent} of a camera activity.\n     * @param preparedUri a prepared photo uri to fetch photo data.\n     * @return captured photo {@link Uri}\n     */\n    public Uri getCapturedPhotoUri(Intent data, String preparedUri) {\n        Uri captured = null;\n        if (data != null) {\n            captured = data.getData();\n            if (captured == null) data.getParcelableExtra(Intent.EXTRA_STREAM);\n        }\n\n        File prepared = new File(preparedUri.toString());\n        if (captured == null || captured.equals(Uri.fromFile(prepared))) {\n            captured = findPhotoFromRecentlyTaken(prepared);\n            if (captured == null) {\n                captured = storeImage(prepared);\n                prepared.delete();\n            } else {\n                // Found. Compare the destination path\n                // and delete app-private one if there is any copy outside of app-private directory.\n                String realPath = getPathFromUri(\n                        mContext.getContentResolver(), captured);\n                if (realPath != null) {\n                    if (!prepared.equals(new File(realPath))) prepared.delete();\n                }\n            }\n        }\n\n        return captured;\n    }\n\n    /**\n     * Deletes unnecessary files if exist.\n     *\n     * @param uri to delete.\n     */\n    public void cleanUp(String uri) {\n        File file = new File(uri.toString());\n        if (file.exists()) file.delete();\n    }\n\n    /**\n     * Obtains a captured photo file path from content {@link Uri} of a {@link MediaStore}\n     *\n     * @param resolver   a content resolver\n     * @param contentUri a content uri\n     * @return captured photo file path string\n     */\n    public static String getPathFromUri(ContentResolver resolver, Uri contentUri) {\n        final String dataColumn = MediaStore.MediaColumns.DATA;\n        Cursor cursor = null;\n        try {\n            cursor = resolver.query(contentUri, new String[]{dataColumn}, null, null, null);\n            if (cursor == null || !cursor.moveToFirst()) return null;\n\n            final int index = cursor.getColumnIndex(dataColumn);\n            return cursor.getString(index);\n        } finally {\n            if (cursor != null) cursor.close();\n        }\n    }\n\n    /**\n     * Copies file streams.\n     *\n     * @param is input stream\n     * @param os output stream\n     * @return the number of bytes.\n     * @throws IOException if something wrong with I/O.\n     */\n    public static long copyFileStream(FileInputStream is, FileOutputStream os)\n            throws IOException {\n        FileChannel srcChannel = null;\n        FileChannel destChannel = null;\n        try {\n            srcChannel = is.getChannel();\n            destChannel = os.getChannel();\n            return srcChannel.transferTo(0, srcChannel.size(), destChannel);\n        } finally {\n            if (srcChannel != null) srcChannel.close();\n            if (destChannel != null) destChannel.close();\n        }\n    }\n\n    /**\n     * Obtains file {@link Uri} that refers to a recently taken photo.\n     *\n     * @param file to search\n     * @return photo file uri.\n     */\n    private Uri findPhotoFromRecentlyTaken(File file) {\n        if (mRecentlyUpdatedPhotos == null)\n            updateLatestPhotos();\n\n        long filesize = file.length();\n        long taken = ExifInterfaceUtils.getExifDateTimeInMillis(file.getAbsolutePath());\n\n        int maxPoint = 0;\n        PhotoContent maxItem = null;\n        for (PhotoContent item : mRecentlyUpdatedPhotos) {\n            int point = 0;\n            if (item.size == filesize)\n                point++;\n            if (item.taken == taken)\n                point++;\n            if (point > maxPoint) {\n                maxPoint = point;\n                maxItem = item;\n            }\n        }\n        if (maxItem != null) {\n            generateThumbnails(maxItem.id);\n            return ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,\n                    maxItem.id);\n        }\n\n        return null;\n    }\n\n    /**\n     * Stores a file to media store with photo orientation and date that taken.\n     *\n     * @param file to store\n     * @return a stored file uri\n     */\n    private Uri storeImage(File file) {\n        // store image to content provider\n        try {\n            // create parameters for Intent with filename\n            ContentValues values = new ContentValues();\n            values.put(MediaStore.Images.Media.TITLE, file.getName());\n            values.put(MediaStore.Images.Media.MIME_TYPE, \"image/jpeg\");\n            values.put(MediaStore.Images.Media.DESCRIPTION, \"mixi Photo\");\n            values.put(MediaStore.Images.Media.ORIENTATION, new ExifInterface(file.getAbsolutePath()).getRotationDegrees());\n            long date = ExifInterfaceUtils.getExifDateTimeInMillis(file.getAbsolutePath());\n            if (date != -1)\n                values.put(MediaStore.Images.Media.DATE_TAKEN, date);\n\n            Uri imageUri = mContext.getContentResolver().insert(\n                    MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);\n\n            FileOutputStream fos = (FileOutputStream) mContext.getContentResolver().openOutputStream(\n                    imageUri);\n            FileInputStream fis = new FileInputStream(file);\n            copyFileStream(fis, fos);\n            fos.close();\n            fis.close();\n\n            generateThumbnails(ContentUris.parseId(imageUri));\n\n            return imageUri;\n        } catch (Exception e) {\n            Log.w(TAG, \"cannot insert\", e);\n            return null;\n        }\n    }\n\n    /**\n     * Request to update latest photos onto media store.\n     */\n    private void updateLatestPhotos() {\n        // retrieve the newest five images\n        Cursor c = MediaStore.Images.Media.query(mContext.getContentResolver(),\n                MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new String[]{\n                        MediaStore.Images.ImageColumns._ID,\n                        MediaStore.Images.ImageColumns.DATE_TAKEN,\n                        MediaStore.Images.ImageColumns.SIZE,\n                }, null, null, MediaStore.Images.ImageColumns.DATE_ADDED + \" DESC\");\n        if (c != null) {\n            try {\n                int count = 0;\n                mRecentlyUpdatedPhotos = new ArrayList<PhotoContent>();\n                while (c.moveToNext()) {\n                    PhotoContent item = new PhotoContent();\n                    item.id = c.getLong(0);\n                    item.taken = c.getLong(1);\n                    item.size = c.getInt(2);\n                    mRecentlyUpdatedPhotos.add(item);\n                    if (++count > 5)\n                        break;\n                }\n            } finally {\n                c.close();\n            }\n        }\n    }\n\n    /**\n     * Create thumbnail images for a specified photo image.\n     *\n     * @param imageId referes to a photo image.\n     */\n    private void generateThumbnails(long imageId) {\n        try {\n            MediaStore.Images.Thumbnails.getThumbnail(mContext.getContentResolver(), imageId,\n                    MediaStore.Images.Thumbnails.MINI_KIND, null);\n        } catch (NullPointerException e) {\n            // some MediaStores throws NPE, just ignore the result\n        }\n    }\n\n    /**\n     * Make output file uri based on a external storage directory.\n     *\n     * @return a file\n     */\n    @TargetApi(Build.VERSION_CODES.FROYO)\n    private File getOutputFile() {\n        File extDir = new File(\n                Environment.getExternalStoragePublicDirectory(\n                        Environment.DIRECTORY_PICTURES),\n                MEDIA_FILE_DIRECTORY);\n\n        if (!extDir.exists()) {\n            if (!extDir.mkdirs()) return null;\n        }\n\n        String timeStamp = new SimpleDateFormat(MEDIA_FILE_NAME_FORMAT).format(new Date());\n        return new File(extDir.getPath() + File.separator +\n                MEDIA_FILE_PREFIX + timeStamp + MEDIA_FILE_EXTENSION);\n    }\n\n    /**\n     * Entity class for photo content.\n     */\n    private static class PhotoContent {\n        public long id;\n        public long taken;\n        public int size;\n    }\n}"
  },
  {
    "path": "laevatein/src/main/java/com/laevatein/internal/utils/PhotoMetadataUtils.java",
    "content": "/*\n * Copyright (C) 2014 nohana, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an &quot;AS IS&quot; BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage com.laevatein.internal.utils;\n\nimport android.content.ContentResolver;\nimport android.content.Context;\nimport android.database.Cursor;\nimport android.graphics.BitmapFactory;\nimport android.graphics.Point;\nimport android.net.Uri;\nimport android.provider.MediaStore;\nimport androidx.annotation.Nullable;\nimport androidx.exifinterface.media.ExifInterface;\nimport android.util.Log;\n\nimport com.amalgam.database.CursorUtils;\nimport com.amalgam.io.CloseableUtils;\nimport com.laevatein.MimeType;\nimport com.laevatein.internal.entity.SelectionSpec;\nimport com.laevatein.internal.entity.UncapableCause;\n\nimport java.io.FileNotFoundException;\nimport java.io.IOException;\nimport java.io.InputStream;\n\n/**\n * @author KeithYokoma\n * @version 1.0.0\n * @hide\n * @since 2014/03/25\n */\npublic final class PhotoMetadataUtils {\n    public static final String TAG = PhotoMetadataUtils.class.getSimpleName();\n    private static final String SCHEME_CONTENT = \"content\";\n\n    private PhotoMetadataUtils() {\n        throw new AssertionError(\"oops! the utility class is about to be instantiated...\");\n    }\n\n    public static int getPixelsCount(ContentResolver resolver, Uri uri) {\n        Point size = getBitmapBound(resolver, uri);\n        return size.x * size.y;\n    }\n\n    private static Point getBitmapBound(ContentResolver resolver, Uri uri) {\n        BitmapFactory.Options options = new BitmapFactory.Options();\n        options.inJustDecodeBounds = true;\n        InputStream is = null;\n        try {\n            is = ContentResolverWrapper.openInputStream(resolver, uri);\n            BitmapFactory.decodeStream(is, null, options); // Argument \"InputStream\" is nullable, so never crash here.\n        } catch (FileNotFoundException e) {\n            return new Point(0, 0);\n        } finally {\n            CloseableUtils.close(is);\n        }\n        int width = options.outWidth;\n        int height = options.outHeight;\n        return new Point(width, height);\n    }\n\n    public static String getPath(ContentResolver resolver, Uri uri) {\n        if (uri == null) {\n            return null;\n        }\n\n        if (SCHEME_CONTENT.equals(uri.getScheme())) {\n            Cursor cursor = null;\n            try {\n                cursor = resolver.query(uri, new String[]{MediaStore.Images.ImageColumns.DATA}, null, null, null);\n                if (cursor == null || !cursor.moveToFirst()) {\n                    return null;\n                }\n                return cursor.getString(cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA));\n            } finally {\n                CursorUtils.close(cursor);\n            }\n        }\n        return uri.getPath();\n    }\n\n    public static UncapableCause isAcceptable(Context context, SelectionSpec spec, Uri uri) {\n        if (!isSelectableType(context, spec, uri)) {\n            return UncapableCause.FILE_TYPE;\n        }\n        if (!hasUnderAtMostQuality(context, spec, uri)) {\n            return UncapableCause.OVER_QUALITY;\n        }\n        if (!hasOverAtLeastQuality(context, spec, uri)) {\n            return UncapableCause.UNDER_QUALITY;\n        }\n        if (!isSmallerThanMaxSize(context, spec, uri)) {\n            return UncapableCause.OVER_SIZE;\n        }\n        if (!isLargerThanMinSize(context, spec, uri)) {\n            return UncapableCause.UNDER_SIZE;\n        }\n        return null;\n    }\n\n    public static boolean hasOverAtLeastQuality(Context context, SelectionSpec spec, Uri uri) {\n        if (context == null) {\n            return false;\n        }\n\n        int pixels = PhotoMetadataUtils.getPixelsCount(context.getContentResolver(), uri);\n        return spec.getMinPixels() <= pixels;\n    }\n\n    public static boolean hasUnderAtMostQuality(Context context, SelectionSpec spec, Uri uri) {\n        if (context == null) {\n            return false;\n        }\n\n        int pixels = PhotoMetadataUtils.getPixelsCount(context.getContentResolver(), uri);\n        return pixels <= spec.getMaxPixels();\n    }\n\n    public static boolean isLargerThanMinSize(Context context, SelectionSpec spec, Uri uri) {\n        if (context == null) {\n            return false;\n        }\n        Point p = PhotoMetadataUtils.getBitmapBound(context.getContentResolver(), uri);\n        return p.x >= spec.getMinWidthPixels() && p.y >= spec.getMinHeightPixels();\n    }\n\n    public static boolean isSmallerThanMaxSize(Context context, SelectionSpec spec, Uri uri) {\n        if (context == null) {\n            return false;\n        }\n\n        Point p = PhotoMetadataUtils.getBitmapBound(context.getContentResolver(), uri);\n        return p.x <= spec.getMaxWidthPixels() && p.y <= spec.getMaxHeightPixels();\n    }\n\n    public static boolean isSelectableType(Context context, SelectionSpec spec, Uri uri) {\n        if (context == null) {\n            return false;\n        }\n\n        ContentResolver resolver = context.getContentResolver();\n        for (MimeType type : spec.getMimeTypeSet()) {\n            if (type.checkType(resolver, uri)) {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    public static boolean shouldRotate(ContentResolver resolver, Uri uri) {\n        ExifInterface exif;\n        try {\n            exif = new ExifInterface(getPath(resolver, uri));\n        } catch (IOException e) {\n            Log.e(TAG, \"could not read exif info of the image: \" + uri);\n            return false;\n        }\n        int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, -1);\n        return orientation == ExifInterface.ORIENTATION_ROTATE_90\n                || orientation == ExifInterface.ORIENTATION_ROTATE_270;\n    }\n\n    static final class ContentResolverWrapper {\n        @Nullable\n        static InputStream openInputStream(ContentResolver resolver, Uri uri) throws FileNotFoundException {\n            try {\n                return resolver.openInputStream(uri);\n            } catch (NullPointerException e) {\n                // NPE may occur when `openInputStream` is called on Kyocera's device.\n                // > Attempt to invoke virtual method 'char[] java.lang.String.toCharArray()' on a null object reference\n                // That was \"kyocera original\" implement, so we cannot get bounds in this cause.\n                return null;\n            }\n        }\n    }\n\n}\n"
  },
  {
    "path": "laevatein/src/main/java/com/laevatein/internal/view/PreviewViewPager.java",
    "content": "package com.laevatein.internal.view;\n\nimport android.content.Context;\nimport androidx.viewpager.widget.ViewPager;\nimport android.util.AttributeSet;\nimport android.view.View;\n\nimport it.sephiroth.android.library.imagezoom.ImageViewTouch;\n\n/**\n * Created by hiroyuki.seto on 15/06/16.\n *\n * @hide\n */\npublic class PreviewViewPager extends ViewPager {\n\n    public PreviewViewPager(Context context, AttributeSet attrs) {\n        super(context, attrs);\n    }\n\n    @Override\n    protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) {\n        if (v instanceof ImageViewTouch) {\n            return ((ImageViewTouch) v).canScroll(dx) || super.canScroll(v, checkV, dx, x, y);\n        }\n        return super.canScroll(v, checkV, dx, x, y);\n    }\n}\n"
  },
  {
    "path": "laevatein/src/main/java/com/laevatein/ui/ImagePreviewActivity.java",
    "content": "/*\n * Copyright (C) 2014 nohana, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an &quot;AS IS&quot; BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage com.laevatein.ui;\n\nimport android.content.ContentUris;\nimport android.database.Cursor;\nimport android.net.Uri;\nimport android.os.Bundle;\nimport android.provider.MediaStore;\nimport androidx.viewpager.widget.ViewPager;\nimport androidx.appcompat.app.AppCompatActivity;\nimport android.view.Menu;\nimport android.view.MenuItem;\nimport android.widget.CheckBox;\n\nimport com.amalgam.os.BundleUtils;\nimport com.laevatein.R;\nimport com.laevatein.internal.entity.Album;\nimport com.laevatein.internal.entity.Item;\nimport com.laevatein.internal.entity.ViewResourceSpec;\nimport com.laevatein.internal.model.AlbumPhotoCollection;\nimport com.laevatein.internal.model.PreviewStateHolder;\nimport com.laevatein.internal.ui.PreviewFragment;\nimport com.laevatein.internal.ui.adapter.PreviewPagerAdapter;\nimport com.laevatein.internal.ui.helper.PreviewHelper;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport static com.laevatein.R.id.l_default_check_box;\n\n/**\n * @author KeithYokoma\n * @version 1.0.0\n * @hide\n * @since 2014/03/24\n */\npublic class ImagePreviewActivity extends AppCompatActivity implements AlbumPhotoCollection.AlbumPhotoCallbacks, PreviewPagerAdapter.OnPrimaryItemSetListener {\n    public static final String EXTRA_ITEM = BundleUtils.buildKey(ImagePreviewActivity.class, \"EXTRA_ITEM\");\n    public static final String EXTRA_ALBUM = BundleUtils.buildKey(ImagePreviewActivity.class, \"EXTRA_ALBUM\");\n    public static final String EXTRA_ERROR_SPEC = BundleUtils.buildKey(ImagePreviewActivity.class, \"EXTRA_ERROR_SPEC\");\n    public static final String EXTRA_SELECTION_SPEC = BundleUtils.buildKey(ImagePreviewActivity.class, \"EXTRA_SELECTION_SPEC\");\n    public static final String EXTRA_VIEW_SPEC = BundleUtils.buildKey(ImagePreviewActivity.class, \"EXTRA_VIEW_SPEC\");\n    public static final String EXTRA_DEFAULT_CHECKED = BundleUtils.buildKey(ImagePreviewActivity.class, \"EXTRA_DEFAULT_CHECKED\");\n    public static final String EXTRA_RESULT_CHECKED = BundleUtils.buildKey(ImagePreviewActivity.class, \"EXTRA_RESULT_CHECKED\");\n    private final PreviewStateHolder mStateHolder = new PreviewStateHolder(this);\n\n    private ViewPager mPager;\n    private CheckBox mCheckBox;\n\n    private final AlbumPhotoCollection mCollection = new AlbumPhotoCollection();\n    private boolean mIsAlreadySetPosition;\n\n    private int mPreviousPos = -1;\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        ViewResourceSpec spec = getIntent().getParcelableExtra(EXTRA_VIEW_SPEC);\n        setTheme(spec.getTheme());\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.l_activity_preview);\n        mStateHolder.onCreate();\n        mStateHolder.onRestoreInstanceState(savedInstanceState);\n        PreviewHelper.setUpActivity(this);\n        PreviewHelper.setUpActionBar(this);\n        mPager = findViewById(R.id.l_pager);\n        mCollection.onCreate(this, this);\n        Album album = getIntent().getParcelableExtra(EXTRA_ALBUM);\n        mCollection.load(album);\n    }\n\n    @Override\n    protected void onSaveInstanceState(Bundle outState) {\n        mStateHolder.onSaveInstanceState(outState);\n        super.onSaveInstanceState(outState);\n    }\n\n    @Override\n    public boolean onCreateOptionsMenu(Menu menu) {\n        getMenuInflater().inflate(R.menu.l_activity_image_preview, menu);\n        PreviewHelper.setUpActionItem(this, menu);\n        final MenuItem item = menu.findItem(R.id.l_action_selection_state);\n        mCheckBox = item.getActionView().findViewById(l_default_check_box);\n        return super.onCreateOptionsMenu(menu);\n    }\n\n    @Override\n    public boolean onOptionsItemSelected(MenuItem item) {\n        if (R.id.home == item.getItemId() || android.R.id.home == item.getItemId()) {\n            PreviewHelper.sendBackResult(this);\n            finish();\n            return true;\n        }\n        return super.onOptionsItemSelected(item);\n    }\n\n    @Override\n    public void onBackPressed() {\n        PreviewHelper.sendBackResult(this);\n        super.onBackPressed();\n    }\n\n    @Override\n    protected void onDestroy() {\n        super.onDestroy();\n        mCollection.onDestroy();\n    }\n\n    public PreviewStateHolder getStateHolder() {\n        return mStateHolder;\n    }\n\n    @Override\n    public void onLoad(Cursor cursor) {\n        List<Uri> uris = new ArrayList<>();\n        while (cursor.moveToNext()) {\n            final Item item = Item.valueOf(cursor);\n            Uri uri = ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, item.getId());\n            uris.add(uri);\n        }\n        PreviewPagerAdapter adapter = (PreviewPagerAdapter) mPager.getAdapter();\n        adapter.addAll(uris);\n        adapter.notifyDataSetChanged();\n        if (!mIsAlreadySetPosition) {\n            //onLoad is called many times..\n            mIsAlreadySetPosition = true;\n            Item selected = getIntent().getParcelableExtra(EXTRA_ITEM);\n            int selectedIndex = uris.indexOf(selected.buildContentUri());\n            mPager.setCurrentItem(selectedIndex, false);\n        }\n    }\n\n    @Override\n    public void onReset() {\n    }\n\n    @Override\n    public void onPrimaryItemSet(int position) {\n        if (!mIsAlreadySetPosition) {\n            return;\n        }\n\n        PreviewPagerAdapter adapter = (PreviewPagerAdapter) mPager.getAdapter();\n        if (mPreviousPos != -1 && mPreviousPos != position) {\n            ((PreviewFragment) adapter.instantiateItem(mPager, mPreviousPos)).resetView();\n\n            Uri uri = adapter.getUri(position);\n            if (mStateHolder.isChecked(uri)) {\n                mCheckBox.setChecked(true);\n            } else {\n                mCheckBox.setChecked(false);\n            }\n\n        }\n        mPreviousPos = position;\n    }\n}\n"
  },
  {
    "path": "laevatein/src/main/java/com/laevatein/ui/PhotoSelectionActivity.java",
    "content": "/*\n * Copyright (C) 2014 nohana, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an &quot;AS IS&quot; BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage com.laevatein.ui;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.content.res.Configuration;\nimport android.net.Uri;\nimport android.os.Bundle;\nimport androidx.core.view.GravityCompat;\nimport androidx.drawerlayout.widget.DrawerLayout;\nimport androidx.appcompat.app.AppCompatActivity;\nimport androidx.appcompat.widget.Toolbar;\nimport android.view.Menu;\nimport android.view.MenuItem;\nimport android.view.View;\n\nimport com.amalgam.os.BundleUtils;\nimport com.amalgam.os.HandlerUtils;\nimport com.laevatein.R;\nimport com.laevatein.internal.entity.Album;\nimport com.laevatein.internal.entity.ErrorViewSpec;\nimport com.laevatein.internal.entity.SelectionSpec;\nimport com.laevatein.internal.entity.ViewResourceSpec;\nimport com.laevatein.internal.misc.ui.ConfirmationDialogFragment;\nimport com.laevatein.internal.model.SelectedUriCollection;\nimport com.laevatein.internal.ui.AlbumListFragment;\nimport com.laevatein.internal.ui.SelectedCountFragment;\nimport com.laevatein.internal.ui.adapter.AlbumPhotoAdapter;\nimport com.laevatein.internal.ui.helper.PhotoSelectionActivityDrawerToggle;\nimport com.laevatein.internal.ui.helper.PhotoSelectionViewHelper;\nimport com.laevatein.internal.ui.helper.options.PhotoSelectionOptionsMenu;\nimport com.laevatein.internal.utils.ErrorViewUtils;\nimport com.laevatein.internal.utils.MediaStoreUtils;\n\nimport java.util.ArrayList;\n\n\n/**\n * @author KeithYokoma\n * @version 1.0.0\n * @since 2014/03/20\n */\npublic class PhotoSelectionActivity extends AppCompatActivity implements\n        AlbumListFragment.OnDirectorySelectListener,\n        ConfirmationDialogFragment.ConfirmationSelectionListener,\n        SelectedCountFragment.OnShowSelectedClickListener,\n        AlbumPhotoAdapter.BindViewListener {\n    public static final String EXTRA_VIEW_SPEC = BundleUtils.buildKey(PhotoSelectionActivity.class, \"EXTRA_VIEW_SPEC\");\n    public static final String EXTRA_RESUME_LIST = BundleUtils.buildKey(PhotoSelectionActivity.class, \"EXTRA_RESUME_LIST\");\n    public static final String EXTRA_SELECTION_SPEC = BundleUtils.buildKey(PhotoSelectionActivity.class, \"EXTRA_SELECTION_SPEC\");\n    public static final String EXTRA_RESULT_SELECTION = BundleUtils.buildKey(PhotoSelectionActivity.class, \"EXTRA_RESULT_SELECTION\");\n    public static final String EXTRA_ERROR_SPEC = BundleUtils.buildKey(PhotoSelectionActivity.class, \"EXTRA_ERROR_SPEC\");\n    public static final String STATE_CAPTURE_PHOTO_URI = BundleUtils.buildKey(PhotoSelectionActivity.class, \"STATE_CAPTURE_PHOTO_URI\");\n    public static final int REQUEST_CODE_CAPTURE = 1;\n    public static final int REQUEST_CODE_PREVIEW = 2;\n    private final SelectedUriCollection mCollection = new SelectedUriCollection(this);\n    private MediaStoreUtils mMediaStoreUtils;\n    private PhotoSelectionActivityDrawerToggle mToggle;\n    private DrawerLayout mDrawer;\n    private String mCapturePhotoUriHolder;\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        ViewResourceSpec spec = getIntent().getParcelableExtra(EXTRA_VIEW_SPEC);\n        setTheme(spec.getTheme());\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.l_activity_select_photo);\n        PhotoSelectionViewHelper.setUpActivity(this);\n        SelectionSpec selectionSpec = getIntent().getParcelableExtra(EXTRA_SELECTION_SPEC);\n        PhotoSelectionViewHelper.setAlbumList(this, selectionSpec.getDefaultAlbumId());\n        PhotoSelectionViewHelper.setUpCounter(this);\n        mMediaStoreUtils = new MediaStoreUtils(this, HandlerUtils.getMainHandler());\n        mCapturePhotoUriHolder = savedInstanceState != null ? savedInstanceState.getString(STATE_CAPTURE_PHOTO_URI) : \"\";\n        mCollection.onCreate(savedInstanceState);\n        mCollection.prepareSelectionSpec(getIntent().<SelectionSpec>getParcelableExtra(EXTRA_SELECTION_SPEC));\n        mCollection.setDefaultSelection(getIntent().<Uri>getParcelableArrayListExtra(EXTRA_RESUME_LIST));\n        mDrawer = findViewById(R.id.l_container_drawer);\n        Toolbar toolbar = findViewById(R.id.l_toolbar);\n        mToggle = new PhotoSelectionActivityDrawerToggle(this, mDrawer, toolbar);\n        setSupportActionBar(toolbar);\n        mToggle.setUpActionBar(getSupportActionBar());\n        mDrawer.addDrawerListener(mToggle);\n    }\n\n    @Override\n    protected void onPostCreate(Bundle savedInstanceState) {\n        super.onPostCreate(savedInstanceState);\n        mToggle.syncState();\n    }\n\n    @Override\n    protected void onSaveInstanceState(Bundle outState) {\n        mCollection.onSaveInstanceState(outState);\n        outState.putString(STATE_CAPTURE_PHOTO_URI, mCapturePhotoUriHolder);\n        super.onSaveInstanceState(outState);\n    }\n\n    @Override\n    public void onConfigurationChanged(Configuration newConfig) {\n        super.onConfigurationChanged(newConfig);\n        mToggle.onConfigurationChanged(newConfig);\n    }\n\n    @Override\n    protected void onDestroy() {\n        mMediaStoreUtils.destroy();\n        super.onDestroy();\n    }\n\n    @Override\n    protected void onActivityResult(int requestCode, int resultCode, Intent data) {\n        super.onActivityResult(requestCode, resultCode, data);\n\n        if (requestCode == REQUEST_CODE_CAPTURE && resultCode == Activity.RESULT_OK) {\n            Uri captured = mMediaStoreUtils.getCapturedPhotoUri(data, mCapturePhotoUriHolder);\n            if (captured != null) {\n                mCollection.add(captured);\n                mMediaStoreUtils.cleanUp(mCapturePhotoUriHolder);\n            }\n            supportInvalidateOptionsMenu();\n        } else if (requestCode == REQUEST_CODE_PREVIEW && resultCode == Activity.RESULT_OK) {\n            ArrayList<Uri> checked = data.getParcelableArrayListExtra(ImagePreviewActivity.EXTRA_RESULT_CHECKED);\n            mCollection.overwrite(checked);\n            PhotoSelectionViewHelper.refreshGridView(this);\n            supportInvalidateOptionsMenu();\n        }\n    }\n\n    @Override\n    public boolean onCreateOptionsMenu(Menu menu) {\n        getMenuInflater().inflate(R.menu.l_activity_options_select_photo, menu);\n        return super.onCreateOptionsMenu(menu);\n    }\n\n    @Override\n    public boolean onPrepareOptionsMenu(Menu menu) {\n        PhotoSelectionViewHelper.refreshOptionsMenuState(this, mCollection, menu);\n        return super.onPrepareOptionsMenu(menu);\n    }\n\n    @Override\n    public boolean onOptionsItemSelected(MenuItem item) {\n        PhotoSelectionOptionsMenu menu = PhotoSelectionOptionsMenu.valueOf(item);\n        return mToggle.onOptionsItemSelected(item) || menu.getHandler().handle(this, null) || super.onOptionsItemSelected(item);\n    }\n\n    @Override\n    public void onBackPressed() {\n        if (mCollection.isEmpty()) {\n            setResult(Activity.RESULT_CANCELED);\n            super.onBackPressed();\n            return;\n        }\n        ErrorViewSpec spec = getIntent().getParcelableExtra(PhotoSelectionActivity.EXTRA_ERROR_SPEC);\n        ErrorViewUtils.showConfirmDialog(this, spec.getBackConfirmSpec());\n    }\n\n    @Override\n    public void onSelect(Album album) {\n        PhotoSelectionViewHelper.setPhotoGridFragment(this, mDrawer, album);\n    }\n\n    @Override\n    public final void onClickSelectedView() {\n        PhotoSelectionViewHelper.setSelectedGridFragment(this);\n    }\n\n    @Override\n    public void onBindView(Context context, View view, Uri uri) {\n    }\n\n    public final SelectedUriCollection getCollection() {\n        return mCollection;\n    }\n\n    public final MediaStoreUtils getMediaStoreUtils() {\n        return mMediaStoreUtils;\n    }\n\n    public final void prepareCapture(String uri) {\n        mCapturePhotoUriHolder = uri;\n    }\n\n    public final boolean isDrawerOpen() {\n        return mDrawer != null && mDrawer.isDrawerOpen(GravityCompat.START);\n    }\n\n    @Override\n    public void onPositive() {\n        setResult(Activity.RESULT_CANCELED);\n        finish();\n    }\n\n    @Override\n    public void onNegative() {\n        // nothing to do.\n    }\n}"
  },
  {
    "path": "laevatein/src/main/res/drawable/l_bg_drawer_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:state_checked=\"true\">\n        <layer-list>\n            <item>\n                <shape android:shape=\"rectangle\">\n                    <solid android:color=\"@color/l_bg_item_selected\" />\n                </shape>\n            </item>\n        </layer-list>\n    </item>\n    <item android:state_pressed=\"true\">\n        <layer-list>\n            <item>\n                <shape android:shape=\"rectangle\">\n                    <solid android:color=\"@color/l_bg_item_selected\" />\n                </shape>\n            </item>\n        </layer-list>\n    </item>\n</selector>"
  },
  {
    "path": "laevatein/src/main/res/drawable/l_ic_capture.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<selector\n    xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:state_pressed=\"true\" android:drawable=\"@drawable/l_ic_capture_pressed\"/>\n    <item                              android:drawable=\"@drawable/l_ic_capture_normal\"/>\n</selector>"
  },
  {
    "path": "laevatein/src/main/res/drawable/l_ic_capture_normal.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item>\n        <shape android:shape=\"rectangle\">\n            <solid android:color=\"#333\"/>\n        </shape>\n    </item>\n    <item>\n        <inset\n            android:drawable=\"@drawable/l_ic_action_camera\"\n            android:insetBottom=\"8dp\"\n            android:insetLeft=\"8dp\"\n            android:insetRight=\"8dp\"\n            android:insetTop=\"8dp\"/>\n    </item>\n</layer-list>"
  },
  {
    "path": "laevatein/src/main/res/drawable/l_ic_capture_pressed.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item>\n        <shape android:shape=\"rectangle\">\n            <solid android:color=\"#111\"/>\n        </shape>\n    </item>\n    <item>\n        <inset\n            android:drawable=\"@drawable/l_ic_action_camera\"\n            android:insetBottom=\"8dp\"\n            android:insetLeft=\"8dp\"\n            android:insetRight=\"8dp\"\n            android:insetTop=\"8dp\"/>\n    </item>\n</layer-list>"
  },
  {
    "path": "laevatein/src/main/res/drawable/l_ic_folder.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:drawable=\"@drawable/l_ic_folder_open\" android:state_checked=\"true\" />\n    <item android:drawable=\"@drawable/l_ic_folder_close\" />\n</selector>"
  },
  {
    "path": "laevatein/src/main/res/drawable/l_ic_folder_close.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M10,4H4c-1.1,0 -1.99,0.9 -1.99,2L2,18c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2V8c0,-1.1 -0.9,-2 -2,-2h-8l-2,-2z\"/>\n</vector>\n"
  },
  {
    "path": "laevatein/src/main/res/drawable/l_ic_folder_open.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M20,6h-8l-2,-2L4,4c-1.1,0 -1.99,0.9 -1.99,2L2,18c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,8c0,-1.1 -0.9,-2 -2,-2zM20,18L4,18L4,8h16v10z\"/>\n</vector>\n"
  },
  {
    "path": "laevatein/src/main/res/drawable/l_list_selector_drawer_menu.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:state_window_focused=\"false\" android:state_checked=\"true\">\n        <color android:color=\"@android:color/background_dark\"/>\n    </item>\n    <item android:state_window_focused=\"false\">\n        <color android:color=\"@android:color/transparent\" />\n    </item>\n\n    <!-- Even though these two point to the same resource, have two states so the drawable will invalidate itself when coming out of pressed state. -->\n    <item                                      android:state_focused=\"true\"                                android:state_pressed=\"true\">\n        <color android:color=\"@android:color/darker_gray\" />\n    </item>\n    <item                                      android:state_focused=\"false\"                               android:state_pressed=\"true\">\n        <color android:color=\"@android:color/darker_gray\" />\n    </item>\n    <item android:state_checked=\"true\"         android:state_focused=\"true\">\n        <color android:color=\"@android:color/background_dark\" />\n    </item>\n    <item                                      android:state_focused=\"true\">\n        <color android:color=\"@android:color/background_dark\" />\n    </item>\n    <item android:state_checked=\"true\">\n        <color android:color=\"@android:color/background_dark\" />\n    </item>\n</selector>"
  },
  {
    "path": "laevatein/src/main/res/drawable-v21/l_bg_drawer_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:state_checked=\"true\">\n        <layer-list>\n            <item>\n                <shape android:shape=\"rectangle\">\n                    <solid android:color=\"@color/l_bg_item_selected\" />\n                </shape>\n            </item>\n            <item>\n                <ripple android:color=\"?attr/colorControlHighlight\" />\n            </item>\n        </layer-list>\n    </item>\n    <item>\n        <ripple android:color=\"?attr/colorControlHighlight\" />\n    </item>\n</selector>"
  },
  {
    "path": "laevatein/src/main/res/layout/l_action_layout_checkbox.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<CheckBox xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@+id/l_default_check_box\"\n    style=\"?attr/l_actionStyle\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\" />"
  },
  {
    "path": "laevatein/src/main/res/layout/l_activity_preview.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <androidx.appcompat.widget.Toolbar\n        android:id=\"@+id/l_toolbar\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignParentTop=\"true\"\n        android:theme=\"?attr/l_toolbarTheme\" />\n\n    <com.laevatein.internal.view.PreviewViewPager\n        android:id=\"@+id/l_pager\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_below=\"@+id/l_toolbar\" />\n</RelativeLayout>"
  },
  {
    "path": "laevatein/src/main/res/layout/l_activity_select_photo.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.drawerlayout.widget.DrawerLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/l_container_drawer\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:transitionName=\"@string/l_content_transition_name\"\n    tools:context=\"com.laevatein.ui.PhotoSelectionActivity\">\n\n    <RelativeLayout\n        android:id=\"@+id/l_content\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n\n        <com.google.android.material.appbar.AppBarLayout\n            android:id=\"@+id/l_app_bar\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\">\n\n            <androidx.appcompat.widget.Toolbar\n                android:id=\"@+id/l_toolbar\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:theme=\"?attr/l_toolbarTheme\" />\n        </com.google.android.material.appbar.AppBarLayout>\n\n        <FrameLayout\n            android:id=\"@+id/l_container_grid_fragment\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:layout_below=\"@id/l_app_bar\" />\n    </RelativeLayout>\n\n    <FrameLayout\n        android:id=\"@+id/l_container_album_list\"\n        android:layout_width=\"@dimen/l_drawerMenuWidth\"\n        android:layout_height=\"match_parent\"\n        android:layout_gravity=\"start\" />\n</androidx.drawerlayout.widget.DrawerLayout>"
  },
  {
    "path": "laevatein/src/main/res/layout/l_fragment_default_preview.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<it.sephiroth.android.library.imagezoom.ImageViewTouch xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@+id/l_default_image_zoom_view\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\" />"
  },
  {
    "path": "laevatein/src/main/res/layout/l_fragment_grid_photo.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <TextView\n        android:id=\"@+id/l_label_empty\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerInParent=\"true\" />\n\n    <androidx.recyclerview.widget.RecyclerView\n        android:id=\"@+id/l_recyclerview\"\n        style=\"?attr/l_gridStyle\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:clipChildren=\"false\"\n        android:clipToPadding=\"false\" />\n\n</RelativeLayout>"
  },
  {
    "path": "laevatein/src/main/res/layout/l_fragment_list_album.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ListView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@+id/l_list_album\"\n    style=\"?attr/l_drawerStyle\"\n    android:layout_width=\"@dimen/l_drawerMenuWidth\"\n    android:layout_height=\"match_parent\"\n    android:choiceMode=\"singleChoice\" />"
  },
  {
    "path": "laevatein/src/main/res/layout/l_fragment_selected_count.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<TextView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@+id/l_container_count_view\"\n    style=\"?attr/l_counterStyle\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\" />"
  },
  {
    "path": "laevatein/src/main/res/layout/l_grid_item_default_photo.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<com.laevatein.internal.misc.widget.SquareGridViewItemRelativeLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n    <ImageView\n        android:id=\"@+id/l_default_grid_image\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"/>\n    <CheckBox\n        android:id=\"@+id/l_default_check_box\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignParentTop=\"true\"\n        android:layout_alignParentRight=\"true\"\n        android:layout_alignParentEnd=\"true\" />\n</com.laevatein.internal.misc.widget.SquareGridViewItemRelativeLayout>"
  },
  {
    "path": "laevatein/src/main/res/layout/l_list_item_default_album.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<CheckedTextView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    style=\"?attr/l_drawerItemStyle\"\n    android:id=\"@+id/l_default_directory_label\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\" />"
  },
  {
    "path": "laevatein/src/main/res/layout/l_view_counter.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<fragment xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/l_fragment_selected_count\"\n    android:name=\"com.laevatein.internal.ui.SelectedCountFragment\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    tools:layout=\"@layout/l_fragment_selected_count\" />\n"
  },
  {
    "path": "laevatein/src/main/res/menu/l_activity_image_preview.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:compat=\"http://schemas.android.com/apk/res-auto\">\n    <item\n        android:id=\"@+id/l_action_selection_state\"\n        android:title=\"\"\n        compat:showAsAction=\"always\"/>\n</menu>"
  },
  {
    "path": "laevatein/src/main/res/menu/l_activity_options_select_photo.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:compat=\"http://schemas.android.com/apk/res-auto\">\n    <item\n        android:id=\"@+id/action_finish_select\"\n        android:title=\"@string/l_action_finish_select\"\n        compat:showAsAction=\"always\"/>\n</menu>"
  },
  {
    "path": "laevatein/src/main/res/values/attrs.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <attr name=\"l_toolbarTheme\" format=\"reference\" />\n    <attr name=\"l_drawerStyle\" format=\"reference\" />\n    <attr name=\"l_drawerItemStyle\" format=\"reference\" />\n    <attr name=\"l_drawerHeaderLayout\" format=\"reference\" />\n    <attr name=\"l_gridStyle\" format=\"reference\" />\n    <attr name=\"l_counterStyle\" format=\"reference\" />\n    <attr name=\"l_actionStyle\" format=\"reference\" />\n</resources>"
  },
  {
    "path": "laevatein/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"l_bg_item_selected\">#1b000000</color>\n</resources>"
  },
  {
    "path": "laevatein/src/main/res/values/dimens.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <!-- for drawers -->\n    <dimen name=\"l_drawerMenuWidth\">280dp</dimen>\n    <dimen name=\"grid_spacing\">2dp</dimen>\n</resources>"
  },
  {
    "path": "laevatein/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"l_content_desc_open_drawer\">Open menu</string>\n    <string name=\"l_content_desc_close_drawer\">Close menu</string>\n\n    <string name=\"l_action_finish_select\">Done</string>\n    <string name=\"l_action_cancel_select\">Cancel</string>\n\n    <string name=\"l_confirm_dialog_title\">Attention</string>\n    <string name=\"l_confirm_dialog_message\">Are your sure you want to discard the selection?</string>\n\n    <string name=\"l_format_selection_count\">Selected items(%1$d / %2$d)</string>\n\n    <string name=\"l_error_invalid_format\">Not allowed to select this photo due to invalid file format.</string>\n    <string name=\"l_error_quality\">Not allowed to select this photo due to not enough quality.</string>\n    <string name=\"l_error_size\">Not allowed to select this photo due to not suitable size.</string>\n\n    <string name=\"l_album_name_all\">All Photos</string>\n    <string name=\"l_album_name_selected\">Selected Photos</string>\n    <string name=\"l_album_name_camera\">Camera</string>\n    <string name=\"l_album_name_download\">Download</string>\n    <string name=\"l_album_name_screen_shot\">Screenshot</string>\n\n    <string name=\"l_empty_photo\">No photo.</string>\n    <string name=\"l_empty_selection\">Nothing selected.</string>\n    <string name=\"l_action_counter\">0</string>\n\n    <string name=\"l_detail_photo_title\">Photo Detail</string>\n\n    <string name=\"l_content_transition_name\">ContentsTransition</string>\n</resources>\n"
  },
  {
    "path": "laevatein/src/main/res/values/styles.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <style name=\"L_DefaultTheme\" parent=\"Theme.AppCompat.Light.NoActionBar\">\n        <!-- Customize your theme here. -->\n        <item name=\"l_drawerStyle\">@style/L_DrawerMenu</item>\n        <item name=\"l_drawerItemStyle\">@style/L_DrawerMenuItem</item>\n        <item name=\"l_gridStyle\">@style/L_Grid</item>\n        <item name=\"l_counterStyle\">@style/L_Counter</item>\n    </style>\n\n    <style name=\"L_DrawerMenu\">\n        <item name=\"android:background\">?android:attr/windowBackground</item>\n        <item name=\"android:divider\">@null</item>\n        <item name=\"android:dividerHeight\">0dp</item>\n    </style>\n\n    <style name=\"L_DrawerMenuItem\">\n        <item name=\"android:background\">@drawable/l_bg_drawer_item</item>\n        <item name=\"android:paddingLeft\">16dp</item>\n        <item name=\"android:paddingRight\">16dp</item>\n        <item name=\"android:gravity\">center_vertical</item>\n        <item name=\"android:minHeight\">48dp</item>\n        <item name=\"android:drawablePadding\">32dp</item>\n        <item name=\"android:ellipsize\">end</item>\n        <item name=\"android:drawableLeft\">@drawable/l_ic_folder</item>\n        <item name=\"android:textAppearance\">@style/TextAppearance.AppCompat.Body1</item>\n    </style>\n\n    <style name=\"L_Grid\">\n        <item name=\"android:padding\">2dp</item>\n        <item name=\"android:scrollbars\">vertical</item>\n        <item name=\"android:scrollbarStyle\">outsideOverlay</item>\n    </style>\n\n    <style name=\"L_Base.Counter\" parent=\"android:Widget\">\n        <item name=\"android:background\">?android:attr/windowBackground</item>\n        <item name=\"android:height\">48dp</item>\n        <item name=\"android:gravity\">center</item>\n        <item name=\"android:textAppearance\">@style/TextAppearance.AppCompat.Body1</item>\n    </style>\n\n    <style name=\"L_Counter\" parent=\"L_Base.Counter\" />\n\n    <style name=\"L_Counter.AppBar\" parent=\"L_Counter\" />\n</resources>"
  },
  {
    "path": "laevatein/src/main/res/values-ja/strings.xml",
    "content": "<resources>\n    <string name=\"l_content_desc_open_drawer\">メニューを開く</string>\n    <string name=\"l_content_desc_close_drawer\">メニューを閉じる</string>\n\n    <string name=\"l_action_finish_select\">完了</string>\n    <string name=\"l_action_cancel_select\">キャンセル</string>\n\n    <string name=\"l_confirm_dialog_title\">確認</string>\n    <string name=\"l_confirm_dialog_message\">写真の選択を破棄してもよろしいですか?</string>\n\n    <string name=\"l_error_invalid_format\">選択できない形式の写真です</string>\n    <string name=\"l_error_quality\">画質が不十分な写真です</string>\n\n    <string name=\"l_format_selection_count\">選択中(%1$d / %2$d)</string>\n\n    <string name=\"l_album_name_all\">全ての写真</string>\n    <string name=\"l_album_name_selected\">選択した写真</string>\n    <string name=\"l_album_name_camera\">カメラ</string>\n    <string name=\"l_album_name_download\">ダウンロード</string>\n    <string name=\"l_album_name_screen_shot\">スクリーンショット</string>\n\n    <string name=\"l_empty_photo\">写真がありません。</string>\n    <string name=\"l_empty_selection\">写真を選択していません。</string>\n\n    <string name=\"l_detail_photo_title\">写真詳細</string>\n</resources>\n"
  },
  {
    "path": "laevatein/src/main/res/values-v21/styles.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <style name=\"L_Counter\" parent=\"L_Base.Counter\">\n        <item name=\"android:elevation\">8dp</item>\n    </style>\n\n    <style name=\"L_Counter.AppBar\" parent=\"L_Counter\">\n        <item name=\"android:elevation\">0dp</item>\n    </style>\n</resources>"
  },
  {
    "path": "laevatein/src/test/java/com/laevatein/LaevateinTest.java",
    "content": "package com.laevatein;\n\nimport android.app.Activity;\nimport android.content.Intent;\nimport android.net.Uri;\nimport android.os.Parcelable;\n\nimport com.laevatein.ui.PhotoSelectionActivity;\n\nimport org.junit.Before;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.robolectric.RobolectricTestRunner;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertNotNull;\nimport static org.junit.Assert.assertSame;\n\n/**\n * @author keishin.yokomaku\n * @since 2014/04/01\n */\n@RunWith(RobolectricTestRunner.class)\npublic class LaevateinTest {\n    private Activity mActivity;\n\n    @Before\n    public void setUp() throws Exception {\n        mActivity = new Activity();\n    }\n\n    @Test\n    public void from_returnsLaevatein() throws Exception {\n        Laevatein laevatein = Laevatein.from(mActivity);\n        assertNotNull(laevatein.getActivity());\n    }\n\n    @Test\n    public void obtainResult_returnsSomeUri() throws Exception {\n        List<Uri> mock = new ArrayList<Uri>() {{ add(Uri.parse(\"content://hogehoge/fugafuga/1\")); }};\n        Intent data = new Intent();\n        data.putParcelableArrayListExtra(PhotoSelectionActivity.EXTRA_RESULT_SELECTION, (ArrayList<? extends Parcelable>) mock);\n\n        List<Uri> uris = Laevatein.obtainResult(data);\n        assertNotNull(uris);\n        assertSame(mock, uris);\n        assertEquals(mock, uris);\n    }\n}\n"
  },
  {
    "path": "laevatein/src/test/java/com/laevatein/MimeTypeTest.java",
    "content": "package com.laevatein;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.robolectric.RobolectricTestRunner;\n\nimport java.util.Set;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertTrue;\n\n/**\n * @author keishin.yokomaku\n * @since 2014/03/31\n */\n@RunWith(RobolectricTestRunner.class)\npublic class MimeTypeTest {\n    @Test\n    public void oneOf() throws Exception {\n        {\n            Set<MimeType> set = MimeType.of(MimeType.JPEG);\n            assertEquals(1, set.size());\n            assertTrue(set.contains(MimeType.JPEG));\n            assertFalse(set.contains(MimeType.PNG));\n            assertFalse(set.contains(MimeType.GIF));\n        }\n\n        {\n            Set<MimeType> set = MimeType.of(MimeType.PNG);\n            assertEquals(1, set.size());\n            assertFalse(set.contains(MimeType.JPEG));\n            assertTrue(set.contains(MimeType.PNG));\n            assertFalse(set.contains(MimeType.GIF));\n        }\n\n        {\n            Set<MimeType> set = MimeType.of(MimeType.GIF);\n            assertEquals(1, set.size());\n            assertFalse(set.contains(MimeType.JPEG));\n            assertFalse(set.contains(MimeType.PNG));\n            assertTrue(set.contains(MimeType.GIF));\n        }\n    }\n\n    @Test\n    public void someOf() throws Exception {\n        {\n            Set<MimeType> set = MimeType.of(MimeType.JPEG, MimeType.PNG);\n            assertEquals(2, set.size());\n            assertTrue(set.contains(MimeType.JPEG));\n            assertTrue(set.contains(MimeType.PNG));\n            assertFalse(set.contains(MimeType.GIF));\n        }\n\n        {\n            Set<MimeType> set = MimeType.of(MimeType.JPEG, MimeType.GIF);\n            assertEquals(2, set.size());\n            assertTrue(set.contains(MimeType.JPEG));\n            assertFalse(set.contains(MimeType.PNG));\n            assertTrue(set.contains(MimeType.GIF));\n        }\n\n        {\n            Set<MimeType> set = MimeType.of(MimeType.PNG, MimeType.GIF);\n            assertEquals(2, set.size());\n            assertFalse(set.contains(MimeType.JPEG));\n            assertTrue(set.contains(MimeType.PNG));\n            assertTrue(set.contains(MimeType.GIF));\n        }\n\n        {\n            Set<MimeType> set = MimeType.of(MimeType.JPEG, MimeType.PNG, MimeType.GIF);\n            assertEquals(3, set.size());\n            assertTrue(set.contains(MimeType.JPEG));\n            assertTrue(set.contains(MimeType.PNG));\n            assertTrue(set.contains(MimeType.GIF));\n        }\n    }\n\n    @Test\n    public void allOf() throws Exception {\n        Set<MimeType> set = MimeType.allOf();\n        assertEquals(3, set.size());\n        assertTrue(set.contains(MimeType.JPEG));\n        assertTrue(set.contains(MimeType.PNG));\n        assertTrue(set.contains(MimeType.GIF));\n    }\n\n    @Test\n    public void stringify() throws Exception {\n        assertEquals(\"image/jpeg\", MimeType.JPEG.toString());\n        assertEquals(\"image/png\", MimeType.PNG.toString());\n        assertEquals(\"image/gif\", MimeType.GIF.toString());\n    }\n}\n"
  },
  {
    "path": "laevatein/src/test/java/com/laevatein/SelectionSpecBuilderTest.java",
    "content": "package com.laevatein;\n\nimport android.app.Activity;\nimport android.content.Intent;\nimport android.net.Uri;\n\nimport com.laevatein.ui.PhotoSelectionActivity;\n\nimport org.junit.Before;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.robolectric.RobolectricTestRunner;\n\nimport java.util.ArrayList;\nimport java.util.concurrent.CountDownLatch;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertNotNull;\n\n/**\n * @author keishin.yokomaku\n * @since 2014/03/31\n */\n@RunWith(RobolectricTestRunner.class)\npublic class SelectionSpecBuilderTest {\n    private static final int MOCK_REQUEST_CODE = 1;\n    private SelectionSpecBuilder mBuilder;\n    private CountDownLatch mLatch;\n\n    @Before\n    public void setUp() throws Exception {\n        mLatch = new CountDownLatch(1);\n        Laevatein laevatein = Laevatein.from(new Activity() {\n            @Override\n            public void startActivityForResult(Intent intent, int requestCode) {\n                mLatch.countDown();\n                assertEquals(MOCK_REQUEST_CODE, requestCode);\n                ensureAllExtrasExist(intent);\n\n                assertEquals(PhotoSelectionActivity.class.getCanonicalName(),\n                        intent.getComponent().getClassName());\n            }\n\n            @Override\n            public String getPackageName() {\n                // XXX\n                return \"com.laevatein\";\n            }\n        });\n        assertNotNull(laevatein);\n\n        mBuilder = laevatein.choose(MimeType.of(MimeType.JPEG));\n        assertNotNull(mBuilder);\n    }\n\n    private void ensureAllExtrasExist(Intent intent) {\n        assertNotNull(intent.getParcelableExtra(PhotoSelectionActivity.EXTRA_SELECTION_SPEC));\n        assertNotNull(intent.getParcelableArrayListExtra(PhotoSelectionActivity.EXTRA_RESUME_LIST));\n        assertNotNull(intent.getParcelableExtra(PhotoSelectionActivity.EXTRA_VIEW_SPEC));\n        assertNotNull(intent.getParcelableExtra(PhotoSelectionActivity.EXTRA_ERROR_SPEC));\n    }\n\n    @Test\n    public void count() throws Exception {\n        mBuilder = mBuilder.count(0, 10);\n        assertNotNull(mBuilder);\n\n        mBuilder.forResult(MOCK_REQUEST_CODE);\n        mLatch.await();\n    }\n\n    @Test\n    public void enableCapture() throws Exception {\n        mBuilder = mBuilder.enableCapture(\"com.test.authorities\");\n        assertNotNull(mBuilder);\n\n        mBuilder.forResult(MOCK_REQUEST_CODE);\n        mLatch.await();\n    }\n\n    @Test\n    public void disableCapture() throws Exception {\n        mBuilder = mBuilder.disableCapture();\n        assertNotNull(mBuilder);\n\n        mBuilder.forResult(MOCK_REQUEST_CODE);\n        mLatch.await();\n    }\n\n    @Test\n    public void quality() throws Exception {\n        mBuilder = mBuilder.quality(0, 100);\n        assertNotNull(mBuilder);\n\n        mBuilder.forResult(MOCK_REQUEST_CODE);\n        mLatch.await();\n    }\n\n    @Test\n    public void size() throws Exception {\n        mBuilder = mBuilder.size(0, 100);\n        assertNotNull(mBuilder);\n\n        mBuilder.forResult(MOCK_REQUEST_CODE);\n        mLatch.await();\n    }\n\n    @Test\n    public void resume() throws Exception {\n        mBuilder = mBuilder.resume(new ArrayList<Uri>());\n        assertNotNull(mBuilder);\n\n        mBuilder.forResult(MOCK_REQUEST_CODE);\n        mLatch.await();\n    }\n\n    // FIXME cannot resolve R while using unit testing support for now\n//    public void testBindItemViewSpec() throws Exception {\n//        mBuilder = mBuilder.bindEachImageWith(R.layout.l_grid_item_default_photo, R.id.l_default_grid_image, R.id.l_default_check_box);\n//        assertNotNull(mBuilder);\n//\n//        mBuilder.forResult(MOCK_REQUEST_CODE);\n//        mLatch.await();\n//    }\n//\n//    public void testBindAlbumViewSpec() throws Exception {\n//        mBuilder = mBuilder.bindEachAlbumWith(R.layout.l_list_item_default_album, R.id.l_default_list_image, R.id.l_default_directory_label);\n//        assertNotNull(mBuilder);\n//\n//        mBuilder.forResult(MOCK_REQUEST_CODE);\n//        mLatch.await();\n//    }\n}"
  },
  {
    "path": "laevatein/src/test/java/com/laevatein/internal/entity/AlbumTest.java",
    "content": "package com.laevatein.internal.entity;\n\nimport android.database.MatrixCursor;\nimport android.provider.MediaStore;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.robolectric.RobolectricTestRunner;\nimport org.robolectric.RuntimeEnvironment;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertNotNull;\nimport static org.junit.Assert.assertTrue;\n\n/**\n * @author KeithYokoma\n * @since 2014/04/01\n */\n@RunWith(RobolectricTestRunner.class)\npublic class AlbumTest {\n    private static final String[] MOCK_PROJECTION = new String[]{MediaStore.Images.Media._ID, MediaStore.Images.Media.BUCKET_ID, MediaStore.Images.Media.BUCKET_DISPLAY_NAME};\n\n    @Test\n    public void camera() throws Exception {\n        MatrixCursor cameraRow = new MatrixCursor(MOCK_PROJECTION);\n        cameraRow.addRow(new String[]{\"1\", \"1\", \"Camera\"});\n        assertTrue(cameraRow.moveToFirst());\n        Album camera = Album.valueOf(cameraRow);\n        assertNotNull(camera);\n        assertFalse(camera.isAll());\n        assertTrue(camera.isCamera());\n        assertEquals(1L, camera.getCoverId());\n        assertEquals(\"1\", camera.getId());\n        assertEquals(\"Camera\", camera.getDisplayName(RuntimeEnvironment.application));\n    }\n\n    @Test\n    public void all() throws Exception {\n        MatrixCursor allRow = new MatrixCursor(MOCK_PROJECTION);\n        allRow.addRow(new String[]{Album.ALBUM_ID_ALL, \"-1\", \"All\"});\n        assertTrue(allRow.moveToFirst());\n        Album all = Album.valueOf(allRow);\n        assertNotNull(all);\n        assertTrue(all.isAll());\n        assertFalse(all.isCamera());\n        assertEquals(-1L, all.getCoverId());\n        assertEquals(Album.ALBUM_ID_ALL, all.getId());\n        assertEquals(\"All Photos\", all.getDisplayName(RuntimeEnvironment.application));\n    }\n\n    @Test\n    public void download() throws Exception {\n        MatrixCursor downloadRow = new MatrixCursor(MOCK_PROJECTION);\n        downloadRow.addRow(new String[]{\"2\", \"2\", \"Download\"});\n        assertTrue(downloadRow.moveToFirst());\n        Album download = Album.valueOf(downloadRow);\n        assertNotNull(download);\n        assertFalse(download.isAll());\n        assertFalse(download.isCamera());\n        assertEquals(2L, download.getCoverId());\n        assertEquals(\"2\", download.getId());\n        assertEquals(\"Download\", download.getDisplayName(RuntimeEnvironment.application));\n    }\n\n    @Test\n    public void screenshot() throws Exception {\n        MatrixCursor screenShotRow = new MatrixCursor(MOCK_PROJECTION);\n        screenShotRow.addRow(new String[]{\"3\", \"3\", \"Screenshots\"});\n        assertTrue(screenShotRow.moveToFirst());\n        Album screenShot = Album.valueOf(screenShotRow);\n        assertNotNull(screenShot);\n        assertFalse(screenShot.isAll());\n        assertFalse(screenShot.isCamera());\n        assertEquals(3L, screenShot.getCoverId());\n        assertEquals(\"3\", screenShot.getId());\n        assertEquals(\"Screenshot\", screenShot.getDisplayName(RuntimeEnvironment.application));\n    }\n}\n"
  },
  {
    "path": "laevatein/src/test/resources/com/laevatein/robolectric.properties",
    "content": "sdk=23\nconstants=com.laevatein.BuildConfig"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.10.0/Laevatein-0.10.0.aar.md5",
    "content": "4f643bfe2c7071a32d7ae068d810ed59"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.10.0/Laevatein-0.10.0.aar.sha1",
    "content": "97376903ff26d05ecd478e82025878bc29a84497"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.10.0/Laevatein-0.10.0.pom",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\" xmlns=\"http://maven.apache.org/POM/4.0.0\"\n    xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n  <modelVersion>4.0.0</modelVersion>\n  <groupId>com.laevatein</groupId>\n  <artifactId>Laevatein</artifactId>\n  <version>0.10.0</version>\n  <packaging>aar</packaging>\n  <dependencies>\n    <dependency>\n      <groupId>jp.yokomark.widget</groupId>\n      <artifactId>CompoundContainers</artifactId>\n      <version>0.9.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>jp.mixi.compatibility</groupId>\n      <artifactId>AndroidDeviceCompatibility</artifactId>\n      <version>0.1.0</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.amalgam</groupId>\n      <artifactId>Amalgam</artifactId>\n      <version>0.3.2</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.google.code.findbugs</groupId>\n      <artifactId>jsr305</artifactId>\n      <version>2.0.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.android.support</groupId>\n      <artifactId>support-v4</artifactId>\n      <version>19.0.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.squareup.picasso</groupId>\n      <artifactId>picasso</artifactId>\n      <version>2.1.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>it.sephiroth.android.library.imagezoom</groupId>\n      <artifactId>library</artifactId>\n      <version>+</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.android.support</groupId>\n      <artifactId>appcompat-v7</artifactId>\n      <version>19.0.1</version>\n      <scope>compile</scope>\n    </dependency>\n  </dependencies>\n</project>\n"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.10.0/Laevatein-0.10.0.pom.md5",
    "content": "825ca71b37cdc9c0f87ab7523834162b"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.10.0/Laevatein-0.10.0.pom.sha1",
    "content": "8d14590b62ad3372970a7a2483320c966f0fc99b"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.10.1/Laevatein-0.10.1.aar.md5",
    "content": "fa0e95703cbf65258eaee726c8d1e722"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.10.1/Laevatein-0.10.1.aar.sha1",
    "content": "900f14a52904ed3d1c42ee086db60334333ffc22"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.10.1/Laevatein-0.10.1.pom",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\" xmlns=\"http://maven.apache.org/POM/4.0.0\"\n    xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n  <modelVersion>4.0.0</modelVersion>\n  <groupId>com.laevatein</groupId>\n  <artifactId>Laevatein</artifactId>\n  <version>0.10.1</version>\n  <packaging>aar</packaging>\n  <dependencies>\n    <dependency>\n      <groupId>jp.yokomark.widget</groupId>\n      <artifactId>CompoundContainers</artifactId>\n      <version>0.9.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>jp.mixi.compatibility</groupId>\n      <artifactId>AndroidDeviceCompatibility</artifactId>\n      <version>0.1.0</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.amalgam</groupId>\n      <artifactId>Amalgam</artifactId>\n      <version>0.3.2</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.google.code.findbugs</groupId>\n      <artifactId>jsr305</artifactId>\n      <version>2.0.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.android.support</groupId>\n      <artifactId>support-v4</artifactId>\n      <version>19.0.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.squareup.picasso</groupId>\n      <artifactId>picasso</artifactId>\n      <version>2.1.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>it.sephiroth.android.library.imagezoom</groupId>\n      <artifactId>library</artifactId>\n      <version>+</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.android.support</groupId>\n      <artifactId>appcompat-v7</artifactId>\n      <version>19.0.1</version>\n      <scope>compile</scope>\n    </dependency>\n  </dependencies>\n</project>\n"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.10.1/Laevatein-0.10.1.pom.md5",
    "content": "2ad8acb6b85f1ab1daa75bf7a64e04a8"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.10.1/Laevatein-0.10.1.pom.sha1",
    "content": "3bb6b97d4d4a8587ff21b02ccb528d3f86d66b25"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.10.2/Laevatein-0.10.2.aar.md5",
    "content": "a504dbb34e1ac26fedc996d8e5ee534b"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.10.2/Laevatein-0.10.2.aar.sha1",
    "content": "b6c1070c99ad004fc19ea477caa5794332ecebae"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.10.2/Laevatein-0.10.2.pom",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\" xmlns=\"http://maven.apache.org/POM/4.0.0\"\n    xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n  <modelVersion>4.0.0</modelVersion>\n  <groupId>com.laevatein</groupId>\n  <artifactId>Laevatein</artifactId>\n  <version>0.10.2</version>\n  <packaging>aar</packaging>\n  <dependencies>\n    <dependency>\n      <groupId>jp.yokomark.widget</groupId>\n      <artifactId>CompoundContainers</artifactId>\n      <version>0.9.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>jp.mixi.compatibility</groupId>\n      <artifactId>AndroidDeviceCompatibility</artifactId>\n      <version>0.1.0</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.amalgam</groupId>\n      <artifactId>Amalgam</artifactId>\n      <version>0.3.2</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.google.code.findbugs</groupId>\n      <artifactId>jsr305</artifactId>\n      <version>2.0.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.android.support</groupId>\n      <artifactId>support-v4</artifactId>\n      <version>19.0.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.squareup.picasso</groupId>\n      <artifactId>picasso</artifactId>\n      <version>2.1.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>it.sephiroth.android.library.imagezoom</groupId>\n      <artifactId>library</artifactId>\n      <version>+</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.android.support</groupId>\n      <artifactId>appcompat-v7</artifactId>\n      <version>19.0.1</version>\n      <scope>compile</scope>\n    </dependency>\n  </dependencies>\n</project>\n"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.10.2/Laevatein-0.10.2.pom.md5",
    "content": "bd3214d3ed7a172e90167ac59d8be2c9"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.10.2/Laevatein-0.10.2.pom.sha1",
    "content": "6bb7ce6bf4c8c9b2204a966563c93c3be8ea3033"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.10.3/Laevatein-0.10.3.aar.md5",
    "content": "3193eaf71ca35b58a2cefd2afcb7baaf"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.10.3/Laevatein-0.10.3.aar.sha1",
    "content": "9522fd2a86aaaa6854a94b6bd770fa4fde805b16"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.10.3/Laevatein-0.10.3.pom",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\" xmlns=\"http://maven.apache.org/POM/4.0.0\"\n    xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n  <modelVersion>4.0.0</modelVersion>\n  <groupId>com.laevatein</groupId>\n  <artifactId>Laevatein</artifactId>\n  <version>0.10.3</version>\n  <packaging>aar</packaging>\n  <dependencies>\n    <dependency>\n      <groupId>jp.yokomark.widget</groupId>\n      <artifactId>CompoundContainers</artifactId>\n      <version>0.9.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>jp.mixi.compatibility</groupId>\n      <artifactId>AndroidDeviceCompatibility</artifactId>\n      <version>0.1.0</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.amalgam</groupId>\n      <artifactId>Amalgam</artifactId>\n      <version>0.3.2</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.google.code.findbugs</groupId>\n      <artifactId>jsr305</artifactId>\n      <version>2.0.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.android.support</groupId>\n      <artifactId>support-v4</artifactId>\n      <version>19.0.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.squareup.picasso</groupId>\n      <artifactId>picasso</artifactId>\n      <version>2.1.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>it.sephiroth.android.library.imagezoom</groupId>\n      <artifactId>library</artifactId>\n      <version>+</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.android.support</groupId>\n      <artifactId>appcompat-v7</artifactId>\n      <version>19.0.1</version>\n      <scope>compile</scope>\n    </dependency>\n  </dependencies>\n</project>\n"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.10.3/Laevatein-0.10.3.pom.md5",
    "content": "79daa595964fba36734845b2bf435692"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.10.3/Laevatein-0.10.3.pom.sha1",
    "content": "957c304d0b60782f533ac1e4add3e7ead1501388"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.10.4/Laevatein-0.10.4.aar.md5",
    "content": "33b10d5b4011546d21e4e8461c471f09"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.10.4/Laevatein-0.10.4.aar.sha1",
    "content": "c48a129ede7172bda5a1d9e99b88d9aa69869748"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.10.4/Laevatein-0.10.4.pom",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\" xmlns=\"http://maven.apache.org/POM/4.0.0\"\n    xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n  <modelVersion>4.0.0</modelVersion>\n  <groupId>com.laevatein</groupId>\n  <artifactId>Laevatein</artifactId>\n  <version>0.10.4</version>\n  <packaging>aar</packaging>\n  <dependencies>\n    <dependency>\n      <groupId>jp.yokomark.widget</groupId>\n      <artifactId>CompoundContainers</artifactId>\n      <version>0.9.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>jp.mixi.compatibility</groupId>\n      <artifactId>AndroidDeviceCompatibility</artifactId>\n      <version>0.1.0</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.amalgam</groupId>\n      <artifactId>Amalgam</artifactId>\n      <version>0.3.2</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.google.code.findbugs</groupId>\n      <artifactId>jsr305</artifactId>\n      <version>2.0.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.android.support</groupId>\n      <artifactId>support-v4</artifactId>\n      <version>19.0.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.squareup.picasso</groupId>\n      <artifactId>picasso</artifactId>\n      <version>2.1.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>it.sephiroth.android.library.imagezoom</groupId>\n      <artifactId>library</artifactId>\n      <version>+</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.android.support</groupId>\n      <artifactId>appcompat-v7</artifactId>\n      <version>19.0.1</version>\n      <scope>compile</scope>\n    </dependency>\n  </dependencies>\n</project>\n"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.10.4/Laevatein-0.10.4.pom.md5",
    "content": "5cba2a54bfee064e23d4905f50bb2604"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.10.4/Laevatein-0.10.4.pom.sha1",
    "content": "1017e41a27a8f626cd593605e791e4d5d3bbc792"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.10.5/Laevatein-0.10.5.aar.md5",
    "content": "085f7a28f8207701d456247ab371f8a1"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.10.5/Laevatein-0.10.5.aar.sha1",
    "content": "db89d6e50b2d04617cda8b715b3b41dc4efcf615"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.10.5/Laevatein-0.10.5.pom",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\" xmlns=\"http://maven.apache.org/POM/4.0.0\"\n    xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n  <modelVersion>4.0.0</modelVersion>\n  <groupId>com.laevatein</groupId>\n  <artifactId>Laevatein</artifactId>\n  <version>0.10.5</version>\n  <packaging>aar</packaging>\n  <dependencies>\n    <dependency>\n      <groupId>jp.yokomark.widget</groupId>\n      <artifactId>CompoundContainers</artifactId>\n      <version>0.9.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>jp.mixi</groupId>\n      <artifactId>AndroidDeviceCompatibility</artifactId>\n      <version>1.0.0</version>\n      <type>aar</type>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>jp.co.nohana</groupId>\n      <artifactId>Amalgam</artifactId>\n      <version>0.3.2</version>\n      <type>aar</type>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.google.code.findbugs</groupId>\n      <artifactId>jsr305</artifactId>\n      <version>2.0.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.android.support</groupId>\n      <artifactId>support-v4</artifactId>\n      <version>19.0.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.squareup.picasso</groupId>\n      <artifactId>picasso</artifactId>\n      <version>2.1.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>it.sephiroth.android.library.imagezoom</groupId>\n      <artifactId>library</artifactId>\n      <version>+</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.android.support</groupId>\n      <artifactId>appcompat-v7</artifactId>\n      <version>19.0.1</version>\n      <scope>compile</scope>\n    </dependency>\n  </dependencies>\n</project>\n"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.10.5/Laevatein-0.10.5.pom.md5",
    "content": "5bd85aeb3f195ccc239b8c6da1a2335c"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.10.5/Laevatein-0.10.5.pom.sha1",
    "content": "5cb74fbc7b8d3846efed18978b893f206c5f5217"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.0/Laevatein-0.9.0.aar.md5",
    "content": "538eabb88d9ac6142a1623a52b5669f8"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.0/Laevatein-0.9.0.aar.sha1",
    "content": "1a191f64578a93da1f71b7780adde2967273b57e"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.0/Laevatein-0.9.0.pom",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\" xmlns=\"http://maven.apache.org/POM/4.0.0\"\n    xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n  <modelVersion>4.0.0</modelVersion>\n  <groupId>com.laevatein</groupId>\n  <artifactId>Laevatein</artifactId>\n  <version>0.9.0</version>\n  <packaging>aar</packaging>\n  <dependencies>\n    <dependency>\n      <groupId>com.amalgam</groupId>\n      <artifactId>Amalgam</artifactId>\n      <version>0.3.2</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.google.code.findbugs</groupId>\n      <artifactId>jsr305</artifactId>\n      <version>2.0.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.android.support</groupId>\n      <artifactId>support-v4</artifactId>\n      <version>19.0.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.squareup.picasso</groupId>\n      <artifactId>picasso</artifactId>\n      <version>2.1.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>it.sephiroth.android.library.imagezoom</groupId>\n      <artifactId>library</artifactId>\n      <version>+</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.android.support</groupId>\n      <artifactId>appcompat-v7</artifactId>\n      <version>19.0.1</version>\n      <scope>compile</scope>\n    </dependency>\n  </dependencies>\n</project>\n"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.0/Laevatein-0.9.0.pom.md5",
    "content": "159f53aa37408e0e5b378203a5a88439"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.0/Laevatein-0.9.0.pom.sha1",
    "content": "a92b9b4785cda454085be558885433a6f031ffcf"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.1/Laevatein-0.9.1.aar.md5",
    "content": "b62f7c07ef552a4c8ebc8abc15d1ba51"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.1/Laevatein-0.9.1.aar.sha1",
    "content": "83927797e3ea2ee46e77478e2940767b7a17606e"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.1/Laevatein-0.9.1.pom",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\" xmlns=\"http://maven.apache.org/POM/4.0.0\"\n    xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n  <modelVersion>4.0.0</modelVersion>\n  <groupId>com.laevatein</groupId>\n  <artifactId>Laevatein</artifactId>\n  <version>0.9.1</version>\n  <packaging>aar</packaging>\n  <dependencies>\n    <dependency>\n      <groupId>com.amalgam</groupId>\n      <artifactId>Amalgam</artifactId>\n      <version>0.3.2</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.google.code.findbugs</groupId>\n      <artifactId>jsr305</artifactId>\n      <version>2.0.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.android.support</groupId>\n      <artifactId>support-v4</artifactId>\n      <version>19.0.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.squareup.picasso</groupId>\n      <artifactId>picasso</artifactId>\n      <version>2.1.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>it.sephiroth.android.library.imagezoom</groupId>\n      <artifactId>library</artifactId>\n      <version>+</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.android.support</groupId>\n      <artifactId>appcompat-v7</artifactId>\n      <version>19.0.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>jp.yokomark.widget</groupId>\n      <artifactId>CompoundContainers</artifactId>\n      <version>+</version>\n      <scope>compile</scope>\n    </dependency>\n  </dependencies>\n</project>\n"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.1/Laevatein-0.9.1.pom.md5",
    "content": "4a8da8a01b92eee9c258d953d19bb820"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.1/Laevatein-0.9.1.pom.sha1",
    "content": "efd1a13f51038ceb16fe17b8265689e09b083bd1"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.10/Laevatein-0.9.10.aar.md5",
    "content": "b2e7440b0b791958fc4085d521a79544"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.10/Laevatein-0.9.10.aar.sha1",
    "content": "0a01102070e107577518cbeeab084c394855772d"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.10/Laevatein-0.9.10.pom",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\" xmlns=\"http://maven.apache.org/POM/4.0.0\"\n    xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n  <modelVersion>4.0.0</modelVersion>\n  <groupId>com.laevatein</groupId>\n  <artifactId>Laevatein</artifactId>\n  <version>0.9.10</version>\n  <packaging>aar</packaging>\n  <dependencies>\n    <dependency>\n      <groupId>jp.yokomark.widget</groupId>\n      <artifactId>CompoundContainers</artifactId>\n      <version>0.9.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>jp.mixi.compatibility</groupId>\n      <artifactId>AndroidDeviceCompatibility</artifactId>\n      <version>0.1.0</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.amalgam</groupId>\n      <artifactId>Amalgam</artifactId>\n      <version>0.3.2</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.google.code.findbugs</groupId>\n      <artifactId>jsr305</artifactId>\n      <version>2.0.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.android.support</groupId>\n      <artifactId>support-v4</artifactId>\n      <version>19.0.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.squareup.picasso</groupId>\n      <artifactId>picasso</artifactId>\n      <version>2.1.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>it.sephiroth.android.library.imagezoom</groupId>\n      <artifactId>library</artifactId>\n      <version>+</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.android.support</groupId>\n      <artifactId>appcompat-v7</artifactId>\n      <version>19.0.1</version>\n      <scope>compile</scope>\n    </dependency>\n  </dependencies>\n</project>\n"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.10/Laevatein-0.9.10.pom.md5",
    "content": "a4a3806253a2340e5a72e41aa26c0d1e"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.10/Laevatein-0.9.10.pom.sha1",
    "content": "bf3991cb0c12ddb94d7c7d89750769cba7084211"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.11/Laevatein-0.9.11.aar.md5",
    "content": "72f711fe29c9f3ecdcf34b9b81b12a6c"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.11/Laevatein-0.9.11.aar.sha1",
    "content": "edfcba2479320e9b479a773dfe9ef09dc3bc52da"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.11/Laevatein-0.9.11.pom",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\" xmlns=\"http://maven.apache.org/POM/4.0.0\"\n    xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n  <modelVersion>4.0.0</modelVersion>\n  <groupId>com.laevatein</groupId>\n  <artifactId>Laevatein</artifactId>\n  <version>0.9.11</version>\n  <packaging>aar</packaging>\n  <dependencies>\n    <dependency>\n      <groupId>jp.yokomark.widget</groupId>\n      <artifactId>CompoundContainers</artifactId>\n      <version>0.9.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>jp.mixi.compatibility</groupId>\n      <artifactId>AndroidDeviceCompatibility</artifactId>\n      <version>0.1.0</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.amalgam</groupId>\n      <artifactId>Amalgam</artifactId>\n      <version>0.3.2</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.google.code.findbugs</groupId>\n      <artifactId>jsr305</artifactId>\n      <version>2.0.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.android.support</groupId>\n      <artifactId>support-v4</artifactId>\n      <version>19.0.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.squareup.picasso</groupId>\n      <artifactId>picasso</artifactId>\n      <version>2.1.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>it.sephiroth.android.library.imagezoom</groupId>\n      <artifactId>library</artifactId>\n      <version>+</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.android.support</groupId>\n      <artifactId>appcompat-v7</artifactId>\n      <version>19.0.1</version>\n      <scope>compile</scope>\n    </dependency>\n  </dependencies>\n</project>\n"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.11/Laevatein-0.9.11.pom.md5",
    "content": "1c8905d8a0ae8bf8439d3681be2a9207"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.11/Laevatein-0.9.11.pom.sha1",
    "content": "0dc29c582e4a50413f4fcb3006e9f1aa1d59d2fb"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.12/Laevatein-0.9.12.aar.md5",
    "content": "3e02bea93f3b529f1ac6864af477cf84"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.12/Laevatein-0.9.12.aar.sha1",
    "content": "71ef691ba5dbbbbfe3f0c23c7e833f42bdb11675"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.12/Laevatein-0.9.12.pom",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\" xmlns=\"http://maven.apache.org/POM/4.0.0\"\n    xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n  <modelVersion>4.0.0</modelVersion>\n  <groupId>com.laevatein</groupId>\n  <artifactId>Laevatein</artifactId>\n  <version>0.9.12</version>\n  <packaging>aar</packaging>\n  <dependencies>\n    <dependency>\n      <groupId>jp.yokomark.widget</groupId>\n      <artifactId>CompoundContainers</artifactId>\n      <version>0.9.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>jp.mixi.compatibility</groupId>\n      <artifactId>AndroidDeviceCompatibility</artifactId>\n      <version>0.1.0</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.amalgam</groupId>\n      <artifactId>Amalgam</artifactId>\n      <version>0.3.2</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.google.code.findbugs</groupId>\n      <artifactId>jsr305</artifactId>\n      <version>2.0.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.android.support</groupId>\n      <artifactId>support-v4</artifactId>\n      <version>19.0.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.squareup.picasso</groupId>\n      <artifactId>picasso</artifactId>\n      <version>2.1.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>it.sephiroth.android.library.imagezoom</groupId>\n      <artifactId>library</artifactId>\n      <version>+</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.android.support</groupId>\n      <artifactId>appcompat-v7</artifactId>\n      <version>19.0.1</version>\n      <scope>compile</scope>\n    </dependency>\n  </dependencies>\n</project>\n"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.12/Laevatein-0.9.12.pom.md5",
    "content": "79b54ebc6fd1c75698343c2bb71357eb"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.12/Laevatein-0.9.12.pom.sha1",
    "content": "58ec6c0a97c9f8d155fa113010d65fbf8035419b"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.13/Laevatein-0.9.13.aar.md5",
    "content": "ff0f41dd31730c29a3e6b5f6e147b876"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.13/Laevatein-0.9.13.aar.sha1",
    "content": "baf7e595d4fc1bd16f87c3230274e8bb691941bb"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.13/Laevatein-0.9.13.pom",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\" xmlns=\"http://maven.apache.org/POM/4.0.0\"\n    xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n  <modelVersion>4.0.0</modelVersion>\n  <groupId>com.laevatein</groupId>\n  <artifactId>Laevatein</artifactId>\n  <version>0.9.13</version>\n  <packaging>aar</packaging>\n  <dependencies>\n    <dependency>\n      <groupId>jp.yokomark.widget</groupId>\n      <artifactId>CompoundContainers</artifactId>\n      <version>0.9.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>jp.mixi.compatibility</groupId>\n      <artifactId>AndroidDeviceCompatibility</artifactId>\n      <version>0.1.0</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.amalgam</groupId>\n      <artifactId>Amalgam</artifactId>\n      <version>0.3.2</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.google.code.findbugs</groupId>\n      <artifactId>jsr305</artifactId>\n      <version>2.0.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.android.support</groupId>\n      <artifactId>support-v4</artifactId>\n      <version>19.0.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.squareup.picasso</groupId>\n      <artifactId>picasso</artifactId>\n      <version>2.1.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>it.sephiroth.android.library.imagezoom</groupId>\n      <artifactId>library</artifactId>\n      <version>+</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.android.support</groupId>\n      <artifactId>appcompat-v7</artifactId>\n      <version>19.0.1</version>\n      <scope>compile</scope>\n    </dependency>\n  </dependencies>\n</project>\n"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.13/Laevatein-0.9.13.pom.md5",
    "content": "6c7a73f07e6cb4d11538c60493651bcd"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.13/Laevatein-0.9.13.pom.sha1",
    "content": "0290b91995d07c3a0a46862f4d8f2674de135d78"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.14/Laevatein-0.9.14.aar.md5",
    "content": "29029692874470ef1b394c56a4e33a2c"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.14/Laevatein-0.9.14.aar.sha1",
    "content": "cdc2e1ebb6dcc81a6bb6dafbc6b73432f0c69970"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.14/Laevatein-0.9.14.pom",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\" xmlns=\"http://maven.apache.org/POM/4.0.0\"\n    xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n  <modelVersion>4.0.0</modelVersion>\n  <groupId>com.laevatein</groupId>\n  <artifactId>Laevatein</artifactId>\n  <version>0.9.14</version>\n  <packaging>aar</packaging>\n  <dependencies>\n    <dependency>\n      <groupId>jp.yokomark.widget</groupId>\n      <artifactId>CompoundContainers</artifactId>\n      <version>0.9.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>jp.mixi.compatibility</groupId>\n      <artifactId>AndroidDeviceCompatibility</artifactId>\n      <version>0.1.0</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.amalgam</groupId>\n      <artifactId>Amalgam</artifactId>\n      <version>0.3.2</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.google.code.findbugs</groupId>\n      <artifactId>jsr305</artifactId>\n      <version>2.0.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.android.support</groupId>\n      <artifactId>support-v4</artifactId>\n      <version>19.0.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.squareup.picasso</groupId>\n      <artifactId>picasso</artifactId>\n      <version>2.1.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>it.sephiroth.android.library.imagezoom</groupId>\n      <artifactId>library</artifactId>\n      <version>+</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.android.support</groupId>\n      <artifactId>appcompat-v7</artifactId>\n      <version>19.0.1</version>\n      <scope>compile</scope>\n    </dependency>\n  </dependencies>\n</project>\n"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.14/Laevatein-0.9.14.pom.md5",
    "content": "840c34c3a6b960423e81e077980ad007"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.14/Laevatein-0.9.14.pom.sha1",
    "content": "9a9ccfd0f3b17379e98dfefc2128bd507ffbada4"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.15/Laevatein-0.9.15.aar.md5",
    "content": "0761abe61356770b23494425a2804254"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.15/Laevatein-0.9.15.aar.sha1",
    "content": "f8f1b9a4d54332ac3abbcad9a67b72af039af667"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.15/Laevatein-0.9.15.pom",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\" xmlns=\"http://maven.apache.org/POM/4.0.0\"\n    xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n  <modelVersion>4.0.0</modelVersion>\n  <groupId>com.laevatein</groupId>\n  <artifactId>Laevatein</artifactId>\n  <version>0.9.15</version>\n  <packaging>aar</packaging>\n  <dependencies>\n    <dependency>\n      <groupId>jp.yokomark.widget</groupId>\n      <artifactId>CompoundContainers</artifactId>\n      <version>0.9.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>jp.mixi.compatibility</groupId>\n      <artifactId>AndroidDeviceCompatibility</artifactId>\n      <version>0.1.0</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.amalgam</groupId>\n      <artifactId>Amalgam</artifactId>\n      <version>0.3.2</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.google.code.findbugs</groupId>\n      <artifactId>jsr305</artifactId>\n      <version>2.0.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.android.support</groupId>\n      <artifactId>support-v4</artifactId>\n      <version>19.0.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.squareup.picasso</groupId>\n      <artifactId>picasso</artifactId>\n      <version>2.1.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>it.sephiroth.android.library.imagezoom</groupId>\n      <artifactId>library</artifactId>\n      <version>+</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.android.support</groupId>\n      <artifactId>appcompat-v7</artifactId>\n      <version>19.0.1</version>\n      <scope>compile</scope>\n    </dependency>\n  </dependencies>\n</project>\n"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.15/Laevatein-0.9.15.pom.md5",
    "content": "c56781ec0e92b76282527946b64be211"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.15/Laevatein-0.9.15.pom.sha1",
    "content": "8a9a3720d7134ee15e560ea0135a47c0ae952456"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.16/Laevatein-0.9.16.aar.md5",
    "content": "1dd4a8206305c93d4f9e9913bd871c9d"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.16/Laevatein-0.9.16.aar.sha1",
    "content": "b462f822d34e4582f4bcec46ce38b5495f2de5a9"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.16/Laevatein-0.9.16.pom",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\" xmlns=\"http://maven.apache.org/POM/4.0.0\"\n    xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n  <modelVersion>4.0.0</modelVersion>\n  <groupId>com.laevatein</groupId>\n  <artifactId>Laevatein</artifactId>\n  <version>0.9.16</version>\n  <packaging>aar</packaging>\n  <dependencies>\n    <dependency>\n      <groupId>jp.yokomark.widget</groupId>\n      <artifactId>CompoundContainers</artifactId>\n      <version>0.9.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>jp.mixi.compatibility</groupId>\n      <artifactId>AndroidDeviceCompatibility</artifactId>\n      <version>0.1.0</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.amalgam</groupId>\n      <artifactId>Amalgam</artifactId>\n      <version>0.3.2</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.google.code.findbugs</groupId>\n      <artifactId>jsr305</artifactId>\n      <version>2.0.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.android.support</groupId>\n      <artifactId>support-v4</artifactId>\n      <version>19.0.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.squareup.picasso</groupId>\n      <artifactId>picasso</artifactId>\n      <version>2.1.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>it.sephiroth.android.library.imagezoom</groupId>\n      <artifactId>library</artifactId>\n      <version>+</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.android.support</groupId>\n      <artifactId>appcompat-v7</artifactId>\n      <version>19.0.1</version>\n      <scope>compile</scope>\n    </dependency>\n  </dependencies>\n</project>\n"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.16/Laevatein-0.9.16.pom.md5",
    "content": "ae762d26171e6f412ec51dc4127fb77a"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.16/Laevatein-0.9.16.pom.sha1",
    "content": "ffa26337f0c1955da82e26b42acbef7cf72bfc49"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.2/Laevatein-0.9.2.aar.md5",
    "content": "447b70869a65c5ac7be898fdbba56abb"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.2/Laevatein-0.9.2.aar.sha1",
    "content": "87082a04c0bf64321fef111087cde5aba77395bb"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.2/Laevatein-0.9.2.pom",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\" xmlns=\"http://maven.apache.org/POM/4.0.0\"\n    xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n  <modelVersion>4.0.0</modelVersion>\n  <groupId>com.laevatein</groupId>\n  <artifactId>Laevatein</artifactId>\n  <version>0.9.2</version>\n  <packaging>aar</packaging>\n  <dependencies>\n    <dependency>\n      <groupId>jp.yokomark.widget</groupId>\n      <artifactId>CompoundContainers</artifactId>\n      <version>0.9.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.amalgam</groupId>\n      <artifactId>Amalgam</artifactId>\n      <version>0.3.2</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.google.code.findbugs</groupId>\n      <artifactId>jsr305</artifactId>\n      <version>2.0.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.android.support</groupId>\n      <artifactId>support-v4</artifactId>\n      <version>19.0.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.squareup.picasso</groupId>\n      <artifactId>picasso</artifactId>\n      <version>2.1.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>it.sephiroth.android.library.imagezoom</groupId>\n      <artifactId>library</artifactId>\n      <version>+</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.android.support</groupId>\n      <artifactId>appcompat-v7</artifactId>\n      <version>19.0.1</version>\n      <scope>compile</scope>\n    </dependency>\n  </dependencies>\n</project>\n"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.2/Laevatein-0.9.2.pom.md5",
    "content": "a5f355e50c0db5cada41d488c0d6eb42"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.2/Laevatein-0.9.2.pom.sha1",
    "content": "1df0cf8d0eb9636c52ae345fee0ccd7c86652725"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.3/Laevatein-0.9.3.aar.md5",
    "content": "65cd2931c5ed653cc10fe96d416ecf0b"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.3/Laevatein-0.9.3.aar.sha1",
    "content": "8d877fdc66ffcb7d4bc19418302842b79d4a9db9"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.3/Laevatein-0.9.3.pom",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\" xmlns=\"http://maven.apache.org/POM/4.0.0\"\n    xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n  <modelVersion>4.0.0</modelVersion>\n  <groupId>com.laevatein</groupId>\n  <artifactId>Laevatein</artifactId>\n  <version>0.9.3</version>\n  <packaging>aar</packaging>\n  <dependencies>\n    <dependency>\n      <groupId>jp.yokomark.widget</groupId>\n      <artifactId>CompoundContainers</artifactId>\n      <version>0.9.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.amalgam</groupId>\n      <artifactId>Amalgam</artifactId>\n      <version>0.3.2</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.google.code.findbugs</groupId>\n      <artifactId>jsr305</artifactId>\n      <version>2.0.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.android.support</groupId>\n      <artifactId>support-v4</artifactId>\n      <version>19.0.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.squareup.picasso</groupId>\n      <artifactId>picasso</artifactId>\n      <version>2.1.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>it.sephiroth.android.library.imagezoom</groupId>\n      <artifactId>library</artifactId>\n      <version>+</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.android.support</groupId>\n      <artifactId>appcompat-v7</artifactId>\n      <version>19.0.1</version>\n      <scope>compile</scope>\n    </dependency>\n  </dependencies>\n</project>\n"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.3/Laevatein-0.9.3.pom.md5",
    "content": "dc40e6a91d027e524593b08c4c5ae81d"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.3/Laevatein-0.9.3.pom.sha1",
    "content": "8f1de44ca20e3489571355eb66f0521f3f501e87"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.4/Laevatein-0.9.4.aar.md5",
    "content": "856a9126222b9a197cb2ddf31fc50bdf"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.4/Laevatein-0.9.4.aar.sha1",
    "content": "66a5972ba6261b3f56397ceb5aefe08cc77ccad5"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.4/Laevatein-0.9.4.pom",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\" xmlns=\"http://maven.apache.org/POM/4.0.0\"\n    xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n  <modelVersion>4.0.0</modelVersion>\n  <groupId>com.laevatein</groupId>\n  <artifactId>Laevatein</artifactId>\n  <version>0.9.4</version>\n  <packaging>aar</packaging>\n  <dependencies>\n    <dependency>\n      <groupId>jp.yokomark.widget</groupId>\n      <artifactId>CompoundContainers</artifactId>\n      <version>0.9.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.amalgam</groupId>\n      <artifactId>Amalgam</artifactId>\n      <version>0.3.2</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.google.code.findbugs</groupId>\n      <artifactId>jsr305</artifactId>\n      <version>2.0.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.android.support</groupId>\n      <artifactId>support-v4</artifactId>\n      <version>19.0.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.squareup.picasso</groupId>\n      <artifactId>picasso</artifactId>\n      <version>2.1.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>it.sephiroth.android.library.imagezoom</groupId>\n      <artifactId>library</artifactId>\n      <version>+</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.android.support</groupId>\n      <artifactId>appcompat-v7</artifactId>\n      <version>19.0.1</version>\n      <scope>compile</scope>\n    </dependency>\n  </dependencies>\n</project>\n"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.4/Laevatein-0.9.4.pom.md5",
    "content": "ef01830482cd3ec14d1236b5d3cc55a5"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.4/Laevatein-0.9.4.pom.sha1",
    "content": "61b6fda575726d8c36c1c68134447f6538f6671c"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.5/Laevatein-0.9.5.aar.md5",
    "content": "9e41941bda0831f4c101bdd7c6f08659"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.5/Laevatein-0.9.5.aar.sha1",
    "content": "9f682e76392ca69e64fd32ae3e89618c361e02f6"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.5/Laevatein-0.9.5.pom",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\" xmlns=\"http://maven.apache.org/POM/4.0.0\"\n    xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n  <modelVersion>4.0.0</modelVersion>\n  <groupId>com.laevatein</groupId>\n  <artifactId>Laevatein</artifactId>\n  <version>0.9.5</version>\n  <packaging>aar</packaging>\n  <dependencies>\n    <dependency>\n      <groupId>jp.yokomark.widget</groupId>\n      <artifactId>CompoundContainers</artifactId>\n      <version>0.9.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>jp.mixi.compatibility</groupId>\n      <artifactId>AndroidDeviceCompatibility</artifactId>\n      <version>0.1.0</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.amalgam</groupId>\n      <artifactId>Amalgam</artifactId>\n      <version>0.3.2</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.google.code.findbugs</groupId>\n      <artifactId>jsr305</artifactId>\n      <version>2.0.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.android.support</groupId>\n      <artifactId>support-v4</artifactId>\n      <version>19.0.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.squareup.picasso</groupId>\n      <artifactId>picasso</artifactId>\n      <version>2.1.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>it.sephiroth.android.library.imagezoom</groupId>\n      <artifactId>library</artifactId>\n      <version>+</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.android.support</groupId>\n      <artifactId>appcompat-v7</artifactId>\n      <version>19.0.1</version>\n      <scope>compile</scope>\n    </dependency>\n  </dependencies>\n</project>\n"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.5/Laevatein-0.9.5.pom.md5",
    "content": "ad874dfbb5d2d08b61f03c370d13a704"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.5/Laevatein-0.9.5.pom.sha1",
    "content": "da53069e31988d40888fa0d86dd65eb088cf5e7e"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.6/Laevatein-0.9.6.aar.md5",
    "content": "d09f4669b90dff71405439c6812cd8b8"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.6/Laevatein-0.9.6.aar.sha1",
    "content": "c5bf9f1f520f891758057a35380cc23d3bf025d2"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.6/Laevatein-0.9.6.pom",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\" xmlns=\"http://maven.apache.org/POM/4.0.0\"\n    xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n  <modelVersion>4.0.0</modelVersion>\n  <groupId>com.laevatein</groupId>\n  <artifactId>Laevatein</artifactId>\n  <version>0.9.6</version>\n  <packaging>aar</packaging>\n  <dependencies>\n    <dependency>\n      <groupId>jp.yokomark.widget</groupId>\n      <artifactId>CompoundContainers</artifactId>\n      <version>0.9.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>jp.mixi.compatibility</groupId>\n      <artifactId>AndroidDeviceCompatibility</artifactId>\n      <version>0.1.0</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.amalgam</groupId>\n      <artifactId>Amalgam</artifactId>\n      <version>0.3.2</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.google.code.findbugs</groupId>\n      <artifactId>jsr305</artifactId>\n      <version>2.0.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.android.support</groupId>\n      <artifactId>support-v4</artifactId>\n      <version>19.0.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.squareup.picasso</groupId>\n      <artifactId>picasso</artifactId>\n      <version>2.1.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>it.sephiroth.android.library.imagezoom</groupId>\n      <artifactId>library</artifactId>\n      <version>+</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.android.support</groupId>\n      <artifactId>appcompat-v7</artifactId>\n      <version>19.0.1</version>\n      <scope>compile</scope>\n    </dependency>\n  </dependencies>\n</project>\n"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.6/Laevatein-0.9.6.pom.md5",
    "content": "9880bb8c9410a9c5b354bec9b49c8c9a"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.6/Laevatein-0.9.6.pom.sha1",
    "content": "ed217e31851baa66966944a33259aa717e860b1e"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.7/Laevatein-0.9.7.aar.md5",
    "content": "e8d2ce95e92c49e4deef3353b27934ad"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.7/Laevatein-0.9.7.aar.sha1",
    "content": "df9906685c2013d237f0d05ec0133dd12a54dc86"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.7/Laevatein-0.9.7.pom",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\" xmlns=\"http://maven.apache.org/POM/4.0.0\"\n    xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n  <modelVersion>4.0.0</modelVersion>\n  <groupId>com.laevatein</groupId>\n  <artifactId>Laevatein</artifactId>\n  <version>0.9.7</version>\n  <packaging>aar</packaging>\n  <dependencies>\n    <dependency>\n      <groupId>jp.yokomark.widget</groupId>\n      <artifactId>CompoundContainers</artifactId>\n      <version>0.9.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>jp.mixi.compatibility</groupId>\n      <artifactId>AndroidDeviceCompatibility</artifactId>\n      <version>0.1.0</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.amalgam</groupId>\n      <artifactId>Amalgam</artifactId>\n      <version>0.3.2</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.google.code.findbugs</groupId>\n      <artifactId>jsr305</artifactId>\n      <version>2.0.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.android.support</groupId>\n      <artifactId>support-v4</artifactId>\n      <version>19.0.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.squareup.picasso</groupId>\n      <artifactId>picasso</artifactId>\n      <version>2.1.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>it.sephiroth.android.library.imagezoom</groupId>\n      <artifactId>library</artifactId>\n      <version>+</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.android.support</groupId>\n      <artifactId>appcompat-v7</artifactId>\n      <version>19.0.1</version>\n      <scope>compile</scope>\n    </dependency>\n  </dependencies>\n</project>\n"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.7/Laevatein-0.9.7.pom.md5",
    "content": "78bb7dca6e333ae6b7b0765706e2fac8"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.7/Laevatein-0.9.7.pom.sha1",
    "content": "b097eb76fb597e8dc0a16e963394365f689f6dd0"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.8/Laevatein-0.9.8.aar.md5",
    "content": "5cd25cdd165bbac02dd8d676ac347c19"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.8/Laevatein-0.9.8.aar.sha1",
    "content": "2ca161e117905cd0f14619544b738a9a4cec74df"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.8/Laevatein-0.9.8.pom",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\" xmlns=\"http://maven.apache.org/POM/4.0.0\"\n    xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n  <modelVersion>4.0.0</modelVersion>\n  <groupId>com.laevatein</groupId>\n  <artifactId>Laevatein</artifactId>\n  <version>0.9.8</version>\n  <packaging>aar</packaging>\n  <dependencies>\n    <dependency>\n      <groupId>jp.yokomark.widget</groupId>\n      <artifactId>CompoundContainers</artifactId>\n      <version>0.9.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>jp.mixi.compatibility</groupId>\n      <artifactId>AndroidDeviceCompatibility</artifactId>\n      <version>0.1.0</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.amalgam</groupId>\n      <artifactId>Amalgam</artifactId>\n      <version>0.3.2</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.google.code.findbugs</groupId>\n      <artifactId>jsr305</artifactId>\n      <version>2.0.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.android.support</groupId>\n      <artifactId>support-v4</artifactId>\n      <version>19.0.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.squareup.picasso</groupId>\n      <artifactId>picasso</artifactId>\n      <version>2.1.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>it.sephiroth.android.library.imagezoom</groupId>\n      <artifactId>library</artifactId>\n      <version>+</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.android.support</groupId>\n      <artifactId>appcompat-v7</artifactId>\n      <version>19.0.1</version>\n      <scope>compile</scope>\n    </dependency>\n  </dependencies>\n</project>\n"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.8/Laevatein-0.9.8.pom.md5",
    "content": "5cefc53f8c036db6f90286293aaab270"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.8/Laevatein-0.9.8.pom.sha1",
    "content": "b06ef6f20f6158f45f931fc9c54478ebec980a6f"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.9/Laevatein-0.9.9.aar.md5",
    "content": "da503c314b4f56659e98778c5b50a503"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.9/Laevatein-0.9.9.aar.sha1",
    "content": "5530d519be99f6e5bbb070c652316a79286c8284"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.9/Laevatein-0.9.9.pom",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\" xmlns=\"http://maven.apache.org/POM/4.0.0\"\n    xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n  <modelVersion>4.0.0</modelVersion>\n  <groupId>com.laevatein</groupId>\n  <artifactId>Laevatein</artifactId>\n  <version>0.9.9</version>\n  <packaging>aar</packaging>\n  <dependencies>\n    <dependency>\n      <groupId>jp.yokomark.widget</groupId>\n      <artifactId>CompoundContainers</artifactId>\n      <version>0.9.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>jp.mixi.compatibility</groupId>\n      <artifactId>AndroidDeviceCompatibility</artifactId>\n      <version>0.1.0</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.amalgam</groupId>\n      <artifactId>Amalgam</artifactId>\n      <version>0.3.2</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.google.code.findbugs</groupId>\n      <artifactId>jsr305</artifactId>\n      <version>2.0.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.android.support</groupId>\n      <artifactId>support-v4</artifactId>\n      <version>19.0.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.squareup.picasso</groupId>\n      <artifactId>picasso</artifactId>\n      <version>2.1.1</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>it.sephiroth.android.library.imagezoom</groupId>\n      <artifactId>library</artifactId>\n      <version>+</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.android.support</groupId>\n      <artifactId>appcompat-v7</artifactId>\n      <version>19.0.1</version>\n      <scope>compile</scope>\n    </dependency>\n  </dependencies>\n</project>\n"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.9/Laevatein-0.9.9.pom.md5",
    "content": "0c01d63f24dcaafdc8db9bf355125164"
  },
  {
    "path": "repository/com/laevatein/Laevatein/0.9.9/Laevatein-0.9.9.pom.sha1",
    "content": "5e4b678718000477660c515dd8b5c42e6260832b"
  },
  {
    "path": "repository/com/laevatein/Laevatein/maven-metadata.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<metadata>\n    <groupId>jp.co.nohana</groupId>\n    <artifactId>Laevatein</artifactId>\n    <versioning>\n        <latest>3.1.0</latest>\n        <release>3.1.0</release>\n        <versions>\n            <version>1.0.0</version>\n            <version>1.0.1</version>\n            <version>1.0.2</version>\n            <version>1.0.3</version>\n            <version>1.0.4</version>\n            <version>1.0.5</version>\n            <version>2.0.0</version>\n            <version>2.0.1</version>\n            <version>2.0.2</version>\n            <version>2.0.3</version>\n            <version>2.0.4</version>\n            <version>2.1.0</version>\n            <version>2.1.1</version>\n            <version>2.1.2</version>\n            <version>2.2.0</version>\n            <version>2.2.1</version>\n            <version>2.2.2</version>\n            <version>2.3.0</version>\n            <version>2.3.1</version>\n            <version>2.3.2</version>\n            <version>2.4.0</version>\n            <version>2.4.1</version>\n            <version>2.5.0</version>\n            <version>3.0.0</version>\n            <version>3.0.1</version>\n            <version>3.1.0</version>\n        </versions>\n        <lastUpdated>20200617151000</lastUpdated>\n    </versioning>\n</metadata>\n"
  },
  {
    "path": "repository/com/laevatein/Laevatein/maven-metadata.xml.md5",
    "content": "991f2405e62517f4deff7b45b88fc060"
  },
  {
    "path": "repository/com/laevatein/Laevatein/maven-metadata.xml.sha1",
    "content": "10631471e0dc7e792646df181ca7fcdf5cab3e9f"
  },
  {
    "path": "sample/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "sample/build.gradle",
    "content": "apply plugin: 'com.android.application'\n\nandroid {\n    compileSdkVersion 29\n\n    defaultConfig {\n        minSdkVersion 14\n        targetSdkVersion 29\n        versionCode 1\n        versionName \"1.0\"\n    }\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_1_7\n        targetCompatibility JavaVersion.VERSION_1_7\n    }\n    lintOptions {\n        abortOnError false\n    }\n}\n\ndependencies {\n    implementation 'androidx.appcompat:appcompat:1.0.2'\n    implementation 'androidx.legacy:legacy-support-v4:1.0.0'\n    implementation 'com.google.android.material:material:1.0.0'\n    implementation project(':laevatein')\n    implementation fileTree(dir: 'libs', include: ['*.jar'])\n\n    implementation 'org.permissionsdispatcher:permissionsdispatcher:4.3.0'\n    annotationProcessor 'org.permissionsdispatcher:permissionsdispatcher-processor:4.3.0'\n}\n"
  },
  {
    "path": "sample/proguard-rules.txt",
    "content": "# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in /Library/android-sdk-macosx/tools/proguard/proguard-android.txt\n# You can edit the include path and order by changing the ProGuard\n# include property in project.properties.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# Add any project specific keep options here:\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n-dontwarn com.squareup.okhttp.**"
  },
  {
    "path": "sample/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.laevatein.sample\" >\n\n    <application\n        android:allowBackup=\"true\"\n        android:icon=\"@drawable/ic_launcher\"\n        android:label=\"@string/app_name\"\n        android:theme=\"@style/AppTheme\" >\n        <activity android:name=\".LSampleActivity\" >\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\" />\n\n                <category android:name=\"android.intent.category.LAUNCHER\" />\n            </intent-filter>\n        </activity>\n\n        <provider\n            android:name=\"androidx.core.content.FileProvider\"\n            android:authorities=\"@string/file_provider_authorities\"\n            android:exported=\"false\"\n            android:grantUriPermissions=\"true\">\n            <meta-data\n                android:name=\"android.support.FILE_PROVIDER_PATHS\"\n                android:resource=\"@xml/file_paths\" />\n        </provider>\n    </application>\n\n</manifest>\n"
  },
  {
    "path": "sample/src/main/java/com/laevatein/sample/LSampleActivity.java",
    "content": "package com.laevatein.sample;\n\nimport android.Manifest;\nimport android.content.Intent;\nimport android.content.pm.ActivityInfo;\nimport android.net.Uri;\nimport android.os.Bundle;\nimport androidx.annotation.NonNull;\nimport androidx.appcompat.app.AppCompatActivity;\nimport androidx.appcompat.widget.Toolbar;\nimport android.util.Log;\nimport android.view.View;\nimport android.widget.Button;\nimport android.widget.Toast;\n\nimport com.laevatein.Laevatein;\nimport com.laevatein.MimeType;\nimport com.laevatein.internal.entity.ErrorViewResources;\n\nimport java.util.List;\n\nimport permissions.dispatcher.NeedsPermission;\nimport permissions.dispatcher.OnNeverAskAgain;\nimport permissions.dispatcher.OnPermissionDenied;\nimport permissions.dispatcher.RuntimePermissions;\n\n/**\n * @author KeithYokoma\n * @since 2014/03/20\n */\n@RuntimePermissions\npublic class LSampleActivity extends AppCompatActivity {\n    public static final String TAG = LSampleActivity.class.getSimpleName();\n    public static final int REQUEST_CODE_CHOOSE = 1;\n    private List<Uri> mSelected;\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_sample);\n        Toolbar toolbar = findViewById(R.id.l_toolbar);\n        setSupportActionBar(toolbar);\n\n        Button button = findViewById(R.id.choose);\n        button.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                LSampleActivityPermissionsDispatcher.startPhotoSelectWithPermissionCheck(LSampleActivity.this);\n            }\n        });\n    }\n\n    @Override\n    protected void onActivityResult(int requestCode, int resultCode, Intent data) {\n        super.onActivityResult(requestCode, resultCode, data);\n        if (requestCode == REQUEST_CODE_CHOOSE && resultCode == RESULT_OK) {\n            mSelected = Laevatein.obtainResult(data);\n            Log.v(TAG, \"selected: \" + mSelected);\n        }\n    }\n\n    @Override\n    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {\n        super.onRequestPermissionsResult(requestCode, permissions, grantResults);\n        LSampleActivityPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);\n    }\n\n    @NeedsPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)\n    void startPhotoSelect() {\n        String authorities = getString(R.string.file_provider_authorities);\n        Laevatein.from(this)\n                .choose(MimeType.of(MimeType.JPEG))\n                .count(10, 10)\n                .quality(300000, Integer.MAX_VALUE)\n                .size(300, 300)\n                .resume(mSelected)\n                .enableCapture(authorities)\n                .countUnder(ErrorViewResources.ViewType.SNACKBAR, R.string.error_count_under)\n                .countOver(ErrorViewResources.ViewType.DIALOG, R.string.error_count_over)\n                .enableSelectedView(true)\n                .restrictOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)\n                .forResult(REQUEST_CODE_CHOOSE);\n    }\n\n    @OnPermissionDenied(Manifest.permission.WRITE_EXTERNAL_STORAGE)\n    void showDeniedForCamera() {\n        Toast.makeText(this, R.string.permission_denied, Toast.LENGTH_SHORT).show();\n    }\n\n    @OnNeverAskAgain(Manifest.permission.WRITE_EXTERNAL_STORAGE)\n    void showNeverAskForCamera() {\n        Button button = findViewById(R.id.choose);\n        button.setText(R.string.permission_nerver_ask);\n    }\n}\n"
  },
  {
    "path": "sample/src/main/res/drawable/selector_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:state_pressed=\"true\" android:state_focused=\"true\" android:drawable=\"@android:color/darker_gray\"/>\n    <item android:state_pressed=\"true\"                              android:drawable=\"@android:color/darker_gray\"/>\n    <item                              android:state_focused=\"true\" android:drawable=\"@android:color/darker_gray\"/>\n    <item                                                           android:drawable=\"@android:color/background_dark\"/>\n</selector>"
  },
  {
    "path": "sample/src/main/res/layout/activity_sample.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<LinearLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:orientation=\"vertical\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <androidx.appcompat.widget.Toolbar\n        android:id=\"@+id/l_toolbar\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\" />\n\n    <Button\n        android:id=\"@+id/choose\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"@string/label_button\"/>\n</LinearLayout>"
  },
  {
    "path": "sample/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"kurenai\">#BE003F</color>\n</resources>\n"
  },
  {
    "path": "sample/src/main/res/values/dimens.xml",
    "content": "<resources>\n    <!-- Default screen margins, per the Android Design guidelines. -->\n    <dimen name=\"activity_horizontal_margin\">16dp</dimen>\n    <dimen name=\"activity_vertical_margin\">16dp</dimen>\n</resources>\n"
  },
  {
    "path": "sample/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">Laevatein</string>\n    <string name=\"error_count_over\">Over</string>\n    <string name=\"error_count_under\">Under</string>\n    <string name=\"label_button\">Choose</string>\n\n    <string name=\"permission_denied\">this app needs storage permission</string>\n    <string name=\"permission_nerver_ask\">you cannot launch app without storage permission ¯\\\\_(ツ)_/¯</string>\n\n    <string name=\"file_provider_authorities\">com.laevatein.sample.fileprovider</string>\n</resources>\n"
  },
  {
    "path": "sample/src/main/res/values/styles.xml",
    "content": "<resources>\n\n    <!-- Base application theme. -->\n    <style name=\"AppTheme\" parent=\"Theme.AppCompat.Light.NoActionBar\">\n        <!-- Customize your theme here. -->\n    </style>\n\n</resources>\n"
  },
  {
    "path": "sample/src/main/res/values-w820dp/dimens.xml",
    "content": "<resources>\n    <!-- Example customization of dimensions originally defined in res/values/dimens.xml\n         (such as screen margins) for screens with more than 820dp of available width. This\n         would include 7\" and 10\" devices in landscape (~960dp and ~1280dp respectively). -->\n    <dimen name=\"activity_horizontal_margin\">64dp</dimen>\n</resources>\n"
  },
  {
    "path": "sample/src/main/res/xml/file_paths.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<paths>\n    <external-path\n        name=\"pictures\"\n        path=\"Pictures\" />\n</paths>"
  },
  {
    "path": "settings.gradle",
    "content": "include ':laevatein', ':sample'\n"
  }
]