Compare commits
526 Commits
Author | SHA1 | Date | |
---|---|---|---|
74e45b1820 | |||
0a1336f0e0 | |||
d5a0dcb980 | |||
83e7c41ca0 | |||
1d1b0c11a9 | |||
3b2c4e2ac6 | |||
2d77fe580f | |||
7ae20f43f8 | |||
f03c1b206b | |||
d99a58f2cf | |||
5aeaf7f34b | |||
af0b484d16 | |||
0a6791b752 | |||
e73e306d05 | |||
52189abbff | |||
d721f12d74 | |||
69f28bb647 | |||
2b2295d831 | |||
179586b8c4 | |||
1afad9e06a | |||
59c73fd864 | |||
6820344750 | |||
680504791c | |||
41e500a8f8 | |||
448af1ef9a | |||
041e8c0bd6 | |||
0b7300e93a | |||
94c5f5a705 | |||
fa2f8a7b05 | |||
aeb288142e | |||
635c43f458 | |||
d36138431b | |||
9cdf857730 | |||
52a6152af6 | |||
9d3312c081 | |||
1146236f46 | |||
ec19ee1e55 | |||
cc37e40158 | |||
bdd12de34d | |||
e64692d0d3 | |||
7da8c0f664 | |||
fc41c077dc | |||
50800da4b9 | |||
a9219e8a91 | |||
5eedadef47 | |||
14cde8e625 | |||
1f2ecd591d | |||
9a2eb6cd49 | |||
aa38514bcb | |||
f2fddfb16c | |||
05300682c1 | |||
a3714a4ecf | |||
500584b9ef | |||
33ac822957 | |||
1f6107e238 | |||
2b7639599c | |||
dedf7b0163 | |||
88b5a83fb1 | |||
efd6b0088f | |||
ccb5cd20b1 | |||
668e41bc9b | |||
46123fa7d6 | |||
b079965de8 | |||
842ab914a4 | |||
fcb93b7dc6 | |||
f1420fe29e | |||
23f8674adc | |||
76a4aa5ae6 | |||
85ffb4064b | |||
73c9e639b6 | |||
5172695784 | |||
fcc10f97b5 | |||
0a12020fd8 | |||
e9c10b17e0 | |||
f4698f1312 | |||
1690507a18 | |||
fbeb87e29e | |||
de14e95e90 | |||
35c5713b0a | |||
413792087e | |||
21c53d2b4d | |||
5757a8b1d8 | |||
680bdf7bd2 | |||
6911fbd124 | |||
9fdffc9709 | |||
0b722a5ecc | |||
6ae42ffefe | |||
3a8c82ce63 | |||
04c2b277ce | |||
962462ff84 | |||
964b0f2690 | |||
4b25b61680 | |||
61c3735e57 | |||
b0e29c0ba4 | |||
e7f55aace9 | |||
2955206b07 | |||
b59d97279d | |||
7d9e299940 | |||
e15252a0f8 | |||
e0907f1dc8 | |||
1107391c43 | |||
2500035c33 | |||
24ad4dbc0f | |||
550394a5e4 | |||
720c13fa2d | |||
a02b8b79c1 | |||
c2f99e130d | |||
250aa03e9a | |||
dd7d253a1b | |||
f2b46fffe0 | |||
60630cc4ea | |||
85164c18e9 | |||
3634e5e232 | |||
f7d44cb547 | |||
85b89507db | |||
7415b752cc | |||
0a52060223 | |||
1024b1e6f9 | |||
23fc061711 | |||
bfa3ede06b | |||
c7f6cdc8c6 | |||
58f280d347 | |||
0715824ae1 | |||
5540c8cacc | |||
14efbdd08f | |||
7ceb04d548 | |||
e9608f63db | |||
64e1c7ca81 | |||
7823b30900 | |||
1e45e4454c | |||
1dd3a193c5 | |||
30416837a9 | |||
363132d331 | |||
ebc0d744ed | |||
d685031ee8 | |||
3ea012f62e | |||
9a06f5660b | |||
dff76aada1 | |||
50a9f8a1b0 | |||
8ff3b81112 | |||
38f73a5d60 | |||
15f6835a0c | |||
84e3264726 | |||
dbd068d95f | |||
acba219e44 | |||
c8e7c23855 | |||
f0ff8a6feb | |||
91a1380fef | |||
3351ef7d91 | |||
564cda58a5 | |||
3233fe673d | |||
8cc8b284ce | |||
3ecdedc17c | |||
8f361c605a | |||
9d599e8b57 | |||
9c676d8002 | |||
d3ffc32d9b | |||
8c95554d8e | |||
3ed5248c2a | |||
32990932ad | |||
6d0a47903c | |||
05eaa196b4 | |||
2cd076bfb8 | |||
02cd267cae | |||
21394cb585 | |||
73cd48b94a | |||
ea2cf58e5f | |||
2f3e29b037 | |||
33d597c2c0 | |||
66afb3f4ee | |||
dad94d753d | |||
1727bebf58 | |||
37576c69ce | |||
b8f83a7227 | |||
3a14abaf2e | |||
0e03a55aef | |||
931fb30330 | |||
b893dc9c4f | |||
f6ddd99449 | |||
ddcbbfe670 | |||
0f7438fa54 | |||
fbbab1db68 | |||
15725dceb0 | |||
1bcbcec8b8 | |||
c3e475be6f | |||
150a81adc6 | |||
a984607ee8 | |||
2bf929986e | |||
860edec2e6 | |||
90cfcbb7ae | |||
c63048730f | |||
55bbafdbb5 | |||
0923a07e42 | |||
431c21e066 | |||
17c84f6c37 | |||
58f10d9372 | |||
a6dfd842e3 | |||
dfdda7627f | |||
1711826c43 | |||
4627de23b4 | |||
023ab2d4b2 | |||
2a375318ea | |||
fee593d059 | |||
fe3546e282 | |||
b61b6868a6 | |||
2f8ecd1f3e | |||
8a9ead3f0d | |||
43e2762d4d | |||
8ab237a957 | |||
ffa5d0883a | |||
14f0a47f52 | |||
4c1e466866 | |||
24c6f79b51 | |||
8c958a2563 | |||
02cc00780d | |||
d13cce3997 | |||
985835429b | |||
00751cedab | |||
c4e85a7161 | |||
253b61fb11 | |||
54ffbe2e15 | |||
86d9ba930c | |||
fb96efc8cf | |||
aaac1652e9 | |||
c8fc98ee71 | |||
4457259dfd | |||
6dbb11f6e9 | |||
08a4b4b49a | |||
4afd2ca341 | |||
0c048877e0 | |||
825a74de4a | |||
79ca0ceb88 | |||
a5ccc9bf6f | |||
685467266a | |||
599e53b10c | |||
029b8b57ae | |||
631264eb57 | |||
e7eef5b760 | |||
59741e5979 | |||
0f38ad180a | |||
fdc6e6e325 | |||
ed9e79496a | |||
4f909417f1 | |||
aecb4034ad | |||
f0335d96d2 | |||
65f3886355 | |||
8e2f1fb8fe | |||
852cfee310 | |||
6620a12957 | |||
11e8135cbd | |||
824c4e0cbb | |||
9af7934448 | |||
4ffa027e8d | |||
7e8ab3359a | |||
8e72655731 | |||
5c098857bd | |||
7fece740af | |||
857ab65f93 | |||
807655da5b | |||
a77f37e564 | |||
1194209c82 | |||
f31b6e9ac8 | |||
3353b7205b | |||
0f995cc615 | |||
7be0f72292 | |||
ffbe8877a8 | |||
74feb7e8f0 | |||
cbaef4bcfe | |||
38a387a423 | |||
1092eefc76 | |||
3615b43b97 | |||
e17c7fb01d | |||
f3d69e19a0 | |||
ea102eb485 | |||
2e4c01ed62 | |||
ed22892d10 | |||
017bd5a6a2 | |||
967f11ddb4 | |||
6b4abd019e | |||
8b66c4030f | |||
34f058358e | |||
2bab907777 | |||
52e64b6d85 | |||
9510678a9f | |||
b4e7c3f8e2 | |||
d800d2b10c | |||
785b4949e6 | |||
b79e17cb60 | |||
19fcbeb4b9 | |||
ffb355d1a2 | |||
43fd2945cc | |||
d93c74a449 | |||
7a197993c9 | |||
dc2a252dd5 | |||
2c33f7a7f8 | |||
24a8a0dc00 | |||
b78894b33c | |||
2d33d7f970 | |||
8823eb74ba | |||
7f77b86272 | |||
2f773b2f0f | |||
ca69a6e86d | |||
3e5cefbf24 | |||
245ef64ebe | |||
a0ff454dd9 | |||
fa6b1560f8 | |||
518b5f617b | |||
7c4ce7701c | |||
0b6557f9c5 | |||
a8e00d137a | |||
75d3f74e48 | |||
3866317597 | |||
10e904fe4a | |||
be655f6c2b | |||
676e540059 | |||
87763a050c | |||
ab45c1f80c | |||
ec5f2c7c45 | |||
c4448f22b9 | |||
62af5c54aa | |||
5872f5c99f | |||
2b1a63e08b | |||
7b96cf32b3 | |||
6108bd143c | |||
0127b9bffa | |||
8dddfc5497 | |||
bf119a5808 | |||
89ade69c5f | |||
93eaec8544 | |||
ce984de339 | |||
b089ae93e1 | |||
fc95708a84 | |||
7262690999 | |||
f818c74943 | |||
d7c5a04965 | |||
257a00fa1e | |||
23875a2ceb | |||
3f1883fbbc | |||
c5269a3129 | |||
056092ac71 | |||
fd7632f001 | |||
fb83a1927d | |||
641a616c96 | |||
fc051d8d1d | |||
b8bec4f357 | |||
fe78c8bf7e | |||
42caaa9dc9 | |||
74d6cb8041 | |||
7678da2bb6 | |||
e771153f35 | |||
e96b9f7f02 | |||
0604ac9ba8 | |||
bd0c59a69e | |||
0a84b75518 | |||
c4b49b58cf | |||
afbb27896e | |||
e0ff6c0ac3 | |||
4d7c7e88bb | |||
7eef023277 | |||
6a762a8fd6 | |||
752e3d50c1 | |||
8377f9bb8a | |||
5ff06a29d2 | |||
50aeb075b1 | |||
79ff617d67 | |||
5de8524f2a | |||
6164ff9163 | |||
6e8b304b63 | |||
3be0cd727f | |||
451dd53230 | |||
34c1222fbc | |||
ccf2fc877b | |||
10a496c299 | |||
ba1bfd1f9c | |||
b9622da6c6 | |||
b3e9100c2f | |||
fb0e87397d | |||
bed1bb634b | |||
4db288743e | |||
ba569b2d40 | |||
c774dcee96 | |||
48fe22c8db | |||
3f282c8116 | |||
4f4cdd68b5 | |||
9c350c922b | |||
8548777c50 | |||
30d344987c | |||
80c8e1a356 | |||
8ce7eb386f | |||
c50a587250 | |||
a8b17ce0b2 | |||
731863ef6c | |||
04b8294022 | |||
4937ff43e5 | |||
1670867a1d | |||
5e947cd221 | |||
1f8c5cbc05 | |||
c2ab7a3608 | |||
d62ff6d18f | |||
92a0af8b36 | |||
34ed36f9ae | |||
7777317eb8 | |||
4d53612adc | |||
e08d9805f1 | |||
cb5b7274fe | |||
db84cac8f0 | |||
b6769ca25f | |||
70903578d1 | |||
07d8a39681 | |||
7410467cd6 | |||
f21732f753 | |||
9dca5fcd3b | |||
1bc99b3c46 | |||
a8a5028852 | |||
f5fa9944ad | |||
3697917d2b | |||
9f25405983 | |||
9c476037ef | |||
2044a85b58 | |||
d878ac780c | |||
55179c6955 | |||
618384cccb | |||
0b84823f64 | |||
9361f6ca64 | |||
b81257c77c | |||
75e919adbc | |||
d946451b27 | |||
2d960d4c55 | |||
6f24030b86 | |||
ce7b0d4d7d | |||
ed34917550 | |||
18bd328814 | |||
cf35a65edd | |||
fe04f32aa1 | |||
36f5f73a47 | |||
cd5e23364d | |||
8bd4a3f5d1 | |||
4114e4c349 | |||
3993e4a67e | |||
c78af3ea1a | |||
132687366c | |||
667469c773 | |||
e78e7a6f97 | |||
a1790bf32d | |||
7a8e2f32b4 | |||
1932913793 | |||
7c40060438 | |||
0c6c5c813f | |||
786b80e25e | |||
4cc0729d77 | |||
9f444d6d88 | |||
700fe6c9e8 | |||
3c2b8cc699 | |||
eef6b3d76c | |||
0a7fab6883 | |||
1f7fe1fc6f | |||
5bb395f2d3 | |||
4d6cb47e6c | |||
f7f85a9dbb | |||
118c2175f5 | |||
645c9fa240 | |||
13baaccd81 | |||
aaa8281da8 | |||
8bcc7e8f58 | |||
8085ed6a95 | |||
12d24f4a56 | |||
fcf2fbdd86 | |||
81a711ee4c | |||
b68cb689ca | |||
b2f1bf2817 | |||
7aab6fbba9 | |||
015a2f3289 | |||
647c827ee4 | |||
e503a5ec95 | |||
11209a5334 | |||
b23686ab64 | |||
7f4c6faa1d | |||
33c7f12180 | |||
106bacb4b1 | |||
d6c662434d | |||
3705657aec | |||
ea810fd61b | |||
2d32aa9a9b | |||
e672b207b6 | |||
68dfb1b980 | |||
6feedf5c24 | |||
c196d3aebe | |||
a87ec4ffa5 | |||
3e694b8ac2 | |||
26af939014 | |||
f0eaceb8a4 | |||
7827c97bf9 | |||
31e87a18bb | |||
07546abb7e | |||
124e0d8505 | |||
94b969c428 | |||
cb9f8605d5 | |||
5660fb15e5 | |||
d02fdba671 | |||
d8de74ce7a | |||
2129727cc5 | |||
119ad4884b | |||
3617fb3229 | |||
b272a5b5f9 | |||
58404694e0 | |||
c4c745dbc0 | |||
2f909d5ffa | |||
c714e6a625 | |||
bb2c129762 | |||
42b0574143 | |||
df0b18f535 | |||
e8427b883d | |||
4027a8b725 | |||
a1b816030a | |||
8c7d1c692b | |||
7588a48cb5 | |||
014302c3a8 | |||
f632aa4712 | |||
81de1c1aa0 | |||
d89c998a35 | |||
4c83a14786 | |||
43e6d0baeb | |||
88514c0669 | |||
f7eb17fd94 | |||
27990d56e9 | |||
6d56c7f803 |
10
.github/FUNDING.yml
vendored
Normal file
@ -0,0 +1,10 @@
|
||||
# These are supported funding model platforms
|
||||
|
||||
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
|
||||
patreon: tom79
|
||||
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
|
||||
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
|
||||
liberapay: tom79
|
||||
issuehunt: # Replace with a single IssueHunt username
|
||||
otechie: # Replace with a single Otechie username
|
||||
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
|
4
.gitignore
vendored
@ -7,3 +7,7 @@
|
||||
/captures
|
||||
.externalNativeBuild
|
||||
.cxx
|
||||
/app/release/
|
||||
/app/fdroid_full/release/
|
||||
/app/google_full/
|
||||
/app/google_acad/
|
||||
|
133
.gitlab-ci.yml
Normal file
@ -0,0 +1,133 @@
|
||||
# This file is a template, and might need editing before it works on your project.
|
||||
# Read more about this script on this blog post https://about.gitlab.com/2018/10/24/setting-up-gitlab-ci-for-android-projects/, by Jason Lenny
|
||||
# If you are interested in using Android with FastLane for publishing take a look at the Android-Fastlane template.
|
||||
|
||||
image: openjdk:8-jdk
|
||||
|
||||
variables:
|
||||
|
||||
# ANDROID_COMPILE_SDK is the version of Android you're compiling with.
|
||||
# It should match compileSdkVersion.
|
||||
ANDROID_COMPILE_SDK: "30"
|
||||
|
||||
# ANDROID_BUILD_TOOLS is the version of the Android build tools you are using.
|
||||
# It should match buildToolsVersion.
|
||||
ANDROID_BUILD_TOOLS: "30.0.2"
|
||||
|
||||
# It's what version of the command line tools we're going to download from the official site.
|
||||
# Official Site-> https://developer.android.com/studio/index.html
|
||||
# There, look down below at the cli tools only, sdk tools package is of format:
|
||||
# commandlinetools-os_type-ANDROID_SDK_TOOLS_latest.zip
|
||||
# when the script was last modified for latest compileSdkVersion, it was which is written down below
|
||||
ANDROID_SDK_TOOLS: "6609375"
|
||||
|
||||
# Packages installation before running script
|
||||
before_script:
|
||||
- apt-get --quiet update --yes
|
||||
- apt-get --quiet install --yes wget tar unzip lib32stdc++6 lib32z1
|
||||
|
||||
# Setup path as android_home for moving/exporting the downloaded sdk into it
|
||||
- export ANDROID_HOME="${PWD}/android-home"
|
||||
# Create a new directory at specified location
|
||||
- install -d $ANDROID_HOME
|
||||
# Here we are installing androidSDK tools from official source,
|
||||
# (the key thing here is the url from where you are downloading these sdk tool for command line, so please do note this url pattern there and here as well)
|
||||
# after that unzipping those tools and
|
||||
# then running a series of SDK manager commands to install necessary android SDK packages that'll allow the app to build
|
||||
- wget --output-document=$ANDROID_HOME/cmdline-tools.zip https://dl.google.com/android/repository/commandlinetools-linux-${ANDROID_SDK_TOOLS}_latest.zip
|
||||
# move to the archive at ANDROID_HOME
|
||||
- pushd $ANDROID_HOME
|
||||
- unzip -d cmdline-tools cmdline-tools.zip
|
||||
- popd
|
||||
- export PATH=$PATH:${ANDROID_HOME}/cmdline-tools/tools/bin/
|
||||
|
||||
# Nothing fancy here, just checking sdkManager version
|
||||
- sdkmanager --version
|
||||
|
||||
# use yes to accept all licenses
|
||||
- yes | sdkmanager --sdk_root=${ANDROID_HOME} --licenses || true
|
||||
- sdkmanager --sdk_root=${ANDROID_HOME} "platforms;android-${ANDROID_COMPILE_SDK}"
|
||||
- sdkmanager --sdk_root=${ANDROID_HOME} "platform-tools"
|
||||
- sdkmanager --sdk_root=${ANDROID_HOME} "build-tools;${ANDROID_BUILD_TOOLS}"
|
||||
|
||||
# Not necessary, but just for surity
|
||||
- chmod +x ./gradle
|
||||
|
||||
stages:
|
||||
- build
|
||||
- build-and-test
|
||||
- tag
|
||||
|
||||
.no-upload: &no-upload
|
||||
stage: build-and-test
|
||||
retry: 2
|
||||
|
||||
# Make Project
|
||||
assembleDebug:
|
||||
<<: *no-upload
|
||||
cache:
|
||||
key: "${CI_COMMIT_TAG}"
|
||||
paths:
|
||||
- app/build/outputs/apk/fdroid_peertube_apps_educ/debug/app-fdroid_peertube_apps_educ-debug.apk
|
||||
- app/build/outputs/apk/fdroid_full/debug/app-fdroid_full-debug.apk
|
||||
policy: push
|
||||
script:
|
||||
- ./gradlew assembleDebug
|
||||
|
||||
# Basic android and gradle stuff
|
||||
# Check linting
|
||||
lintfdroid_peertube_apps_educDebug:
|
||||
interruptible: true
|
||||
stage: build
|
||||
script:
|
||||
- ./gradlew -Pci --console=plain :app:lintfdroid_peertube_apps_educDebug -PbuildDir=lint
|
||||
except:
|
||||
- tags
|
||||
|
||||
lintFdroid_fullDebug:
|
||||
interruptible: true
|
||||
stage: build
|
||||
script:
|
||||
- ./gradlew -Pci --console=plain :app:lintFdroid_fullDebug -PbuildDir=lint
|
||||
except:
|
||||
- tags
|
||||
|
||||
|
||||
## PROTECTED VARIABLES TO SET IN GITLAB:
|
||||
# - GITLAB_API_TOKEN: token you create on Gitlab
|
||||
# - NC_REMOTE_DIR: like https://YOUR_NEXTCLOUD/remote.php/dav/files/YOUR_USER/mastalab (no trailing slash)
|
||||
# - NC_SHARE_URL: share the folder in Nextcloud with public link and put your public link here (no trailing slash)
|
||||
# - NC_USER: nextcloud user
|
||||
# - NC_PASSWORD: nextcloud password
|
||||
## Protect all tags in Gitlab repo settings (do a wildcard, ie '*')
|
||||
# For now, it uses the assembleDebug builds, you'll need to create a job in build-and-test to create the apks, with only: - tags and add except: - tags to assembleDebug (like in debugTests)
|
||||
# In it, put something like this to get your signature key file:
|
||||
# - curl -s --output signature.jsk -u "${NC_USER}:${NC_PASSWORD}" "https://YOUR_NEXTCLOUD/remote.php/dav/files/YOUR_USER/signature.jsk"
|
||||
putApkOnTags:
|
||||
image: hatsoftwares/curl-jq:latest
|
||||
stage: tag
|
||||
retry: 2
|
||||
cache:
|
||||
key: "${CI_COMMIT_TAG}"
|
||||
paths:
|
||||
- app/build/outputs/apk/fdroid_peertube_apps_educ/debug/app-fdroid_peertube_apps_educ-debug.apk
|
||||
- app/build/outputs/apk/fdroid_full/debug/app-fdroid_full-debug.apk
|
||||
policy: pull
|
||||
script:
|
||||
- export PROJECT_API_URL="https://framagit.org/api/v4/projects/${CI_PROJECT_ID}"
|
||||
- export DESCRIPTION_URL="${PROJECT_API_URL}/repository/tags/${CI_COMMIT_TAG}"
|
||||
- export RELEASE_URL="${DESCRIPTION_URL}/release"
|
||||
- export NC_UPLOAD_URL="${NC_REMOTE_DIR}/${CI_COMMIT_TAG}"
|
||||
- export NC_DOWNLOAD_URL="${NC_SHARE_URL}/download?path=%2F${CI_COMMIT_TAG}%2F&files="
|
||||
- 'export HEADER="Private-Token: ${GITLAB_API_TOKEN}"'
|
||||
- export acadUrl="${NC_DOWNLOAD_URL}app-fdroid_peertube_apps_educ-debug.apk"
|
||||
- export fullUrl="${NC_DOWNLOAD_URL}app-fdroid_full-debug.apk"
|
||||
- 'curl -s -u "${NC_USER}:${NC_PASSWORD}" -X MKCOL "${NC_UPLOAD_URL}"'
|
||||
- 'curl -s -u "${NC_USER}:${NC_PASSWORD}" -T app/build/outputs/apk/fdroid_full/debug/app-fdroid_full-debug.apk "${NC_UPLOAD_URL}/app-fdroid_full-debug.apk"'
|
||||
- 'curl -s -u "${NC_USER}:${NC_PASSWORD}" -T app/build/outputs/apk/fdroid_peertube_apps_educ/debug/app-fdroid_peertube_apps_educ-debug.apk "${NC_UPLOAD_URL}/app-fdroid_peertube_apps_educ-debug.apk"'
|
||||
- export description=$(curl -s --header "${HEADER}" "${DESCRIPTION_URL}" | jq .release.description | sed -e 's@"@@g')
|
||||
- if [[ $description == 'null' ]]; then export METHOD="POST"; echo -e "[Get the acad version](${acadUrl})\n\n[Get the full version](${fullUrl})" > /tmp/text; fi
|
||||
- if [[ $description != 'null' ]]; then export METHOD="PUT"; echo -e "${description}\n\n[Get the acad version](${acadUrl})\n\n[Get the full version](${fullUrl})" > /tmp/text; fi
|
||||
- curl -s --request $METHOD --data-urlencode "description@/tmp/text" --header "${HEADER}" "${RELEASE_URL}"
|
||||
only:
|
||||
- tags
|
28
CHANGELOG
Normal file
@ -0,0 +1,28 @@
|
||||
# 1.5.2
|
||||
|
||||
### Added:
|
||||
- Enable/disable auto playback
|
||||
- Enter in full-screen automatically (default disabled)
|
||||
- Back press pauses the video in full-screen
|
||||
|
||||
### Fixed:
|
||||
- Public timelines don't honor muted accounts
|
||||
- Comments are not removed when switching to a video without comments
|
||||
- Some other fixes
|
||||
|
||||
--------
|
||||
|
||||
# 1.5.1
|
||||
|
||||
- Fix some issues
|
||||
- New translations
|
||||
|
||||
--------
|
||||
|
||||
# 1.5.0
|
||||
|
||||
- Custom default instance depending of the country
|
||||
- Full managements of comments and their replies (read/post/delete)
|
||||
- Profile for accounts (displays their channels & videos)
|
||||
- Fix some issues when posting a comment
|
||||
- Fix videos not paused after screen lock
|
17
CONTRIBUTING.md
Normal file
@ -0,0 +1,17 @@
|
||||
CONTRIBUTING
|
||||
============
|
||||
|
||||
### Localizations:
|
||||
|
||||
TubeLab works only with [Crowdin](https://crowdin.com/project/tubelab), which offers nice tools for helping in translations.
|
||||
New translations will be automatically merged in a branch.
|
||||
If your language is not listed, please ask me to add it. If you prefer to work on an XML file, you should be able [to upload it with Crowdin](https://support.crowdin.com/xml-configuration/).
|
||||
Crowdin will not pick up changes in develop branch, that's why all translations should be done with this tool.
|
||||
|
||||
### Issues:
|
||||
|
||||
Issues are handled on Github at: https://github.com/stom79/TubeLab/issues, before opening an issue, please check it has not yet been submitted by someone else
|
||||
|
||||
### Contribution to code:
|
||||
|
||||
Your contributions are welcomed, but please, use this repo https://framagit.org/tom79/fedilab-tube. You can create PR to the dev branch.
|
50
README.md
@ -1,6 +1,46 @@
|
||||
## TubeLab [](https://www.gnu.org/licenses/gpl-3.0)
|
||||
## TubeLab/TubeAcad [](https://www.gnu.org/licenses/gpl-3.0)
|
||||
|
||||
This project groups two different apps. **[TubeAcad](#TubeAcad)**, a Peertube Android app for French academic authorities. All is in French. Its use is limited to some instances.
|
||||
The other app is **[TubeLab](#TubeLab)** a Peertube Android app working for all instances.
|
||||
|
||||
|
||||
## <a name="TubeLab">TubeLab</a>
|
||||
|
||||
Tubelab is an Android app for Peertube (GNU GPLv3). <img src='https://img.shields.io/f-droid/v/app.fedilab.tubelab?include_prereleases' />
|
||||
|
||||
[<img alt='Get it on Google Play' src='./images/get-it-on-play.png' height="80"/>](https://play.google.com/store/apps/details?id=app.fedilab.tubelab)
|
||||
[<img alt='Get it on F-Droid' src='./images/get-it-on-fdroid.png' height="80"/>](https://f-droid.org/packages/app.fedilab.tubelab/)
|
||||
|
||||
### Not authenticated mode
|
||||
|
||||
It's a limited mode where you can do some actions:
|
||||
|
||||
- Switch instance
|
||||
- Share videos
|
||||
- Download videos
|
||||
|
||||
### Authenticated mode
|
||||
|
||||
Many features are available with this mode:
|
||||
|
||||
- Write/delete comments
|
||||
- Upload/remove/edit videos
|
||||
- Manage (create/edit/remove) channels and playlists
|
||||
- Follow/unfollow channels
|
||||
- Thumbs-up/down
|
||||
- Check notifications
|
||||
- Mute/unmute channels
|
||||
- Report videos/accounts
|
||||
- Check your history
|
||||
|
||||
## <a name="TubeAcad">TubeAcad</a>
|
||||
|
||||
TubeAcad est une application Android open source (GNU GPLv3) pour les instances Peertube académiques. L’authentification se fait par adresse mail, l’instance est automatiquement détectée. Il est également possible sur certaines instances de créer son compte depuis l’application.
|
||||
|
||||
|
||||
[<img alt='Get it on Google Play' src='./images/get-it-on-play.png' height="80"/>](https://play.google.com/store/apps/details?id=app.fedilab.fedilabtube)
|
||||
[<img alt='Get it on F-Droid' src='./images/get-it-on-fdroid.png' height="80"/>](https://f-droid.org/packages/app.fedilab.fedilabtube/)
|
||||
|
||||
TubeLab est une application Android open source (GNU GPLv3) pour les instances Peertube académiques. L’authentification se fait par adresse mail, l’instance est automatiquement détectée. Il est également possible sur certaines instances de créer son compte depuis l’application.
|
||||
|
||||
### Mode non authentifié
|
||||
|
||||
@ -28,9 +68,3 @@ Si vous connectez votre compte, vous pourrez interagir avec les vidéos :
|
||||
- Signaler des vidéos ou des comptes
|
||||
- Voir l'historique
|
||||
|
||||
|
||||
### Télécharger
|
||||
|
||||
[Fdroid](https://f-droid.org/packages/app.fedilab.fedilabtube/)
|
||||
|
||||
[GooglePlay](https://play.google.com/store/apps/details?id=app.fedilab.fedilabtube)
|
||||
|
168
app/build.gradle
@ -1,5 +1,4 @@
|
||||
apply plugin: 'com.android.application'
|
||||
|
||||
apply plugin: "androidx.navigation.safeargs"
|
||||
|
||||
android {
|
||||
@ -7,17 +6,18 @@ android {
|
||||
buildToolsVersion "30.0.2"
|
||||
|
||||
defaultConfig {
|
||||
applicationId "app.fedilab.fedilabtube"
|
||||
|
||||
minSdkVersion 21
|
||||
targetSdkVersion 30
|
||||
versionCode 5
|
||||
versionName "1.0.3"
|
||||
versionCode 33
|
||||
versionName "1.10.2"
|
||||
multiDexEnabled true
|
||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||
}
|
||||
dexOptions {
|
||||
javaMaxHeapSize "4g"
|
||||
}
|
||||
flavorDimensions "default"
|
||||
buildTypes {
|
||||
release {
|
||||
minifyEnabled false
|
||||
@ -28,6 +28,113 @@ android {
|
||||
sourceCompatibility JavaVersion.VERSION_1_8
|
||||
targetCompatibility JavaVersion.VERSION_1_8
|
||||
}
|
||||
|
||||
buildFeatures {
|
||||
viewBinding = true
|
||||
}
|
||||
|
||||
lintOptions {
|
||||
disable 'MissingTranslation'
|
||||
checkReleaseBuilds false
|
||||
abortOnError false
|
||||
}
|
||||
//boolean full_instances if set to false means TubeAcad
|
||||
productFlavors {
|
||||
fdroid_peertube_apps_educ {
|
||||
applicationId "app.fedilab.fedilabtube"
|
||||
resValue "string", "app_name", "TubeAcad"
|
||||
resValue "string", "app_id", "app.fedilab.fedilabtube"
|
||||
buildConfigField "String", "version", "\"fdroid_acad\""
|
||||
buildConfigField "boolean", "full_instances", "false"
|
||||
buildConfigField "boolean", "google_restriction", "false"
|
||||
buildConfigField "boolean", "surfing_mode", "false"
|
||||
buildConfigField "boolean", "sepia_search", "false"
|
||||
buildConfigField "boolean", "instance_switcher", "true"
|
||||
}
|
||||
google_peertube_apps_educ {
|
||||
applicationId "app.fedilab.fedilabtube"
|
||||
resValue "string", "app_name", "TubeAcad"
|
||||
resValue "string", "app_id", "app.fedilab.fedilabtube"
|
||||
buildConfigField "String", "version", "\"google_acad\""
|
||||
buildConfigField "boolean", "full_instances", "false"
|
||||
buildConfigField "boolean", "google_restriction", "true"
|
||||
buildConfigField "boolean", "surfing_mode", "false"
|
||||
buildConfigField "boolean", "sepia_search", "false"
|
||||
buildConfigField "boolean", "instance_switcher", "true"
|
||||
}
|
||||
fdroid_full {
|
||||
applicationId "app.fedilab.tubelab"
|
||||
resValue "string", "app_name", "TubeLab"
|
||||
resValue "string", "app_id", "app.fedilab.tubelab"
|
||||
buildConfigField "String", "version", "\"fdroid_full\""
|
||||
buildConfigField "boolean", "full_instances", "true"
|
||||
buildConfigField "boolean", "google_restriction", "false"
|
||||
buildConfigField "boolean", "surfing_mode", "true"
|
||||
buildConfigField "boolean", "sepia_search", "true"
|
||||
buildConfigField "boolean", "instance_switcher", "true"
|
||||
}
|
||||
google_full {
|
||||
applicationId "app.fedilab.tubelab"
|
||||
resValue "string", "app_name", "TubeLab"
|
||||
resValue "string", "app_id", "app.fedilab.tubelab"
|
||||
buildConfigField "String", "version", "\"google_full\""
|
||||
buildConfigField "boolean", "full_instances", "true"
|
||||
buildConfigField "boolean", "google_restriction", "true"
|
||||
buildConfigField "boolean", "surfing_mode", "true"
|
||||
buildConfigField "boolean", "sepia_search", "true"
|
||||
buildConfigField "boolean", "instance_switcher", "true"
|
||||
}
|
||||
queermotion {
|
||||
applicationId "org.queermotion.peertube"
|
||||
resValue "string", "app_name", "QueerMotion"
|
||||
resValue "string", "app_id", "org.queermotion.peertube"
|
||||
buildConfigField "String", "version", "\"queermotion\""
|
||||
buildConfigField "boolean", "full_instances", "true"
|
||||
buildConfigField "boolean", "google_restriction", "false"
|
||||
buildConfigField "boolean", "surfing_mode", "false"
|
||||
buildConfigField "boolean", "sepia_search", "false"
|
||||
buildConfigField "boolean", "instance_switcher", "false"
|
||||
}
|
||||
bittube {
|
||||
applicationId "app.fedilab.bittube"
|
||||
resValue "string", "app_name", "Bittube"
|
||||
resValue "string", "app_id", "app.fedilab.bittube"
|
||||
buildConfigField "String", "version", "\"bittube\""
|
||||
buildConfigField "boolean", "full_instances", "true"
|
||||
buildConfigField "boolean", "google_restriction", "true"
|
||||
buildConfigField "boolean", "surfing_mode", "false"
|
||||
buildConfigField "boolean", "sepia_search", "false"
|
||||
buildConfigField "boolean", "instance_switcher", "true"
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
sourceSets {
|
||||
fdroid_peertube_apps_educ {
|
||||
res.srcDirs = ['src/main/res', 'src/acad/res']
|
||||
java.srcDirs = ['src/main/java', 'src/acad/java']
|
||||
}
|
||||
google_peertube_apps_educ {
|
||||
res.srcDirs = ['src/main/res', 'src/acad/res']
|
||||
java.srcDirs = ['src/main/java', 'src/acad/java']
|
||||
}
|
||||
fdroid_full {
|
||||
res.srcDirs = ['src/main/res', 'src/full/res']
|
||||
java.srcDirs = ['src/main/java', 'src/full/java']
|
||||
}
|
||||
google_full {
|
||||
res.srcDirs = ['src/main/res', 'src/full/res']
|
||||
java.srcDirs = ['src/main/java', 'src/full/java']
|
||||
}
|
||||
queermotion {
|
||||
res.srcDirs = ['src/main/res', 'src/queermotion/res']
|
||||
java.srcDirs = ['src/main/java', 'src/full/java']
|
||||
}
|
||||
bittube {
|
||||
res.srcDirs = ['src/main/res', 'src/bittube/res']
|
||||
java.srcDirs = ['src/main/java', 'src/full/java']
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
allprojects {
|
||||
@ -37,33 +144,60 @@ allprojects {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
dependencies {
|
||||
implementation "androidx.multidex:multidex:2.0.1"
|
||||
implementation fileTree(dir: "libs", include: ["*.jar"])
|
||||
implementation 'androidx.appcompat:appcompat:1.2.0'
|
||||
implementation 'androidx.preference:preference:1.1.1'
|
||||
implementation 'com.google.android.material:material:1.2.0'
|
||||
implementation 'androidx.constraintlayout:constraintlayout:2.0.0'
|
||||
implementation 'com.google.android.material:material:1.2.1'
|
||||
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
|
||||
implementation 'androidx.vectordrawable:vectordrawable:1.1.0'
|
||||
implementation 'androidx.navigation:navigation-fragment:2.3.0'
|
||||
implementation 'androidx.navigation:navigation-fragment:2.3.2'
|
||||
implementation "androidx.fragment:fragment:1.2.5"
|
||||
implementation 'androidx.navigation:navigation-ui:2.3.0'
|
||||
implementation ("androidx.navigation:navigation-dynamic-features-fragment:2.3.0")
|
||||
implementation 'androidx.navigation:navigation-ui:2.3.2'
|
||||
implementation ("androidx.navigation:navigation-dynamic-features-fragment:2.3.2")
|
||||
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
|
||||
implementation 'androidx.browser:browser:1.2.0'
|
||||
testImplementation 'junit:junit:4.13'
|
||||
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
|
||||
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
|
||||
implementation 'androidx.browser:browser:1.3.0'
|
||||
implementation 'androidx.documentfile:documentfile:1.0.1'
|
||||
testImplementation 'junit:junit:4.13.1'
|
||||
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
|
||||
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
|
||||
|
||||
implementation 'androidx.localbroadcastmanager:localbroadcastmanager:1.0.0'
|
||||
implementation 'com.github.GrenderG:Toasty:1.4.2'
|
||||
implementation 'com.google.android.exoplayer:exoplayer:2.10.6'
|
||||
implementation 'com.google.android.exoplayer:exoplayer:2.12.1'
|
||||
implementation 'com.google.android.exoplayer:extension-mediasession:2.12.1'
|
||||
implementation "com.github.mabbas007:TagsEditText:1.0.5"
|
||||
implementation "com.github.bumptech.glide:glide:4.11.0"
|
||||
annotationProcessor "com.github.bumptech.glide:compiler:4.11.0"
|
||||
implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0"
|
||||
implementation 'org.apache.poi:poi:3.16'
|
||||
implementation "net.gotev:uploadservice:3.5.2"
|
||||
implementation "net.gotev:uploadservice-okhttp:3.5.2"
|
||||
implementation "net.gotev:uploadservice:4.5.1"
|
||||
implementation "net.gotev:uploadservice-okhttp:4.5.1"
|
||||
implementation "com.google.code.gson:gson:2.8.6"
|
||||
implementation 'androidx.media:media:1.2.1'
|
||||
implementation 'com.github.ybq:Android-SpinKit:1.4.0'
|
||||
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
|
||||
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
|
||||
implementation 'com.github.mancj:MaterialSearchBar:0.8.5'
|
||||
|
||||
implementation "com.github.TorrentStream:TorrentStream-Android:2.7.0"
|
||||
|
||||
implementation "io.github.kobakei:ratethisapp:1.2.0"
|
||||
implementation 'com.github.vkay94:DoubleTapPlayerView:1.0.0'
|
||||
|
||||
implementation "androidx.work:work-runtime:2.4.0"
|
||||
implementation "androidx.work:work-runtime-ktx:2.4.0"
|
||||
|
||||
//custom cast feature
|
||||
implementation 'jp.wasabeef:glide-transformations:4.0.0'
|
||||
implementation 'su.litvak.chromecast:api-v2:0.11.3'
|
||||
implementation 'com.fasterxml.jackson.core:jackson-core:2.12.0'
|
||||
implementation 'org.slf4j:slf4j-simple:1.7.30'
|
||||
|
||||
|
||||
fdroid_peertube_apps_educImplementation 'org.matomo.sdk:tracker:4.1.2'
|
||||
google_peertube_apps_educImplementation 'org.matomo.sdk:tracker:4.1.2'
|
||||
|
||||
|
||||
}
|
BIN
app/src/acad/ic_launcher-playstore.png
Normal file
After Width: | Height: | Size: 16 KiB |
@ -14,22 +14,22 @@ package app.fedilab.fedilabtube;
|
||||
* You should have received a copy of the GNU General Public License along with TubeLab; if not,
|
||||
* see <http://www.gnu.org/licenses>. */
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
import androidx.multidex.MultiDex;
|
||||
import androidx.multidex.MultiDexApplication;
|
||||
|
||||
import net.gotev.uploadservice.UploadService;
|
||||
|
||||
public class FedilabTube extends MultiDexApplication {
|
||||
@Override
|
||||
protected void attachBaseContext(Context base) {
|
||||
super.attachBaseContext(base);
|
||||
import org.matomo.sdk.Matomo;
|
||||
import org.matomo.sdk.Tracker;
|
||||
import org.matomo.sdk.TrackerBuilder;
|
||||
|
||||
MultiDex.install(FedilabTube.this);
|
||||
|
||||
UploadService.NAMESPACE = BuildConfig.APPLICATION_ID;
|
||||
|
||||
public class FedilabTube extends BaseFedilabTube {
|
||||
|
||||
private Tracker mMatomoTracker;
|
||||
|
||||
public synchronized Tracker getTracker() {
|
||||
if (mMatomoTracker != null) return mMatomoTracker;
|
||||
mMatomoTracker = TrackerBuilder.createDefault("https://wa.phm.education.gouv.fr/snp/matomo.php", 11).build(Matomo.getInstance(this));
|
||||
return mMatomoTracker;
|
||||
}
|
||||
|
||||
|
||||
}
|
47
app/src/acad/java/app/fedilab/fedilabtube/Matomo.java
Normal file
@ -0,0 +1,47 @@
|
||||
package app.fedilab.fedilabtube;
|
||||
/* Copyright 2020 Thomas Schneider
|
||||
*
|
||||
* This file is a part of TubeLab
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it under the terms of the
|
||||
* GNU General Public License as published by the Free Software Foundation; either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* TubeLab is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
|
||||
* the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
||||
* Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with TubeLab; if not,
|
||||
* see <http://www.gnu.org/licenses>. */
|
||||
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Context;
|
||||
|
||||
import org.matomo.sdk.Tracker;
|
||||
import org.matomo.sdk.extra.TrackHelper;
|
||||
|
||||
public class Matomo {
|
||||
|
||||
public static void sendScreen(Context _mcontext, String path, String title) {
|
||||
Tracker tracker = ((FedilabTube) ((Activity) _mcontext).getApplication()).getTracker();
|
||||
TrackHelper.track().screen(path).title(title).with(tracker);
|
||||
}
|
||||
|
||||
public static void sendEvent(Context _mcontext, String category, String action, String label, float value) {
|
||||
Tracker tracker = ((FedilabTube) ((Activity) _mcontext).getApplication()).getTracker();
|
||||
TrackHelper.track().event(category, action).name(label).value(value).with(tracker);
|
||||
}
|
||||
|
||||
|
||||
public static void sendValue(Context _mcontext, String path, int index, String dimensionValue) {
|
||||
Tracker tracker = ((FedilabTube) ((Activity) _mcontext).getApplication()).getTracker();
|
||||
TrackHelper.track().screen(path).dimension(index, dimensionValue).with(tracker);
|
||||
}
|
||||
|
||||
|
||||
public static void trackInstall(Context _mcontext) {
|
||||
Tracker tracker = ((FedilabTube) ((Activity) _mcontext).getApplication()).getTracker();
|
||||
TrackHelper.track().download().with(tracker);
|
||||
}
|
||||
}
|
7
app/src/acad/res/color/bottom_nav_color.xml
Normal file
@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item
|
||||
android:color="@color/colorAccent"
|
||||
android:state_checked="true" />
|
||||
<item android:color="@android:color/tab_indicator_text" />
|
||||
</selector>
|
@ -1,14 +1,14 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="108dp"
|
||||
android:height="108dp"
|
||||
android:tint="#9C27B0"
|
||||
android:viewportWidth="108"
|
||||
android:viewportHeight="108">
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:tint="#FFFFFF"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24">
|
||||
<group
|
||||
android:scaleX="2.61"
|
||||
android:scaleY="2.61"
|
||||
android:translateX="22.68"
|
||||
android:translateY="22.68">
|
||||
android:scaleX="1.104"
|
||||
android:scaleY="1.104"
|
||||
android:translateX="-1.248"
|
||||
android:translateY="-1.248">
|
||||
<path
|
||||
android:fillColor="@android:color/white"
|
||||
android:pathData="M10,16.5l6,-4.5 -6,-4.5v9zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8z" />
|
BIN
app/src/acad/res/drawable-hdpi/ic_notification_tubelab.png
Normal file
After Width: | Height: | Size: 720 B |
BIN
app/src/acad/res/drawable-mdpi/ic_notification_tubelab.png
Normal file
After Width: | Height: | Size: 491 B |
BIN
app/src/acad/res/drawable-xhdpi/ic_notification_tubelab.png
Normal file
After Width: | Height: | Size: 937 B |
BIN
app/src/acad/res/drawable-xxhdpi/ic_notification_tubelab.png
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
app/src/acad/res/drawable-xxxhdpi/ic_notification_tubelab.png
Normal file
After Width: | Height: | Size: 1.6 KiB |
21
app/src/acad/res/drawable/ic_launcher_foreground.xml
Normal file
@ -0,0 +1,21 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="108dp"
|
||||
android:height="108dp"
|
||||
android:viewportWidth="108"
|
||||
android:viewportHeight="108">
|
||||
<group
|
||||
android:scaleX="2.0409248"
|
||||
android:scaleY="2.0409248"
|
||||
android:translateX="19.44"
|
||||
android:translateY="19.44">
|
||||
<path
|
||||
android:fillColor="#502ca7"
|
||||
android:pathData="m0,0h33.867v33.867h-33.867z" />
|
||||
<path
|
||||
android:fillColor="#9a26ae"
|
||||
android:pathData="m15.544,29.459c-0.5613,-0.052 -1.8193,-0.2922 -2.5659,-0.49 -1.4544,-0.3854 -2.6614,-0.9423 -3.8833,-1.7918 -2.3102,-1.606 -3.8461,-3.928 -4.3943,-6.6437 -0.4789,-2.3721 -0.2362,-5.3562 0.6533,-8.0312 0.376,-1.131 0.7053,-1.8387 1.2806,-2.7519 0.9004,-1.4293 1.5877,-2.1804 2.8991,-3.1683 1.3049,-0.983 2.9258,-1.6476 4.88,-2.0009 0.8669,-0.1568 1.1303,-0.1748 2.5858,-0.1775 1.5249,-0.0027 1.6704,0.0078 2.465,0.1789 1.9969,0.43 3.3805,1.0324 4.9616,2.1602 1.8104,1.2913 3.1669,2.8519 4.0578,4.6681 0.896,1.8267 1.3075,3.6274 1.3075,5.7214 0,1.5759 -0.2607,3.1575 -0.7605,4.613 -0.8579,2.4986 -2.193,4.235 -4.4452,5.7811 -1.2142,0.8336 -2.9496,1.4792 -4.8751,1.8136 -0.6105,0.106 -3.4333,0.1862 -4.1663,0.1183zM19.42,26.9851c1.5946,-0.1757 3.0062,-0.5799 4.293,-1.2293 1.048,-0.5289 1.5517,-0.8781 2.271,-1.5743 0.9003,-0.8714 1.3979,-1.6179 1.8328,-2.7494 0.3399,-0.8845 0.4151,-1.1551 0.5267,-1.8953 0.3809,-2.5269 -0.4498,-6.1791 -1.8859,-8.291 -0.9544,-1.4038 -2.0586,-2.3755 -3.7036,-3.2592 -2.538,-1.3635 -6.6246,-1.6184 -9.6573,-0.6023 -1.2489,0.4185 -2.8043,1.4067 -3.6027,2.289 -0.7826,0.8649 -1.5925,2.2749 -1.9531,3.4007 -0.3872,1.2088 -0.4937,2.0043 -0.4947,3.695 -0.0008,1.3192 0.0189,1.6195 0.1484,2.2599 0.2029,1.0037 0.4086,1.6055 0.8491,2.4837 0.9265,1.8474 2.0961,3.1054 3.8624,4.1541 1.3723,0.8148 2.6611,1.2289 4.3987,1.4136 0.4192,0.0446 2.3964,-0.0157 3.1154,-0.0949z" />
|
||||
<path
|
||||
android:fillColor="#9a26ae"
|
||||
android:pathData="m14.648,11.972 l7.4433,4.9609 -7.4433,4.9609z" />
|
||||
</group>
|
||||
</vector>
|
BIN
app/src/acad/res/mipmap-hdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 1.7 KiB |
BIN
app/src/acad/res/mipmap-hdpi/ic_launcher_round.png
Normal file
After Width: | Height: | Size: 3.6 KiB |
BIN
app/src/acad/res/mipmap-mdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
app/src/acad/res/mipmap-mdpi/ic_launcher_round.png
Normal file
After Width: | Height: | Size: 2.2 KiB |
BIN
app/src/acad/res/mipmap-xhdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 2.3 KiB |
BIN
app/src/acad/res/mipmap-xhdpi/ic_launcher_round.png
Normal file
After Width: | Height: | Size: 5.1 KiB |
BIN
app/src/acad/res/mipmap-xxhdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 3.7 KiB |
BIN
app/src/acad/res/mipmap-xxhdpi/ic_launcher_round.png
Normal file
After Width: | Height: | Size: 8.1 KiB |
BIN
app/src/acad/res/mipmap-xxxhdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 5.0 KiB |
BIN
app/src/acad/res/mipmap-xxxhdpi/ic_launcher_round.png
Normal file
After Width: | Height: | Size: 12 KiB |
@ -4,8 +4,11 @@
|
||||
<color name="colorPrimaryDark">#4527A0</color>
|
||||
<color name="colorAccent">#9C27B0</color>
|
||||
|
||||
<color name="tag_color">#bbF2690D</color>
|
||||
<color name="tag_color_text">#FAFAFA</color>
|
||||
<color name="positive_thumbs">#2b90d9</color>
|
||||
<color name="negative_thumbs">#F44336</color>
|
||||
|
||||
<color name="backgroundDark">#DD000000</color>
|
||||
<color name="red_1">#F44336</color>
|
||||
<color name="gray_light">#80808080</color>
|
||||
</resources>
|
6
app/src/acad/res/xml/file_paths.xml
Normal file
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<paths>
|
||||
<external-path
|
||||
name="my_images"
|
||||
path="/TubeAcad/" />
|
||||
</paths>
|
BIN
app/src/bittube/ic_launcher-playstore.png
Normal file
After Width: | Height: | Size: 169 KiB |
5
app/src/bittube/res/color/bottom_nav_color.xml
Normal file
@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:color="@color/colorAccent" android:state_checked="true" />
|
||||
<item android:color="@android:color/tab_indicator_text" />
|
||||
</selector>
|
@ -0,0 +1,864 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:aapt="http://schemas.android.com/aapt"
|
||||
android:width="108dp"
|
||||
android:height="108dp"
|
||||
android:viewportWidth="108"
|
||||
android:viewportHeight="108">
|
||||
<group
|
||||
android:scaleX="0.66"
|
||||
android:scaleY="0.66"
|
||||
android:translateX="21"
|
||||
android:translateY="21">
|
||||
<path android:pathData="M85.355,14.645C75.91,5.201 63.354,0 50,0C36.644,0 24.088,5.201 14.645,14.645S0,36.644 0,50c0,13.357 5.201,25.913 14.645,35.355C24.087,94.799 36.643,100 50,100c13.357,0 25.913,-5.201 35.355,-14.645C94.799,75.912 100,63.356 100,50C100,36.646 94.799,24.09 85.355,14.645z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="15.7699"
|
||||
android:endY="86.8818"
|
||||
android:startX="83.2562"
|
||||
android:startY="14.1677"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FF28D1BC"
|
||||
android:offset="0" />
|
||||
<item
|
||||
android:color="#FF00ABFF"
|
||||
android:offset="0.6" />
|
||||
<item
|
||||
android:color="#FF2A5ED6"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path
|
||||
android:fillAlpha="0.71"
|
||||
android:pathData="M3.151,32.464L13.3,46.493L30.239,4.045c-5.75,2.474 -11.035,6.041 -15.595,10.6C9.504,19.786 5.623,25.851 3.151,32.464z"
|
||||
android:strokeAlpha="0.71">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="24.2938"
|
||||
android:endY="39.2239"
|
||||
android:startX="-4.1098"
|
||||
android:startY="-39.1612"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="0.5762" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path
|
||||
android:fillAlpha="0.71"
|
||||
android:pathData="M2.3,34.893c-1.5,4.8 -2.3,9.8 -2.3,15c0,2.8 0.2,5.5 0.7,8.2l7.8,10l36.878,-26.896L2.3,34.893z"
|
||||
android:strokeAlpha="0.71">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="26.5038"
|
||||
android:endY="54.332794"
|
||||
android:startX="-2.655"
|
||||
android:startY="33.41799"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="0.006" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path
|
||||
android:fillAlpha="0.71"
|
||||
android:pathData="M40.8,5.893l27.6,28.3l8.9,-26.2c-5.8,-3.8 -12.3,-6.3 -19.2,-7.4L40.8,5.893z"
|
||||
android:strokeAlpha="0.71">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="62.8149"
|
||||
android:endY="14.768093"
|
||||
android:startX="84.794"
|
||||
android:startY="0.65519285"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="0.0013" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path
|
||||
android:fillAlpha="0.71"
|
||||
android:pathData="M42.79,46.347l25.8,0.6l-27.6,-28.3z"
|
||||
android:strokeAlpha="0.71">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="45.013"
|
||||
android:endY="42.08"
|
||||
android:startX="59.9387"
|
||||
android:startY="27.9081"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="0" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path
|
||||
android:fillAlpha="0.71"
|
||||
android:pathData="M96.88,67.451C98.928,61.941 100,56.054 100,50c0,-0.202 -0.005,-0.402 -0.007,-0.604L68.806,34.399L96.88,67.451z"
|
||||
android:strokeAlpha="0.71">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="79.7008"
|
||||
android:endY="33.716"
|
||||
android:startX="107.2237"
|
||||
android:startY="81.6425"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="0.0029" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path
|
||||
android:fillAlpha="0.71"
|
||||
android:pathData="M27.8,15.893l17.4,11.8l3.7,-21.1z"
|
||||
android:strokeAlpha="0.71">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="48.8608"
|
||||
android:endY="17.1429"
|
||||
android:startX="27.8"
|
||||
android:startY="17.1429"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="8.440641E-4" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path
|
||||
android:fillAlpha="0.71"
|
||||
android:pathData="M97.976,35.848l-5.312,-1.255l3.7,24l3.329,-3.044C99.895,53.719 100,51.868 100,50C100,45.14 99.308,40.386 97.976,35.848z"
|
||||
android:strokeAlpha="0.71">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="93.5393"
|
||||
android:endY="46.7512"
|
||||
android:startX="101.8224"
|
||||
android:startY="45.4073"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="0.0017" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path
|
||||
android:fillAlpha="0.71"
|
||||
android:pathData="M72.998,85.447l2.742,7.442c2.87,-1.729 5.579,-3.761 8.092,-6.075L72.998,85.447z"
|
||||
android:strokeAlpha="0.71">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="77.1128"
|
||||
android:endY="79.7658"
|
||||
android:startX="81.8324"
|
||||
android:startY="102.8394"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="0.0013" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="0.9982" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path
|
||||
android:fillAlpha="0.71"
|
||||
android:pathData="M87.435,83.143c2.349,-2.646 4.393,-5.5 6.108,-8.522l-28.357,2.776L87.435,83.143z"
|
||||
android:strokeAlpha="0.71">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="65.4945"
|
||||
android:endY="79.3595"
|
||||
android:startX="123.109"
|
||||
android:startY="78.2586"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="0.0022" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="0.9966" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path
|
||||
android:fillAlpha="0.71"
|
||||
android:pathData="M72.9,85.193l-56.3,-11.1l7.2,18.4c1.6,1 3.3,1.9 5.1,2.7L72.9,85.193z"
|
||||
android:strokeAlpha="0.71">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="38.2047"
|
||||
android:endY="89.4249"
|
||||
android:startX="58.4365"
|
||||
android:startY="59.1884"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="0.0015" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path
|
||||
android:fillAlpha="0.71"
|
||||
android:pathData="M79.09,58.897l-21,1.5l10.3,18.9z"
|
||||
android:strokeAlpha="0.71">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="61.745285"
|
||||
android:endY="71.03565"
|
||||
android:startX="78.23818"
|
||||
android:startY="57.920563"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="0" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="0.9993" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<group>
|
||||
<clip-path android:pathData="M50,50m-50,0a50,50 0,1 1,100 0a50,50 0,1 1,-100 0" />
|
||||
<path android:pathData="M31.304,22.589v0.7c0,0.1 0,0.1 -0.1,0.2l-1.9,0.8c0,0 0,0 -0.1,0s0,0 -0.1,0l-0.4,-0.2l19.7,27l2.4,-1.7L31.304,22.589z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="50.7969"
|
||||
android:endY="36.839092"
|
||||
android:startX="28.7808"
|
||||
android:startY="36.839092"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="0.006" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path android:pathData="M65.409,20.005l-0.005,-1.116l-17,30.7l2.5,1.4l16.722,-30.026L65.409,20.005z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="48.3499"
|
||||
android:endY="34.939095"
|
||||
android:startX="67.5984"
|
||||
android:startY="34.939095"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="0.0013" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path android:pathData="M79.625,18.344l-0.021,-1.254l-31.3,32.1l2.1,2l31.2,-32L79.625,18.344z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="48.3039"
|
||||
android:endY="34.138992"
|
||||
android:startX="81.6039"
|
||||
android:startY="34.138992"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="7.851759E-5" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path android:pathData="M90.104,35.389c-0.1,0 -0.1,-0.1 -0.1,-0.2v-2l-41.1,15.7l1,2.7l41.3,-15.8L90.104,35.389z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="48.8205"
|
||||
android:endY="42.388992"
|
||||
android:startX="91.2039"
|
||||
android:startY="42.388992"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="0.0038" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path android:pathData="M11.804,27.989v1.8c0,0.1 -0.1,0.2 -0.1,0.2l-1.2,0.5l38.5,20.9l1.4,-2.6L11.804,27.989z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="50.3298"
|
||||
android:endY="39.689095"
|
||||
android:startX="10.4298"
|
||||
android:startY="39.689095"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="0.0025" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path android:pathData="M17.265,50.089c0.1,0 0.1,0.2 0.1,0.2v2.5c0,0.1 -0.1,0.2 -0.1,0.2l32.439,-1.3l-0.1,-2.9L17.265,50.089z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="49.6603"
|
||||
android:endY="50.888992"
|
||||
android:startX="17.2212"
|
||||
android:startY="50.888992"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="3.140703E-4" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path android:pathData="M7.668,60.675c0.036,0.014 0.234,0.056 0.236,0.214l0,0l0,0v1.9l42.1,-11.2l-0.9,-2.8l-42.8,11.4C6.304,60.189 7.632,60.661 7.668,60.675z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="50.0039"
|
||||
android:endY="55.789093"
|
||||
android:startX="6.304"
|
||||
android:startY="55.789093"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="0.0047" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path android:pathData="M33.904,62.147v1.942l16.7,-11.95l-1.8,-2.3L32.611,61.406L33.904,62.147z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="50.5851"
|
||||
android:endY="56.964092"
|
||||
android:startX="32.571"
|
||||
android:startY="56.964092"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="0.003" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path android:pathData="M35.804,35.789v1.2c0,0.1 -0.1,0.2 -0.1,0.2l-1.8,0.8l14.5,13.4l2,-2.1L35.804,35.789z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="50.3668"
|
||||
android:endY="43.589092"
|
||||
android:startX="33.8669"
|
||||
android:startY="43.589092"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="0.0048" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path android:pathData="M55.804,33.089C55.804,33.089 55.704,33.089 55.804,33.089c-0.1,0 -0.1,0 -0.2,0l-1.9,-0.8l0,0l-5.4,17.5l2.8,0.9l5.5,-17.9L55.804,33.089z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="48.2319"
|
||||
android:endY="41.489094"
|
||||
android:startX="56.5588"
|
||||
android:startY="41.489094"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="0" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path android:pathData="M64.804,45.489l-13.8,3.2l0.7,2.8l13.8,-3.2L64.804,45.489z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="50.9512"
|
||||
android:endY="48.489094"
|
||||
android:startX="65.4322"
|
||||
android:startY="48.489094"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="0.0032" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path android:pathData="M74.107,63.536L74.107,63.536L74.107,63.536c0,-0.098 0,-0.098 0.098,-0.195l0,0l0,0l0,0l1.172,-0.391L50.571,49.278l-1.367,2.441l24.903,13.77C74.107,65.489 74.107,63.536 74.107,63.536z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="49.2177"
|
||||
android:endY="57.3833"
|
||||
android:startX="75.4526"
|
||||
android:startY="57.3833"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="5.496231E-4" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path android:pathData="M81.904,79.089L81.904,79.089L81.904,79.089L81.904,79.089l2,-0.6c0,0 0,0 0.1,0l-33.7,-29.4l-1.9,2.2l33.3,29v-1C81.704,79.289 81.694,79.141 81.904,79.089z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="48.4039"
|
||||
android:endY="64.689095"
|
||||
android:startX="84.0039"
|
||||
android:startY="64.689095"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="0.0012" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path android:pathData="M54.404,79.689l2,-0.6h0.1l0.7,0.2l-6.2,-29.7l-2.8,0.6L54.404,79.689L54.404,79.689z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="48.1377"
|
||||
android:endY="64.63899"
|
||||
android:startX="57.3221"
|
||||
android:startY="64.63899"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="0.0025" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path android:pathData="M64.804,46.689l-15.6,2.1l0.4,2.9l30.2,-4.1l-0.4,-0.1c-0.1,0 -0.1,-0.1 -0.1,-0.2v-2.5l0,0l0,0l0,0L64.804,46.689">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="49.1732"
|
||||
android:endY="48.239094"
|
||||
android:startX="79.7731"
|
||||
android:startY="48.239094"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="0.003" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
</group>
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M51.639,0.029l-10.172,9.922l38.598,0.091"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M65.366,2.397L67.311,16.642"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M77.224,8.046L71.304,14.042"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M79.609,16.642L69.609,17.642"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M83.78,13.139L82.883,14.965"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M85.325,14.615c0.096,0.097 -3.374,29.468 -3.374,29.468"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M89.811,35.231L68.98,45.442"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M81.157,19.065L67.957,44.865"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M89.66,32.342l-48.193,-22.391l23.922,7.289"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M69.592,19.841L93.523,25.345"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M91.096,21.502L91.699,31.585"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M95.08,28.318L93.554,32.271"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M92.657,35.991L91.055,78.558"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M78.616,65.137L96.149,69.308"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M99.904,46.935L78.571,63.748"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M99.296,41.575c-0.585,0.17 -15.743,4.529 -15.743,4.529l16.414,5.629"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M99.766,54.87l-15.164,16.679l5.749,7.991"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M77.456,66.713L83.427,78.637"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M84.31,82.536L83.75,86.889"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M85.28,82.142L86.327,84.354"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M81.12,48.139l-4.73,14.382l-8.132,-14.106"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M79.18,45.887L68.951,46.291"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M79.305,47.596L17.837,88.283"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M54.335,79.846L33.835,64.846"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M65.137,48.23L16.967,87.533"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M75.145,66.556c-0.008,0.074 -16.683,13.266 -16.683,13.266"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M74.354,66.171L62.454,98.371"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M67.749,96.77L22.551,91.808"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M54.293,81.937L19.29,89.467"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M54.846,82.756l-18.767,15.187l48.523,-26.394"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M25.193,93.341L55.115,99.637"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M31.046,65.521L15.515,86.205"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M54.466,32.642L33.573,61.932"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M34.116,62.841L64.78,47.542"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M64.799,46.436L17.528,51.124"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M17.481,52.92L29.665,61.822"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M7.972,61.193L64.229,47.287"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M29.602,63.342L8.042,62.247"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M32.453,37.508L14.288,84.989"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M28.519,23.938L11.678,82.116"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M6.456,64.297L5.153,72.159"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M3.605,62.036L1.439,61.984"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M0.08,52.807L13.108,51.842"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M9.157,30.693L6.857,59.693"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M14.243,53.353L6.765,60.325"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M27.926,23.641L16.156,49.667"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M16.351,27.987L15.502,49.442"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M31.704,37.136L17.432,50.364"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M1.452,37.962L13.741,49.851"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M8.149,30.316L0.472,43.105"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M0.306,44.454L13.082,50.537"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M14.188,15.113L10.004,26.542"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M11.786,27.339L14.886,26.239"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M16.953,12.477L16.651,24.087"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M19.154,24.807L27.254,21.972"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M20.361,9.72L28.536,20.331"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M54.069,29.329L27.064,5.547"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M31.287,22.039L53.587,29.739"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M53.593,30.937L35.793,34.637"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M64.821,45.539L35.934,36.076"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="M81.802,15.419l-1.317,0.456l1.327,0.511l1.327,-0.511L81.802,15.419zM80.162,18.059l1.476,0.588v-1.92l-1.476,-0.588V18.059zM82.004,16.705v1.942l1.441,-0.584v-1.924L82.004,16.705z" />
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="M67.443,17.033l-1.317,0.456L67.453,18l1.327,-0.511L67.443,17.033zM65.804,19.673l1.476,0.588v-1.92l-1.476,-0.588V19.673zM67.646,18.319v1.942l1.441,-0.584v-1.924L67.646,18.319z" />
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="M55.737,29.211l-1.317,0.456l1.327,0.511l1.327,-0.511L55.737,29.211zM54.098,31.851l1.476,0.588v-1.92l-1.476,-0.588V31.851zM55.94,30.497v1.942l1.441,-0.584v-1.924L55.94,30.497z" />
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="M29.251,20.523l-1.317,0.456l1.327,0.511l1.327,-0.511L29.251,20.523zM27.611,23.164l1.476,0.588v-1.92l-1.476,-0.588V23.164zM29.453,21.81v1.942l1.441,-0.584v-1.924L29.453,21.81z" />
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="M15.227,49.775l-1.317,0.456l1.327,0.511l1.327,-0.511L15.227,49.775zM13.587,52.415l1.476,0.588v-1.92l-1.476,-0.588V52.415zM15.429,51.062v1.942l1.441,-0.584v-1.924L15.429,51.062z" />
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="M9.601,26.95l-1.317,0.456l1.327,0.511l1.327,-0.511L9.601,26.95zM7.962,29.59l1.476,0.588v-1.92L7.962,27.67V29.59zM9.804,28.236v1.942l1.441,-0.584V27.67L9.804,28.236z" />
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="M56.429,79.561l-1.317,0.456l1.327,0.511l1.327,-0.511L56.429,79.561zM54.79,82.201l1.476,0.588v-1.92l-1.476,-0.588V82.201zM56.632,80.847v1.942l1.441,-0.584v-1.924L56.632,80.847z" />
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="M33.602,34.175l-1.317,0.456l1.327,0.511l1.327,-0.511L33.602,34.175zM31.963,36.815l1.476,0.588v-1.92l-1.476,-0.588V36.815zM33.804,35.462v1.942l1.441,-0.584v-1.924L33.804,35.462z" />
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="M31.796,61.722l-1.317,0.456l1.327,0.511l1.327,-0.511L31.796,61.722zM30.156,64.362l1.476,0.588v-1.92l-1.476,-0.588V64.362zM31.998,63.009v1.942l1.441,-0.584v-1.924L31.998,63.009z" />
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="M83.96,79.141l-1.317,0.456l1.327,0.511l1.327,-0.511L83.96,79.141zM82.321,81.781l1.476,0.588v-1.92l-1.476,-0.588V81.781zM84.162,80.428v1.942l1.441,-0.584v-1.924L84.162,80.428z" />
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="M76.393,63.075l-1.317,0.456l1.327,0.511l1.327,-0.511L76.393,63.075zM74.754,65.715l1.476,0.588v-1.92l-1.476,-0.588V65.715zM76.596,64.362v1.942l1.441,-0.584v-1.924L76.596,64.362z" />
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="M81.202,44.475l-1.317,0.456l1.327,0.511l1.327,-0.511L81.202,44.475zM79.563,47.115l1.476,0.588v-1.92l-1.476,-0.588V47.115zM81.404,45.762v1.942l1.441,-0.584v-1.924L81.404,45.762z" />
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="M92.296,32.228l-1.317,0.456l1.327,0.511l1.327,-0.511L92.296,32.228zM90.656,34.868l1.476,0.588v-1.92l-1.476,-0.588V34.868zM92.498,33.515v1.942l1.441,-0.584v-1.924L92.498,33.515z" />
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="M5.806,60.518l-1.317,0.456l1.327,0.511l1.327,-0.511L5.806,60.518zM4.167,63.158l1.476,0.588v-1.92l-1.476,-0.588V63.158zM6.009,61.804v1.942l1.441,-0.584v-1.924L6.009,61.804z" />
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="M24.691,30.255c-0.615,0.788 -0.538,1.99 0.329,2.667c0.867,0.677 1.99,0.538 2.667,-0.329c6.397,-8.2 16.796,-12.263 27.125,-10.546c0.658,0.133 1.342,-0.095 1.773,-0.646c0.185,-0.237 0.29,-0.535 0.396,-0.833c0.088,-0.438 0.019,-1 -0.314,-1.386s-0.727,-0.694 -1.165,-0.782C43.638,16.373 31.949,20.952 24.691,30.255z" />
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="M71.1,47.4L41.3,29.2c-1,-0.5 -2.2,-0.5 -3.2,0.1s-1.6,1.6 -1.6,2.8v36.2c0,1.1 0.6,2.2 1.6,2.8c0.5,0.3 1.1,0.5 1.6,0.5s1.1,-0.1 1.6,-0.4L71.1,53c1,-0.6 1.6,-1.6 1.6,-2.8C72.7,49.1 72.1,48 71.1,47.4zM68.5,50.2L40.3,67.4V33L68.5,50.2z" />
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="M79.6,20.4C71.7,12.6 61.2,8.2 50,8.2s-21.7,4.3 -29.6,12.2C12.6,28.3 8.2,38.8 8.2,50s4.3,21.7 12.2,29.6S38.8,91.8 50,91.8s21.7,-4.3 29.6,-12.2S91.8,61.2 91.8,50S87.4,28.3 79.6,20.4zM88.1,50c0,10.2 -4,19.7 -11.2,26.9C69.7,84.1 60.2,88.1 50,88.1s-19.7,-4 -26.9,-11.2C15.9,69.7 11.9,60.2 11.9,50s4,-19.7 11.2,-26.9S39.9,11.9 50,11.9c10.2,0 19.7,4 26.9,11.2C84.1,30.3 88.1,39.8 88.1,50z" />
|
||||
</group>
|
||||
</vector>
|
||||
|
BIN
app/src/bittube/res/drawable-hdpi/ic_notification_tubelab.png
Normal file
After Width: | Height: | Size: 3.0 KiB |
BIN
app/src/bittube/res/drawable-mdpi/ic_notification_tubelab.png
Normal file
After Width: | Height: | Size: 1.5 KiB |
862
app/src/bittube/res/drawable-v24/ic_launcher_foreground.xml
Normal file
@ -0,0 +1,862 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:aapt="http://schemas.android.com/aapt"
|
||||
android:width="108dp"
|
||||
android:height="108dp"
|
||||
android:viewportWidth="108"
|
||||
android:viewportHeight="108">
|
||||
<group
|
||||
android:scaleX="0.66"
|
||||
android:scaleY="0.66"
|
||||
android:translateX="21"
|
||||
android:translateY="21">
|
||||
<path android:pathData="M85.355,14.645C75.91,5.201 63.354,0 50,0C36.644,0 24.088,5.201 14.645,14.645S0,36.644 0,50c0,13.357 5.201,25.913 14.645,35.355C24.087,94.799 36.643,100 50,100c13.357,0 25.913,-5.201 35.355,-14.645C94.799,75.912 100,63.356 100,50C100,36.646 94.799,24.09 85.355,14.645z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="15.7699"
|
||||
android:endY="86.8818"
|
||||
android:startX="83.2562"
|
||||
android:startY="14.1677"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FF28D1BC"
|
||||
android:offset="0" />
|
||||
<item
|
||||
android:color="#FF00ABFF"
|
||||
android:offset="0.6" />
|
||||
<item
|
||||
android:color="#FF2A5ED6"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path
|
||||
android:fillAlpha="0.71"
|
||||
android:pathData="M3.151,32.464L13.3,46.493L30.239,4.045c-5.75,2.474 -11.035,6.041 -15.595,10.6C9.504,19.786 5.623,25.851 3.151,32.464z"
|
||||
android:strokeAlpha="0.71">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="24.2938"
|
||||
android:endY="39.2239"
|
||||
android:startX="-4.1098"
|
||||
android:startY="-39.1612"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="0.5762" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path
|
||||
android:fillAlpha="0.71"
|
||||
android:pathData="M2.3,34.893c-1.5,4.8 -2.3,9.8 -2.3,15c0,2.8 0.2,5.5 0.7,8.2l7.8,10l36.878,-26.896L2.3,34.893z"
|
||||
android:strokeAlpha="0.71">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="26.5038"
|
||||
android:endY="54.332794"
|
||||
android:startX="-2.655"
|
||||
android:startY="33.41799"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="0.006" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path
|
||||
android:fillAlpha="0.71"
|
||||
android:pathData="M40.8,5.893l27.6,28.3l8.9,-26.2c-5.8,-3.8 -12.3,-6.3 -19.2,-7.4L40.8,5.893z"
|
||||
android:strokeAlpha="0.71">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="62.8149"
|
||||
android:endY="14.768093"
|
||||
android:startX="84.794"
|
||||
android:startY="0.65519285"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="0.0013" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path
|
||||
android:fillAlpha="0.71"
|
||||
android:pathData="M42.79,46.347l25.8,0.6l-27.6,-28.3z"
|
||||
android:strokeAlpha="0.71">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="45.013"
|
||||
android:endY="42.08"
|
||||
android:startX="59.9387"
|
||||
android:startY="27.9081"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="0" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path
|
||||
android:fillAlpha="0.71"
|
||||
android:pathData="M96.88,67.451C98.928,61.941 100,56.054 100,50c0,-0.202 -0.005,-0.402 -0.007,-0.604L68.806,34.399L96.88,67.451z"
|
||||
android:strokeAlpha="0.71">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="79.7008"
|
||||
android:endY="33.716"
|
||||
android:startX="107.2237"
|
||||
android:startY="81.6425"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="0.0029" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path
|
||||
android:fillAlpha="0.71"
|
||||
android:pathData="M27.8,15.893l17.4,11.8l3.7,-21.1z"
|
||||
android:strokeAlpha="0.71">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="48.8608"
|
||||
android:endY="17.1429"
|
||||
android:startX="27.8"
|
||||
android:startY="17.1429"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="8.440641E-4" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path
|
||||
android:fillAlpha="0.71"
|
||||
android:pathData="M97.976,35.848l-5.312,-1.255l3.7,24l3.329,-3.044C99.895,53.719 100,51.868 100,50C100,45.14 99.308,40.386 97.976,35.848z"
|
||||
android:strokeAlpha="0.71">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="93.5393"
|
||||
android:endY="46.7512"
|
||||
android:startX="101.8224"
|
||||
android:startY="45.4073"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="0.0017" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path
|
||||
android:fillAlpha="0.71"
|
||||
android:pathData="M72.998,85.447l2.742,7.442c2.87,-1.729 5.579,-3.761 8.092,-6.075L72.998,85.447z"
|
||||
android:strokeAlpha="0.71">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="77.1128"
|
||||
android:endY="79.7658"
|
||||
android:startX="81.8324"
|
||||
android:startY="102.8394"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="0.0013" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="0.9982" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path
|
||||
android:fillAlpha="0.71"
|
||||
android:pathData="M87.435,83.143c2.349,-2.646 4.393,-5.5 6.108,-8.522l-28.357,2.776L87.435,83.143z"
|
||||
android:strokeAlpha="0.71">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="65.4945"
|
||||
android:endY="79.3595"
|
||||
android:startX="123.109"
|
||||
android:startY="78.2586"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="0.0022" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="0.9966" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path
|
||||
android:fillAlpha="0.71"
|
||||
android:pathData="M72.9,85.193l-56.3,-11.1l7.2,18.4c1.6,1 3.3,1.9 5.1,2.7L72.9,85.193z"
|
||||
android:strokeAlpha="0.71">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="38.2047"
|
||||
android:endY="89.4249"
|
||||
android:startX="58.4365"
|
||||
android:startY="59.1884"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="0.0015" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path
|
||||
android:fillAlpha="0.71"
|
||||
android:pathData="M79.09,58.897l-21,1.5l10.3,18.9z"
|
||||
android:strokeAlpha="0.71">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="61.745285"
|
||||
android:endY="71.03565"
|
||||
android:startX="78.23818"
|
||||
android:startY="57.920563"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="0" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="0.9993" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<group>
|
||||
<clip-path android:pathData="M50,50m-50,0a50,50 0,1 1,100 0a50,50 0,1 1,-100 0" />
|
||||
<path android:pathData="M31.304,22.589v0.7c0,0.1 0,0.1 -0.1,0.2l-1.9,0.8c0,0 0,0 -0.1,0s0,0 -0.1,0l-0.4,-0.2l19.7,27l2.4,-1.7L31.304,22.589z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="50.7969"
|
||||
android:endY="36.839092"
|
||||
android:startX="28.7808"
|
||||
android:startY="36.839092"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="0.006" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path android:pathData="M65.409,20.005l-0.005,-1.116l-17,30.7l2.5,1.4l16.722,-30.026L65.409,20.005z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="48.3499"
|
||||
android:endY="34.939095"
|
||||
android:startX="67.5984"
|
||||
android:startY="34.939095"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="0.0013" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path android:pathData="M79.625,18.344l-0.021,-1.254l-31.3,32.1l2.1,2l31.2,-32L79.625,18.344z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="48.3039"
|
||||
android:endY="34.138992"
|
||||
android:startX="81.6039"
|
||||
android:startY="34.138992"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="7.851759E-5" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path android:pathData="M90.104,35.389c-0.1,0 -0.1,-0.1 -0.1,-0.2v-2l-41.1,15.7l1,2.7l41.3,-15.8L90.104,35.389z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="48.8205"
|
||||
android:endY="42.388992"
|
||||
android:startX="91.2039"
|
||||
android:startY="42.388992"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="0.0038" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path android:pathData="M11.804,27.989v1.8c0,0.1 -0.1,0.2 -0.1,0.2l-1.2,0.5l38.5,20.9l1.4,-2.6L11.804,27.989z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="50.3298"
|
||||
android:endY="39.689095"
|
||||
android:startX="10.4298"
|
||||
android:startY="39.689095"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="0.0025" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path android:pathData="M17.265,50.089c0.1,0 0.1,0.2 0.1,0.2v2.5c0,0.1 -0.1,0.2 -0.1,0.2l32.439,-1.3l-0.1,-2.9L17.265,50.089z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="49.6603"
|
||||
android:endY="50.888992"
|
||||
android:startX="17.2212"
|
||||
android:startY="50.888992"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="3.140703E-4" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path android:pathData="M7.668,60.675c0.036,0.014 0.234,0.056 0.236,0.214l0,0l0,0v1.9l42.1,-11.2l-0.9,-2.8l-42.8,11.4C6.304,60.189 7.632,60.661 7.668,60.675z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="50.0039"
|
||||
android:endY="55.789093"
|
||||
android:startX="6.304"
|
||||
android:startY="55.789093"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="0.0047" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path android:pathData="M33.904,62.147v1.942l16.7,-11.95l-1.8,-2.3L32.611,61.406L33.904,62.147z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="50.5851"
|
||||
android:endY="56.964092"
|
||||
android:startX="32.571"
|
||||
android:startY="56.964092"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="0.003" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path android:pathData="M35.804,35.789v1.2c0,0.1 -0.1,0.2 -0.1,0.2l-1.8,0.8l14.5,13.4l2,-2.1L35.804,35.789z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="50.3668"
|
||||
android:endY="43.589092"
|
||||
android:startX="33.8669"
|
||||
android:startY="43.589092"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="0.0048" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path android:pathData="M55.804,33.089C55.804,33.089 55.704,33.089 55.804,33.089c-0.1,0 -0.1,0 -0.2,0l-1.9,-0.8l0,0l-5.4,17.5l2.8,0.9l5.5,-17.9L55.804,33.089z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="48.2319"
|
||||
android:endY="41.489094"
|
||||
android:startX="56.5588"
|
||||
android:startY="41.489094"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="0" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path android:pathData="M64.804,45.489l-13.8,3.2l0.7,2.8l13.8,-3.2L64.804,45.489z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="50.9512"
|
||||
android:endY="48.489094"
|
||||
android:startX="65.4322"
|
||||
android:startY="48.489094"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="0.0032" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path android:pathData="M74.107,63.536L74.107,63.536L74.107,63.536c0,-0.098 0,-0.098 0.098,-0.195l0,0l0,0l0,0l1.172,-0.391L50.571,49.278l-1.367,2.441l24.903,13.77C74.107,65.489 74.107,63.536 74.107,63.536z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="49.2177"
|
||||
android:endY="57.3833"
|
||||
android:startX="75.4526"
|
||||
android:startY="57.3833"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="5.496231E-4" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path android:pathData="M81.904,79.089L81.904,79.089L81.904,79.089L81.904,79.089l2,-0.6c0,0 0,0 0.1,0l-33.7,-29.4l-1.9,2.2l33.3,29v-1C81.704,79.289 81.694,79.141 81.904,79.089z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="48.4039"
|
||||
android:endY="64.689095"
|
||||
android:startX="84.0039"
|
||||
android:startY="64.689095"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="0.0012" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path android:pathData="M54.404,79.689l2,-0.6h0.1l0.7,0.2l-6.2,-29.7l-2.8,0.6L54.404,79.689L54.404,79.689z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="48.1377"
|
||||
android:endY="64.63899"
|
||||
android:startX="57.3221"
|
||||
android:startY="64.63899"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="0.0025" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path android:pathData="M64.804,46.689l-15.6,2.1l0.4,2.9l30.2,-4.1l-0.4,-0.1c-0.1,0 -0.1,-0.1 -0.1,-0.2v-2.5l0,0l0,0l0,0L64.804,46.689">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="49.1732"
|
||||
android:endY="48.239094"
|
||||
android:startX="79.7731"
|
||||
android:startY="48.239094"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="0.003" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
</group>
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M51.639,0.029l-10.172,9.922l38.598,0.091"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M65.366,2.397L67.311,16.642"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M77.224,8.046L71.304,14.042"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M79.609,16.642L69.609,17.642"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M83.78,13.139L82.883,14.965"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M85.325,14.615c0.096,0.097 -3.374,29.468 -3.374,29.468"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M89.811,35.231L68.98,45.442"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M81.157,19.065L67.957,44.865"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M89.66,32.342l-48.193,-22.391l23.922,7.289"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M69.592,19.841L93.523,25.345"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M91.096,21.502L91.699,31.585"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M95.08,28.318L93.554,32.271"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M92.657,35.991L91.055,78.558"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M78.616,65.137L96.149,69.308"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M99.904,46.935L78.571,63.748"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M99.296,41.575c-0.585,0.17 -15.743,4.529 -15.743,4.529l16.414,5.629"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M99.766,54.87l-15.164,16.679l5.749,7.991"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M77.456,66.713L83.427,78.637"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M84.31,82.536L83.75,86.889"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M85.28,82.142L86.327,84.354"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M81.12,48.139l-4.73,14.382l-8.132,-14.106"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M79.18,45.887L68.951,46.291"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M79.305,47.596L17.837,88.283"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M54.335,79.846L33.835,64.846"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M65.137,48.23L16.967,87.533"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M75.145,66.556c-0.008,0.074 -16.683,13.266 -16.683,13.266"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M74.354,66.171L62.454,98.371"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M67.749,96.77L22.551,91.808"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M54.293,81.937L19.29,89.467"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M54.846,82.756l-18.767,15.187l48.523,-26.394"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M25.193,93.341L55.115,99.637"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M31.046,65.521L15.515,86.205"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M54.466,32.642L33.573,61.932"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M34.116,62.841L64.78,47.542"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M64.799,46.436L17.528,51.124"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M17.481,52.92L29.665,61.822"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M7.972,61.193L64.229,47.287"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M29.602,63.342L8.042,62.247"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M32.453,37.508L14.288,84.989"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M28.519,23.938L11.678,82.116"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M6.456,64.297L5.153,72.159"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M3.605,62.036L1.439,61.984"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M0.08,52.807L13.108,51.842"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M9.157,30.693L6.857,59.693"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M14.243,53.353L6.765,60.325"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M27.926,23.641L16.156,49.667"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M16.351,27.987L15.502,49.442"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M31.704,37.136L17.432,50.364"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M1.452,37.962L13.741,49.851"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M8.149,30.316L0.472,43.105"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M0.306,44.454L13.082,50.537"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M14.188,15.113L10.004,26.542"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M11.786,27.339L14.886,26.239"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M16.953,12.477L16.651,24.087"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M19.154,24.807L27.254,21.972"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M20.361,9.72L28.536,20.331"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M54.069,29.329L27.064,5.547"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M31.287,22.039L53.587,29.739"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M53.593,30.937L35.793,34.637"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M64.821,45.539L35.934,36.076"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="M81.802,15.419l-1.317,0.456l1.327,0.511l1.327,-0.511L81.802,15.419zM80.162,18.059l1.476,0.588v-1.92l-1.476,-0.588V18.059zM82.004,16.705v1.942l1.441,-0.584v-1.924L82.004,16.705z" />
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="M67.443,17.033l-1.317,0.456L67.453,18l1.327,-0.511L67.443,17.033zM65.804,19.673l1.476,0.588v-1.92l-1.476,-0.588V19.673zM67.646,18.319v1.942l1.441,-0.584v-1.924L67.646,18.319z" />
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="M55.737,29.211l-1.317,0.456l1.327,0.511l1.327,-0.511L55.737,29.211zM54.098,31.851l1.476,0.588v-1.92l-1.476,-0.588V31.851zM55.94,30.497v1.942l1.441,-0.584v-1.924L55.94,30.497z" />
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="M29.251,20.523l-1.317,0.456l1.327,0.511l1.327,-0.511L29.251,20.523zM27.611,23.164l1.476,0.588v-1.92l-1.476,-0.588V23.164zM29.453,21.81v1.942l1.441,-0.584v-1.924L29.453,21.81z" />
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="M15.227,49.775l-1.317,0.456l1.327,0.511l1.327,-0.511L15.227,49.775zM13.587,52.415l1.476,0.588v-1.92l-1.476,-0.588V52.415zM15.429,51.062v1.942l1.441,-0.584v-1.924L15.429,51.062z" />
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="M9.601,26.95l-1.317,0.456l1.327,0.511l1.327,-0.511L9.601,26.95zM7.962,29.59l1.476,0.588v-1.92L7.962,27.67V29.59zM9.804,28.236v1.942l1.441,-0.584V27.67L9.804,28.236z" />
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="M56.429,79.561l-1.317,0.456l1.327,0.511l1.327,-0.511L56.429,79.561zM54.79,82.201l1.476,0.588v-1.92l-1.476,-0.588V82.201zM56.632,80.847v1.942l1.441,-0.584v-1.924L56.632,80.847z" />
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="M33.602,34.175l-1.317,0.456l1.327,0.511l1.327,-0.511L33.602,34.175zM31.963,36.815l1.476,0.588v-1.92l-1.476,-0.588V36.815zM33.804,35.462v1.942l1.441,-0.584v-1.924L33.804,35.462z" />
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="M31.796,61.722l-1.317,0.456l1.327,0.511l1.327,-0.511L31.796,61.722zM30.156,64.362l1.476,0.588v-1.92l-1.476,-0.588V64.362zM31.998,63.009v1.942l1.441,-0.584v-1.924L31.998,63.009z" />
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="M83.96,79.141l-1.317,0.456l1.327,0.511l1.327,-0.511L83.96,79.141zM82.321,81.781l1.476,0.588v-1.92l-1.476,-0.588V81.781zM84.162,80.428v1.942l1.441,-0.584v-1.924L84.162,80.428z" />
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="M76.393,63.075l-1.317,0.456l1.327,0.511l1.327,-0.511L76.393,63.075zM74.754,65.715l1.476,0.588v-1.92l-1.476,-0.588V65.715zM76.596,64.362v1.942l1.441,-0.584v-1.924L76.596,64.362z" />
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="M81.202,44.475l-1.317,0.456l1.327,0.511l1.327,-0.511L81.202,44.475zM79.563,47.115l1.476,0.588v-1.92l-1.476,-0.588V47.115zM81.404,45.762v1.942l1.441,-0.584v-1.924L81.404,45.762z" />
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="M92.296,32.228l-1.317,0.456l1.327,0.511l1.327,-0.511L92.296,32.228zM90.656,34.868l1.476,0.588v-1.92l-1.476,-0.588V34.868zM92.498,33.515v1.942l1.441,-0.584v-1.924L92.498,33.515z" />
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="M5.806,60.518l-1.317,0.456l1.327,0.511l1.327,-0.511L5.806,60.518zM4.167,63.158l1.476,0.588v-1.92l-1.476,-0.588V63.158zM6.009,61.804v1.942l1.441,-0.584v-1.924L6.009,61.804z" />
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="M24.691,30.255c-0.615,0.788 -0.538,1.99 0.329,2.667c0.867,0.677 1.99,0.538 2.667,-0.329c6.397,-8.2 16.796,-12.263 27.125,-10.546c0.658,0.133 1.342,-0.095 1.773,-0.646c0.185,-0.237 0.29,-0.535 0.396,-0.833c0.088,-0.438 0.019,-1 -0.314,-1.386s-0.727,-0.694 -1.165,-0.782C43.638,16.373 31.949,20.952 24.691,30.255z" />
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="M71.1,47.4L41.3,29.2c-1,-0.5 -2.2,-0.5 -3.2,0.1s-1.6,1.6 -1.6,2.8v36.2c0,1.1 0.6,2.2 1.6,2.8c0.5,0.3 1.1,0.5 1.6,0.5s1.1,-0.1 1.6,-0.4L71.1,53c1,-0.6 1.6,-1.6 1.6,-2.8C72.7,49.1 72.1,48 71.1,47.4zM68.5,50.2L40.3,67.4V33L68.5,50.2z" />
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="M79.6,20.4C71.7,12.6 61.2,8.2 50,8.2s-21.7,4.3 -29.6,12.2C12.6,28.3 8.2,38.8 8.2,50s4.3,21.7 12.2,29.6S38.8,91.8 50,91.8s21.7,-4.3 29.6,-12.2S91.8,61.2 91.8,50S87.4,28.3 79.6,20.4zM88.1,50c0,10.2 -4,19.7 -11.2,26.9C69.7,84.1 60.2,88.1 50,88.1s-19.7,-4 -26.9,-11.2C15.9,69.7 11.9,60.2 11.9,50s4,-19.7 11.2,-26.9S39.9,11.9 50,11.9c10.2,0 19.7,4 26.9,11.2C84.1,30.3 88.1,39.8 88.1,50z" />
|
||||
</group>
|
||||
</vector>
|
BIN
app/src/bittube/res/drawable-xhdpi/ic_notification_tubelab.png
Normal file
After Width: | Height: | Size: 4.7 KiB |
BIN
app/src/bittube/res/drawable-xxhdpi/ic_notification_tubelab.png
Normal file
After Width: | Height: | Size: 8.7 KiB |
BIN
app/src/bittube/res/drawable-xxxhdpi/ic_notification_tubelab.png
Normal file
After Width: | Height: | Size: 9.2 KiB |
856
app/src/bittube/res/drawable/bittube.xml
Normal file
@ -0,0 +1,856 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:aapt="http://schemas.android.com/aapt"
|
||||
android:width="100dp"
|
||||
android:height="100dp"
|
||||
android:viewportWidth="100"
|
||||
android:viewportHeight="100">
|
||||
<path android:pathData="M85.355,14.645C75.91,5.201 63.354,0 50,0C36.644,0 24.088,5.201 14.645,14.645S0,36.644 0,50c0,13.357 5.201,25.913 14.645,35.355C24.087,94.799 36.643,100 50,100c13.357,0 25.913,-5.201 35.355,-14.645C94.799,75.912 100,63.356 100,50C100,36.646 94.799,24.09 85.355,14.645z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="15.7699"
|
||||
android:endY="86.8818"
|
||||
android:startX="83.2562"
|
||||
android:startY="14.1677"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FF28D1BC"
|
||||
android:offset="0" />
|
||||
<item
|
||||
android:color="#FF00ABFF"
|
||||
android:offset="0.6" />
|
||||
<item
|
||||
android:color="#FF2A5ED6"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path
|
||||
android:fillAlpha="0.71"
|
||||
android:pathData="M3.151,32.464L13.3,46.493L30.239,4.045c-5.75,2.474 -11.035,6.041 -15.595,10.6C9.504,19.786 5.623,25.851 3.151,32.464z"
|
||||
android:strokeAlpha="0.71">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="24.2938"
|
||||
android:endY="39.2239"
|
||||
android:startX="-4.1098"
|
||||
android:startY="-39.1612"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="0.5762" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path
|
||||
android:fillAlpha="0.71"
|
||||
android:pathData="M2.3,34.893c-1.5,4.8 -2.3,9.8 -2.3,15c0,2.8 0.2,5.5 0.7,8.2l7.8,10l36.878,-26.896L2.3,34.893z"
|
||||
android:strokeAlpha="0.71">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="26.5038"
|
||||
android:endY="54.332794"
|
||||
android:startX="-2.655"
|
||||
android:startY="33.41799"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="0.006" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path
|
||||
android:fillAlpha="0.71"
|
||||
android:pathData="M40.8,5.893l27.6,28.3l8.9,-26.2c-5.8,-3.8 -12.3,-6.3 -19.2,-7.4L40.8,5.893z"
|
||||
android:strokeAlpha="0.71">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="62.8149"
|
||||
android:endY="14.768093"
|
||||
android:startX="84.794"
|
||||
android:startY="0.65519285"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="0.0013" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path
|
||||
android:fillAlpha="0.71"
|
||||
android:pathData="M42.79,46.347l25.8,0.6l-27.6,-28.3z"
|
||||
android:strokeAlpha="0.71">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="45.013"
|
||||
android:endY="42.08"
|
||||
android:startX="59.9387"
|
||||
android:startY="27.9081"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="0" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path
|
||||
android:fillAlpha="0.71"
|
||||
android:pathData="M96.88,67.451C98.928,61.941 100,56.054 100,50c0,-0.202 -0.005,-0.402 -0.007,-0.604L68.806,34.399L96.88,67.451z"
|
||||
android:strokeAlpha="0.71">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="79.7008"
|
||||
android:endY="33.716"
|
||||
android:startX="107.2237"
|
||||
android:startY="81.6425"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="0.0029" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path
|
||||
android:fillAlpha="0.71"
|
||||
android:pathData="M27.8,15.893l17.4,11.8l3.7,-21.1z"
|
||||
android:strokeAlpha="0.71">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="48.8608"
|
||||
android:endY="17.1429"
|
||||
android:startX="27.8"
|
||||
android:startY="17.1429"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="8.440641E-4" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path
|
||||
android:fillAlpha="0.71"
|
||||
android:pathData="M97.976,35.848l-5.312,-1.255l3.7,24l3.329,-3.044C99.895,53.719 100,51.868 100,50C100,45.14 99.308,40.386 97.976,35.848z"
|
||||
android:strokeAlpha="0.71">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="93.5393"
|
||||
android:endY="46.7512"
|
||||
android:startX="101.8224"
|
||||
android:startY="45.4073"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="0.0017" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path
|
||||
android:fillAlpha="0.71"
|
||||
android:pathData="M72.998,85.447l2.742,7.442c2.87,-1.729 5.579,-3.761 8.092,-6.075L72.998,85.447z"
|
||||
android:strokeAlpha="0.71">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="77.1128"
|
||||
android:endY="79.7658"
|
||||
android:startX="81.8324"
|
||||
android:startY="102.8394"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="0.0013" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="0.9982" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path
|
||||
android:fillAlpha="0.71"
|
||||
android:pathData="M87.435,83.143c2.349,-2.646 4.393,-5.5 6.108,-8.522l-28.357,2.776L87.435,83.143z"
|
||||
android:strokeAlpha="0.71">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="65.4945"
|
||||
android:endY="79.3595"
|
||||
android:startX="123.109"
|
||||
android:startY="78.2586"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="0.0022" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="0.9966" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path
|
||||
android:fillAlpha="0.71"
|
||||
android:pathData="M72.9,85.193l-56.3,-11.1l7.2,18.4c1.6,1 3.3,1.9 5.1,2.7L72.9,85.193z"
|
||||
android:strokeAlpha="0.71">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="38.2047"
|
||||
android:endY="89.4249"
|
||||
android:startX="58.4365"
|
||||
android:startY="59.1884"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="0.0015" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path
|
||||
android:fillAlpha="0.71"
|
||||
android:pathData="M79.09,58.897l-21,1.5l10.3,18.9z"
|
||||
android:strokeAlpha="0.71">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="61.745285"
|
||||
android:endY="71.03565"
|
||||
android:startX="78.23818"
|
||||
android:startY="57.920563"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="0" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="0.9993" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<group>
|
||||
<clip-path android:pathData="M50,50m-50,0a50,50 0,1 1,100 0a50,50 0,1 1,-100 0" />
|
||||
<path android:pathData="M31.304,22.589v0.7c0,0.1 0,0.1 -0.1,0.2l-1.9,0.8c0,0 0,0 -0.1,0s0,0 -0.1,0l-0.4,-0.2l19.7,27l2.4,-1.7L31.304,22.589z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="50.7969"
|
||||
android:endY="36.839092"
|
||||
android:startX="28.7808"
|
||||
android:startY="36.839092"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="0.006" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path android:pathData="M65.409,20.005l-0.005,-1.116l-17,30.7l2.5,1.4l16.722,-30.026L65.409,20.005z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="48.3499"
|
||||
android:endY="34.939095"
|
||||
android:startX="67.5984"
|
||||
android:startY="34.939095"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="0.0013" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path android:pathData="M79.625,18.344l-0.021,-1.254l-31.3,32.1l2.1,2l31.2,-32L79.625,18.344z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="48.3039"
|
||||
android:endY="34.138992"
|
||||
android:startX="81.6039"
|
||||
android:startY="34.138992"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="7.851759E-5" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path android:pathData="M90.104,35.389c-0.1,0 -0.1,-0.1 -0.1,-0.2v-2l-41.1,15.7l1,2.7l41.3,-15.8L90.104,35.389z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="48.8205"
|
||||
android:endY="42.388992"
|
||||
android:startX="91.2039"
|
||||
android:startY="42.388992"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="0.0038" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path android:pathData="M11.804,27.989v1.8c0,0.1 -0.1,0.2 -0.1,0.2l-1.2,0.5l38.5,20.9l1.4,-2.6L11.804,27.989z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="50.3298"
|
||||
android:endY="39.689095"
|
||||
android:startX="10.4298"
|
||||
android:startY="39.689095"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="0.0025" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path android:pathData="M17.265,50.089c0.1,0 0.1,0.2 0.1,0.2v2.5c0,0.1 -0.1,0.2 -0.1,0.2l32.439,-1.3l-0.1,-2.9L17.265,50.089z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="49.6603"
|
||||
android:endY="50.888992"
|
||||
android:startX="17.2212"
|
||||
android:startY="50.888992"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="3.140703E-4" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path android:pathData="M7.668,60.675c0.036,0.014 0.234,0.056 0.236,0.214l0,0l0,0v1.9l42.1,-11.2l-0.9,-2.8l-42.8,11.4C6.304,60.189 7.632,60.661 7.668,60.675z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="50.0039"
|
||||
android:endY="55.789093"
|
||||
android:startX="6.304"
|
||||
android:startY="55.789093"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="0.0047" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path android:pathData="M33.904,62.147v1.942l16.7,-11.95l-1.8,-2.3L32.611,61.406L33.904,62.147z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="50.5851"
|
||||
android:endY="56.964092"
|
||||
android:startX="32.571"
|
||||
android:startY="56.964092"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="0.003" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path android:pathData="M35.804,35.789v1.2c0,0.1 -0.1,0.2 -0.1,0.2l-1.8,0.8l14.5,13.4l2,-2.1L35.804,35.789z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="50.3668"
|
||||
android:endY="43.589092"
|
||||
android:startX="33.8669"
|
||||
android:startY="43.589092"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="0.0048" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path android:pathData="M55.804,33.089C55.804,33.089 55.704,33.089 55.804,33.089c-0.1,0 -0.1,0 -0.2,0l-1.9,-0.8l0,0l-5.4,17.5l2.8,0.9l5.5,-17.9L55.804,33.089z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="48.2319"
|
||||
android:endY="41.489094"
|
||||
android:startX="56.5588"
|
||||
android:startY="41.489094"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="0" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path android:pathData="M64.804,45.489l-13.8,3.2l0.7,2.8l13.8,-3.2L64.804,45.489z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="50.9512"
|
||||
android:endY="48.489094"
|
||||
android:startX="65.4322"
|
||||
android:startY="48.489094"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="0.0032" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path android:pathData="M74.107,63.536L74.107,63.536L74.107,63.536c0,-0.098 0,-0.098 0.098,-0.195l0,0l0,0l0,0l1.172,-0.391L50.571,49.278l-1.367,2.441l24.903,13.77C74.107,65.489 74.107,63.536 74.107,63.536z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="49.2177"
|
||||
android:endY="57.3833"
|
||||
android:startX="75.4526"
|
||||
android:startY="57.3833"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="5.496231E-4" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path android:pathData="M81.904,79.089L81.904,79.089L81.904,79.089L81.904,79.089l2,-0.6c0,0 0,0 0.1,0l-33.7,-29.4l-1.9,2.2l33.3,29v-1C81.704,79.289 81.694,79.141 81.904,79.089z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="48.4039"
|
||||
android:endY="64.689095"
|
||||
android:startX="84.0039"
|
||||
android:startY="64.689095"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="0.0012" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path android:pathData="M54.404,79.689l2,-0.6h0.1l0.7,0.2l-6.2,-29.7l-2.8,0.6L54.404,79.689L54.404,79.689z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="48.1377"
|
||||
android:endY="64.63899"
|
||||
android:startX="57.3221"
|
||||
android:startY="64.63899"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="0.0025" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path android:pathData="M64.804,46.689l-15.6,2.1l0.4,2.9l30.2,-4.1l-0.4,-0.1c-0.1,0 -0.1,-0.1 -0.1,-0.2v-2.5l0,0l0,0l0,0L64.804,46.689">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="49.1732"
|
||||
android:endY="48.239094"
|
||||
android:startX="79.7731"
|
||||
android:startY="48.239094"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFFFFFFF"
|
||||
android:offset="0.003" />
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
</group>
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M51.639,0.029l-10.172,9.922l38.598,0.091"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M65.366,2.397L67.311,16.642"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M77.224,8.046L71.304,14.042"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M79.609,16.642L69.609,17.642"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M83.78,13.139L82.883,14.965"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M85.325,14.615c0.096,0.097 -3.374,29.468 -3.374,29.468"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M89.811,35.231L68.98,45.442"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M81.157,19.065L67.957,44.865"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M89.66,32.342l-48.193,-22.391l23.922,7.289"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M69.592,19.841L93.523,25.345"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M91.096,21.502L91.699,31.585"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M95.08,28.318L93.554,32.271"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M92.657,35.991L91.055,78.558"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M78.616,65.137L96.149,69.308"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M99.904,46.935L78.571,63.748"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M99.296,41.575c-0.585,0.17 -15.743,4.529 -15.743,4.529l16.414,5.629"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M99.766,54.87l-15.164,16.679l5.749,7.991"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M77.456,66.713L83.427,78.637"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M84.31,82.536L83.75,86.889"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M85.28,82.142L86.327,84.354"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M81.12,48.139l-4.73,14.382l-8.132,-14.106"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M79.18,45.887L68.951,46.291"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M79.305,47.596L17.837,88.283"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M54.335,79.846L33.835,64.846"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M65.137,48.23L16.967,87.533"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M75.145,66.556c-0.008,0.074 -16.683,13.266 -16.683,13.266"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M74.354,66.171L62.454,98.371"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M67.749,96.77L22.551,91.808"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M54.293,81.937L19.29,89.467"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M54.846,82.756l-18.767,15.187l48.523,-26.394"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M25.193,93.341L55.115,99.637"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M31.046,65.521L15.515,86.205"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M54.466,32.642L33.573,61.932"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M34.116,62.841L64.78,47.542"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M64.799,46.436L17.528,51.124"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M17.481,52.92L29.665,61.822"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M7.972,61.193L64.229,47.287"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M29.602,63.342L8.042,62.247"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M32.453,37.508L14.288,84.989"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M28.519,23.938L11.678,82.116"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M6.456,64.297L5.153,72.159"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M3.605,62.036L1.439,61.984"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M0.08,52.807L13.108,51.842"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M9.157,30.693L6.857,59.693"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M14.243,53.353L6.765,60.325"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M27.926,23.641L16.156,49.667"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M16.351,27.987L15.502,49.442"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M31.704,37.136L17.432,50.364"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M1.452,37.962L13.741,49.851"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M8.149,30.316L0.472,43.105"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M0.306,44.454L13.082,50.537"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M14.188,15.113L10.004,26.542"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M11.786,27.339L14.886,26.239"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M16.953,12.477L16.651,24.087"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M19.154,24.807L27.254,21.972"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M20.361,9.72L28.536,20.331"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M54.069,29.329L27.064,5.547"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M31.287,22.039L53.587,29.739"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M53.593,30.937L35.793,34.637"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillAlpha="0.6"
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M64.821,45.539L35.934,36.076"
|
||||
android:strokeAlpha="0.6" />
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="M81.802,15.419l-1.317,0.456l1.327,0.511l1.327,-0.511L81.802,15.419zM80.162,18.059l1.476,0.588v-1.92l-1.476,-0.588V18.059zM82.004,16.705v1.942l1.441,-0.584v-1.924L82.004,16.705z" />
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="M67.443,17.033l-1.317,0.456L67.453,18l1.327,-0.511L67.443,17.033zM65.804,19.673l1.476,0.588v-1.92l-1.476,-0.588V19.673zM67.646,18.319v1.942l1.441,-0.584v-1.924L67.646,18.319z" />
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="M55.737,29.211l-1.317,0.456l1.327,0.511l1.327,-0.511L55.737,29.211zM54.098,31.851l1.476,0.588v-1.92l-1.476,-0.588V31.851zM55.94,30.497v1.942l1.441,-0.584v-1.924L55.94,30.497z" />
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="M29.251,20.523l-1.317,0.456l1.327,0.511l1.327,-0.511L29.251,20.523zM27.611,23.164l1.476,0.588v-1.92l-1.476,-0.588V23.164zM29.453,21.81v1.942l1.441,-0.584v-1.924L29.453,21.81z" />
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="M15.227,49.775l-1.317,0.456l1.327,0.511l1.327,-0.511L15.227,49.775zM13.587,52.415l1.476,0.588v-1.92l-1.476,-0.588V52.415zM15.429,51.062v1.942l1.441,-0.584v-1.924L15.429,51.062z" />
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="M9.601,26.95l-1.317,0.456l1.327,0.511l1.327,-0.511L9.601,26.95zM7.962,29.59l1.476,0.588v-1.92L7.962,27.67V29.59zM9.804,28.236v1.942l1.441,-0.584V27.67L9.804,28.236z" />
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="M56.429,79.561l-1.317,0.456l1.327,0.511l1.327,-0.511L56.429,79.561zM54.79,82.201l1.476,0.588v-1.92l-1.476,-0.588V82.201zM56.632,80.847v1.942l1.441,-0.584v-1.924L56.632,80.847z" />
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="M33.602,34.175l-1.317,0.456l1.327,0.511l1.327,-0.511L33.602,34.175zM31.963,36.815l1.476,0.588v-1.92l-1.476,-0.588V36.815zM33.804,35.462v1.942l1.441,-0.584v-1.924L33.804,35.462z" />
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="M31.796,61.722l-1.317,0.456l1.327,0.511l1.327,-0.511L31.796,61.722zM30.156,64.362l1.476,0.588v-1.92l-1.476,-0.588V64.362zM31.998,63.009v1.942l1.441,-0.584v-1.924L31.998,63.009z" />
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="M83.96,79.141l-1.317,0.456l1.327,0.511l1.327,-0.511L83.96,79.141zM82.321,81.781l1.476,0.588v-1.92l-1.476,-0.588V81.781zM84.162,80.428v1.942l1.441,-0.584v-1.924L84.162,80.428z" />
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="M76.393,63.075l-1.317,0.456l1.327,0.511l1.327,-0.511L76.393,63.075zM74.754,65.715l1.476,0.588v-1.92l-1.476,-0.588V65.715zM76.596,64.362v1.942l1.441,-0.584v-1.924L76.596,64.362z" />
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="M81.202,44.475l-1.317,0.456l1.327,0.511l1.327,-0.511L81.202,44.475zM79.563,47.115l1.476,0.588v-1.92l-1.476,-0.588V47.115zM81.404,45.762v1.942l1.441,-0.584v-1.924L81.404,45.762z" />
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="M92.296,32.228l-1.317,0.456l1.327,0.511l1.327,-0.511L92.296,32.228zM90.656,34.868l1.476,0.588v-1.92l-1.476,-0.588V34.868zM92.498,33.515v1.942l1.441,-0.584v-1.924L92.498,33.515z" />
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="M5.806,60.518l-1.317,0.456l1.327,0.511l1.327,-0.511L5.806,60.518zM4.167,63.158l1.476,0.588v-1.92l-1.476,-0.588V63.158zM6.009,61.804v1.942l1.441,-0.584v-1.924L6.009,61.804z" />
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="M24.691,30.255c-0.615,0.788 -0.538,1.99 0.329,2.667c0.867,0.677 1.99,0.538 2.667,-0.329c6.397,-8.2 16.796,-12.263 27.125,-10.546c0.658,0.133 1.342,-0.095 1.773,-0.646c0.185,-0.237 0.29,-0.535 0.396,-0.833c0.088,-0.438 0.019,-1 -0.314,-1.386s-0.727,-0.694 -1.165,-0.782C43.638,16.373 31.949,20.952 24.691,30.255z" />
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="M71.1,47.4L41.3,29.2c-1,-0.5 -2.2,-0.5 -3.2,0.1s-1.6,1.6 -1.6,2.8v36.2c0,1.1 0.6,2.2 1.6,2.8c0.5,0.3 1.1,0.5 1.6,0.5s1.1,-0.1 1.6,-0.4L71.1,53c1,-0.6 1.6,-1.6 1.6,-2.8C72.7,49.1 72.1,48 71.1,47.4zM68.5,50.2L40.3,67.4V33L68.5,50.2z" />
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="M79.6,20.4C71.7,12.6 61.2,8.2 50,8.2s-21.7,4.3 -29.6,12.2C12.6,28.3 8.2,38.8 8.2,50s4.3,21.7 12.2,29.6S38.8,91.8 50,91.8s21.7,-4.3 29.6,-12.2S91.8,61.2 91.8,50S87.4,28.3 79.6,20.4zM88.1,50c0,10.2 -4,19.7 -11.2,26.9C69.7,84.1 60.2,88.1 50,88.1s-19.7,-4 -26.9,-11.2C15.9,69.7 11.9,60.2 11.9,50s4,-19.7 11.2,-26.9S39.9,11.9 50,11.9c10.2,0 19.7,4 26.9,11.2C84.1,30.3 88.1,39.8 88.1,50z" />
|
||||
</vector>
|
5
app/src/bittube/res/mipmap-anydpi-v26/ic_launcher.xml
Normal file
@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@color/ic_launcher_background" />
|
||||
<foreground android:drawable="@drawable/ic_launcher_foreground" />
|
||||
</adaptive-icon>
|
@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@color/ic_launcher_background" />
|
||||
<foreground android:drawable="@drawable/ic_launcher_foreground" />
|
||||
</adaptive-icon>
|
BIN
app/src/bittube/res/mipmap-hdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 7.4 KiB |
BIN
app/src/bittube/res/mipmap-hdpi/ic_launcher_round.png
Normal file
After Width: | Height: | Size: 11 KiB |
BIN
app/src/bittube/res/mipmap-mdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 3.9 KiB |
BIN
app/src/bittube/res/mipmap-mdpi/ic_launcher_round.png
Normal file
After Width: | Height: | Size: 5.6 KiB |
BIN
app/src/bittube/res/mipmap-xhdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 11 KiB |
BIN
app/src/bittube/res/mipmap-xhdpi/ic_launcher_round.png
Normal file
After Width: | Height: | Size: 17 KiB |
BIN
app/src/bittube/res/mipmap-xxhdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 21 KiB |
BIN
app/src/bittube/res/mipmap-xxhdpi/ic_launcher_round.png
Normal file
After Width: | Height: | Size: 30 KiB |
BIN
app/src/bittube/res/mipmap-xxxhdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 32 KiB |
BIN
app/src/bittube/res/mipmap-xxxhdpi/ic_launcher_round.png
Normal file
After Width: | Height: | Size: 45 KiB |
14
app/src/bittube/res/values/colors.xml
Normal file
@ -0,0 +1,14 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<color name="colorPrimary">#343434</color>
|
||||
<color name="colorPrimaryDark">#343434</color>
|
||||
<color name="colorAccent">#00abff</color>
|
||||
|
||||
<color name="tag_color">#bbF2690D</color>
|
||||
<color name="tag_color_text">#FAFAFA</color>
|
||||
<color name="positive_thumbs">#2b90d9</color>
|
||||
<color name="negative_thumbs">#F44336</color>
|
||||
<color name="backgroundDark">#DD000000</color>
|
||||
<color name="red_1">#F44336</color>
|
||||
<color name="gray_light">#80808080</color>
|
||||
</resources>
|
4
app/src/bittube/res/values/ic_launcher_background.xml
Normal file
@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<color name="ic_launcher_background">#FFFFFF</color>
|
||||
</resources>
|
7
app/src/bittube/res/xml/file_paths.xml
Normal file
@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<paths xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<external-path
|
||||
name="my_images"
|
||||
path="/Bittube/" />
|
||||
|
||||
</paths>
|
37
app/src/fdroid_acad/AndroidManifest.xml
Normal file
@ -0,0 +1,37 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
package="app.fedilab.fedilabtube">
|
||||
|
||||
|
||||
<application
|
||||
android:name=".FedilabTube"
|
||||
android:allowBackup="false"
|
||||
android:icon="@mipmap/ic_launcher"
|
||||
android:label="@string/app_name"
|
||||
android:roundIcon="@mipmap/ic_launcher_round"
|
||||
android:supportsRtl="true"
|
||||
android:theme="@style/AppTheme"
|
||||
tools:replace="android:allowBackup">
|
||||
|
||||
<activity
|
||||
android:name=".MainActivity"
|
||||
tools:node="merge">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<category android:name="android.intent.category.BROWSABLE" />
|
||||
<data android:scheme="content" />
|
||||
<data android:scheme="file" />
|
||||
<data android:mimeType="*/*" />
|
||||
<data android:pathPattern=".*\\.tubelab" />
|
||||
<data android:pathPattern=".*\\..*\\.tubelab" />
|
||||
<data android:pathPattern=".*\\..*\\..*\\.tubelab" />
|
||||
<data android:pathPattern=".*\\..*\\..*\\..*\\.tubelab" />
|
||||
<data android:pathPattern=".*\\..*\\..*\\..*\\..*\\.tubelab" />
|
||||
<data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\.tubelab" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
|
||||
</application>
|
||||
</manifest>
|
33
app/src/fdroid_full/AndroidManifest.xml
Normal file
@ -0,0 +1,33 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
package="app.fedilab.fedilabtube">
|
||||
|
||||
|
||||
<application
|
||||
android:name=".FedilabTube"
|
||||
android:allowBackup="false"
|
||||
android:icon="@mipmap/ic_launcher"
|
||||
android:label="@string/app_name"
|
||||
android:roundIcon="@mipmap/ic_launcher_round"
|
||||
android:supportsRtl="true"
|
||||
android:theme="@style/AppTheme"
|
||||
tools:replace="android:allowBackup">
|
||||
|
||||
<activity
|
||||
android:name=".PeertubeActivity"
|
||||
tools:node="mergeOnlyAttributes">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<category android:name="android.intent.category.BROWSABLE" />
|
||||
<!-- The app is a good candidate for URL in https://domain.name/videos/watch/xxxxx-->
|
||||
<data
|
||||
android:host="*"
|
||||
android:pathPrefix="/videos/watch/"
|
||||
android:scheme="https" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
|
||||
</application>
|
||||
</manifest>
|
BIN
app/src/full/ic_launcher-playstore.png
Normal file
After Width: | Height: | Size: 20 KiB |
@ -1,4 +1,4 @@
|
||||
package app.fedilab.fedilabtube.interfaces;
|
||||
package app.fedilab.fedilabtube;
|
||||
/* Copyright 2020 Thomas Schneider
|
||||
*
|
||||
* This file is a part of TubeLab
|
||||
@ -14,8 +14,7 @@ package app.fedilab.fedilabtube.interfaces;
|
||||
* You should have received a copy of the GNU General Public License along with TubeLab; if not,
|
||||
* see <http://www.gnu.org/licenses>. */
|
||||
|
||||
import app.fedilab.fedilabtube.client.APIResponse;
|
||||
|
||||
public interface OnRetrieveFeedsInterface {
|
||||
void onRetrieveFeeds(APIResponse apiResponse);
|
||||
}
|
||||
|
||||
public class FedilabTube extends BaseFedilabTube {
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
package app.fedilab.fedilabtube.interfaces;
|
||||
package app.fedilab.fedilabtube;
|
||||
/* Copyright 2020 Thomas Schneider
|
||||
*
|
||||
* This file is a part of TubeLab
|
||||
@ -14,10 +14,28 @@ package app.fedilab.fedilabtube.interfaces;
|
||||
* You should have received a copy of the GNU General Public License along with TubeLab; if not,
|
||||
* see <http://www.gnu.org/licenses>. */
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import app.fedilab.fedilabtube.client.entities.Status;
|
||||
import android.content.Context;
|
||||
|
||||
public interface OnRetrieveFeedsAccountInterface {
|
||||
void onRetrieveFeedsAccount(List<Status> statuses);
|
||||
|
||||
@SuppressWarnings({"unused", "RedundantSuppression"})
|
||||
public class Matomo {
|
||||
|
||||
public static void sendScreen(Context _mcontext, String path, String title) {
|
||||
//Do nothing
|
||||
}
|
||||
|
||||
public static void sendEvent(Context _mcontext, String category, String action, String label, float value) {
|
||||
//Do nothing
|
||||
}
|
||||
|
||||
|
||||
public static void sendValue(Context _mcontext, String path, int index, String dimensionValue) {
|
||||
//Do nothing
|
||||
}
|
||||
|
||||
|
||||
public static void trackInstall(Context _mcontext) {
|
||||
//Do nothing
|
||||
}
|
||||
}
|
5
app/src/full/res/color/bottom_nav_color.xml
Normal file
@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:color="@color/colorAccent" android:state_checked="true" />
|
||||
<item android:color="@android:color/tab_indicator_text" />
|
||||
</selector>
|
@ -0,0 +1,16 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:tint="#FFFFFF"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24">
|
||||
<group
|
||||
android:scaleX="1.104"
|
||||
android:scaleY="1.104"
|
||||
android:translateX="-1.248"
|
||||
android:translateY="-1.248">
|
||||
<path
|
||||
android:fillColor="@android:color/white"
|
||||
android:pathData="M10,16.5l6,-4.5 -6,-4.5v9zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8z" />
|
||||
</group>
|
||||
</vector>
|
BIN
app/src/full/res/drawable-hdpi/ic_notification_tubelab.png
Normal file
After Width: | Height: | Size: 720 B |
BIN
app/src/full/res/drawable-mdpi/ic_notification_tubelab.png
Normal file
After Width: | Height: | Size: 491 B |
BIN
app/src/full/res/drawable-xhdpi/ic_notification_tubelab.png
Normal file
After Width: | Height: | Size: 937 B |
BIN
app/src/full/res/drawable-xxhdpi/ic_notification_tubelab.png
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
app/src/full/res/drawable-xxxhdpi/ic_notification_tubelab.png
Normal file
After Width: | Height: | Size: 1.6 KiB |
21
app/src/full/res/drawable/ic_launcher_foreground.xml
Normal file
@ -0,0 +1,21 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="108dp"
|
||||
android:height="108dp"
|
||||
android:viewportWidth="108"
|
||||
android:viewportHeight="108">
|
||||
<group
|
||||
android:scaleX="2.0409248"
|
||||
android:scaleY="2.0409248"
|
||||
android:translateX="19.44"
|
||||
android:translateY="19.44">
|
||||
<path
|
||||
android:fillColor="#000000"
|
||||
android:pathData="m0,0h33.867v33.867h-33.867z" />
|
||||
<path
|
||||
android:fillColor="#f2690d"
|
||||
android:pathData="m15.544,29.459c-0.5613,-0.052 -1.8193,-0.2922 -2.5659,-0.49 -1.4544,-0.3854 -2.6614,-0.9423 -3.8833,-1.7918 -2.3102,-1.606 -3.8461,-3.928 -4.3943,-6.6437 -0.4789,-2.3721 -0.2362,-5.3562 0.6533,-8.0312 0.376,-1.131 0.7053,-1.8387 1.2806,-2.7519 0.9004,-1.4293 1.5877,-2.1804 2.8991,-3.1683 1.3049,-0.983 2.9258,-1.6476 4.88,-2.0009 0.8669,-0.1568 1.1303,-0.1748 2.5858,-0.1775 1.5249,-0.0027 1.6704,0.0078 2.465,0.1789 1.9969,0.43 3.3805,1.0324 4.9616,2.1602 1.8104,1.2913 3.1669,2.8519 4.0578,4.6681 0.896,1.8267 1.3075,3.6274 1.3075,5.7214 0,1.5759 -0.2607,3.1575 -0.7605,4.613 -0.8579,2.4986 -2.193,4.235 -4.4452,5.7811 -1.2142,0.8336 -2.9496,1.4792 -4.8751,1.8136 -0.6105,0.106 -3.4333,0.1862 -4.1663,0.1183zM19.42,26.9851c1.5946,-0.1757 3.0062,-0.5799 4.293,-1.2293 1.048,-0.5289 1.5517,-0.8781 2.271,-1.5743 0.9003,-0.8714 1.3979,-1.6179 1.8328,-2.7494 0.3399,-0.8845 0.4151,-1.1551 0.5267,-1.8953 0.3809,-2.5269 -0.4498,-6.1791 -1.8859,-8.291 -0.9544,-1.4038 -2.0586,-2.3755 -3.7036,-3.2592 -2.538,-1.3635 -6.6246,-1.6184 -9.6573,-0.6023 -1.2489,0.4185 -2.8043,1.4067 -3.6027,2.289 -0.7826,0.8649 -1.5925,2.2749 -1.9531,3.4007 -0.3872,1.2088 -0.4937,2.0043 -0.4947,3.695 -0.0008,1.3192 0.0189,1.6195 0.1484,2.2599 0.2029,1.0037 0.4086,1.6055 0.8491,2.4837 0.9265,1.8474 2.0961,3.1054 3.8624,4.1541 1.3723,0.8148 2.6611,1.2289 4.3987,1.4136 0.4192,0.0446 2.3964,-0.0157 3.1154,-0.0949z" />
|
||||
<path
|
||||
android:fillColor="#f2690d"
|
||||
android:pathData="m14.648,11.972 l7.4433,4.9609 -7.4433,4.9609z" />
|
||||
</group>
|
||||
</vector>
|
5
app/src/full/res/mipmap-anydpi-v26/ic_launcher.xml
Normal file
@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@color/ic_launcher_background" />
|
||||
<foreground android:drawable="@drawable/ic_launcher_foreground" />
|
||||
</adaptive-icon>
|
5
app/src/full/res/mipmap-anydpi-v26/ic_launcher_round.xml
Normal file
@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@color/ic_launcher_background" />
|
||||
<foreground android:drawable="@drawable/ic_launcher_foreground" />
|
||||
</adaptive-icon>
|
BIN
app/src/full/res/mipmap-hdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 1.8 KiB |
BIN
app/src/full/res/mipmap-hdpi/ic_launcher_round.png
Normal file
After Width: | Height: | Size: 3.1 KiB |
BIN
app/src/full/res/mipmap-mdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
app/src/full/res/mipmap-mdpi/ic_launcher_round.png
Normal file
After Width: | Height: | Size: 2.0 KiB |
BIN
app/src/full/res/mipmap-xhdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 2.5 KiB |
BIN
app/src/full/res/mipmap-xhdpi/ic_launcher_round.png
Normal file
After Width: | Height: | Size: 4.3 KiB |
BIN
app/src/full/res/mipmap-xxhdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 3.9 KiB |
BIN
app/src/full/res/mipmap-xxhdpi/ic_launcher_round.png
Normal file
After Width: | Height: | Size: 6.9 KiB |
BIN
app/src/full/res/mipmap-xxxhdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 5.3 KiB |
BIN
app/src/full/res/mipmap-xxxhdpi/ic_launcher_round.png
Normal file
After Width: | Height: | Size: 9.6 KiB |
13
app/src/full/res/values/colors.xml
Normal file
@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<color name="colorPrimary">#212529</color>
|
||||
<color name="colorPrimaryDark">#000000</color>
|
||||
<color name="colorAccent">#F2690D</color>
|
||||
<color name="tag_color">#bbF2690D</color>
|
||||
<color name="tag_color_text">#FAFAFA</color>
|
||||
<color name="positive_thumbs">#2b90d9</color>
|
||||
<color name="negative_thumbs">#F44336</color>
|
||||
<color name="backgroundDark">#DD000000</color>
|
||||
<color name="red_1">#F44336</color>
|
||||
<color name="gray_light">#80808080</color>
|
||||
</resources>
|
4
app/src/full/res/values/ic_launcher_background.xml
Normal file
@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<color name="ic_launcher_background">#000000</color>
|
||||
</resources>
|
7
app/src/full/res/xml/file_paths.xml
Normal file
@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<paths xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<external-path
|
||||
name="my_images"
|
||||
path="/TubeLab/" />
|
||||
|
||||
</paths>
|
37
app/src/google_acad/AndroidManifest.xml
Normal file
@ -0,0 +1,37 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
package="app.fedilab.fedilabtube">
|
||||
|
||||
|
||||
<application
|
||||
android:name=".FedilabTube"
|
||||
android:allowBackup="false"
|
||||
android:icon="@mipmap/ic_launcher"
|
||||
android:label="@string/app_name"
|
||||
android:roundIcon="@mipmap/ic_launcher_round"
|
||||
android:supportsRtl="true"
|
||||
android:theme="@style/AppTheme"
|
||||
tools:replace="android:allowBackup">
|
||||
|
||||
<activity
|
||||
android:name=".MainActivity"
|
||||
tools:node="merge">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<category android:name="android.intent.category.BROWSABLE" />
|
||||
<data android:scheme="content" />
|
||||
<data android:scheme="file" />
|
||||
<data android:mimeType="*/*" />
|
||||
<data android:pathPattern=".*\\.tubelab" />
|
||||
<data android:pathPattern=".*\\..*\\.tubelab" />
|
||||
<data android:pathPattern=".*\\..*\\..*\\.tubelab" />
|
||||
<data android:pathPattern=".*\\..*\\..*\\..*\\.tubelab" />
|
||||
<data android:pathPattern=".*\\..*\\..*\\..*\\..*\\.tubelab" />
|
||||
<data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\.tubelab" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
|
||||
</application>
|
||||
</manifest>
|
34
app/src/google_full/AndroidManifest.xml
Normal file
@ -0,0 +1,34 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
package="app.fedilab.fedilabtube">
|
||||
|
||||
|
||||
<application
|
||||
android:name=".FedilabTube"
|
||||
android:allowBackup="false"
|
||||
android:icon="@mipmap/ic_launcher"
|
||||
android:label="@string/app_name"
|
||||
android:roundIcon="@mipmap/ic_launcher_round"
|
||||
android:supportsRtl="true"
|
||||
android:theme="@style/AppTheme"
|
||||
tools:replace="android:allowBackup">
|
||||
|
||||
<activity
|
||||
android:name=".PeertubeActivity"
|
||||
tools:node="mergeOnlyAttributes">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<category android:name="android.intent.category.BROWSABLE" />
|
||||
<!-- The app is a good candidate for URL in https://domain.name/videos/watch/xxxxx-->
|
||||
<data
|
||||
android:host="*"
|
||||
android:pathPrefix="/videos/watch/"
|
||||
android:scheme="https" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
|
||||
</application>
|
||||
</manifest>
|
@ -5,19 +5,20 @@
|
||||
|
||||
|
||||
<!--
|
||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||
|
||||
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
|
||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
||||
|
||||
-->
|
||||
<uses-permission android:name="android.permission.INTERNET" />
|
||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
|
||||
|
||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
||||
|
||||
<application
|
||||
android:name=".FedilabTube"
|
||||
android:allowBackup="false"
|
||||
android:requestLegacyExternalStorage="true"
|
||||
android:icon="@mipmap/ic_launcher"
|
||||
android:label="@string/app_name"
|
||||
android:roundIcon="@mipmap/ic_launcher_round"
|
||||
@ -26,10 +27,12 @@
|
||||
tools:replace="android:allowBackup">
|
||||
<activity
|
||||
android:name=".MainActivity"
|
||||
android:theme="@style/AppThemeNoActionBar"
|
||||
android:configChanges="orientation|screenSize"
|
||||
android:label="@string/app_name">
|
||||
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
@ -37,14 +40,24 @@
|
||||
|
||||
<activity
|
||||
android:name=".PeertubeActivity"
|
||||
android:configChanges="keyboardHidden|orientation|screenSize"
|
||||
android:label="@string/app_name" />
|
||||
android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"
|
||||
android:label="@string/app_name"
|
||||
android:launchMode="singleTask"
|
||||
android:resizeableActivity="true"
|
||||
android:supportsPictureInPicture="true"
|
||||
tools:targetApi="n" />
|
||||
<activity
|
||||
android:name=".PeertubeEditUploadActivity"
|
||||
android:configChanges="orientation|screenSize"
|
||||
android:label="@string/app_name"
|
||||
android:exported="false"
|
||||
android:windowSoftInputMode="stateAlwaysHidden" />
|
||||
|
||||
<activity
|
||||
android:name=".ShowChannelActivity"
|
||||
android:configChanges="orientation|screenSize"
|
||||
android:label="@string/app_name"
|
||||
android:windowSoftInputMode="stateAlwaysHidden" />
|
||||
<activity
|
||||
android:name=".ShowAccountActivity"
|
||||
android:configChanges="orientation|screenSize"
|
||||
@ -54,7 +67,12 @@
|
||||
android:name=".AccountActivity"
|
||||
android:configChanges="orientation|screenSize"
|
||||
android:label="@string/app_name"
|
||||
android:windowSoftInputMode="stateAlwaysHidden"/>
|
||||
android:windowSoftInputMode="stateAlwaysHidden" />
|
||||
<activity
|
||||
android:name=".MyAccountActivity"
|
||||
android:configChanges="orientation|screenSize"
|
||||
android:label="@string/app_name"
|
||||
android:windowSoftInputMode="stateAlwaysHidden" />
|
||||
<activity
|
||||
android:name=".SearchActivity"
|
||||
android:configChanges="orientation|screenSize"
|
||||
@ -65,16 +83,42 @@
|
||||
android:configChanges="orientation|screenSize"
|
||||
android:label="@string/app_name"
|
||||
android:windowSoftInputMode="stateAlwaysHidden" />
|
||||
<activity
|
||||
android:name=".AllLocalPlaylistsActivity"
|
||||
android:configChanges="orientation|screenSize"
|
||||
android:label="@string/app_name"
|
||||
android:windowSoftInputMode="stateAlwaysHidden" />
|
||||
<activity
|
||||
android:name=".InstancePickerActivity"
|
||||
android:configChanges="orientation|screenSize"
|
||||
android:label="@string/app_name"
|
||||
android:windowSoftInputMode="stateAlwaysHidden" />
|
||||
|
||||
<activity
|
||||
android:name=".PlaylistsActivity"
|
||||
android:configChanges="orientation|screenSize"
|
||||
android:label="@string/app_name"
|
||||
android:windowSoftInputMode="stateAlwaysHidden" />
|
||||
<activity
|
||||
android:name=".MyVideosActivity"
|
||||
android:name=".LocalPlaylistsActivity"
|
||||
android:configChanges="orientation|screenSize"
|
||||
android:label="@string/app_name"
|
||||
android:windowSoftInputMode="stateAlwaysHidden" />
|
||||
<activity
|
||||
android:name=".VideosTimelineActivity"
|
||||
android:configChanges="orientation|screenSize"
|
||||
android:label="@string/app_name"
|
||||
android:windowSoftInputMode="stateAlwaysHidden" />
|
||||
<activity
|
||||
android:name=".SepiaSearchActivity"
|
||||
android:configChanges="orientation|screenSize"
|
||||
android:label="@string/sepia_search"
|
||||
android:windowSoftInputMode="stateAlwaysHidden" />
|
||||
<activity
|
||||
android:name=".ManageInstancesActivity"
|
||||
android:configChanges="orientation|screenSize"
|
||||
android:label="@string/instances_picker"
|
||||
android:windowSoftInputMode="stateAlwaysHidden" />
|
||||
<activity
|
||||
android:name=".WebviewActivity"
|
||||
android:configChanges="keyboardHidden|orientation|screenSize"
|
||||
@ -87,15 +131,13 @@
|
||||
android:name=".LoginActivity"
|
||||
android:configChanges="orientation|screenSize"
|
||||
android:label="@string/app_name"
|
||||
android:windowSoftInputMode="stateAlwaysHidden">
|
||||
</activity>
|
||||
android:windowSoftInputMode="stateAlwaysHidden" />
|
||||
|
||||
<activity
|
||||
android:name=".SettingsActivity"
|
||||
android:configChanges="orientation|screenSize"
|
||||
android:label="@string/settings"
|
||||
android:windowSoftInputMode="stateAlwaysHidden">
|
||||
</activity>
|
||||
android:windowSoftInputMode="stateAlwaysHidden" />
|
||||
<activity
|
||||
android:name=".PeertubeRegisterActivity"
|
||||
android:configChanges="orientation|screenSize"
|
||||
@ -106,14 +148,32 @@
|
||||
android:configChanges="orientation|screenSize"
|
||||
android:label="@string/upload_video"
|
||||
android:windowSoftInputMode="stateAlwaysHidden" />
|
||||
<activity
|
||||
android:name=".AboutActivity"
|
||||
android:configChanges="orientation|screenSize"
|
||||
android:label="@string/about_the_app"
|
||||
android:windowSoftInputMode="stateAlwaysHidden" />
|
||||
|
||||
<receiver
|
||||
android:name=".services.PeertubeUploadReceiver"
|
||||
android:exported="false">
|
||||
<intent-filter>
|
||||
<action android:name="app.fedilab.fedilabtube.uploadservice.broadcast.status" />
|
||||
</intent-filter>
|
||||
</receiver>
|
||||
<service
|
||||
android:name=".services.RetrieveInfoService"
|
||||
android:exported="false" />
|
||||
|
||||
<provider
|
||||
android:name="androidx.work.impl.WorkManagerInitializer"
|
||||
android:authorities="${applicationId}.workmanager-init"
|
||||
tools:node="remove"
|
||||
android:exported="false" />
|
||||
|
||||
|
||||
<provider
|
||||
android:name="androidx.core.content.FileProvider"
|
||||
android:authorities="${applicationId}.fileProvider"
|
||||
android:exported="false"
|
||||
android:grantUriPermissions="true">
|
||||
<meta-data
|
||||
android:name="android.support.FILE_PROVIDER_PATHS"
|
||||
android:resource="@xml/file_paths" />
|
||||
</provider>
|
||||
</application>
|
||||
|
||||
</manifest>
|
2684
app/src/main/assets/emoji.csv
Normal file
Before Width: | Height: | Size: 16 KiB |
164
app/src/main/java/app/fedilab/fedilabtube/AboutActivity.java
Normal file
@ -0,0 +1,164 @@
|
||||
package app.fedilab.fedilabtube;
|
||||
/* Copyright 2020 Thomas Schneider
|
||||
*
|
||||
* This file is a part of TubeLab
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it under the terms of the
|
||||
* GNU General Public License as published by the Free Software Foundation; either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* TubeLab is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
|
||||
* the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
||||
* Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with TubeLab; if not,
|
||||
* see <http://www.gnu.org/licenses>. */
|
||||
|
||||
import android.content.Intent;
|
||||
import android.content.pm.PackageInfo;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
import android.text.SpannableString;
|
||||
import android.text.style.ForegroundColorSpan;
|
||||
import android.text.style.UnderlineSpan;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.widget.Button;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
import androidx.core.content.ContextCompat;
|
||||
|
||||
import app.fedilab.fedilabtube.helper.Helper;
|
||||
|
||||
|
||||
public class AboutActivity extends AppCompatActivity {
|
||||
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.activity_about);
|
||||
|
||||
TextView about_version = findViewById(R.id.about_version);
|
||||
try {
|
||||
PackageInfo pInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
|
||||
String version = pInfo.versionName;
|
||||
about_version.setText(getResources().getString(R.string.about_vesrion, version));
|
||||
} catch (PackageManager.NameNotFoundException ignored) {
|
||||
}
|
||||
|
||||
setTitle(R.string.about_the_app);
|
||||
if (getSupportActionBar() != null) {
|
||||
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
||||
getSupportActionBar().setDisplayShowHomeEnabled(true);
|
||||
}
|
||||
//Developer click for Mastodon account
|
||||
TextView developer_mastodon = findViewById(R.id.developer_mastodon);
|
||||
SpannableString content = new SpannableString(developer_mastodon.getText().toString());
|
||||
content.setSpan(new ForegroundColorSpan(ContextCompat.getColor(AboutActivity.this, Helper.getColorAccent())), 0, content.length(), 0);
|
||||
developer_mastodon.setText(content);
|
||||
developer_mastodon.setOnClickListener(v -> {
|
||||
Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://toot.fedilab.app/@Tubelab"));
|
||||
startActivity(browserIntent);
|
||||
});
|
||||
|
||||
Button translation = findViewById(R.id.translation);
|
||||
if (BuildConfig.full_instances) {
|
||||
translation.setVisibility(View.VISIBLE);
|
||||
} else {
|
||||
translation.setVisibility(View.GONE);
|
||||
}
|
||||
translation.setOnClickListener(view -> {
|
||||
Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://crowdin.com/project/tubelab"));
|
||||
startActivity(browserIntent);
|
||||
});
|
||||
|
||||
//App Name:
|
||||
TextView app_name = findViewById(R.id.app_name);
|
||||
app_name.setText(R.string.app_name);
|
||||
|
||||
//Developer Github
|
||||
TextView github = findViewById(R.id.github);
|
||||
content = new SpannableString(github.getText().toString());
|
||||
content.setSpan(new UnderlineSpan(), 0, content.length(), 0);
|
||||
github.setText(content);
|
||||
github.setOnClickListener(v -> {
|
||||
Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://github.com/stom79"));
|
||||
startActivity(browserIntent);
|
||||
});
|
||||
|
||||
//Developer Framagit
|
||||
TextView framagit = findViewById(R.id.framagit);
|
||||
content = new SpannableString(framagit.getText().toString());
|
||||
content.setSpan(new UnderlineSpan(), 0, content.length(), 0);
|
||||
framagit.setText(content);
|
||||
framagit.setOnClickListener(v -> {
|
||||
Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://framagit.org/tom79"));
|
||||
startActivity(browserIntent);
|
||||
});
|
||||
|
||||
//Developer Codeberg
|
||||
TextView codeberg = findViewById(R.id.codeberg);
|
||||
content = new SpannableString(codeberg.getText().toString());
|
||||
content.setSpan(new UnderlineSpan(), 0, content.length(), 0);
|
||||
codeberg.setText(content);
|
||||
codeberg.setOnClickListener(v -> {
|
||||
Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://codeberg.org/tom79"));
|
||||
startActivity(browserIntent);
|
||||
});
|
||||
|
||||
LinearLayout donation_container = findViewById(R.id.donation_container);
|
||||
if (BuildConfig.google_restriction || !BuildConfig.full_instances) {
|
||||
donation_container.setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
|
||||
//Developer donation
|
||||
Button donatePaypal = findViewById(R.id.donate_paypal);
|
||||
donatePaypal.setOnClickListener(v -> {
|
||||
Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://www.paypal.me/Mastalab"));
|
||||
startActivity(browserIntent);
|
||||
});
|
||||
if (BuildConfig.FLAVOR.equals("queermotion")) {
|
||||
donatePaypal.setVisibility(View.GONE);
|
||||
LinearLayout dev_info = findViewById(R.id.dev_info);
|
||||
dev_info.setVisibility(View.GONE);
|
||||
}
|
||||
Button donateLiberapay = findViewById(R.id.donate_liberapay);
|
||||
donateLiberapay.setOnClickListener(v -> {
|
||||
Intent browserIntent;
|
||||
if (BuildConfig.FLAVOR.equals("queermotion")) {
|
||||
browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://soutenir.queermotion.org"));
|
||||
} else {
|
||||
browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://liberapay.com/tom79"));
|
||||
}
|
||||
|
||||
startActivity(browserIntent);
|
||||
});
|
||||
|
||||
|
||||
TextView license = findViewById(R.id.license);
|
||||
content = new SpannableString(license.getText().toString());
|
||||
content.setSpan(new ForegroundColorSpan(ContextCompat.getColor(AboutActivity.this, Helper.getColorAccent())), 0, content.length(), 0);
|
||||
content.setSpan(new UnderlineSpan(), 0, content.length(), 0);
|
||||
license.setText(content);
|
||||
license.setOnClickListener(v -> {
|
||||
Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://www.gnu.org/licenses/quick-guide-gplv3.fr.html"));
|
||||
startActivity(browserIntent);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(MenuItem item) {
|
||||
if (item.getItemId() == android.R.id.home) {
|
||||
finish();
|
||||
return true;
|
||||
}
|
||||
return super.onOptionsItemSelected(item);
|
||||
}
|
||||
|
||||
}
|
@ -22,6 +22,7 @@ import android.text.SpannableString;
|
||||
import android.text.Spanned;
|
||||
import android.text.style.ForegroundColorSpan;
|
||||
import android.text.style.UnderlineSpan;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
import android.widget.Button;
|
||||
import android.widget.ImageView;
|
||||
@ -36,15 +37,18 @@ import androidx.fragment.app.FragmentStatePagerAdapter;
|
||||
import androidx.viewpager.widget.PagerAdapter;
|
||||
import androidx.viewpager.widget.ViewPager;
|
||||
|
||||
import com.google.android.material.floatingactionbutton.FloatingActionButton;
|
||||
import com.google.android.material.tabs.TabLayout;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import app.fedilab.fedilabtube.asynctasks.RetrieveAccountsAsyncTask;
|
||||
import app.fedilab.fedilabtube.client.entities.Account;
|
||||
import app.fedilab.fedilabtube.client.RetrofitPeertubeAPI;
|
||||
import app.fedilab.fedilabtube.client.data.AccountData.Account;
|
||||
import app.fedilab.fedilabtube.fragment.DisplayAccountsFragment;
|
||||
import app.fedilab.fedilabtube.fragment.DisplayChannelsFragment;
|
||||
import app.fedilab.fedilabtube.fragment.DisplayNotificationsFragment;
|
||||
import app.fedilab.fedilabtube.helper.Helper;
|
||||
import app.fedilab.fedilabtube.helper.SwitchAccountHelper;
|
||||
import app.fedilab.fedilabtube.sqlite.AccountDAO;
|
||||
import app.fedilab.fedilabtube.sqlite.Sqlite;
|
||||
|
||||
@ -67,21 +71,16 @@ public class AccountActivity extends AppCompatActivity {
|
||||
|
||||
SpannableString content_create = new SpannableString(getString(R.string.join_peertube));
|
||||
content_create.setSpan(new UnderlineSpan(), 0, content_create.length(), 0);
|
||||
content_create.setSpan(new ForegroundColorSpan(ContextCompat.getColor(AccountActivity.this, R.color.colorAccent)), 0, content_create.length(),
|
||||
content_create.setSpan(new ForegroundColorSpan(ContextCompat.getColor(AccountActivity.this, Helper.getColorAccent())), 0, content_create.length(),
|
||||
Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
|
||||
|
||||
|
||||
SharedPreferences sharedpreferences = getSharedPreferences(Helper.APP_PREFS, MODE_PRIVATE);
|
||||
SQLiteDatabase db = Sqlite.getInstance(getApplicationContext(), Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open();
|
||||
String userId = sharedpreferences.getString(Helper.PREF_KEY_ID, null);
|
||||
String instance = Helper.getLiveInstance(AccountActivity.this);
|
||||
String token = sharedpreferences.getString(Helper.PREF_KEY_OAUTH_TOKEN, null);
|
||||
|
||||
TextView instanceView = findViewById(R.id.instance);
|
||||
Account account = new AccountDAO(AccountActivity.this, db).getUniqAccount(userId, instance);
|
||||
if (account == null) {
|
||||
account = new AccountDAO(AccountActivity.this, db).getUniqAccount(userId, Helper.getPeertubeUrl(instance));
|
||||
}
|
||||
|
||||
Account account = new AccountDAO(AccountActivity.this, db).getAccountByToken(token);
|
||||
|
||||
if (account == null) {
|
||||
Helper.logoutCurrentUser(AccountActivity.this, null);
|
||||
@ -94,19 +93,20 @@ public class AccountActivity extends AppCompatActivity {
|
||||
|
||||
setTitle(String.format("@%s", account.getUsername()));
|
||||
|
||||
Helper.loadGiF(AccountActivity.this, account, profile_picture);
|
||||
Helper.loadGiF(AccountActivity.this, account.getAvatar().getPath(), profile_picture);
|
||||
username.setText(String.format("@%s", account.getUsername()));
|
||||
displayname.setText(account.getDisplay_name());
|
||||
displayname.setText(account.getDisplayName());
|
||||
|
||||
instanceView.setText(account.getInstance());
|
||||
instanceView.setText(account.getHost());
|
||||
FloatingActionButton edit_profile = findViewById(R.id.edit_profile);
|
||||
edit_profile.setOnClickListener(v -> startActivity(new Intent(AccountActivity.this, MyAccountActivity.class)));
|
||||
|
||||
Button logout_button = findViewById(R.id.logout_button);
|
||||
Account finalAccount = account;
|
||||
logout_button.setOnClickListener(v -> {
|
||||
AlertDialog.Builder dialogBuilderLogoutAccount = new AlertDialog.Builder(AccountActivity.this);
|
||||
dialogBuilderLogoutAccount.setMessage(getString(R.string.logout_account_confirmation, finalAccount.getUsername()));
|
||||
dialogBuilderLogoutAccount.setMessage(getString(R.string.logout_account_confirmation, account.getUsername(), account.getHost()));
|
||||
dialogBuilderLogoutAccount.setPositiveButton(R.string.action_logout, (dialog, id) -> {
|
||||
Helper.logoutCurrentUser(AccountActivity.this, finalAccount);
|
||||
Helper.logoutCurrentUser(AccountActivity.this, account);
|
||||
dialog.dismiss();
|
||||
});
|
||||
dialogBuilderLogoutAccount.setNegativeButton(R.string.cancel, (dialog, id) -> dialog.dismiss());
|
||||
@ -174,12 +174,17 @@ public class AccountActivity extends AppCompatActivity {
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
case 2:
|
||||
if (fragment != null) {
|
||||
DisplayAccountsFragment displayAccountsFragment = ((DisplayAccountsFragment) fragment);
|
||||
displayAccountsFragment.scrollToTop();
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
if (fragment != null) {
|
||||
DisplayChannelsFragment displayChannelsFragment = ((DisplayChannelsFragment) fragment);
|
||||
displayChannelsFragment.scrollToTop();
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
});
|
||||
@ -194,12 +199,19 @@ public class AccountActivity extends AppCompatActivity {
|
||||
super.onResume();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCreateOptionsMenu(@NotNull Menu menu) {
|
||||
getMenuInflater().inflate(R.menu.main_profile, menu);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(MenuItem item) {
|
||||
if (item.getItemId() == android.R.id.home) {
|
||||
finish();
|
||||
return true;
|
||||
} else if (item.getItemId() == R.id.action_add_account) {
|
||||
SwitchAccountHelper.switchDialog(AccountActivity.this, true);
|
||||
}
|
||||
return super.onOptionsItemSelected(item);
|
||||
}
|
||||
@ -213,7 +225,7 @@ public class AccountActivity extends AppCompatActivity {
|
||||
/**
|
||||
* Pager adapter for three tabs (notifications, muted, blocked)
|
||||
*/
|
||||
private class AccountsPagerAdapter extends FragmentStatePagerAdapter {
|
||||
private static class AccountsPagerAdapter extends FragmentStatePagerAdapter {
|
||||
|
||||
AccountsPagerAdapter(FragmentManager fm) {
|
||||
super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
|
||||
@ -225,27 +237,17 @@ public class AccountActivity extends AppCompatActivity {
|
||||
Bundle bundle = new Bundle();
|
||||
switch (position) {
|
||||
case 1:
|
||||
case 2:
|
||||
DisplayAccountsFragment displayAccountsFragment = new DisplayAccountsFragment();
|
||||
if (position == 1) {
|
||||
bundle.putSerializable("accountFetch", RetrieveAccountsAsyncTask.accountFetch.MUTED);
|
||||
} else {
|
||||
SharedPreferences sharedpreferences = getSharedPreferences(Helper.APP_PREFS, MODE_PRIVATE);
|
||||
SQLiteDatabase db = Sqlite.getInstance(getApplicationContext(), Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open();
|
||||
String userId = sharedpreferences.getString(Helper.PREF_KEY_ID, null);
|
||||
String instance = Helper.getLiveInstance(AccountActivity.this);
|
||||
Account account = new AccountDAO(AccountActivity.this, db).getUniqAccount(userId, instance);
|
||||
bundle.putString("name", account.getUsername() + "@" + account.getInstance());
|
||||
bundle.putSerializable("accountFetch", RetrieveAccountsAsyncTask.accountFetch.CHANNEL);
|
||||
}
|
||||
bundle.putSerializable("accountFetch", RetrofitPeertubeAPI.DataType.MUTED);
|
||||
displayAccountsFragment.setArguments(bundle);
|
||||
return displayAccountsFragment;
|
||||
case 2:
|
||||
return new DisplayChannelsFragment();
|
||||
default:
|
||||
return new DisplayNotificationsFragment();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public int getCount() {
|
||||
return 3;
|
||||
|
@ -0,0 +1,120 @@
|
||||
package app.fedilab.fedilabtube;
|
||||
/* Copyright 2020 Thomas Schneider
|
||||
*
|
||||
* This file is a part of TubeLab
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it under the terms of the
|
||||
* GNU General Public License as published by the Free Software Foundation; either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* TubeLab is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
|
||||
* the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
||||
* Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with TubeLab; if not,
|
||||
* see <http://www.gnu.org/licenses>. */
|
||||
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.widget.RelativeLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
import androidx.lifecycle.ViewModelProvider;
|
||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.google.android.material.floatingactionbutton.FloatingActionButton;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import app.fedilab.fedilabtube.client.data.PlaylistData.Playlist;
|
||||
import app.fedilab.fedilabtube.client.data.VideoPlaylistData;
|
||||
import app.fedilab.fedilabtube.drawer.PlaylistAdapter;
|
||||
import app.fedilab.fedilabtube.viewmodel.PlaylistsVM;
|
||||
|
||||
|
||||
public class AllLocalPlaylistsActivity extends AppCompatActivity implements PlaylistAdapter.AllPlaylistRemoved {
|
||||
|
||||
|
||||
PlaylistAdapter playlistAdapter;
|
||||
private RelativeLayout mainLoader;
|
||||
private RelativeLayout textviewNoAction;
|
||||
private List<Playlist> playlists;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
setContentView(R.layout.activity_all_playlist);
|
||||
|
||||
if (getSupportActionBar() != null)
|
||||
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
||||
setTitle(R.string.playlists);
|
||||
|
||||
|
||||
textviewNoAction = findViewById(R.id.no_action);
|
||||
mainLoader = findViewById(R.id.loader);
|
||||
RelativeLayout nextElementLoader = findViewById(R.id.loading_next_items);
|
||||
mainLoader.setVisibility(View.VISIBLE);
|
||||
nextElementLoader.setVisibility(View.GONE);
|
||||
|
||||
PlaylistsVM viewModel = new ViewModelProvider(AllLocalPlaylistsActivity.this).get(PlaylistsVM.class);
|
||||
viewModel.localePlaylist().observe(AllLocalPlaylistsActivity.this, this::manageVIewPlaylists);
|
||||
|
||||
FloatingActionButton add_new = findViewById(R.id.add_new);
|
||||
add_new.setVisibility(View.GONE);
|
||||
|
||||
TextView no_action_text = findViewById(R.id.no_action_text);
|
||||
no_action_text.setText(R.string.no_playlist);
|
||||
playlists = new ArrayList<>();
|
||||
RecyclerView lv_playlist = findViewById(R.id.lv_playlist);
|
||||
playlistAdapter = new PlaylistAdapter(playlists, true);
|
||||
playlistAdapter.allPlaylistRemoved = this;
|
||||
lv_playlist.setAdapter(playlistAdapter);
|
||||
LinearLayoutManager mLayoutManager = new LinearLayoutManager(AllLocalPlaylistsActivity.this);
|
||||
lv_playlist.setLayoutManager(mLayoutManager);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
super.onDestroy();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(MenuItem item) {
|
||||
if (item.getItemId() == android.R.id.home) {
|
||||
finish();
|
||||
return true;
|
||||
}
|
||||
return super.onOptionsItemSelected(item);
|
||||
}
|
||||
|
||||
|
||||
public void manageVIewPlaylists(List<VideoPlaylistData.VideoPlaylistExport> videoPlaylistExports) {
|
||||
mainLoader.setVisibility(View.GONE);
|
||||
if (videoPlaylistExports == null) {
|
||||
textviewNoAction.setVisibility(View.VISIBLE);
|
||||
return;
|
||||
}
|
||||
if (videoPlaylistExports.size() > 0) {
|
||||
for (VideoPlaylistData.VideoPlaylistExport videoPlaylistExport : videoPlaylistExports) {
|
||||
playlists.add(videoPlaylistExport.getPlaylist());
|
||||
}
|
||||
playlistAdapter.notifyDataSetChanged();
|
||||
textviewNoAction.setVisibility(View.GONE);
|
||||
} else {
|
||||
textviewNoAction.setVisibility(View.VISIBLE);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAllPlaylistRemoved() {
|
||||
textviewNoAction.setVisibility(View.VISIBLE);
|
||||
}
|
||||
|
||||
}
|
@ -14,8 +14,12 @@ package app.fedilab.fedilabtube;
|
||||
* You should have received a copy of the GNU General Public License along with TubeLab; if not,
|
||||
* see <http://www.gnu.org/licenses>. */
|
||||
|
||||
import android.Manifest;
|
||||
import android.app.Activity;
|
||||
import android.content.Context;
|
||||
import android.os.AsyncTask;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.os.Looper;
|
||||
@ -27,17 +31,20 @@ import android.view.WindowManager;
|
||||
import android.view.inputmethod.InputMethodManager;
|
||||
import android.widget.AdapterView;
|
||||
import android.widget.ArrayAdapter;
|
||||
import android.widget.EditText;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.ListView;
|
||||
import android.widget.RelativeLayout;
|
||||
import android.widget.Spinner;
|
||||
import android.widget.Button;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
import androidx.core.app.ActivityCompat;
|
||||
import androidx.core.content.ContextCompat;
|
||||
import androidx.lifecycle.ViewModelProvider;
|
||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
|
||||
import com.google.android.material.floatingactionbutton.FloatingActionButton;
|
||||
import com.bumptech.glide.Glide;
|
||||
import com.bumptech.glide.load.resource.bitmap.CenterCrop;
|
||||
import com.bumptech.glide.load.resource.bitmap.RoundedCorners;
|
||||
import com.bumptech.glide.request.RequestOptions;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
@ -46,55 +53,58 @@ import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import app.fedilab.fedilabtube.asynctasks.ManagePlaylistsAsyncTask;
|
||||
import app.fedilab.fedilabtube.asynctasks.RetrievePeertubeChannelsAsyncTask;
|
||||
import app.fedilab.fedilabtube.client.APIResponse;
|
||||
import app.fedilab.fedilabtube.client.HttpsConnection;
|
||||
import app.fedilab.fedilabtube.client.PeertubeAPI;
|
||||
import app.fedilab.fedilabtube.client.entities.Account;
|
||||
import app.fedilab.fedilabtube.client.entities.Playlist;
|
||||
import app.fedilab.fedilabtube.client.entities.PlaylistElement;
|
||||
import app.fedilab.fedilabtube.client.RetrofitPeertubeAPI;
|
||||
import app.fedilab.fedilabtube.client.data.ChannelData;
|
||||
import app.fedilab.fedilabtube.client.data.PlaylistData.Playlist;
|
||||
import app.fedilab.fedilabtube.client.entities.Item;
|
||||
import app.fedilab.fedilabtube.client.entities.PlaylistParams;
|
||||
import app.fedilab.fedilabtube.databinding.ActivityAllPlaylistBinding;
|
||||
import app.fedilab.fedilabtube.databinding.AddPlaylistBinding;
|
||||
import app.fedilab.fedilabtube.drawer.PlaylistAdapter;
|
||||
import app.fedilab.fedilabtube.interfaces.OnPlaylistActionInterface;
|
||||
import app.fedilab.fedilabtube.interfaces.OnRetrievePeertubeInterface;
|
||||
import app.fedilab.fedilabtube.helper.Helper;
|
||||
import app.fedilab.fedilabtube.viewmodel.ChannelsVM;
|
||||
import app.fedilab.fedilabtube.viewmodel.PlaylistsVM;
|
||||
import es.dmoral.toasty.Toasty;
|
||||
|
||||
import static app.fedilab.fedilabtube.asynctasks.RetrievePeertubeInformationAsyncTask.peertubeInformation;
|
||||
import static app.fedilab.fedilabtube.PeertubeUploadActivity.MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE;
|
||||
import static app.fedilab.fedilabtube.helper.Helper.peertubeInformation;
|
||||
|
||||
|
||||
public class AllPlaylistsActivity extends AppCompatActivity implements OnPlaylistActionInterface, OnRetrievePeertubeInterface {
|
||||
public class AllPlaylistsActivity extends AppCompatActivity implements PlaylistAdapter.AllPlaylistRemoved {
|
||||
|
||||
|
||||
private static final int PICK_AVATAR = 467;
|
||||
PlaylistAdapter playlistAdapter;
|
||||
private AsyncTask<Void, Void, Void> asyncTask;
|
||||
private RelativeLayout mainLoader;
|
||||
private RelativeLayout textviewNoAction;
|
||||
private HashMap<Integer, String> privacyToSend;
|
||||
private Spinner set_upload_channel;
|
||||
private Spinner set_upload_privacy;
|
||||
private String idChannel;
|
||||
private List<Playlist> playlists;
|
||||
private Playlist playlistToEdit;
|
||||
private List<ChannelData.Channel> myChannels;
|
||||
private ChannelData.Channel selectedChannel;
|
||||
private AddPlaylistBinding bindingDialog;
|
||||
private Uri inputData;
|
||||
private ActivityAllPlaylistBinding binding;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
setContentView(R.layout.activity_all_playlist);
|
||||
binding = ActivityAllPlaylistBinding.inflate(getLayoutInflater());
|
||||
View viewRoot = binding.getRoot();
|
||||
setContentView(viewRoot);
|
||||
|
||||
if (getSupportActionBar() != null)
|
||||
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
||||
setTitle(R.string.playlists);
|
||||
|
||||
|
||||
textviewNoAction = findViewById(R.id.no_action);
|
||||
mainLoader = findViewById(R.id.loader);
|
||||
RelativeLayout nextElementLoader = findViewById(R.id.loading_next_items);
|
||||
mainLoader.setVisibility(View.VISIBLE);
|
||||
nextElementLoader.setVisibility(View.GONE);
|
||||
binding.loader.setVisibility(View.VISIBLE);
|
||||
binding.loadingNextItems.setVisibility(View.GONE);
|
||||
idChannel = null;
|
||||
|
||||
asyncTask = new ManagePlaylistsAsyncTask(AllPlaylistsActivity.this, ManagePlaylistsAsyncTask.action.GET_PLAYLIST, null, null, null, AllPlaylistsActivity.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
|
||||
FloatingActionButton add_new = findViewById(R.id.add_new);
|
||||
PlaylistsVM viewModel = new ViewModelProvider(AllPlaylistsActivity.this).get(PlaylistsVM.class);
|
||||
viewModel.manage(PlaylistsVM.action.GET_PLAYLISTS, null, null).observe(AllPlaylistsActivity.this, apiResponse -> manageVIewPlaylists(PlaylistsVM.action.GET_PLAYLISTS, apiResponse));
|
||||
|
||||
|
||||
LinkedHashMap<Integer, String> privaciesInit = new LinkedHashMap<>(peertubeInformation.getPrivacies());
|
||||
@ -106,103 +116,17 @@ public class AllPlaylistsActivity extends AppCompatActivity implements OnPlaylis
|
||||
|
||||
|
||||
playlists = new ArrayList<>();
|
||||
ListView lv_playlist = findViewById(R.id.lv_playlist);
|
||||
playlistAdapter = new PlaylistAdapter(AllPlaylistsActivity.this, playlists, textviewNoAction);
|
||||
lv_playlist.setAdapter(playlistAdapter);
|
||||
|
||||
add_new.setOnClickListener(view -> {
|
||||
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(AllPlaylistsActivity.this);
|
||||
LayoutInflater inflater1 = getLayoutInflater();
|
||||
View dialogView = inflater1.inflate(R.layout.add_playlist, new LinearLayout(AllPlaylistsActivity.this), false);
|
||||
dialogBuilder.setView(dialogView);
|
||||
EditText display_name = dialogView.findViewById(R.id.display_name);
|
||||
EditText description = dialogView.findViewById(R.id.description);
|
||||
set_upload_channel = dialogView.findViewById(R.id.set_upload_channel);
|
||||
set_upload_privacy = dialogView.findViewById(R.id.set_upload_privacy);
|
||||
|
||||
|
||||
new RetrievePeertubeChannelsAsyncTask(AllPlaylistsActivity.this, AllPlaylistsActivity.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
|
||||
|
||||
display_name.setFilters(new InputFilter[]{new InputFilter.LengthFilter(120)});
|
||||
description.setFilters(new InputFilter[]{new InputFilter.LengthFilter(1000)});
|
||||
|
||||
dialogBuilder.setPositiveButton(R.string.validate, (dialog, id) -> {
|
||||
|
||||
if (display_name.getText() != null && display_name.getText().toString().trim().length() > 0) {
|
||||
PlaylistElement playlistElement = new PlaylistElement();
|
||||
playlistElement.setDisplayName(display_name.getText().toString().trim());
|
||||
if (description.getText() != null && description.getText().toString().trim().length() > 0) {
|
||||
playlistElement.setDescription(description.getText().toString().trim());
|
||||
}
|
||||
playlistElement.setVideoChannelId(idChannel);
|
||||
String idPrivacy;
|
||||
String label;
|
||||
Map.Entry<Integer, String> privacyM = privacyToSend.entrySet().iterator().next();
|
||||
idPrivacy = String.valueOf(privacyM.getKey());
|
||||
label = privacyM.getValue();
|
||||
if ((label.equals("Public") && (playlistElement.getVideoChannelId() == null || playlistElement.getVideoChannelId().equals("")))) {
|
||||
Toasty.error(AllPlaylistsActivity.this, getString(R.string.error_channel_mandatory), Toast.LENGTH_LONG).show();
|
||||
} else {
|
||||
if (privacyToSend != null) {
|
||||
playlistElement.setPrivacy(idPrivacy);
|
||||
}
|
||||
new Thread(() -> {
|
||||
try {
|
||||
String playlistId = new PeertubeAPI(AllPlaylistsActivity.this).createPlaylist(playlistElement);
|
||||
Handler mainHandler = new Handler(Looper.getMainLooper());
|
||||
Runnable myRunnable = () -> {
|
||||
Playlist playlist = new Playlist();
|
||||
playlist.setId(playlistId);
|
||||
playlist.setDescription(playlistElement.getDescription());
|
||||
playlist.setDisplayName(playlistElement.getDisplayName());
|
||||
playlist.setPrivacy(privacyToSend);
|
||||
playlists.add(playlist);
|
||||
playlistAdapter.notifyDataSetChanged();
|
||||
};
|
||||
mainHandler.post(myRunnable);
|
||||
} catch (HttpsConnection.HttpsConnectionException e) {
|
||||
e.printStackTrace();
|
||||
Handler mainHandler = new Handler(Looper.getMainLooper());
|
||||
Runnable myRunnable = () -> {
|
||||
if (e.getMessage() != null) {
|
||||
Toasty.error(AllPlaylistsActivity.this, e.getMessage(), Toast.LENGTH_LONG).show();
|
||||
} else {
|
||||
Toasty.error(AllPlaylistsActivity.this, getString(R.string.toast_error), Toast.LENGTH_LONG).show();
|
||||
}
|
||||
};
|
||||
mainHandler.post(myRunnable);
|
||||
}
|
||||
}).start();
|
||||
dialog.dismiss();
|
||||
}
|
||||
} else {
|
||||
Toasty.error(AllPlaylistsActivity.this, getString(R.string.error_display_name), Toast.LENGTH_LONG).show();
|
||||
}
|
||||
|
||||
});
|
||||
dialogBuilder.setNegativeButton(R.string.cancel, (dialog, id) -> dialog.dismiss());
|
||||
|
||||
|
||||
AlertDialog alertDialog = dialogBuilder.create();
|
||||
alertDialog.setTitle(getString(R.string.action_playlist_create));
|
||||
alertDialog.setOnDismissListener(dialogInterface -> {
|
||||
//Hide keyboard
|
||||
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
|
||||
assert imm != null;
|
||||
imm.hideSoftInputFromWindow(display_name.getWindowToken(), 0);
|
||||
});
|
||||
if (alertDialog.getWindow() != null)
|
||||
alertDialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
|
||||
alertDialog.show();
|
||||
});
|
||||
playlistAdapter = new PlaylistAdapter(playlists, false);
|
||||
playlistAdapter.allPlaylistRemoved = this;
|
||||
binding.lvPlaylist.setAdapter(playlistAdapter);
|
||||
LinearLayoutManager mLayoutManager = new LinearLayoutManager(AllPlaylistsActivity.this);
|
||||
binding.lvPlaylist.setLayoutManager(mLayoutManager);
|
||||
binding.addNew.setOnClickListener(view -> manageAlert(null));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
super.onDestroy();
|
||||
if (asyncTask != null && !asyncTask.isCancelled()) {
|
||||
asyncTask.cancel(true);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -215,39 +139,163 @@ public class AllPlaylistsActivity extends AppCompatActivity implements OnPlaylis
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onActionDone(ManagePlaylistsAsyncTask.action actionType, APIResponse apiResponse, int statusCode) {
|
||||
mainLoader.setVisibility(View.GONE);
|
||||
public void manageVIewPlaylists(PlaylistsVM.action actionType, APIResponse apiResponse) {
|
||||
binding.loader.setVisibility(View.GONE);
|
||||
if (apiResponse.getError() != null) {
|
||||
Toasty.error(AllPlaylistsActivity.this, apiResponse.getError().getError(), Toast.LENGTH_LONG).show();
|
||||
return;
|
||||
}
|
||||
|
||||
if (actionType == ManagePlaylistsAsyncTask.action.GET_PLAYLIST) {
|
||||
if (actionType == PlaylistsVM.action.GET_PLAYLISTS) {
|
||||
if (apiResponse.getPlaylists() != null && apiResponse.getPlaylists().size() > 0) {
|
||||
playlists.addAll(apiResponse.getPlaylists());
|
||||
playlistAdapter.notifyDataSetChanged();
|
||||
textviewNoAction.setVisibility(View.GONE);
|
||||
binding.noAction.setVisibility(View.GONE);
|
||||
} else {
|
||||
textviewNoAction.setVisibility(View.VISIBLE);
|
||||
binding.noAction.setVisibility(View.VISIBLE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void manageAlert(Playlist playlistParam) {
|
||||
|
||||
@Override
|
||||
public void onRetrievePeertube(APIResponse apiResponse) {
|
||||
playlistToEdit = playlistParam;
|
||||
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(AllPlaylistsActivity.this);
|
||||
bindingDialog = AddPlaylistBinding.inflate(LayoutInflater.from(AllPlaylistsActivity.this), null, false);
|
||||
dialogBuilder.setView(bindingDialog.getRoot());
|
||||
|
||||
dialogBuilder.setView(bindingDialog.getRoot());
|
||||
|
||||
|
||||
ChannelsVM viewModelC = new ViewModelProvider(AllPlaylistsActivity.this).get(ChannelsVM.class);
|
||||
viewModelC.get(RetrofitPeertubeAPI.DataType.MY_CHANNELS, null).observe(AllPlaylistsActivity.this, this::manageVIewChannels);
|
||||
|
||||
bindingDialog.displayName.setFilters(new InputFilter[]{new InputFilter.LengthFilter(120)});
|
||||
bindingDialog.description.setFilters(new InputFilter[]{new InputFilter.LengthFilter(1000)});
|
||||
|
||||
if (playlistToEdit != null) {
|
||||
bindingDialog.displayName.setText(playlistToEdit.getDisplayName());
|
||||
bindingDialog.description.setText(playlistToEdit.getDescription());
|
||||
}
|
||||
dialogBuilder.setPositiveButton(R.string.validate, null);
|
||||
dialogBuilder.setNegativeButton(R.string.cancel, (dialog, id) -> dialog.dismiss());
|
||||
|
||||
AlertDialog alertDialog = dialogBuilder.create();
|
||||
|
||||
bindingDialog.selectFile.setOnClickListener(v -> {
|
||||
if (ContextCompat.checkSelfPermission(AllPlaylistsActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) !=
|
||||
PackageManager.PERMISSION_GRANTED) {
|
||||
ActivityCompat.requestPermissions(AllPlaylistsActivity.this,
|
||||
new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
|
||||
MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE);
|
||||
return;
|
||||
}
|
||||
|
||||
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
|
||||
intent.addCategory(Intent.CATEGORY_OPENABLE);
|
||||
intent.setType("*/*");
|
||||
String[] mimetypes = {"image/*"};
|
||||
intent.putExtra(Intent.EXTRA_MIME_TYPES, mimetypes);
|
||||
startActivityForResult(intent, PICK_AVATAR);
|
||||
});
|
||||
Helper.loadGiF(AllPlaylistsActivity.this, playlistParam != null ? playlistParam.getThumbnailPath() : null, bindingDialog.profilePicture);
|
||||
alertDialog.setOnShowListener(dialogInterface -> {
|
||||
|
||||
Button button = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE);
|
||||
button.setOnClickListener(view -> {
|
||||
if (bindingDialog.displayName.getText() != null && bindingDialog.displayName.getText().toString().trim().length() > 0) {
|
||||
PlaylistParams playlistElement = new PlaylistParams();
|
||||
playlistElement.setDisplayName(bindingDialog.displayName.getText().toString().trim());
|
||||
if (bindingDialog.description.getText() != null && bindingDialog.description.getText().toString().trim().length() > 0) {
|
||||
playlistElement.setDescription(bindingDialog.description.getText().toString().trim());
|
||||
}
|
||||
playlistElement.setVideoChannelId(idChannel);
|
||||
String label;
|
||||
Map.Entry<Integer, String> privacyM = privacyToSend.entrySet().iterator().next();
|
||||
Item privacyItem = new Item();
|
||||
privacyItem.setId(privacyM.getKey());
|
||||
privacyItem.setLabel(privacyM.getValue());
|
||||
label = privacyM.getValue();
|
||||
if ((label.trim().compareTo("Public") == 0 && (playlistElement.getVideoChannelId() == null || playlistElement.getVideoChannelId().trim().compareTo("null") == 0))) {
|
||||
Toasty.error(AllPlaylistsActivity.this, getString(R.string.error_channel_mandatory), Toast.LENGTH_LONG).show();
|
||||
} else {
|
||||
if (privacyToSend != null) {
|
||||
playlistElement.setPrivacy(privacyItem.getId());
|
||||
}
|
||||
new Thread(() -> {
|
||||
String playlistId;
|
||||
if (playlistToEdit == null) {
|
||||
APIResponse apiResponse = new RetrofitPeertubeAPI(AllPlaylistsActivity.this).createOrUpdatePlaylist(PlaylistsVM.action.CREATE_PLAYLIST, null, playlistElement, inputData);
|
||||
playlistId = apiResponse.getActionReturn();
|
||||
} else {
|
||||
playlistId = playlistToEdit.getId();
|
||||
new RetrofitPeertubeAPI(AllPlaylistsActivity.this).createOrUpdatePlaylist(PlaylistsVM.action.UPDATE_PLAYLIST, playlistId, playlistElement, inputData);
|
||||
}
|
||||
Handler mainHandler = new Handler(Looper.getMainLooper());
|
||||
Runnable myRunnable = () -> {
|
||||
Playlist playlist;
|
||||
if (playlistToEdit == null) {
|
||||
playlist = new Playlist();
|
||||
} else {
|
||||
playlist = playlistToEdit;
|
||||
}
|
||||
playlist.setId(playlistId);
|
||||
playlist.setUuid(playlistId);
|
||||
playlist.setDescription(playlistElement.getDescription());
|
||||
playlist.setDisplayName(playlistElement.getDisplayName());
|
||||
playlist.setVideoChannel(selectedChannel);
|
||||
playlist.setPrivacy(privacyItem);
|
||||
if (playlistToEdit == null) {
|
||||
playlists.add(playlist);
|
||||
}
|
||||
playlistAdapter.notifyDataSetChanged();
|
||||
};
|
||||
mainHandler.post(myRunnable);
|
||||
}).start();
|
||||
alertDialog.dismiss();
|
||||
}
|
||||
} else {
|
||||
Toasty.error(AllPlaylistsActivity.this, getString(R.string.error_display_name), Toast.LENGTH_LONG).show();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
if (playlistToEdit == null) {
|
||||
alertDialog.setTitle(getString(R.string.action_playlist_create));
|
||||
} else {
|
||||
alertDialog.setTitle(getString(R.string.action_playlist_edit));
|
||||
}
|
||||
alertDialog.setOnDismissListener(dialogInterface -> {
|
||||
//Hide keyboard
|
||||
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
|
||||
assert imm != null;
|
||||
imm.hideSoftInputFromWindow(bindingDialog.displayName.getWindowToken(), 0);
|
||||
});
|
||||
if (alertDialog.getWindow() != null)
|
||||
alertDialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
|
||||
alertDialog.show();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onRetrievePeertubeComments(APIResponse apiResponse) {
|
||||
|
||||
@Override
|
||||
public void onActivityResult(int requestCode, int resultCode, Intent data) {
|
||||
super.onActivityResult(requestCode, resultCode, data);
|
||||
if (requestCode == PICK_AVATAR && resultCode == Activity.RESULT_OK) {
|
||||
if (data == null || data.getData() == null) {
|
||||
Toasty.error(AllPlaylistsActivity.this, getString(R.string.toot_select_image_error), Toast.LENGTH_LONG).show();
|
||||
return;
|
||||
}
|
||||
inputData = data.getData();
|
||||
Glide.with(AllPlaylistsActivity.this)
|
||||
.load(inputData)
|
||||
.thumbnail(0.1f)
|
||||
.apply(new RequestOptions().transform(new CenterCrop(), new RoundedCorners(10)))
|
||||
.into(bindingDialog.profilePicture);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onRetrievePeertubeChannels(APIResponse apiResponse) {
|
||||
if (apiResponse.getError() != null || apiResponse.getAccounts() == null || apiResponse.getAccounts().size() == 0) {
|
||||
public void manageVIewChannels(APIResponse apiResponse) {
|
||||
if (apiResponse.getError() != null || apiResponse.getChannels() == null || apiResponse.getChannels().size() == 0) {
|
||||
if (apiResponse.getError() != null && apiResponse.getError().getError() != null)
|
||||
Toasty.error(AllPlaylistsActivity.this, apiResponse.getError().getError(), Toast.LENGTH_LONG).show();
|
||||
else
|
||||
@ -256,22 +304,23 @@ public class AllPlaylistsActivity extends AppCompatActivity implements OnPlaylis
|
||||
}
|
||||
|
||||
//Populate channels
|
||||
List<Account> accounts = apiResponse.getAccounts();
|
||||
String[] channelName = new String[accounts.size() + 1];
|
||||
String[] channelId = new String[accounts.size() + 1];
|
||||
myChannels = apiResponse.getChannels();
|
||||
String[] channelName = new String[myChannels.size() + 1];
|
||||
String[] channelId = new String[myChannels.size() + 1];
|
||||
int i = 1;
|
||||
channelName[0] = "";
|
||||
channelId[0] = "null";
|
||||
|
||||
for (Account account : accounts) {
|
||||
channelName[i] = account.getUsername();
|
||||
channelId[i] = account.getId();
|
||||
for (ChannelData.Channel channel : myChannels) {
|
||||
channelName[i] = channel.getName();
|
||||
channelId[i] = channel.getId();
|
||||
i++;
|
||||
}
|
||||
|
||||
ArrayAdapter<String> adapterChannel = new ArrayAdapter<>(AllPlaylistsActivity.this,
|
||||
android.R.layout.simple_spinner_dropdown_item, channelName);
|
||||
set_upload_channel.setAdapter(adapterChannel);
|
||||
bindingDialog.setUploadChannel.setAdapter(adapterChannel);
|
||||
|
||||
|
||||
LinkedHashMap<String, String> translations = null;
|
||||
if (peertubeInformation.getTranslations() != null)
|
||||
@ -298,10 +347,19 @@ public class AllPlaylistsActivity extends AppCompatActivity implements OnPlaylis
|
||||
|
||||
ArrayAdapter<String> adapterPrivacies = new ArrayAdapter<>(AllPlaylistsActivity.this,
|
||||
android.R.layout.simple_spinner_dropdown_item, privaciesA);
|
||||
set_upload_privacy.setAdapter(adapterPrivacies);
|
||||
bindingDialog.setUploadPrivacy.setAdapter(adapterPrivacies);
|
||||
|
||||
if (playlistToEdit != null) {
|
||||
Item privacy = playlistToEdit.getPrivacy();
|
||||
if (privacy.getId() > 0) {
|
||||
bindingDialog.setUploadPrivacy.setSelection(privacy.getId() - 1);
|
||||
}
|
||||
} else {
|
||||
bindingDialog.setUploadPrivacy.setSelection(2);
|
||||
}
|
||||
|
||||
//Manage privacies
|
||||
set_upload_privacy.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
|
||||
bindingDialog.setUploadPrivacy.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
|
||||
@Override
|
||||
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
|
||||
LinkedHashMap<Integer, String> privaciesCheck = new LinkedHashMap<>(peertubeInformation.getPrivacies());
|
||||
@ -324,11 +382,23 @@ public class AllPlaylistsActivity extends AppCompatActivity implements OnPlaylis
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
if (playlistToEdit != null) {
|
||||
Item privacy = playlistToEdit.getPrivacy();
|
||||
|
||||
if (privacy.getId() > 0) {
|
||||
bindingDialog.setUploadPrivacy.setSelection(privacy.getId() - 1);
|
||||
}
|
||||
}
|
||||
|
||||
//Manage languages
|
||||
set_upload_channel.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
|
||||
bindingDialog.setUploadChannel.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
|
||||
@Override
|
||||
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
|
||||
idChannel = channelId[position];
|
||||
if (position > 0) {
|
||||
selectedChannel = myChannels.get(position - 1);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -336,5 +406,23 @@ public class AllPlaylistsActivity extends AppCompatActivity implements OnPlaylis
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
if (playlistToEdit != null) {
|
||||
int position = 0;
|
||||
int k = 1;
|
||||
for (ChannelData.Channel ac : myChannels) {
|
||||
if (playlistToEdit.getVideoChannel() != null && playlistToEdit.getVideoChannel().getId() != null && ac.getId().compareTo(playlistToEdit.getVideoChannel().getId()) == 0) {
|
||||
position = k;
|
||||
break;
|
||||
}
|
||||
k++;
|
||||
}
|
||||
bindingDialog.setUploadChannel.setSelection(position);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAllPlaylistRemoved() {
|
||||
binding.noAction.setVisibility(View.VISIBLE);
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,83 @@
|
||||
package app.fedilab.fedilabtube;
|
||||
/* Copyright 2020 Thomas Schneider
|
||||
*
|
||||
* This file is a part of TubeLab
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it under the terms of the
|
||||
* GNU General Public License as published by the Free Software Foundation; either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* TubeLab is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
|
||||
* the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
||||
* Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with TubeLab; if not,
|
||||
* see <http://www.gnu.org/licenses>. */
|
||||
|
||||
import android.app.NotificationChannel;
|
||||
import android.app.NotificationManager;
|
||||
import android.content.Context;
|
||||
import android.content.SharedPreferences;
|
||||
import android.os.Build;
|
||||
|
||||
import androidx.multidex.MultiDex;
|
||||
import androidx.multidex.MultiDexApplication;
|
||||
import androidx.work.Configuration;
|
||||
import androidx.work.WorkManager;
|
||||
|
||||
import net.gotev.uploadservice.UploadServiceConfig;
|
||||
import net.gotev.uploadservice.observer.request.GlobalRequestObserver;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
import app.fedilab.fedilabtube.helper.Helper;
|
||||
import app.fedilab.fedilabtube.helper.ThemeHelper;
|
||||
import app.fedilab.fedilabtube.services.GlobalUploadObserver;
|
||||
import app.fedilab.fedilabtube.worker.WorkHelper;
|
||||
|
||||
public class BaseFedilabTube extends MultiDexApplication {
|
||||
|
||||
static String UPLOAD_CHANNEL_ID = "upload_info_peertube";
|
||||
|
||||
@Override
|
||||
public void onCreate() {
|
||||
super.onCreate();
|
||||
SharedPreferences sharedpreferences = getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE);
|
||||
int interval = sharedpreferences.getInt(Helper.NOTIFICATION_INTERVAL, 60);
|
||||
|
||||
Configuration myConfig = new Configuration.Builder()
|
||||
.setMinimumLoggingLevel(android.util.Log.INFO)
|
||||
.build();
|
||||
WorkManager.initialize(BaseFedilabTube.this, myConfig);
|
||||
if (interval >= 15) {
|
||||
WorkHelper.fetchNotifications(this, interval);
|
||||
}
|
||||
createNotificationChannel();
|
||||
UploadServiceConfig.initialize(BaseFedilabTube.this, UPLOAD_CHANNEL_ID, true);
|
||||
|
||||
new GlobalRequestObserver(this, new GlobalUploadObserver());
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected void attachBaseContext(Context base) {
|
||||
super.attachBaseContext(base);
|
||||
|
||||
MultiDex.install(BaseFedilabTube.this);
|
||||
SharedPreferences sharedpreferences = getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE);
|
||||
int themePref = sharedpreferences.getInt(Helper.SET_THEME, Helper.DEFAULT_MODE);
|
||||
ThemeHelper.switchTo(themePref);
|
||||
|
||||
|
||||
}
|
||||
|
||||
private void createNotificationChannel() {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||
NotificationChannel channel = new NotificationChannel(UPLOAD_CHANNEL_ID,
|
||||
getString(R.string.notification_channel_name),
|
||||
NotificationManager.IMPORTANCE_LOW);
|
||||
channel.setSound(null, null);
|
||||
((NotificationManager) Objects.requireNonNull(getSystemService(Context.NOTIFICATION_SERVICE))).createNotificationChannel(channel);
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,282 @@
|
||||
package app.fedilab.fedilabtube;
|
||||
/* Copyright 2020 Thomas Schneider
|
||||
*
|
||||
* This file is a part of TubeLab
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it under the terms of the
|
||||
* GNU General Public License as published by the Free Software Foundation; either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* TubeLab is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
|
||||
* the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
||||
* Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with TubeLab; if not,
|
||||
* see <http://www.gnu.org/licenses>. */
|
||||
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.text.SpannableStringBuilder;
|
||||
import android.text.Spanned;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.widget.AdapterView;
|
||||
import android.widget.ArrayAdapter;
|
||||
import android.widget.Button;
|
||||
import android.widget.RelativeLayout;
|
||||
import android.widget.Spinner;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
import androidx.lifecycle.ViewModelProvider;
|
||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import app.fedilab.fedilabtube.client.APIResponse;
|
||||
import app.fedilab.fedilabtube.client.data.InstanceData;
|
||||
import app.fedilab.fedilabtube.client.entities.InstanceParams;
|
||||
import app.fedilab.fedilabtube.drawer.InstanceAdapter;
|
||||
import app.fedilab.fedilabtube.helper.RoundedBackgroundSpan;
|
||||
import app.fedilab.fedilabtube.viewmodel.InstancesVM;
|
||||
import es.dmoral.toasty.Toasty;
|
||||
|
||||
import static app.fedilab.fedilabtube.helper.Helper.peertubeInformation;
|
||||
|
||||
|
||||
public class InstancePickerActivity extends AppCompatActivity {
|
||||
|
||||
|
||||
boolean[] checkedItemsCategory;
|
||||
int[] itemsKeyCategory;
|
||||
String[] itemsLabelCategory;
|
||||
boolean[] checkedItemsLanguage;
|
||||
String[] itemsKeyLanguage;
|
||||
String[] itemsLabelLanguage;
|
||||
InstanceParams instanceParams;
|
||||
private RelativeLayout mainLoader, textviewNoAction;
|
||||
private TextView categories_view, languages_view;
|
||||
private InstancesVM viewModel;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
if (getSupportActionBar() != null)
|
||||
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
||||
|
||||
|
||||
setContentView(R.layout.activity_instance_picker);
|
||||
|
||||
mainLoader = findViewById(R.id.loader);
|
||||
textviewNoAction = findViewById(R.id.no_action);
|
||||
mainLoader.setVisibility(View.VISIBLE);
|
||||
Button pickup_categories = findViewById(R.id.pickup_categories);
|
||||
Button pickup_languages = findViewById(R.id.pickup_languages);
|
||||
categories_view = findViewById(R.id.categories_view);
|
||||
languages_view = findViewById(R.id.languages_view);
|
||||
Spinner sensitive = findViewById(R.id.sensitive);
|
||||
|
||||
String[] channelSensitive = new String[]{"do_not_list", "blur", "display", "no_opinion"};
|
||||
String[] channelSensitivesLabel = new String[]{getString(R.string.do_not_list), getString(R.string.blur), getString(R.string.display), getString(R.string.no_opinion)};
|
||||
ArrayAdapter<String> adapterChannel = new ArrayAdapter<>(InstancePickerActivity.this,
|
||||
android.R.layout.simple_spinner_dropdown_item, channelSensitivesLabel);
|
||||
sensitive.setAdapter(adapterChannel);
|
||||
|
||||
|
||||
viewModel = new ViewModelProvider(InstancePickerActivity.this).get(InstancesVM.class);
|
||||
|
||||
sensitive.setSelection(1, false);
|
||||
sensitive.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
|
||||
@Override
|
||||
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
|
||||
instanceParams.setNsfwPolicy(channelSensitive[position]);
|
||||
mainLoader.setVisibility(View.VISIBLE);
|
||||
viewModel.getInstances(instanceParams).observe(InstancePickerActivity.this, apiResponse -> manageVIewInstance(apiResponse));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNothingSelected(AdapterView<?> parent) {
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
if (peertubeInformation != null && peertubeInformation.getLanguages() != null) {
|
||||
LinkedHashMap<String, String> languages = new LinkedHashMap<>(peertubeInformation.getLanguages());
|
||||
checkedItemsLanguage = new boolean[languages.size()];
|
||||
itemsLabelLanguage = new String[languages.size()];
|
||||
itemsKeyLanguage = new String[languages.size()];
|
||||
|
||||
pickup_languages.setOnClickListener(v -> {
|
||||
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(InstancePickerActivity.this);
|
||||
|
||||
int i = 0;
|
||||
if (languages.size() > 0) {
|
||||
Iterator<Map.Entry<String, String>> it = languages.entrySet().iterator();
|
||||
while (it.hasNext()) {
|
||||
Map.Entry<String, String> pair = it.next();
|
||||
itemsLabelLanguage[i] = pair.getValue();
|
||||
checkedItemsLanguage[i] = false;
|
||||
itemsKeyLanguage[i] = pair.getKey();
|
||||
it.remove();
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
dialogBuilder.setMultiChoiceItems(itemsLabelLanguage, checkedItemsLanguage, (dialog, which, isChecked) -> {
|
||||
// The user checked or unchecked a box
|
||||
checkedItemsLanguage[which] = isChecked;
|
||||
});
|
||||
|
||||
dialogBuilder.setOnDismissListener(dialogInterface -> {
|
||||
|
||||
SpannableStringBuilder stringBuilder = new SpannableStringBuilder();
|
||||
String between = "";
|
||||
stringBuilder.append(between);
|
||||
List<String> langs = new ArrayList<>();
|
||||
int j = 0;
|
||||
for (boolean itemcheked : checkedItemsLanguage) {
|
||||
if (itemcheked) {
|
||||
langs.add(itemsKeyLanguage[j]);
|
||||
String lang = itemsLabelLanguage[j];
|
||||
if (lang != null && lang.trim().toLowerCase().compareTo("null") != 0) {
|
||||
if (between.length() == 0) between = " ";
|
||||
String tag = " " + lang + " ";
|
||||
stringBuilder.append(tag);
|
||||
stringBuilder.setSpan(new RoundedBackgroundSpan(InstancePickerActivity.this), stringBuilder.length() - tag.length(), stringBuilder.length() - tag.length() + tag.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
|
||||
stringBuilder.append(" ");
|
||||
}
|
||||
}
|
||||
j++;
|
||||
}
|
||||
instanceParams.setLanguagesOr(langs);
|
||||
languages_view.setText(stringBuilder, TextView.BufferType.SPANNABLE);
|
||||
if (languages_view.getText().toString().trim().length() > 0) {
|
||||
languages_view.setVisibility(View.VISIBLE);
|
||||
} else {
|
||||
languages_view.setVisibility(View.GONE);
|
||||
}
|
||||
mainLoader.setVisibility(View.VISIBLE);
|
||||
viewModel.getInstances(instanceParams).observe(InstancePickerActivity.this, this::manageVIewInstance);
|
||||
});
|
||||
dialogBuilder.setPositiveButton(R.string.validate, (dialog, id) -> dialog.dismiss());
|
||||
|
||||
AlertDialog alertDialog = dialogBuilder.create();
|
||||
alertDialog.setTitle(getString(R.string.pickup_languages));
|
||||
alertDialog.show();
|
||||
});
|
||||
}
|
||||
|
||||
if (peertubeInformation != null && peertubeInformation.getCategories() != null) {
|
||||
LinkedHashMap<Integer, String> categories = new LinkedHashMap<>(peertubeInformation.getCategories());
|
||||
checkedItemsCategory = new boolean[categories.size()];
|
||||
itemsLabelCategory = new String[categories.size()];
|
||||
itemsKeyCategory = new int[categories.size()];
|
||||
|
||||
|
||||
pickup_categories.setOnClickListener(v -> {
|
||||
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(InstancePickerActivity.this);
|
||||
int i = 0;
|
||||
if (categories.size() > 0) {
|
||||
Iterator<Map.Entry<Integer, String>> it = categories.entrySet().iterator();
|
||||
while (it.hasNext()) {
|
||||
Map.Entry<Integer, String> pair = it.next();
|
||||
itemsLabelCategory[i] = pair.getValue();
|
||||
itemsKeyCategory[i] = pair.getKey();
|
||||
checkedItemsCategory[i] = false;
|
||||
it.remove();
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
dialogBuilder.setMultiChoiceItems(itemsLabelCategory, checkedItemsCategory, (dialog, which, isChecked) -> {
|
||||
// The user checked or unchecked a box
|
||||
checkedItemsCategory[which] = isChecked;
|
||||
});
|
||||
|
||||
dialogBuilder.setOnDismissListener(dialogInterface -> {
|
||||
int j = 0;
|
||||
SpannableStringBuilder stringBuilder = new SpannableStringBuilder();
|
||||
String between = "";
|
||||
stringBuilder.append(between);
|
||||
List<Integer> cats = new ArrayList<>();
|
||||
for (boolean itemcheked : checkedItemsCategory) {
|
||||
if (itemcheked) {
|
||||
cats.add(itemsKeyCategory[j]);
|
||||
String cat = itemsLabelCategory[j];
|
||||
if (cat != null && cat.trim().toLowerCase().compareTo("null") != 0) {
|
||||
if (between.length() == 0) between = " ";
|
||||
String tag = " " + cat + " ";
|
||||
stringBuilder.append(tag);
|
||||
stringBuilder.setSpan(new RoundedBackgroundSpan(InstancePickerActivity.this), stringBuilder.length() - tag.length(), stringBuilder.length() - tag.length() + tag.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
|
||||
stringBuilder.append(" ");
|
||||
}
|
||||
}
|
||||
j++;
|
||||
}
|
||||
instanceParams.setCategoriesOr(cats);
|
||||
categories_view.setText(stringBuilder, TextView.BufferType.SPANNABLE);
|
||||
if (categories_view.getText().toString().trim().length() > 0) {
|
||||
categories_view.setVisibility(View.VISIBLE);
|
||||
} else {
|
||||
categories_view.setVisibility(View.GONE);
|
||||
}
|
||||
mainLoader.setVisibility(View.VISIBLE);
|
||||
viewModel.getInstances(instanceParams).observe(InstancePickerActivity.this, this::manageVIewInstance);
|
||||
});
|
||||
dialogBuilder.setPositiveButton(R.string.validate, (dialog, id) -> dialog.dismiss());
|
||||
|
||||
AlertDialog alertDialog = dialogBuilder.create();
|
||||
alertDialog.setTitle(getString(R.string.pickup_categories));
|
||||
alertDialog.show();
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
mainLoader.setVisibility(View.VISIBLE);
|
||||
|
||||
setTitle(R.string.instances_picker);
|
||||
|
||||
instanceParams = new InstanceParams();
|
||||
instanceParams.setNsfwPolicy(channelSensitive[1]);
|
||||
viewModel.getInstances(instanceParams).observe(InstancePickerActivity.this, this::manageVIewInstance);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(MenuItem item) {
|
||||
if (item.getItemId() == android.R.id.home) {
|
||||
finish();
|
||||
return true;
|
||||
}
|
||||
return super.onOptionsItemSelected(item);
|
||||
}
|
||||
|
||||
|
||||
public void manageVIewInstance(APIResponse apiResponse) {
|
||||
mainLoader.setVisibility(View.GONE);
|
||||
if (apiResponse.getError() != null) {
|
||||
Toasty.error(InstancePickerActivity.this, apiResponse.getError().getError(), Toast.LENGTH_LONG).show();
|
||||
return;
|
||||
}
|
||||
List<InstanceData.Instance> instances = apiResponse.getInstances();
|
||||
RecyclerView lv_instances = findViewById(R.id.lv_instances);
|
||||
if ((instances == null || instances.size() == 0)) {
|
||||
textviewNoAction.setVisibility(View.VISIBLE);
|
||||
lv_instances.setVisibility(View.GONE);
|
||||
} else {
|
||||
textviewNoAction.setVisibility(View.GONE);
|
||||
lv_instances.setVisibility(View.VISIBLE);
|
||||
InstanceAdapter instanceAdapter = new InstanceAdapter(instances);
|
||||
lv_instances.setAdapter(instanceAdapter);
|
||||
lv_instances.setLayoutManager(new LinearLayoutManager(InstancePickerActivity.this));
|
||||
}
|
||||
}
|
||||
}
|
@ -16,49 +16,54 @@ package app.fedilab.fedilabtube;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.view.MenuItem;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
import androidx.fragment.app.FragmentTransaction;
|
||||
|
||||
import app.fedilab.fedilabtube.asynctasks.RetrieveFeedsAsyncTask;
|
||||
import app.fedilab.fedilabtube.client.APIResponse;
|
||||
import app.fedilab.fedilabtube.fragment.DisplayStatusFragment;
|
||||
import app.fedilab.fedilabtube.interfaces.OnRetrieveFeedsInterface;
|
||||
import app.fedilab.fedilabtube.client.data.PlaylistData;
|
||||
import app.fedilab.fedilabtube.fragment.DisplayVideosFragment;
|
||||
import app.fedilab.fedilabtube.helper.Helper;
|
||||
import app.fedilab.fedilabtube.viewmodel.TimelineVM;
|
||||
import es.dmoral.toasty.Toasty;
|
||||
|
||||
|
||||
public class MyVideosActivity extends AppCompatActivity implements OnRetrieveFeedsInterface {
|
||||
public class LocalPlaylistsActivity extends AppCompatActivity {
|
||||
|
||||
private RetrieveFeedsAsyncTask.Type type;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
setContentView(R.layout.activity_search_result);
|
||||
|
||||
if (getSupportActionBar() != null)
|
||||
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
||||
|
||||
|
||||
setContentView(R.layout.activity_playlists);
|
||||
|
||||
|
||||
PlaylistData.Playlist playlist;
|
||||
Bundle b = getIntent().getExtras();
|
||||
if (b != null)
|
||||
type = (RetrieveFeedsAsyncTask.Type) b.get("type");
|
||||
|
||||
if (type == RetrieveFeedsAsyncTask.Type.MYVIDEOS) {
|
||||
setTitle(R.string.my_videos);
|
||||
} else if (type == RetrieveFeedsAsyncTask.Type.PSUBSCRIPTIONS) {
|
||||
setTitle(R.string.subscriptions);
|
||||
} else if (type == RetrieveFeedsAsyncTask.Type.PEERTUBE_HISTORY) {
|
||||
setTitle(R.string.my_history);
|
||||
if (b != null) {
|
||||
playlist = b.getParcelable("playlist");
|
||||
if (playlist == null) {
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
Toasty.error(LocalPlaylistsActivity.this, getString(R.string.toast_error), Toast.LENGTH_LONG).show();
|
||||
return;
|
||||
}
|
||||
|
||||
setTitle(playlist.getDisplayName());
|
||||
if (savedInstanceState == null) {
|
||||
DisplayStatusFragment displayStatusFragment = new DisplayStatusFragment();
|
||||
DisplayVideosFragment displayVideosFragment = new DisplayVideosFragment();
|
||||
Bundle bundle = new Bundle();
|
||||
bundle.putSerializable("type", type);
|
||||
displayStatusFragment.setArguments(bundle);
|
||||
bundle.putSerializable(Helper.TIMELINE_TYPE, TimelineVM.TimelineType.VIDEOS_IN_LOCAL_PLAYLIST);
|
||||
bundle.putSerializable("playlistId", playlist.getUuid());
|
||||
displayVideosFragment.setArguments(bundle);
|
||||
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
|
||||
ft.add(R.id.container, displayStatusFragment).commit();
|
||||
ft.add(R.id.nav_host_fragment, displayVideosFragment).commit();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@ -71,9 +76,4 @@ public class MyVideosActivity extends AppCompatActivity implements OnRetrieveFee
|
||||
return super.onOptionsItemSelected(item);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onRetrieveFeeds(APIResponse apiResponse) {
|
||||
|
||||
}
|
||||
}
|
@ -14,78 +14,80 @@ package app.fedilab.fedilabtube;
|
||||
* You should have received a copy of the GNU General Public License along with TubeLab; if not,
|
||||
* see <http://www.gnu.org/licenses>. */
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.content.Intent;
|
||||
import android.content.SharedPreferences;
|
||||
import android.os.AsyncTask;
|
||||
import android.os.Bundle;
|
||||
import android.text.SpannableString;
|
||||
import android.text.Spanned;
|
||||
import android.text.style.ForegroundColorSpan;
|
||||
import android.text.style.UnderlineSpan;
|
||||
import android.util.Patterns;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.Button;
|
||||
import android.widget.EditText;
|
||||
import android.widget.AdapterView;
|
||||
import android.widget.ArrayAdapter;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
import androidx.core.content.ContextCompat;
|
||||
|
||||
import com.google.android.material.textfield.TextInputLayout;
|
||||
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.net.URLEncoder;
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URL;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.Map;
|
||||
|
||||
import app.fedilab.fedilabtube.asynctasks.UpdateAccountInfoAsyncTask;
|
||||
import app.fedilab.fedilabtube.client.HttpsConnection;
|
||||
import app.fedilab.fedilabtube.client.RetrofitPeertubeAPI;
|
||||
import app.fedilab.fedilabtube.client.entities.Error;
|
||||
import app.fedilab.fedilabtube.client.entities.Oauth;
|
||||
import app.fedilab.fedilabtube.client.entities.OauthParams;
|
||||
import app.fedilab.fedilabtube.client.entities.Token;
|
||||
import app.fedilab.fedilabtube.databinding.ActivityLoginBinding;
|
||||
import app.fedilab.fedilabtube.helper.Helper;
|
||||
import app.fedilab.fedilabtube.helper.HelperAcadInstance;
|
||||
import app.fedilab.fedilabtube.helper.HelperInstance;
|
||||
import es.dmoral.toasty.Toasty;
|
||||
|
||||
import static app.fedilab.fedilabtube.client.RetrofitPeertubeAPI.updateCredential;
|
||||
|
||||
|
||||
public class LoginActivity extends AppCompatActivity {
|
||||
|
||||
|
||||
//Peertube notification type
|
||||
public static int NEW_VIDEO_FROM_SUBSCRIPTION = 1;
|
||||
// public static int NEW_COMMENT_ON_MY_VIDEO = 2;
|
||||
// public static int NEW_VIDEO_ABUSE_FOR_MODERATORS = 3;
|
||||
public static int BLACKLIST_ON_MY_VIDEO = 4;
|
||||
public static int UNBLACKLIST_ON_MY_VIDEO = 5;
|
||||
public static int MY_VIDEO_PUBLISHED = 6;
|
||||
public static int MY_VIDEO_IMPORT_SUCCESS = 7;
|
||||
public static int MY_VIDEO_IMPORT_ERROR = 8;
|
||||
private static String client_id;
|
||||
private static String client_secret;
|
||||
private EditText login_uid;
|
||||
private EditText login_passwd;
|
||||
private Button connectionButton;
|
||||
private String actionToken;
|
||||
|
||||
private ActivityLoginBinding binding;
|
||||
private String acadInstance;
|
||||
|
||||
@SuppressLint("SetTextI18n")
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
binding = ActivityLoginBinding.inflate(getLayoutInflater());
|
||||
View view = binding.getRoot();
|
||||
setContentView(view);
|
||||
|
||||
|
||||
setContentView(R.layout.activity_login);
|
||||
if (getSupportActionBar() != null)
|
||||
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
||||
|
||||
TextView create_an_account_peertube = findViewById(R.id.create_an_account_peertube);
|
||||
|
||||
SpannableString content_create = new SpannableString(getString(R.string.join_peertube));
|
||||
SpannableString content_create;
|
||||
if (BuildConfig.FLAVOR.compareTo("queermotion") == 0) {
|
||||
content_create = new SpannableString(getString(R.string.register_account));
|
||||
} else {
|
||||
content_create = new SpannableString(getString(R.string.join_peertube));
|
||||
}
|
||||
|
||||
content_create.setSpan(new UnderlineSpan(), 0, content_create.length(), 0);
|
||||
content_create.setSpan(new ForegroundColorSpan(ContextCompat.getColor(LoginActivity.this, R.color.colorAccent)), 0, content_create.length(),
|
||||
content_create.setSpan(new ForegroundColorSpan(ContextCompat.getColor(LoginActivity.this, Helper.getColorAccent())), 0, content_create.length(),
|
||||
Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
|
||||
create_an_account_peertube.setText(content_create);
|
||||
binding.createAnAccountPeertube.setText(content_create, TextView.BufferType.SPANNABLE);
|
||||
|
||||
create_an_account_peertube.setOnClickListener(v -> {
|
||||
binding.createAnAccountPeertube.setOnClickListener(v -> {
|
||||
Intent mainActivity = new Intent(LoginActivity.this, PeertubeRegisterActivity.class);
|
||||
Bundle b = new Bundle();
|
||||
mainActivity.putExtras(b);
|
||||
@ -93,198 +95,228 @@ public class LoginActivity extends AppCompatActivity {
|
||||
});
|
||||
|
||||
|
||||
login_uid = findViewById(R.id.login_uid);
|
||||
login_passwd = findViewById(R.id.login_passwd);
|
||||
if (BuildConfig.full_instances && BuildConfig.instance_switcher) {
|
||||
binding.loginInstanceContainer.setVisibility(View.VISIBLE);
|
||||
}
|
||||
if (BuildConfig.FLAVOR.compareTo("queermotion") == 0) {
|
||||
binding.loginInstance.setText("queermotion.org");
|
||||
}
|
||||
|
||||
if (Helper.isTablet(LoginActivity.this)) {
|
||||
TextInputLayout login_uid_container = findViewById(R.id.login_uid_container);
|
||||
ViewGroup.LayoutParams layoutParamsU = login_uid_container.getLayoutParams();
|
||||
layoutParamsU.width = (int) Helper.convertDpToPixel(300, LoginActivity.this);
|
||||
login_uid_container.setLayoutParams(layoutParamsU);
|
||||
|
||||
TextInputLayout login_passwd_container = findViewById(R.id.login_passwd_container);
|
||||
ViewGroup.LayoutParams layoutParamsP = login_passwd_container.getLayoutParams();
|
||||
ViewGroup.LayoutParams layoutParamsI = binding.loginInstanceContainer.getLayoutParams();
|
||||
layoutParamsI.width = (int) Helper.convertDpToPixel(300, LoginActivity.this);
|
||||
binding.loginInstanceContainer.setLayoutParams(layoutParamsI);
|
||||
|
||||
ViewGroup.LayoutParams layoutParamsU = binding.loginUidContainer.getLayoutParams();
|
||||
layoutParamsU.width = (int) Helper.convertDpToPixel(300, LoginActivity.this);
|
||||
binding.loginUidContainer.setLayoutParams(layoutParamsU);
|
||||
|
||||
ViewGroup.LayoutParams layoutParamsP = binding.loginPasswdContainer.getLayoutParams();
|
||||
layoutParamsP.width = (int) Helper.convertDpToPixel(300, LoginActivity.this);
|
||||
login_passwd_container.setLayoutParams(layoutParamsP);
|
||||
binding.loginPasswdContainer.setLayoutParams(layoutParamsP);
|
||||
}
|
||||
|
||||
|
||||
connectionButton = findViewById(R.id.login_button);
|
||||
|
||||
login_uid.setOnFocusChangeListener((v, hasFocus) -> {
|
||||
if (!hasFocus) {
|
||||
if (android.util.Patterns.EMAIL_ADDRESS.matcher(login_uid.getText().toString().trim()).matches()) {
|
||||
String[] emailArray = login_uid.getText().toString().split("@");
|
||||
if (emailArray.length > 1 && Arrays.asList(Helper.openid).contains(emailArray[1])) {
|
||||
connectionButton.callOnClick();
|
||||
if (!BuildConfig.full_instances) {
|
||||
binding.loginUid.setOnFocusChangeListener((v, hasFocus) -> {
|
||||
if (!hasFocus) {
|
||||
if (binding.loginUid.getText() != null && android.util.Patterns.EMAIL_ADDRESS.matcher(binding.loginUid.getText().toString().trim()).matches()) {
|
||||
String[] emailArray = binding.loginUid.getText().toString().split("@");
|
||||
if (emailArray.length > 1) {
|
||||
binding.loginButton.callOnClick();
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
binding.loginUidContainer.setVisibility(View.GONE);
|
||||
binding.loginPasswdContainer.setVisibility(View.GONE);
|
||||
binding.loginInstanceContainer.setVisibility(View.GONE);
|
||||
binding.createAnAccountPeertube.setVisibility(View.GONE);
|
||||
binding.instancePickerTitle.setVisibility(View.VISIBLE);
|
||||
binding.instancePicker.setVisibility(View.VISIBLE);
|
||||
|
||||
HashMap<String, String> instancesMap = new HashMap<>(HelperAcadInstance.instances_themes);
|
||||
Iterator<Map.Entry<String, String>> it = instancesMap.entrySet().iterator();
|
||||
String[] academiesKey = new String[HelperAcadInstance.instances_themes.size()];
|
||||
String[] academiesValue = new String[HelperAcadInstance.instances_themes.size()];
|
||||
String acad = HelperInstance.getLiveInstance(LoginActivity.this);
|
||||
int position = 0;
|
||||
int i = 0;
|
||||
while (it.hasNext()) {
|
||||
Map.Entry<String, String> pair = it.next();
|
||||
academiesKey[i] = pair.getKey();
|
||||
academiesValue[i] = pair.getValue();
|
||||
if (pair.getValue().compareTo(acad) == 0) {
|
||||
position = i;
|
||||
}
|
||||
it.remove();
|
||||
i++;
|
||||
}
|
||||
});
|
||||
binding.instancePicker.setSelection(position, true);
|
||||
ArrayAdapter<String> adapterChannel = new ArrayAdapter<>(LoginActivity.this,
|
||||
android.R.layout.simple_spinner_dropdown_item, academiesKey);
|
||||
binding.instancePicker.setAdapter(adapterChannel);
|
||||
binding.instancePicker.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
|
||||
@Override
|
||||
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
|
||||
acadInstance = academiesValue[position];
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNothingSelected(AdapterView<?> parent) {
|
||||
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
connectionButton.setOnClickListener(v -> {
|
||||
|
||||
if (!android.util.Patterns.EMAIL_ADDRESS.matcher(login_uid.getText().toString().trim()).matches()) {
|
||||
Toasty.error(LoginActivity.this, getString(R.string.email_error)).show();
|
||||
return;
|
||||
}
|
||||
String[] emailArray = login_uid.getText().toString().split("@");
|
||||
if (emailArray.length > 1 && !Arrays.asList(Helper.valideEmails).contains(emailArray[1])) {
|
||||
Toasty.error(LoginActivity.this, getString(R.string.email_error_domain, emailArray[1])).show();
|
||||
return;
|
||||
}
|
||||
String host = emailArray[1];
|
||||
String instance = Helper.getPeertubeUrl(host);
|
||||
final HashMap<String, String> parameters = new HashMap<>();
|
||||
connectionButton.setEnabled(false);
|
||||
|
||||
try {
|
||||
instance = URLEncoder.encode(instance, "utf-8");
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
Toasty.error(LoginActivity.this, getString(R.string.client_error), Toast.LENGTH_LONG).show();
|
||||
}
|
||||
|
||||
|
||||
if (Arrays.asList(Helper.openid).contains(host)) {
|
||||
String finalInstance = instance;
|
||||
binding.loginButton.setOnClickListener(v -> {
|
||||
if (!BuildConfig.full_instances) {
|
||||
new Thread(() -> {
|
||||
try {
|
||||
actionToken = "/api/v1/oauth-clients/local";
|
||||
String response = new HttpsConnection(LoginActivity.this).get("https://" + finalInstance + actionToken, 30, null, null);
|
||||
if (response == null) {
|
||||
Oauth oauth = new RetrofitPeertubeAPI(LoginActivity.this, acadInstance, null).oauthClient(null, null, null, null);
|
||||
if (oauth == null) {
|
||||
runOnUiThread(() -> {
|
||||
connectionButton.setEnabled(true);
|
||||
binding.loginButton.setEnabled(true);
|
||||
Toasty.error(LoginActivity.this, getString(R.string.client_error), Toast.LENGTH_LONG).show();
|
||||
});
|
||||
return;
|
||||
}
|
||||
JSONObject resobj;
|
||||
resobj = new JSONObject(response);
|
||||
client_id = resobj.get(Helper.CLIENT_ID).toString();
|
||||
client_secret = resobj.get(Helper.CLIENT_SECRET).toString();
|
||||
client_id = oauth.getClient_id();
|
||||
client_secret = oauth.getClient_secret();
|
||||
SharedPreferences sharedpreferences = getSharedPreferences(Helper.APP_PREFS, MODE_PRIVATE);
|
||||
SharedPreferences.Editor editor = sharedpreferences.edit();
|
||||
editor.putString(Helper.CLIENT_ID, client_id);
|
||||
editor.putString(Helper.CLIENT_SECRET, client_secret);
|
||||
editor.apply();
|
||||
parameters.clear();
|
||||
parameters.put(Helper.CLIENT_ID, sharedpreferences.getString(Helper.CLIENT_ID, null));
|
||||
parameters.put(Helper.CLIENT_SECRET, sharedpreferences.getString(Helper.CLIENT_SECRET, null));
|
||||
Intent intent = new Intent(LoginActivity.this, WebviewConnectActivity.class);
|
||||
Bundle b = new Bundle();
|
||||
b.putString("url", "https://" + Helper.getPeertubeUrl(host) + "/plugins/auth-openid-connect/0.0.1/auth/openid-connect");
|
||||
b.putString("url", "https://" + acadInstance + "/plugins/auth-openid-connect/0.0.1/auth/openid-connect");
|
||||
intent.putExtras(b);
|
||||
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
startActivity(intent);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
runOnUiThread(() -> {
|
||||
connectionButton.setEnabled(true);
|
||||
Toasty.error(LoginActivity.this, getString(R.string.client_error), Toast.LENGTH_LONG).show();
|
||||
binding.loginButton.setEnabled(true);
|
||||
Toasty.error(LoginActivity.this, getString(R.string.toast_error), Toast.LENGTH_LONG).show();
|
||||
});
|
||||
}
|
||||
|
||||
}).start();
|
||||
} else {
|
||||
parameters.clear();
|
||||
parameters.put(Helper.CLIENT_NAME, Helper.CLIENT_NAME_VALUE);
|
||||
parameters.put(Helper.REDIRECT_URIS, Helper.REDIRECT_CONTENT);
|
||||
parameters.put(Helper.SCOPES, Helper.OAUTH_SCOPES_PEERTUBE);
|
||||
parameters.put(Helper.WEBSITE, Helper.WEBSITE_VALUE);
|
||||
String finalInstance = instance;
|
||||
new Thread(() -> {
|
||||
if (binding.loginUid.getText() != null && binding.loginUid.getText().toString().contains("@") && !android.util.Patterns.EMAIL_ADDRESS.matcher(binding.loginUid.getText().toString().trim()).matches()) {
|
||||
Toasty.error(LoginActivity.this, getString(R.string.email_error)).show();
|
||||
return;
|
||||
}
|
||||
binding.loginButton.setEnabled(false);
|
||||
String instance, host;
|
||||
if (!BuildConfig.full_instances) {
|
||||
String[] emailArray = binding.loginUid.getText().toString().split("@");
|
||||
if (emailArray.length > 1 && !Arrays.asList(HelperAcadInstance.valideEmails).contains(emailArray[1])) {
|
||||
Toasty.error(LoginActivity.this, getString(R.string.email_error_domain, emailArray[1])).show();
|
||||
binding.loginButton.setEnabled(true);
|
||||
return;
|
||||
}
|
||||
|
||||
instance = HelperInstance.getLiveInstance(LoginActivity.this);
|
||||
host = instance;
|
||||
} else {
|
||||
if (binding.loginInstance.getText() == null || binding.loginInstance.getText().toString().trim().length() == 0) {
|
||||
Toasty.error(LoginActivity.this, getString(R.string.not_valide_instance)).show();
|
||||
binding.loginButton.setEnabled(true);
|
||||
return;
|
||||
}
|
||||
instance = host = binding.loginInstance.getText().toString().trim().toLowerCase();
|
||||
}
|
||||
|
||||
if (instance.startsWith("http")) {
|
||||
try {
|
||||
actionToken = "/api/v1/oauth-clients/local";
|
||||
String response = new HttpsConnection(LoginActivity.this).get("https://" + finalInstance + actionToken, 30, parameters, null);
|
||||
if (response == null) {
|
||||
URL url = new URL(instance);
|
||||
instance = url.getHost();
|
||||
host = instance;
|
||||
} catch (MalformedURLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
} else if (instance.endsWith("/")) {
|
||||
try {
|
||||
URL url = new URL("https://" + instance);
|
||||
instance = url.getHost();
|
||||
host = instance;
|
||||
} catch (MalformedURLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
if (!Patterns.WEB_URL.matcher("https://" + instance).matches()) {
|
||||
Toasty.error(LoginActivity.this, getString(R.string.not_valide_instance)).show();
|
||||
binding.loginButton.setEnabled(true);
|
||||
return;
|
||||
}
|
||||
String finalInstance = instance;
|
||||
String finalHost = host;
|
||||
if (BuildConfig.full_instances) {
|
||||
new Thread(() -> {
|
||||
Oauth oauth = new RetrofitPeertubeAPI(LoginActivity.this, finalInstance, null).oauthClient(Helper.CLIENT_NAME_VALUE, Helper.WEBSITE_VALUE, Helper.OAUTH_SCOPES_PEERTUBE, Helper.WEBSITE_VALUE);
|
||||
if (oauth == null) {
|
||||
runOnUiThread(() -> {
|
||||
connectionButton.setEnabled(true);
|
||||
binding.loginButton.setEnabled(true);
|
||||
Toasty.error(LoginActivity.this, getString(R.string.client_error), Toast.LENGTH_LONG).show();
|
||||
});
|
||||
return;
|
||||
}
|
||||
JSONObject resobj;
|
||||
try {
|
||||
resobj = new JSONObject(response);
|
||||
client_id = resobj.get(Helper.CLIENT_ID).toString();
|
||||
client_secret = resobj.get(Helper.CLIENT_SECRET).toString();
|
||||
SharedPreferences sharedpreferences = getSharedPreferences(Helper.APP_PREFS, MODE_PRIVATE);
|
||||
SharedPreferences.Editor editor = sharedpreferences.edit();
|
||||
editor.putString(Helper.CLIENT_ID, client_id);
|
||||
editor.putString(Helper.CLIENT_SECRET, client_secret);
|
||||
editor.apply();
|
||||
parameters.clear();
|
||||
parameters.put(Helper.CLIENT_ID, sharedpreferences.getString(Helper.CLIENT_ID, null));
|
||||
parameters.put(Helper.CLIENT_SECRET, sharedpreferences.getString(Helper.CLIENT_SECRET, null));
|
||||
parameters.put("grant_type", "password");
|
||||
try {
|
||||
parameters.put("username", URLEncoder.encode(login_uid.getText().toString().trim().toLowerCase(), "UTF-8"));
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
parameters.put("username", login_uid.getText().toString().trim().toLowerCase());
|
||||
}
|
||||
try {
|
||||
parameters.put("password", URLEncoder.encode(login_passwd.getText().toString(), "UTF-8"));
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
parameters.put("password", login_passwd.getText().toString());
|
||||
}
|
||||
parameters.put("scope", "user");
|
||||
String oauthUrl = "/api/v1/users/token";
|
||||
try {
|
||||
String responseLogin = new HttpsConnection(LoginActivity.this).post("https://" + finalInstance + oauthUrl, 30, parameters, null);
|
||||
runOnUiThread(() -> {
|
||||
JSONObject resobjLogin;
|
||||
try {
|
||||
resobjLogin = new JSONObject(responseLogin);
|
||||
String token = resobjLogin.getString("access_token");
|
||||
String refresh_token = resobjLogin.getString("refresh_token");
|
||||
editor.putString(Helper.PREF_KEY_OAUTH_TOKEN, token);
|
||||
editor.putString(Helper.PREF_INSTANCE, host);
|
||||
editor.apply();
|
||||
//Update the account with the token;
|
||||
new UpdateAccountInfoAsyncTask(LoginActivity.this, token, client_id, client_secret, refresh_token, host).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
runOnUiThread(() -> connectionButton.setEnabled(true));
|
||||
}
|
||||
});
|
||||
} catch (final Exception e) {
|
||||
e.printStackTrace();
|
||||
runOnUiThread(() -> {
|
||||
connectionButton.setEnabled(true);
|
||||
String message;
|
||||
if (e.getLocalizedMessage() != null && e.getLocalizedMessage().trim().length() > 0)
|
||||
message = e.getLocalizedMessage();
|
||||
else if (e.getMessage() != null && e.getMessage().trim().length() > 0)
|
||||
message = e.getMessage();
|
||||
else
|
||||
message = getString(R.string.client_error);
|
||||
Toasty.error(LoginActivity.this, message, Toast.LENGTH_LONG).show();
|
||||
});
|
||||
}
|
||||
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
e.printStackTrace();
|
||||
runOnUiThread(() -> connectionButton.setEnabled(true));
|
||||
client_id = oauth.getClient_id();
|
||||
client_secret = oauth.getClient_secret();
|
||||
|
||||
SharedPreferences sharedpreferences = getSharedPreferences(Helper.APP_PREFS, MODE_PRIVATE);
|
||||
SharedPreferences.Editor editor = sharedpreferences.edit();
|
||||
editor.putString(Helper.CLIENT_ID, client_id);
|
||||
editor.putString(Helper.CLIENT_SECRET, client_secret);
|
||||
editor.apply();
|
||||
OauthParams oauthParams = new OauthParams();
|
||||
oauthParams.setClient_id(client_id);
|
||||
oauthParams.setClient_secret(client_secret);
|
||||
oauthParams.setGrant_type("password");
|
||||
oauthParams.setScope("user");
|
||||
oauthParams.setUsername(binding.loginUid.getText().toString().trim());
|
||||
if (binding.loginPasswd.getText() != null) {
|
||||
oauthParams.setPassword(binding.loginPasswd.getText().toString());
|
||||
}
|
||||
} catch (final Exception e) {
|
||||
e.printStackTrace();
|
||||
runOnUiThread(() -> {
|
||||
connectionButton.setEnabled(true);
|
||||
String message = null;
|
||||
if (e.getLocalizedMessage() != null) {
|
||||
message = e.getMessage();
|
||||
try {
|
||||
Token token = new RetrofitPeertubeAPI(LoginActivity.this, finalInstance, null).manageToken(oauthParams);
|
||||
proceedLogin(token, finalHost);
|
||||
} catch (final Exception | Error e) {
|
||||
oauthParams.setUsername(binding.loginUid.getText().toString().toLowerCase().trim());
|
||||
try {
|
||||
Token token = new RetrofitPeertubeAPI(LoginActivity.this, finalInstance, null).manageToken(oauthParams);
|
||||
proceedLogin(token, finalHost);
|
||||
} catch (Error error) {
|
||||
Error.displayError(LoginActivity.this, error);
|
||||
error.printStackTrace();
|
||||
runOnUiThread(() -> binding.loginButton.setEnabled(true));
|
||||
}
|
||||
if (message == null) {
|
||||
message = getString(R.string.client_error);
|
||||
}
|
||||
Toasty.error(LoginActivity.this, message, Toast.LENGTH_LONG).show();
|
||||
});
|
||||
}
|
||||
}).start();
|
||||
}
|
||||
}).start();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@SuppressLint("ApplySharedPref")
|
||||
private void proceedLogin(Token token, String host) {
|
||||
runOnUiThread(() -> {
|
||||
if (token != null) {
|
||||
SharedPreferences sharedpreferences = getSharedPreferences(Helper.APP_PREFS, MODE_PRIVATE);
|
||||
SharedPreferences.Editor editor = sharedpreferences.edit();
|
||||
editor.putString(Helper.PREF_KEY_OAUTH_TOKEN, token.getAccess_token());
|
||||
editor.putString(Helper.PREF_INSTANCE, host);
|
||||
editor.commit();
|
||||
//Update the account with the token;
|
||||
updateCredential(LoginActivity.this, token.getAccess_token(), client_id, client_secret, token.getRefresh_token(), host);
|
||||
} else {
|
||||
binding.loginButton.setEnabled(true);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|