chore: code refactor
This commit is contained in:
parent
8d7b86a667
commit
a2e44da99d
334 changed files with 3550 additions and 3092 deletions
19
.github/workflows/beta.yml
vendored
19
.github/workflows/beta.yml
vendored
|
@ -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
|
||||||
|
|
|
@ -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 @@
|
||||||
<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:pathData="M 128 128 L 640 128 L 640 639.96 L 128 639.96 Z"
|
||||||
android:strokeWidth="1" />
|
android:strokeWidth="1" />
|
||||||
<group
|
<group
|
||||||
android:name="group_12"
|
android:name="group_12"
|
||||||
|
@ -28,8 +27,8 @@
|
||||||
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: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" />
|
android:strokeWidth="1" />
|
||||||
</group>
|
</group>
|
||||||
</group>
|
</group>
|
||||||
|
@ -43,8 +42,8 @@
|
||||||
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: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" />
|
android:strokeWidth="1" />
|
||||||
<clip-path
|
<clip-path
|
||||||
android:name="mask_2"
|
android:name="mask_2"
|
||||||
|
@ -65,8 +64,8 @@
|
||||||
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: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" />
|
android:strokeWidth="1" />
|
||||||
</group>
|
</group>
|
||||||
</group>
|
</group>
|
||||||
|
@ -74,9 +73,9 @@
|
||||||
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,8 +88,8 @@
|
||||||
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: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" />
|
android:strokeWidth="1" />
|
||||||
</group>
|
</group>
|
||||||
</group>
|
</group>
|
||||||
|
@ -100,8 +99,8 @@
|
||||||
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: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" />
|
android:strokeWidth="1" />
|
||||||
</group>
|
</group>
|
||||||
<group
|
<group
|
||||||
|
@ -112,22 +111,22 @@
|
||||||
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: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" />
|
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: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" />
|
android:strokeWidth="1" />
|
||||||
</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>
|
||||||
|
|
|
@ -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 @@
|
||||||
<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:pathData="M 128 128 L 640 128 L 640 639.96 L 128 639.96 Z"
|
||||||
android:strokeWidth="1" />
|
android:strokeWidth="1" />
|
||||||
<group
|
<group
|
||||||
android:name="group_12"
|
android:name="group_12"
|
||||||
|
@ -28,8 +27,8 @@
|
||||||
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: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" />
|
android:strokeWidth="1" />
|
||||||
</group>
|
</group>
|
||||||
</group>
|
</group>
|
||||||
|
@ -43,8 +42,8 @@
|
||||||
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: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" />
|
android:strokeWidth="1" />
|
||||||
<clip-path
|
<clip-path
|
||||||
android:name="mask_2"
|
android:name="mask_2"
|
||||||
|
@ -65,8 +64,8 @@
|
||||||
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: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" />
|
android:strokeWidth="1" />
|
||||||
</group>
|
</group>
|
||||||
</group>
|
</group>
|
||||||
|
@ -74,9 +73,9 @@
|
||||||
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,8 +88,8 @@
|
||||||
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: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" />
|
android:strokeWidth="1" />
|
||||||
</group>
|
</group>
|
||||||
</group>
|
</group>
|
||||||
|
@ -100,8 +99,8 @@
|
||||||
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: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" />
|
android:strokeWidth="1" />
|
||||||
</group>
|
</group>
|
||||||
<group
|
<group
|
||||||
|
@ -112,22 +111,22 @@
|
||||||
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: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" />
|
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: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" />
|
android:strokeWidth="1" />
|
||||||
</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>
|
||||||
|
|
|
@ -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,18 +318,21 @@
|
||||||
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:name="com.google.android.gms.cast.framework.OPTIONS_PROVIDER_CLASS_NAME"
|
||||||
android:value="androidx.media3.cast.DefaultCastOptionsProvider" />
|
android:value="androidx.media3.cast.DefaultCastOptionsProvider" />
|
||||||
</application>
|
</application>
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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()) {
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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(
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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(
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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 ->
|
||||||
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
@ -117,6 +117,7 @@ binding.mediaInfoDuration.text = when {
|
||||||
|
|
||||||
formattedDuration
|
formattedDuration
|
||||||
}
|
}
|
||||||
|
|
||||||
else -> "??"
|
else -> "??"
|
||||||
}
|
}
|
||||||
binding.mediaInfoDurationContainer.visibility = View.VISIBLE
|
binding.mediaInfoDurationContainer.visibility = View.VISIBLE
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -8,13 +8,14 @@ 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
|
||||||
|
@ -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())
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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()
|
||||||
}
|
}
|
||||||
|
|
|
@ -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]!!
|
||||||
|
|
|
@ -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()) {
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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() {
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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) }
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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),
|
||||||
|
|
|
@ -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(
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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))
|
||||||
|
|
|
@ -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()
|
||||||
|
@ -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) {
|
||||||
|
@ -847,6 +865,7 @@ 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') }
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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(
|
||||||
|
|
|
@ -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(
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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) {
|
||||||
|
@ -72,13 +87,30 @@ object PrefManager {
|
||||||
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) {
|
||||||
|
@ -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(
|
||||||
|
|
|
@ -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)),
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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),
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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?>>()
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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() {
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)) {
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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" />
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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 @@
|
||||||
<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:pathData="M 128 128 L 640 128 L 640 639.96 L 128 639.96 Z"
|
||||||
android:strokeWidth="1" />
|
android:strokeWidth="1" />
|
||||||
<group
|
<group
|
||||||
android:name="group_12"
|
android:name="group_12"
|
||||||
|
@ -28,8 +27,8 @@
|
||||||
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: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" />
|
android:strokeWidth="1" />
|
||||||
</group>
|
</group>
|
||||||
</group>
|
</group>
|
||||||
|
@ -43,8 +42,8 @@
|
||||||
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: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" />
|
android:strokeWidth="1" />
|
||||||
<clip-path
|
<clip-path
|
||||||
android:name="mask_2"
|
android:name="mask_2"
|
||||||
|
@ -65,8 +64,8 @@
|
||||||
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: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" />
|
android:strokeWidth="1" />
|
||||||
</group>
|
</group>
|
||||||
</group>
|
</group>
|
||||||
|
@ -74,9 +73,9 @@
|
||||||
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,8 +88,8 @@
|
||||||
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: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" />
|
android:strokeWidth="1" />
|
||||||
</group>
|
</group>
|
||||||
</group>
|
</group>
|
||||||
|
@ -100,8 +99,8 @@
|
||||||
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: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" />
|
android:strokeWidth="1" />
|
||||||
</group>
|
</group>
|
||||||
<group
|
<group
|
||||||
|
@ -112,22 +111,22 @@
|
||||||
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: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" />
|
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: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" />
|
android:strokeWidth="1" />
|
||||||
</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>
|
||||||
|
|
|
@ -6,7 +6,11 @@
|
||||||
<corners android:radius="16dp" />
|
<corners android:radius="16dp" />
|
||||||
</shape>
|
</shape>
|
||||||
</item>
|
</item>
|
||||||
<item android:right="2dp" android:left="2dp" android:top="2dp" android:bottom="2dp">
|
<item
|
||||||
|
android:bottom="2dp"
|
||||||
|
android:left="2dp"
|
||||||
|
android:right="2dp"
|
||||||
|
android:top="2dp">
|
||||||
<shape android:shape="rectangle">
|
<shape android:shape="rectangle">
|
||||||
<solid android:color="?android:colorBackground" />
|
<solid android:color="?android:colorBackground" />
|
||||||
<corners android:radius="16dp" />
|
<corners android:radius="16dp" />
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:width="24dp"
|
android:width="24dp"
|
||||||
android:height="24dp"
|
android:height="24dp"
|
||||||
|
android:tint="?attr/colorControlNormal"
|
||||||
android:viewportWidth="25.481"
|
android:viewportWidth="25.481"
|
||||||
android:viewportHeight="23.97"
|
android:viewportHeight="23.97">
|
||||||
android:tint="?attr/colorControlNormal">
|
|
||||||
<path
|
<path
|
||||||
android:fillColor="#FFF"
|
android:fillColor="#FFF"
|
||||||
android:pathData="M13.053,5.105C13.053,4.491 13.391,4.152 14.005,4.152L16.638,4.152C17.251,4.152 17.59,4.491 17.59,5.105L17.59,15.815L23.197,15.815C23.811,15.815 24.148,16.153 24.148,16.767L24.148,18.865C24.148,19.478 23.811,19.817 23.197,19.817L17.813,19.817L13.053,5.992L13.053,5.105ZM12.102,19.817L11.192,17.107L6.539,17.107L5.607,19.817L1.333,19.817L6.834,4.152L10.96,4.152L16.355,19.817L12.102,19.817ZM7.511,13.636L10.304,13.636L8.844,9.296L7.511,13.636Z" />
|
android:pathData="M13.053,5.105C13.053,4.491 13.391,4.152 14.005,4.152L16.638,4.152C17.251,4.152 17.59,4.491 17.59,5.105L17.59,15.815L23.197,15.815C23.811,15.815 24.148,16.153 24.148,16.767L24.148,18.865C24.148,19.478 23.811,19.817 23.197,19.817L17.813,19.817L13.053,5.992L13.053,5.105ZM12.102,19.817L11.192,17.107L6.539,17.107L5.607,19.817L1.333,19.817L6.834,4.152L10.96,4.152L16.355,19.817L12.102,19.817ZM7.511,13.636L10.304,13.636L8.844,9.296L7.511,13.636Z" />
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -1,9 +1,9 @@
|
||||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:width="24dp"
|
android:width="24dp"
|
||||||
android:height="24dp"
|
android:height="24dp"
|
||||||
|
android:tint="?attr/colorControlNormal"
|
||||||
android:viewportWidth="960"
|
android:viewportWidth="960"
|
||||||
android:viewportHeight="960"
|
android:viewportHeight="960">
|
||||||
android:tint="?attr/colorControlNormal">
|
|
||||||
<path
|
<path
|
||||||
android:fillColor="@android:color/white"
|
android:fillColor="@android:color/white"
|
||||||
android:pathData="M440,680h80v-160h160v-80L520,440v-160h-80v160L280,440v80h160v160ZM480,880q-83,0 -156,-31.5T197,763q-54,-54 -85.5,-127T80,480q0,-83 31.5,-156T197,197q54,-54 127,-85.5T480,80q83,0 156,31.5T763,197q54,54 85.5,127T880,480q0,83 -31.5,156T763,763q-54,54 -127,85.5T480,880ZM480,800q134,0 227,-93t93,-227q0,-134 -93,-227t-227,-93q-134,0 -227,93t-93,227q0,134 93,227t227,93ZM480,480Z" />
|
android:pathData="M440,680h80v-160h160v-80L520,440v-160h-80v160L280,440v80h160v160ZM480,880q-83,0 -156,-31.5T197,763q-54,-54 -85.5,-127T80,480q0,-83 31.5,-156T197,197q54,-54 127,-85.5T480,80q83,0 156,31.5T763,197q54,54 85.5,127T880,480q0,83 -31.5,156T763,763q-54,54 -127,85.5T480,880ZM480,800q134,0 227,-93t93,-227q0,-134 -93,-227t-227,-93q-134,0 -227,93t-93,227q0,134 93,227t227,93ZM480,480Z" />
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:width="24dp"
|
android:width="24dp"
|
||||||
android:height="24dp"
|
android:height="24dp"
|
||||||
|
android:tint="?attr/colorControlNormal"
|
||||||
android:viewportWidth="960"
|
android:viewportWidth="960"
|
||||||
android:viewportHeight="960"
|
android:viewportHeight="960">
|
||||||
android:tint="?attr/colorControlNormal">
|
|
||||||
<path
|
<path
|
||||||
android:fillColor="@android:color/white"
|
android:fillColor="@android:color/white"
|
||||||
android:pathData="m336,680 l144,-144 144,144 56,-56 -144,-144 144,-144 -56,-56 -144,144 -144,-144 -56,56 144,144 -144,144 56,56ZM480,880q-83,0 -156,-31.5T197,763q-54,-54 -85.5,-127T80,480q0,-83 31.5,-156T197,197q54,-54 127,-85.5T480,80q83,0 156,31.5T763,197q54,54 85.5,127T880,480q0,83 -31.5,156T763,763q-54,54 -127,85.5T480,880ZM480,800q134,0 227,-93t93,-227q0,-134 -93,-227t-227,-93q-134,0 -227,93t-93,227q0,134 93,227t227,93ZM480,480Z" />
|
android:pathData="m336,680 l144,-144 144,144 56,-56 -144,-144 144,-144 -56,-56 -144,144 -144,-144 -56,56 144,144 -144,144 56,56ZM480,880q-83,0 -156,-31.5T197,763q-54,-54 -85.5,-127T80,480q0,-83 31.5,-156T197,197q54,-54 127,-85.5T480,80q83,0 156,31.5T763,197q54,54 85.5,127T880,480q0,83 -31.5,156T763,763q-54,54 -127,85.5T480,880ZM480,800q134,0 227,-93t93,-227q0,-134 -93,-227t-227,-93q-134,0 -227,93t-93,227q0,134 93,227t227,93ZM480,480Z" />
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:width="24dp"
|
android:width="24dp"
|
||||||
android:height="24dp"
|
android:height="24dp"
|
||||||
|
android:tint="?attr/colorControlNormal"
|
||||||
android:viewportWidth="960"
|
android:viewportWidth="960"
|
||||||
android:viewportHeight="960"
|
android:viewportHeight="960">
|
||||||
android:tint="?attr/colorControlNormal">
|
|
||||||
<path
|
<path
|
||||||
android:fillColor="@android:color/white"
|
android:fillColor="@android:color/white"
|
||||||
android:pathData="m424,664 l282,-282 -56,-56 -226,226 -114,-114 -56,56 170,170ZM480,880q-83,0 -156,-31.5T197,763q-54,-54 -85.5,-127T80,480q0,-83 31.5,-156T197,197q54,-54 127,-85.5T480,80q83,0 156,31.5T763,197q54,54 85.5,127T880,480q0,83 -31.5,156T763,763q-54,54 -127,85.5T480,880ZM480,800q134,0 227,-93t93,-227q0,-134 -93,-227t-227,-93q-134,0 -227,93t-93,227q0,134 93,227t227,93ZM480,480Z" />
|
android:pathData="m424,664 l282,-282 -56,-56 -226,226 -114,-114 -56,56 170,170ZM480,880q-83,0 -156,-31.5T197,763q-54,-54 -85.5,-127T80,480q0,-83 31.5,-156T197,197q54,-54 127,-85.5T480,80q83,0 156,31.5T763,197q54,54 85.5,127T880,480q0,83 -31.5,156T763,763q-54,54 -127,85.5T480,880ZM480,800q134,0 227,-93t93,-227q0,-134 -93,-227t-227,-93q-134,0 -227,93t-93,227q0,134 93,227t227,93ZM480,480Z" />
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue