chore: code refactor

This commit is contained in:
rebelonion 2024-02-06 02:16:10 -06:00
parent 8d7b86a667
commit a2e44da99d
334 changed files with 3550 additions and 3092 deletions

View file

@ -55,12 +55,6 @@ jobs:
- name: Save Current SHA for Next Run - name: Save Current SHA for Next Run
run: echo ${{ github.sha }} > last_sha.txt run: echo ${{ github.sha }} > last_sha.txt
- name: Upload Current SHA as Artifact
uses: actions/upload-artifact@v2
with:
name: last-sha
path: last_sha.txt
- name: Set variables - name: Set variables
run: | run: |
VER=$(grep -E -o "versionName \".*\"" app/build.gradle | sed -e 's/versionName //g' | tr -d '"') VER=$(grep -E -o "versionName \".*\"" app/build.gradle | sed -e 's/versionName //g' | tr -d '"')
@ -86,13 +80,13 @@ jobs:
run: chmod +x ./gradlew run: chmod +x ./gradlew
- name: Build with Gradle - name: Build with Gradle
run: ./gradlew assembleAlpha -Pandroid.injected.signing.store.file=$GITHUB_WORKSPACE/key.keystore -Pandroid.injected.signing.store.password=${{ secrets.KEYSTORE_PASSWORD }} -Pandroid.injected.signing.key.alias=${{ secrets.KEY_ALIAS }} -Pandroid.injected.signing.key.password=${{ secrets.KEY_PASSWORD }} run: ./gradlew assembleAlpha -Pandroid.injected.signing.store.file=$GITHUB_WORKSPACE/key.keystore -Pandroid.injected.signing.store.password=${{ secrets.KEYSTORE_PASSWORD }} -Pandroid.injected.signing.key.alias=${{ secrets.KEY_ALIAS }} -Pandroid.injected.signing.key.password=${{ secrets.KEY_PASSWORD }} -Pcustom.filename="app-alpha.apk"
- name: Upload a Build Artifact - name: Upload a Build Artifact
uses: actions/upload-artifact@v3.0.0 uses: actions/upload-artifact@v3.0.0
with: with:
name: Dantotsu name: Dantotsu
path: "app/build/outputs/apk/alpha/app-alpha.apk" path: "app/build/outputs/apk/google/alpha/app-alpha.apk"
- name: Upload APK to Discord and Telegram - name: Upload APK to Discord and Telegram
shell: bash shell: bash
@ -105,11 +99,11 @@ jobs:
commit_messages="${commit_messages:0:$max_length}... (truncated)" commit_messages="${commit_messages:0:$max_length}... (truncated)"
fi fi
contentbody=$( jq -nc --arg msg "Alpha-Build: <@719439449423085569> **$VERSION**:" --arg commits "$commit_messages" '{"content": ($msg + "\n" + $commits)}' ) contentbody=$( jq -nc --arg msg "Alpha-Build: <@719439449423085569> **$VERSION**:" --arg commits "$commit_messages" '{"content": ($msg + "\n" + $commits)}' )
curl -F "payload_json=${contentbody}" -F "dantotsu_debug=@app/build/outputs/apk/alpha/app-alpha.apk" ${{ secrets.DISCORD_WEBHOOK }} curl -F "payload_json=${contentbody}" -F "dantotsu_debug=@app/build/outputs/apk/google/alpha/app-alpha.apk" ${{ secrets.DISCORD_WEBHOOK }}
#Telegram #Telegram
curl -F "chat_id=${{ secrets.TELEGRAM_CHANNEL_ID }}" \ curl -F "chat_id=${{ secrets.TELEGRAM_CHANNEL_ID }}" \
-F "document=@app/build/outputs/apk/alpha/app-alpha.apk" \ -F "document=@app/build/outputs/apk/google/alpha/app-alpha.apk" \
-F "caption=[Alpha-Build: ${VERSION}] Change logs :${commit_messages}" \ -F "caption=[Alpha-Build: ${VERSION}] Change logs :${commit_messages}" \
https://api.telegram.org/bot${{ secrets.TELEGRAM_BOT_TOKEN }}/sendDocument https://api.telegram.org/bot${{ secrets.TELEGRAM_BOT_TOKEN }}/sendDocument
@ -117,6 +111,11 @@ jobs:
COMMIT_LOG: ${{ env.COMMIT_LOG }} COMMIT_LOG: ${{ env.COMMIT_LOG }}
VERSION: ${{ env.VERSION }} VERSION: ${{ env.VERSION }}
- name: Upload Current SHA as Artifact
uses: actions/upload-artifact@v2
with:
name: last-sha
path: last_sha.txt
- name: Delete Old Pre-Releases - name: Delete Old Pre-Releases

View file

@ -17,7 +17,7 @@ android {
applicationId "ani.dantotsu" applicationId "ani.dantotsu"
minSdk 23 minSdk 23
targetSdk 34 targetSdk 34
versionCode ((System.currentTimeMillis() / 60000).toInteger()) versionCode((System.currentTimeMillis() / 60000).toInteger())
versionName "2.1.0" versionName "2.1.0"
versionCode 210 versionCode 210
signingConfig signingConfigs.debug signingConfig signingConfigs.debug

View file

@ -1,5 +1,4 @@
<animated-vector <animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"> xmlns:aapt="http://schemas.android.com/aapt">
<aapt:attr name="android:drawable"> <aapt:attr name="android:drawable">
<vector <vector
@ -14,23 +13,23 @@
android:pivotY="384"> android:pivotY="384">
<clip-path <clip-path
android:name="clippath" android:name="clippath"
android:pathData="M 384 128.04 C 329.836 127.869 276.99 144.889 233.11 176.638 C 189.23 208.387 156.539 253.255 139.769 304.75 C 122.999 356.244 122.999 411.756 139.769 463.25 C 156.539 514.745 189.23 559.613 233.11 591.362 C 276.99 623.111 329.836 640.131 384 639.96 C 451.869 639.96 517.028 612.974 565.019 564.991 C 613.01 517.008 640 451.859 640 384 C 640 316.141 613.01 250.992 565.019 203.009 C 517.028 155.026 451.869 128.04 384 128.04 Z"/> android:pathData="M 384 128.04 C 329.836 127.869 276.99 144.889 233.11 176.638 C 189.23 208.387 156.539 253.255 139.769 304.75 C 122.999 356.244 122.999 411.756 139.769 463.25 C 156.539 514.745 189.23 559.613 233.11 591.362 C 276.99 623.111 329.836 640.131 384 639.96 C 451.869 639.96 517.028 612.974 565.019 564.991 C 613.01 517.008 640 451.859 640 384 C 640 316.141 613.01 250.992 565.019 203.009 C 517.028 155.026 451.869 128.04 384 128.04 Z" />
<group android:name="group"> <group android:name="group">
<group android:name="group_1"> <group android:name="group_1">
<path <path
android:name="path" android:name="path"
android:pathData="M 128 128 L 640 128 L 640 639.96 L 128 639.96 Z"
android:fillColor="#ED0021" android:fillColor="#ED0021"
android:strokeWidth="1"/> android:pathData="M 128 128 L 640 128 L 640 639.96 L 128 639.96 Z"
android:strokeWidth="1" />
<group <group
android:name="group_12" android:name="group_12"
android:pivotX="384" android:pivotX="384"
android:pivotY="384"> android:pivotY="384">
<path <path
android:name="path_2" android:name="path_2"
android:pathData="M 384 211.74 C 338.331 211.74 294.486 229.901 262.194 262.194 C 229.901 294.486 211.74 338.331 211.74 384 C 211.74 429.669 229.901 473.514 262.194 505.806 C 294.486 538.099 338.331 556.26 384 556.26 C 429.669 556.26 473.514 538.099 505.806 505.806 C 538.099 473.514 556.26 429.669 556.26 384 C 556.26 338.331 538.099 294.486 505.806 262.194 C 473.514 229.901 429.669 211.74 384 211.74 Z"
android:fillColor="#D40037" android:fillColor="#D40037"
android:strokeWidth="1"/> android:pathData="M 384 211.74 C 338.331 211.74 294.486 229.901 262.194 262.194 C 229.901 294.486 211.74 338.331 211.74 384 C 211.74 429.669 229.901 473.514 262.194 505.806 C 294.486 538.099 338.331 556.26 384 556.26 C 429.669 556.26 473.514 538.099 505.806 505.806 C 538.099 473.514 556.26 429.669 556.26 384 C 556.26 338.331 538.099 294.486 505.806 262.194 C 473.514 229.901 429.669 211.74 384 211.74 Z"
android:strokeWidth="1" />
</group> </group>
</group> </group>
<group android:name="group_2"> <group android:name="group_2">
@ -43,12 +42,12 @@
android:rotation="-90"> android:rotation="-90">
<path <path
android:name="path_1" android:name="path_1"
android:pathData="M 128 128 L 128 463.26 C 151.32 466.96 175.23 468.89 199.58 468.89 C 411.17 468.89 588.92 323.99 639.01 128 L 128 128 Z"
android:fillColor="#A70060" android:fillColor="#A70060"
android:strokeWidth="1"/> android:pathData="M 128 128 L 128 463.26 C 151.32 466.96 175.23 468.89 199.58 468.89 C 411.17 468.89 588.92 323.99 639.01 128 L 128 128 Z"
android:strokeWidth="1" />
<clip-path <clip-path
android:name="mask_2" android:name="mask_2"
android:pathData="M 128 128 L 128 463.26 C 151.32 466.96 175.23 468.89 199.58 468.89 C 411.17 468.89 588.92 323.99 639.01 128 L 128 128 Z"/> android:pathData="M 128 128 L 128 463.26 C 151.32 466.96 175.23 468.89 199.58 468.89 C 411.17 468.89 588.92 323.99 639.01 128 L 128 128 Z" />
</group> </group>
</group> </group>
<group <group
@ -57,7 +56,7 @@
android:pivotY="384"> android:pivotY="384">
<clip-path <clip-path
android:name="mask_1" android:name="mask_1"
android:pathData="M 384 211.74 C 338.331 211.74 294.486 229.901 262.194 262.194 C 229.901 294.486 211.74 338.331 211.74 384 C 211.74 429.669 229.901 473.514 262.194 505.806 C 294.486 538.099 338.331 556.26 384 556.26 C 429.669 556.26 473.514 538.099 505.806 505.806 C 538.099 473.514 556.26 429.669 556.26 384 C 556.26 338.331 538.099 294.486 505.806 262.194 C 473.514 229.901 429.669 211.74 384 211.74 Z"/> android:pathData="M 384 211.74 C 338.331 211.74 294.486 229.901 262.194 262.194 C 229.901 294.486 211.74 338.331 211.74 384 C 211.74 429.669 229.901 473.514 262.194 505.806 C 294.486 538.099 338.331 556.26 384 556.26 C 429.669 556.26 473.514 538.099 505.806 505.806 C 538.099 473.514 556.26 429.669 556.26 384 C 556.26 338.331 538.099 294.486 505.806 262.194 C 473.514 229.901 429.669 211.74 384 211.74 Z" />
<group <group
android:name="group_9" android:name="group_9"
android:pivotX="94" android:pivotX="94"
@ -65,18 +64,18 @@
android:rotation="-90"> android:rotation="-90">
<path <path
android:name="path_3" android:name="path_3"
android:pathData="M 128 128 L 128 463.26 C 151.32 466.96 175.23 468.89 199.58 468.89 C 411.17 468.89 588.92 323.99 639.01 128 L 128 128 Z"
android:fillColor="#BF005E" android:fillColor="#BF005E"
android:strokeWidth="1"/> android:pathData="M 128 128 L 128 463.26 C 151.32 466.96 175.23 468.89 199.58 468.89 C 411.17 468.89 588.92 323.99 639.01 128 L 128 128 Z"
android:strokeWidth="1" />
</group> </group>
</group> </group>
<group <group
android:name="group_6" android:name="group_6"
android:pivotX="94" android:pivotX="94"
android:pivotY="440" android:pivotY="440"
android:rotation="-5"
android:scaleX="1.2" android:scaleX="1.2"
android:scaleY="1.2" android:scaleY="1.2" />
android:rotation="-5"/>
</group> </group>
<group <group
android:name="group_8" android:name="group_8"
@ -89,9 +88,9 @@
android:pivotY="440"> android:pivotY="440">
<path <path
android:name="path_4" android:name="path_4"
android:pathData="M 539.28 128 C 503.71 317.07 337.72 460.12 138.31 460.12 C 134.86 460.12 131.42 460.06 128 459.98 L 128 465.73 C 168.23 476.19 210.43 481.78 253.93 481.78 C 409.53 481.78 548.48 410.55 640 298.94 L 640 128.01 L 539.28 128.01 Z"
android:fillColor="#C70051" android:fillColor="#C70051"
android:strokeWidth="1"/> android:pathData="M 539.28 128 C 503.71 317.07 337.72 460.12 138.31 460.12 C 134.86 460.12 131.42 460.06 128 459.98 L 128 465.73 C 168.23 476.19 210.43 481.78 253.93 481.78 C 409.53 481.78 548.48 410.55 640 298.94 L 640 128.01 L 539.28 128.01 Z"
android:strokeWidth="1" />
</group> </group>
</group> </group>
</group> </group>
@ -100,9 +99,9 @@
android:translateX="-360"> android:translateX="-360">
<path <path
android:name="path_6" android:name="path_6"
android:pathData="M 481.82 384 C 481.82 438.03 438.02 481.82 384 481.82 L 0 481.82 L 0 286.18 L 384 286.18 C 438.02 286.18 481.82 329.98 481.82 384 Z"
android:fillColor="#251528" android:fillColor="#251528"
android:strokeWidth="1"/> android:pathData="M 481.82 384 C 481.82 438.03 438.02 481.82 384 481.82 L 0 481.82 L 0 286.18 L 384 286.18 C 438.02 286.18 481.82 329.98 481.82 384 Z"
android:strokeWidth="1" />
</group> </group>
<group <group
android:name="group_4" android:name="group_4"
@ -112,23 +111,23 @@
android:scaleY="1.5"> android:scaleY="1.5">
<path <path
android:name="path_5" android:name="path_5"
android:pathData="M 44.26 128 C 44.26 174.25 81.75 211.74 128 211.74 L 384 211.74 C 479.13 211.74 556.26 288.86 556.26 384 C 556.26 479.13 479.14 556.26 384 556.26 L 128 556.26 C 81.76 556.26 44.28 593.73 44.26 639.97 L 768 639.97 L 768 128 L 44.26 128 Z"
android:fillColor="#251528" android:fillColor="#251528"
android:strokeWidth="1"/> android:pathData="M 44.26 128 C 44.26 174.25 81.75 211.74 128 211.74 L 384 211.74 C 479.13 211.74 556.26 288.86 556.26 384 C 556.26 479.13 479.14 556.26 384 556.26 L 128 556.26 C 81.76 556.26 44.28 593.73 44.26 639.97 L 768 639.97 L 768 128 L 44.26 128 Z"
android:strokeWidth="1" />
</group> </group>
<group <group
android:name="group_5" android:name="group_5"
android:pivotX="384" android:pivotX="384"
android:pivotY="384" android:pivotY="384"
android:rotation="-15"
android:scaleX="3" android:scaleX="3"
android:scaleY="3" android:scaleY="3">
android:rotation="-15">
<path <path
android:name="path_7" android:name="path_7"
android:pathData="M 442 366.7 L 365.98 322.81 C 352.66 315.12 336.02 324.73 336.02 340.11 L 336.02 427.89 C 336.02 443.27 352.67 452.88 365.98 445.19 L 442 401.3 C 455.32 393.61 455.32 374.39 442 366.7 Z"
android:fillColor="#FFD8DF"
android:fillAlpha="0" android:fillAlpha="0"
android:strokeWidth="1"/> android:fillColor="#FFD8DF"
android:pathData="M 442 366.7 L 365.98 322.81 C 352.66 315.12 336.02 324.73 336.02 340.11 L 336.02 427.89 C 336.02 443.27 352.67 452.88 365.98 445.19 L 442 401.3 C 455.32 393.61 455.32 374.39 442 366.7 Z"
android:strokeWidth="1" />
</group> </group>
</group> </group>
</group> </group>
@ -138,19 +137,19 @@
<aapt:attr name="android:animation"> <aapt:attr name="android:animation">
<set> <set>
<objectAnimator <objectAnimator
android:duration="500"
android:interpolator="@android:anim/overshoot_interpolator"
android:propertyName="scaleX" android:propertyName="scaleX"
android:duration="500"
android:valueFrom="0" android:valueFrom="0"
android:valueTo="1" android:valueTo="1"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:anim/overshoot_interpolator"/>
<objectAnimator <objectAnimator
android:propertyName="scaleY"
android:duration="500" android:duration="500"
android:interpolator="@android:anim/overshoot_interpolator"
android:propertyName="scaleY"
android:valueFrom="0" android:valueFrom="0"
android:valueTo="1" android:valueTo="1"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:anim/overshoot_interpolator"/>
</set> </set>
</aapt:attr> </aapt:attr>
</target> </target>
@ -158,177 +157,177 @@
<aapt:attr name="android:animation"> <aapt:attr name="android:animation">
<set> <set>
<objectAnimator <objectAnimator
android:duration="550"
android:interpolator="@android:anim/overshoot_interpolator"
android:propertyName="rotation" android:propertyName="rotation"
android:startOffset="350" android:startOffset="350"
android:duration="550"
android:valueFrom="-10" android:valueFrom="-10"
android:valueTo="0" android:valueTo="0"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:anim/overshoot_interpolator"/>
<objectAnimator <objectAnimator
android:duration="300"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:propertyName="scaleX" android:propertyName="scaleX"
android:startOffset="350" android:startOffset="350"
android:duration="300"
android:valueFrom="1.2" android:valueFrom="1.2"
android:valueTo="1" android:valueTo="1"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:interpolator/fast_out_slow_in"/>
<objectAnimator <objectAnimator
android:duration="300"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:propertyName="scaleY" android:propertyName="scaleY"
android:startOffset="350" android:startOffset="350"
android:duration="300"
android:valueFrom="1.2" android:valueFrom="1.2"
android:valueTo="1" android:valueTo="1"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:interpolator/fast_out_slow_in"/>
</set> </set>
</aapt:attr> </aapt:attr>
</target> </target>
<target android:name="group_3"> <target android:name="group_3">
<aapt:attr name="android:animation"> <aapt:attr name="android:animation">
<objectAnimator <objectAnimator
android:duration="400"
android:interpolator="@android:anim/overshoot_interpolator"
android:propertyName="translateX" android:propertyName="translateX"
android:startOffset="250" android:startOffset="250"
android:duration="400"
android:valueFrom="-360" android:valueFrom="-360"
android:valueTo="0" android:valueTo="0"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:anim/overshoot_interpolator"/>
</aapt:attr> </aapt:attr>
</target> </target>
<target android:name="group_4"> <target android:name="group_4">
<aapt:attr name="android:animation"> <aapt:attr name="android:animation">
<set> <set>
<objectAnimator <objectAnimator
android:duration="350"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:propertyName="scaleX" android:propertyName="scaleX"
android:startOffset="400" android:startOffset="400"
android:duration="350"
android:valueFrom="1.5" android:valueFrom="1.5"
android:valueTo="1" android:valueTo="1"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:interpolator/fast_out_slow_in"/>
<objectAnimator <objectAnimator
android:duration="350"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:propertyName="scaleY" android:propertyName="scaleY"
android:startOffset="400" android:startOffset="400"
android:duration="350"
android:valueFrom="1.5" android:valueFrom="1.5"
android:valueTo="1" android:valueTo="1"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:interpolator/fast_out_slow_in"/>
</set> </set>
</aapt:attr> </aapt:attr>
</target> </target>
<target android:name="path_7"> <target android:name="path_7">
<aapt:attr name="android:animation"> <aapt:attr name="android:animation">
<objectAnimator <objectAnimator
android:duration="550"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:propertyName="fillAlpha" android:propertyName="fillAlpha"
android:startOffset="350" android:startOffset="350"
android:duration="550"
android:valueFrom="0" android:valueFrom="0"
android:valueTo="1" android:valueTo="1"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:interpolator/fast_out_slow_in"/>
</aapt:attr> </aapt:attr>
</target> </target>
<target android:name="group_5"> <target android:name="group_5">
<aapt:attr name="android:animation"> <aapt:attr name="android:animation">
<set> <set>
<objectAnimator <objectAnimator
android:duration="550"
android:interpolator="@android:anim/decelerate_interpolator"
android:propertyName="rotation" android:propertyName="rotation"
android:startOffset="350" android:startOffset="350"
android:duration="550"
android:valueFrom="-45" android:valueFrom="-45"
android:valueTo="0" android:valueTo="0"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:anim/decelerate_interpolator"/>
<objectAnimator <objectAnimator
android:duration="550"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:propertyName="scaleX" android:propertyName="scaleX"
android:startOffset="350" android:startOffset="350"
android:duration="550"
android:valueFrom="3" android:valueFrom="3"
android:valueTo="1" android:valueTo="1"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:interpolator/fast_out_slow_in"/>
<objectAnimator <objectAnimator
android:duration="550"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:propertyName="scaleY" android:propertyName="scaleY"
android:startOffset="350" android:startOffset="350"
android:duration="550"
android:valueFrom="3" android:valueFrom="3"
android:valueTo="1" android:valueTo="1"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:interpolator/fast_out_slow_in"/>
</set> </set>
</aapt:attr> </aapt:attr>
</target> </target>
<target android:name="group_8"> <target android:name="group_8">
<aapt:attr name="android:animation"> <aapt:attr name="android:animation">
<objectAnimator <objectAnimator
android:duration="350"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:propertyName="rotation" android:propertyName="rotation"
android:startOffset="100" android:startOffset="100"
android:duration="350"
android:valueFrom="-90" android:valueFrom="-90"
android:valueTo="0" android:valueTo="0"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:interpolator/fast_out_slow_in"/>
</aapt:attr> </aapt:attr>
</target> </target>
<target android:name="group_9"> <target android:name="group_9">
<aapt:attr name="android:animation"> <aapt:attr name="android:animation">
<set> <set>
<objectAnimator <objectAnimator
android:duration="350"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:propertyName="rotation" android:propertyName="rotation"
android:startOffset="100" android:startOffset="100"
android:duration="350"
android:valueFrom="-90" android:valueFrom="-90"
android:valueTo="0" android:valueTo="0"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:interpolator/fast_out_slow_in"/>
<objectAnimator <objectAnimator
android:duration="350"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:propertyName="scaleX" android:propertyName="scaleX"
android:duration="350"
android:valueFrom="0" android:valueFrom="0"
android:valueTo="1" android:valueTo="1"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:interpolator/fast_out_slow_in"/>
<objectAnimator <objectAnimator
android:propertyName="scaleY"
android:duration="350" android:duration="350"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:propertyName="scaleY"
android:valueFrom="0" android:valueFrom="0"
android:valueTo="1" android:valueTo="1"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:interpolator/fast_out_slow_in"/>
</set> </set>
</aapt:attr> </aapt:attr>
</target> </target>
<target android:name="group_11"> <target android:name="group_11">
<aapt:attr name="android:animation"> <aapt:attr name="android:animation">
<objectAnimator <objectAnimator
android:duration="350"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:propertyName="rotation" android:propertyName="rotation"
android:startOffset="100" android:startOffset="100"
android:duration="350"
android:valueFrom="-90" android:valueFrom="-90"
android:valueTo="0" android:valueTo="0"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:interpolator/fast_out_slow_in"/>
</aapt:attr> </aapt:attr>
</target> </target>
<target android:name="group_12"> <target android:name="group_12">
<aapt:attr name="android:animation"> <aapt:attr name="android:animation">
<set> <set>
<objectAnimator <objectAnimator
android:duration="550"
android:interpolator="@android:anim/overshoot_interpolator"
android:propertyName="scaleX" android:propertyName="scaleX"
android:duration="550"
android:valueFrom="0" android:valueFrom="0"
android:valueTo="1" android:valueTo="1"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:anim/overshoot_interpolator"/>
<objectAnimator <objectAnimator
android:propertyName="scaleY"
android:duration="550" android:duration="550"
android:interpolator="@android:anim/overshoot_interpolator"
android:propertyName="scaleY"
android:valueFrom="0" android:valueFrom="0"
android:valueTo="1" android:valueTo="1"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:anim/overshoot_interpolator"/>
</set> </set>
</aapt:attr> </aapt:attr>
</target> </target>
@ -336,19 +335,19 @@
<aapt:attr name="android:animation"> <aapt:attr name="android:animation">
<set> <set>
<objectAnimator <objectAnimator
android:duration="550"
android:interpolator="@android:anim/overshoot_interpolator"
android:propertyName="scaleX" android:propertyName="scaleX"
android:duration="550"
android:valueFrom="0" android:valueFrom="0"
android:valueTo="1" android:valueTo="1"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:anim/overshoot_interpolator"/>
<objectAnimator <objectAnimator
android:propertyName="scaleY"
android:duration="550" android:duration="550"
android:interpolator="@android:anim/overshoot_interpolator"
android:propertyName="scaleY"
android:valueFrom="0" android:valueFrom="0"
android:valueTo="1" android:valueTo="1"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:anim/overshoot_interpolator"/>
</set> </set>
</aapt:attr> </aapt:attr>
</target> </target>
@ -356,21 +355,21 @@
<aapt:attr name="android:animation"> <aapt:attr name="android:animation">
<set> <set>
<objectAnimator <objectAnimator
android:duration="200"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:propertyName="rotation" android:propertyName="rotation"
android:startOffset="350" android:startOffset="350"
android:duration="200"
android:valueFrom="5" android:valueFrom="5"
android:valueTo="0" android:valueTo="0"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:anim/accelerate_decelerate_interpolator"/>
<objectAnimator <objectAnimator
android:duration="100"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:propertyName="rotation" android:propertyName="rotation"
android:startOffset="250" android:startOffset="250"
android:duration="100"
android:valueFrom="0" android:valueFrom="0"
android:valueTo="5" android:valueTo="5"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:anim/accelerate_decelerate_interpolator"/>
</set> </set>
</aapt:attr> </aapt:attr>
</target> </target>

View file

@ -1,5 +1,4 @@
<animated-vector <animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"> xmlns:aapt="http://schemas.android.com/aapt">
<aapt:attr name="android:drawable"> <aapt:attr name="android:drawable">
<vector <vector
@ -14,23 +13,23 @@
android:pivotY="384"> android:pivotY="384">
<clip-path <clip-path
android:name="clippath" android:name="clippath"
android:pathData="M 384 128.04 C 329.836 127.869 276.99 144.889 233.11 176.638 C 189.23 208.387 156.539 253.255 139.769 304.75 C 122.999 356.244 122.999 411.756 139.769 463.25 C 156.539 514.745 189.23 559.613 233.11 591.362 C 276.99 623.111 329.836 640.131 384 639.96 C 451.869 639.96 517.028 612.974 565.019 564.991 C 613.01 517.008 640 451.859 640 384 C 640 316.141 613.01 250.992 565.019 203.009 C 517.028 155.026 451.869 128.04 384 128.04 Z"/> android:pathData="M 384 128.04 C 329.836 127.869 276.99 144.889 233.11 176.638 C 189.23 208.387 156.539 253.255 139.769 304.75 C 122.999 356.244 122.999 411.756 139.769 463.25 C 156.539 514.745 189.23 559.613 233.11 591.362 C 276.99 623.111 329.836 640.131 384 639.96 C 451.869 639.96 517.028 612.974 565.019 564.991 C 613.01 517.008 640 451.859 640 384 C 640 316.141 613.01 250.992 565.019 203.009 C 517.028 155.026 451.869 128.04 384 128.04 Z" />
<group android:name="group"> <group android:name="group">
<group android:name="group_1"> <group android:name="group_1">
<path <path
android:name="path" android:name="path"
android:pathData="M 128 128 L 640 128 L 640 639.96 L 128 639.96 Z"
android:fillColor="#6901fd" android:fillColor="#6901fd"
android:strokeWidth="1"/> android:pathData="M 128 128 L 640 128 L 640 639.96 L 128 639.96 Z"
android:strokeWidth="1" />
<group <group
android:name="group_12" android:name="group_12"
android:pivotX="384" android:pivotX="384"
android:pivotY="384"> android:pivotY="384">
<path <path
android:name="path_2" android:name="path_2"
android:pathData="M 384 211.74 C 338.331 211.74 294.486 229.901 262.194 262.194 C 229.901 294.486 211.74 338.331 211.74 384 C 211.74 429.669 229.901 473.514 262.194 505.806 C 294.486 538.099 338.331 556.26 384 556.26 C 429.669 556.26 473.514 538.099 505.806 505.806 C 538.099 473.514 556.26 429.669 556.26 384 C 556.26 338.331 538.099 294.486 505.806 262.194 C 473.514 229.901 429.669 211.74 384 211.74 Z"
android:fillColor="#4800e5" android:fillColor="#4800e5"
android:strokeWidth="1"/> android:pathData="M 384 211.74 C 338.331 211.74 294.486 229.901 262.194 262.194 C 229.901 294.486 211.74 338.331 211.74 384 C 211.74 429.669 229.901 473.514 262.194 505.806 C 294.486 538.099 338.331 556.26 384 556.26 C 429.669 556.26 473.514 538.099 505.806 505.806 C 538.099 473.514 556.26 429.669 556.26 384 C 556.26 338.331 538.099 294.486 505.806 262.194 C 473.514 229.901 429.669 211.74 384 211.74 Z"
android:strokeWidth="1" />
</group> </group>
</group> </group>
<group android:name="group_2"> <group android:name="group_2">
@ -43,12 +42,12 @@
android:rotation="-90"> android:rotation="-90">
<path <path
android:name="path_1" android:name="path_1"
android:pathData="M 128 128 L 128 463.26 C 151.32 466.96 175.23 468.89 199.58 468.89 C 411.17 468.89 588.92 323.99 639.01 128 L 128 128 Z"
android:fillColor="#2000bd" android:fillColor="#2000bd"
android:strokeWidth="1"/> android:pathData="M 128 128 L 128 463.26 C 151.32 466.96 175.23 468.89 199.58 468.89 C 411.17 468.89 588.92 323.99 639.01 128 L 128 128 Z"
android:strokeWidth="1" />
<clip-path <clip-path
android:name="mask_2" android:name="mask_2"
android:pathData="M 128 128 L 128 463.26 C 151.32 466.96 175.23 468.89 199.58 468.89 C 411.17 468.89 588.92 323.99 639.01 128 L 128 128 Z"/> android:pathData="M 128 128 L 128 463.26 C 151.32 466.96 175.23 468.89 199.58 468.89 C 411.17 468.89 588.92 323.99 639.01 128 L 128 128 Z" />
</group> </group>
</group> </group>
<group <group
@ -57,7 +56,7 @@
android:pivotY="384"> android:pivotY="384">
<clip-path <clip-path
android:name="mask_1" android:name="mask_1"
android:pathData="M 384 211.74 C 338.331 211.74 294.486 229.901 262.194 262.194 C 229.901 294.486 211.74 338.331 211.74 384 C 211.74 429.669 229.901 473.514 262.194 505.806 C 294.486 538.099 338.331 556.26 384 556.26 C 429.669 556.26 473.514 538.099 505.806 505.806 C 538.099 473.514 556.26 429.669 556.26 384 C 556.26 338.331 538.099 294.486 505.806 262.194 C 473.514 229.901 429.669 211.74 384 211.74 Z"/> android:pathData="M 384 211.74 C 338.331 211.74 294.486 229.901 262.194 262.194 C 229.901 294.486 211.74 338.331 211.74 384 C 211.74 429.669 229.901 473.514 262.194 505.806 C 294.486 538.099 338.331 556.26 384 556.26 C 429.669 556.26 473.514 538.099 505.806 505.806 C 538.099 473.514 556.26 429.669 556.26 384 C 556.26 338.331 538.099 294.486 505.806 262.194 C 473.514 229.901 429.669 211.74 384 211.74 Z" />
<group <group
android:name="group_9" android:name="group_9"
android:pivotX="94" android:pivotX="94"
@ -65,18 +64,18 @@
android:rotation="-90"> android:rotation="-90">
<path <path
android:name="path_3" android:name="path_3"
android:pathData="M 128 128 L 128 463.26 C 151.32 466.96 175.23 468.89 199.58 468.89 C 411.17 468.89 588.92 323.99 639.01 128 L 128 128 Z"
android:fillColor="#1e00d1" android:fillColor="#1e00d1"
android:strokeWidth="1"/> android:pathData="M 128 128 L 128 463.26 C 151.32 466.96 175.23 468.89 199.58 468.89 C 411.17 468.89 588.92 323.99 639.01 128 L 128 128 Z"
android:strokeWidth="1" />
</group> </group>
</group> </group>
<group <group
android:name="group_6" android:name="group_6"
android:pivotX="94" android:pivotX="94"
android:pivotY="440" android:pivotY="440"
android:rotation="-5"
android:scaleX="1.2" android:scaleX="1.2"
android:scaleY="1.2" android:scaleY="1.2" />
android:rotation="-5"/>
</group> </group>
<group <group
android:name="group_8" android:name="group_8"
@ -89,9 +88,9 @@
android:pivotY="440"> android:pivotY="440">
<path <path
android:name="path_4" android:name="path_4"
android:pathData="M 539.28 128 C 503.71 317.07 337.72 460.12 138.31 460.12 C 134.86 460.12 131.42 460.06 128 459.98 L 128 465.73 C 168.23 476.19 210.43 481.78 253.93 481.78 C 409.53 481.78 548.48 410.55 640 298.94 L 640 128.01 L 539.28 128.01 Z"
android:fillColor="#2900da" android:fillColor="#2900da"
android:strokeWidth="1"/> android:pathData="M 539.28 128 C 503.71 317.07 337.72 460.12 138.31 460.12 C 134.86 460.12 131.42 460.06 128 459.98 L 128 465.73 C 168.23 476.19 210.43 481.78 253.93 481.78 C 409.53 481.78 548.48 410.55 640 298.94 L 640 128.01 L 539.28 128.01 Z"
android:strokeWidth="1" />
</group> </group>
</group> </group>
</group> </group>
@ -100,9 +99,9 @@
android:translateX="-360"> android:translateX="-360">
<path <path
android:name="path_6" android:name="path_6"
android:pathData="M 481.82 384 C 481.82 438.03 438.02 481.82 384 481.82 L 0 481.82 L 0 286.18 L 384 286.18 C 438.02 286.18 481.82 329.98 481.82 384 Z"
android:fillColor="#1f1f30" android:fillColor="#1f1f30"
android:strokeWidth="1"/> android:pathData="M 481.82 384 C 481.82 438.03 438.02 481.82 384 481.82 L 0 481.82 L 0 286.18 L 384 286.18 C 438.02 286.18 481.82 329.98 481.82 384 Z"
android:strokeWidth="1" />
</group> </group>
<group <group
android:name="group_4" android:name="group_4"
@ -112,23 +111,23 @@
android:scaleY="1.5"> android:scaleY="1.5">
<path <path
android:name="path_5" android:name="path_5"
android:pathData="M 44.26 128 C 44.26 174.25 81.75 211.74 128 211.74 L 384 211.74 C 479.13 211.74 556.26 288.86 556.26 384 C 556.26 479.13 479.14 556.26 384 556.26 L 128 556.26 C 81.76 556.26 44.28 593.73 44.26 639.97 L 768 639.97 L 768 128 L 44.26 128 Z"
android:fillColor="#1f1f30" android:fillColor="#1f1f30"
android:strokeWidth="1"/> android:pathData="M 44.26 128 C 44.26 174.25 81.75 211.74 128 211.74 L 384 211.74 C 479.13 211.74 556.26 288.86 556.26 384 C 556.26 479.13 479.14 556.26 384 556.26 L 128 556.26 C 81.76 556.26 44.28 593.73 44.26 639.97 L 768 639.97 L 768 128 L 44.26 128 Z"
android:strokeWidth="1" />
</group> </group>
<group <group
android:name="group_5" android:name="group_5"
android:pivotX="384" android:pivotX="384"
android:pivotY="384" android:pivotY="384"
android:rotation="-15"
android:scaleX="3" android:scaleX="3"
android:scaleY="3" android:scaleY="3">
android:rotation="-15">
<path <path
android:name="path_7" android:name="path_7"
android:pathData="M 442 366.7 L 365.98 322.81 C 352.66 315.12 336.02 324.73 336.02 340.11 L 336.02 427.89 C 336.02 443.27 352.67 452.88 365.98 445.19 L 442 401.3 C 455.32 393.61 455.32 374.39 442 366.7 Z"
android:fillColor="#efe7ff"
android:fillAlpha="0" android:fillAlpha="0"
android:strokeWidth="1"/> android:fillColor="#efe7ff"
android:pathData="M 442 366.7 L 365.98 322.81 C 352.66 315.12 336.02 324.73 336.02 340.11 L 336.02 427.89 C 336.02 443.27 352.67 452.88 365.98 445.19 L 442 401.3 C 455.32 393.61 455.32 374.39 442 366.7 Z"
android:strokeWidth="1" />
</group> </group>
</group> </group>
</group> </group>
@ -138,19 +137,19 @@
<aapt:attr name="android:animation"> <aapt:attr name="android:animation">
<set> <set>
<objectAnimator <objectAnimator
android:duration="500"
android:interpolator="@android:anim/overshoot_interpolator"
android:propertyName="scaleX" android:propertyName="scaleX"
android:duration="500"
android:valueFrom="0" android:valueFrom="0"
android:valueTo="1" android:valueTo="1"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:anim/overshoot_interpolator"/>
<objectAnimator <objectAnimator
android:propertyName="scaleY"
android:duration="500" android:duration="500"
android:interpolator="@android:anim/overshoot_interpolator"
android:propertyName="scaleY"
android:valueFrom="0" android:valueFrom="0"
android:valueTo="1" android:valueTo="1"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:anim/overshoot_interpolator"/>
</set> </set>
</aapt:attr> </aapt:attr>
</target> </target>
@ -158,177 +157,177 @@
<aapt:attr name="android:animation"> <aapt:attr name="android:animation">
<set> <set>
<objectAnimator <objectAnimator
android:duration="550"
android:interpolator="@android:anim/overshoot_interpolator"
android:propertyName="rotation" android:propertyName="rotation"
android:startOffset="350" android:startOffset="350"
android:duration="550"
android:valueFrom="-10" android:valueFrom="-10"
android:valueTo="0" android:valueTo="0"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:anim/overshoot_interpolator"/>
<objectAnimator <objectAnimator
android:duration="300"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:propertyName="scaleX" android:propertyName="scaleX"
android:startOffset="350" android:startOffset="350"
android:duration="300"
android:valueFrom="1.2" android:valueFrom="1.2"
android:valueTo="1" android:valueTo="1"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:interpolator/fast_out_slow_in"/>
<objectAnimator <objectAnimator
android:duration="300"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:propertyName="scaleY" android:propertyName="scaleY"
android:startOffset="350" android:startOffset="350"
android:duration="300"
android:valueFrom="1.2" android:valueFrom="1.2"
android:valueTo="1" android:valueTo="1"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:interpolator/fast_out_slow_in"/>
</set> </set>
</aapt:attr> </aapt:attr>
</target> </target>
<target android:name="group_3"> <target android:name="group_3">
<aapt:attr name="android:animation"> <aapt:attr name="android:animation">
<objectAnimator <objectAnimator
android:duration="400"
android:interpolator="@android:anim/overshoot_interpolator"
android:propertyName="translateX" android:propertyName="translateX"
android:startOffset="250" android:startOffset="250"
android:duration="400"
android:valueFrom="-360" android:valueFrom="-360"
android:valueTo="0" android:valueTo="0"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:anim/overshoot_interpolator"/>
</aapt:attr> </aapt:attr>
</target> </target>
<target android:name="group_4"> <target android:name="group_4">
<aapt:attr name="android:animation"> <aapt:attr name="android:animation">
<set> <set>
<objectAnimator <objectAnimator
android:duration="350"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:propertyName="scaleX" android:propertyName="scaleX"
android:startOffset="400" android:startOffset="400"
android:duration="350"
android:valueFrom="1.5" android:valueFrom="1.5"
android:valueTo="1" android:valueTo="1"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:interpolator/fast_out_slow_in"/>
<objectAnimator <objectAnimator
android:duration="350"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:propertyName="scaleY" android:propertyName="scaleY"
android:startOffset="400" android:startOffset="400"
android:duration="350"
android:valueFrom="1.5" android:valueFrom="1.5"
android:valueTo="1" android:valueTo="1"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:interpolator/fast_out_slow_in"/>
</set> </set>
</aapt:attr> </aapt:attr>
</target> </target>
<target android:name="path_7"> <target android:name="path_7">
<aapt:attr name="android:animation"> <aapt:attr name="android:animation">
<objectAnimator <objectAnimator
android:duration="550"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:propertyName="fillAlpha" android:propertyName="fillAlpha"
android:startOffset="350" android:startOffset="350"
android:duration="550"
android:valueFrom="0" android:valueFrom="0"
android:valueTo="1" android:valueTo="1"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:interpolator/fast_out_slow_in"/>
</aapt:attr> </aapt:attr>
</target> </target>
<target android:name="group_5"> <target android:name="group_5">
<aapt:attr name="android:animation"> <aapt:attr name="android:animation">
<set> <set>
<objectAnimator <objectAnimator
android:duration="550"
android:interpolator="@android:anim/decelerate_interpolator"
android:propertyName="rotation" android:propertyName="rotation"
android:startOffset="350" android:startOffset="350"
android:duration="550"
android:valueFrom="-45" android:valueFrom="-45"
android:valueTo="0" android:valueTo="0"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:anim/decelerate_interpolator"/>
<objectAnimator <objectAnimator
android:duration="550"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:propertyName="scaleX" android:propertyName="scaleX"
android:startOffset="350" android:startOffset="350"
android:duration="550"
android:valueFrom="3" android:valueFrom="3"
android:valueTo="1" android:valueTo="1"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:interpolator/fast_out_slow_in"/>
<objectAnimator <objectAnimator
android:duration="550"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:propertyName="scaleY" android:propertyName="scaleY"
android:startOffset="350" android:startOffset="350"
android:duration="550"
android:valueFrom="3" android:valueFrom="3"
android:valueTo="1" android:valueTo="1"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:interpolator/fast_out_slow_in"/>
</set> </set>
</aapt:attr> </aapt:attr>
</target> </target>
<target android:name="group_8"> <target android:name="group_8">
<aapt:attr name="android:animation"> <aapt:attr name="android:animation">
<objectAnimator <objectAnimator
android:duration="350"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:propertyName="rotation" android:propertyName="rotation"
android:startOffset="100" android:startOffset="100"
android:duration="350"
android:valueFrom="-90" android:valueFrom="-90"
android:valueTo="0" android:valueTo="0"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:interpolator/fast_out_slow_in"/>
</aapt:attr> </aapt:attr>
</target> </target>
<target android:name="group_9"> <target android:name="group_9">
<aapt:attr name="android:animation"> <aapt:attr name="android:animation">
<set> <set>
<objectAnimator <objectAnimator
android:duration="350"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:propertyName="rotation" android:propertyName="rotation"
android:startOffset="100" android:startOffset="100"
android:duration="350"
android:valueFrom="-90" android:valueFrom="-90"
android:valueTo="0" android:valueTo="0"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:interpolator/fast_out_slow_in"/>
<objectAnimator <objectAnimator
android:duration="350"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:propertyName="scaleX" android:propertyName="scaleX"
android:duration="350"
android:valueFrom="0" android:valueFrom="0"
android:valueTo="1" android:valueTo="1"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:interpolator/fast_out_slow_in"/>
<objectAnimator <objectAnimator
android:propertyName="scaleY"
android:duration="350" android:duration="350"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:propertyName="scaleY"
android:valueFrom="0" android:valueFrom="0"
android:valueTo="1" android:valueTo="1"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:interpolator/fast_out_slow_in"/>
</set> </set>
</aapt:attr> </aapt:attr>
</target> </target>
<target android:name="group_11"> <target android:name="group_11">
<aapt:attr name="android:animation"> <aapt:attr name="android:animation">
<objectAnimator <objectAnimator
android:duration="350"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:propertyName="rotation" android:propertyName="rotation"
android:startOffset="100" android:startOffset="100"
android:duration="350"
android:valueFrom="-90" android:valueFrom="-90"
android:valueTo="0" android:valueTo="0"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:interpolator/fast_out_slow_in"/>
</aapt:attr> </aapt:attr>
</target> </target>
<target android:name="group_12"> <target android:name="group_12">
<aapt:attr name="android:animation"> <aapt:attr name="android:animation">
<set> <set>
<objectAnimator <objectAnimator
android:duration="550"
android:interpolator="@android:anim/overshoot_interpolator"
android:propertyName="scaleX" android:propertyName="scaleX"
android:duration="550"
android:valueFrom="0" android:valueFrom="0"
android:valueTo="1" android:valueTo="1"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:anim/overshoot_interpolator"/>
<objectAnimator <objectAnimator
android:propertyName="scaleY"
android:duration="550" android:duration="550"
android:interpolator="@android:anim/overshoot_interpolator"
android:propertyName="scaleY"
android:valueFrom="0" android:valueFrom="0"
android:valueTo="1" android:valueTo="1"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:anim/overshoot_interpolator"/>
</set> </set>
</aapt:attr> </aapt:attr>
</target> </target>
@ -336,19 +335,19 @@
<aapt:attr name="android:animation"> <aapt:attr name="android:animation">
<set> <set>
<objectAnimator <objectAnimator
android:duration="550"
android:interpolator="@android:anim/overshoot_interpolator"
android:propertyName="scaleX" android:propertyName="scaleX"
android:duration="550"
android:valueFrom="0" android:valueFrom="0"
android:valueTo="1" android:valueTo="1"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:anim/overshoot_interpolator"/>
<objectAnimator <objectAnimator
android:propertyName="scaleY"
android:duration="550" android:duration="550"
android:interpolator="@android:anim/overshoot_interpolator"
android:propertyName="scaleY"
android:valueFrom="0" android:valueFrom="0"
android:valueTo="1" android:valueTo="1"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:anim/overshoot_interpolator"/>
</set> </set>
</aapt:attr> </aapt:attr>
</target> </target>
@ -356,21 +355,21 @@
<aapt:attr name="android:animation"> <aapt:attr name="android:animation">
<set> <set>
<objectAnimator <objectAnimator
android:duration="200"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:propertyName="rotation" android:propertyName="rotation"
android:startOffset="350" android:startOffset="350"
android:duration="200"
android:valueFrom="5" android:valueFrom="5"
android:valueTo="0" android:valueTo="0"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:anim/accelerate_decelerate_interpolator"/>
<objectAnimator <objectAnimator
android:duration="100"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:propertyName="rotation" android:propertyName="rotation"
android:startOffset="250" android:startOffset="250"
android:duration="100"
android:valueFrom="0" android:valueFrom="0"
android:valueTo="5" android:valueTo="5"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:anim/accelerate_decelerate_interpolator"/>
</set> </set>
</aapt:attr> </aapt:attr>
</target> </target>

View file

@ -10,7 +10,8 @@
android:required="false" /> android:required="false" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" <uses-permission
android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"
tools:ignore="LeanbackUsesWifi" /> tools:ignore="LeanbackUsesWifi" />
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" /> <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
@ -289,8 +290,8 @@
<service <service
android:name=".widgets.CurrentlyAiringRemoteViewsService" android:name=".widgets.CurrentlyAiringRemoteViewsService"
android:permission="android.permission.BIND_REMOTEVIEWS" android:exported="true"
android:exported="true" /> android:permission="android.permission.BIND_REMOTEVIEWS" />
<service <service
android:name=".download.video.ExoplayerDownloadService" android:name=".download.video.ExoplayerDownloadService"
android:exported="false" android:exported="false"
@ -317,19 +318,22 @@
android:name=".download.novel.NovelDownloaderService" android:name=".download.novel.NovelDownloaderService"
android:exported="false" android:exported="false"
android:foregroundServiceType="dataSync" /> android:foregroundServiceType="dataSync" />
<service android:name=".download.anime.AnimeDownloaderService" <service
android:name=".download.anime.AnimeDownloaderService"
android:exported="false" android:exported="false"
android:foregroundServiceType="dataSync" /> android:foregroundServiceType="dataSync" />
<service <service
android:name=".connections.discord.DiscordService" android:name=".connections.discord.DiscordService"
android:exported="false" android:exported="false"
android:foregroundServiceType="dataSync" /> android:foregroundServiceType="dataSync" />
<service android:name="androidx.media3.exoplayer.scheduler.PlatformScheduler$PlatformSchedulerService" <service
android:permission="android.permission.BIND_JOB_SERVICE" android:name="androidx.media3.exoplayer.scheduler.PlatformScheduler$PlatformSchedulerService"
android:exported="true"/> android:exported="true"
android:permission="android.permission.BIND_JOB_SERVICE" />
<meta-data android:name="com.google.android.gms.cast.framework.OPTIONS_PROVIDER_CLASS_NAME" <meta-data
android:value="androidx.media3.cast.DefaultCastOptionsProvider"/> android:name="com.google.android.gms.cast.framework.OPTIONS_PROVIDER_CLASS_NAME"
android:value="androidx.media3.cast.DefaultCastOptionsProvider" />
</application> </application>
</manifest> </manifest>

View file

@ -15,8 +15,8 @@ import ani.dantotsu.parsers.MangaSources
import ani.dantotsu.parsers.NovelSources import ani.dantotsu.parsers.NovelSources
import ani.dantotsu.parsers.novel.NovelExtensionManager import ani.dantotsu.parsers.novel.NovelExtensionManager
import ani.dantotsu.settings.SettingsActivity import ani.dantotsu.settings.SettingsActivity
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefName
import com.google.android.material.color.DynamicColors import com.google.android.material.color.DynamicColors
import eu.kanade.tachiyomi.data.notification.Notifications import eu.kanade.tachiyomi.data.notification.Notifications
import eu.kanade.tachiyomi.extension.anime.AnimeExtensionManager import eu.kanade.tachiyomi.extension.anime.AnimeExtensionManager

View file

@ -48,8 +48,8 @@ import ani.dantotsu.connections.crashlytics.CrashlyticsInterface
import ani.dantotsu.databinding.ItemCountDownBinding import ani.dantotsu.databinding.ItemCountDownBinding
import ani.dantotsu.media.Media import ani.dantotsu.media.Media
import ani.dantotsu.parsers.ShowResponse import ani.dantotsu.parsers.ShowResponse
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.internal.PreferenceKeystore import ani.dantotsu.settings.saving.internal.PreferenceKeystore
import ani.dantotsu.settings.saving.internal.PreferenceKeystore.Companion.generateSalt import ani.dantotsu.settings.saving.internal.PreferenceKeystore.Companion.generateSalt
import ani.dantotsu.subcriptions.NotificationClickReceiver import ani.dantotsu.subcriptions.NotificationClickReceiver
@ -62,7 +62,6 @@ import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.google.android.material.bottomsheet.BottomSheetDialogFragment import com.google.android.material.bottomsheet.BottomSheetDialogFragment
import com.google.android.material.internal.ViewUtils import com.google.android.material.internal.ViewUtils
import com.google.android.material.snackbar.Snackbar import com.google.android.material.snackbar.Snackbar
import com.google.gson.Gson
import eu.kanade.tachiyomi.data.notification.Notifications import eu.kanade.tachiyomi.data.notification.Notifications
import kotlinx.coroutines.* import kotlinx.coroutines.*
import nl.joery.animatedbottombar.AnimatedBottomBar import nl.joery.animatedbottombar.AnimatedBottomBar
@ -304,7 +303,8 @@ class ZoomOutPageTransformer() :
0.5f to 0f 0.5f to 0f
) )
ObjectAnimator.ofFloat(view, "alpha", 0f, 1.0f) ObjectAnimator.ofFloat(view, "alpha", 0f, 1.0f)
.setDuration((200 * (PrefManager.getVal(PrefName.AnimationSpeed) as Float)).toLong()).start() .setDuration((200 * (PrefManager.getVal(PrefName.AnimationSpeed) as Float)).toLong())
.start()
} }
} }
} }
@ -592,7 +592,12 @@ fun saveImageToDownloads(title: String, bitmap: Bitmap, context: Context) {
) )
} }
fun savePrefsToDownloads(title: String, serialized: String, context: Context, password: CharArray? = null) { fun savePrefsToDownloads(
title: String,
serialized: String,
context: Context,
password: CharArray? = null
) {
FileProvider.getUriForFile( FileProvider.getUriForFile(
context, context,
"$APPLICATION_ID.provider", "$APPLICATION_ID.provider",
@ -634,7 +639,13 @@ fun savePrefs(serialized: String, path: String, title: String, context: Context)
} }
} }
fun savePrefs(serialized: String, path: String, title: String, context: Context, password: CharArray): File? { fun savePrefs(
serialized: String,
path: String,
title: String,
context: Context,
password: CharArray
): File? {
var file = File(path, "$title.ani") var file = File(path, "$title.ani")
var counter = 1 var counter = 1
while (file.exists()) { while (file.exists()) {

View file

@ -44,11 +44,10 @@ import ani.dantotsu.home.MangaFragment
import ani.dantotsu.home.NoInternet import ani.dantotsu.home.NoInternet
import ani.dantotsu.media.MediaDetailsActivity import ani.dantotsu.media.MediaDetailsActivity
import ani.dantotsu.others.CustomBottomDialog import ani.dantotsu.others.CustomBottomDialog
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefManager.asLiveBool import ani.dantotsu.settings.saving.PrefManager.asLiveBool
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.SharedPreferenceBooleanLiveData import ani.dantotsu.settings.saving.SharedPreferenceBooleanLiveData
import ani.dantotsu.settings.saving.internal.Location
import ani.dantotsu.subcriptions.Subscription.Companion.startSubscription import ani.dantotsu.subcriptions.Subscription.Companion.startSubscription
import ani.dantotsu.themes.ThemeManager import ani.dantotsu.themes.ThemeManager
import eu.kanade.domain.source.service.SourcePreferences import eu.kanade.domain.source.service.SourcePreferences

View file

@ -2,14 +2,11 @@ package ani.dantotsu.aniyomi.anime.custom
import android.app.Application import android.app.Application
import android.content.Context
import androidx.annotation.OptIn import androidx.annotation.OptIn
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.media3.common.util.UnstableApi import androidx.media3.common.util.UnstableApi
import androidx.media3.database.StandaloneDatabaseProvider import androidx.media3.database.StandaloneDatabaseProvider
import ani.dantotsu.BuildConfig
import ani.dantotsu.connections.crashlytics.CrashlyticsInterface import ani.dantotsu.connections.crashlytics.CrashlyticsInterface
import ani.dantotsu.connections.crashlytics.CrashlyticsStub
import ani.dantotsu.download.DownloadsManager import ani.dantotsu.download.DownloadsManager
import ani.dantotsu.media.manga.MangaCache import ani.dantotsu.media.manga.MangaCache
import ani.dantotsu.parsers.novel.NovelExtensionManager import ani.dantotsu.parsers.novel.NovelExtensionManager

View file

@ -6,8 +6,8 @@ import ani.dantotsu.connections.anilist.Anilist
import ani.dantotsu.connections.mal.MAL import ani.dantotsu.connections.mal.MAL
import ani.dantotsu.currContext import ani.dantotsu.currContext
import ani.dantotsu.media.Media import ani.dantotsu.media.Media
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.toast import ani.dantotsu.toast
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers

View file

@ -12,7 +12,6 @@ import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefName import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.toast import ani.dantotsu.toast
import ani.dantotsu.tryWithSuspend import ani.dantotsu.tryWithSuspend
import java.io.File
import java.util.Calendar import java.util.Calendar
object Anilist { object Anilist {

View file

@ -1,6 +1,7 @@
package ani.dantotsu.connections.anilist package ani.dantotsu.connections.anilist
import android.app.Activity import android.app.Activity
import android.util.Base64
import ani.dantotsu.R import ani.dantotsu.R
import ani.dantotsu.checkGenreTime import ani.dantotsu.checkGenreTime
import ani.dantotsu.checkId import ani.dantotsu.checkId
@ -17,18 +18,17 @@ import ani.dantotsu.media.Character
import ani.dantotsu.media.Media import ani.dantotsu.media.Media
import ani.dantotsu.media.Studio import ani.dantotsu.media.Studio
import ani.dantotsu.others.MalScraper import ani.dantotsu.others.MalScraper
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.snackString import ani.dantotsu.snackString
import kotlinx.coroutines.async import kotlinx.coroutines.async
import kotlinx.coroutines.awaitAll import kotlinx.coroutines.awaitAll
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
import java.io.ByteArrayInputStream
import java.io.ByteArrayOutputStream import java.io.ByteArrayOutputStream
import java.io.ObjectInputStream
import java.io.ObjectOutputStream import java.io.ObjectOutputStream
import java.io.Serializable import java.io.Serializable
import android.util.Base64
import java.io.ByteArrayInputStream
import java.io.ObjectInputStream
import kotlin.system.measureTimeMillis import kotlin.system.measureTimeMillis
class AnilistQueries { class AnilistQueries {
@ -445,9 +445,11 @@ class AnilistQueries {
suspend fun getGenresAndTags(activity: Activity): Boolean { suspend fun getGenresAndTags(activity: Activity): Boolean {
var genres: ArrayList<String>? = PrefManager.getVal<Set<String>>(PrefName.GenresList).toMutableList() as ArrayList<String>? var genres: ArrayList<String>? = PrefManager.getVal<Set<String>>(PrefName.GenresList)
.toMutableList() as ArrayList<String>?
val adultTags = PrefManager.getVal<Set<String>>(PrefName.TagsListIsAdult).toMutableList() val adultTags = PrefManager.getVal<Set<String>>(PrefName.TagsListIsAdult).toMutableList()
val nonAdultTags = PrefManager.getVal<Set<String>>(PrefName.TagsListNonAdult).toMutableList() val nonAdultTags =
PrefManager.getVal<Set<String>>(PrefName.TagsListNonAdult).toMutableList()
var tags = if (adultTags.isEmpty() || nonAdultTags.isEmpty()) null else var tags = if (adultTags.isEmpty() || nonAdultTags.isEmpty()) null else
mapOf( mapOf(
true to adultTags, true to adultTags,
@ -531,7 +533,8 @@ class AnilistQueries {
} }
private suspend fun getGenreThumbnail(genre: String): Genre? { private suspend fun getGenreThumbnail(genre: String): Genre? {
val genres: MutableMap<String, Genre> = loadSerializableMap<String, Genre>("genre_thumb")?.toMutableMap() val genres: MutableMap<String, Genre> =
loadSerializableMap<String, Genre>("genre_thumb")?.toMutableMap()
?: mutableMapOf() ?: mutableMapOf()
if (genres.checkGenreTime(genre)) { if (genres.checkGenreTime(genre)) {
try { try {

View file

@ -11,8 +11,8 @@ import ani.dantotsu.connections.discord.Discord
import ani.dantotsu.connections.mal.MAL import ani.dantotsu.connections.mal.MAL
import ani.dantotsu.media.Media import ani.dantotsu.media.Media
import ani.dantotsu.others.AppUpdater import ani.dantotsu.others.AppUpdater
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.snackString import ani.dantotsu.snackString
import ani.dantotsu.tryWithSuspend import ani.dantotsu.tryWithSuspend
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope

View file

@ -1,6 +1,5 @@
package ani.dantotsu.connections.anilist package ani.dantotsu.connections.anilist
import android.content.Context
import android.net.Uri import android.net.Uri
import android.os.Bundle import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
@ -21,7 +20,7 @@ class Login : AppCompatActivity() {
try { try {
Anilist.token = Anilist.token =
Regex("""(?<=access_token=).+(?=&token_type)""").find(data.toString())!!.value Regex("""(?<=access_token=).+(?=&token_type)""").find(data.toString())!!.value
PrefManager.setVal(PrefName.AnilistToken, Anilist.token?:"") PrefManager.setVal(PrefName.AnilistToken, Anilist.token ?: "")
} catch (e: Exception) { } catch (e: Exception) {
logError(e) logError(e)
} }

View file

@ -5,8 +5,8 @@ import android.content.Intent
import android.widget.TextView import android.widget.TextView
import ani.dantotsu.R import ani.dantotsu.R
import ani.dantotsu.others.CustomBottomDialog import ani.dantotsu.others.CustomBottomDialog
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.toast import ani.dantotsu.toast
import ani.dantotsu.tryWith import ani.dantotsu.tryWith
import io.noties.markwon.Markwon import io.noties.markwon.Markwon
@ -22,7 +22,8 @@ object Discord {
fun getSavedToken(context: Context): Boolean { fun getSavedToken(context: Context): Boolean {
token = PrefManager.getVal( token = PrefManager.getVal(
PrefName.DiscordToken, null as String?) PrefName.DiscordToken, null as String?
)
return token != null return token != null
} }

View file

@ -24,8 +24,8 @@ import ani.dantotsu.R
import ani.dantotsu.connections.discord.serializers.Presence import ani.dantotsu.connections.discord.serializers.Presence
import ani.dantotsu.connections.discord.serializers.User import ani.dantotsu.connections.discord.serializers.User
import ani.dantotsu.isOnline import ani.dantotsu.isOnline
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefName
import com.google.gson.JsonArray import com.google.gson.JsonArray
import com.google.gson.JsonObject import com.google.gson.JsonObject
import com.google.gson.JsonParser import com.google.gson.JsonParser

View file

@ -9,8 +9,8 @@ import ani.dantotsu.client
import ani.dantotsu.connections.mal.MAL.clientId import ani.dantotsu.connections.mal.MAL.clientId
import ani.dantotsu.connections.mal.MAL.saveResponse import ani.dantotsu.connections.mal.MAL.saveResponse
import ani.dantotsu.logError import ani.dantotsu.logError
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.snackString import ani.dantotsu.snackString
import ani.dantotsu.startMainActivity import ani.dantotsu.startMainActivity
import ani.dantotsu.themes.ThemeManager import ani.dantotsu.themes.ThemeManager

View file

@ -10,8 +10,8 @@ import ani.dantotsu.R
import ani.dantotsu.client import ani.dantotsu.client
import ani.dantotsu.currContext import ani.dantotsu.currContext
import ani.dantotsu.openLinkInBrowser import ani.dantotsu.openLinkInBrowser
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.tryWithSuspend import ani.dantotsu.tryWithSuspend
import kotlinx.serialization.SerialName import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
@ -66,7 +66,8 @@ object MAL {
suspend fun getSavedToken(context: FragmentActivity): Boolean { suspend fun getSavedToken(context: FragmentActivity): Boolean {
return tryWithSuspend(false) { return tryWithSuspend(false) {
var res: ResponseToken = PrefManager.getNullableVal<ResponseToken>(PrefName.MALToken, null) var res: ResponseToken =
PrefManager.getNullableVal<ResponseToken>(PrefName.MALToken, null)
?: return@tryWithSuspend false ?: return@tryWithSuspend false
if (System.currentTimeMillis() > res.expiresIn) if (System.currentTimeMillis() > res.expiresIn)
res = refreshToken() res = refreshToken()

View file

@ -3,8 +3,8 @@ package ani.dantotsu.download
import android.content.Context import android.content.Context
import android.os.Environment import android.os.Environment
import android.widget.Toast import android.widget.Toast
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefName
import com.google.gson.Gson import com.google.gson.Gson
import com.google.gson.reflect.TypeToken import com.google.gson.reflect.TypeToken
import java.io.File import java.io.File

View file

@ -12,8 +12,8 @@ import android.widget.LinearLayout
import android.widget.TextView import android.widget.TextView
import androidx.cardview.widget.CardView import androidx.cardview.widget.CardView
import ani.dantotsu.R import ani.dantotsu.R
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefName
class OfflineAnimeAdapter( class OfflineAnimeAdapter(

View file

@ -39,8 +39,8 @@ import ani.dantotsu.media.MediaDetailsActivity
import ani.dantotsu.navBarHeight import ani.dantotsu.navBarHeight
import ani.dantotsu.setSafeOnClickListener import ani.dantotsu.setSafeOnClickListener
import ani.dantotsu.settings.SettingsDialogFragment import ani.dantotsu.settings.SettingsDialogFragment
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.snackString import ani.dantotsu.snackString
import com.google.android.material.card.MaterialCardView import com.google.android.material.card.MaterialCardView
import com.google.android.material.imageview.ShapeableImageView import com.google.android.material.imageview.ShapeableImageView
@ -197,7 +197,9 @@ class OfflineAnimeFragment : Fragment(), OfflineAnimeSearchListener {
builder.setMessage("Are you sure you want to delete ${item.title}?") builder.setMessage("Are you sure you want to delete ${item.title}?")
builder.setPositiveButton("Yes") { _, _ -> builder.setPositiveButton("Yes") { _, _ ->
downloadManager.removeMedia(item.title, type) downloadManager.removeMedia(item.title, type)
val mediaIds = PrefManager.getAnimeDownloadPreferences().all?.filter { it.key.contains(item.title) }?.values ?: emptySet() val mediaIds =
PrefManager.getAnimeDownloadPreferences().all?.filter { it.key.contains(item.title) }?.values
?: emptySet()
if (mediaIds.isEmpty()) { if (mediaIds.isEmpty()) {
snackString("No media found") // if this happens, terrible things have happened snackString("No media found") // if this happens, terrible things have happened
} }

View file

@ -11,8 +11,8 @@ import android.widget.LinearLayout
import android.widget.TextView import android.widget.TextView
import androidx.cardview.widget.CardView import androidx.cardview.widget.CardView
import ani.dantotsu.R import ani.dantotsu.R
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefName
class OfflineMangaAdapter( class OfflineMangaAdapter(

View file

@ -36,8 +36,8 @@ import ani.dantotsu.media.MediaDetailsActivity
import ani.dantotsu.navBarHeight import ani.dantotsu.navBarHeight
import ani.dantotsu.setSafeOnClickListener import ani.dantotsu.setSafeOnClickListener
import ani.dantotsu.settings.SettingsDialogFragment import ani.dantotsu.settings.SettingsDialogFragment
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.snackString import ani.dantotsu.snackString
import com.google.android.material.card.MaterialCardView import com.google.android.material.card.MaterialCardView
import com.google.android.material.imageview.ShapeableImageView import com.google.android.material.imageview.ShapeableImageView

View file

@ -32,8 +32,8 @@ import ani.dantotsu.media.ProgressAdapter
import ani.dantotsu.media.SearchActivity import ani.dantotsu.media.SearchActivity
import ani.dantotsu.navBarHeight import ani.dantotsu.navBarHeight
import ani.dantotsu.px import ani.dantotsu.px
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.snackString import ani.dantotsu.snackString
import ani.dantotsu.statusBarHeight import ani.dantotsu.statusBarHeight
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
@ -264,8 +264,11 @@ class AnimeFragment : Fragment() {
model.loaded = true model.loaded = true
model.loadTrending(1) model.loadTrending(1)
model.loadUpdated() model.loadUpdated()
model.loadPopular("ANIME", sort = Anilist.sortBy[1], onList = PrefManager.getVal( model.loadPopular(
PrefName.PopularAnimeList)) "ANIME", sort = Anilist.sortBy[1], onList = PrefManager.getVal(
PrefName.PopularAnimeList
)
)
} }
live.postValue(false) live.postValue(false)
_binding?.animeRefresh?.isRefreshing = false _binding?.animeRefresh?.isRefreshing = false

View file

@ -31,8 +31,8 @@ import ani.dantotsu.setSafeOnClickListener
import ani.dantotsu.setSlideIn import ani.dantotsu.setSlideIn
import ani.dantotsu.setSlideUp import ani.dantotsu.setSlideUp
import ani.dantotsu.settings.SettingsDialogFragment import ani.dantotsu.settings.SettingsDialogFragment
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.statusBarHeight import ani.dantotsu.statusBarHeight
import com.google.android.material.card.MaterialCardView import com.google.android.material.card.MaterialCardView
import com.google.android.material.textfield.TextInputLayout import com.google.android.material.textfield.TextInputLayout

View file

@ -36,8 +36,8 @@ import ani.dantotsu.setSafeOnClickListener
import ani.dantotsu.setSlideIn import ani.dantotsu.setSlideIn
import ani.dantotsu.setSlideUp import ani.dantotsu.setSlideUp
import ani.dantotsu.settings.SettingsDialogFragment import ani.dantotsu.settings.SettingsDialogFragment
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.snackString import ani.dantotsu.snackString
import ani.dantotsu.statusBarHeight import ani.dantotsu.statusBarHeight
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
@ -337,7 +337,8 @@ class HomeFragment : Fragment() {
model.loaded = true model.loaded = true
model.setListImages() model.setListImages()
var empty = true var empty = true
val homeLayoutShow: List<Boolean> = PrefManager.getVal(PrefName.HomeLayoutShow) val homeLayoutShow: List<Boolean> =
PrefManager.getVal(PrefName.HomeLayoutShow)
(array.indices).forEach { i -> (array.indices).forEach { i ->
if (homeLayoutShow.elementAt(i)) { if (homeLayoutShow.elementAt(i)) {
array[i].run() array[i].run()

View file

@ -16,10 +16,8 @@ import ani.dantotsu.databinding.FragmentLoginBinding
import ani.dantotsu.openLinkInBrowser import ani.dantotsu.openLinkInBrowser
import ani.dantotsu.settings.saving.internal.PreferenceKeystore import ani.dantotsu.settings.saving.internal.PreferenceKeystore
import ani.dantotsu.settings.saving.internal.PreferencePackager import ani.dantotsu.settings.saving.internal.PreferencePackager
import ani.dantotsu.statusBarHeight
import ani.dantotsu.toast import ani.dantotsu.toast
import com.google.android.material.textfield.TextInputEditText import com.google.android.material.textfield.TextInputEditText
import eltos.simpledialogfragment.SimpleDialog
class LoginFragment : Fragment() { class LoginFragment : Fragment() {
@ -41,12 +39,15 @@ class LoginFragment : Fragment() {
binding.loginGithub.setOnClickListener { openLinkInBrowser(getString(R.string.github)) } binding.loginGithub.setOnClickListener { openLinkInBrowser(getString(R.string.github)) }
binding.loginTelegram.setOnClickListener { openLinkInBrowser(getString(R.string.telegram)) } binding.loginTelegram.setOnClickListener { openLinkInBrowser(getString(R.string.telegram)) }
val openDocumentLauncher = registerForActivityResult(ActivityResultContracts.OpenDocument()) { uri -> val openDocumentLauncher =
registerForActivityResult(ActivityResultContracts.OpenDocument()) { uri ->
if (uri != null) { if (uri != null) {
try { try {
val jsonString = requireActivity().contentResolver.openInputStream(uri)?.readBytes() val jsonString =
requireActivity().contentResolver.openInputStream(uri)?.readBytes()
?: throw Exception("Error reading file") ?: throw Exception("Error reading file")
val name = DocumentFile.fromSingleUri(requireActivity(), uri)?.name ?: "settings" val name =
DocumentFile.fromSingleUri(requireActivity(), uri)?.name ?: "settings"
//.sani is encrypted, .ani is not //.sani is encrypted, .ani is not
if (name.endsWith(".sani")) { if (name.endsWith(".sani")) {
passwordAlertDialog() { password -> passwordAlertDialog() { password ->
@ -63,7 +64,7 @@ class LoginFragment : Fragment() {
toast("Incorrect password") toast("Incorrect password")
return@passwordAlertDialog return@passwordAlertDialog
} }
if(PreferencePackager.unpack(decryptedJson)) if (PreferencePackager.unpack(decryptedJson))
restartApp() restartApp()
} else { } else {
toast("Password cannot be empty") toast("Password cannot be empty")
@ -71,7 +72,7 @@ class LoginFragment : Fragment() {
} }
} else if (name.endsWith(".ani")) { } else if (name.endsWith(".ani")) {
val decryptedJson = jsonString.toString(Charsets.UTF_8) val decryptedJson = jsonString.toString(Charsets.UTF_8)
if(PreferencePackager.unpack(decryptedJson)) if (PreferencePackager.unpack(decryptedJson))
restartApp() restartApp()
} else { } else {
toast("Invalid file type") toast("Invalid file type")
@ -92,7 +93,8 @@ class LoginFragment : Fragment() {
val password = CharArray(16).apply { fill('0') } val password = CharArray(16).apply { fill('0') }
// Inflate the dialog layout // Inflate the dialog layout
val dialogView = LayoutInflater.from(requireActivity()).inflate(R.layout.dialog_user_agent, null) val dialogView =
LayoutInflater.from(requireActivity()).inflate(R.layout.dialog_user_agent, null)
dialogView.findViewById<TextInputEditText>(R.id.userAgentTextBox)?.hint = "Password" dialogView.findViewById<TextInputEditText>(R.id.userAgentTextBox)?.hint = "Password"
val subtitleTextView = dialogView.findViewById<TextView>(R.id.subtitle) val subtitleTextView = dialogView.findViewById<TextView>(R.id.subtitle)
subtitleTextView?.visibility = View.VISIBLE subtitleTextView?.visibility = View.VISIBLE

View file

@ -29,8 +29,8 @@ import ani.dantotsu.media.MediaAdaptor
import ani.dantotsu.media.ProgressAdapter import ani.dantotsu.media.ProgressAdapter
import ani.dantotsu.navBarHeight import ani.dantotsu.navBarHeight
import ani.dantotsu.px import ani.dantotsu.px
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.snackString import ani.dantotsu.snackString
import ani.dantotsu.statusBarHeight import ani.dantotsu.statusBarHeight
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
@ -238,8 +238,11 @@ class MangaFragment : Fragment() {
model.loaded = true model.loaded = true
model.loadTrending() model.loadTrending()
model.loadTrendingNovel() model.loadTrendingNovel()
model.loadPopular("MANGA", sort = Anilist.sortBy[1], onList = PrefManager.getVal( model.loadPopular(
PrefName.PopularMangaList)) "MANGA", sort = Anilist.sortBy[1], onList = PrefManager.getVal(
PrefName.PopularMangaList
)
)
} }
live.postValue(false) live.postValue(false)
_binding?.mangaRefresh?.isRefreshing = false _binding?.mangaRefresh?.isRefreshing = false

View file

@ -30,8 +30,8 @@ import ani.dantotsu.setSafeOnClickListener
import ani.dantotsu.setSlideIn import ani.dantotsu.setSlideIn
import ani.dantotsu.setSlideUp import ani.dantotsu.setSlideUp
import ani.dantotsu.settings.SettingsDialogFragment import ani.dantotsu.settings.SettingsDialogFragment
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.statusBarHeight import ani.dantotsu.statusBarHeight
import com.google.android.material.card.MaterialCardView import com.google.android.material.card.MaterialCardView
import com.google.android.material.textfield.TextInputLayout import com.google.android.material.textfield.TextInputLayout

View file

@ -25,8 +25,8 @@ import ani.dantotsu.initActivity
import ani.dantotsu.navBarHeight import ani.dantotsu.navBarHeight
import ani.dantotsu.offline.OfflineFragment import ani.dantotsu.offline.OfflineFragment
import ani.dantotsu.selectedOption import ani.dantotsu.selectedOption
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.snackString import ani.dantotsu.snackString
import ani.dantotsu.themes.ThemeManager import ani.dantotsu.themes.ThemeManager
import nl.joery.animatedbottombar.AnimatedBottomBar import nl.joery.animatedbottombar.AnimatedBottomBar

View file

@ -18,8 +18,8 @@ import ani.dantotsu.Refresh
import ani.dantotsu.databinding.ActivityListBinding import ani.dantotsu.databinding.ActivityListBinding
import ani.dantotsu.media.user.ListViewPagerAdapter import ani.dantotsu.media.user.ListViewPagerAdapter
import ani.dantotsu.navBarHeight import ani.dantotsu.navBarHeight
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.statusBarHeight import ani.dantotsu.statusBarHeight
import ani.dantotsu.themes.ThemeManager import ani.dantotsu.themes.ThemeManager
import com.google.android.material.tabs.TabLayout import com.google.android.material.tabs.TabLayout

View file

@ -22,8 +22,8 @@ import ani.dantotsu.navBarHeight
import ani.dantotsu.others.ImageViewDialog import ani.dantotsu.others.ImageViewDialog
import ani.dantotsu.others.getSerialized import ani.dantotsu.others.getSerialized
import ani.dantotsu.px import ani.dantotsu.px
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.statusBarHeight import ani.dantotsu.statusBarHeight
import ani.dantotsu.themes.ThemeManager import ani.dantotsu.themes.ThemeManager
import com.google.android.material.appbar.AppBarLayout import com.google.android.material.appbar.AppBarLayout

View file

@ -13,8 +13,8 @@ import ani.dantotsu.connections.anilist.GenresViewModel
import ani.dantotsu.databinding.ActivityGenreBinding import ani.dantotsu.databinding.ActivityGenreBinding
import ani.dantotsu.initActivity import ani.dantotsu.initActivity
import ani.dantotsu.navBarHeight import ani.dantotsu.navBarHeight
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.statusBarHeight import ani.dantotsu.statusBarHeight
import ani.dantotsu.themes.ThemeManager import ani.dantotsu.themes.ThemeManager
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
@ -54,8 +54,9 @@ class GenreActivity : AppCompatActivity() {
GridLayoutManager(this, (screenWidth / 156f).toInt()) GridLayoutManager(this, (screenWidth / 156f).toInt())
lifecycleScope.launch(Dispatchers.IO) { lifecycleScope.launch(Dispatchers.IO) {
model.loadGenres(Anilist.genres ?: model.loadGenres(
loadLocalGenres() ?: arrayListOf()) { Anilist.genres ?: loadLocalGenres() ?: arrayListOf()
) {
MainScope().launch { MainScope().launch {
adapter.addGenre(it) adapter.addGenre(it)
} }
@ -65,7 +66,8 @@ class GenreActivity : AppCompatActivity() {
} }
private fun loadLocalGenres(): ArrayList<String>? { private fun loadLocalGenres(): ArrayList<String>? {
val genres = PrefManager.getVal<Set<String>>(PrefName.GenresList).toMutableList() as ArrayList<String>? val genres = PrefManager.getVal<Set<String>>(PrefName.GenresList)
.toMutableList() as ArrayList<String>?
return if (genres.isNullOrEmpty()) { return if (genres.isNullOrEmpty()) {
null null
} else { } else {

View file

@ -26,8 +26,8 @@ import ani.dantotsu.databinding.ItemMediaCompactBinding
import ani.dantotsu.databinding.ItemMediaLargeBinding import ani.dantotsu.databinding.ItemMediaLargeBinding
import ani.dantotsu.databinding.ItemMediaPageBinding import ani.dantotsu.databinding.ItemMediaPageBinding
import ani.dantotsu.databinding.ItemMediaPageSmallBinding import ani.dantotsu.databinding.ItemMediaPageSmallBinding
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefName
import com.bumptech.glide.Glide import com.bumptech.glide.Glide
import com.bumptech.glide.load.engine.DiskCacheStrategy import com.bumptech.glide.load.engine.DiskCacheStrategy
import com.bumptech.glide.load.model.GlideUrl import com.bumptech.glide.load.model.GlideUrl

View file

@ -42,8 +42,8 @@ import ani.dantotsu.navBarHeight
import ani.dantotsu.openLinkInBrowser import ani.dantotsu.openLinkInBrowser
import ani.dantotsu.others.ImageViewDialog import ani.dantotsu.others.ImageViewDialog
import ani.dantotsu.others.getSerialized import ani.dantotsu.others.getSerialized
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.snackString import ani.dantotsu.snackString
import ani.dantotsu.statusBarHeight import ani.dantotsu.statusBarHeight
import ani.dantotsu.themes.ThemeManager import ani.dantotsu.themes.ThemeManager

View file

@ -25,8 +25,8 @@ import ani.dantotsu.parsers.NovelSources
import ani.dantotsu.parsers.ShowResponse import ani.dantotsu.parsers.ShowResponse
import ani.dantotsu.parsers.VideoExtractor import ani.dantotsu.parsers.VideoExtractor
import ani.dantotsu.parsers.WatchSources import ani.dantotsu.parsers.WatchSources
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.snackString import ani.dantotsu.snackString
import ani.dantotsu.tryWithSuspend import ani.dantotsu.tryWithSuspend
import com.bumptech.glide.load.resource.bitmap.BitmapTransformation import com.bumptech.glide.load.resource.bitmap.BitmapTransformation
@ -43,7 +43,8 @@ class MediaDetailsViewModel : ViewModel() {
fun loadSelected(media: Media, isDownload: Boolean = false): Selected { fun loadSelected(media: Media, isDownload: Boolean = false): Selected {
val data = PrefManager.getNullableCustomVal("Selected-${media.id}", null, Selected::class.java) val data =
PrefManager.getNullableCustomVal("Selected-${media.id}", null, Selected::class.java)
?: Selected().let { ?: Selected().let {
it.sourceIndex = 0 it.sourceIndex = 0
it.preferDub = PrefManager.getVal(PrefName.SettingsPreferDub) it.preferDub = PrefManager.getVal(PrefName.SettingsPreferDub)

View file

@ -25,8 +25,8 @@ import ani.dantotsu.*
import ani.dantotsu.connections.anilist.Anilist import ani.dantotsu.connections.anilist.Anilist
import ani.dantotsu.connections.anilist.GenresViewModel import ani.dantotsu.connections.anilist.GenresViewModel
import ani.dantotsu.databinding.* import ani.dantotsu.databinding.*
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefName
import io.noties.markwon.Markwon import io.noties.markwon.Markwon
import io.noties.markwon.SoftBreakAddsNewLinePlugin import io.noties.markwon.SoftBreakAddsNewLinePlugin
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
@ -97,7 +97,7 @@ class MediaInfoFragment : Fragment() {
if (media.anime != null) { if (media.anime != null) {
val episodeDuration = media.anime.episodeDuration val episodeDuration = media.anime.episodeDuration
binding.mediaInfoDuration.text = when { binding.mediaInfoDuration.text = when {
episodeDuration != null -> { episodeDuration != null -> {
val hours = episodeDuration / 60 val hours = episodeDuration / 60
val minutes = episodeDuration % 60 val minutes = episodeDuration % 60
@ -117,8 +117,9 @@ binding.mediaInfoDuration.text = when {
formattedDuration formattedDuration
} }
else -> "??" else -> "??"
} }
binding.mediaInfoDurationContainer.visibility = View.VISIBLE binding.mediaInfoDurationContainer.visibility = View.VISIBLE
binding.mediaInfoSeasonContainer.visibility = View.VISIBLE binding.mediaInfoSeasonContainer.visibility = View.VISIBLE
binding.mediaInfoSeason.text = binding.mediaInfoSeason.text =

View file

@ -16,8 +16,8 @@ import ani.dantotsu.connections.anilist.Anilist
import ani.dantotsu.connections.anilist.AnilistSearch import ani.dantotsu.connections.anilist.AnilistSearch
import ani.dantotsu.connections.anilist.SearchResults import ani.dantotsu.connections.anilist.SearchResults
import ani.dantotsu.databinding.ActivitySearchBinding import ani.dantotsu.databinding.ActivitySearchBinding
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.themes.ThemeManager import ani.dantotsu.themes.ThemeManager
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch

View file

@ -22,8 +22,8 @@ import ani.dantotsu.R
import ani.dantotsu.connections.anilist.Anilist import ani.dantotsu.connections.anilist.Anilist
import ani.dantotsu.databinding.ItemChipBinding import ani.dantotsu.databinding.ItemChipBinding
import ani.dantotsu.databinding.ItemSearchHeaderBinding import ani.dantotsu.databinding.ItemSearchHeaderBinding
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefName
import com.google.android.material.checkbox.MaterialCheckBox.* import com.google.android.material.checkbox.MaterialCheckBox.*
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers

View file

@ -8,15 +8,16 @@ import androidx.recyclerview.widget.ListAdapter
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import ani.dantotsu.R import ani.dantotsu.R
import ani.dantotsu.databinding.ItemSearchHistoryBinding import ani.dantotsu.databinding.ItemSearchHistoryBinding
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefManager.asLiveStringSet import ani.dantotsu.settings.saving.PrefManager.asLiveStringSet
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.SharedPreferenceStringSetLiveData import ani.dantotsu.settings.saving.SharedPreferenceStringSetLiveData
import java.util.Locale import java.util.Locale
class SearchHistoryAdapter(private val type: String, private val searchClicked: (String) -> Unit) : ListAdapter<String, SearchHistoryAdapter.SearchHistoryViewHolder>( class SearchHistoryAdapter(private val type: String, private val searchClicked: (String) -> Unit) :
ListAdapter<String, SearchHistoryAdapter.SearchHistoryViewHolder>(
DIFF_CALLBACK_INSTALLED DIFF_CALLBACK_INSTALLED
) { ) {
private var searchHistoryLiveData: SharedPreferenceStringSetLiveData? = null private var searchHistoryLiveData: SharedPreferenceStringSetLiveData? = null
private var searchHistory: MutableSet<String>? = null private var searchHistory: MutableSet<String>? = null
private var historyType: PrefName = when (type.lowercase(Locale.ROOT)) { private var historyType: PrefName = when (type.lowercase(Locale.ROOT)) {
@ -26,7 +27,8 @@ class SearchHistoryAdapter(private val type: String, private val searchClicked:
} }
init { init {
searchHistoryLiveData = PrefManager.getLiveVal(historyType, mutableSetOf<String>()).asLiveStringSet() searchHistoryLiveData =
PrefManager.getLiveVal(historyType, mutableSetOf<String>()).asLiveStringSet()
searchHistoryLiveData?.observeForever { searchHistoryLiveData?.observeForever {
searchHistory = it.toMutableSet() searchHistory = it.toMutableSet()
submitList(searchHistory?.reversed()) submitList(searchHistory?.reversed())

View file

@ -26,8 +26,8 @@ import ani.dantotsu.others.webview.CookieCatcher
import ani.dantotsu.parsers.AnimeSources import ani.dantotsu.parsers.AnimeSources
import ani.dantotsu.parsers.DynamicAnimeParser import ani.dantotsu.parsers.DynamicAnimeParser
import ani.dantotsu.parsers.WatchSources import ani.dantotsu.parsers.WatchSources
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.subcriptions.Notifications.Companion.openSettings import ani.dantotsu.subcriptions.Notifications.Companion.openSettings
import ani.dantotsu.subcriptions.Subscription.Companion.getChannelId import ani.dantotsu.subcriptions.Subscription.Companion.getChannelId
import com.google.android.material.chip.Chip import com.google.android.material.chip.Chip
@ -198,7 +198,8 @@ class AnimeWatchAdapter(
var refresh = false var refresh = false
var run = false var run = false
var reversed = media.selected!!.recyclerReversed var reversed = media.selected!!.recyclerReversed
var style = media.selected!!.recyclerStyle ?: PrefManager.getVal(PrefName.AnimeDefaultView) var style =
media.selected!!.recyclerStyle ?: PrefManager.getVal(PrefName.AnimeDefaultView)
dialogBinding.animeSourceTop.rotation = if (reversed) -90f else 90f dialogBinding.animeSourceTop.rotation = if (reversed) -90f else 90f
dialogBinding.sortText.text = if (reversed) "Down to Up" else "Up to Down" dialogBinding.sortText.text = if (reversed) "Down to Up" else "Up to Down"
dialogBinding.animeSourceTop.setOnClickListener { dialogBinding.animeSourceTop.setOnClickListener {
@ -356,7 +357,9 @@ class AnimeWatchAdapter(
val episodes = media.anime.episodes!!.keys.toTypedArray() val episodes = media.anime.episodes!!.keys.toTypedArray()
val anilistEp = (media.userProgress ?: 0).plus(1) val anilistEp = (media.userProgress ?: 0).plus(1)
val appEp = PrefManager.getCustomVal<String?>("${media.id}_current_ep", "")?.toIntOrNull() ?: 1 val appEp =
PrefManager.getCustomVal<String?>("${media.id}_current_ep", "")?.toIntOrNull()
?: 1
var continueEp = (if (anilistEp > appEp) anilistEp else appEp).toString() var continueEp = (if (anilistEp > appEp) anilistEp else appEp).toString()
if (episodes.contains(continueEp)) { if (episodes.contains(continueEp)) {
@ -368,7 +371,10 @@ class AnimeWatchAdapter(
media.id, media.id,
continueEp continueEp
) )
if ((binding.itemEpisodeProgress.layoutParams as LinearLayout.LayoutParams).weight > PrefManager.getVal<Float>(PrefName.WatchPercentage)) { if ((binding.itemEpisodeProgress.layoutParams as LinearLayout.LayoutParams).weight > PrefManager.getVal<Float>(
PrefName.WatchPercentage
)
) {
val e = episodes.indexOf(continueEp) val e = episodes.indexOf(continueEp)
if (e != -1 && e + 1 < episodes.size) { if (e != -1 && e + 1 < episodes.size) {
continueEp = episodes[e + 1] continueEp = episodes[e + 1]
@ -395,7 +401,10 @@ class AnimeWatchAdapter(
fragment.onEpisodeClick(continueEp) fragment.onEpisodeClick(continueEp)
} }
if (fragment.continueEp) { if (fragment.continueEp) {
if ((binding.itemEpisodeProgress.layoutParams as LinearLayout.LayoutParams).weight < PrefManager.getVal<Float>(PrefName.WatchPercentage)) { if ((binding.itemEpisodeProgress.layoutParams as LinearLayout.LayoutParams).weight < PrefManager.getVal<Float>(
PrefName.WatchPercentage
)
) {
binding.animeSourceContinue.performClick() binding.animeSourceContinue.performClick()
fragment.continueEp = false fragment.continueEp = false
} }

View file

@ -41,8 +41,8 @@ import ani.dantotsu.parsers.AnimeParser
import ani.dantotsu.parsers.AnimeSources import ani.dantotsu.parsers.AnimeSources
import ani.dantotsu.parsers.HAnimeSources import ani.dantotsu.parsers.HAnimeSources
import ani.dantotsu.settings.extensionprefs.AnimeSourcePreferencesFragment import ani.dantotsu.settings.extensionprefs.AnimeSourcePreferencesFragment
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.subcriptions.Notifications import ani.dantotsu.subcriptions.Notifications
import ani.dantotsu.subcriptions.Notifications.Group.ANIME_GROUP import ani.dantotsu.subcriptions.Notifications.Group.ANIME_GROUP
import ani.dantotsu.subcriptions.Subscription.Companion.getChannelId import ani.dantotsu.subcriptions.Subscription.Companion.getChannelId

View file

@ -28,8 +28,8 @@ import ani.dantotsu.others.Download.download
import ani.dantotsu.parsers.Subtitle import ani.dantotsu.parsers.Subtitle
import ani.dantotsu.parsers.VideoExtractor import ani.dantotsu.parsers.VideoExtractor
import ani.dantotsu.parsers.VideoType import ani.dantotsu.parsers.VideoType
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefName
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch

View file

@ -107,7 +107,8 @@ class SubtitleDialogFragment : BottomSheetDialogFragment() {
} }
model.getMedia().observe(viewLifecycleOwner) { media -> model.getMedia().observe(viewLifecycleOwner) { media ->
val mediaID: Int = media.id val mediaID: Int = media.id
val selSubs: String? = PrefManager.getCustomVal<String?>("subLang_${mediaID}", null) val selSubs: String? =
PrefManager.getCustomVal<String?>("subLang_${mediaID}", null)
if (episode.selectedSubtitle != position - 1 && selSubs != subtitles[position - 1].language) { if (episode.selectedSubtitle != position - 1 && selSubs != subtitles[position - 1].language) {
binding.root.setCardBackgroundColor(TRANSPARENT) binding.root.setCardBackgroundColor(TRANSPARENT)
} }
@ -118,7 +119,10 @@ class SubtitleDialogFragment : BottomSheetDialogFragment() {
model.setEpisode(episode, "Subtitle") model.setEpisode(episode, "Subtitle")
model.getMedia().observe(viewLifecycleOwner) { media -> model.getMedia().observe(viewLifecycleOwner) { media ->
val mediaID: Int = media.id val mediaID: Int = media.id
PrefManager.setCustomVal("subLang_${mediaID}", subtitles[position - 1].language) PrefManager.setCustomVal(
"subLang_${mediaID}",
subtitles[position - 1].language
)
} }
dismiss() dismiss()
} }

View file

@ -27,8 +27,8 @@ import ani.dantotsu.others.webview.CookieCatcher
import ani.dantotsu.parsers.DynamicMangaParser import ani.dantotsu.parsers.DynamicMangaParser
import ani.dantotsu.parsers.MangaReadSources import ani.dantotsu.parsers.MangaReadSources
import ani.dantotsu.parsers.MangaSources import ani.dantotsu.parsers.MangaSources
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.subcriptions.Notifications.Companion.openSettings import ani.dantotsu.subcriptions.Notifications.Companion.openSettings
import ani.dantotsu.subcriptions.Subscription.Companion.getChannelId import ani.dantotsu.subcriptions.Subscription.Companion.getChannelId
import com.google.android.material.chip.Chip import com.google.android.material.chip.Chip
@ -70,7 +70,8 @@ class MangaReadAdapter(
null null
) )
} }
val offline = if (!isOnline(binding.root.context) || PrefManager.getVal(PrefName.OfflineMode) val offline =
if (!isOnline(binding.root.context) || PrefManager.getVal(PrefName.OfflineMode)
) View.GONE else View.VISIBLE ) View.GONE else View.VISIBLE
binding.animeSourceNameContainer.visibility = offline binding.animeSourceNameContainer.visibility = offline
@ -160,7 +161,8 @@ class MangaReadAdapter(
var refresh = false var refresh = false
var run = false var run = false
var reversed = media.selected!!.recyclerReversed var reversed = media.selected!!.recyclerReversed
var style = media.selected!!.recyclerStyle ?: PrefManager.getVal(PrefName.MangaDefaultView) var style =
media.selected!!.recyclerStyle ?: PrefManager.getVal(PrefName.MangaDefaultView)
dialogBinding.animeSourceTop.rotation = if (reversed) -90f else 90f dialogBinding.animeSourceTop.rotation = if (reversed) -90f else 90f
dialogBinding.sortText.text = if (reversed) "Down to Up" else "Up to Down" dialogBinding.sortText.text = if (reversed) "Down to Up" else "Up to Down"
dialogBinding.animeSourceTop.setOnClickListener { dialogBinding.animeSourceTop.setOnClickListener {
@ -389,7 +391,8 @@ class MangaReadAdapter(
if (media.manga?.chapters != null) { if (media.manga?.chapters != null) {
val chapters = media.manga.chapters!!.keys.toTypedArray() val chapters = media.manga.chapters!!.keys.toTypedArray()
val anilistEp = (media.userProgress ?: 0).plus(1) val anilistEp = (media.userProgress ?: 0).plus(1)
val appEp = PrefManager.getCustomVal<String?>("${media.id}_current_chp", null)?.toIntOrNull() ?: 1 val appEp = PrefManager.getCustomVal<String?>("${media.id}_current_chp", null)
?.toIntOrNull() ?: 1
var continueEp = (if (anilistEp > appEp) anilistEp else appEp).toString() var continueEp = (if (anilistEp > appEp) anilistEp else appEp).toString()
val filteredChapters = chapters.filter { chapterKey -> val filteredChapters = chapters.filter { chapterKey ->
val chapter = media.manga.chapters!![chapterKey]!! val chapter = media.manga.chapters!![chapterKey]!!

View file

@ -44,8 +44,8 @@ import ani.dantotsu.parsers.HMangaSources
import ani.dantotsu.parsers.MangaParser import ani.dantotsu.parsers.MangaParser
import ani.dantotsu.parsers.MangaSources import ani.dantotsu.parsers.MangaSources
import ani.dantotsu.settings.extensionprefs.MangaSourcePreferencesFragment import ani.dantotsu.settings.extensionprefs.MangaSourcePreferencesFragment
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.subcriptions.Notifications import ani.dantotsu.subcriptions.Notifications
import ani.dantotsu.subcriptions.Notifications.Group.MANGA_GROUP import ani.dantotsu.subcriptions.Notifications.Group.MANGA_GROUP
import ani.dantotsu.subcriptions.Subscription.Companion.getChannelId import ani.dantotsu.subcriptions.Subscription.Companion.getChannelId
@ -181,7 +181,9 @@ open class MangaReadFragment : Fragment(), ScanlatorSelectionListener {
headerAdapter = MangaReadAdapter(it, this, model.mangaReadSources!!) headerAdapter = MangaReadAdapter(it, this, model.mangaReadSources!!)
headerAdapter.scanlatorSelectionListener = this headerAdapter.scanlatorSelectionListener = this
chapterAdapter = chapterAdapter =
MangaChapterAdapter(style ?: PrefManager.getVal(PrefName.MangaDefaultView), media, this) MangaChapterAdapter(
style ?: PrefManager.getVal(PrefName.MangaDefaultView), media, this
)
for (download in downloadManager.mangaDownloadedTypes) { for (download in downloadManager.mangaDownloadedTypes) {
if (download.title == media.mainName()) { if (download.title == media.mainName()) {

View file

@ -14,8 +14,8 @@ import ani.dantotsu.media.manga.MangaChapter
import ani.dantotsu.settings.CurrentReaderSettings.Directions.LEFT_TO_RIGHT import ani.dantotsu.settings.CurrentReaderSettings.Directions.LEFT_TO_RIGHT
import ani.dantotsu.settings.CurrentReaderSettings.Directions.RIGHT_TO_LEFT import ani.dantotsu.settings.CurrentReaderSettings.Directions.RIGHT_TO_LEFT
import ani.dantotsu.settings.CurrentReaderSettings.Layouts.PAGED import ani.dantotsu.settings.CurrentReaderSettings.Layouts.PAGED
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefName
import com.bumptech.glide.load.resource.bitmap.BitmapTransformation import com.bumptech.glide.load.resource.bitmap.BitmapTransformation
import com.davemorrissey.labs.subscaleview.ImageSource import com.davemorrissey.labs.subscaleview.ImageSource
import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView

View file

@ -37,8 +37,8 @@ import ani.dantotsu.others.ImageViewDialog
import ani.dantotsu.setSafeOnClickListener import ani.dantotsu.setSafeOnClickListener
import ani.dantotsu.settings.CurrentNovelReaderSettings import ani.dantotsu.settings.CurrentNovelReaderSettings
import ani.dantotsu.settings.CurrentReaderSettings import ani.dantotsu.settings.CurrentReaderSettings
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.snackString import ani.dantotsu.snackString
import ani.dantotsu.themes.ThemeManager import ani.dantotsu.themes.ThemeManager
import ani.dantotsu.tryWith import ani.dantotsu.tryWith
@ -286,7 +286,8 @@ class NovelReaderActivity : AppCompatActivity(), EbookReaderEventListener {
binding.bookReader.getAppearance { binding.bookReader.getAppearance {
currentTheme = it currentTheme = it
themes.add(0, it) themes.add(0, it)
defaultSettings = loadReaderSettings("${sanitizedBookId}_current_settings") ?: defaultSettings defaultSettings =
loadReaderSettings("${sanitizedBookId}_current_settings") ?: defaultSettings
applySettings() applySettings()
} }
@ -486,7 +487,11 @@ class NovelReaderActivity : AppCompatActivity(), EbookReaderEventListener {
} }
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
private fun <T> loadReaderSettings(fileName: String, context: Context? = null, toast: Boolean = true): T? { private fun <T> loadReaderSettings(
fileName: String,
context: Context? = null,
toast: Boolean = true
): T? {
val a = context ?: currContext() val a = context ?: currContext()
try { try {
if (a?.fileList() != null) if (a?.fileList() != null)

View file

@ -18,8 +18,8 @@ import ani.dantotsu.R
import ani.dantotsu.Refresh import ani.dantotsu.Refresh
import ani.dantotsu.databinding.ActivityListBinding import ani.dantotsu.databinding.ActivityListBinding
import ani.dantotsu.navBarHeight import ani.dantotsu.navBarHeight
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.statusBarHeight import ani.dantotsu.statusBarHeight
import ani.dantotsu.themes.ThemeManager import ani.dantotsu.themes.ThemeManager
import com.google.android.material.tabs.TabLayout import com.google.android.material.tabs.TabLayout

View file

@ -5,8 +5,8 @@ import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import ani.dantotsu.connections.anilist.Anilist import ani.dantotsu.connections.anilist.Anilist
import ani.dantotsu.media.Media import ani.dantotsu.media.Media
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.tryWithSuspend import ani.dantotsu.tryWithSuspend
class ListViewModel : ViewModel() { class ListViewModel : ViewModel() {

View file

@ -10,8 +10,8 @@ import ani.dantotsu.R
import ani.dantotsu.databinding.FragmentOfflineBinding import ani.dantotsu.databinding.FragmentOfflineBinding
import ani.dantotsu.isOnline import ani.dantotsu.isOnline
import ani.dantotsu.navBarHeight import ani.dantotsu.navBarHeight
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.startMainActivity import ani.dantotsu.startMainActivity
import ani.dantotsu.statusBarHeight import ani.dantotsu.statusBarHeight

View file

@ -16,8 +16,8 @@ import ani.dantotsu.currContext
import ani.dantotsu.defaultHeaders import ani.dantotsu.defaultHeaders
import ani.dantotsu.media.anime.Episode import ani.dantotsu.media.anime.Episode
import ani.dantotsu.parsers.Book import ani.dantotsu.parsers.Book
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.toast import ani.dantotsu.toast
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers

View file

@ -181,7 +181,11 @@ abstract class AnimeParser : BaseParser() {
override suspend fun loadSavedShowResponse(mediaId: Int): ShowResponse? { override suspend fun loadSavedShowResponse(mediaId: Int): ShowResponse? {
checkIfVariablesAreEmpty() checkIfVariablesAreEmpty()
val dub = if (isDubAvailableSeparately()) "_${if (selectDub) "dub" else "sub"}" else "" val dub = if (isDubAvailableSeparately()) "_${if (selectDub) "dub" else "sub"}" else ""
var loaded = PrefManager.getNullableCustomVal("${saveName}${dub}_$mediaId", null, ShowResponse::class.java) var loaded = PrefManager.getNullableCustomVal(
"${saveName}${dub}_$mediaId",
null,
ShowResponse::class.java
)
if (loaded == null && malSyncBackupName.isNotEmpty()) if (loaded == null && malSyncBackupName.isNotEmpty())
loaded = MalSyncBackup.get(mediaId, malSyncBackupName, selectDub) loaded = MalSyncBackup.get(mediaId, malSyncBackupName, selectDub)
?.also { saveShowResponse(mediaId, it, true) } ?.also { saveShowResponse(mediaId, it, true) }

View file

@ -1,6 +1,5 @@
package ani.dantotsu.parsers package ani.dantotsu.parsers
import android.content.Context
import ani.dantotsu.Lazier import ani.dantotsu.Lazier
import ani.dantotsu.lazyList import ani.dantotsu.lazyList
import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefManager
@ -14,7 +13,8 @@ object AnimeSources : WatchSources() {
var pinnedAnimeSources: List<String> = emptyList() var pinnedAnimeSources: List<String> = emptyList()
suspend fun init(fromExtensions: StateFlow<List<AnimeExtension.Installed>>) { suspend fun init(fromExtensions: StateFlow<List<AnimeExtension.Installed>>) {
pinnedAnimeSources = PrefManager.getNullableVal<List<String>>(PrefName.AnimeSourcesOrder, null) pinnedAnimeSources =
PrefManager.getNullableVal<List<String>>(PrefName.AnimeSourcesOrder, null)
?: emptyList() ?: emptyList()
// Initialize with the first value from StateFlow // Initialize with the first value from StateFlow

View file

@ -134,7 +134,11 @@ abstract class BaseParser {
* **/ * **/
open suspend fun loadSavedShowResponse(mediaId: Int): ShowResponse? { open suspend fun loadSavedShowResponse(mediaId: Int): ShowResponse? {
checkIfVariablesAreEmpty() checkIfVariablesAreEmpty()
return PrefManager.getNullableCustomVal("${saveName}_$mediaId", null, ShowResponse::class.java) return PrefManager.getNullableCustomVal(
"${saveName}_$mediaId",
null,
ShowResponse::class.java
)
} }
/** /**

View file

@ -2,8 +2,8 @@ package ani.dantotsu.parsers
import ani.dantotsu.Lazier import ani.dantotsu.Lazier
import ani.dantotsu.lazyList import ani.dantotsu.lazyList
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefName
import eu.kanade.tachiyomi.extension.manga.model.MangaExtension import eu.kanade.tachiyomi.extension.manga.model.MangaExtension
import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.first
@ -13,7 +13,8 @@ object MangaSources : MangaReadSources() {
var pinnedMangaSources: List<String> = emptyList() var pinnedMangaSources: List<String> = emptyList()
suspend fun init(fromExtensions: StateFlow<List<MangaExtension.Installed>>) { suspend fun init(fromExtensions: StateFlow<List<MangaExtension.Installed>>) {
pinnedMangaSources = PrefManager.getNullableVal<List<String>>(PrefName.MangaSourcesOrder, null) pinnedMangaSources =
PrefManager.getNullableVal<List<String>>(PrefName.MangaSourcesOrder, null)
?: emptyList() ?: emptyList()
// Initialize with the first value from StateFlow // Initialize with the first value from StateFlow

View file

@ -14,7 +14,8 @@ object NovelSources : NovelReadSources() {
var pinnedNovelSources: List<String> = emptyList() var pinnedNovelSources: List<String> = emptyList()
suspend fun init(fromExtensions: StateFlow<List<NovelExtension.Installed>>) { suspend fun init(fromExtensions: StateFlow<List<NovelExtension.Installed>>) {
pinnedNovelSources = PrefManager.getNullableVal<List<String>>(PrefName.NovelSourcesOrder, null) pinnedNovelSources =
PrefManager.getNullableVal<List<String>>(PrefName.NovelSourcesOrder, null)
?: emptyList() ?: emptyList()
// Initialize with the first value from StateFlow // Initialize with the first value from StateFlow

View file

@ -3,8 +3,8 @@ package ani.dantotsu.parsers.novel
import android.content.Context import android.content.Context
import ani.dantotsu.logger import ani.dantotsu.logger
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefName
import eu.kanade.tachiyomi.extension.ExtensionUpdateNotifier import eu.kanade.tachiyomi.extension.ExtensionUpdateNotifier
import eu.kanade.tachiyomi.extension.anime.model.AnimeExtension import eu.kanade.tachiyomi.extension.anime.model.AnimeExtension
import eu.kanade.tachiyomi.extension.anime.model.AnimeLoadResult import eu.kanade.tachiyomi.extension.anime.model.AnimeLoadResult

View file

@ -1,14 +1,16 @@
package ani.dantotsu.settings package ani.dantotsu.settings
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefName
import java.io.Serializable import java.io.Serializable
data class CurrentNovelReaderSettings( data class CurrentNovelReaderSettings(
var currentThemeName: String = PrefManager.getVal(PrefName.CurrentThemeName), var currentThemeName: String = PrefManager.getVal(PrefName.CurrentThemeName),
var layout: Layouts = Layouts[PrefManager.getVal(PrefName.LayoutNovel)] var layout: Layouts = Layouts[PrefManager.getVal(PrefName.LayoutNovel)]
?: Layouts.PAGED, ?: Layouts.PAGED,
var dualPageMode: CurrentReaderSettings.DualPageModes = CurrentReaderSettings.DualPageModes[PrefManager.getVal(PrefName.DualPageModeNovel)] var dualPageMode: CurrentReaderSettings.DualPageModes = CurrentReaderSettings.DualPageModes[PrefManager.getVal(
PrefName.DualPageModeNovel
)]
?: CurrentReaderSettings.DualPageModes.Automatic, ?: CurrentReaderSettings.DualPageModes.Automatic,
var lineHeight: Float = PrefManager.getVal(PrefName.LineHeight), var lineHeight: Float = PrefManager.getVal(PrefName.LineHeight),
var margin: Float = PrefManager.getVal(PrefName.Margin), var margin: Float = PrefManager.getVal(PrefName.Margin),

View file

@ -1,7 +1,7 @@
package ani.dantotsu.settings package ani.dantotsu.settings
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefName
import java.io.Serializable import java.io.Serializable
data class CurrentReaderSettings( data class CurrentReaderSettings(

View file

@ -18,8 +18,8 @@ import androidx.viewpager2.widget.ViewPager2
import ani.dantotsu.* import ani.dantotsu.*
import ani.dantotsu.databinding.ActivityExtensionsBinding import ani.dantotsu.databinding.ActivityExtensionsBinding
import ani.dantotsu.others.LanguageMapper import ani.dantotsu.others.LanguageMapper
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.themes.ThemeManager import ani.dantotsu.themes.ThemeManager
import com.google.android.material.tabs.TabLayout import com.google.android.material.tabs.TabLayout
import com.google.android.material.tabs.TabLayoutMediator import com.google.android.material.tabs.TabLayoutMediator
@ -65,7 +65,8 @@ class ExtensionsActivity : AppCompatActivity() {
searchView.setText("") searchView.setText("")
searchView.clearFocus() searchView.clearFocus()
tabLayout.clearFocus() tabLayout.clearFocus()
if (tab.text?.contains("Installed") == true) binding.languageselect.visibility = View.GONE if (tab.text?.contains("Installed") == true) binding.languageselect.visibility =
View.GONE
else binding.languageselect.visibility = View.VISIBLE else binding.languageselect.visibility = View.VISIBLE
viewPager.updateLayoutParams<ViewGroup.LayoutParams> { viewPager.updateLayoutParams<ViewGroup.LayoutParams> {
height = ViewGroup.LayoutParams.MATCH_PARENT height = ViewGroup.LayoutParams.MATCH_PARENT
@ -119,13 +120,18 @@ class ExtensionsActivity : AppCompatActivity() {
initActivity(this) initActivity(this)
binding.languageselect.setOnClickListener { binding.languageselect.setOnClickListener {
val languageOptions = LanguageMapper.Companion.Language.entries.map{ it.name }.toTypedArray() val languageOptions =
LanguageMapper.Companion.Language.entries.map { it.name }.toTypedArray()
val builder = AlertDialog.Builder(currContext(), R.style.MyPopup) val builder = AlertDialog.Builder(currContext(), R.style.MyPopup)
val listOrder: String = PrefManager.getVal(PrefName.LangSort) val listOrder: String = PrefManager.getVal(PrefName.LangSort)
val index = LanguageMapper.Companion.Language.entries.toTypedArray().indexOfFirst{it.code == listOrder} val index = LanguageMapper.Companion.Language.entries.toTypedArray()
.indexOfFirst { it.code == listOrder }
builder.setTitle("Language") builder.setTitle("Language")
builder.setSingleChoiceItems(languageOptions, index){ dialog, i -> builder.setSingleChoiceItems(languageOptions, index) { dialog, i ->
PrefManager.setVal(PrefName.LangSort, LanguageMapper.Companion.Language.entries[i].code) PrefManager.setVal(
PrefName.LangSort,
LanguageMapper.Companion.Language.entries[i].code
)
val currentFragment = val currentFragment =
supportFragmentManager.findFragmentByTag("f${viewPager.currentItem}") supportFragmentManager.findFragmentByTag("f${viewPager.currentItem}")
if (currentFragment is SearchQueryHandler) { if (currentFragment is SearchQueryHandler) {

View file

@ -192,15 +192,20 @@ class InstalledAnimeExtensionsFragment : Fragment(), SearchQueryHandler {
extensionsRecyclerView.adapter = extensionsAdapter extensionsRecyclerView.adapter = extensionsAdapter
val itemTouchHelperCallback = object : ItemTouchHelper.SimpleCallback( val itemTouchHelperCallback = object : ItemTouchHelper.SimpleCallback(
ItemTouchHelper.UP or ItemTouchHelper.DOWN, 0) { ItemTouchHelper.UP or ItemTouchHelper.DOWN, 0
) {
override fun onMove( override fun onMove(
recyclerView: RecyclerView, recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder, viewHolder: RecyclerView.ViewHolder,
target: RecyclerView.ViewHolder target: RecyclerView.ViewHolder
): Boolean { ): Boolean {
extensionsAdapter.onMove(viewHolder.absoluteAdapterPosition, target.absoluteAdapterPosition) extensionsAdapter.onMove(
viewHolder.absoluteAdapterPosition,
target.absoluteAdapterPosition
)
return true return true
} }
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {} override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {}
override fun onSelectedChanged(viewHolder: RecyclerView.ViewHolder?, actionState: Int) { override fun onSelectedChanged(viewHolder: RecyclerView.ViewHolder?, actionState: Int) {
@ -211,7 +216,10 @@ class InstalledAnimeExtensionsFragment : Fragment(), SearchQueryHandler {
} }
} }
override fun clearView(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder) { override fun clearView(
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder
) {
super.clearView(recyclerView, viewHolder) super.clearView(recyclerView, viewHolder)
viewHolder.itemView.elevation = 0f viewHolder.itemView.elevation = 0f
viewHolder.itemView.translationZ = 0f viewHolder.itemView.translationZ = 0f
@ -243,7 +251,10 @@ class InstalledAnimeExtensionsFragment : Fragment(), SearchQueryHandler {
} }
override fun updateContentBasedOnQuery(query: String?) { override fun updateContentBasedOnQuery(query: String?) {
extensionsAdapter.filter(query ?: "", sortToAnimeSourcesList(animeExtensionManager.installedExtensionsFlow.value)) extensionsAdapter.filter(
query ?: "",
sortToAnimeSourcesList(animeExtensionManager.installedExtensionsFlow.value)
)
} }
override fun notifyDataChanged() { // Do nothing override fun notifyDataChanged() { // Do nothing

View file

@ -29,8 +29,8 @@ import ani.dantotsu.databinding.FragmentMangaExtensionsBinding
import ani.dantotsu.others.LanguageMapper import ani.dantotsu.others.LanguageMapper
import ani.dantotsu.parsers.MangaSources import ani.dantotsu.parsers.MangaSources
import ani.dantotsu.settings.extensionprefs.MangaSourcePreferencesFragment import ani.dantotsu.settings.extensionprefs.MangaSourcePreferencesFragment
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.snackString import ani.dantotsu.snackString
import com.google.android.material.tabs.TabLayout import com.google.android.material.tabs.TabLayout
import com.google.android.material.textfield.TextInputLayout import com.google.android.material.textfield.TextInputLayout
@ -188,15 +188,20 @@ class InstalledMangaExtensionsFragment : Fragment(), SearchQueryHandler {
extensionsRecyclerView.adapter = extensionsAdapter extensionsRecyclerView.adapter = extensionsAdapter
val itemTouchHelperCallback = object : ItemTouchHelper.SimpleCallback( val itemTouchHelperCallback = object : ItemTouchHelper.SimpleCallback(
ItemTouchHelper.UP or ItemTouchHelper.DOWN, 0) { ItemTouchHelper.UP or ItemTouchHelper.DOWN, 0
) {
override fun onMove( override fun onMove(
recyclerView: RecyclerView, recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder, viewHolder: RecyclerView.ViewHolder,
target: RecyclerView.ViewHolder target: RecyclerView.ViewHolder
): Boolean { ): Boolean {
extensionsAdapter.onMove(viewHolder.absoluteAdapterPosition, target.absoluteAdapterPosition) extensionsAdapter.onMove(
viewHolder.absoluteAdapterPosition,
target.absoluteAdapterPosition
)
return true return true
} }
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {} override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {}
override fun onSelectedChanged(viewHolder: RecyclerView.ViewHolder?, actionState: Int) { override fun onSelectedChanged(viewHolder: RecyclerView.ViewHolder?, actionState: Int) {
@ -207,7 +212,10 @@ class InstalledMangaExtensionsFragment : Fragment(), SearchQueryHandler {
} }
} }
override fun clearView(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder) { override fun clearView(
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder
) {
super.clearView(recyclerView, viewHolder) super.clearView(recyclerView, viewHolder)
viewHolder.itemView.elevation = 0f viewHolder.itemView.elevation = 0f
viewHolder.itemView.translationZ = 0f viewHolder.itemView.translationZ = 0f
@ -237,7 +245,10 @@ class InstalledMangaExtensionsFragment : Fragment(), SearchQueryHandler {
} }
override fun updateContentBasedOnQuery(query: String?) { override fun updateContentBasedOnQuery(query: String?) {
extensionsAdapter.filter(query ?: "", sortToMangaSourcesList(mangaExtensionManager.installedExtensionsFlow.value)) extensionsAdapter.filter(
query ?: "",
sortToMangaSourcesList(mangaExtensionManager.installedExtensionsFlow.value)
)
} }
override fun notifyDataChanged() { // Do nothing override fun notifyDataChanged() { // Do nothing

View file

@ -27,8 +27,8 @@ import ani.dantotsu.others.LanguageMapper
import ani.dantotsu.parsers.NovelSources import ani.dantotsu.parsers.NovelSources
import ani.dantotsu.parsers.novel.NovelExtension import ani.dantotsu.parsers.novel.NovelExtension
import ani.dantotsu.parsers.novel.NovelExtensionManager import ani.dantotsu.parsers.novel.NovelExtensionManager
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.snackString import ani.dantotsu.snackString
import eu.kanade.tachiyomi.data.notification.Notifications import eu.kanade.tachiyomi.data.notification.Notifications
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@ -117,15 +117,20 @@ class InstalledNovelExtensionsFragment : Fragment(), SearchQueryHandler {
extensionsRecyclerView.adapter = extensionsAdapter extensionsRecyclerView.adapter = extensionsAdapter
val itemTouchHelperCallback = object : ItemTouchHelper.SimpleCallback( val itemTouchHelperCallback = object : ItemTouchHelper.SimpleCallback(
ItemTouchHelper.UP or ItemTouchHelper.DOWN, 0) { ItemTouchHelper.UP or ItemTouchHelper.DOWN, 0
) {
override fun onMove( override fun onMove(
recyclerView: RecyclerView, recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder, viewHolder: RecyclerView.ViewHolder,
target: RecyclerView.ViewHolder target: RecyclerView.ViewHolder
): Boolean { ): Boolean {
extensionsAdapter.onMove(viewHolder.absoluteAdapterPosition, target.absoluteAdapterPosition) extensionsAdapter.onMove(
viewHolder.absoluteAdapterPosition,
target.absoluteAdapterPosition
)
return true return true
} }
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {} override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {}
override fun onSelectedChanged(viewHolder: RecyclerView.ViewHolder?, actionState: Int) { override fun onSelectedChanged(viewHolder: RecyclerView.ViewHolder?, actionState: Int) {
@ -136,7 +141,10 @@ class InstalledNovelExtensionsFragment : Fragment(), SearchQueryHandler {
} }
} }
override fun clearView(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder) { override fun clearView(
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder
) {
super.clearView(recyclerView, viewHolder) super.clearView(recyclerView, viewHolder)
viewHolder.itemView.elevation = 0f viewHolder.itemView.elevation = 0f
viewHolder.itemView.translationZ = 0f viewHolder.itemView.translationZ = 0f
@ -167,7 +175,10 @@ class InstalledNovelExtensionsFragment : Fragment(), SearchQueryHandler {
} }
override fun updateContentBasedOnQuery(query: String?) { override fun updateContentBasedOnQuery(query: String?) {
extensionsAdapter.filter(query ?: "", sortToNovelSourcesList(novelExtensionManager.installedExtensionsFlow.value)) extensionsAdapter.filter(
query ?: "",
sortToNovelSourcesList(novelExtensionManager.installedExtensionsFlow.value)
)
} }
override fun notifyDataChanged() { // do nothing override fun notifyDataChanged() { // do nothing

View file

@ -18,8 +18,8 @@ import ani.dantotsu.media.Media
import ani.dantotsu.navBarHeight import ani.dantotsu.navBarHeight
import ani.dantotsu.others.getSerialized import ani.dantotsu.others.getSerialized
import ani.dantotsu.parsers.Subtitle import ani.dantotsu.parsers.Subtitle
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.snackString import ani.dantotsu.snackString
import ani.dantotsu.statusBarHeight import ani.dantotsu.statusBarHeight
import ani.dantotsu.themes.ThemeManager import ani.dantotsu.themes.ThemeManager
@ -88,12 +88,18 @@ class PlayerSettingsActivity : AppCompatActivity() {
var curSpeedArr = if (PrefManager.getVal(PrefName.CursedSpeeds)) cursedSpeeds else speeds var curSpeedArr = if (PrefManager.getVal(PrefName.CursedSpeeds)) cursedSpeeds else speeds
var speedsName = curSpeedArr.map { "${it}x" }.toTypedArray() var speedsName = curSpeedArr.map { "${it}x" }.toTypedArray()
binding.playerSettingsSpeed.text = binding.playerSettingsSpeed.text =
getString(R.string.default_playback_speed, speedsName[PrefManager.getVal(PrefName.DefaultSpeed)]) getString(
R.string.default_playback_speed,
speedsName[PrefManager.getVal(PrefName.DefaultSpeed)]
)
val speedDialog = AlertDialog.Builder(this, R.style.MyPopup) val speedDialog = AlertDialog.Builder(this, R.style.MyPopup)
.setTitle(getString(R.string.default_speed)) .setTitle(getString(R.string.default_speed))
binding.playerSettingsSpeed.setOnClickListener { binding.playerSettingsSpeed.setOnClickListener {
val dialog = val dialog =
speedDialog.setSingleChoiceItems(speedsName, PrefManager.getVal(PrefName.DefaultSpeed)) { dialog, i -> speedDialog.setSingleChoiceItems(
speedsName,
PrefManager.getVal(PrefName.DefaultSpeed)
) { dialog, i ->
PrefManager.setVal(PrefName.DefaultSpeed, i) PrefManager.setVal(PrefName.DefaultSpeed, i)
binding.playerSettingsSpeed.text = binding.playerSettingsSpeed.text =
getString(R.string.default_playback_speed, speedsName[i]) getString(R.string.default_playback_speed, speedsName[i])
@ -110,7 +116,10 @@ class PlayerSettingsActivity : AppCompatActivity() {
PrefManager.setVal(PrefName.DefaultSpeed, newDefaultSpeed) PrefManager.setVal(PrefName.DefaultSpeed, newDefaultSpeed)
speedsName = curSpeedArr.map { "${it}x" }.toTypedArray() speedsName = curSpeedArr.map { "${it}x" }.toTypedArray()
binding.playerSettingsSpeed.text = binding.playerSettingsSpeed.text =
getString(R.string.default_playback_speed, speedsName[PrefManager.getVal(PrefName.DefaultSpeed)]) getString(
R.string.default_playback_speed,
speedsName[PrefManager.getVal(PrefName.DefaultSpeed)]
)
} }
@ -120,12 +129,14 @@ class PlayerSettingsActivity : AppCompatActivity() {
PrefManager.setVal(PrefName.TimeStampsEnabled, isChecked) PrefManager.setVal(PrefName.TimeStampsEnabled, isChecked)
} }
binding.playerSettingsTimeStampsProxy.isChecked = PrefManager.getVal(PrefName.UseProxyForTimeStamps) binding.playerSettingsTimeStampsProxy.isChecked =
PrefManager.getVal(PrefName.UseProxyForTimeStamps)
binding.playerSettingsTimeStampsProxy.setOnCheckedChangeListener { _, isChecked -> binding.playerSettingsTimeStampsProxy.setOnCheckedChangeListener { _, isChecked ->
PrefManager.setVal(PrefName.UseProxyForTimeStamps, isChecked) PrefManager.setVal(PrefName.UseProxyForTimeStamps, isChecked)
} }
binding.playerSettingsShowTimeStamp.isChecked = PrefManager.getVal(PrefName.ShowTimeStampButton) binding.playerSettingsShowTimeStamp.isChecked =
PrefManager.getVal(PrefName.ShowTimeStampButton)
binding.playerSettingsShowTimeStamp.setOnCheckedChangeListener { _, isChecked -> binding.playerSettingsShowTimeStamp.setOnCheckedChangeListener { _, isChecked ->
PrefManager.setVal(PrefName.ShowTimeStampButton, isChecked) PrefManager.setVal(PrefName.ShowTimeStampButton, isChecked)
} }
@ -147,16 +158,19 @@ class PlayerSettingsActivity : AppCompatActivity() {
} }
//Update Progress //Update Progress
binding.playerSettingsAskUpdateProgress.isChecked = PrefManager.getVal(PrefName.AskIndividualPlayer) binding.playerSettingsAskUpdateProgress.isChecked =
PrefManager.getVal(PrefName.AskIndividualPlayer)
binding.playerSettingsAskUpdateProgress.setOnCheckedChangeListener { _, isChecked -> binding.playerSettingsAskUpdateProgress.setOnCheckedChangeListener { _, isChecked ->
PrefManager.setVal(PrefName.AskIndividualPlayer, isChecked) PrefManager.setVal(PrefName.AskIndividualPlayer, isChecked)
} }
binding.playerSettingsAskUpdateHentai.isChecked = PrefManager.getVal(PrefName.UpdateForHPlayer) binding.playerSettingsAskUpdateHentai.isChecked =
PrefManager.getVal(PrefName.UpdateForHPlayer)
binding.playerSettingsAskUpdateHentai.setOnCheckedChangeListener { _, isChecked -> binding.playerSettingsAskUpdateHentai.setOnCheckedChangeListener { _, isChecked ->
PrefManager.setVal(PrefName.UpdateForHPlayer, isChecked) PrefManager.setVal(PrefName.UpdateForHPlayer, isChecked)
if (isChecked) snackString(getString(R.string.very_bold)) if (isChecked) snackString(getString(R.string.very_bold))
} }
binding.playerSettingsCompletePercentage.value = (PrefManager.getVal<Float>(PrefName.WatchPercentage) * 100).roundToInt().toFloat() binding.playerSettingsCompletePercentage.value =
(PrefManager.getVal<Float>(PrefName.WatchPercentage) * 100).roundToInt().toFloat()
binding.playerSettingsCompletePercentage.addOnChangeListener { _, value, _ -> binding.playerSettingsCompletePercentage.addOnChangeListener { _, value, _ ->
PrefManager.setVal(PrefName.WatchPercentage, value / 100) PrefManager.setVal(PrefName.WatchPercentage, value / 100)
} }
@ -229,7 +243,10 @@ class PlayerSettingsActivity : AppCompatActivity() {
val resizeDialog = AlertDialog.Builder(this, R.style.MyPopup) val resizeDialog = AlertDialog.Builder(this, R.style.MyPopup)
.setTitle(getString(R.string.default_resize_mode)) .setTitle(getString(R.string.default_resize_mode))
binding.playerResizeMode.setOnClickListener { binding.playerResizeMode.setOnClickListener {
val dialog = resizeDialog.setSingleChoiceItems(resizeModes, PrefManager.getVal<Int>(PrefName.Resize)) { dialog, count -> val dialog = resizeDialog.setSingleChoiceItems(
resizeModes,
PrefManager.getVal<Int>(PrefName.Resize)
) { dialog, count ->
PrefManager.setVal(PrefName.Resize, count) PrefManager.setVal(PrefName.Resize, count)
dialog.dismiss() dialog.dismiss()
}.show() }.show()
@ -425,7 +442,10 @@ class PlayerSettingsActivity : AppCompatActivity() {
val fontDialog = AlertDialog.Builder(this, R.style.MyPopup) val fontDialog = AlertDialog.Builder(this, R.style.MyPopup)
.setTitle(getString(R.string.subtitle_font)) .setTitle(getString(R.string.subtitle_font))
binding.videoSubFont.setOnClickListener { binding.videoSubFont.setOnClickListener {
val dialog = fontDialog.setSingleChoiceItems(fonts, PrefManager.getVal(PrefName.Font)) { dialog, count -> val dialog = fontDialog.setSingleChoiceItems(
fonts,
PrefManager.getVal(PrefName.Font)
) { dialog, count ->
PrefManager.setVal(PrefName.Font, count) PrefManager.setVal(PrefName.Font, count)
dialog.dismiss() dialog.dismiss()
}.show() }.show()

View file

@ -8,8 +8,8 @@ import ani.dantotsu.R
import ani.dantotsu.databinding.ActivityReaderSettingsBinding import ani.dantotsu.databinding.ActivityReaderSettingsBinding
import ani.dantotsu.initActivity import ani.dantotsu.initActivity
import ani.dantotsu.navBarHeight import ani.dantotsu.navBarHeight
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.snackString import ani.dantotsu.snackString
import ani.dantotsu.statusBarHeight import ani.dantotsu.statusBarHeight
import ani.dantotsu.themes.ThemeManager import ani.dantotsu.themes.ThemeManager
@ -107,7 +107,10 @@ class ReaderSettingsActivity : AppCompatActivity() {
defaultSettings.dualPageMode = CurrentReaderSettings.DualPageModes[index] defaultSettings.dualPageMode = CurrentReaderSettings.DualPageModes[index]
?: CurrentReaderSettings.DualPageModes.Automatic ?: CurrentReaderSettings.DualPageModes.Automatic
binding.readerSettingsDualPageText.text = defaultSettings.dualPageMode.toString() binding.readerSettingsDualPageText.text = defaultSettings.dualPageMode.toString()
PrefManager.setVal(PrefName.DualPageModeReader, defaultSettings.dualPageMode.ordinal) PrefManager.setVal(
PrefName.DualPageModeReader,
defaultSettings.dualPageMode.ordinal
)
} }
} }
binding.readerSettingsTrueColors.isChecked = defaultSettings.trueColors binding.readerSettingsTrueColors.isChecked = defaultSettings.trueColors
@ -215,7 +218,10 @@ class ReaderSettingsActivity : AppCompatActivity() {
defaultSettingsLN.dualPageMode = CurrentReaderSettings.DualPageModes[index] defaultSettingsLN.dualPageMode = CurrentReaderSettings.DualPageModes[index]
?: CurrentReaderSettings.DualPageModes.Automatic ?: CurrentReaderSettings.DualPageModes.Automatic
binding.LNdualPageText.text = defaultSettingsLN.dualPageMode.toString() binding.LNdualPageText.text = defaultSettingsLN.dualPageMode.toString()
PrefManager.setVal(PrefName.DualPageModeNovel, defaultSettingsLN.dualPageMode.ordinal) PrefManager.setVal(
PrefName.DualPageModeNovel,
defaultSettingsLN.dualPageMode.ordinal
)
} }
} }
@ -339,11 +345,13 @@ class ReaderSettingsActivity : AppCompatActivity() {
} }
//Update Progress //Update Progress
binding.readerSettingsAskUpdateProgress.isChecked = PrefManager.getVal(PrefName.AskIndividualReader) binding.readerSettingsAskUpdateProgress.isChecked =
PrefManager.getVal(PrefName.AskIndividualReader)
binding.readerSettingsAskUpdateProgress.setOnCheckedChangeListener { _, isChecked -> binding.readerSettingsAskUpdateProgress.setOnCheckedChangeListener { _, isChecked ->
PrefManager.setVal(PrefName.AskIndividualReader, isChecked) PrefManager.setVal(PrefName.AskIndividualReader, isChecked)
} }
binding.readerSettingsAskUpdateDoujins.isChecked = PrefManager.getVal(PrefName.UpdateForHReader) binding.readerSettingsAskUpdateDoujins.isChecked =
PrefManager.getVal(PrefName.UpdateForHReader)
binding.readerSettingsAskUpdateDoujins.setOnCheckedChangeListener { _, isChecked -> binding.readerSettingsAskUpdateDoujins.setOnCheckedChangeListener { _, isChecked ->
PrefManager.setVal(PrefName.UpdateForHReader, isChecked) PrefManager.setVal(PrefName.UpdateForHReader, isChecked)
if (isChecked) snackString(getString(R.string.very_bold)) if (isChecked) snackString(getString(R.string.very_bold))

View file

@ -4,8 +4,12 @@ import android.annotation.SuppressLint
import android.app.AlertDialog import android.app.AlertDialog
import android.content.Intent import android.content.Intent
import android.graphics.drawable.Animatable import android.graphics.drawable.Animatable
import android.os.Build.* import android.os.Build.BRAND
import android.os.Build.VERSION.* import android.os.Build.DEVICE
import android.os.Build.SUPPORTED_ABIS
import android.os.Build.VERSION.CODENAME
import android.os.Build.VERSION.RELEASE
import android.os.Build.VERSION.SDK_INT
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
@ -14,9 +18,7 @@ import android.widget.ArrayAdapter
import android.widget.TextView import android.widget.TextView
import android.widget.Toast import android.widget.Toast
import androidx.activity.OnBackPressedCallback import androidx.activity.OnBackPressedCallback
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.result.contract.ActivityResultContracts
import androidx.activity.result.contract.ActivityResultContracts.CreateDocument
import androidx.annotation.OptIn import androidx.annotation.OptIn
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
@ -25,34 +27,45 @@ import androidx.documentfile.provider.DocumentFile
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.media3.common.util.UnstableApi import androidx.media3.common.util.UnstableApi
import androidx.media3.exoplayer.offline.DownloadService import androidx.media3.exoplayer.offline.DownloadService
import ani.dantotsu.* import ani.dantotsu.BuildConfig
import ani.dantotsu.Mapper.json import ani.dantotsu.R
import ani.dantotsu.Refresh
import ani.dantotsu.connections.anilist.Anilist import ani.dantotsu.connections.anilist.Anilist
import ani.dantotsu.connections.discord.Discord import ani.dantotsu.connections.discord.Discord
import ani.dantotsu.connections.mal.MAL import ani.dantotsu.connections.mal.MAL
import ani.dantotsu.copyToClipboard
import ani.dantotsu.currContext
import ani.dantotsu.databinding.ActivitySettingsBinding import ani.dantotsu.databinding.ActivitySettingsBinding
import ani.dantotsu.download.DownloadedType import ani.dantotsu.download.DownloadedType
import ani.dantotsu.download.DownloadsManager import ani.dantotsu.download.DownloadsManager
import ani.dantotsu.download.video.ExoplayerDownloadService import ani.dantotsu.download.video.ExoplayerDownloadService
import ani.dantotsu.initActivity
import ani.dantotsu.loadImage
import ani.dantotsu.logger
import ani.dantotsu.navBarHeight
import ani.dantotsu.openLinkInBrowser
import ani.dantotsu.others.AppUpdater import ani.dantotsu.others.AppUpdater
import ani.dantotsu.others.CustomBottomDialog import ani.dantotsu.others.CustomBottomDialog
import ani.dantotsu.parsers.AnimeSources import ani.dantotsu.pop
import ani.dantotsu.parsers.MangaSources import ani.dantotsu.savePrefsToDownloads
import ani.dantotsu.settings.saving.PrefName import ani.dantotsu.setSafeOnClickListener
import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.internal.Location import ani.dantotsu.settings.saving.internal.Location
import ani.dantotsu.settings.saving.internal.PreferenceKeystore import ani.dantotsu.settings.saving.internal.PreferenceKeystore
import ani.dantotsu.settings.saving.internal.PreferencePackager import ani.dantotsu.settings.saving.internal.PreferencePackager
import ani.dantotsu.snackString
import ani.dantotsu.startMainActivity
import ani.dantotsu.statusBarHeight
import ani.dantotsu.subcriptions.Notifications import ani.dantotsu.subcriptions.Notifications
import ani.dantotsu.subcriptions.Notifications.Companion.openSettings import ani.dantotsu.subcriptions.Notifications.Companion.openSettings
import ani.dantotsu.subcriptions.Subscription.Companion.defaultTime import ani.dantotsu.subcriptions.Subscription.Companion.defaultTime
import ani.dantotsu.subcriptions.Subscription.Companion.startSubscription import ani.dantotsu.subcriptions.Subscription.Companion.startSubscription
import ani.dantotsu.subcriptions.Subscription.Companion.timeMinutes import ani.dantotsu.subcriptions.Subscription.Companion.timeMinutes
import ani.dantotsu.themes.ThemeManager import ani.dantotsu.themes.ThemeManager
import ani.dantotsu.toast
import com.google.android.material.snackbar.Snackbar import com.google.android.material.snackbar.Snackbar
import com.google.android.material.textfield.TextInputEditText import com.google.android.material.textfield.TextInputEditText
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import eltos.simpledialogfragment.SimpleDialog import eltos.simpledialogfragment.SimpleDialog
import eltos.simpledialogfragment.SimpleDialog.OnDialogResultListener.BUTTON_POSITIVE import eltos.simpledialogfragment.SimpleDialog.OnDialogResultListener.BUTTON_POSITIVE
import eltos.simpledialogfragment.color.SimpleColorDialog import eltos.simpledialogfragment.color.SimpleColorDialog
@ -85,7 +98,8 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene
initActivity(this) initActivity(this)
val openDocumentLauncher = registerForActivityResult(ActivityResultContracts.OpenDocument()) { uri -> val openDocumentLauncher =
registerForActivityResult(ActivityResultContracts.OpenDocument()) { uri ->
if (uri != null) { if (uri != null) {
try { try {
val jsonString = contentResolver.openInputStream(uri)?.readBytes() val jsonString = contentResolver.openInputStream(uri)?.readBytes()
@ -107,7 +121,7 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene
toast("Incorrect password") toast("Incorrect password")
return@passwordAlertDialog return@passwordAlertDialog
} }
if(PreferencePackager.unpack(decryptedJson)) if (PreferencePackager.unpack(decryptedJson))
restartApp() restartApp()
} else { } else {
toast("Password cannot be empty") toast("Password cannot be empty")
@ -115,7 +129,7 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene
} }
} else if (name.endsWith(".ani")) { } else if (name.endsWith(".ani")) {
val decryptedJson = jsonString.toString(Charsets.UTF_8) val decryptedJson = jsonString.toString(Charsets.UTF_8)
if(PreferencePackager.unpack(decryptedJson)) if (PreferencePackager.unpack(decryptedJson))
restartApp() restartApp()
} else { } else {
toast("Unknown file type") toast("Unknown file type")
@ -244,7 +258,10 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene
selectedArray.addAll(List(filteredLocations.size - 1) { false }) selectedArray.addAll(List(filteredLocations.size - 1) { false })
val dialog = AlertDialog.Builder(this, R.style.MyPopup) val dialog = AlertDialog.Builder(this, R.style.MyPopup)
.setTitle("Import/Export Settings") .setTitle("Import/Export Settings")
.setMultiChoiceItems( filteredLocations.map { it.name }.toTypedArray(), selectedArray.toBooleanArray()) { _, which, isChecked -> .setMultiChoiceItems(
filteredLocations.map { it.name }.toTypedArray(),
selectedArray.toBooleanArray()
) { _, which, isChecked ->
selectedArray[which] = isChecked selectedArray[which] = isChecked
} }
.setPositiveButton("Import...") { dialog, _ -> .setPositiveButton("Import...") { dialog, _ ->
@ -257,7 +274,8 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene
return@setNegativeButton return@setNegativeButton
} }
dialog.dismiss() dialog.dismiss()
val selected = filteredLocations.filterIndexed { index, _ -> selectedArray[index] } val selected =
filteredLocations.filterIndexed { index, _ -> selectedArray[index] }
if (selected.contains(Location.Protected)) { if (selected.contains(Location.Protected)) {
passwordAlertDialog(true) { password -> passwordAlertDialog(true) { password ->
if (password != null) { if (password != null) {
@ -360,7 +378,7 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene
} }
binding.NSFWExtension.isChecked = PrefManager.getVal(PrefName.NSFWExtension) binding.NSFWExtension.isChecked = PrefManager.getVal(PrefName.NSFWExtension)
binding.NSFWExtension.setOnCheckedChangeListener { _, isChecked -> binding.NSFWExtension.setOnCheckedChangeListener { _, isChecked ->
PrefManager.setVal(PrefName.NSFWExtension,isChecked) PrefManager.setVal(PrefName.NSFWExtension, isChecked)
} }
@ -847,7 +865,8 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene
show() show()
} }
} }
private fun passwordAlertDialog(isExporting:Boolean, callback: (CharArray?) -> Unit) {
private fun passwordAlertDialog(isExporting: Boolean, callback: (CharArray?) -> Unit) {
val password = CharArray(16).apply { fill('0') } val password = CharArray(16).apply { fill('0') }
// Inflate the dialog layout // Inflate the dialog layout

View file

@ -3,8 +3,6 @@ package ani.dantotsu.settings
import android.content.Intent import android.content.Intent
import android.graphics.Color import android.graphics.Color
import android.os.Bundle import android.os.Bundle
import java.util.*
import kotlin.concurrent.schedule
import android.util.TypedValue import android.util.TypedValue
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
@ -27,9 +25,11 @@ import ani.dantotsu.offline.OfflineFragment
import ani.dantotsu.openLinkInBrowser import ani.dantotsu.openLinkInBrowser
import ani.dantotsu.others.imagesearch.ImageSearchActivity import ani.dantotsu.others.imagesearch.ImageSearchActivity
import ani.dantotsu.setSafeOnClickListener import ani.dantotsu.setSafeOnClickListener
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.startMainActivity import ani.dantotsu.startMainActivity
import java.util.Timer
import kotlin.concurrent.schedule
class SettingsDialogFragment : BottomSheetDialogFragment() { class SettingsDialogFragment : BottomSheetDialogFragment() {
private var _binding: BottomSheetSettingsBinding? = null private var _binding: BottomSheetSettingsBinding? = null
@ -103,7 +103,7 @@ class SettingsDialogFragment : BottomSheetDialogFragment() {
binding.settingsDownloads.isChecked = PrefManager.getVal(PrefName.OfflineMode) binding.settingsDownloads.isChecked = PrefManager.getVal(PrefName.OfflineMode)
binding.settingsDownloads.setOnCheckedChangeListener { _, isChecked -> binding.settingsDownloads.setOnCheckedChangeListener { _, isChecked ->
Timer().schedule(300){ Timer().schedule(300) {
when (pageType) { when (pageType) {
PageType.MANGA -> { PageType.MANGA -> {
val intent = Intent(activity, NoInternet::class.java) val intent = Intent(activity, NoInternet::class.java)

View file

@ -10,8 +10,8 @@ import ani.dantotsu.R
import ani.dantotsu.databinding.ActivityUserInterfaceSettingsBinding import ani.dantotsu.databinding.ActivityUserInterfaceSettingsBinding
import ani.dantotsu.initActivity import ani.dantotsu.initActivity
import ani.dantotsu.navBarHeight import ani.dantotsu.navBarHeight
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.statusBarHeight import ani.dantotsu.statusBarHeight
import ani.dantotsu.themes.ThemeManager import ani.dantotsu.themes.ThemeManager
import com.google.android.material.snackbar.Snackbar import com.google.android.material.snackbar.Snackbar
@ -44,7 +44,8 @@ class UserInterfaceSettingsActivity : AppCompatActivity() {
views, views,
PrefManager.getVal<List<Boolean>>(PrefName.HomeLayoutShow).toBooleanArray() PrefManager.getVal<List<Boolean>>(PrefName.HomeLayoutShow).toBooleanArray()
) { _, i, value -> ) { _, i, value ->
val set = PrefManager.getVal<List<Boolean>>(PrefName.HomeLayoutShow).toMutableList() val set = PrefManager.getVal<List<Boolean>>(PrefName.HomeLayoutShow)
.toMutableList()
set[i] = value set[i] = value
PrefManager.setVal(PrefName.HomeLayoutShow, set) PrefManager.setVal(PrefName.HomeLayoutShow, set)
} }
@ -87,7 +88,8 @@ class UserInterfaceSettingsActivity : AppCompatActivity() {
0f to 0f 0f to 0f
) )
val mapReverse = map.map { it.value to it.key }.toMap() val mapReverse = map.map { it.value to it.key }.toMap()
binding.uiSettingsAnimationSpeed.value = mapReverse[PrefManager.getVal(PrefName.AnimationSpeed)] ?: 1f binding.uiSettingsAnimationSpeed.value =
mapReverse[PrefManager.getVal(PrefName.AnimationSpeed)] ?: 1f
binding.uiSettingsAnimationSpeed.addOnChangeListener { _, value, _ -> binding.uiSettingsAnimationSpeed.addOnChangeListener { _, value, _ ->
PrefManager.setVal(PrefName.AnimationSpeed, map[value] ?: 1f) PrefManager.setVal(PrefName.AnimationSpeed, map[value] ?: 1f)
restartApp() restartApp()

View file

@ -20,8 +20,8 @@ import androidx.recyclerview.widget.RecyclerView
import ani.dantotsu.R import ani.dantotsu.R
import ani.dantotsu.databinding.ItemExtensionAllBinding import ani.dantotsu.databinding.ItemExtensionAllBinding
import ani.dantotsu.others.LanguageMapper import ani.dantotsu.others.LanguageMapper
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefName
import com.bumptech.glide.Glide import com.bumptech.glide.Glide
import eu.kanade.tachiyomi.extension.anime.AnimeExtensionManager import eu.kanade.tachiyomi.extension.anime.AnimeExtensionManager
import eu.kanade.tachiyomi.extension.anime.model.AnimeExtension import eu.kanade.tachiyomi.extension.anime.model.AnimeExtension
@ -103,7 +103,8 @@ class AnimeExtensionPagingSource(
availableExtensions.filter { it.name.contains(query, ignoreCase = true) } availableExtensions.filter { it.name.contains(query, ignoreCase = true) }
} }
val lang: String = PrefManager.getVal(PrefName.LangSort) val lang: String = PrefManager.getVal(PrefName.LangSort)
val langFilter = if (lang != "all") filteredExtensions.filter { it.lang == lang } else filteredExtensions val langFilter =
if (lang != "all") filteredExtensions.filter { it.lang == lang } else filteredExtensions
val filternfsw = if (isNsfwEnabled) langFilter else langFilter.filterNot { it.isNsfw } val filternfsw = if (isNsfwEnabled) langFilter else langFilter.filterNot { it.isNsfw }
return try { return try {
val sublist = filternfsw.subList( val sublist = filternfsw.subList(

View file

@ -20,8 +20,8 @@ import androidx.recyclerview.widget.RecyclerView
import ani.dantotsu.R import ani.dantotsu.R
import ani.dantotsu.databinding.ItemExtensionAllBinding import ani.dantotsu.databinding.ItemExtensionAllBinding
import ani.dantotsu.others.LanguageMapper import ani.dantotsu.others.LanguageMapper
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefName
import com.bumptech.glide.Glide import com.bumptech.glide.Glide
import eu.kanade.tachiyomi.extension.manga.MangaExtensionManager import eu.kanade.tachiyomi.extension.manga.MangaExtensionManager
import eu.kanade.tachiyomi.extension.manga.model.MangaExtension import eu.kanade.tachiyomi.extension.manga.model.MangaExtension
@ -102,7 +102,8 @@ class MangaExtensionPagingSource(
availableExtensions.filter { it.name.contains(query, ignoreCase = true) } availableExtensions.filter { it.name.contains(query, ignoreCase = true) }
} }
val lang: String = PrefManager.getVal(PrefName.LangSort) val lang: String = PrefManager.getVal(PrefName.LangSort)
val langFilter = if (lang != "all") filteredExtensions.filter { it.lang == lang } else filteredExtensions val langFilter =
if (lang != "all") filteredExtensions.filter { it.lang == lang } else filteredExtensions
val filternfsw = if (isNsfwEnabled) langFilter else langFilter.filterNot { it.isNsfw } val filternfsw = if (isNsfwEnabled) langFilter else langFilter.filterNot { it.isNsfw }
return try { return try {
val sublist = filternfsw.subList( val sublist = filternfsw.subList(

View file

@ -21,8 +21,8 @@ import ani.dantotsu.databinding.ItemExtensionAllBinding
import ani.dantotsu.others.LanguageMapper import ani.dantotsu.others.LanguageMapper
import ani.dantotsu.parsers.novel.NovelExtension import ani.dantotsu.parsers.novel.NovelExtension
import ani.dantotsu.parsers.novel.NovelExtensionManager import ani.dantotsu.parsers.novel.NovelExtensionManager
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefName
import com.bumptech.glide.Glide import com.bumptech.glide.Glide
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers

View file

@ -22,12 +22,18 @@ object PrefManager {
private var protectedPreferences: SharedPreferences? = null private var protectedPreferences: SharedPreferences? = null
fun init(context: Context) { //must be called in Application class or will crash fun init(context: Context) { //must be called in Application class or will crash
generalPreferences = context.getSharedPreferences(Location.General.location, Context.MODE_PRIVATE) generalPreferences =
playerPreferences = context.getSharedPreferences(Location.Player.location, Context.MODE_PRIVATE) context.getSharedPreferences(Location.General.location, Context.MODE_PRIVATE)
readerPreferences = context.getSharedPreferences(Location.Reader.location, Context.MODE_PRIVATE) playerPreferences =
irrelevantPreferences = context.getSharedPreferences(Location.Irrelevant.location, Context.MODE_PRIVATE) context.getSharedPreferences(Location.Player.location, Context.MODE_PRIVATE)
animeDownloadsPreferences = context.getSharedPreferences(Location.AnimeDownloads.location, Context.MODE_PRIVATE) readerPreferences =
protectedPreferences = context.getSharedPreferences(Location.Protected.location, Context.MODE_PRIVATE) context.getSharedPreferences(Location.Reader.location, Context.MODE_PRIVATE)
irrelevantPreferences =
context.getSharedPreferences(Location.Irrelevant.location, Context.MODE_PRIVATE)
animeDownloadsPreferences =
context.getSharedPreferences(Location.AnimeDownloads.location, Context.MODE_PRIVATE)
protectedPreferences =
context.getSharedPreferences(Location.Protected.location, Context.MODE_PRIVATE)
Compat.importOldPrefs(context) Compat.importOldPrefs(context)
} }
@ -49,7 +55,7 @@ object PrefManager {
} }
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
fun <T> getVal(prefName: PrefName, default: T) : T { fun <T> getVal(prefName: PrefName, default: T): T {
return try { return try {
val pref = getPrefLocation(prefName.data.prefLocation) val pref = getPrefLocation(prefName.data.prefLocation)
when (prefName.data.type) { when (prefName.data.type) {
@ -58,8 +64,17 @@ object PrefManager {
Float::class -> pref.getFloat(prefName.name, default as Float) as T Float::class -> pref.getFloat(prefName.name, default as Float) as T
Long::class -> pref.getLong(prefName.name, default as Long) as T Long::class -> pref.getLong(prefName.name, default as Long) as T
String::class -> pref.getString(prefName.name, default as String?) as T String::class -> pref.getString(prefName.name, default as String?) as T
Set::class -> convertFromStringSet(pref.getStringSet(prefName.name, null), default) as T Set::class -> convertFromStringSet(
List::class -> deserializeClass(prefName.name, default, prefName.data.prefLocation) as T pref.getStringSet(prefName.name, null),
default
) as T
List::class -> deserializeClass(
prefName.name,
default,
prefName.data.prefLocation
) as T
else -> throw IllegalArgumentException("Type not supported") else -> throw IllegalArgumentException("Type not supported")
} }
} catch (e: Exception) { } catch (e: Exception) {
@ -68,17 +83,34 @@ object PrefManager {
} }
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
fun <T> getVal(prefName: PrefName) : T { fun <T> getVal(prefName: PrefName): T {
return try { return try {
val pref = getPrefLocation(prefName.data.prefLocation) val pref = getPrefLocation(prefName.data.prefLocation)
when (prefName.data.type) { when (prefName.data.type) {
Boolean::class -> pref.getBoolean(prefName.name, prefName.data.default as Boolean) as T Boolean::class -> pref.getBoolean(
prefName.name,
prefName.data.default as Boolean
) as T
Int::class -> pref.getInt(prefName.name, prefName.data.default as Int) as T Int::class -> pref.getInt(prefName.name, prefName.data.default as Int) as T
Float::class -> pref.getFloat(prefName.name, prefName.data.default as Float) as T Float::class -> pref.getFloat(prefName.name, prefName.data.default as Float) as T
Long::class -> pref.getLong(prefName.name, prefName.data.default as Long) as T Long::class -> pref.getLong(prefName.name, prefName.data.default as Long) as T
String::class -> pref.getString(prefName.name, prefName.data.default as String?) as T String::class -> pref.getString(
Set::class -> convertFromStringSet(pref.getStringSet(prefName.name, null), prefName.data.default) as T prefName.name,
List::class -> deserializeClass(prefName.name, prefName.data.default, prefName.data.prefLocation) as T prefName.data.default as String?
) as T
Set::class -> convertFromStringSet(
pref.getStringSet(prefName.name, null),
prefName.data.default
) as T
List::class -> deserializeClass(
prefName.name,
prefName.data.default,
prefName.data.prefLocation
) as T
else -> throw IllegalArgumentException("Type not supported") else -> throw IllegalArgumentException("Type not supported")
} }
} catch (e: Exception) { } catch (e: Exception) {
@ -87,7 +119,10 @@ object PrefManager {
} }
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
fun <T> getNullableVal(prefName: PrefName, default: T?) : T? { //Strings don't necessarily need to use this one fun <T> getNullableVal(
prefName: PrefName,
default: T?
): T? { //Strings don't necessarily need to use this one
return try { return try {
val pref = getPrefLocation(prefName.data.prefLocation) val pref = getPrefLocation(prefName.data.prefLocation)
when (prefName.data.type) { when (prefName.data.type) {
@ -96,7 +131,11 @@ object PrefManager {
Float::class -> pref.getFloat(prefName.name, default as Float) as T? Float::class -> pref.getFloat(prefName.name, default as Float) as T?
Long::class -> pref.getLong(prefName.name, default as Long) as T? Long::class -> pref.getLong(prefName.name, default as Long) as T?
String::class -> pref.getString(prefName.name, default as String?) as T? String::class -> pref.getString(prefName.name, default as String?) as T?
Set::class -> convertFromStringSet(pref.getStringSet(prefName.name, null), default) as T? Set::class -> convertFromStringSet(
pref.getStringSet(prefName.name, null),
default
) as T?
else -> deserializeClass(prefName.name, default, prefName.data.prefLocation) else -> deserializeClass(prefName.name, default, prefName.data.prefLocation)
} }
} catch (e: Exception) { } catch (e: Exception) {
@ -113,7 +152,11 @@ object PrefManager {
is Float -> irrelevantPreferences!!.getFloat(key, default) as T is Float -> irrelevantPreferences!!.getFloat(key, default) as T
is Long -> irrelevantPreferences!!.getLong(key, default) as T is Long -> irrelevantPreferences!!.getLong(key, default) as T
is String -> irrelevantPreferences!!.getString(key, default) as T is String -> irrelevantPreferences!!.getString(key, default) as T
is Set<*> -> convertFromStringSet(irrelevantPreferences!!.getStringSet(key, null), default) as T is Set<*> -> convertFromStringSet(
irrelevantPreferences!!.getStringSet(key, null),
default
) as T
else -> throw IllegalArgumentException("Type not supported") else -> throw IllegalArgumentException("Type not supported")
} }
} catch (e: Exception) { } catch (e: Exception) {
@ -125,12 +168,36 @@ object PrefManager {
fun <T> getNullableCustomVal(key: String, default: T?, clazz: Class<T>): T? { fun <T> getNullableCustomVal(key: String, default: T?, clazz: Class<T>): T? {
return try { return try {
when { when {
clazz.isAssignableFrom(Boolean::class.java) -> irrelevantPreferences!!.getBoolean(key, default as? Boolean ?: false) as T? clazz.isAssignableFrom(Boolean::class.java) -> irrelevantPreferences!!.getBoolean(
clazz.isAssignableFrom(Int::class.java) -> irrelevantPreferences!!.getInt(key, default as? Int ?: 0) as T? key,
clazz.isAssignableFrom(Float::class.java) -> irrelevantPreferences!!.getFloat(key, default as? Float ?: 0f) as T? default as? Boolean ?: false
clazz.isAssignableFrom(Long::class.java) -> irrelevantPreferences!!.getLong(key, default as? Long ?: 0L) as T? ) as T?
clazz.isAssignableFrom(String::class.java) -> irrelevantPreferences!!.getString(key, default as? String) as T?
clazz.isAssignableFrom(Set::class.java) -> convertFromStringSet(irrelevantPreferences!!.getStringSet(key, null), default) as T? clazz.isAssignableFrom(Int::class.java) -> irrelevantPreferences!!.getInt(
key,
default as? Int ?: 0
) as T?
clazz.isAssignableFrom(Float::class.java) -> irrelevantPreferences!!.getFloat(
key,
default as? Float ?: 0f
) as T?
clazz.isAssignableFrom(Long::class.java) -> irrelevantPreferences!!.getLong(
key,
default as? Long ?: 0L
) as T?
clazz.isAssignableFrom(String::class.java) -> irrelevantPreferences!!.getString(
key,
default as? String
) as T?
clazz.isAssignableFrom(Set::class.java) -> convertFromStringSet(
irrelevantPreferences!!.getStringSet(key, null),
default
) as T?
else -> deserializeClass(key, default, Location.Irrelevant) else -> deserializeClass(key, default, Location.Irrelevant)
} }
} catch (e: Exception) { } catch (e: Exception) {
@ -173,7 +240,7 @@ object PrefManager {
} }
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
fun <T> getLiveVal(prefName: PrefName, default: T) : SharedPreferenceLiveData<T> { fun <T> getLiveVal(prefName: PrefName, default: T): SharedPreferenceLiveData<T> {
val pref = getPrefLocation(prefName.data.prefLocation) val pref = getPrefLocation(prefName.data.prefLocation)
return when (prefName.data.type) { return when (prefName.data.type) {
Boolean::class -> SharedPreferenceBooleanLiveData( Boolean::class -> SharedPreferenceBooleanLiveData(
@ -181,31 +248,37 @@ object PrefManager {
prefName.name, prefName.name,
default as Boolean default as Boolean
) as SharedPreferenceLiveData<T> ) as SharedPreferenceLiveData<T>
Int::class -> SharedPreferenceIntLiveData( Int::class -> SharedPreferenceIntLiveData(
pref, pref,
prefName.name, prefName.name,
default as Int default as Int
) as SharedPreferenceLiveData<T> ) as SharedPreferenceLiveData<T>
Float::class -> SharedPreferenceFloatLiveData( Float::class -> SharedPreferenceFloatLiveData(
pref, pref,
prefName.name, prefName.name,
default as Float default as Float
) as SharedPreferenceLiveData<T> ) as SharedPreferenceLiveData<T>
Long::class -> SharedPreferenceLongLiveData( Long::class -> SharedPreferenceLongLiveData(
pref, pref,
prefName.name, prefName.name,
default as Long default as Long
) as SharedPreferenceLiveData<T> ) as SharedPreferenceLiveData<T>
String::class -> SharedPreferenceStringLiveData( String::class -> SharedPreferenceStringLiveData(
pref, pref,
prefName.name, prefName.name,
default as String default as String
) as SharedPreferenceLiveData<T> ) as SharedPreferenceLiveData<T>
Set::class -> SharedPreferenceStringSetLiveData( Set::class -> SharedPreferenceStringSetLiveData(
pref, pref,
prefName.name, prefName.name,
default as Set<String> default as Set<String>
) as SharedPreferenceLiveData<T> ) as SharedPreferenceLiveData<T>
else -> throw IllegalArgumentException("Type not supported") else -> throw IllegalArgumentException("Type not supported")
} }
} }
@ -234,7 +307,8 @@ object PrefManager {
this as? SharedPreferenceStringSetLiveData this as? SharedPreferenceStringSetLiveData
?: throw ClassCastException("Cannot cast to SharedPreferenceLiveData<Set<String>>") ?: throw ClassCastException("Cannot cast to SharedPreferenceLiveData<Set<String>>")
fun getAnimeDownloadPreferences(): SharedPreferences = animeDownloadsPreferences!! //needs to be used externally fun getAnimeDownloadPreferences(): SharedPreferences =
animeDownloadsPreferences!! //needs to be used externally
fun exportAllPrefs(prefLocation: List<Location>): String { fun exportAllPrefs(prefLocation: List<Location>): String {
return PreferencePackager.pack( return PreferencePackager.pack(
@ -331,7 +405,7 @@ object PrefManager {
} }
private fun <T> serializeClass(key: String, value: T, location: Location){ private fun <T> serializeClass(key: String, value: T, location: Location) {
val pref = getPrefLocation(location) val pref = getPrefLocation(location)
try { try {
val bos = ByteArrayOutputStream() val bos = ByteArrayOutputStream()

View file

@ -2,8 +2,8 @@ package ani.dantotsu.settings.saving
import android.graphics.Color import android.graphics.Color
import ani.dantotsu.connections.mal.MAL import ani.dantotsu.connections.mal.MAL
import ani.dantotsu.settings.saving.internal.Pref
import ani.dantotsu.settings.saving.internal.Location import ani.dantotsu.settings.saving.internal.Location
import ani.dantotsu.settings.saving.internal.Pref
enum class PrefName(val data: Pref) { //TODO: Split this into multiple files enum class PrefName(val data: Pref) { //TODO: Split this into multiple files
//General //General
@ -20,7 +20,13 @@ enum class PrefName(val data: Pref) { //TODO: Split this into multiple files
CheckUpdate(Pref(Location.General, Boolean::class, true)), CheckUpdate(Pref(Location.General, Boolean::class, true)),
VerboseLogging(Pref(Location.General, Boolean::class, false)), VerboseLogging(Pref(Location.General, Boolean::class, false)),
DohProvider(Pref(Location.General, Int::class, 0)), DohProvider(Pref(Location.General, Int::class, 0)),
DefaultUserAgent(Pref(Location.General, String::class, "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:110.0) Gecko/20100101 Firefox/110.0")), DefaultUserAgent(
Pref(
Location.General,
String::class,
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:110.0) Gecko/20100101 Firefox/110.0"
)
),
AnimeSourcesOrder(Pref(Location.General, List::class, listOf<String>())), AnimeSourcesOrder(Pref(Location.General, List::class, listOf<String>())),
AnimeSearchHistory(Pref(Location.General, Set::class, setOf<String>())), AnimeSearchHistory(Pref(Location.General, Set::class, setOf<String>())),
MangaSourcesOrder(Pref(Location.General, List::class, listOf<String>())), MangaSourcesOrder(Pref(Location.General, List::class, listOf<String>())),
@ -42,7 +48,13 @@ enum class PrefName(val data: Pref) { //TODO: Split this into multiple files
ImmersiveMode(Pref(Location.UI, Boolean::class, false)), ImmersiveMode(Pref(Location.UI, Boolean::class, false)),
SmallView(Pref(Location.UI, Boolean::class, true)), SmallView(Pref(Location.UI, Boolean::class, true)),
DefaultStartUpTab(Pref(Location.UI, Int::class, 1)), DefaultStartUpTab(Pref(Location.UI, Int::class, 1)),
HomeLayoutShow(Pref(Location.UI, List::class, listOf(true, false, false, true, false, false, true))), HomeLayoutShow(
Pref(
Location.UI,
List::class,
listOf(true, false, false, true, false, false, true)
)
),
BannerAnimations(Pref(Location.UI, Boolean::class, true)), BannerAnimations(Pref(Location.UI, Boolean::class, true)),
LayoutAnimations(Pref(Location.UI, Boolean::class, true)), LayoutAnimations(Pref(Location.UI, Boolean::class, true)),
AnimationSpeed(Pref(Location.UI, Float::class, 1f)), AnimationSpeed(Pref(Location.UI, Float::class, 1f)),

View file

@ -1,8 +1,8 @@
package ani.dantotsu.settings.saving.internal package ani.dantotsu.settings.saving.internal
import android.content.Context import android.content.Context
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefName
class Compat { class Compat {
companion object { companion object {

View file

@ -8,6 +8,7 @@ data class Pref(
val type: KClass<*>, val type: KClass<*>,
val default: Any val default: Any
) )
enum class Location(val location: String, val exportable: Boolean) { enum class Location(val location: String, val exportable: Boolean) {
General("ani.dantotsu.general", true), General("ani.dantotsu.general", true),
UI("ani.dantotsu.ui", true), UI("ani.dantotsu.ui", true),

View file

@ -2,7 +2,6 @@ package ani.dantotsu.settings.saving.internal
import android.security.keystore.KeyGenParameterSpec import android.security.keystore.KeyGenParameterSpec
import android.security.keystore.KeyProperties import android.security.keystore.KeyProperties
import java.security.KeyStore
import java.security.SecureRandom import java.security.SecureRandom
import javax.crypto.Cipher import javax.crypto.Cipher
import javax.crypto.KeyGenerator import javax.crypto.KeyGenerator
@ -15,7 +14,8 @@ import javax.crypto.spec.PBEKeySpec
class PreferenceKeystore { class PreferenceKeystore {
companion object { companion object {
fun generateKey(alias: String) { fun generateKey(alias: String) {
val keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore") val keyGenerator =
KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore")
keyGenerator.init( keyGenerator.init(
KeyGenParameterSpec.Builder( KeyGenParameterSpec.Builder(
@ -30,17 +30,31 @@ class PreferenceKeystore {
keyGenerator.generateKey() keyGenerator.generateKey()
} }
fun encryptWithPassword(password: CharArray, plaintext: String, salt: ByteArray): ByteArray { fun encryptWithPassword(
password: CharArray,
plaintext: String,
salt: ByteArray
): ByteArray {
val secretKey = deriveKeyFromPassword(password, salt) val secretKey = deriveKeyFromPassword(password, salt)
val cipher = Cipher.getInstance("${KeyProperties.KEY_ALGORITHM_AES}/${KeyProperties.BLOCK_MODE_CBC}/${KeyProperties.ENCRYPTION_PADDING_PKCS7}") val cipher =
Cipher.getInstance("${KeyProperties.KEY_ALGORITHM_AES}/${KeyProperties.BLOCK_MODE_CBC}/${KeyProperties.ENCRYPTION_PADDING_PKCS7}")
cipher.init(Cipher.ENCRYPT_MODE, secretKey, IvParameterSpec(ByteArray(16))) cipher.init(Cipher.ENCRYPT_MODE, secretKey, IvParameterSpec(ByteArray(16)))
return cipher.doFinal(plaintext.toByteArray(Charsets.UTF_8)) return cipher.doFinal(plaintext.toByteArray(Charsets.UTF_8))
} }
fun decryptWithPassword(password: CharArray, ciphertext: ByteArray, salt: ByteArray): String { fun decryptWithPassword(
password: CharArray,
ciphertext: ByteArray,
salt: ByteArray
): String {
val secretKey = deriveKeyFromPassword(password, salt) val secretKey = deriveKeyFromPassword(password, salt)
val cipher = Cipher.getInstance("${KeyProperties.KEY_ALGORITHM_AES}/${KeyProperties.BLOCK_MODE_CBC}/${KeyProperties.ENCRYPTION_PADDING_PKCS7}") val cipher =
cipher.init(Cipher.DECRYPT_MODE, secretKey, IvParameterSpec(ByteArray(16))) // Use the correct IV Cipher.getInstance("${KeyProperties.KEY_ALGORITHM_AES}/${KeyProperties.BLOCK_MODE_CBC}/${KeyProperties.ENCRYPTION_PADDING_PKCS7}")
cipher.init(
Cipher.DECRYPT_MODE,
secretKey,
IvParameterSpec(ByteArray(16))
) // Use the correct IV
return cipher.doFinal(ciphertext).toString(Charsets.UTF_8) return cipher.doFinal(ciphertext).toString(Charsets.UTF_8)
} }

View file

@ -1,11 +1,7 @@
package ani.dantotsu.settings.saving.internal package ani.dantotsu.settings.saving.internal
import android.content.SharedPreferences import android.content.SharedPreferences
import android.net.Uri
import androidx.documentfile.provider.DocumentFile
import ani.dantotsu.connections.discord.serializers.Activity
import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.toast
import com.google.gson.Gson import com.google.gson.Gson
import com.google.gson.reflect.TypeToken import com.google.gson.reflect.TypeToken
@ -28,8 +24,10 @@ class PreferencePackager {
*/ */
fun unpack(decryptedJson: String): Boolean { fun unpack(decryptedJson: String): Boolean {
val gson = Gson() val gson = Gson()
val type = object : TypeToken<Map<String, Map<String, Map<String, Any>>>>() {}.type //oh god... val type = object :
val rawPrefsMap: Map<String, Map<String, Map<String, Any>>> = gson.fromJson(decryptedJson, type) TypeToken<Map<String, Map<String, Map<String, Any>>>>() {}.type //oh god...
val rawPrefsMap: Map<String, Map<String, Map<String, Any>>> =
gson.fromJson(decryptedJson, type)
val deserializedMap = mutableMapOf<String, Map<String, Any?>>() val deserializedMap = mutableMapOf<String, Map<String, Any?>>()

View file

@ -8,8 +8,8 @@ import android.content.Intent
import ani.dantotsu.currContext import ani.dantotsu.currContext
import ani.dantotsu.isOnline import ani.dantotsu.isOnline
import ani.dantotsu.logger import ani.dantotsu.logger
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.subcriptions.Subscription.Companion.defaultTime import ani.dantotsu.subcriptions.Subscription.Companion.defaultTime
import ani.dantotsu.subcriptions.Subscription.Companion.startSubscription import ani.dantotsu.subcriptions.Subscription.Companion.startSubscription
import ani.dantotsu.subcriptions.Subscription.Companion.timeMinutes import ani.dantotsu.subcriptions.Subscription.Companion.timeMinutes

View file

@ -5,8 +5,8 @@ import android.content.BroadcastReceiver
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import ani.dantotsu.INCOGNITO_CHANNEL_ID import ani.dantotsu.INCOGNITO_CHANNEL_ID
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefName
class NotificationClickReceiver : BroadcastReceiver() { class NotificationClickReceiver : BroadcastReceiver() {

View file

@ -8,8 +8,8 @@ import androidx.core.app.NotificationManagerCompat
import ani.dantotsu.* import ani.dantotsu.*
import ani.dantotsu.parsers.Episode import ani.dantotsu.parsers.Episode
import ani.dantotsu.parsers.MangaChapter import ani.dantotsu.parsers.MangaChapter
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefName
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay import kotlinx.coroutines.delay

View file

@ -14,8 +14,8 @@ import ani.dantotsu.parsers.HMangaSources
import ani.dantotsu.parsers.MangaChapter import ani.dantotsu.parsers.MangaChapter
import ani.dantotsu.parsers.MangaParser import ani.dantotsu.parsers.MangaParser
import ani.dantotsu.parsers.MangaSources import ani.dantotsu.parsers.MangaSources
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.tryWithSuspend import ani.dantotsu.tryWithSuspend
import kotlinx.coroutines.withTimeoutOrNull import kotlinx.coroutines.withTimeoutOrNull
@ -27,7 +27,9 @@ class SubscriptionHelper {
isAdult: Boolean, isAdult: Boolean,
isAnime: Boolean isAnime: Boolean
): Selected { ): Selected {
val data = PrefManager.getNullableCustomVal("${mediaId}-select", null, Selected::class.java) ?: Selected().let { val data =
PrefManager.getNullableCustomVal("${mediaId}-select", null, Selected::class.java)
?: Selected().let {
it.sourceIndex = 0 it.sourceIndex = 0
it.preferDub = PrefManager.getVal(PrefName.SettingsPreferDub) it.preferDub = PrefManager.getVal(PrefName.SettingsPreferDub)
it it
@ -126,12 +128,20 @@ class SubscriptionHelper {
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
fun getSubscriptions(): Map<Int, SubscribeMedia> = fun getSubscriptions(): Map<Int, SubscribeMedia> =
(PrefManager.getNullableCustomVal(subscriptions, null, Map::class.java) as? Map<Int, SubscribeMedia>) (PrefManager.getNullableCustomVal(
subscriptions,
null,
Map::class.java
) as? Map<Int, SubscribeMedia>)
?: mapOf<Int, SubscribeMedia>().also { PrefManager.setCustomVal(subscriptions, it) } ?: mapOf<Int, SubscribeMedia>().also { PrefManager.setCustomVal(subscriptions, it) }
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
fun saveSubscription(context: Context, media: Media, subscribed: Boolean) { fun saveSubscription(context: Context, media: Media, subscribed: Boolean) {
val data = PrefManager.getNullableCustomVal(subscriptions, null, Map::class.java) as? MutableMap<Int, SubscribeMedia> val data = PrefManager.getNullableCustomVal(
subscriptions,
null,
Map::class.java
) as? MutableMap<Int, SubscribeMedia>
?: mutableMapOf() ?: mutableMapOf()
if (subscribed) { if (subscribed) {
if (!data.containsKey(media.id)) { if (!data.containsKey(media.id)) {

View file

@ -8,8 +8,8 @@ import androidx.work.NetworkType
import androidx.work.PeriodicWorkRequest import androidx.work.PeriodicWorkRequest
import androidx.work.WorkManager import androidx.work.WorkManager
import androidx.work.WorkerParameters import androidx.work.WorkerParameters
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.subcriptions.Subscription.Companion.defaultTime import ani.dantotsu.subcriptions.Subscription.Companion.defaultTime
import ani.dantotsu.subcriptions.Subscription.Companion.timeMinutes import ani.dantotsu.subcriptions.Subscription.Companion.timeMinutes
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers

View file

@ -7,8 +7,8 @@ import android.graphics.Bitmap
import android.view.Window import android.view.Window
import android.view.WindowManager import android.view.WindowManager
import ani.dantotsu.R import ani.dantotsu.R
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefName
import com.google.android.material.color.DynamicColors import com.google.android.material.color.DynamicColors
import com.google.android.material.color.DynamicColorsOptions import com.google.android.material.color.DynamicColorsOptions

View file

@ -3,8 +3,8 @@ package eu.kanade.tachiyomi.network
import android.content.Context import android.content.Context
import android.os.Build import android.os.Build
import ani.dantotsu.Mapper import ani.dantotsu.Mapper
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefName
import com.lagradost.nicehttp.Requests import com.lagradost.nicehttp.Requests
import eu.kanade.tachiyomi.network.interceptor.CloudflareInterceptor import eu.kanade.tachiyomi.network.interceptor.CloudflareInterceptor
import eu.kanade.tachiyomi.network.interceptor.UncaughtExceptionInterceptor import eu.kanade.tachiyomi.network.interceptor.UncaughtExceptionInterceptor

View file

@ -1,3 +1,3 @@
<overshootInterpolator <overshootInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:android="http://schemas.android.com/apk/res/android" android:factor="1"
android:factor="1" android:tension="1.4" /> android:tension="1.4" />

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"> <set xmlns:android="http://schemas.android.com/apk/res/android">
<translate <translate
android:duration="300"
android:fromYDelta="0%" android:fromYDelta="0%"
android:toYDelta="100%" android:toYDelta="100%" />
android:duration="300"/>
</set> </set>

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"> <set xmlns:android="http://schemas.android.com/apk/res/android">
<translate <translate
android:duration="300"
android:fromYDelta="100%" android:fromYDelta="100%"
android:toYDelta="0%" android:toYDelta="0%" />
android:duration="300"/>
</set> </set>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="?android:colorBackground" android:state_checked="true"/> <item android:color="?android:colorBackground" android:state_checked="true" />
<item android:color="?attr/colorPrimary" android:state_checked="false"/> <item android:color="?attr/colorPrimary" android:state_checked="false" />
</selector> </selector>

View file

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Color when the chip is selected --> <!-- Color when the chip is selected -->
<item android:color="@color/chip" android:state_selected="true"/> <item android:color="@color/chip" android:state_selected="true" />
<!-- Color when the chip is not selected --> <!-- Color when the chip is not selected -->
<item android:color="?attr/colorSurface"/> <item android:color="?attr/colorSurface" />
</selector> </selector>

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Color when the chip is selected --> <!-- Color when the chip is selected -->
<item android:color="?attr/colorSurface" android:state_selected="true"/> <item android:color="?attr/colorSurface" android:state_selected="true" />
<!-- Color when the chip is not selected --> <!-- Color when the chip is not selected -->
<item android:color="#858585"/> <item android:color="#858585" />
</selector> </selector>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="true" android:color="?attr/colorPrimary"/> <item android:color="?attr/colorPrimary" android:state_selected="true" />
<item android:color="?attr/colorOutline"/> <item android:color="?attr/colorOutline" />
</selector> </selector>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="true" android:color="?attr/colorOnPrimary"/> <item android:color="?attr/colorOnPrimary" android:state_selected="true" />
<item android:color="?attr/colorOnSecondary"/> <item android:color="?attr/colorOnSecondary" />
</selector> </selector>

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Color when the TextInputLayout is focused --> <!-- Color when the TextInputLayout is focused -->
<item android:color="?attr/colorPrimary" android:state_focused="true"/> <item android:color="?attr/colorPrimary" android:state_focused="true" />
<!-- Color when the TextInputLayout is not focused (unselected) --> <!-- Color when the TextInputLayout is not focused (unselected) -->
<item android:color="?attr/colorPrimaryContainer"/> <item android:color="?attr/colorPrimaryContainer" />
</selector> </selector>

View file

@ -1,5 +1,4 @@
<animated-vector <animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"> xmlns:aapt="http://schemas.android.com/aapt">
<aapt:attr name="android:drawable"> <aapt:attr name="android:drawable">
<vector <vector
@ -19,8 +18,8 @@
android:rotation="270"> android:rotation="270">
<path <path
android:name="path_1" android:name="path_1"
android:pathData="M 7 6 C 5.9 6 5 6.9 5 8 L 5 8 C 5 9.1 5.9 10 7 10 L 12 10 L 17 10 C 18.1 10 19 9.1 19 8 C 19 6.9 18.1 6 17 6 C 13.667 6 10.333 6 7 6 M 7 14 C 5.9 14 5 14.9 5 16 C 5 17.1 5.9 18 7 18 L 17 18 C 18.1 18 19 17.1 19 16 C 19 14.9 18.1 14 17 14 L 17 14 L 12 14 L 7 14" android:fillColor="#fff"
android:fillColor="#fff"/> android:pathData="M 7 6 C 5.9 6 5 6.9 5 8 L 5 8 C 5 9.1 5.9 10 7 10 L 12 10 L 17 10 C 18.1 10 19 9.1 19 8 C 19 6.9 18.1 6 17 6 C 13.667 6 10.333 6 7 6 M 7 14 C 5.9 14 5 14.9 5 16 C 5 17.1 5.9 18 7 18 L 17 18 C 18.1 18 19 17.1 19 16 C 19 14.9 18.1 14 17 14 L 17 14 L 12 14 L 7 14" />
</group> </group>
</group> </group>
</vector> </vector>
@ -28,54 +27,54 @@
<target android:name="path_1"> <target android:name="path_1">
<aapt:attr name="android:animation"> <aapt:attr name="android:animation">
<objectAnimator <objectAnimator
android:propertyName="pathData"
android:duration="300" android:duration="300"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:propertyName="pathData"
android:valueFrom="M 7 6 C 5.9 6 5 6.9 5 8 L 5 8 C 5 9.1 5.9 10 7 10 L 12 10 L 17 10 C 18.1 10 19 9.1 19 8 C 19 6.9 18.1 6 17 6 C 13.667 6 10.333 6 7 6 M 7 14 C 5.9 14 5 14.9 5 16 C 5 17.1 5.9 18 7 18 L 17 18 C 18.1 18 19 17.1 19 16 C 19 14.9 18.1 14 17 14 L 17 14 L 12 14 L 7 14" android:valueFrom="M 7 6 C 5.9 6 5 6.9 5 8 L 5 8 C 5 9.1 5.9 10 7 10 L 12 10 L 17 10 C 18.1 10 19 9.1 19 8 C 19 6.9 18.1 6 17 6 C 13.667 6 10.333 6 7 6 M 7 14 C 5.9 14 5 14.9 5 16 C 5 17.1 5.9 18 7 18 L 17 18 C 18.1 18 19 17.1 19 16 C 19 14.9 18.1 14 17 14 L 17 14 L 12 14 L 7 14"
android:valueTo="M 8 6.82 C 8 6.82 8 6.82 8 6.82 L 8 6.82 C 8 8.518 8 10.216 8 11.915 L 10.285 11.928 L 18.145 11.975 C 18.137 11.659 17.982 11.345 17.68 11.15 C 14.967 9.427 12.253 7.703 9.54 5.98 C 8.87 5.55 8 6.03 8 6.82 M 8 11.915 C 8 13.67 8 15.425 8 17.18 C 8 17.97 8.87 18.45 9.54 18.02 L 17.68 12.84 C 17.998 12.64 18.152 12.307 18.145 11.975 C 17.057 11.969 15.969 11.962 14.881 11.956 L 13.283 11.946 L 11.618 11.936 L 8 11.915" android:valueTo="M 8 6.82 C 8 6.82 8 6.82 8 6.82 L 8 6.82 C 8 8.518 8 10.216 8 11.915 L 10.285 11.928 L 18.145 11.975 C 18.137 11.659 17.982 11.345 17.68 11.15 C 14.967 9.427 12.253 7.703 9.54 5.98 C 8.87 5.55 8 6.03 8 6.82 M 8 11.915 C 8 13.67 8 15.425 8 17.18 C 8 17.97 8.87 18.45 9.54 18.02 L 17.68 12.84 C 17.998 12.64 18.152 12.307 18.145 11.975 C 17.057 11.969 15.969 11.962 14.881 11.956 L 13.283 11.946 L 11.618 11.936 L 8 11.915"
android:valueType="pathType" android:valueType="pathType" />
android:interpolator="@android:interpolator/fast_out_slow_in"/>
</aapt:attr> </aapt:attr>
</target> </target>
<target android:name="group"> <target android:name="group">
<aapt:attr name="android:animation"> <aapt:attr name="android:animation">
<set> <set>
<objectAnimator <objectAnimator
android:propertyName="rotation"
android:duration="300" android:duration="300"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:propertyName="rotation"
android:valueFrom="0" android:valueFrom="0"
android:valueTo="90" android:valueTo="90"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:interpolator/fast_out_slow_in"/>
<objectAnimator <objectAnimator
android:propertyName="scaleY"
android:duration="150" android:duration="150"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:propertyName="scaleY"
android:valueFrom="1" android:valueFrom="1"
android:valueTo="1.2" android:valueTo="1.2"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:interpolator/fast_out_slow_in"/>
<objectAnimator <objectAnimator
android:propertyName="scaleX"
android:duration="150" android:duration="150"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:propertyName="scaleX"
android:valueFrom="1" android:valueFrom="1"
android:valueTo="1.2" android:valueTo="1.2"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:interpolator/fast_out_slow_in"/>
<objectAnimator <objectAnimator
android:duration="150"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:propertyName="scaleY" android:propertyName="scaleY"
android:startOffset="150" android:startOffset="150"
android:duration="150"
android:valueFrom="1.2" android:valueFrom="1.2"
android:valueTo="1" android:valueTo="1"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:interpolator/fast_out_slow_in"/>
<objectAnimator <objectAnimator
android:duration="150"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:propertyName="scaleX" android:propertyName="scaleX"
android:startOffset="150" android:startOffset="150"
android:duration="150"
android:valueFrom="1.2" android:valueFrom="1.2"
android:valueTo="1" android:valueTo="1"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:interpolator/fast_out_slow_in"/>
</set> </set>
</aapt:attr> </aapt:attr>
</target> </target>

View file

@ -1,5 +1,4 @@
<animated-vector <animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"> xmlns:aapt="http://schemas.android.com/aapt">
<aapt:attr name="android:drawable"> <aapt:attr name="android:drawable">
<vector <vector
@ -14,62 +13,62 @@
android:pivotY="12"> android:pivotY="12">
<path <path
android:name="path_1" android:name="path_1"
android:pathData="M 8 6.82 L 8 17.18 C 8 17.97 8.87 18.45 9.54 18.02 L 17.68 12.84 C 18.3 12.45 18.3 11.55 17.68 11.15 L 9.54 5.98 C 8.87 5.55 8 6.03 8 6.82 Z" android:fillColor="#fff"
android:fillColor="#fff"/> android:pathData="M 8 6.82 L 8 17.18 C 8 17.97 8.87 18.45 9.54 18.02 L 17.68 12.84 C 18.3 12.45 18.3 11.55 17.68 11.15 L 9.54 5.98 C 8.87 5.55 8 6.03 8 6.82 Z" />
</group> </group>
</vector> </vector>
</aapt:attr> </aapt:attr>
<target android:name="path_1"> <target android:name="path_1">
<aapt:attr name="android:animation"> <aapt:attr name="android:animation">
<objectAnimator <objectAnimator
android:propertyName="pathData"
android:duration="300" android:duration="300"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:propertyName="pathData"
android:valueFrom="M 8 6.82 C 8 6.82 8 6.82 8 6.82 L 8 6.82 C 8 8.518 8 10.216 8 11.915 L 10.285 11.928 L 18.145 11.975 C 18.137 11.659 17.982 11.345 17.68 11.15 C 14.967 9.427 12.253 7.703 9.54 5.98 C 8.87 5.55 8 6.03 8 6.82 M 8 11.915 C 8 13.67 8 15.425 8 17.18 C 8 17.97 8.87 18.45 9.54 18.02 L 17.68 12.84 C 17.998 12.64 18.152 12.307 18.145 11.975 C 17.057 11.969 15.969 11.962 14.881 11.956 L 13.283 11.946 L 11.618 11.936 L 8 11.915" android:valueFrom="M 8 6.82 C 8 6.82 8 6.82 8 6.82 L 8 6.82 C 8 8.518 8 10.216 8 11.915 L 10.285 11.928 L 18.145 11.975 C 18.137 11.659 17.982 11.345 17.68 11.15 C 14.967 9.427 12.253 7.703 9.54 5.98 C 8.87 5.55 8 6.03 8 6.82 M 8 11.915 C 8 13.67 8 15.425 8 17.18 C 8 17.97 8.87 18.45 9.54 18.02 L 17.68 12.84 C 17.998 12.64 18.152 12.307 18.145 11.975 C 17.057 11.969 15.969 11.962 14.881 11.956 L 13.283 11.946 L 11.618 11.936 L 8 11.915"
android:valueTo="M 7 6 C 5.9 6 5 6.9 5 8 L 5 8 C 5 9.1 5.9 10 7 10 L 12 10 L 17 10 C 18.1 10 19 9.1 19 8 C 19 6.9 18.1 6 17 6 C 13.667 6 10.333 6 7 6 M 7 14 C 5.9 14 5 14.9 5 16 C 5 17.1 5.9 18 7 18 L 17 18 C 18.1 18 19 17.1 19 16 C 19 14.9 18.1 14 17 14 L 17 14 L 12 14 L 7 14" android:valueTo="M 7 6 C 5.9 6 5 6.9 5 8 L 5 8 C 5 9.1 5.9 10 7 10 L 12 10 L 17 10 C 18.1 10 19 9.1 19 8 C 19 6.9 18.1 6 17 6 C 13.667 6 10.333 6 7 6 M 7 14 C 5.9 14 5 14.9 5 16 C 5 17.1 5.9 18 7 18 L 17 18 C 18.1 18 19 17.1 19 16 C 19 14.9 18.1 14 17 14 L 17 14 L 12 14 L 7 14"
android:valueType="pathType" android:valueType="pathType" />
android:interpolator="@android:interpolator/fast_out_slow_in"/>
</aapt:attr> </aapt:attr>
</target> </target>
<target android:name="group"> <target android:name="group">
<aapt:attr name="android:animation"> <aapt:attr name="android:animation">
<set> <set>
<objectAnimator <objectAnimator
android:propertyName="rotation"
android:duration="300" android:duration="300"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:propertyName="rotation"
android:valueFrom="0" android:valueFrom="0"
android:valueTo="90" android:valueTo="90"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:interpolator/fast_out_slow_in"/>
<objectAnimator <objectAnimator
android:propertyName="scaleY"
android:duration="150" android:duration="150"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:propertyName="scaleY"
android:valueFrom="1" android:valueFrom="1"
android:valueTo="1.2" android:valueTo="1.2"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:interpolator/fast_out_slow_in"/>
<objectAnimator <objectAnimator
android:propertyName="scaleX"
android:duration="150" android:duration="150"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:propertyName="scaleX"
android:valueFrom="1" android:valueFrom="1"
android:valueTo="1.2" android:valueTo="1.2"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:interpolator/fast_out_slow_in"/>
<objectAnimator <objectAnimator
android:duration="150"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:propertyName="scaleY" android:propertyName="scaleY"
android:startOffset="150" android:startOffset="150"
android:duration="150"
android:valueFrom="1.2" android:valueFrom="1.2"
android:valueTo="1" android:valueTo="1"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:interpolator/fast_out_slow_in"/>
<objectAnimator <objectAnimator
android:duration="150"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:propertyName="scaleX" android:propertyName="scaleX"
android:startOffset="150" android:startOffset="150"
android:duration="150"
android:valueFrom="1.2" android:valueFrom="1.2"
android:valueTo="1" android:valueTo="1"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:interpolator/fast_out_slow_in"/>
</set> </set>
</aapt:attr> </aapt:attr>
</target> </target>

View file

@ -1,5 +1,4 @@
<animated-vector <animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"> xmlns:aapt="http://schemas.android.com/aapt">
<aapt:attr name="android:drawable"> <aapt:attr name="android:drawable">
<vector <vector
@ -20,8 +19,8 @@
android:scaleY="0"> android:scaleY="0">
<path <path
android:name="path_2" android:name="path_2"
android:pathData="M 28.3 14.9 L 5.7 0.7 C 3.2 -0.8 0 1 0 3.9 L 0 32.3 C 0 35.2 3.2 37 5.7 35.4 L 28.3 21.2 C 30.6 19.8 30.6 16.4 28.3 14.9 Z" android:fillColor="#eeeeee"
android:fillColor="#eeeeee"/> android:pathData="M 28.3 14.9 L 5.7 0.7 C 3.2 -0.8 0 1 0 3.9 L 0 32.3 C 0 35.2 3.2 37 5.7 35.4 L 28.3 21.2 C 30.6 19.8 30.6 16.4 28.3 14.9 Z" />
</group> </group>
<group <group
android:name="group_2" android:name="group_2"
@ -29,14 +28,14 @@
android:pivotY="18"> android:pivotY="18">
<path <path
android:name="path_1" android:name="path_1"
android:pathData="M 52.3 14.9 L 29.7 0.7 C 27.2 -0.8 24 1 24 3.9 L 24 32.3 C 24 35.2 27.2 37 29.7 35.4 L 52.3 21.2 C 54.6 19.8 54.6 16.4 52.3 14.9 Z" android:fillColor="#eeeeee"
android:fillColor="#eeeeee"/> android:pathData="M 52.3 14.9 L 29.7 0.7 C 27.2 -0.8 24 1 24 3.9 L 24 32.3 C 24 35.2 27.2 37 29.7 35.4 L 52.3 21.2 C 54.6 19.8 54.6 16.4 52.3 14.9 Z" />
</group> </group>
<group android:name="group_1"> <group android:name="group_1">
<path <path
android:name="path" android:name="path"
android:pathData="M 28.3 14.9 L 5.7 0.7 C 3.2 -0.8 0 1 0 3.9 L 0 32.3 C 0 35.2 3.2 37 5.7 35.4 L 28.3 21.2 C 30.6 19.8 30.6 16.4 28.3 14.9 Z" android:fillColor="#eeeeee"
android:fillColor="#eeeeee"/> android:pathData="M 28.3 14.9 L 5.7 0.7 C 3.2 -0.8 0 1 0 3.9 L 0 32.3 C 0 35.2 3.2 37 5.7 35.4 L 28.3 21.2 C 30.6 19.8 30.6 16.4 28.3 14.9 Z" />
</group> </group>
</group> </group>
</vector> </vector>
@ -45,78 +44,78 @@
<aapt:attr name="android:animation"> <aapt:attr name="android:animation">
<set> <set>
<objectAnimator <objectAnimator
android:duration="225"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:propertyName="scaleY" android:propertyName="scaleY"
android:startOffset="25" android:startOffset="25"
android:duration="225"
android:valueFrom="1" android:valueFrom="1"
android:valueTo="0" android:valueTo="0"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:interpolator/fast_out_slow_in"/>
<objectAnimator <objectAnimator
android:propertyName="scaleX"
android:duration="250" android:duration="250"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:propertyName="scaleX"
android:valueFrom="1" android:valueFrom="1"
android:valueTo="0" android:valueTo="0"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:interpolator/fast_out_slow_in"/>
</set> </set>
</aapt:attr> </aapt:attr>
</target> </target>
<target android:name="group_1"> <target android:name="group_1">
<aapt:attr name="android:animation"> <aapt:attr name="android:animation">
<objectAnimator <objectAnimator
android:propertyName="translateX"
android:duration="250" android:duration="250"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:propertyName="translateX"
android:valueFrom="0" android:valueFrom="0"
android:valueTo="24" android:valueTo="24"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:interpolator/fast_out_slow_in"/>
</aapt:attr> </aapt:attr>
</target> </target>
<target android:name="group_3"> <target android:name="group_3">
<aapt:attr name="android:animation"> <aapt:attr name="android:animation">
<set> <set>
<objectAnimator <objectAnimator
android:duration="250"
android:interpolator="@android:anim/anticipate_interpolator"
android:propertyName="scaleX" android:propertyName="scaleX"
android:startOffset="50" android:startOffset="50"
android:duration="250"
android:valueFrom="0" android:valueFrom="0"
android:valueTo="1" android:valueTo="1"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:anim/anticipate_interpolator"/>
<objectAnimator <objectAnimator
android:duration="250"
android:interpolator="@android:anim/linear_interpolator"
android:propertyName="scaleY" android:propertyName="scaleY"
android:startOffset="50" android:startOffset="50"
android:duration="250"
android:valueFrom="0" android:valueFrom="0"
android:valueTo="1" android:valueTo="1"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:anim/linear_interpolator"/>
</set> </set>
</aapt:attr> </aapt:attr>
</target> </target>
<target android:name="path_1"> <target android:name="path_1">
<aapt:attr name="android:animation"> <aapt:attr name="android:animation">
<objectAnimator <objectAnimator
android:duration="151"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:propertyName="fillAlpha" android:propertyName="fillAlpha"
android:startOffset="99" android:startOffset="99"
android:duration="151"
android:valueFrom="1" android:valueFrom="1"
android:valueTo="0" android:valueTo="0"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:interpolator/fast_out_slow_in"/>
</aapt:attr> </aapt:attr>
</target> </target>
<target android:name="path_2"> <target android:name="path_2">
<aapt:attr name="android:animation"> <aapt:attr name="android:animation">
<objectAnimator <objectAnimator
android:duration="126"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:propertyName="fillAlpha" android:propertyName="fillAlpha"
android:startOffset="50" android:startOffset="50"
android:duration="126"
android:valueFrom="0" android:valueFrom="0"
android:valueTo="1" android:valueTo="1"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:interpolator/fast_out_slow_in"/>
</aapt:attr> </aapt:attr>
</target> </target>
</animated-vector> </animated-vector>

View file

@ -1,5 +1,4 @@
<animated-vector <animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"> xmlns:aapt="http://schemas.android.com/aapt">
<aapt:attr name="android:drawable"> <aapt:attr name="android:drawable">
<vector <vector
@ -20,8 +19,8 @@
android:scaleY="0"> android:scaleY="0">
<path <path
android:name="path_2" android:name="path_2"
android:pathData="M 28.3 14.9 L 5.7 0.7 C 3.2 -0.8 0 1 0 3.9 L 0 32.3 C 0 35.2 3.2 37 5.7 35.4 L 28.3 21.2 C 30.6 19.8 30.6 16.4 28.3 14.9 Z" android:fillColor="#eeeeee"
android:fillColor="#eeeeee"/> android:pathData="M 28.3 14.9 L 5.7 0.7 C 3.2 -0.8 0 1 0 3.9 L 0 32.3 C 0 35.2 3.2 37 5.7 35.4 L 28.3 21.2 C 30.6 19.8 30.6 16.4 28.3 14.9 Z" />
</group> </group>
<group <group
android:name="group_2" android:name="group_2"
@ -29,14 +28,14 @@
android:pivotY="18"> android:pivotY="18">
<path <path
android:name="path_1" android:name="path_1"
android:pathData="M 52.3 14.9 L 29.7 0.7 C 27.2 -0.8 24 1 24 3.9 L 24 32.3 C 24 35.2 27.2 37 29.7 35.4 L 52.3 21.2 C 54.6 19.8 54.6 16.4 52.3 14.9 Z" android:fillColor="#eeeeee"
android:fillColor="#eeeeee"/> android:pathData="M 52.3 14.9 L 29.7 0.7 C 27.2 -0.8 24 1 24 3.9 L 24 32.3 C 24 35.2 27.2 37 29.7 35.4 L 52.3 21.2 C 54.6 19.8 54.6 16.4 52.3 14.9 Z" />
</group> </group>
<group android:name="group_1"> <group android:name="group_1">
<path <path
android:name="path" android:name="path"
android:pathData="M 28.3 14.9 L 5.7 0.7 C 3.2 -0.8 0 1 0 3.9 L 0 32.3 C 0 35.2 3.2 37 5.7 35.4 L 28.3 21.2 C 30.6 19.8 30.6 16.4 28.3 14.9 Z" android:fillColor="#eeeeee"
android:fillColor="#eeeeee"/> android:pathData="M 28.3 14.9 L 5.7 0.7 C 3.2 -0.8 0 1 0 3.9 L 0 32.3 C 0 35.2 3.2 37 5.7 35.4 L 28.3 21.2 C 30.6 19.8 30.6 16.4 28.3 14.9 Z" />
</group> </group>
</group> </group>
</vector> </vector>
@ -45,78 +44,78 @@
<aapt:attr name="android:animation"> <aapt:attr name="android:animation">
<set> <set>
<objectAnimator <objectAnimator
android:duration="225"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:propertyName="scaleY" android:propertyName="scaleY"
android:startOffset="25" android:startOffset="25"
android:duration="225"
android:valueFrom="1" android:valueFrom="1"
android:valueTo="0" android:valueTo="0"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:interpolator/fast_out_slow_in"/>
<objectAnimator <objectAnimator
android:propertyName="scaleX"
android:duration="250" android:duration="250"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:propertyName="scaleX"
android:valueFrom="1" android:valueFrom="1"
android:valueTo="0" android:valueTo="0"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:interpolator/fast_out_slow_in"/>
</set> </set>
</aapt:attr> </aapt:attr>
</target> </target>
<target android:name="group_1"> <target android:name="group_1">
<aapt:attr name="android:animation"> <aapt:attr name="android:animation">
<objectAnimator <objectAnimator
android:propertyName="translateX"
android:duration="250" android:duration="250"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:propertyName="translateX"
android:valueFrom="0" android:valueFrom="0"
android:valueTo="24" android:valueTo="24"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:interpolator/fast_out_slow_in"/>
</aapt:attr> </aapt:attr>
</target> </target>
<target android:name="group_3"> <target android:name="group_3">
<aapt:attr name="android:animation"> <aapt:attr name="android:animation">
<set> <set>
<objectAnimator <objectAnimator
android:duration="250"
android:interpolator="@android:anim/anticipate_interpolator"
android:propertyName="scaleX" android:propertyName="scaleX"
android:startOffset="50" android:startOffset="50"
android:duration="250"
android:valueFrom="0" android:valueFrom="0"
android:valueTo="1" android:valueTo="1"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:anim/anticipate_interpolator"/>
<objectAnimator <objectAnimator
android:duration="250"
android:interpolator="@android:anim/linear_interpolator"
android:propertyName="scaleY" android:propertyName="scaleY"
android:startOffset="50" android:startOffset="50"
android:duration="250"
android:valueFrom="0" android:valueFrom="0"
android:valueTo="1" android:valueTo="1"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:anim/linear_interpolator"/>
</set> </set>
</aapt:attr> </aapt:attr>
</target> </target>
<target android:name="path_1"> <target android:name="path_1">
<aapt:attr name="android:animation"> <aapt:attr name="android:animation">
<objectAnimator <objectAnimator
android:duration="151"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:propertyName="fillAlpha" android:propertyName="fillAlpha"
android:startOffset="99" android:startOffset="99"
android:duration="151"
android:valueFrom="1" android:valueFrom="1"
android:valueTo="0" android:valueTo="0"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:interpolator/fast_out_slow_in"/>
</aapt:attr> </aapt:attr>
</target> </target>
<target android:name="path_2"> <target android:name="path_2">
<aapt:attr name="android:animation"> <aapt:attr name="android:animation">
<objectAnimator <objectAnimator
android:duration="126"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:propertyName="fillAlpha" android:propertyName="fillAlpha"
android:startOffset="50" android:startOffset="50"
android:duration="126"
android:valueFrom="0" android:valueFrom="0"
android:valueTo="1" android:valueTo="1"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:interpolator/fast_out_slow_in"/>
</aapt:attr> </aapt:attr>
</target> </target>
</animated-vector> </animated-vector>

View file

@ -1,5 +1,4 @@
<animated-vector <animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"> xmlns:aapt="http://schemas.android.com/aapt">
<aapt:attr name="android:drawable"> <aapt:attr name="android:drawable">
<vector <vector
@ -14,23 +13,23 @@
android:pivotY="384"> android:pivotY="384">
<clip-path <clip-path
android:name="clippath" android:name="clippath"
android:pathData="M 384 128.04 C 329.836 127.869 276.99 144.889 233.11 176.638 C 189.23 208.387 156.539 253.255 139.769 304.75 C 122.999 356.244 122.999 411.756 139.769 463.25 C 156.539 514.745 189.23 559.613 233.11 591.362 C 276.99 623.111 329.836 640.131 384 639.96 C 451.869 639.96 517.028 612.974 565.019 564.991 C 613.01 517.008 640 451.859 640 384 C 640 316.141 613.01 250.992 565.019 203.009 C 517.028 155.026 451.869 128.04 384 128.04 Z"/> android:pathData="M 384 128.04 C 329.836 127.869 276.99 144.889 233.11 176.638 C 189.23 208.387 156.539 253.255 139.769 304.75 C 122.999 356.244 122.999 411.756 139.769 463.25 C 156.539 514.745 189.23 559.613 233.11 591.362 C 276.99 623.111 329.836 640.131 384 639.96 C 451.869 639.96 517.028 612.974 565.019 564.991 C 613.01 517.008 640 451.859 640 384 C 640 316.141 613.01 250.992 565.019 203.009 C 517.028 155.026 451.869 128.04 384 128.04 Z" />
<group android:name="group"> <group android:name="group">
<group android:name="group_1"> <group android:name="group_1">
<path <path
android:name="path" android:name="path"
android:pathData="M 128 128 L 640 128 L 640 639.96 L 128 639.96 Z"
android:fillColor="#ff00f4" android:fillColor="#ff00f4"
android:strokeWidth="1"/> android:pathData="M 128 128 L 640 128 L 640 639.96 L 128 639.96 Z"
android:strokeWidth="1" />
<group <group
android:name="group_12" android:name="group_12"
android:pivotX="384" android:pivotX="384"
android:pivotY="384"> android:pivotY="384">
<path <path
android:name="path_2" android:name="path_2"
android:pathData="M 384 211.74 C 338.331 211.74 294.486 229.901 262.194 262.194 C 229.901 294.486 211.74 338.331 211.74 384 C 211.74 429.669 229.901 473.514 262.194 505.806 C 294.486 538.099 338.331 556.26 384 556.26 C 429.669 556.26 473.514 538.099 505.806 505.806 C 538.099 473.514 556.26 429.669 556.26 384 C 556.26 338.331 538.099 294.486 505.806 262.194 C 473.514 229.901 429.669 211.74 384 211.74 Z"
android:fillColor="#d300e5" android:fillColor="#d300e5"
android:strokeWidth="1"/> android:pathData="M 384 211.74 C 338.331 211.74 294.486 229.901 262.194 262.194 C 229.901 294.486 211.74 338.331 211.74 384 C 211.74 429.669 229.901 473.514 262.194 505.806 C 294.486 538.099 338.331 556.26 384 556.26 C 429.669 556.26 473.514 538.099 505.806 505.806 C 538.099 473.514 556.26 429.669 556.26 384 C 556.26 338.331 538.099 294.486 505.806 262.194 C 473.514 229.901 429.669 211.74 384 211.74 Z"
android:strokeWidth="1" />
</group> </group>
</group> </group>
<group android:name="group_2"> <group android:name="group_2">
@ -43,12 +42,12 @@
android:rotation="-90"> android:rotation="-90">
<path <path
android:name="path_1" android:name="path_1"
android:pathData="M 128 128 L 128 463.26 C 151.32 466.96 175.23 468.89 199.58 468.89 C 411.17 468.89 588.92 323.99 639.01 128 L 128 128 Z"
android:fillColor="#7000b8" android:fillColor="#7000b8"
android:strokeWidth="1"/> android:pathData="M 128 128 L 128 463.26 C 151.32 466.96 175.23 468.89 199.58 468.89 C 411.17 468.89 588.92 323.99 639.01 128 L 128 128 Z"
android:strokeWidth="1" />
<clip-path <clip-path
android:name="mask_2" android:name="mask_2"
android:pathData="M 128 128 L 128 463.26 C 151.32 466.96 175.23 468.89 199.58 468.89 C 411.17 468.89 588.92 323.99 639.01 128 L 128 128 Z"/> android:pathData="M 128 128 L 128 463.26 C 151.32 466.96 175.23 468.89 199.58 468.89 C 411.17 468.89 588.92 323.99 639.01 128 L 128 128 Z" />
</group> </group>
</group> </group>
<group <group
@ -57,7 +56,7 @@
android:pivotY="384"> android:pivotY="384">
<clip-path <clip-path
android:name="mask_1" android:name="mask_1"
android:pathData="M 384 211.74 C 338.331 211.74 294.486 229.901 262.194 262.194 C 229.901 294.486 211.74 338.331 211.74 384 C 211.74 429.669 229.901 473.514 262.194 505.806 C 294.486 538.099 338.331 556.26 384 556.26 C 429.669 556.26 473.514 538.099 505.806 505.806 C 538.099 473.514 556.26 429.669 556.26 384 C 556.26 338.331 538.099 294.486 505.806 262.194 C 473.514 229.901 429.669 211.74 384 211.74 Z"/> android:pathData="M 384 211.74 C 338.331 211.74 294.486 229.901 262.194 262.194 C 229.901 294.486 211.74 338.331 211.74 384 C 211.74 429.669 229.901 473.514 262.194 505.806 C 294.486 538.099 338.331 556.26 384 556.26 C 429.669 556.26 473.514 538.099 505.806 505.806 C 538.099 473.514 556.26 429.669 556.26 384 C 556.26 338.331 538.099 294.486 505.806 262.194 C 473.514 229.901 429.669 211.74 384 211.74 Z" />
<group <group
android:name="group_9" android:name="group_9"
android:pivotX="94" android:pivotX="94"
@ -65,18 +64,18 @@
android:rotation="-90"> android:rotation="-90">
<path <path
android:name="path_3" android:name="path_3"
android:pathData="M 128 128 L 128 463.26 C 151.32 466.96 175.23 468.89 199.58 468.89 C 411.17 468.89 588.92 323.99 639.01 128 L 128 128 Z"
android:fillColor="#9000d1" android:fillColor="#9000d1"
android:strokeWidth="1"/> android:pathData="M 128 128 L 128 463.26 C 151.32 466.96 175.23 468.89 199.58 468.89 C 411.17 468.89 588.92 323.99 639.01 128 L 128 128 Z"
android:strokeWidth="1" />
</group> </group>
</group> </group>
<group <group
android:name="group_6" android:name="group_6"
android:pivotX="94" android:pivotX="94"
android:pivotY="440" android:pivotY="440"
android:rotation="-5"
android:scaleX="1.2" android:scaleX="1.2"
android:scaleY="1.2" android:scaleY="1.2" />
android:rotation="-5"/>
</group> </group>
<group <group
android:name="group_8" android:name="group_8"
@ -89,9 +88,9 @@
android:pivotY="440"> android:pivotY="440">
<path <path
android:name="path_4" android:name="path_4"
android:pathData="M 539.28 128 C 503.71 317.07 337.72 460.12 138.31 460.12 C 134.86 460.12 131.42 460.06 128 459.98 L 128 465.73 C 168.23 476.19 210.43 481.78 253.93 481.78 C 409.53 481.78 548.48 410.55 640 298.94 L 640 128.01 L 539.28 128.01 Z"
android:fillColor="#a800d9" android:fillColor="#a800d9"
android:strokeWidth="1"/> android:pathData="M 539.28 128 C 503.71 317.07 337.72 460.12 138.31 460.12 C 134.86 460.12 131.42 460.06 128 459.98 L 128 465.73 C 168.23 476.19 210.43 481.78 253.93 481.78 C 409.53 481.78 548.48 410.55 640 298.94 L 640 128.01 L 539.28 128.01 Z"
android:strokeWidth="1" />
</group> </group>
</group> </group>
</group> </group>
@ -100,9 +99,9 @@
android:translateX="-360"> android:translateX="-360">
<path <path
android:name="path_6" android:name="path_6"
android:pathData="M 481.82 384 C 481.82 438.03 438.02 481.82 384 481.82 L 0 481.82 L 0 286.18 L 384 286.18 C 438.02 286.18 481.82 329.98 481.82 384 Z"
android:fillColor="#1f1f30" android:fillColor="#1f1f30"
android:strokeWidth="1"/> android:pathData="M 481.82 384 C 481.82 438.03 438.02 481.82 384 481.82 L 0 481.82 L 0 286.18 L 384 286.18 C 438.02 286.18 481.82 329.98 481.82 384 Z"
android:strokeWidth="1" />
</group> </group>
<group <group
android:name="group_4" android:name="group_4"
@ -112,23 +111,23 @@
android:scaleY="1.5"> android:scaleY="1.5">
<path <path
android:name="path_5" android:name="path_5"
android:pathData="M 44.26 128 C 44.26 174.25 81.75 211.74 128 211.74 L 384 211.74 C 479.13 211.74 556.26 288.86 556.26 384 C 556.26 479.13 479.14 556.26 384 556.26 L 128 556.26 C 81.76 556.26 44.28 593.73 44.26 639.97 L 768 639.97 L 768 128 L 44.26 128 Z"
android:fillColor="#1f1f30" android:fillColor="#1f1f30"
android:strokeWidth="1"/> android:pathData="M 44.26 128 C 44.26 174.25 81.75 211.74 128 211.74 L 384 211.74 C 479.13 211.74 556.26 288.86 556.26 384 C 556.26 479.13 479.14 556.26 384 556.26 L 128 556.26 C 81.76 556.26 44.28 593.73 44.26 639.97 L 768 639.97 L 768 128 L 44.26 128 Z"
android:strokeWidth="1" />
</group> </group>
<group <group
android:name="group_5" android:name="group_5"
android:pivotX="384" android:pivotX="384"
android:pivotY="384" android:pivotY="384"
android:rotation="-15"
android:scaleX="3" android:scaleX="3"
android:scaleY="3" android:scaleY="3">
android:rotation="-15">
<path <path
android:name="path_7" android:name="path_7"
android:pathData="M 442 366.7 L 365.98 322.81 C 352.66 315.12 336.02 324.73 336.02 340.11 L 336.02 427.89 C 336.02 443.27 352.67 452.88 365.98 445.19 L 442 401.3 C 455.32 393.61 455.32 374.39 442 366.7 Z"
android:fillColor="#efe7ff"
android:fillAlpha="0" android:fillAlpha="0"
android:strokeWidth="1"/> android:fillColor="#efe7ff"
android:pathData="M 442 366.7 L 365.98 322.81 C 352.66 315.12 336.02 324.73 336.02 340.11 L 336.02 427.89 C 336.02 443.27 352.67 452.88 365.98 445.19 L 442 401.3 C 455.32 393.61 455.32 374.39 442 366.7 Z"
android:strokeWidth="1" />
</group> </group>
</group> </group>
</group> </group>
@ -138,19 +137,19 @@
<aapt:attr name="android:animation"> <aapt:attr name="android:animation">
<set> <set>
<objectAnimator <objectAnimator
android:duration="500"
android:interpolator="@android:anim/overshoot_interpolator"
android:propertyName="scaleX" android:propertyName="scaleX"
android:duration="500"
android:valueFrom="0" android:valueFrom="0"
android:valueTo="1" android:valueTo="1"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:anim/overshoot_interpolator"/>
<objectAnimator <objectAnimator
android:propertyName="scaleY"
android:duration="500" android:duration="500"
android:interpolator="@android:anim/overshoot_interpolator"
android:propertyName="scaleY"
android:valueFrom="0" android:valueFrom="0"
android:valueTo="1" android:valueTo="1"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:anim/overshoot_interpolator"/>
</set> </set>
</aapt:attr> </aapt:attr>
</target> </target>
@ -158,177 +157,177 @@
<aapt:attr name="android:animation"> <aapt:attr name="android:animation">
<set> <set>
<objectAnimator <objectAnimator
android:duration="550"
android:interpolator="@android:anim/overshoot_interpolator"
android:propertyName="rotation" android:propertyName="rotation"
android:startOffset="350" android:startOffset="350"
android:duration="550"
android:valueFrom="-10" android:valueFrom="-10"
android:valueTo="0" android:valueTo="0"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:anim/overshoot_interpolator"/>
<objectAnimator <objectAnimator
android:duration="300"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:propertyName="scaleX" android:propertyName="scaleX"
android:startOffset="350" android:startOffset="350"
android:duration="300"
android:valueFrom="1.2" android:valueFrom="1.2"
android:valueTo="1" android:valueTo="1"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:interpolator/fast_out_slow_in"/>
<objectAnimator <objectAnimator
android:duration="300"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:propertyName="scaleY" android:propertyName="scaleY"
android:startOffset="350" android:startOffset="350"
android:duration="300"
android:valueFrom="1.2" android:valueFrom="1.2"
android:valueTo="1" android:valueTo="1"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:interpolator/fast_out_slow_in"/>
</set> </set>
</aapt:attr> </aapt:attr>
</target> </target>
<target android:name="group_3"> <target android:name="group_3">
<aapt:attr name="android:animation"> <aapt:attr name="android:animation">
<objectAnimator <objectAnimator
android:duration="400"
android:interpolator="@android:anim/overshoot_interpolator"
android:propertyName="translateX" android:propertyName="translateX"
android:startOffset="250" android:startOffset="250"
android:duration="400"
android:valueFrom="-360" android:valueFrom="-360"
android:valueTo="0" android:valueTo="0"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:anim/overshoot_interpolator"/>
</aapt:attr> </aapt:attr>
</target> </target>
<target android:name="group_4"> <target android:name="group_4">
<aapt:attr name="android:animation"> <aapt:attr name="android:animation">
<set> <set>
<objectAnimator <objectAnimator
android:duration="350"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:propertyName="scaleX" android:propertyName="scaleX"
android:startOffset="400" android:startOffset="400"
android:duration="350"
android:valueFrom="1.5" android:valueFrom="1.5"
android:valueTo="1" android:valueTo="1"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:interpolator/fast_out_slow_in"/>
<objectAnimator <objectAnimator
android:duration="350"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:propertyName="scaleY" android:propertyName="scaleY"
android:startOffset="400" android:startOffset="400"
android:duration="350"
android:valueFrom="1.5" android:valueFrom="1.5"
android:valueTo="1" android:valueTo="1"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:interpolator/fast_out_slow_in"/>
</set> </set>
</aapt:attr> </aapt:attr>
</target> </target>
<target android:name="path_7"> <target android:name="path_7">
<aapt:attr name="android:animation"> <aapt:attr name="android:animation">
<objectAnimator <objectAnimator
android:duration="550"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:propertyName="fillAlpha" android:propertyName="fillAlpha"
android:startOffset="350" android:startOffset="350"
android:duration="550"
android:valueFrom="0" android:valueFrom="0"
android:valueTo="1" android:valueTo="1"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:interpolator/fast_out_slow_in"/>
</aapt:attr> </aapt:attr>
</target> </target>
<target android:name="group_5"> <target android:name="group_5">
<aapt:attr name="android:animation"> <aapt:attr name="android:animation">
<set> <set>
<objectAnimator <objectAnimator
android:duration="550"
android:interpolator="@android:anim/decelerate_interpolator"
android:propertyName="rotation" android:propertyName="rotation"
android:startOffset="350" android:startOffset="350"
android:duration="550"
android:valueFrom="-45" android:valueFrom="-45"
android:valueTo="0" android:valueTo="0"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:anim/decelerate_interpolator"/>
<objectAnimator <objectAnimator
android:duration="550"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:propertyName="scaleX" android:propertyName="scaleX"
android:startOffset="350" android:startOffset="350"
android:duration="550"
android:valueFrom="3" android:valueFrom="3"
android:valueTo="1" android:valueTo="1"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:interpolator/fast_out_slow_in"/>
<objectAnimator <objectAnimator
android:duration="550"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:propertyName="scaleY" android:propertyName="scaleY"
android:startOffset="350" android:startOffset="350"
android:duration="550"
android:valueFrom="3" android:valueFrom="3"
android:valueTo="1" android:valueTo="1"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:interpolator/fast_out_slow_in"/>
</set> </set>
</aapt:attr> </aapt:attr>
</target> </target>
<target android:name="group_8"> <target android:name="group_8">
<aapt:attr name="android:animation"> <aapt:attr name="android:animation">
<objectAnimator <objectAnimator
android:duration="350"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:propertyName="rotation" android:propertyName="rotation"
android:startOffset="100" android:startOffset="100"
android:duration="350"
android:valueFrom="-90" android:valueFrom="-90"
android:valueTo="0" android:valueTo="0"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:interpolator/fast_out_slow_in"/>
</aapt:attr> </aapt:attr>
</target> </target>
<target android:name="group_9"> <target android:name="group_9">
<aapt:attr name="android:animation"> <aapt:attr name="android:animation">
<set> <set>
<objectAnimator <objectAnimator
android:duration="350"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:propertyName="rotation" android:propertyName="rotation"
android:startOffset="100" android:startOffset="100"
android:duration="350"
android:valueFrom="-90" android:valueFrom="-90"
android:valueTo="0" android:valueTo="0"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:interpolator/fast_out_slow_in"/>
<objectAnimator <objectAnimator
android:duration="350"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:propertyName="scaleX" android:propertyName="scaleX"
android:duration="350"
android:valueFrom="0" android:valueFrom="0"
android:valueTo="1" android:valueTo="1"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:interpolator/fast_out_slow_in"/>
<objectAnimator <objectAnimator
android:propertyName="scaleY"
android:duration="350" android:duration="350"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:propertyName="scaleY"
android:valueFrom="0" android:valueFrom="0"
android:valueTo="1" android:valueTo="1"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:interpolator/fast_out_slow_in"/>
</set> </set>
</aapt:attr> </aapt:attr>
</target> </target>
<target android:name="group_11"> <target android:name="group_11">
<aapt:attr name="android:animation"> <aapt:attr name="android:animation">
<objectAnimator <objectAnimator
android:duration="350"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:propertyName="rotation" android:propertyName="rotation"
android:startOffset="100" android:startOffset="100"
android:duration="350"
android:valueFrom="-90" android:valueFrom="-90"
android:valueTo="0" android:valueTo="0"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:interpolator/fast_out_slow_in"/>
</aapt:attr> </aapt:attr>
</target> </target>
<target android:name="group_12"> <target android:name="group_12">
<aapt:attr name="android:animation"> <aapt:attr name="android:animation">
<set> <set>
<objectAnimator <objectAnimator
android:duration="550"
android:interpolator="@android:anim/overshoot_interpolator"
android:propertyName="scaleX" android:propertyName="scaleX"
android:duration="550"
android:valueFrom="0" android:valueFrom="0"
android:valueTo="1" android:valueTo="1"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:anim/overshoot_interpolator"/>
<objectAnimator <objectAnimator
android:propertyName="scaleY"
android:duration="550" android:duration="550"
android:interpolator="@android:anim/overshoot_interpolator"
android:propertyName="scaleY"
android:valueFrom="0" android:valueFrom="0"
android:valueTo="1" android:valueTo="1"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:anim/overshoot_interpolator"/>
</set> </set>
</aapt:attr> </aapt:attr>
</target> </target>
@ -336,19 +335,19 @@
<aapt:attr name="android:animation"> <aapt:attr name="android:animation">
<set> <set>
<objectAnimator <objectAnimator
android:duration="550"
android:interpolator="@android:anim/overshoot_interpolator"
android:propertyName="scaleX" android:propertyName="scaleX"
android:duration="550"
android:valueFrom="0" android:valueFrom="0"
android:valueTo="1" android:valueTo="1"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:anim/overshoot_interpolator"/>
<objectAnimator <objectAnimator
android:propertyName="scaleY"
android:duration="550" android:duration="550"
android:interpolator="@android:anim/overshoot_interpolator"
android:propertyName="scaleY"
android:valueFrom="0" android:valueFrom="0"
android:valueTo="1" android:valueTo="1"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:anim/overshoot_interpolator"/>
</set> </set>
</aapt:attr> </aapt:attr>
</target> </target>
@ -356,21 +355,21 @@
<aapt:attr name="android:animation"> <aapt:attr name="android:animation">
<set> <set>
<objectAnimator <objectAnimator
android:duration="200"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:propertyName="rotation" android:propertyName="rotation"
android:startOffset="350" android:startOffset="350"
android:duration="200"
android:valueFrom="5" android:valueFrom="5"
android:valueTo="0" android:valueTo="0"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:anim/accelerate_decelerate_interpolator"/>
<objectAnimator <objectAnimator
android:duration="100"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:propertyName="rotation" android:propertyName="rotation"
android:startOffset="250" android:startOffset="250"
android:duration="100"
android:valueFrom="0" android:valueFrom="0"
android:valueTo="5" android:valueTo="5"
android:valueType="floatType" android:valueType="floatType" />
android:interpolator="@android:anim/accelerate_decelerate_interpolator"/>
</set> </set>
</aapt:attr> </aapt:attr>
</target> </target>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"> <shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/grey_nav"/> <solid android:color="@color/grey_nav" />
<corners android:radius="40dp"/> <corners android:radius="40dp" />
</shape> </shape>

Some files were not shown because too many files have changed in this diff Show more