mirror of
https://github.com/LBRYFoundation/lbry-android.git
synced 2025-10-02 16:20:41 +00:00
Compare commits
199 commits
Author | SHA1 | Date | |
---|---|---|---|
|
fdd759b241 | ||
|
57cd649c02 | ||
|
7250435d7f | ||
|
b81abf74a1 | ||
|
208e2c2d42 | ||
|
a5bdd1c042 | ||
|
1e3a74cae1 | ||
|
ca08f71a72 | ||
|
b60ca39df1 | ||
|
696bc86b7c | ||
|
4c163c6244 | ||
|
2ad49ca281 | ||
|
56caeef72b | ||
|
84bb014557 | ||
|
9278e74e85 | ||
|
cf6f09c60d | ||
|
f2cbed48d9 | ||
|
f1ead0c247 | ||
|
5f2c72ec4d | ||
|
a6869eb2e6 | ||
|
cbae6c476a | ||
|
48d257ceaf | ||
|
5355456498 | ||
|
1436895ace | ||
|
6e32f7724f | ||
|
3f5104d60a | ||
|
d8fdb3b818 | ||
|
5c187e7a8d | ||
|
24862550a1 | ||
|
146fced44e | ||
|
d535ed8c98 | ||
|
b675dbad9b | ||
|
dabe9fe691 | ||
|
9ac216504d | ||
|
911ca998e7 | ||
|
36c105d3a7 | ||
|
a655d0112b | ||
|
493c771e94 | ||
|
e9d70dbf87 | ||
|
0849ce2b66 | ||
|
d0a8b3b218 | ||
|
a8cdc4a771 | ||
|
67b883660f | ||
|
f328efb831 | ||
|
b2f56364d6 | ||
|
2761857fe8 | ||
|
d439260d69 | ||
|
f0f0a5028b | ||
|
13e170cb61 | ||
|
127d8052ca | ||
|
1b3086572f | ||
|
6fa308ef96 | ||
|
f3e513fc2d | ||
|
d72a8faec4 | ||
|
fdb4578349 | ||
|
c08237d399 | ||
|
bdf8a58818 | ||
|
e1d51c881a | ||
|
28212808f8 | ||
|
74f08f8f98 | ||
|
cb5c29fbce | ||
|
4d775d3a17 | ||
|
fd94ef9fa7 | ||
|
2e0331305a | ||
|
fb560f8f01 | ||
|
ef80c9f7fd | ||
|
99a4a0a22f | ||
|
136853853a | ||
|
ebf3299c30 | ||
|
036b49a871 | ||
|
67d5f88d34 | ||
|
b1e0b9af33 | ||
|
c30b012787 | ||
|
c8c6305757 | ||
|
ee1d090e62 | ||
|
9e56a86492 | ||
|
e6b83877f1 | ||
|
b567e39aef | ||
|
ae62dba0a6 | ||
|
df1e8abf50 | ||
|
31cfb26c3b | ||
|
e5f34dc464 | ||
|
601031e55d | ||
|
a9aadbe6a8 | ||
|
f9a4b71037 | ||
|
0f10e9dc1f | ||
|
0647deb06c | ||
|
b2f5fec293 | ||
|
daf4e5aca2 | ||
|
c1324efb41 | ||
|
6221de2d3c | ||
|
983bc68af2 | ||
|
f1b167693d | ||
|
68ac64b534 | ||
|
6819ae46f9 | ||
|
6c406c5a85 | ||
|
c179243d22 | ||
|
d0f5504c80 | ||
|
896c566a02 | ||
|
da9352cc68 | ||
|
b8d2375e20 | ||
|
dd52ff9d07 | ||
|
d9891f8a8a | ||
|
ea5fe6842d | ||
|
fc649187df | ||
|
b0f7c41885 | ||
|
45935717c8 | ||
|
ac5e666369 | ||
|
ffeb72a383 | ||
|
0ec09d751c | ||
|
b8e4fcff92 | ||
|
b79f0f4820 | ||
|
a1cd58a214 | ||
|
cfca8facbe | ||
|
066a0a099c | ||
|
afeee2e5df | ||
|
76036acfc7 | ||
|
897bfdaffd | ||
|
7475ae323c | ||
|
faf7f3ccbf | ||
|
4940d1ca33 | ||
|
3d48fa5741 | ||
|
f9887cffae | ||
|
6644907665 | ||
|
5f850685d6 | ||
|
5f9674e49c | ||
|
0d185c6db3 | ||
|
53d22dd22d | ||
|
ff8ffda3c6 | ||
|
64bd540322 | ||
|
919f9a48f3 | ||
|
746d442051 | ||
|
1877b75188 | ||
|
6e8c38cace | ||
|
eab7bab267 | ||
|
aab648c3cf | ||
|
f79ff509bd | ||
|
1197e990ca | ||
|
dce1c0715e | ||
|
6a0263c5bc | ||
|
ca64db0499 | ||
|
a5d4eda4d1 | ||
|
5d210961c1 | ||
|
1b88f565af | ||
|
991a98b571 | ||
|
0073277d6e | ||
|
eeca602f7a | ||
|
6c171560fd | ||
|
66c4c00215 | ||
|
9b9ef9ab74 | ||
|
39a289e7f1 | ||
|
722c829502 | ||
|
7ecb80d136 | ||
|
ea19af04d4 | ||
|
8196b69211 | ||
|
dc861caf6c | ||
|
adb5ffa8d0 | ||
|
d918cb28bd | ||
|
7ce7314ab9 | ||
|
13e5caa0ef | ||
|
ff59a7a89f | ||
|
c3efa4d004 | ||
|
ed50e1300a | ||
|
86dbfd54d1 | ||
|
535120eebd | ||
|
c1106d7186 | ||
|
45be7f2c9b | ||
|
d6baf3d1c8 | ||
|
08c38c1723 | ||
|
af4fa454d3 | ||
|
0620582a4e | ||
|
b11c07e3d1 | ||
|
593b34079c | ||
|
becb533624 | ||
|
8efc0522f2 | ||
|
cead924ca5 | ||
|
f83a043664 | ||
|
e8a0bca5ea | ||
|
1198c2298a | ||
|
7205acb9d6 | ||
|
d21cfd55ab | ||
|
47cbc3624c | ||
|
1f9a0886a0 | ||
|
dd5ea68915 | ||
|
b3bba4d273 | ||
|
10c123ba6a | ||
|
a8ba45b941 | ||
|
3652cdf6bc | ||
|
f2a7a8c439 | ||
|
78d5a99441 | ||
|
6931dbe79c | ||
|
4d024c06cc | ||
|
ddcb190457 | ||
|
dd14b90d7e | ||
|
4b86444478 | ||
|
feb7f260dc | ||
|
74c7a1de4d | ||
|
88a43dc679 | ||
|
1bb5ce72fa |
294 changed files with 12898 additions and 3705 deletions
1
.github/workflows/deploy.yml
vendored
Normal file
1
.github/workflows/deploy.yml
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
|
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -60,8 +60,10 @@ buck-out/
|
||||||
|
|
||||||
# Other Files
|
# Other Files
|
||||||
app/google-services.json
|
app/google-services.json
|
||||||
|
app/twitter.properties
|
||||||
*.log
|
*.log
|
||||||
.vagrant
|
.vagrant
|
||||||
*.hprof
|
*.hprof
|
||||||
app/build
|
app/build
|
||||||
bin
|
bin
|
||||||
|
app/debuglib
|
||||||
|
|
|
@ -8,10 +8,13 @@ build apk:
|
||||||
stage: build
|
stage: build
|
||||||
image: lbry/android-base:platform-28
|
image: lbry/android-base:platform-28
|
||||||
before_script:
|
before_script:
|
||||||
- apt-get -y update && apt-get -y install build-essential ca-certificates curl git gpg-agent openjdk-8-jdk software-properties-common wget zipalign
|
- echo "$PGP_PRIVATE_KEY" | gpg --batch --import
|
||||||
|
- echo 'deb https://gitsecret.jfrog.io/artifactory/git-secret-deb git-secret main' >> /etc/apt/sources.list
|
||||||
|
- wget -qO - 'https://gitsecret.jfrog.io/artifactory/api/gpg/key/public' | apt-key add -
|
||||||
|
- apt-get -y update && apt-get -y install build-essential ca-certificates curl git gpg-agent openjdk-8-jdk software-properties-common wget zipalign git-secret
|
||||||
|
- git secret reveal
|
||||||
- chmod u+x $CI_PROJECT_DIR/gradlew
|
- chmod u+x $CI_PROJECT_DIR/gradlew
|
||||||
- export ANDROID_SDK_ROOT=~/.buildozer/android/platform/android-sdk-23
|
- export BUILD_VERSION=$($CI_PROJECT_DIR/gradlew -p $CI_PROJECT_DIR -q printVersionName --console=plain | tail -1)
|
||||||
- export BUILD_VERSION=$($CI_PROJECT_DIR/gradlew -q printVersionName --console=plain | tail -1)
|
|
||||||
artifacts:
|
artifacts:
|
||||||
paths:
|
paths:
|
||||||
- bin/browser-*-release__arm.apk
|
- bin/browser-*-release__arm.apk
|
||||||
|
@ -19,12 +22,7 @@ build apk:
|
||||||
expire_in: 1 week
|
expire_in: 1 week
|
||||||
script:
|
script:
|
||||||
- export PATH=/usr/bin:$PATH
|
- export PATH=/usr/bin:$PATH
|
||||||
- echo "$PGP_PRIVATE_KEY" | gpg --batch --import
|
- export ANDROID_SDK_ROOT=~/.buildozer/android/platform/android-sdk-23
|
||||||
- echo "deb https://dl.bintray.com/sobolevn/deb git-secret main" | tee -a /etc/apt/sources.list
|
|
||||||
- wget -O - https://api.bintray.com/users/sobolevn/keys/gpg/public.key | apt-key add -
|
|
||||||
- apt-get -y update && apt-get -y install git-secret
|
|
||||||
- git secret reveal
|
|
||||||
- yarn
|
|
||||||
- chmod u+x ./release.sh
|
- chmod u+x ./release.sh
|
||||||
- ./release.sh
|
- ./release.sh
|
||||||
- cp bin/browser-$BUILD_VERSION-release__arm.apk /dev/null
|
- cp bin/browser-$BUILD_VERSION-release__arm.apk /dev/null
|
||||||
|
@ -36,10 +34,15 @@ deploy build.lbry.io:
|
||||||
dependencies:
|
dependencies:
|
||||||
- build apk
|
- build apk
|
||||||
before_script:
|
before_script:
|
||||||
- apt-get -y update && apt-get -y install openjdk-8-jdk
|
- apt-get -y update && apt-get -y install apt-transport-https
|
||||||
|
- echo "$PGP_PRIVATE_KEY" | gpg --batch --import
|
||||||
|
- echo 'deb https://gitsecret.jfrog.io/artifactory/git-secret-deb git-secret main' >> /etc/apt/sources.list
|
||||||
|
- wget -qO - 'https://gitsecret.jfrog.io/artifactory/api/gpg/key/public' | apt-key add -
|
||||||
|
- apt-get -y update && apt-get -y install openjdk-8-jdk git git-secret
|
||||||
- pip install awscli
|
- pip install awscli
|
||||||
- chmod u+x $CI_PROJECT_DIR/gradlew
|
- chmod u+x $CI_PROJECT_DIR/gradlew
|
||||||
- export BUILD_VERSION=$($CI_PROJECT_DIR/gradlew -q printVersionName --console=plain | tail -1)
|
- git secret reveal
|
||||||
|
- export BUILD_VERSION=$($CI_PROJECT_DIR/gradlew -p $CI_PROJECT_DIR -q printVersionName --console=plain | tail -1)
|
||||||
- export BUILD_APK_FILENAME__32=browser-$BUILD_VERSION-release__arm.apk
|
- export BUILD_APK_FILENAME__32=browser-$BUILD_VERSION-release__arm.apk
|
||||||
- export BUILD_APK_FILENAME__64=browser-$BUILD_VERSION-release__arm64.apk
|
- export BUILD_APK_FILENAME__64=browser-$BUILD_VERSION-release__arm64.apk
|
||||||
script:
|
script:
|
||||||
|
@ -55,10 +58,15 @@ release apk:
|
||||||
dependencies:
|
dependencies:
|
||||||
- build apk
|
- build apk
|
||||||
before_script:
|
before_script:
|
||||||
- apt-get -y update && apt-get -y install openjdk-8-jdk
|
- apt-get -y update && apt-get -y install apt-transport-https
|
||||||
|
- echo "$PGP_PRIVATE_KEY" | gpg --batch --import
|
||||||
|
- echo 'deb https://gitsecret.jfrog.io/artifactory/git-secret-deb git-secret main' >> /etc/apt/sources.list
|
||||||
|
- wget -qO - 'https://gitsecret.jfrog.io/artifactory/api/gpg/key/public' | apt-key add -
|
||||||
|
- apt-get -y update && apt-get -y install openjdk-8-jdk git git-secret
|
||||||
- pip install awscli githubrelease
|
- pip install awscli githubrelease
|
||||||
|
- git secret reveal
|
||||||
- chmod u+x $CI_PROJECT_DIR/gradlew
|
- chmod u+x $CI_PROJECT_DIR/gradlew
|
||||||
- export BUILD_VERSION=$($CI_PROJECT_DIR/gradlew -q printVersionName --console=plain | tail -1)
|
- export BUILD_VERSION=$($CI_PROJECT_DIR/gradlew -p $CI_PROJECT_DIR -q printVersionName --console=plain | tail -1)
|
||||||
- export BUILD_APK_FILENAME__32=browser-$BUILD_VERSION-release__arm.apk
|
- export BUILD_APK_FILENAME__32=browser-$BUILD_VERSION-release__arm.apk
|
||||||
- export BUILD_APK_FILENAME__64=browser-$BUILD_VERSION-release__arm64.apk
|
- export BUILD_APK_FILENAME__64=browser-$BUILD_VERSION-release__arm64.apk
|
||||||
script:
|
script:
|
||||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -1,2 +1,3 @@
|
||||||
lbry-android.keystore:0d958c531870694624cc877ea98ca1c583485f8ebbb3a5acca58b1930c190d65
|
lbry-android.keystore:0d958c531870694624cc877ea98ca1c583485f8ebbb3a5acca58b1930c190d65
|
||||||
app/google-services.json:896a0bee8294a36d061f10fa926129d8a780528b34d0a2f03113400c4246d67c
|
app/google-services.json:896a0bee8294a36d061f10fa926129d8a780528b34d0a2f03113400c4246d67c
|
||||||
|
app/twitter.properties:01212d70712f2041efb5c814bf30ecbf6f72e1ca5179c7647c4f8cbd995dd033
|
||||||
|
|
16
README.md
16
README.md
|
@ -18,7 +18,19 @@ The minimum supported Android version is 5.0 Lollipop. There are two ways to ins
|
||||||
The app can be launched by opening **LBRY** from the device's app drawer or via the shortcut on the home screen if that was created upon installation.
|
The app can be launched by opening **LBRY** from the device's app drawer or via the shortcut on the home screen if that was created upon installation.
|
||||||
|
|
||||||
## Running from Source
|
## Running from Source
|
||||||
Clone the repository and open the project in Android Studio. Android Studio will automatically run the initial build process. Click the Run button to launch the app on your simulator or connected debugging device after the build process is complete.
|
Clone the repository and open the project in Android Studio. Android Studio will automatically run the initial build process.
|
||||||
|
|
||||||
|
Create file 'twitter.properties' in app/ folder with the following content:
|
||||||
|
|
||||||
|
```
|
||||||
|
twitterConsumerKey=XXXXXX
|
||||||
|
|
||||||
|
twitterConsumerSecret=XXXXXX
|
||||||
|
```
|
||||||
|
|
||||||
|
Copy the file 'google-services.sample.json' to 'google-services.json' in the app/ folder.
|
||||||
|
|
||||||
|
Click the Sync button and when process finishes, the Run button to launch the app on your simulator or connected debugging device after the build process is complete.
|
||||||
|
|
||||||
## Contributing
|
## Contributing
|
||||||
Contributions to this project are welcome, encouraged, and compensated. For more details, see https://lbry.io/faq/contributing
|
Contributions to this project are welcome, encouraged, and compensated. For more details, see https://lbry.io/faq/contributing
|
||||||
|
@ -27,7 +39,7 @@ Contributions to this project are welcome, encouraged, and compensated. For more
|
||||||
This project is MIT licensed. For the full license, see [LICENSE](LICENSE).
|
This project is MIT licensed. For the full license, see [LICENSE](LICENSE).
|
||||||
|
|
||||||
## Security
|
## Security
|
||||||
We take security seriously. Please contact security@lbry.com regarding any security issues. Our PGP key is [here](https://keybase.io/lbry/key.asc) if you need it.
|
We take security seriously. Please contact security@lbry.com regarding any security issues. Our PGP key is [here](https://lbry.com/faq/pgp-key) if you need it.
|
||||||
|
|
||||||
## Contact
|
## Contact
|
||||||
The primary contact for this project is [@akinwale](https://github.com/akinwale) (akinwale@lbry.com)
|
The primary contact for this project is [@akinwale](https://github.com/akinwale) (akinwale@lbry.com)
|
||||||
|
|
|
@ -4,7 +4,7 @@ apply plugin: 'com.android.application'
|
||||||
|
|
||||||
android {
|
android {
|
||||||
compileSdkVersion 29
|
compileSdkVersion 29
|
||||||
buildToolsVersion "29.0.1"
|
buildToolsVersion "29.0.2"
|
||||||
flavorDimensions "default"
|
flavorDimensions "default"
|
||||||
|
|
||||||
compileOptions {
|
compileOptions {
|
||||||
|
@ -16,12 +16,16 @@ android {
|
||||||
applicationId "io.lbry.browser"
|
applicationId "io.lbry.browser"
|
||||||
minSdkVersion 21
|
minSdkVersion 21
|
||||||
targetSdkVersion 29
|
targetSdkVersion 29
|
||||||
versionCode 1515
|
versionCode 1701
|
||||||
versionName "0.15.15"
|
versionName "0.17.1"
|
||||||
|
|
||||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
packagingOptions {
|
||||||
|
exclude 'META-INF/DEPENDENCIES'
|
||||||
|
exclude 'lib/x86_64/darwin/libscrypt.dylib'
|
||||||
|
}
|
||||||
|
|
||||||
productFlavors {
|
productFlavors {
|
||||||
__32bit {
|
__32bit {
|
||||||
versionCode android.defaultConfig.versionCode * 10 + 1
|
versionCode android.defaultConfig.versionCode * 10 + 1
|
||||||
|
@ -38,7 +42,17 @@ android {
|
||||||
}
|
}
|
||||||
|
|
||||||
buildTypes {
|
buildTypes {
|
||||||
|
debug {
|
||||||
|
Properties twitterProps = new Properties()
|
||||||
|
twitterProps.load(project.file('twitter.properties').newDataInputStream())
|
||||||
|
resValue "string", "TWITTER_CONSUMER_KEY", "\"${twitterProps.getProperty("twitterConsumerKey")}\""
|
||||||
|
resValue "string", "TWITTER_CONSUMER_SECRET", "\"${twitterProps.getProperty("twitterConsumerSecret")}\""
|
||||||
|
}
|
||||||
release {
|
release {
|
||||||
|
Properties twitterProps = new Properties()
|
||||||
|
twitterProps.load(project.file('twitter.properties').newDataInputStream())
|
||||||
|
resValue "string", "TWITTER_CONSUMER_KEY", "\"${twitterProps.getProperty("twitterConsumerKey")}\""
|
||||||
|
resValue "string", "TWITTER_CONSUMER_SECRET", "\"${twitterProps.getProperty("twitterConsumerSecret")}\""
|
||||||
minifyEnabled false
|
minifyEnabled false
|
||||||
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
|
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
|
||||||
}
|
}
|
||||||
|
@ -51,6 +65,13 @@ task printVersionName {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
configurations {
|
||||||
|
all {
|
||||||
|
exclude module: 'httpclient'
|
||||||
|
exclude module: 'commons-logging'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation fileTree(dir: 'libs', include: ['*.jar'])
|
implementation fileTree(dir: 'libs', include: ['*.jar'])
|
||||||
|
|
||||||
|
@ -58,31 +79,35 @@ dependencies {
|
||||||
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
|
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
|
||||||
implementation 'com.google.android.material:material:1.3.0-alpha01'
|
implementation 'com.google.android.material:material:1.3.0-alpha01'
|
||||||
implementation "androidx.cardview:cardview:1.0.0"
|
implementation "androidx.cardview:cardview:1.0.0"
|
||||||
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
|
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
|
||||||
implementation 'androidx.navigation:navigation-fragment:2.2.2'
|
implementation 'androidx.navigation:navigation-fragment:2.3.1'
|
||||||
implementation 'androidx.navigation:navigation-ui:2.2.2'
|
implementation 'androidx.navigation:navigation-ui:2.3.1'
|
||||||
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
|
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
|
||||||
implementation 'androidx.localbroadcastmanager:localbroadcastmanager:1.0.0'
|
implementation 'androidx.localbroadcastmanager:localbroadcastmanager:1.0.0'
|
||||||
implementation 'androidx.preference:preference:1.1.1'
|
implementation 'androidx.preference:preference:1.1.1'
|
||||||
implementation 'androidx.webkit:webkit:1.3.0-alpha03'
|
implementation 'androidx.webkit:webkit:1.4.0-rc01'
|
||||||
implementation 'androidx.camera:camera-core:1.0.0-beta03'
|
implementation 'androidx.camera:camera-core:1.0.0-beta03'
|
||||||
implementation 'androidx.camera:camera-camera2:1.0.0-beta03'
|
implementation 'androidx.camera:camera-camera2:1.0.0-beta03'
|
||||||
implementation 'androidx.camera:camera-lifecycle:1.0.0-beta03'
|
implementation 'androidx.camera:camera-lifecycle:1.0.0-beta03'
|
||||||
implementation 'androidx.camera:camera-view:1.0.0-alpha10'
|
implementation 'androidx.camera:camera-view:1.0.0-alpha10'
|
||||||
implementation 'androidx.browser:browser:1.2.0'
|
implementation 'androidx.browser:browser:1.2.0'
|
||||||
|
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0'
|
||||||
|
|
||||||
implementation 'com.github.bumptech.glide:glide:4.11.0'
|
implementation 'com.github.bumptech.glide:glide:4.11.0'
|
||||||
implementation 'com.squareup.okhttp3:okhttp:4.4.1'
|
implementation 'com.squareup.okhttp3:okhttp:4.4.1'
|
||||||
implementation 'com.google.firebase:firebase-analytics:17.4.2'
|
implementation 'com.google.firebase:firebase-analytics:18.0.0'
|
||||||
implementation 'com.google.android.gms:play-services-base:17.2.1'
|
implementation 'com.google.android.gms:play-services-base:17.5.0'
|
||||||
implementation 'com.google.firebase:firebase-messaging:20.2.0'
|
implementation 'com.google.firebase:firebase-messaging:21.0.0'
|
||||||
|
implementation 'com.google.oauth-client:google-oauth-client:1.30.4'
|
||||||
|
|
||||||
|
implementation 'com.android.billingclient:billing:3.0.2'
|
||||||
|
|
||||||
implementation 'com.google.code.gson:gson:2.8.6'
|
implementation 'com.google.code.gson:gson:2.8.6'
|
||||||
implementation 'com.google.android.exoplayer:exoplayer-core:2.11.4'
|
implementation 'com.google.android.exoplayer:exoplayer-core:2.12.2'
|
||||||
implementation 'com.google.android.exoplayer:exoplayer-dash:2.11.4'
|
implementation 'com.google.android.exoplayer:exoplayer-dash:2.12.2'
|
||||||
implementation 'com.google.android.exoplayer:exoplayer-ui:2.11.4'
|
implementation 'com.google.android.exoplayer:exoplayer-ui:2.12.2'
|
||||||
implementation 'com.google.android.exoplayer:extension-cast:2.11.4'
|
implementation 'com.google.android.exoplayer:extension-cast:2.12.2'
|
||||||
implementation 'com.google.android.exoplayer:extension-mediasession:2.11.4'
|
implementation 'com.google.android.exoplayer:extension-mediasession:2.12.2'
|
||||||
|
|
||||||
implementation 'com.google.android:flexbox:2.0.1'
|
implementation 'com.google.android:flexbox:2.0.1'
|
||||||
|
|
||||||
|
@ -93,16 +118,26 @@ dependencies {
|
||||||
|
|
||||||
implementation 'com.arthenica:mobile-ffmpeg-full-gpl:4.3.1.LTS'
|
implementation 'com.arthenica:mobile-ffmpeg-full-gpl:4.3.1.LTS'
|
||||||
|
|
||||||
|
implementation 'commons-codec:commons-codec:1.15'
|
||||||
|
implementation 'org.bitcoinj:bitcoinj-tools:0.14.7'
|
||||||
|
implementation 'org.java-websocket:Java-WebSocket:1.5.1'
|
||||||
|
|
||||||
|
implementation ('com.journeyapps:zxing-android-embedded:4.1.0') { transitive = false }
|
||||||
|
implementation 'com.google.zxing:core:3.3.0'
|
||||||
|
|
||||||
compileOnly 'org.projectlombok:lombok:1.18.10'
|
compileOnly 'org.projectlombok:lombok:1.18.10'
|
||||||
annotationProcessor 'org.projectlombok:lombok:1.18.10'
|
annotationProcessor 'org.projectlombok:lombok:1.18.10'
|
||||||
annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'
|
annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'
|
||||||
|
|
||||||
testImplementation 'junit:junit:4.12'
|
testImplementation 'junit:junit:4.12'
|
||||||
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
|
androidTestImplementation 'androidx.test:runner:1.3.0'
|
||||||
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
|
androidTestImplementation 'androidx.test:rules:1.3.0'
|
||||||
|
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
|
||||||
|
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
|
||||||
|
|
||||||
__32bitImplementation 'io.lbry:lbrysdk32:0.79.0'
|
__32bitImplementation 'io.lbry:lbrysdk32:0.102.0'
|
||||||
__64bitImplementation 'io.lbry:lbrysdk64:0.79.0'
|
__64bitImplementation 'io.lbry:lbrysdk64:0.102.0'
|
||||||
|
//__64bitImplementation(name: 'lbrysdk', ext: 'aar')
|
||||||
}
|
}
|
||||||
|
|
||||||
apply plugin: 'com.google.gms.google-services'
|
apply plugin: 'com.google.gms.google-services'
|
||||||
|
|
Binary file not shown.
|
@ -0,0 +1,12 @@
|
||||||
|
package io.lbry.browser.utils;
|
||||||
|
|
||||||
|
import androidx.test.filters.SmallTest;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
|
@SmallTest
|
||||||
|
public class HelperTest {
|
||||||
|
|
||||||
|
}
|
|
@ -1,5 +1,6 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
package="io.lbry.browser"
|
package="io.lbry.browser"
|
||||||
android:installLocation="auto">
|
android:installLocation="auto">
|
||||||
|
|
||||||
|
@ -10,6 +11,10 @@
|
||||||
<uses-permission android:name="android.permission.INTERNET" />
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
|
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
|
||||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
||||||
|
<uses-permission android:name="com.android.vending.BILLING" />
|
||||||
|
<uses-permission android:name="android.permission.WAKE_LOCK"/>
|
||||||
|
|
||||||
|
<uses-sdk tools:overrideLibrary="com.google.zxing.client.android" />
|
||||||
|
|
||||||
<application
|
<application
|
||||||
android:allowBackup="true"
|
android:allowBackup="true"
|
||||||
|
@ -50,6 +55,13 @@
|
||||||
<category android:name="android.intent.category.LAUNCHER" />
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
|
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.SEND" />
|
||||||
|
<category android:name="android.intent.category.DEFAULT"/>
|
||||||
|
<data android:mimeType="video/*" />
|
||||||
|
<data android:mimeType="image/*" />
|
||||||
|
<data android:mimeType="text/*" />
|
||||||
|
</intent-filter>
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.VIEW" />
|
<action android:name="android.intent.action.VIEW" />
|
||||||
<category android:name="android.intent.category.DEFAULT" />
|
<category android:name="android.intent.category.DEFAULT" />
|
||||||
|
@ -60,6 +72,18 @@
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.VIEW" />
|
<action android:name="android.intent.action.VIEW" />
|
||||||
<data android:scheme="https" android:host="open.lbry.com"/>
|
<data android:scheme="https" android:host="open.lbry.com"/>
|
||||||
|
<data android:scheme="https" android:host="lbry.tv" android:pathPattern="/..*/*" />
|
||||||
|
<data android:scheme="https" android:host="lbry.tv" android:pathPattern="/.*:.*" />
|
||||||
|
<data android:scheme="https" android:host="lbry.tv" android:pathPattern="/.*#.*" />
|
||||||
|
<data android:scheme="https" android:host="lbry.lat" android:pathPattern="/..*/*" />
|
||||||
|
<data android:scheme="https" android:host="lbry.lat" android:pathPattern="/.*:.*" />
|
||||||
|
<data android:scheme="https" android:host="lbry.lat" android:pathPattern="/.*#.*" />
|
||||||
|
<data android:scheme="https" android:host="lbry.fr" android:pathPattern="/..*/*" />
|
||||||
|
<data android:scheme="https" android:host="lbry.fr" android:pathPattern="/.*:.*" />
|
||||||
|
<data android:scheme="https" android:host="lbry.fr" android:pathPattern="/.*#.*" />
|
||||||
|
<data android:scheme="https" android:host="lbry.in" android:pathPattern="/..*/*" />
|
||||||
|
<data android:scheme="https" android:host="lbry.in" android:pathPattern="/.*:.*" />
|
||||||
|
<data android:scheme="https" android:host="lbry.in" android:pathPattern="/.*#.*" />
|
||||||
<category android:name="android.intent.category.BROWSABLE" />
|
<category android:name="android.intent.category.BROWSABLE" />
|
||||||
<category android:name="android.intent.category.DEFAULT" />
|
<category android:name="android.intent.category.DEFAULT" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
|
@ -77,6 +101,11 @@
|
||||||
android:theme="@style/AppTheme.NoActionBarTranslucent"
|
android:theme="@style/AppTheme.NoActionBarTranslucent"
|
||||||
android:windowSoftInputMode="adjustResize" />
|
android:windowSoftInputMode="adjustResize" />
|
||||||
|
|
||||||
|
<activity
|
||||||
|
android:name="com.journeyapps.barcodescanner.CaptureActivity"
|
||||||
|
android:screenOrientation="fullSensor"
|
||||||
|
tools:replace="screenOrientation" />
|
||||||
|
|
||||||
<service
|
<service
|
||||||
android:name="io.lbry.browser.LbrynetMessagingService"
|
android:name="io.lbry.browser.LbrynetMessagingService"
|
||||||
android:exported="false">
|
android:exported="false">
|
||||||
|
|
|
@ -15,12 +15,22 @@ import androidx.appcompat.app.AppCompatActivity;
|
||||||
import androidx.core.text.HtmlCompat;
|
import androidx.core.text.HtmlCompat;
|
||||||
import androidx.preference.PreferenceManager;
|
import androidx.preference.PreferenceManager;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.BufferedWriter;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.FileWriter;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
|
||||||
import io.lbry.browser.exceptions.AuthTokenInvalidatedException;
|
import io.lbry.browser.exceptions.AuthTokenInvalidatedException;
|
||||||
import io.lbry.browser.utils.Helper;
|
import io.lbry.browser.utils.Helper;
|
||||||
import io.lbry.browser.utils.Lbry;
|
import io.lbry.browser.utils.Lbry;
|
||||||
import io.lbry.browser.utils.LbryAnalytics;
|
import io.lbry.browser.utils.LbryAnalytics;
|
||||||
import io.lbry.browser.utils.Lbryio;
|
import io.lbry.browser.utils.Lbryio;
|
||||||
import io.lbry.lbrysdk.LbrynetService;
|
import io.lbry.lbrysdk.LbrynetService;
|
||||||
|
import io.lbry.lbrysdk.ServiceHelper;
|
||||||
|
import io.lbry.lbrysdk.Utils;
|
||||||
|
|
||||||
public class FirstRunActivity extends AppCompatActivity {
|
public class FirstRunActivity extends AppCompatActivity {
|
||||||
|
|
||||||
|
@ -44,12 +54,7 @@ public class FirstRunActivity extends AppCompatActivity {
|
||||||
});
|
});
|
||||||
|
|
||||||
registerAuthReceiver();
|
registerAuthReceiver();
|
||||||
if (!Lbry.SDK_READY) {
|
findViewById(R.id.welcome_wait_container).setVisibility(View.VISIBLE);
|
||||||
findViewById(R.id.welcome_wait_container).setVisibility(View.VISIBLE);
|
|
||||||
} else {
|
|
||||||
authenticate();
|
|
||||||
}
|
|
||||||
|
|
||||||
IntentFilter filter = new IntentFilter();
|
IntentFilter filter = new IntentFilter();
|
||||||
filter.addAction(MainActivity.ACTION_SDK_READY);
|
filter.addAction(MainActivity.ACTION_SDK_READY);
|
||||||
filter.addAction(LbrynetService.ACTION_STOP_SERVICE);
|
filter.addAction(LbrynetService.ACTION_STOP_SERVICE);
|
||||||
|
@ -62,10 +67,38 @@ public class FirstRunActivity extends AppCompatActivity {
|
||||||
authenticate();
|
authenticate();
|
||||||
} else if (LbrynetService.ACTION_STOP_SERVICE.equals(action)) {
|
} else if (LbrynetService.ACTION_STOP_SERVICE.equals(action)) {
|
||||||
finish();
|
finish();
|
||||||
|
if (MainActivity.instance != null) {
|
||||||
|
MainActivity.instance.finish();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
registerReceiver(sdkReceiver, filter);
|
registerReceiver(sdkReceiver, filter);
|
||||||
|
|
||||||
|
CheckInstallIdTask task = new CheckInstallIdTask(this, new CheckInstallIdTask.InstallIdHandler() {
|
||||||
|
@Override
|
||||||
|
public void onInstallIdChecked(boolean result) {
|
||||||
|
// start the sdk from FirstRun
|
||||||
|
boolean serviceRunning = MainActivity.isServiceRunning(MainActivity.instance, LbrynetService.class);
|
||||||
|
if (!serviceRunning) {
|
||||||
|
Lbry.SDK_READY = false;
|
||||||
|
ServiceHelper.start(MainActivity.instance, "", LbrynetService.class, "lbrynetservice");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (result) {
|
||||||
|
// install_id generated and validated, authenticate now
|
||||||
|
authenticate();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// we weren't able to generate the install_id ourselves, depend on the sdk for that
|
||||||
|
if (Lbry.SDK_READY) {
|
||||||
|
authenticate();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onResume() {
|
public void onResume() {
|
||||||
|
@ -134,8 +167,76 @@ public class FirstRunActivity extends AppCompatActivity {
|
||||||
super.onDestroy();
|
super.onDestroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void generateIdAndAuthenticate() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class CheckInstallIdTask extends AsyncTask<Void, Void, Boolean> {
|
||||||
|
private final Context context;
|
||||||
|
private final InstallIdHandler handler;
|
||||||
|
public CheckInstallIdTask(Context context, InstallIdHandler handler) {
|
||||||
|
this.context = context;
|
||||||
|
this.handler = handler;
|
||||||
|
}
|
||||||
|
protected Boolean doInBackground(Void... params) {
|
||||||
|
// Load the installation id from the file system
|
||||||
|
String lbrynetDir = String.format("%s/%s", Utils.getAppInternalStorageDir(context), "lbrynet");
|
||||||
|
File dir = new File(lbrynetDir);
|
||||||
|
boolean dirExists = dir.isDirectory();
|
||||||
|
if (!dirExists) {
|
||||||
|
dirExists = dir.mkdirs();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!dirExists) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
String installIdPath = String.format("%s/install_id", lbrynetDir);
|
||||||
|
File file = new File(installIdPath);
|
||||||
|
String installId = null;
|
||||||
|
if (!file.exists()) {
|
||||||
|
// generate the install_id
|
||||||
|
installId = Lbry.generateId();
|
||||||
|
BufferedWriter writer = null;
|
||||||
|
try {
|
||||||
|
writer = new BufferedWriter(new FileWriter(file));
|
||||||
|
writer.write(installId);
|
||||||
|
} catch (IOException ex) {
|
||||||
|
return false;
|
||||||
|
} finally {
|
||||||
|
Helper.closeCloseable(writer);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// read the installation id from the file
|
||||||
|
BufferedReader reader = null;
|
||||||
|
try {
|
||||||
|
reader = new BufferedReader(new InputStreamReader(new FileInputStream(installIdPath)));
|
||||||
|
installId = reader.readLine();
|
||||||
|
} catch (IOException ex) {
|
||||||
|
return false;
|
||||||
|
} finally {
|
||||||
|
Helper.closeCloseable(reader);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!Helper.isNullOrEmpty(installId)) {
|
||||||
|
Lbry.INSTALLATION_ID = installId;
|
||||||
|
}
|
||||||
|
return !Helper.isNullOrEmpty(installId);
|
||||||
|
}
|
||||||
|
protected void onPostExecute(Boolean result) {
|
||||||
|
if (handler != null) {
|
||||||
|
handler.onInstallIdChecked(result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface InstallIdHandler {
|
||||||
|
void onInstallIdChecked(boolean result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private static class AuthenticateTask extends AsyncTask<Void, Void, Void> {
|
private static class AuthenticateTask extends AsyncTask<Void, Void, Void> {
|
||||||
private Context context;
|
private final Context context;
|
||||||
public AuthenticateTask(Context context) {
|
public AuthenticateTask(Context context) {
|
||||||
this.context = context;
|
this.context = context;
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,6 +6,7 @@ import android.app.PendingIntent;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
|
import android.database.sqlite.SQLiteDatabase;
|
||||||
import android.media.RingtoneManager;
|
import android.media.RingtoneManager;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
|
@ -20,19 +21,22 @@ import com.google.firebase.analytics.FirebaseAnalytics;
|
||||||
import com.google.firebase.messaging.FirebaseMessagingService;
|
import com.google.firebase.messaging.FirebaseMessagingService;
|
||||||
import com.google.firebase.messaging.RemoteMessage;
|
import com.google.firebase.messaging.RemoteMessage;
|
||||||
|
|
||||||
|
import io.lbry.browser.data.DatabaseHelper;
|
||||||
|
import io.lbry.browser.model.lbryinc.LbryNotification;
|
||||||
|
import io.lbry.browser.utils.Helper;
|
||||||
import io.lbry.browser.utils.LbryAnalytics;
|
import io.lbry.browser.utils.LbryAnalytics;
|
||||||
import io.lbry.lbrysdk.LbrynetService;
|
|
||||||
|
|
||||||
import java.io.UnsupportedEncodingException;
|
|
||||||
import java.net.URLEncoder;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
public class LbrynetMessagingService extends FirebaseMessagingService {
|
public class LbrynetMessagingService extends FirebaseMessagingService {
|
||||||
|
public static final String ACTION_NOTIFICATION_RECEIVED = "io.lbry.browser.Broadcast.NotificationReceived";
|
||||||
|
|
||||||
private static final String TAG = "LbrynetMessagingService";
|
private static final String TAG = "LbrynetMessagingService";
|
||||||
private static final String NOTIFICATION_CHANNEL_ID = "io.lbry.browser.LBRY_ENGAGEMENT_CHANNEL";
|
private static final String NOTIFICATION_CHANNEL_ID = "io.lbry.browser.LBRY_ENGAGEMENT_CHANNEL";
|
||||||
|
private static final String TYPE_COMMENT = "comment";
|
||||||
private static final String TYPE_SUBSCRIPTION = "subscription";
|
private static final String TYPE_SUBSCRIPTION = "subscription";
|
||||||
private static final String TYPE_REWARD = "reward";
|
private static final String TYPE_REWARD = "reward";
|
||||||
private static final String TYPE_INTERESTS = "interests";
|
private static final String TYPE_INTERESTS = "interests";
|
||||||
|
@ -52,12 +56,9 @@ public class LbrynetMessagingService extends FirebaseMessagingService {
|
||||||
String title = payload.get("title");
|
String title = payload.get("title");
|
||||||
String body = payload.get("body");
|
String body = payload.get("body");
|
||||||
String name = payload.get("name"); // notification name
|
String name = payload.get("name"); // notification name
|
||||||
String contentTitle = payload.get("content_title");
|
String hash = payload.get("hash"); // comment hash
|
||||||
String channelUrl = payload.get("channel_url");
|
|
||||||
//String publishTime = payload.get("publish_time");
|
|
||||||
String publishTime = null;
|
|
||||||
|
|
||||||
if (type != null && getEnabledTypes().indexOf(type) > -1 && body != null && body.trim().length() > 0) {
|
if (type != null && getEnabledTypes().contains(type) && body != null && body.trim().length() > 0) {
|
||||||
// only log the receive event for valid notifications received
|
// only log the receive event for valid notifications received
|
||||||
if (firebaseAnalytics != null) {
|
if (firebaseAnalytics != null) {
|
||||||
Bundle bundle = new Bundle();
|
Bundle bundle = new Bundle();
|
||||||
|
@ -65,14 +66,41 @@ public class LbrynetMessagingService extends FirebaseMessagingService {
|
||||||
firebaseAnalytics.logEvent(LbryAnalytics.EVENT_LBRY_NOTIFICATION_RECEIVE, bundle);
|
firebaseAnalytics.logEvent(LbryAnalytics.EVENT_LBRY_NOTIFICATION_RECEIVE, bundle);
|
||||||
}
|
}
|
||||||
|
|
||||||
sendNotification(title, body, type, url, name, contentTitle, channelUrl, publishTime);
|
if (!Helper.isNullOrEmpty(hash)) {
|
||||||
|
url = String.format("%s?comment_hash=%s", url, hash);
|
||||||
|
}
|
||||||
|
|
||||||
|
sendNotification(title, body, type, url, name);
|
||||||
|
}
|
||||||
|
|
||||||
|
// persist the notification data
|
||||||
|
try {
|
||||||
|
DatabaseHelper helper = DatabaseHelper.getInstance();
|
||||||
|
SQLiteDatabase db = helper.getWritableDatabase();
|
||||||
|
LbryNotification lnotification = new LbryNotification();
|
||||||
|
lnotification.setTitle(title);
|
||||||
|
lnotification.setDescription(body);
|
||||||
|
lnotification.setTargetUrl(url);
|
||||||
|
lnotification.setTimestamp(new Date());
|
||||||
|
DatabaseHelper.createOrUpdateNotification(lnotification, db);
|
||||||
|
|
||||||
|
// send a broadcast
|
||||||
|
Intent intent = new Intent(ACTION_NOTIFICATION_RECEIVED);
|
||||||
|
intent.putExtra("title", title);
|
||||||
|
intent.putExtra("body", body);
|
||||||
|
intent.putExtra("url", url);
|
||||||
|
intent.putExtra("timestamp", lnotification.getTimestamp().getTime());
|
||||||
|
sendBroadcast(intent);
|
||||||
|
} catch (Exception ex) {
|
||||||
|
// don't fail if any error occurs while saving a notification
|
||||||
|
Log.e(TAG, "could not save notification", ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onNewToken(String token) {
|
public void onNewToken(String token) {
|
||||||
Log.d(TAG, "Refreshed token: " + token);
|
//Log.d(TAG, "Refreshed token: " + token);
|
||||||
|
|
||||||
// If you want to send messages to this application instance or
|
// If you want to send messages to this application instance or
|
||||||
// manage this apps subscriptions on the server side, send the
|
// manage this apps subscriptions on the server side, send the
|
||||||
|
@ -97,8 +125,7 @@ public class LbrynetMessagingService extends FirebaseMessagingService {
|
||||||
*
|
*
|
||||||
* @param messageBody FCM message body received.
|
* @param messageBody FCM message body received.
|
||||||
*/
|
*/
|
||||||
private void sendNotification(String title, String messageBody, String type, String url, String name,
|
private void sendNotification(String title, String messageBody, String type, String url, String name) {
|
||||||
String contentTitle, String channelUrl, String publishTime) {
|
|
||||||
//Intent intent = new Intent(this, MainActivity.class);
|
//Intent intent = new Intent(this, MainActivity.class);
|
||||||
//intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
|
//intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
|
||||||
if (url == null) {
|
if (url == null) {
|
||||||
|
@ -143,6 +170,9 @@ public class LbrynetMessagingService extends FirebaseMessagingService {
|
||||||
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
|
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
|
||||||
List<String> enabledTypes = new ArrayList<String>();
|
List<String> enabledTypes = new ArrayList<String>();
|
||||||
|
|
||||||
|
if (sp.getBoolean(MainActivity.PREFERENCE_KEY_NOTIFICATION_COMMENTS, true)) {
|
||||||
|
enabledTypes.add(TYPE_COMMENT);
|
||||||
|
}
|
||||||
if (sp.getBoolean(MainActivity.PREFERENCE_KEY_NOTIFICATION_SUBSCRIPTIONS, true)) {
|
if (sp.getBoolean(MainActivity.PREFERENCE_KEY_NOTIFICATION_SUBSCRIPTIONS, true)) {
|
||||||
enabledTypes.add(TYPE_SUBSCRIPTION);
|
enabledTypes.add(TYPE_SUBSCRIPTION);
|
||||||
}
|
}
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -7,19 +7,36 @@ import android.content.IntentFilter;
|
||||||
import android.graphics.Color;
|
import android.graphics.Color;
|
||||||
import android.os.AsyncTask;
|
import android.os.AsyncTask;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
import android.os.Handler;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
import androidx.fragment.app.FragmentActivity;
|
import androidx.fragment.app.FragmentActivity;
|
||||||
import androidx.viewpager2.widget.ViewPager2;
|
import androidx.viewpager2.widget.ViewPager2;
|
||||||
|
|
||||||
|
import com.android.billingclient.api.BillingClient;
|
||||||
|
import com.android.billingclient.api.BillingClientStateListener;
|
||||||
|
import com.android.billingclient.api.BillingFlowParams;
|
||||||
|
import com.android.billingclient.api.BillingResult;
|
||||||
|
import com.android.billingclient.api.Purchase;
|
||||||
|
import com.android.billingclient.api.PurchasesUpdatedListener;
|
||||||
|
import com.android.billingclient.api.SkuDetails;
|
||||||
|
import com.android.billingclient.api.SkuDetailsParams;
|
||||||
|
import com.android.billingclient.api.SkuDetailsResponseListener;
|
||||||
import com.google.android.material.snackbar.Snackbar;
|
import com.google.android.material.snackbar.Snackbar;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import io.lbry.browser.adapter.VerificationPagerAdapter;
|
import io.lbry.browser.adapter.VerificationPagerAdapter;
|
||||||
|
import io.lbry.browser.listener.SdkStatusListener;
|
||||||
import io.lbry.browser.listener.SignInListener;
|
import io.lbry.browser.listener.SignInListener;
|
||||||
import io.lbry.browser.listener.WalletSyncListener;
|
import io.lbry.browser.listener.WalletSyncListener;
|
||||||
|
import io.lbry.browser.model.lbryinc.RewardVerified;
|
||||||
import io.lbry.browser.model.lbryinc.User;
|
import io.lbry.browser.model.lbryinc.User;
|
||||||
|
import io.lbry.browser.tasks.RewardVerifiedHandler;
|
||||||
import io.lbry.browser.tasks.lbryinc.FetchCurrentUserTask;
|
import io.lbry.browser.tasks.lbryinc.FetchCurrentUserTask;
|
||||||
import io.lbry.browser.utils.Helper;
|
import io.lbry.browser.utils.Helper;
|
||||||
import io.lbry.browser.utils.LbryAnalytics;
|
import io.lbry.browser.utils.LbryAnalytics;
|
||||||
|
@ -32,15 +49,66 @@ public class VerificationActivity extends FragmentActivity implements SignInList
|
||||||
public static final int VERIFICATION_FLOW_REWARDS = 2;
|
public static final int VERIFICATION_FLOW_REWARDS = 2;
|
||||||
public static final int VERIFICATION_FLOW_WALLET = 3;
|
public static final int VERIFICATION_FLOW_WALLET = 3;
|
||||||
|
|
||||||
|
private List<SdkStatusListener> sdkStatusListeners;
|
||||||
|
private BillingClient billingClient;
|
||||||
private BroadcastReceiver sdkReceiver;
|
private BroadcastReceiver sdkReceiver;
|
||||||
private String email;
|
private String email;
|
||||||
private boolean signedIn;
|
private boolean signedIn;
|
||||||
private int flow;
|
private int flow;
|
||||||
|
|
||||||
|
private final PurchasesUpdatedListener purchasesUpdatedListener = new PurchasesUpdatedListener() {
|
||||||
|
@Override
|
||||||
|
public void onPurchasesUpdated(@NonNull BillingResult billingResult, @Nullable List<Purchase> purchases) {
|
||||||
|
int responseCode = billingResult.getResponseCode();
|
||||||
|
if (responseCode == BillingClient.BillingResponseCode.OK && purchases != null)
|
||||||
|
{
|
||||||
|
for (Purchase purchase : purchases) {
|
||||||
|
if (MainActivity.SKU_SKIP.equalsIgnoreCase(purchase.getSku())) {
|
||||||
|
showLoading();
|
||||||
|
MainActivity.handleBillingPurchase(
|
||||||
|
purchase,
|
||||||
|
billingClient,
|
||||||
|
VerificationActivity.this, null, new RewardVerifiedHandler() {
|
||||||
|
@Override
|
||||||
|
public void onSuccess(RewardVerified rewardVerified) {
|
||||||
|
if (Lbryio.currentUser != null) {
|
||||||
|
Lbryio.currentUser.setRewardApproved(rewardVerified.isRewardApproved());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!rewardVerified.isRewardApproved()) {
|
||||||
|
// show pending purchase message (possible slow card tx)
|
||||||
|
Snackbar.make(findViewById(R.id.verification_pager), R.string.purchase_request_pending, Snackbar.LENGTH_LONG).show();
|
||||||
|
} else {
|
||||||
|
Snackbar.make(findViewById(R.id.verification_pager), R.string.reward_verification_successful, Snackbar.LENGTH_LONG).show();
|
||||||
|
}
|
||||||
|
|
||||||
|
setResult(RESULT_OK);
|
||||||
|
new Handler().postDelayed(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
finish();
|
||||||
|
}
|
||||||
|
}, 3000);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onError(Exception error) {
|
||||||
|
showFetchUserError(getString(R.string.purchase_request_failed_error));
|
||||||
|
hideLoading();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreate(Bundle savedInstanceState) {
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
|
|
||||||
|
sdkStatusListeners = new ArrayList<>();
|
||||||
|
|
||||||
signedIn = Lbryio.isSignedIn();
|
signedIn = Lbryio.isSignedIn();
|
||||||
Intent intent = getIntent();
|
Intent intent = getIntent();
|
||||||
if (intent != null) {
|
if (intent != null) {
|
||||||
|
@ -62,17 +130,30 @@ public class VerificationActivity extends FragmentActivity implements SignInList
|
||||||
|
|
||||||
IntentFilter filter = new IntentFilter();
|
IntentFilter filter = new IntentFilter();
|
||||||
filter.addAction(LbrynetService.ACTION_STOP_SERVICE);
|
filter.addAction(LbrynetService.ACTION_STOP_SERVICE);
|
||||||
|
filter.addAction(MainActivity.ACTION_SDK_READY);
|
||||||
sdkReceiver = new BroadcastReceiver() {
|
sdkReceiver = new BroadcastReceiver() {
|
||||||
@Override
|
@Override
|
||||||
public void onReceive(Context context, Intent intent) {
|
public void onReceive(Context context, Intent intent) {
|
||||||
String action = intent.getAction();
|
String action = intent.getAction();
|
||||||
if (LbrynetService.ACTION_STOP_SERVICE.equals(action)) {
|
if (MainActivity.ACTION_SDK_READY.equals(action)) {
|
||||||
|
for (SdkStatusListener listener : sdkStatusListeners) {
|
||||||
|
if (listener != null) {
|
||||||
|
listener.onSdkReady();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (LbrynetService.ACTION_STOP_SERVICE.equals(action)) {
|
||||||
finish();
|
finish();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
registerReceiver(sdkReceiver, filter);
|
registerReceiver(sdkReceiver, filter);
|
||||||
|
|
||||||
|
billingClient = BillingClient.newBuilder(this)
|
||||||
|
.setListener(purchasesUpdatedListener)
|
||||||
|
.enablePendingPurchases()
|
||||||
|
.build();
|
||||||
|
establishBillingClientConnection();
|
||||||
|
|
||||||
setContentView(R.layout.activity_verification);
|
setContentView(R.layout.activity_verification);
|
||||||
ViewPager2 viewPager = findViewById(R.id.verification_pager);
|
ViewPager2 viewPager = findViewById(R.id.verification_pager);
|
||||||
viewPager.setUserInputEnabled(false);
|
viewPager.setUserInputEnabled(false);
|
||||||
|
@ -89,6 +170,24 @@ public class VerificationActivity extends FragmentActivity implements SignInList
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void establishBillingClientConnection() {
|
||||||
|
if (billingClient != null) {
|
||||||
|
billingClient.startConnection(new BillingClientStateListener() {
|
||||||
|
@Override
|
||||||
|
public void onBillingSetupFinished(@NonNull BillingResult billingResult) {
|
||||||
|
if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
|
||||||
|
// no need to do anything here. purchases are always checked server-side
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onBillingServiceDisconnected() {
|
||||||
|
establishBillingClientConnection();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void onResume() {
|
public void onResume() {
|
||||||
super.onResume();
|
super.onResume();
|
||||||
LbryAnalytics.setCurrentScreen(this, "Verification", "Verification");
|
LbryAnalytics.setCurrentScreen(this, "Verification", "Verification");
|
||||||
|
@ -104,14 +203,17 @@ public class VerificationActivity extends FragmentActivity implements SignInList
|
||||||
flowHandled = true;
|
flowHandled = true;
|
||||||
} else if (flow == VERIFICATION_FLOW_REWARDS) {
|
} else if (flow == VERIFICATION_FLOW_REWARDS) {
|
||||||
User user = Lbryio.currentUser;
|
User user = Lbryio.currentUser;
|
||||||
|
// disable phone verification for now
|
||||||
if (!user.isIdentityVerified()) {
|
if (!user.isIdentityVerified()) {
|
||||||
// phone number verification required
|
// phone number verification required
|
||||||
viewPager.setCurrentItem(VerificationPagerAdapter.PAGE_VERIFICATION_PHONE, false);
|
viewPager.setCurrentItem(VerificationPagerAdapter.PAGE_VERIFICATION_PHONE, false);
|
||||||
flowHandled = true;
|
flowHandled = true;
|
||||||
} else if (!user.isRewardApproved()) {
|
} else {
|
||||||
// manual verification required
|
if (!user.isRewardApproved()) {
|
||||||
viewPager.setCurrentItem(VerificationPagerAdapter.PAGE_VERIFICATION_MANUAL, false);
|
// manual verification required
|
||||||
flowHandled = true;
|
viewPager.setCurrentItem(VerificationPagerAdapter.PAGE_VERIFICATION_MANUAL, false);
|
||||||
|
flowHandled = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -124,6 +226,11 @@ public class VerificationActivity extends FragmentActivity implements SignInList
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void showPhoneVerification() {
|
||||||
|
ViewPager2 viewPager = findViewById(R.id.verification_pager);
|
||||||
|
viewPager.setCurrentItem(VerificationPagerAdapter.PAGE_VERIFICATION_PHONE, false);
|
||||||
|
}
|
||||||
|
|
||||||
public void showLoading() {
|
public void showLoading() {
|
||||||
findViewById(R.id.verification_loading_progress).setVisibility(View.VISIBLE);
|
findViewById(R.id.verification_loading_progress).setVisibility(View.VISIBLE);
|
||||||
findViewById(R.id.verification_pager).setVisibility(View.INVISIBLE);
|
findViewById(R.id.verification_pager).setVisibility(View.INVISIBLE);
|
||||||
|
@ -137,8 +244,12 @@ public class VerificationActivity extends FragmentActivity implements SignInList
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onBackPressed() {
|
public void onBackPressed() {
|
||||||
// ignore back press
|
ViewPager2 viewPager = findViewById(R.id.verification_pager);
|
||||||
return;
|
|
||||||
|
if (viewPager.getCurrentItem() != VerificationPagerAdapter.PAGE_VERIFICATION_MANUAL)
|
||||||
|
viewPager.setCurrentItem(VerificationPagerAdapter.PAGE_VERIFICATION_MANUAL);
|
||||||
|
else
|
||||||
|
super.onBackPressed();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onEmailAdded(String email) {
|
public void onEmailAdded(String email) {
|
||||||
|
@ -198,13 +309,15 @@ public class VerificationActivity extends FragmentActivity implements SignInList
|
||||||
if (!user.isIdentityVerified()) {
|
if (!user.isIdentityVerified()) {
|
||||||
// phone number verification required
|
// phone number verification required
|
||||||
viewPager.setCurrentItem(VerificationPagerAdapter.PAGE_VERIFICATION_PHONE, false);
|
viewPager.setCurrentItem(VerificationPagerAdapter.PAGE_VERIFICATION_PHONE, false);
|
||||||
} else if (!user.isRewardApproved()) {
|
|
||||||
// manual verification required
|
|
||||||
viewPager.setCurrentItem(VerificationPagerAdapter.PAGE_VERIFICATION_MANUAL, false);
|
|
||||||
} else {
|
} else {
|
||||||
// fully verified
|
if (!user.isRewardApproved()) {
|
||||||
setResult(RESULT_OK);
|
// manual verification required
|
||||||
finish();
|
viewPager.setCurrentItem(VerificationPagerAdapter.PAGE_VERIFICATION_MANUAL, false);
|
||||||
|
} else {
|
||||||
|
// fully verified
|
||||||
|
setResult(RESULT_OK);
|
||||||
|
finish();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else if (flow == VERIFICATION_FLOW_WALLET) {
|
} else if (flow == VERIFICATION_FLOW_WALLET) {
|
||||||
// for wallet sync, if password unlock is required, show password entry page
|
// for wallet sync, if password unlock is required, show password entry page
|
||||||
|
@ -242,6 +355,7 @@ public class VerificationActivity extends FragmentActivity implements SignInList
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
findViewById(R.id.verification_close_button).setVisibility(View.VISIBLE);
|
||||||
// show manual verification page if the user is still not reward approved
|
// show manual verification page if the user is still not reward approved
|
||||||
ViewPager2 viewPager = findViewById(R.id.verification_pager);
|
ViewPager2 viewPager = findViewById(R.id.verification_pager);
|
||||||
viewPager.setCurrentItem(VerificationPagerAdapter.PAGE_VERIFICATION_MANUAL, false);
|
viewPager.setCurrentItem(VerificationPagerAdapter.PAGE_VERIFICATION_MANUAL, false);
|
||||||
|
@ -289,9 +403,67 @@ public class VerificationActivity extends FragmentActivity implements SignInList
|
||||||
findViewById(R.id.verification_close_button).setVisibility(View.VISIBLE);
|
findViewById(R.id.verification_close_button).setVisibility(View.VISIBLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onSkipQueueAction() {
|
||||||
|
if (billingClient != null) {
|
||||||
|
List<String> skuList = new ArrayList<>();
|
||||||
|
skuList.add(MainActivity.SKU_SKIP);
|
||||||
|
|
||||||
|
SkuDetailsParams detailsParams = SkuDetailsParams.newBuilder().
|
||||||
|
setType(BillingClient.SkuType.INAPP).
|
||||||
|
setSkusList(skuList).build();
|
||||||
|
billingClient.querySkuDetailsAsync(detailsParams, new SkuDetailsResponseListener() {
|
||||||
|
@Override
|
||||||
|
public void onSkuDetailsResponse(@NonNull BillingResult billingResult, @Nullable List<SkuDetails> list) {
|
||||||
|
if (list != null && list.size() > 0) {
|
||||||
|
// we only queried one product, so it should be the first item in the list
|
||||||
|
SkuDetails skuDetails = list.get(0);
|
||||||
|
|
||||||
|
// launch the billing flow for skip queue
|
||||||
|
BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder().
|
||||||
|
setSkuDetails(skuDetails).build();
|
||||||
|
billingClient.launchBillingFlow(VerificationActivity.this, billingFlowParams);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onTwitterVerified() {
|
||||||
|
Snackbar.make(findViewById(R.id.verification_pager), R.string.reward_verification_successful, Snackbar.LENGTH_LONG).show();
|
||||||
|
|
||||||
|
setResult(RESULT_OK);
|
||||||
|
new Handler().postDelayed(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
finish();
|
||||||
|
}
|
||||||
|
}, 3000);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onManualProgress(boolean progress) {
|
||||||
|
if (progress) {
|
||||||
|
findViewById(R.id.verification_close_button).setVisibility(View.GONE);
|
||||||
|
} else {
|
||||||
|
findViewById(R.id.verification_close_button).setVisibility(View.VISIBLE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onDestroy() {
|
public void onDestroy() {
|
||||||
Helper.unregisterReceiver(sdkReceiver, this);
|
Helper.unregisterReceiver(sdkReceiver, this);
|
||||||
super.onDestroy();
|
super.onDestroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void addSdkStatusListener(SdkStatusListener listener) {
|
||||||
|
if (!sdkStatusListeners.contains(listener)) {
|
||||||
|
sdkStatusListeners.add(listener);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void removeSdkStatusListener(SdkStatusListener listener) {
|
||||||
|
sdkStatusListeners.remove(listener);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,7 +23,7 @@ import lombok.Getter;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
|
|
||||||
public class ChannelFilterListAdapter extends RecyclerView.Adapter<ChannelFilterListAdapter.ViewHolder> {
|
public class ChannelFilterListAdapter extends RecyclerView.Adapter<ChannelFilterListAdapter.ViewHolder> {
|
||||||
private Context context;
|
private final Context context;
|
||||||
private List<Claim> items;
|
private List<Claim> items;
|
||||||
@Getter
|
@Getter
|
||||||
@Setter
|
@Setter
|
||||||
|
@ -42,12 +42,12 @@ public class ChannelFilterListAdapter extends RecyclerView.Adapter<ChannelFilter
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class ViewHolder extends RecyclerView.ViewHolder {
|
public static class ViewHolder extends RecyclerView.ViewHolder {
|
||||||
protected View mediaContainer;
|
protected final View mediaContainer;
|
||||||
protected View alphaContainer;
|
protected final View alphaContainer;
|
||||||
protected View allView;
|
protected final View allView;
|
||||||
protected ImageView thumbnailView;
|
protected final ImageView thumbnailView;
|
||||||
protected TextView alphaView;
|
protected final TextView alphaView;
|
||||||
protected TextView titleView;
|
protected final TextView titleView;
|
||||||
public ViewHolder(View v) {
|
public ViewHolder(View v) {
|
||||||
super(v);
|
super(v);
|
||||||
mediaContainer = v.findViewById(R.id.channel_filter_media_container);
|
mediaContainer = v.findViewById(R.id.channel_filter_media_container);
|
||||||
|
@ -95,13 +95,13 @@ public class ChannelFilterListAdapter extends RecyclerView.Adapter<ChannelFilter
|
||||||
vh.allView.setVisibility(claim.isPlaceholder() ? View.VISIBLE : View.GONE);
|
vh.allView.setVisibility(claim.isPlaceholder() ? View.VISIBLE : View.GONE);
|
||||||
|
|
||||||
vh.titleView.setText(Helper.isNullOrEmpty(claim.getTitle()) ? claim.getName() : claim.getTitle());
|
vh.titleView.setText(Helper.isNullOrEmpty(claim.getTitle()) ? claim.getName() : claim.getTitle());
|
||||||
String thumbnailUrl = claim.getThumbnailUrl();
|
String thumbnailUrl = claim.getThumbnailUrl(vh.thumbnailView.getLayoutParams().width, vh.thumbnailView.getLayoutParams().height, 85);
|
||||||
if (!Helper.isNullOrEmpty(thumbnailUrl) && context != null) {
|
if (!Helper.isNullOrEmpty(thumbnailUrl) && context != null) {
|
||||||
Glide.with(context.getApplicationContext()).load(thumbnailUrl).apply(RequestOptions.circleCropTransform()).into(vh.thumbnailView);
|
Glide.with(context.getApplicationContext()).load(thumbnailUrl).apply(RequestOptions.circleCropTransform()).into(vh.thumbnailView);
|
||||||
}
|
}
|
||||||
vh.alphaContainer.setVisibility(claim.isPlaceholder() || Helper.isNullOrEmpty(thumbnailUrl) ? View.VISIBLE : View.GONE);
|
vh.alphaContainer.setVisibility(claim.isPlaceholder() || Helper.isNullOrEmpty(thumbnailUrl) ? View.VISIBLE : View.GONE);
|
||||||
vh.thumbnailView.setVisibility(claim.isPlaceholder() || Helper.isNullOrEmpty(thumbnailUrl) ? View.GONE : View.VISIBLE);
|
vh.thumbnailView.setVisibility(claim.isPlaceholder() || Helper.isNullOrEmpty(thumbnailUrl) ? View.GONE : View.VISIBLE);
|
||||||
vh.alphaView.setText(claim.isPlaceholder() ? null : claim.getName() != null ? claim.getName().substring(1, 2) : "");
|
vh.alphaView.setText(claim.isPlaceholder() ? null : claim.getName() != null ? claim.getName().substring(1, 2).toUpperCase() : "");
|
||||||
|
|
||||||
int bgColor = Helper.generateRandomColorForValue(claim.getClaimId());
|
int bgColor = Helper.generateRandomColorForValue(claim.getClaimId());
|
||||||
Helper.setIconViewBackgroundColor(vh.alphaContainer, bgColor, claim.isPlaceholder(), context);
|
Helper.setIconViewBackgroundColor(vh.alphaContainer, bgColor, claim.isPlaceholder(), context);
|
||||||
|
|
|
@ -21,7 +21,6 @@ import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import io.lbry.browser.MainActivity;
|
|
||||||
import io.lbry.browser.R;
|
import io.lbry.browser.R;
|
||||||
import io.lbry.browser.listener.SelectionModeListener;
|
import io.lbry.browser.listener.SelectionModeListener;
|
||||||
import io.lbry.browser.model.Claim;
|
import io.lbry.browser.model.Claim;
|
||||||
|
@ -37,18 +36,18 @@ public class ClaimListAdapter extends RecyclerView.Adapter<ClaimListAdapter.View
|
||||||
private static final int VIEW_TYPE_CHANNEL = 2;
|
private static final int VIEW_TYPE_CHANNEL = 2;
|
||||||
private static final int VIEW_TYPE_FEATURED = 3; // featured search result
|
private static final int VIEW_TYPE_FEATURED = 3; // featured search result
|
||||||
|
|
||||||
private Map<String, Claim> quickClaimIdMap;
|
private final Map<String, Claim> quickClaimIdMap;
|
||||||
private Map<String, Claim> quickClaimUrlMap;
|
private final Map<String, Claim> quickClaimUrlMap;
|
||||||
private Map<String, Boolean> notFoundClaimIdMap;
|
private final Map<String, Boolean> notFoundClaimIdMap;
|
||||||
private Map<String, Boolean> notFoundClaimUrlMap;
|
private final Map<String, Boolean> notFoundClaimUrlMap;
|
||||||
|
|
||||||
@Setter
|
@Setter
|
||||||
private boolean hideFee;
|
private boolean hideFee;
|
||||||
@Setter
|
@Setter
|
||||||
private boolean canEnterSelectionMode;
|
private boolean canEnterSelectionMode;
|
||||||
private Context context;
|
private final Context context;
|
||||||
private List<Claim> items;
|
private List<Claim> items;
|
||||||
private List<Claim> selectedItems;
|
private final List<Claim> selectedItems;
|
||||||
@Setter
|
@Setter
|
||||||
private ClaimListItemListener listener;
|
private ClaimListItemListener listener;
|
||||||
@Getter
|
@Getter
|
||||||
|
@ -176,23 +175,27 @@ public class ClaimListAdapter extends RecyclerView.Adapter<ClaimListAdapter.View
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class ViewHolder extends RecyclerView.ViewHolder {
|
public static class ViewHolder extends RecyclerView.ViewHolder {
|
||||||
protected View feeContainer;
|
protected final View feeContainer;
|
||||||
protected TextView feeView;
|
protected final TextView feeView;
|
||||||
protected ImageView thumbnailView;
|
protected final ImageView thumbnailView;
|
||||||
protected View noThumbnailView;
|
protected final View noThumbnailView;
|
||||||
protected TextView alphaView;
|
protected final TextView alphaView;
|
||||||
protected TextView vanityUrlView;
|
protected final TextView vanityUrlView;
|
||||||
protected TextView durationView;
|
protected final TextView durationView;
|
||||||
protected TextView titleView;
|
protected final TextView titleView;
|
||||||
protected TextView publisherView;
|
protected final TextView publisherView;
|
||||||
protected TextView publishTimeView;
|
protected final TextView publishTimeView;
|
||||||
protected TextView pendingTextView;
|
protected final TextView pendingTextView;
|
||||||
protected View repostInfoView;
|
protected final View repostInfoView;
|
||||||
protected TextView repostChannelView;
|
protected final TextView repostChannelView;
|
||||||
protected View selectedOverlayView;
|
protected final View selectedOverlayView;
|
||||||
protected TextView fileSizeView;
|
protected final TextView fileSizeView;
|
||||||
protected ProgressBar downloadProgressView;
|
protected final ProgressBar downloadProgressView;
|
||||||
protected TextView deviceView;
|
protected final TextView deviceView;
|
||||||
|
|
||||||
|
protected final View loadingImagePlaceholder;
|
||||||
|
protected final View loadingTextPlaceholder1;
|
||||||
|
protected final View loadingTextPlaceholder2;
|
||||||
public ViewHolder(View v) {
|
public ViewHolder(View v) {
|
||||||
super(v);
|
super(v);
|
||||||
feeContainer = v.findViewById(R.id.claim_fee_container);
|
feeContainer = v.findViewById(R.id.claim_fee_container);
|
||||||
|
@ -212,6 +215,10 @@ public class ClaimListAdapter extends RecyclerView.Adapter<ClaimListAdapter.View
|
||||||
fileSizeView = v.findViewById(R.id.claim_file_size);
|
fileSizeView = v.findViewById(R.id.claim_file_size);
|
||||||
downloadProgressView = v.findViewById(R.id.claim_download_progress);
|
downloadProgressView = v.findViewById(R.id.claim_download_progress);
|
||||||
deviceView = v.findViewById(R.id.claim_view_device);
|
deviceView = v.findViewById(R.id.claim_view_device);
|
||||||
|
|
||||||
|
loadingImagePlaceholder = v.findViewById(R.id.claim_thumbnail_placeholder);
|
||||||
|
loadingTextPlaceholder1 = v.findViewById(R.id.claim_text_loading_placeholder_1);
|
||||||
|
loadingTextPlaceholder2 = v.findViewById(R.id.claim_text_loading_placeholder_2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -315,7 +322,7 @@ public class ClaimListAdapter extends RecyclerView.Adapter<ClaimListAdapter.View
|
||||||
int paddingBottom = position == getItemCount() - 1 ? 16 : 8;
|
int paddingBottom = position == getItemCount() - 1 ? 16 : 8;
|
||||||
int paddingTopScaled = Helper.getScaledValue(paddingTop, scale);
|
int paddingTopScaled = Helper.getScaledValue(paddingTop, scale);
|
||||||
int paddingBottomScaled = Helper.getScaledValue(paddingBottom, scale);
|
int paddingBottomScaled = Helper.getScaledValue(paddingBottom, scale);
|
||||||
vh.itemView.setPadding(vh.itemView.getPaddingLeft(), paddingTopScaled, vh.itemView.getPaddingRight(), paddingBottomScaled);
|
vh.itemView.setPadding(vh.itemView.getPaddingStart(), paddingTopScaled, vh.itemView.getPaddingEnd(), paddingBottomScaled);
|
||||||
|
|
||||||
Claim original = items.get(position);
|
Claim original = items.get(position);
|
||||||
boolean isRepost = Claim.TYPE_REPOST.equalsIgnoreCase(original.getValueType());
|
boolean isRepost = Claim.TYPE_REPOST.equalsIgnoreCase(original.getValueType());
|
||||||
|
@ -327,7 +334,8 @@ public class ClaimListAdapter extends RecyclerView.Adapter<ClaimListAdapter.View
|
||||||
if (metadata instanceof Claim.StreamMetadata) {
|
if (metadata instanceof Claim.StreamMetadata) {
|
||||||
streamMetadata = (Claim.StreamMetadata) metadata;
|
streamMetadata = (Claim.StreamMetadata) metadata;
|
||||||
}
|
}
|
||||||
String thumbnailUrl = item.getThumbnailUrl();
|
|
||||||
|
String thumbnailUrl = item.getThumbnailUrl(vh.thumbnailView.getLayoutParams().width, vh.thumbnailView.getLayoutParams().height, 85);
|
||||||
long publishTime = (streamMetadata != null && streamMetadata.getReleaseTime() > 0) ? streamMetadata.getReleaseTime() * 1000 : item.getTimestamp() * 1000;
|
long publishTime = (streamMetadata != null && streamMetadata.getReleaseTime() > 0) ? streamMetadata.getReleaseTime() * 1000 : item.getTimestamp() * 1000;
|
||||||
int bgColor = Helper.generateRandomColorForValue(item.getClaimId());
|
int bgColor = Helper.generateRandomColorForValue(item.getClaimId());
|
||||||
if (bgColor == 0) {
|
if (bgColor == 0) {
|
||||||
|
@ -394,9 +402,9 @@ public class ClaimListAdapter extends RecyclerView.Adapter<ClaimListAdapter.View
|
||||||
});
|
});
|
||||||
|
|
||||||
vh.publishTimeView.setVisibility(!isPending ? View.VISIBLE : View.GONE);
|
vh.publishTimeView.setVisibility(!isPending ? View.VISIBLE : View.GONE);
|
||||||
vh.pendingTextView.setVisibility(isPending ? View.VISIBLE : View.GONE);
|
vh.pendingTextView.setVisibility(isPending && !item.isLoadingPlaceholder() ? View.VISIBLE : View.GONE);
|
||||||
vh.repostInfoView.setVisibility(isRepost && type != VIEW_TYPE_FEATURED ? View.VISIBLE : View.GONE);
|
vh.repostInfoView.setVisibility(isRepost && type != VIEW_TYPE_FEATURED ? View.VISIBLE : View.GONE);
|
||||||
vh.repostChannelView.setText(isRepost ? original.getSigningChannel().getName() : null);
|
vh.repostChannelView.setText(isRepost && original.getSigningChannel() != null ? original.getSigningChannel().getName() : null);
|
||||||
vh.repostChannelView.setOnClickListener(new View.OnClickListener() {
|
vh.repostChannelView.setOnClickListener(new View.OnClickListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onClick(View view) {
|
public void onClick(View view) {
|
||||||
|
@ -417,6 +425,13 @@ public class ClaimListAdapter extends RecyclerView.Adapter<ClaimListAdapter.View
|
||||||
vh.noThumbnailView.setVisibility(Helper.isNullOrEmpty(thumbnailUrl) ? View.VISIBLE : View.GONE);
|
vh.noThumbnailView.setVisibility(Helper.isNullOrEmpty(thumbnailUrl) ? View.VISIBLE : View.GONE);
|
||||||
Helper.setIconViewBackgroundColor(vh.noThumbnailView, bgColor, false, context);
|
Helper.setIconViewBackgroundColor(vh.noThumbnailView, bgColor, false, context);
|
||||||
|
|
||||||
|
Helper.setViewVisibility(vh.loadingImagePlaceholder, item.isLoadingPlaceholder() ? View.VISIBLE : View.GONE);
|
||||||
|
Helper.setViewVisibility(vh.loadingTextPlaceholder1, item.isLoadingPlaceholder() ? View.VISIBLE : View.GONE);
|
||||||
|
Helper.setViewVisibility(vh.loadingTextPlaceholder2, item.isLoadingPlaceholder() ? View.VISIBLE : View.GONE);
|
||||||
|
Helper.setViewVisibility(vh.titleView, !item.isLoadingPlaceholder() ? View.VISIBLE : View.GONE);
|
||||||
|
Helper.setViewVisibility(vh.publisherView, !item.isLoadingPlaceholder() ? View.VISIBLE : View.GONE);
|
||||||
|
Helper.setViewVisibility(vh.publishTimeView, !item.isLoadingPlaceholder() && !isPending ? View.VISIBLE : View.GONE);
|
||||||
|
|
||||||
if (type == VIEW_TYPE_FEATURED && item.isUnresolved()) {
|
if (type == VIEW_TYPE_FEATURED && item.isUnresolved()) {
|
||||||
vh.durationView.setVisibility(View.GONE);
|
vh.durationView.setVisibility(View.GONE);
|
||||||
vh.titleView.setText("Nothing here. Publish something!");
|
vh.titleView.setText("Nothing here. Publish something!");
|
||||||
|
|
|
@ -27,9 +27,9 @@ import io.lbry.browser.utils.LbryUri;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
|
|
||||||
public class CommentListAdapter extends RecyclerView.Adapter<CommentListAdapter.ViewHolder> {
|
public class CommentListAdapter extends RecyclerView.Adapter<CommentListAdapter.ViewHolder> {
|
||||||
private List<Comment> items;
|
private final List<Comment> items;
|
||||||
private Context context;
|
private final Context context;
|
||||||
private boolean nested;
|
private final boolean nested;
|
||||||
private float scale;
|
private float scale;
|
||||||
@Setter
|
@Setter
|
||||||
private ClaimListAdapter.ClaimListItemListener listener;
|
private ClaimListAdapter.ClaimListItemListener listener;
|
||||||
|
@ -61,6 +61,16 @@ public class CommentListAdapter extends RecyclerView.Adapter<CommentListAdapter.
|
||||||
notifyDataSetChanged();
|
notifyDataSetChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public int getPositionForComment(String commentHash) {
|
||||||
|
for (int i = 0; i < items.size(); i++) {
|
||||||
|
if (commentHash.equalsIgnoreCase(items.get(i).getId())) {
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getItemCount() {
|
public int getItemCount() {
|
||||||
return items != null ? items.size() : 0;
|
return items != null ? items.size() : 0;
|
||||||
|
@ -92,14 +102,14 @@ public class CommentListAdapter extends RecyclerView.Adapter<CommentListAdapter.
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class ViewHolder extends RecyclerView.ViewHolder {
|
public static class ViewHolder extends RecyclerView.ViewHolder {
|
||||||
protected TextView channelName;
|
protected final TextView channelName;
|
||||||
protected TextView commentText;
|
protected final TextView commentText;
|
||||||
protected ImageView thumbnailView;
|
protected final ImageView thumbnailView;
|
||||||
protected View noThumbnailView;
|
protected final View noThumbnailView;
|
||||||
protected TextView alphaView;
|
protected final TextView alphaView;
|
||||||
protected TextView commentTimeView;
|
protected final TextView commentTimeView;
|
||||||
protected View replyLink;
|
protected final View replyLink;
|
||||||
protected RecyclerView repliesList;
|
protected final RecyclerView repliesList;
|
||||||
|
|
||||||
public ViewHolder (View v) {
|
public ViewHolder (View v) {
|
||||||
super(v);
|
super(v);
|
||||||
|
@ -163,9 +173,9 @@ public class CommentListAdapter extends RecyclerView.Adapter<CommentListAdapter.
|
||||||
public void onBindViewHolder(ViewHolder holder, int position) {
|
public void onBindViewHolder(ViewHolder holder, int position) {
|
||||||
Comment comment = items.get(position);
|
Comment comment = items.get(position);
|
||||||
holder.itemView.setPadding(
|
holder.itemView.setPadding(
|
||||||
nested ? Helper.getScaledValue(56, scale) : holder.itemView.getPaddingLeft(),
|
nested ? Helper.getScaledValue(56, scale) : holder.itemView.getPaddingStart(),
|
||||||
holder.itemView.getPaddingTop(),
|
holder.itemView.getPaddingTop(),
|
||||||
nested ? 0 : holder.itemView.getPaddingRight(),
|
nested ? 0 : holder.itemView.getPaddingEnd(),
|
||||||
holder.itemView.getPaddingBottom());
|
holder.itemView.getPaddingBottom());
|
||||||
|
|
||||||
holder.channelName.setText(comment.getChannelName());
|
holder.channelName.setText(comment.getChannelName());
|
||||||
|
@ -180,7 +190,7 @@ public class CommentListAdapter extends RecyclerView.Adapter<CommentListAdapter.
|
||||||
int bgColor = Helper.generateRandomColorForValue(comment.getChannelId());
|
int bgColor = Helper.generateRandomColorForValue(comment.getChannelId());
|
||||||
Helper.setIconViewBackgroundColor(holder.noThumbnailView, bgColor, false, context);
|
Helper.setIconViewBackgroundColor(holder.noThumbnailView, bgColor, false, context);
|
||||||
if (hasThumbnail) {
|
if (hasThumbnail) {
|
||||||
Glide.with(context.getApplicationContext()).asBitmap().load(comment.getPoster().getThumbnailUrl()).
|
Glide.with(context.getApplicationContext()).asBitmap().load(comment.getPoster().getThumbnailUrl(holder.thumbnailView.getLayoutParams().width, holder.thumbnailView.getLayoutParams().height, 85)).
|
||||||
apply(RequestOptions.circleCropTransform()).into(holder.thumbnailView);
|
apply(RequestOptions.circleCropTransform()).into(holder.thumbnailView);
|
||||||
}
|
}
|
||||||
holder.alphaView.setText(comment.getChannelName() != null ? comment.getChannelName().substring(1, 2).toUpperCase() : null);
|
holder.alphaView.setText(comment.getChannelName() != null ? comment.getChannelName().substring(1, 2).toUpperCase() : null);
|
||||||
|
|
|
@ -23,8 +23,8 @@ public class EditorsChoiceItemAdapter extends RecyclerView.Adapter<EditorsChoice
|
||||||
private static final int VIEW_TYPE_HEADER = 1;
|
private static final int VIEW_TYPE_HEADER = 1;
|
||||||
private static final int VIEW_TYPE_CONTENT = 2;
|
private static final int VIEW_TYPE_CONTENT = 2;
|
||||||
|
|
||||||
private Context context;
|
private final Context context;
|
||||||
private List<EditorsChoiceItem> items;
|
private final List<EditorsChoiceItem> items;
|
||||||
@Setter
|
@Setter
|
||||||
private EditorsChoiceItemListener listener;
|
private EditorsChoiceItemListener listener;
|
||||||
|
|
||||||
|
@ -48,11 +48,11 @@ public class EditorsChoiceItemAdapter extends RecyclerView.Adapter<EditorsChoice
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class ViewHolder extends RecyclerView.ViewHolder {
|
public static class ViewHolder extends RecyclerView.ViewHolder {
|
||||||
protected ImageView thumbnailView;
|
protected final ImageView thumbnailView;
|
||||||
protected TextView descriptionView;
|
protected final TextView descriptionView;
|
||||||
protected TextView headerView;
|
protected final TextView headerView;
|
||||||
protected TextView titleView;
|
protected final TextView titleView;
|
||||||
protected View cardView;
|
protected final View cardView;
|
||||||
|
|
||||||
public ViewHolder(View v) {
|
public ViewHolder(View v) {
|
||||||
super(v);
|
super(v);
|
||||||
|
|
|
@ -21,8 +21,8 @@ import io.lbry.browser.utils.Helper;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
|
|
||||||
public class GalleryGridAdapter extends RecyclerView.Adapter<GalleryGridAdapter.ViewHolder> {
|
public class GalleryGridAdapter extends RecyclerView.Adapter<GalleryGridAdapter.ViewHolder> {
|
||||||
private Context context;
|
private final Context context;
|
||||||
private List<GalleryItem> items;
|
private final List<GalleryItem> items;
|
||||||
@Setter
|
@Setter
|
||||||
private GalleryItemClickListener listener;
|
private GalleryItemClickListener listener;
|
||||||
|
|
||||||
|
@ -32,8 +32,8 @@ public class GalleryGridAdapter extends RecyclerView.Adapter<GalleryGridAdapter.
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class ViewHolder extends RecyclerView.ViewHolder {
|
public static class ViewHolder extends RecyclerView.ViewHolder {
|
||||||
protected ImageView thumbnailView;
|
protected final ImageView thumbnailView;
|
||||||
protected TextView durationView;
|
protected final TextView durationView;
|
||||||
public ViewHolder(View v) {
|
public ViewHolder(View v) {
|
||||||
super(v);
|
super(v);
|
||||||
thumbnailView = v.findViewById(R.id.gallery_item_thumbnail);
|
thumbnailView = v.findViewById(R.id.gallery_item_thumbnail);
|
||||||
|
@ -96,8 +96,8 @@ public class GalleryGridAdapter extends RecyclerView.Adapter<GalleryGridAdapter.
|
||||||
|
|
||||||
public static class GalleryGridItemDecoration extends RecyclerView.ItemDecoration {
|
public static class GalleryGridItemDecoration extends RecyclerView.ItemDecoration {
|
||||||
|
|
||||||
private int spanCount;
|
private final int spanCount;
|
||||||
private int spacing;
|
private final int spacing;
|
||||||
|
|
||||||
public GalleryGridItemDecoration(int spanCount, int spacing) {
|
public GalleryGridItemDecoration(int spanCount, int spacing) {
|
||||||
this.spanCount = spanCount;
|
this.spanCount = spanCount;
|
||||||
|
|
|
@ -1,12 +1,10 @@
|
||||||
package io.lbry.browser.adapter;
|
package io.lbry.browser.adapter;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.database.DataSetObserver;
|
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.ArrayAdapter;
|
import android.widget.ArrayAdapter;
|
||||||
import android.widget.SpinnerAdapter;
|
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
@ -18,9 +16,9 @@ import io.lbry.browser.model.Claim;
|
||||||
|
|
||||||
public class InlineChannelSpinnerAdapter extends ArrayAdapter<Claim> {
|
public class InlineChannelSpinnerAdapter extends ArrayAdapter<Claim> {
|
||||||
|
|
||||||
private List<Claim> channels;
|
private final List<Claim> channels;
|
||||||
private int layoutResourceId;
|
private final int layoutResourceId;
|
||||||
private LayoutInflater inflater;
|
private final LayoutInflater inflater;
|
||||||
|
|
||||||
public InlineChannelSpinnerAdapter(Context context, int resource, List<Claim> channels) {
|
public InlineChannelSpinnerAdapter(Context context, int resource, List<Claim> channels) {
|
||||||
super(context, resource, 0, channels);
|
super(context, resource, 0, channels);
|
||||||
|
|
|
@ -1,9 +1,7 @@
|
||||||
package io.lbry.browser.adapter;
|
package io.lbry.browser.adapter;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
|
||||||
import android.graphics.Typeface;
|
import android.graphics.Typeface;
|
||||||
import android.net.Uri;
|
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
|
@ -11,21 +9,16 @@ import android.widget.TextView;
|
||||||
|
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
|
||||||
import java.text.DecimalFormat;
|
|
||||||
import java.text.SimpleDateFormat;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import io.lbry.browser.R;
|
import io.lbry.browser.R;
|
||||||
import io.lbry.browser.model.lbryinc.Invitee;
|
import io.lbry.browser.model.lbryinc.Invitee;
|
||||||
import io.lbry.browser.utils.Helper;
|
|
||||||
import io.lbry.browser.utils.LbryUri;
|
|
||||||
import lombok.Setter;
|
|
||||||
|
|
||||||
public class InviteeListAdapter extends RecyclerView.Adapter<InviteeListAdapter.ViewHolder> {
|
public class InviteeListAdapter extends RecyclerView.Adapter<InviteeListAdapter.ViewHolder> {
|
||||||
|
|
||||||
private Context context;
|
private final Context context;
|
||||||
private List<Invitee> items;
|
private final List<Invitee> items;
|
||||||
|
|
||||||
public InviteeListAdapter(List<Invitee> invitees, Context context) {
|
public InviteeListAdapter(List<Invitee> invitees, Context context) {
|
||||||
this.context = context;
|
this.context = context;
|
||||||
|
@ -80,8 +73,8 @@ public class InviteeListAdapter extends RecyclerView.Adapter<InviteeListAdapter.
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class ViewHolder extends RecyclerView.ViewHolder {
|
public static class ViewHolder extends RecyclerView.ViewHolder {
|
||||||
protected TextView emailView;
|
protected final TextView emailView;
|
||||||
protected TextView rewardView;
|
protected final TextView rewardView;
|
||||||
|
|
||||||
public ViewHolder(View v) {
|
public ViewHolder(View v) {
|
||||||
super(v);
|
super(v);
|
||||||
|
|
|
@ -10,13 +10,12 @@ import android.widget.TextView;
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
|
|
||||||
import io.lbry.browser.R;
|
import io.lbry.browser.R;
|
||||||
import io.lbry.browser.model.Claim;
|
|
||||||
import io.lbry.browser.model.Language;
|
import io.lbry.browser.model.Language;
|
||||||
import io.lbry.browser.utils.Predefined;
|
import io.lbry.browser.utils.Predefined;
|
||||||
|
|
||||||
public class LanguageSpinnerAdapter extends ArrayAdapter<Language> {
|
public class LanguageSpinnerAdapter extends ArrayAdapter<Language> {
|
||||||
private int layoutResourceId;
|
private final int layoutResourceId;
|
||||||
private LayoutInflater inflater;
|
private final LayoutInflater inflater;
|
||||||
|
|
||||||
public LanguageSpinnerAdapter(Context context, int resource) {
|
public LanguageSpinnerAdapter(Context context, int resource) {
|
||||||
super(context, resource, 0, Predefined.PUBLISH_LANGUAGES);
|
super(context, resource, 0, Predefined.PUBLISH_LANGUAGES);
|
||||||
|
|
|
@ -10,13 +10,12 @@ import android.widget.TextView;
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
|
|
||||||
import io.lbry.browser.R;
|
import io.lbry.browser.R;
|
||||||
import io.lbry.browser.model.Language;
|
|
||||||
import io.lbry.browser.model.License;
|
import io.lbry.browser.model.License;
|
||||||
import io.lbry.browser.utils.Predefined;
|
import io.lbry.browser.utils.Predefined;
|
||||||
|
|
||||||
public class LicenseSpinnerAdapter extends ArrayAdapter<License> {
|
public class LicenseSpinnerAdapter extends ArrayAdapter<License> {
|
||||||
private int layoutResourceId;
|
private final int layoutResourceId;
|
||||||
private LayoutInflater inflater;
|
private final LayoutInflater inflater;
|
||||||
|
|
||||||
public LicenseSpinnerAdapter(Context context, int resource) {
|
public LicenseSpinnerAdapter(Context context, int resource) {
|
||||||
super(context, resource, 0, Predefined.LICENSES);
|
super(context, resource, 0, Predefined.LICENSES);
|
||||||
|
|
|
@ -2,10 +2,8 @@ package io.lbry.browser.adapter;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.MenuItem;
|
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.ImageView;
|
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
@ -17,15 +15,14 @@ import io.lbry.browser.R;
|
||||||
import io.lbry.browser.model.NavMenuItem;
|
import io.lbry.browser.model.NavMenuItem;
|
||||||
import io.lbry.browser.ui.controls.SolidIconView;
|
import io.lbry.browser.ui.controls.SolidIconView;
|
||||||
import io.lbry.browser.utils.Helper;
|
import io.lbry.browser.utils.Helper;
|
||||||
import lombok.Getter;
|
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
|
|
||||||
public class NavigationMenuAdapter extends RecyclerView.Adapter<NavigationMenuAdapter.ViewHolder> {
|
public class NavigationMenuAdapter extends RecyclerView.Adapter<NavigationMenuAdapter.ViewHolder> {
|
||||||
private static final int TYPE_GROUP = 1;
|
private static final int TYPE_GROUP = 1;
|
||||||
private static final int TYPE_ITEM = 2;
|
private static final int TYPE_ITEM = 2;
|
||||||
|
|
||||||
private Context context;
|
private final Context context;
|
||||||
private List<NavMenuItem> menuItems;
|
private final List<NavMenuItem> menuItems;
|
||||||
private NavMenuItem currentItem;
|
private NavMenuItem currentItem;
|
||||||
@Setter
|
@Setter
|
||||||
private NavigationMenuItemClickListener listener;
|
private NavigationMenuItemClickListener listener;
|
||||||
|
@ -65,8 +62,8 @@ public class NavigationMenuAdapter extends RecyclerView.Adapter<NavigationMenuAd
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class ViewHolder extends RecyclerView.ViewHolder {
|
public static class ViewHolder extends RecyclerView.ViewHolder {
|
||||||
protected SolidIconView iconView;
|
protected final SolidIconView iconView;
|
||||||
protected TextView titleView;
|
protected final TextView titleView;
|
||||||
public ViewHolder(View v) {
|
public ViewHolder(View v) {
|
||||||
super(v);
|
super(v);
|
||||||
titleView = v.findViewById(R.id.nav_menu_title);
|
titleView = v.findViewById(R.id.nav_menu_title);
|
||||||
|
|
|
@ -0,0 +1,265 @@
|
||||||
|
package io.lbry.browser.adapter;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.graphics.Color;
|
||||||
|
import android.text.format.DateUtils;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.ImageView;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import androidx.core.content.ContextCompat;
|
||||||
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
|
||||||
|
import com.bumptech.glide.Glide;
|
||||||
|
import com.bumptech.glide.request.RequestOptions;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Calendar;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.GregorianCalendar;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.TimeZone;
|
||||||
|
|
||||||
|
import io.lbry.browser.R;
|
||||||
|
import io.lbry.browser.listener.SelectionModeListener;
|
||||||
|
import io.lbry.browser.model.Claim;
|
||||||
|
import io.lbry.browser.model.lbryinc.LbryNotification;
|
||||||
|
import io.lbry.browser.ui.controls.SolidIconView;
|
||||||
|
import io.lbry.browser.utils.Helper;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = false)
|
||||||
|
public class NotificationListAdapter extends RecyclerView.Adapter<NotificationListAdapter.ViewHolder> {
|
||||||
|
|
||||||
|
private static final String RULE_CREATOR_SUBSCRIBER = "creator_subscriber";
|
||||||
|
private static final String RULE_COMMENT = "comment";
|
||||||
|
|
||||||
|
private final Context context;
|
||||||
|
private final List<LbryNotification> items;
|
||||||
|
private final List<LbryNotification> selectedItems;
|
||||||
|
@Setter
|
||||||
|
private NotificationClickListener clickListener;
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
private boolean inSelectionMode;
|
||||||
|
@Setter
|
||||||
|
private SelectionModeListener selectionModeListener;
|
||||||
|
|
||||||
|
public NotificationListAdapter(List<LbryNotification> notifications, Context context) {
|
||||||
|
this.context = context;
|
||||||
|
this.items = new ArrayList<>(notifications);
|
||||||
|
this.selectedItems = new ArrayList<>();
|
||||||
|
Collections.sort(items, Collections.reverseOrder(new LbryNotification()));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class ViewHolder extends RecyclerView.ViewHolder {
|
||||||
|
protected final View layoutView;
|
||||||
|
protected final TextView titleView;
|
||||||
|
protected final TextView bodyView;
|
||||||
|
protected final TextView timeView;
|
||||||
|
protected final SolidIconView iconView;
|
||||||
|
protected final ImageView thumbnailView;
|
||||||
|
protected final View selectedOverlayView;
|
||||||
|
public ViewHolder(View v) {
|
||||||
|
super(v);
|
||||||
|
layoutView = v.findViewById(R.id.notification_layout);
|
||||||
|
titleView = v.findViewById(R.id.notification_title);
|
||||||
|
bodyView = v.findViewById(R.id.notification_body);
|
||||||
|
timeView = v.findViewById(R.id.notification_time);
|
||||||
|
iconView = v.findViewById(R.id.notification_icon);
|
||||||
|
thumbnailView = v.findViewById(R.id.notification_author_thumbnail);
|
||||||
|
selectedOverlayView = v.findViewById(R.id.notification_selected_overlay);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getItemCount() {
|
||||||
|
return items != null ? items.size() : 0;
|
||||||
|
}
|
||||||
|
public List<LbryNotification> getSelectedItems() {
|
||||||
|
return this.selectedItems;
|
||||||
|
}
|
||||||
|
public int getSelectedCount() {
|
||||||
|
return selectedItems != null ? selectedItems.size() : 0;
|
||||||
|
}
|
||||||
|
public void clearSelectedItems() {
|
||||||
|
this.selectedItems.clear();
|
||||||
|
}
|
||||||
|
public boolean isNotificationSelected(LbryNotification notification) {
|
||||||
|
return selectedItems.contains(notification);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void insertNotification(LbryNotification notification, int index) {
|
||||||
|
if (!items.contains(notification)) {
|
||||||
|
items.add(index, notification);
|
||||||
|
}
|
||||||
|
notifyDataSetChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addNotification(LbryNotification notification) {
|
||||||
|
if (!items.contains(notification)) {
|
||||||
|
items.add(notification);
|
||||||
|
}
|
||||||
|
notifyDataSetChanged();
|
||||||
|
}
|
||||||
|
public void removeNotifications(List<LbryNotification> notifications) {
|
||||||
|
for (LbryNotification notification : notifications) {
|
||||||
|
items.remove(notification);
|
||||||
|
}
|
||||||
|
notifyDataSetChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<String> getAuthorUrls() {
|
||||||
|
List<String> urls = new ArrayList<>();
|
||||||
|
for (LbryNotification item : items) {
|
||||||
|
if (!Helper.isNullOrEmpty(item.getAuthorUrl())) {
|
||||||
|
urls.add(item.getAuthorUrl());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return urls;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateAuthorClaims(List<Claim> claims) {
|
||||||
|
for (Claim claim : claims) {
|
||||||
|
if (claim != null && claim.getThumbnailUrl() != null) {
|
||||||
|
updateClaimForAuthorUrl(claim);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
notifyDataSetChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateClaimForAuthorUrl(Claim claim) {
|
||||||
|
for (LbryNotification item : items) {
|
||||||
|
if (claim.getPermanentUrl().equalsIgnoreCase(item.getAuthorUrl())) {
|
||||||
|
item.setCommentAuthor(claim);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addNotifications(List<LbryNotification> notifications) {
|
||||||
|
for (LbryNotification notification : notifications) {
|
||||||
|
if (!items.contains(notification)) {
|
||||||
|
items.add(notification);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Collections.sort(items, Collections.reverseOrder(new LbryNotification()));
|
||||||
|
notifyDataSetChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public NotificationListAdapter.ViewHolder onCreateViewHolder(ViewGroup root, int viewType) {
|
||||||
|
View v = LayoutInflater.from(context).inflate(R.layout.list_item_notification, root, false);
|
||||||
|
return new NotificationListAdapter.ViewHolder(v);
|
||||||
|
}
|
||||||
|
|
||||||
|
private int getStringIdForRule(String rule) {
|
||||||
|
if (RULE_CREATOR_SUBSCRIBER.equalsIgnoreCase(rule)) {
|
||||||
|
return R.string.fa_heart;
|
||||||
|
}
|
||||||
|
if (RULE_COMMENT.equalsIgnoreCase(rule)) {
|
||||||
|
return R.string.fa_comment_alt;
|
||||||
|
}
|
||||||
|
return R.string.fa_asterisk;
|
||||||
|
}
|
||||||
|
|
||||||
|
private int getColorForRule(String rule) {
|
||||||
|
if (RULE_CREATOR_SUBSCRIBER.equalsIgnoreCase(rule)) {
|
||||||
|
return Color.RED;
|
||||||
|
}
|
||||||
|
if (RULE_COMMENT.equalsIgnoreCase(rule)) {
|
||||||
|
return ContextCompat.getColor(context, R.color.nextLbryGreen);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ContextCompat.getColor(context, R.color.lbryGreen);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onBindViewHolder(NotificationListAdapter.ViewHolder vh, int position) {
|
||||||
|
LbryNotification notification = items.get(position);
|
||||||
|
vh.layoutView.setBackgroundColor(ContextCompat.getColor(context, notification.isSeen() ? android.R.color.transparent : R.color.nextLbryGreenSemiTransparent));
|
||||||
|
vh.selectedOverlayView.setVisibility(isNotificationSelected(notification) ? View.VISIBLE : View.GONE);
|
||||||
|
|
||||||
|
vh.titleView.setVisibility(!Helper.isNullOrEmpty(notification.getTitle()) ? View.VISIBLE : View.GONE);
|
||||||
|
vh.titleView.setText(notification.getTitle());
|
||||||
|
vh.bodyView.setText(notification.getDescription());
|
||||||
|
vh.timeView.setText(DateUtils.getRelativeTimeSpanString(
|
||||||
|
getLocalNotificationTime(notification), System.currentTimeMillis(), 0, DateUtils.FORMAT_ABBREV_RELATIVE));
|
||||||
|
|
||||||
|
vh.thumbnailView.setVisibility(notification.getCommentAuthor() == null ? View.INVISIBLE : View.VISIBLE);
|
||||||
|
if (notification.getCommentAuthor() != null) {
|
||||||
|
Glide.with(context.getApplicationContext()).load(
|
||||||
|
notification.getCommentAuthor().getThumbnailUrl(vh.thumbnailView.getLayoutParams().width, vh.thumbnailView.getLayoutParams().height, 85)).apply(RequestOptions.circleCropTransform()).into(vh.thumbnailView);
|
||||||
|
}
|
||||||
|
|
||||||
|
vh.iconView.setVisibility(notification.getCommentAuthor() != null ? View.INVISIBLE : View.VISIBLE);
|
||||||
|
vh.iconView.setText(getStringIdForRule(notification.getRule()));
|
||||||
|
vh.iconView.setTextColor(getColorForRule(notification.getRule()));
|
||||||
|
|
||||||
|
vh.itemView.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View view) {
|
||||||
|
if (inSelectionMode) {
|
||||||
|
toggleSelectedNotification(notification);
|
||||||
|
} else {
|
||||||
|
if (clickListener != null) {
|
||||||
|
clickListener.onNotificationClicked(notification);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
vh.itemView.setOnLongClickListener(new View.OnLongClickListener() {
|
||||||
|
@Override
|
||||||
|
public boolean onLongClick(View view) {
|
||||||
|
if (!inSelectionMode) {
|
||||||
|
inSelectionMode = true;
|
||||||
|
if (selectionModeListener != null) {
|
||||||
|
selectionModeListener.onEnterSelectionMode();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
toggleSelectedNotification(notification);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void toggleSelectedNotification(LbryNotification notification) {
|
||||||
|
if (selectedItems.contains(notification)) {
|
||||||
|
selectedItems.remove(notification);
|
||||||
|
} else {
|
||||||
|
selectedItems.add(notification);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (selectionModeListener != null) {
|
||||||
|
selectionModeListener.onItemSelectionToggled();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (selectedItems.size() == 0) {
|
||||||
|
inSelectionMode = false;
|
||||||
|
if (selectionModeListener != null) {
|
||||||
|
selectionModeListener.onExitSelectionMode();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
notifyDataSetChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
private long getLocalNotificationTime(LbryNotification notification) {
|
||||||
|
TimeZone utcTZ = TimeZone.getTimeZone("UTC");
|
||||||
|
TimeZone targetTZ = TimeZone.getDefault();
|
||||||
|
Calendar cal = new GregorianCalendar(utcTZ);
|
||||||
|
cal.setTimeInMillis(notification.getTimestamp().getTime());
|
||||||
|
|
||||||
|
cal.add(Calendar.MILLISECOND, utcTZ.getRawOffset() * -1);
|
||||||
|
cal.add(Calendar.MILLISECOND, targetTZ.getRawOffset());
|
||||||
|
return cal.getTimeInMillis();
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface NotificationClickListener {
|
||||||
|
void onNotificationClicked(LbryNotification notification);
|
||||||
|
}
|
||||||
|
}
|
|
@ -32,7 +32,7 @@ public class RewardListAdapter extends RecyclerView.Adapter<RewardListAdapter.Vi
|
||||||
public static final int DISPLAY_MODE_ALL = 1;
|
public static final int DISPLAY_MODE_ALL = 1;
|
||||||
public static final int DISPLAY_MODE_UNCLAIMED = 2;
|
public static final int DISPLAY_MODE_UNCLAIMED = 2;
|
||||||
|
|
||||||
private Context context;
|
private final Context context;
|
||||||
@Setter
|
@Setter
|
||||||
private List<Reward> all;
|
private List<Reward> all;
|
||||||
private List<Reward> items;
|
private List<Reward> items;
|
||||||
|
@ -85,16 +85,16 @@ public class RewardListAdapter extends RecyclerView.Adapter<RewardListAdapter.Vi
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class ViewHolder extends RecyclerView.ViewHolder {
|
public static class ViewHolder extends RecyclerView.ViewHolder {
|
||||||
protected View iconClaimed;
|
protected final View iconClaimed;
|
||||||
protected View loading;
|
protected final View loading;
|
||||||
protected View upTo;
|
protected final View upTo;
|
||||||
protected TextView textTitle;
|
protected final TextView textTitle;
|
||||||
protected TextView textDescription;
|
protected final TextView textDescription;
|
||||||
protected TextView textLbcValue;
|
protected final TextView textLbcValue;
|
||||||
protected TextView textUsdValue;
|
protected final TextView textUsdValue;
|
||||||
protected TextView textLinkTransaction;
|
protected final TextView textLinkTransaction;
|
||||||
protected EditText inputCustomCode;
|
protected final EditText inputCustomCode;
|
||||||
protected MaterialButton buttonClaimCustom;
|
protected final MaterialButton buttonClaimCustom;
|
||||||
public ViewHolder(View v) {
|
public ViewHolder(View v) {
|
||||||
super(v);
|
super(v);
|
||||||
iconClaimed = v.findViewById(R.id.reward_item_claimed_icon);
|
iconClaimed = v.findViewById(R.id.reward_item_claimed_icon);
|
||||||
|
|
|
@ -0,0 +1,70 @@
|
||||||
|
package io.lbry.browser.adapter;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.graphics.Color;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.BaseAdapter;
|
||||||
|
import android.widget.ImageView;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import io.lbry.browser.R;
|
||||||
|
import io.lbry.browser.model.StartupStage;
|
||||||
|
|
||||||
|
public class StartupStageAdapter extends BaseAdapter {
|
||||||
|
private final List<StartupStage> list;
|
||||||
|
private final LayoutInflater inflater;
|
||||||
|
private final String[] stagesString;
|
||||||
|
|
||||||
|
public StartupStageAdapter(Context ctx, List<StartupStage> rows) {
|
||||||
|
this.list = rows;
|
||||||
|
this.inflater = LayoutInflater.from(ctx);
|
||||||
|
|
||||||
|
stagesString = new String[9];
|
||||||
|
|
||||||
|
stagesString[0] = ctx.getResources().getString(R.string.installation_id_loaded);
|
||||||
|
stagesString[1] = ctx.getResources().getString(R.string.known_tags_loaded);
|
||||||
|
stagesString[2] = ctx.getResources().getString(R.string.exchange_rate_loaded);
|
||||||
|
stagesString[3] = ctx.getResources().getString(R.string.user_authenticated);
|
||||||
|
stagesString[4] = ctx.getResources().getString(R.string.installation_registered);
|
||||||
|
stagesString[5] = ctx.getResources().getString(R.string.subscriptions_loaded);
|
||||||
|
stagesString[6] = ctx.getResources().getString(R.string.subscriptions_resolved);
|
||||||
|
stagesString[7] = ctx.getResources().getString(R.string.block_list_loaded);
|
||||||
|
stagesString[8] = ctx.getResources().getString(R.string.filter_list_loaded);
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public int getCount() {
|
||||||
|
return list.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object getItem(int i) {
|
||||||
|
return list.get(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long getItemId(int i) {
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public View getView(int i, View view, ViewGroup viewGroup) {
|
||||||
|
if (view == null) {
|
||||||
|
view = inflater.inflate(R.layout.list_item_startupstage, viewGroup, false);
|
||||||
|
|
||||||
|
ImageView iconView = view.findViewById(R.id.startup_stage_icon);
|
||||||
|
TextView textView = view.findViewById(R.id.startup_stage_text);
|
||||||
|
|
||||||
|
StartupStage item = (StartupStage) getItem(i);
|
||||||
|
|
||||||
|
iconView.setImageResource(item.stageDone ? R.drawable.ic_check : R.drawable.ic_close);
|
||||||
|
iconView.setColorFilter(item.stageDone ? Color.WHITE : Color.RED);
|
||||||
|
|
||||||
|
textView.setText(stagesString[item.stage - 1]);
|
||||||
|
}
|
||||||
|
return view;
|
||||||
|
}
|
||||||
|
}
|
|
@ -22,9 +22,9 @@ import io.lbry.browser.utils.Helper;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
|
|
||||||
public class SuggestedChannelGridAdapter extends RecyclerView.Adapter<SuggestedChannelGridAdapter.ViewHolder> {
|
public class SuggestedChannelGridAdapter extends RecyclerView.Adapter<SuggestedChannelGridAdapter.ViewHolder> {
|
||||||
private Context context;
|
private final Context context;
|
||||||
private List<Claim> items;
|
private final List<Claim> items;
|
||||||
private List<Claim> selectedItems;
|
private final List<Claim> selectedItems;
|
||||||
@Setter
|
@Setter
|
||||||
private ChannelItemSelectionListener listener;
|
private ChannelItemSelectionListener listener;
|
||||||
|
|
||||||
|
@ -35,11 +35,11 @@ public class SuggestedChannelGridAdapter extends RecyclerView.Adapter<SuggestedC
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class ViewHolder extends RecyclerView.ViewHolder {
|
public static class ViewHolder extends RecyclerView.ViewHolder {
|
||||||
protected View noThumbnailView;
|
protected final View noThumbnailView;
|
||||||
protected ImageView thumbnailView;
|
protected final ImageView thumbnailView;
|
||||||
protected TextView alphaView;
|
protected final TextView alphaView;
|
||||||
protected TextView titleView;
|
protected final TextView titleView;
|
||||||
protected TextView tagView;
|
protected final TextView tagView;
|
||||||
public ViewHolder(View v) {
|
public ViewHolder(View v) {
|
||||||
super(v);
|
super(v);
|
||||||
noThumbnailView = v.findViewById(R.id.suggested_channel_no_thumbnail);
|
noThumbnailView = v.findViewById(R.id.suggested_channel_no_thumbnail);
|
||||||
|
@ -89,7 +89,8 @@ public class SuggestedChannelGridAdapter extends RecyclerView.Adapter<SuggestedC
|
||||||
@Override
|
@Override
|
||||||
public void onBindViewHolder(SuggestedChannelGridAdapter.ViewHolder vh, int position) {
|
public void onBindViewHolder(SuggestedChannelGridAdapter.ViewHolder vh, int position) {
|
||||||
Claim claim = items.get(position);
|
Claim claim = items.get(position);
|
||||||
String thumbnailUrl = claim.getThumbnailUrl();
|
ViewGroup.LayoutParams lp = vh.thumbnailView.getLayoutParams();
|
||||||
|
String thumbnailUrl = claim.getThumbnailUrl(lp.width, lp.height, 85);
|
||||||
|
|
||||||
int bgColor = Helper.generateRandomColorForValue(claim.getClaimId());
|
int bgColor = Helper.generateRandomColorForValue(claim.getClaimId());
|
||||||
Helper.setIconViewBackgroundColor(vh.noThumbnailView, bgColor, false, context);
|
Helper.setIconViewBackgroundColor(vh.noThumbnailView, bgColor, false, context);
|
||||||
|
|
|
@ -23,12 +23,13 @@ public class TagListAdapter extends RecyclerView.Adapter<TagListAdapter.ViewHold
|
||||||
public static final int CUSTOMIZE_MODE_ADD = 1;
|
public static final int CUSTOMIZE_MODE_ADD = 1;
|
||||||
public static final int CUSTOMIZE_MODE_REMOVE = 2;
|
public static final int CUSTOMIZE_MODE_REMOVE = 2;
|
||||||
|
|
||||||
private Context context;
|
private final Context context;
|
||||||
private List<Tag> items;
|
private List<Tag> items;
|
||||||
@Setter
|
@Setter
|
||||||
private TagClickListener clickListener;
|
private TagClickListener clickListener;
|
||||||
@Getter
|
|
||||||
@Setter
|
@Setter
|
||||||
|
@Getter
|
||||||
private int customizeMode;
|
private int customizeMode;
|
||||||
|
|
||||||
public TagListAdapter(List<Tag> tags, Context context) {
|
public TagListAdapter(List<Tag> tags, Context context) {
|
||||||
|
@ -38,8 +39,8 @@ public class TagListAdapter extends RecyclerView.Adapter<TagListAdapter.ViewHold
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class ViewHolder extends RecyclerView.ViewHolder {
|
public static class ViewHolder extends RecyclerView.ViewHolder {
|
||||||
protected ImageView iconView;
|
protected final ImageView iconView;
|
||||||
protected TextView nameView;
|
protected final TextView nameView;
|
||||||
public ViewHolder(View v) {
|
public ViewHolder(View v) {
|
||||||
super(v);
|
super(v);
|
||||||
iconView = v.findViewById(R.id.tag_action);
|
iconView = v.findViewById(R.id.tag_action);
|
||||||
|
|
|
@ -26,8 +26,8 @@ public class TransactionListAdapter extends RecyclerView.Adapter<TransactionList
|
||||||
private static final DecimalFormat TX_LIST_AMOUNT_FORMAT = new DecimalFormat("#,##0.0000");
|
private static final DecimalFormat TX_LIST_AMOUNT_FORMAT = new DecimalFormat("#,##0.0000");
|
||||||
private static final SimpleDateFormat TX_LIST_DATE_FORMAT = new SimpleDateFormat("MMM d");
|
private static final SimpleDateFormat TX_LIST_DATE_FORMAT = new SimpleDateFormat("MMM d");
|
||||||
|
|
||||||
private Context context;
|
private final Context context;
|
||||||
private List<Transaction> items;
|
private final List<Transaction> items;
|
||||||
@Setter
|
@Setter
|
||||||
private TransactionClickListener listener;
|
private TransactionClickListener listener;
|
||||||
|
|
||||||
|
@ -107,14 +107,14 @@ public class TransactionListAdapter extends RecyclerView.Adapter<TransactionList
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class ViewHolder extends RecyclerView.ViewHolder {
|
public static class ViewHolder extends RecyclerView.ViewHolder {
|
||||||
protected TextView descView;
|
protected final TextView descView;
|
||||||
protected TextView amountView;
|
protected final TextView amountView;
|
||||||
protected TextView claimView;
|
protected final TextView claimView;
|
||||||
protected TextView feeView;
|
protected final TextView feeView;
|
||||||
protected TextView txidLinkView;
|
protected final TextView txidLinkView;
|
||||||
protected TextView dateView;
|
protected final TextView dateView;
|
||||||
protected TextView pendingView;
|
protected final TextView pendingView;
|
||||||
protected View infoFeeContainer;
|
protected final View infoFeeContainer;
|
||||||
|
|
||||||
public ViewHolder(View v) {
|
public ViewHolder(View v) {
|
||||||
super(v);
|
super(v);
|
||||||
|
|
|
@ -21,8 +21,8 @@ import io.lbry.browser.utils.LbryUri;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
|
|
||||||
public class UrlSuggestionListAdapter extends RecyclerView.Adapter<UrlSuggestionListAdapter.ViewHolder> {
|
public class UrlSuggestionListAdapter extends RecyclerView.Adapter<UrlSuggestionListAdapter.ViewHolder> {
|
||||||
private Context context;
|
private final Context context;
|
||||||
private List<UrlSuggestion> items;
|
private final List<UrlSuggestion> items;
|
||||||
@Setter
|
@Setter
|
||||||
private UrlSuggestionClickListener listener;
|
private UrlSuggestionClickListener listener;
|
||||||
|
|
||||||
|
@ -130,9 +130,9 @@ public class UrlSuggestionListAdapter extends RecyclerView.Adapter<UrlSuggestion
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class ViewHolder extends RecyclerView.ViewHolder {
|
public static class ViewHolder extends RecyclerView.ViewHolder {
|
||||||
protected SolidIconView iconView;
|
protected final SolidIconView iconView;
|
||||||
protected TextView titleView;
|
protected final TextView titleView;
|
||||||
protected TextView descView;
|
protected final TextView descView;
|
||||||
public ViewHolder(View v) {
|
public ViewHolder(View v) {
|
||||||
super(v);
|
super(v);
|
||||||
iconView = v.findViewById(R.id.url_suggestion_icon);
|
iconView = v.findViewById(R.id.url_suggestion_icon);
|
||||||
|
|
|
@ -25,7 +25,7 @@ public class VerificationPagerAdapter extends FragmentStateAdapter {
|
||||||
public static final int PAGE_VERIFICATION_WALLET = 2;
|
public static final int PAGE_VERIFICATION_WALLET = 2;
|
||||||
public static final int PAGE_VERIFICATION_MANUAL = 3;
|
public static final int PAGE_VERIFICATION_MANUAL = 3;
|
||||||
|
|
||||||
private FragmentActivity activity;
|
private final FragmentActivity activity;
|
||||||
|
|
||||||
public VerificationPagerAdapter(FragmentActivity activity) {
|
public VerificationPagerAdapter(FragmentActivity activity) {
|
||||||
super(activity);
|
super(activity);
|
||||||
|
|
|
@ -0,0 +1,100 @@
|
||||||
|
package io.lbry.browser.adapter;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.DialogInterface;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.BaseAdapter;
|
||||||
|
import android.widget.ImageButton;
|
||||||
|
import android.widget.ProgressBar;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import androidx.appcompat.app.AlertDialog;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import io.lbry.browser.MainActivity;
|
||||||
|
import io.lbry.browser.R;
|
||||||
|
import io.lbry.browser.model.WalletDetailItem;
|
||||||
|
import io.lbry.browser.utils.Helper;
|
||||||
|
import io.lbry.browser.views.CreditsBalanceView;
|
||||||
|
|
||||||
|
public class WalletDetailAdapter extends BaseAdapter {
|
||||||
|
private final List<WalletDetailItem> list;
|
||||||
|
private final LayoutInflater inflater;
|
||||||
|
|
||||||
|
public WalletDetailAdapter(Context ctx, List<WalletDetailItem> rows) {
|
||||||
|
this.list = rows;
|
||||||
|
this.inflater = LayoutInflater.from(ctx);
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public int getCount() {
|
||||||
|
return list.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object getItem(int i) {
|
||||||
|
return list.get(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long getItemId(int i) {
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public View getView(int i, View view, ViewGroup viewGroup) {
|
||||||
|
if (view == null) {
|
||||||
|
view = inflater.inflate(R.layout.list_item_boosting_balance, viewGroup, false);
|
||||||
|
|
||||||
|
CreditsBalanceView balanceView = view.findViewById(R.id.wallet_supporting_balance);
|
||||||
|
TextView detailTextView = view.findViewById(R.id.detail);
|
||||||
|
TextView detailExplanationTextView = view.findViewById(R.id.detail_explanation);
|
||||||
|
|
||||||
|
WalletDetailItem item = (WalletDetailItem) getItem(i);
|
||||||
|
|
||||||
|
detailTextView.setText(item.detail);
|
||||||
|
detailExplanationTextView.setText(item.detailDesc);
|
||||||
|
|
||||||
|
Helper.setViewText(balanceView, item.detailAmount);
|
||||||
|
|
||||||
|
ProgressBar progressUnlockTips = view.findViewById(R.id.wallet_unlock_tips_progress);
|
||||||
|
progressUnlockTips.setVisibility(item.isInProgress ? View.VISIBLE : View.GONE);
|
||||||
|
|
||||||
|
ImageButton buttonLock = view.findViewById(R.id.lock_button);
|
||||||
|
buttonLock.setVisibility((item.isUnlockable && !item.isInProgress) ? View.VISIBLE : View.GONE);
|
||||||
|
|
||||||
|
if (item.isUnlockable) {
|
||||||
|
buttonLock.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View view) {
|
||||||
|
if (view.getContext() != null) {
|
||||||
|
AlertDialog.Builder builder = new AlertDialog.Builder(view.getContext()).
|
||||||
|
setTitle(R.string.unlock_tips).
|
||||||
|
setMessage(R.string.confirm_unlock_tips)
|
||||||
|
.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(DialogInterface dialogInterface, int i) {
|
||||||
|
unlockTips(view);
|
||||||
|
}
|
||||||
|
}).setNegativeButton(R.string.no, null);
|
||||||
|
builder.show();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return view;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void unlockTips(View v) {
|
||||||
|
Context ctx = v.getContext();
|
||||||
|
if (ctx instanceof MainActivity) {
|
||||||
|
v.setVisibility(View.GONE);
|
||||||
|
View progress = v.getRootView().findViewById(R.id.wallet_unlock_tips_progress);
|
||||||
|
progress.setVisibility(View.VISIBLE);
|
||||||
|
((MainActivity) ctx).unlockTips();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -4,7 +4,6 @@ import android.content.Context;
|
||||||
import android.database.Cursor;
|
import android.database.Cursor;
|
||||||
import android.database.sqlite.SQLiteDatabase;
|
import android.database.sqlite.SQLiteDatabase;
|
||||||
import android.database.sqlite.SQLiteOpenHelper;
|
import android.database.sqlite.SQLiteOpenHelper;
|
||||||
import android.opengl.Visibility;
|
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.text.ParseException;
|
import java.text.ParseException;
|
||||||
|
@ -13,22 +12,22 @@ import java.util.ArrayList;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import io.lbry.browser.exceptions.LbryUriException;
|
|
||||||
import io.lbry.browser.model.Tag;
|
import io.lbry.browser.model.Tag;
|
||||||
import io.lbry.browser.model.UrlSuggestion;
|
import io.lbry.browser.model.UrlSuggestion;
|
||||||
import io.lbry.browser.model.ViewHistory;
|
import io.lbry.browser.model.ViewHistory;
|
||||||
|
import io.lbry.browser.model.lbryinc.LbryNotification;
|
||||||
import io.lbry.browser.model.lbryinc.Subscription;
|
import io.lbry.browser.model.lbryinc.Subscription;
|
||||||
import io.lbry.browser.utils.Helper;
|
import io.lbry.browser.utils.Helper;
|
||||||
import io.lbry.browser.utils.LbryUri;
|
import io.lbry.browser.utils.LbryUri;
|
||||||
|
|
||||||
public class DatabaseHelper extends SQLiteOpenHelper {
|
public class DatabaseHelper extends SQLiteOpenHelper {
|
||||||
public static final int DATABASE_VERSION = 2;
|
public static final int DATABASE_VERSION = 8;
|
||||||
public static final String DATABASE_NAME = "LbryApp.db";
|
public static final String DATABASE_NAME = "LbryApp.db";
|
||||||
private static DatabaseHelper instance;
|
private static DatabaseHelper instance;
|
||||||
|
|
||||||
private static final String[] SQL_CREATE_TABLES = {
|
private static final String[] SQL_CREATE_TABLES = {
|
||||||
// local subscription store
|
// local subscription store
|
||||||
"CREATE TABLE subscriptions (url TEXT PRIMARY KEY NOT NULL, channel_name TEXT NOT NULL)",
|
"CREATE TABLE subscriptions (url TEXT PRIMARY KEY NOT NULL, channel_name TEXT NOT NULL, is_notifications_disabled INTEGER DEFAULT 0 NOT NULL)",
|
||||||
// url entry / suggestion history
|
// url entry / suggestion history
|
||||||
"CREATE TABLE url_history (id INTEGER PRIMARY KEY NOT NULL, value TEXT NOT NULL, url TEXT, type INTEGER NOT NULL, timestamp TEXT NOT NULL)",
|
"CREATE TABLE url_history (id INTEGER PRIMARY KEY NOT NULL, value TEXT NOT NULL, url TEXT, type INTEGER NOT NULL, timestamp TEXT NOT NULL)",
|
||||||
// tags (known and followed)
|
// tags (known and followed)
|
||||||
|
@ -48,7 +47,20 @@ public class DatabaseHelper extends SQLiteOpenHelper {
|
||||||
", thumbnail_url TEXT" +
|
", thumbnail_url TEXT" +
|
||||||
", release_time INTEGER " +
|
", release_time INTEGER " +
|
||||||
", device TEXT" +
|
", device TEXT" +
|
||||||
", timestamp TEXT NOT NULL)"
|
", timestamp TEXT NOT NULL)",
|
||||||
|
"CREATE TABLE notifications (" +
|
||||||
|
" id INTEGER PRIMARY KEY NOT NULL" +
|
||||||
|
", remote_id INTEGER NOT NULL" +
|
||||||
|
", author_url TEXT" +
|
||||||
|
", title TEXT" +
|
||||||
|
", description TEXT" +
|
||||||
|
", thumbnail_url TEXT" +
|
||||||
|
", target_url TEXT" +
|
||||||
|
", rule TEXT" +
|
||||||
|
", is_read INTEGER DEFAULT 0 NOT NULL" +
|
||||||
|
", is_seen INTEGER DEFAULT 0 NOT NULL " +
|
||||||
|
", timestamp TEXT NOT NULL)",
|
||||||
|
"CREATE TABLE shuffle_watched (id INTEGER PRIMARY KEY NOT NULL, claim_id TEXT NOT NULL)"
|
||||||
};
|
};
|
||||||
private static final String[] SQL_CREATE_INDEXES = {
|
private static final String[] SQL_CREATE_INDEXES = {
|
||||||
"CREATE UNIQUE INDEX idx_subscription_url ON subscriptions (url)",
|
"CREATE UNIQUE INDEX idx_subscription_url ON subscriptions (url)",
|
||||||
|
@ -56,23 +68,69 @@ public class DatabaseHelper extends SQLiteOpenHelper {
|
||||||
"CREATE UNIQUE INDEX idx_url_history_url ON url_history (url)",
|
"CREATE UNIQUE INDEX idx_url_history_url ON url_history (url)",
|
||||||
"CREATE UNIQUE INDEX idx_tag_name ON tags (name)",
|
"CREATE UNIQUE INDEX idx_tag_name ON tags (name)",
|
||||||
"CREATE UNIQUE INDEX idx_view_history_url_device ON view_history (url, device)",
|
"CREATE UNIQUE INDEX idx_view_history_url_device ON view_history (url, device)",
|
||||||
"CREATE INDEX idx_view_history_device ON view_history (device)"
|
"CREATE INDEX idx_view_history_device ON view_history (device)",
|
||||||
|
"CREATE UNIQUE INDEX idx_notification_remote_id ON notifications (remote_id)",
|
||||||
|
"CREATE INDEX idx_notification_timestamp ON notifications (timestamp)",
|
||||||
|
"CREATE UNIQUE INDEX idx_shuffle_watched_claim ON shuffle_watched (claim_id)",
|
||||||
};
|
};
|
||||||
|
|
||||||
private static final String[] SQL_V1_V2_UPGRADE = {
|
private static final String[] SQL_V1_V2_UPGRADE = {
|
||||||
"ALTER TABLE view_history ADD COLUMN currency TEXT"
|
"ALTER TABLE view_history ADD COLUMN currency TEXT"
|
||||||
};
|
};
|
||||||
|
|
||||||
private static final String SQL_INSERT_SUBSCRIPTION = "REPLACE INTO subscriptions (channel_name, url) VALUES (?, ?)";
|
private static final String[] SQL_V2_V3_UPGRADE = {
|
||||||
|
"CREATE TABLE notifications (" +
|
||||||
|
" id INTEGER PRIMARY KEY NOT NULL" +
|
||||||
|
", title TEXT" +
|
||||||
|
", description TEXT" +
|
||||||
|
", thumbnail_url TEXT" +
|
||||||
|
", target_url TEXT" +
|
||||||
|
", is_read INTEGER DEFAULT 0 NOT NULL" +
|
||||||
|
", timestamp TEXT NOT NULL)",
|
||||||
|
"CREATE INDEX idx_notification_timestamp ON notifications (timestamp)"
|
||||||
|
};
|
||||||
|
|
||||||
|
private static final String[] SQL_V3_V4_UPGRADE = {
|
||||||
|
"ALTER TABLE notifications ADD COLUMN remote_id INTEGER",
|
||||||
|
"CREATE UNIQUE INDEX idx_notification_remote_id ON notifications (remote_id)"
|
||||||
|
};
|
||||||
|
private static final String[] SQL_V4_V5_UPGRADE = {
|
||||||
|
"ALTER TABLE notifications ADD COLUMN rule TEXT",
|
||||||
|
"ALTER TABLE notifications ADD COLUMN is_seen TEXT"
|
||||||
|
};
|
||||||
|
private static final String[] SQL_V5_V6_UPGRADE = {
|
||||||
|
"ALTER TABLE notifications ADD COLUMN author_url TEXT"
|
||||||
|
};
|
||||||
|
private static final String[] SQL_V6_V7_UPGRADE = {
|
||||||
|
"CREATE TABLE shuffle_watched (id INTEGER PRIMARY KEY NOT NULL, claim_id TEXT NOT NULL)",
|
||||||
|
"CREATE UNIQUE INDEX idx_shuffle_watched_claim ON shuffle_watched (claim_id)"
|
||||||
|
};
|
||||||
|
private static final String[] SQL_V7_V8_UPGRADE = {
|
||||||
|
"AlTER TABLE subscriptions ADD COLUMN is_notifications_disabled INTEGER DEFAULT 0 NOT NULL"
|
||||||
|
};
|
||||||
|
|
||||||
|
private static final String SQL_INSERT_SUBSCRIPTION = "REPLACE INTO subscriptions (channel_name, url, is_notifications_disabled) VALUES (?, ?, ?)";
|
||||||
|
private static final String SQL_UPDATE_SUBSCRIPTION_NOTIFICATION = "UPDATE subscriptions SET is_notification_disabled = ? WHERE url = ?";
|
||||||
private static final String SQL_CLEAR_SUBSCRIPTIONS = "DELETE FROM subscriptions";
|
private static final String SQL_CLEAR_SUBSCRIPTIONS = "DELETE FROM subscriptions";
|
||||||
private static final String SQL_DELETE_SUBSCRIPTION = "DELETE FROM subscriptions WHERE url = ?";
|
private static final String SQL_DELETE_SUBSCRIPTION = "DELETE FROM subscriptions WHERE url = ?";
|
||||||
private static final String SQL_GET_SUBSCRIPTIONS = "SELECT channel_name, url FROM subscriptions";
|
private static final String SQL_GET_SUBSCRIPTIONS = "SELECT channel_name, url, is_notifications_disabled FROM subscriptions";
|
||||||
|
|
||||||
private static final String SQL_INSERT_URL_HISTORY = "REPLACE INTO url_history (value, url, type, timestamp) VALUES (?, ?, ?, ?)";
|
private static final String SQL_INSERT_URL_HISTORY = "REPLACE INTO url_history (value, url, type, timestamp) VALUES (?, ?, ?, ?)";
|
||||||
private static final String SQL_CLEAR_URL_HISTORY = "DELETE FROM url_history";
|
private static final String SQL_CLEAR_URL_HISTORY = "DELETE FROM url_history";
|
||||||
private static final String SQL_CLEAR_URL_HISTORY_BEFORE_TIME = "DELETE FROM url_history WHERE timestamp < ?";
|
private static final String SQL_CLEAR_URL_HISTORY_BEFORE_TIME = "DELETE FROM url_history WHERE timestamp < ?";
|
||||||
private static final String SQL_GET_RECENT_URL_HISTORY = "SELECT value, url, type FROM url_history ORDER BY timestamp DESC LIMIT 10";
|
private static final String SQL_GET_RECENT_URL_HISTORY = "SELECT value, url, type FROM url_history ORDER BY timestamp DESC LIMIT 10";
|
||||||
|
|
||||||
|
private static final String SQL_INSERT_NOTIFICATION = "REPLACE INTO notifications (remote_id, author_url, title, description, rule, target_url, is_read, is_seen, timestamp) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)";
|
||||||
|
private static final String SQL_GET_NOTIFICATIONS = "SELECT id, remote_id, author_url, title, description, rule, target_url, is_read, is_seen, timestamp FROM notifications ORDER BY timestamp DESC LIMIT 500";
|
||||||
|
private static final String SQL_GET_UNREAD_NOTIFICATIONS_COUNT = "SELECT COUNT(id) FROM notifications WHERE is_read <> 1";
|
||||||
|
private static final String SQL_GET_UNSEEN_NOTIFICATIONS_COUNT = "SELECT COUNT(id) FROM notifications WHERE is_seen <> 1";
|
||||||
|
private static final String SQL_MARK_NOTIFICATIONS_READ = "UPDATE notifications SET is_read = 1 WHERE is_read = 0";
|
||||||
|
private static final String SQL_MARK_NOTIFICATIONS_SEEN = "UPDATE notifications SET is_seen = 1 WHERE is_seen = 0";
|
||||||
|
private static final String SQL_MARK_NOTIFICATION_READ_AND_SEEN = "UPDATE notifications SET is_read = 1, is_seen = 1 WHERE id = ?";
|
||||||
|
|
||||||
|
private static final String SQL_INSERT_SHUFFLE_WATCHED = "REPLACE INTO shuffle_watched (claim_id) VALUES (?)";
|
||||||
|
private static final String SQL_GET_SHUFFLE_WATCHED_CLAIMS = "SELECT claim_id FROM shuffle_watched";
|
||||||
|
|
||||||
private static final String SQL_INSERT_VIEW_HISTORY =
|
private static final String SQL_INSERT_VIEW_HISTORY =
|
||||||
"REPLACE INTO view_history (url, claim_id, claim_name, cost, currency, title, publisher_claim_id, publisher_name, publisher_title, thumbnail_url, device, release_time, timestamp) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
|
"REPLACE INTO view_history (url, claim_id, claim_name, cost, currency, title, publisher_claim_id, publisher_name, publisher_title, thumbnail_url, device, release_time, timestamp) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
|
||||||
private static final String SQL_GET_VIEW_HISTORY =
|
private static final String SQL_GET_VIEW_HISTORY =
|
||||||
|
@ -111,6 +169,36 @@ public class DatabaseHelper extends SQLiteOpenHelper {
|
||||||
db.execSQL(sql);
|
db.execSQL(sql);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (oldVersion < 3) {
|
||||||
|
for (String sql : SQL_V2_V3_UPGRADE) {
|
||||||
|
db.execSQL(sql);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (oldVersion < 4) {
|
||||||
|
for (String sql : SQL_V3_V4_UPGRADE) {
|
||||||
|
db.execSQL(sql);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (oldVersion < 5) {
|
||||||
|
for (String sql : SQL_V4_V5_UPGRADE) {
|
||||||
|
db.execSQL(sql);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (oldVersion < 6) {
|
||||||
|
for (String sql : SQL_V5_V6_UPGRADE) {
|
||||||
|
db.execSQL(sql);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (oldVersion < 7) {
|
||||||
|
for (String sql : SQL_V6_V7_UPGRADE) {
|
||||||
|
db.execSQL(sql);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (oldVersion < 8) {
|
||||||
|
for (String sql : SQL_V7_V8_UPGRADE) {
|
||||||
|
db.execSQL(sql);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
|
public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
|
||||||
|
|
||||||
|
@ -127,6 +215,7 @@ public class DatabaseHelper extends SQLiteOpenHelper {
|
||||||
public static void clearUrlHistoryBefore(Date date, SQLiteDatabase db) {
|
public static void clearUrlHistoryBefore(Date date, SQLiteDatabase db) {
|
||||||
db.execSQL(SQL_CLEAR_URL_HISTORY_BEFORE_TIME, new Object[] { new SimpleDateFormat(Helper.ISO_DATE_FORMAT_PATTERN).format(new Date()) });
|
db.execSQL(SQL_CLEAR_URL_HISTORY_BEFORE_TIME, new Object[] { new SimpleDateFormat(Helper.ISO_DATE_FORMAT_PATTERN).format(new Date()) });
|
||||||
}
|
}
|
||||||
|
|
||||||
// History items are essentially url suggestions
|
// History items are essentially url suggestions
|
||||||
public static List<UrlSuggestion> getRecentHistory(SQLiteDatabase db) {
|
public static List<UrlSuggestion> getRecentHistory(SQLiteDatabase db) {
|
||||||
List<UrlSuggestion> suggestions = new ArrayList<>();
|
List<UrlSuggestion> suggestions = new ArrayList<>();
|
||||||
|
@ -226,7 +315,14 @@ public class DatabaseHelper extends SQLiteOpenHelper {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void createOrUpdateSubscription(Subscription subscription, SQLiteDatabase db) {
|
public static void createOrUpdateSubscription(Subscription subscription, SQLiteDatabase db) {
|
||||||
db.execSQL(SQL_INSERT_SUBSCRIPTION, new Object[] { subscription.getChannelName(), subscription.getUrl() });
|
db.execSQL(SQL_INSERT_SUBSCRIPTION, new Object[] {
|
||||||
|
subscription.getChannelName(),
|
||||||
|
subscription.getUrl(),
|
||||||
|
subscription.isNotificationsDisabled() ? 1 : 0
|
||||||
|
});
|
||||||
|
}
|
||||||
|
public static void setSubscriptionNotificationDisabled(boolean flag, String url, SQLiteDatabase db) {
|
||||||
|
db.execSQL(SQL_UPDATE_SUBSCRIPTION_NOTIFICATION, new Object[] { flag ? 1 : 0, url });
|
||||||
}
|
}
|
||||||
public static void deleteSubscription(Subscription subscription, SQLiteDatabase db) {
|
public static void deleteSubscription(Subscription subscription, SQLiteDatabase db) {
|
||||||
db.execSQL(SQL_DELETE_SUBSCRIPTION, new Object[] { subscription.getUrl() });
|
db.execSQL(SQL_DELETE_SUBSCRIPTION, new Object[] { subscription.getUrl() });
|
||||||
|
@ -243,6 +339,7 @@ public class DatabaseHelper extends SQLiteOpenHelper {
|
||||||
Subscription subscription = new Subscription();
|
Subscription subscription = new Subscription();
|
||||||
subscription.setChannelName(cursor.getString(0));
|
subscription.setChannelName(cursor.getString(0));
|
||||||
subscription.setUrl(cursor.getString(1));
|
subscription.setUrl(cursor.getString(1));
|
||||||
|
subscription.setNotificationsDisabled(cursor.getInt(2) == 1);
|
||||||
subscriptions.add(subscription);
|
subscriptions.add(subscription);
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
|
@ -251,4 +348,112 @@ public class DatabaseHelper extends SQLiteOpenHelper {
|
||||||
return subscriptions;
|
return subscriptions;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void createOrUpdateNotification(LbryNotification notification, SQLiteDatabase db) {
|
||||||
|
db.execSQL(SQL_INSERT_NOTIFICATION, new Object[] {
|
||||||
|
notification.getRemoteId(),
|
||||||
|
notification.getAuthorUrl(),
|
||||||
|
notification.getTitle(),
|
||||||
|
notification.getDescription(),
|
||||||
|
notification.getRule(),
|
||||||
|
notification.getTargetUrl(),
|
||||||
|
notification.isRead() ? 1 : 0,
|
||||||
|
notification.isSeen() ? 1 : 0,
|
||||||
|
new SimpleDateFormat(Helper.ISO_DATE_FORMAT_PATTERN).format(notification.getTimestamp() != null ? notification.getTimestamp() : new Date())
|
||||||
|
});
|
||||||
|
}
|
||||||
|
public static List<LbryNotification> getNotifications(SQLiteDatabase db) {
|
||||||
|
List<LbryNotification> notifications = new ArrayList<>();
|
||||||
|
Cursor cursor = null;
|
||||||
|
try {
|
||||||
|
cursor = db.rawQuery(SQL_GET_NOTIFICATIONS, null);
|
||||||
|
while (cursor.moveToNext()) {
|
||||||
|
LbryNotification notification = new LbryNotification();
|
||||||
|
int columnIndex = 0;
|
||||||
|
notification.setId(cursor.getLong(columnIndex++));
|
||||||
|
notification.setRemoteId(cursor.getLong(columnIndex++));
|
||||||
|
notification.setAuthorUrl(cursor.getString(columnIndex++));
|
||||||
|
notification.setTitle(cursor.getString(columnIndex++));
|
||||||
|
notification.setDescription(cursor.getString(columnIndex++));
|
||||||
|
notification.setRule(cursor.getString(columnIndex++));
|
||||||
|
notification.setTargetUrl(cursor.getString(columnIndex++));
|
||||||
|
notification.setRead(cursor.getInt(columnIndex++) == 1);
|
||||||
|
notification.setSeen(cursor.getInt(columnIndex++) == 1);
|
||||||
|
try {
|
||||||
|
notification.setTimestamp(new SimpleDateFormat(Helper.ISO_DATE_FORMAT_PATTERN).parse(cursor.getString(columnIndex++)));
|
||||||
|
} catch (ParseException ex) {
|
||||||
|
// invalid timestamp (which shouldn't happen). Skip this item
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
notifications.add(notification);
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
Helper.closeCursor(cursor);
|
||||||
|
}
|
||||||
|
return notifications;
|
||||||
|
}
|
||||||
|
public static void deleteNotifications(List<LbryNotification> notifications, SQLiteDatabase db) {
|
||||||
|
StringBuilder sb = new StringBuilder("DELETE FROM notifications WHERE remote_id IN (");
|
||||||
|
List<Object> remoteIds = new ArrayList<>();
|
||||||
|
String delim = "";
|
||||||
|
for (int i = 0; i < notifications.size(); i++) {
|
||||||
|
remoteIds.add(String.valueOf(notifications.get(i).getRemoteId()));
|
||||||
|
sb.append(delim).append("?");
|
||||||
|
delim = ",";
|
||||||
|
}
|
||||||
|
sb.append(")");
|
||||||
|
|
||||||
|
String sql = sb.toString();
|
||||||
|
db.execSQL(sql, remoteIds.toArray());
|
||||||
|
}
|
||||||
|
public static int getUnreadNotificationsCount(SQLiteDatabase db) {
|
||||||
|
int count = 0;
|
||||||
|
Cursor cursor = null;
|
||||||
|
try {
|
||||||
|
cursor = db.rawQuery(SQL_GET_UNREAD_NOTIFICATIONS_COUNT, null);
|
||||||
|
if (cursor.moveToNext()) {
|
||||||
|
count = cursor.getInt(0);
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
Helper.closeCursor(cursor);
|
||||||
|
}
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
public static int getUnseenNotificationsCount(SQLiteDatabase db) {
|
||||||
|
int count = 0;
|
||||||
|
Cursor cursor = null;
|
||||||
|
try {
|
||||||
|
cursor = db.rawQuery(SQL_GET_UNSEEN_NOTIFICATIONS_COUNT, null);
|
||||||
|
if (cursor.moveToNext()) {
|
||||||
|
count = cursor.getInt(0);
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
Helper.closeCursor(cursor);
|
||||||
|
}
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
public static void markNotificationsSeen(SQLiteDatabase db) {
|
||||||
|
db.execSQL(SQL_MARK_NOTIFICATIONS_SEEN);
|
||||||
|
}
|
||||||
|
public static void markNotificationsRead(SQLiteDatabase db) {
|
||||||
|
db.execSQL(SQL_MARK_NOTIFICATIONS_READ);
|
||||||
|
}
|
||||||
|
public static void markNotificationReadAndSeen(long notificationId, SQLiteDatabase db) {
|
||||||
|
db.execSQL(SQL_MARK_NOTIFICATION_READ_AND_SEEN, new Object[] { notificationId });
|
||||||
|
}
|
||||||
|
public static void createOrUpdateShuffleWatched(String claimId, SQLiteDatabase db) {
|
||||||
|
db.execSQL(SQL_INSERT_SHUFFLE_WATCHED, new Object[] { claimId });
|
||||||
|
}
|
||||||
|
public static List<String> getShuffleWatchedClaims(SQLiteDatabase db) {
|
||||||
|
List<String> claimIds = new ArrayList<>();
|
||||||
|
Cursor cursor = null;
|
||||||
|
try {
|
||||||
|
cursor = db.rawQuery(SQL_GET_SHUFFLE_WATCHED_CLAIMS, null);
|
||||||
|
while (cursor.moveToNext()) {
|
||||||
|
claimIds.add(cursor.getString(0));
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
Helper.closeCursor(cursor);
|
||||||
|
}
|
||||||
|
return claimIds;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -67,8 +67,8 @@ public class ContentFromDialogFragment extends BottomSheetDialogFragment {
|
||||||
R.id.content_from_past_year_item,
|
R.id.content_from_past_year_item,
|
||||||
R.id.content_from_all_time_item
|
R.id.content_from_all_time_item
|
||||||
};
|
};
|
||||||
private BottomSheetDialogFragment dialog;
|
private final BottomSheetDialogFragment dialog;
|
||||||
private ContentFromListener listener;
|
private final ContentFromListener listener;
|
||||||
|
|
||||||
public ContentFromItemClickListener(BottomSheetDialogFragment dialog, ContentFromListener listener) {
|
public ContentFromItemClickListener(BottomSheetDialogFragment dialog, ContentFromListener listener) {
|
||||||
this.dialog = dialog;
|
this.dialog = dialog;
|
||||||
|
|
|
@ -54,8 +54,8 @@ public class ContentScopeDialogFragment extends BottomSheetDialogFragment {
|
||||||
private final int[] checkViewIds = {
|
private final int[] checkViewIds = {
|
||||||
R.id.content_scope_everyone_item_selected, R.id.content_scope_tags_item_selected
|
R.id.content_scope_everyone_item_selected, R.id.content_scope_tags_item_selected
|
||||||
};
|
};
|
||||||
private BottomSheetDialogFragment dialog;
|
private final BottomSheetDialogFragment dialog;
|
||||||
private ContentScopeListener listener;
|
private final ContentScopeListener listener;
|
||||||
|
|
||||||
public ContentScopeItemClickListener(BottomSheetDialogFragment dialog, ContentScopeListener listener) {
|
public ContentScopeItemClickListener(BottomSheetDialogFragment dialog, ContentScopeListener listener) {
|
||||||
this.dialog = dialog;
|
this.dialog = dialog;
|
||||||
|
|
|
@ -57,8 +57,8 @@ public class ContentSortDialogFragment extends BottomSheetDialogFragment {
|
||||||
private final int[] checkViewIds = {
|
private final int[] checkViewIds = {
|
||||||
R.id.sort_by_trending_item_selected, R.id.sort_by_new_item_selected, R.id.sort_by_top_item_selected
|
R.id.sort_by_trending_item_selected, R.id.sort_by_new_item_selected, R.id.sort_by_top_item_selected
|
||||||
};
|
};
|
||||||
private BottomSheetDialogFragment dialog;
|
private final BottomSheetDialogFragment dialog;
|
||||||
private SortByListener listener;
|
private final SortByListener listener;
|
||||||
|
|
||||||
public SortByItemClickListener(BottomSheetDialogFragment dialog, SortByListener listener) {
|
public SortByItemClickListener(BottomSheetDialogFragment dialog, SortByListener listener) {
|
||||||
this.dialog = dialog;
|
this.dialog = dialog;
|
||||||
|
|
|
@ -13,7 +13,6 @@ import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.CompoundButton;
|
import android.widget.CompoundButton;
|
||||||
import android.widget.ProgressBar;
|
import android.widget.ProgressBar;
|
||||||
import android.widget.Switch;
|
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
import androidx.appcompat.widget.AppCompatSpinner;
|
import androidx.appcompat.widget.AppCompatSpinner;
|
||||||
|
@ -41,7 +40,6 @@ import io.lbry.browser.tasks.claim.ClaimListTask;
|
||||||
import io.lbry.browser.tasks.wallet.SupportCreateTask;
|
import io.lbry.browser.tasks.wallet.SupportCreateTask;
|
||||||
import io.lbry.browser.utils.Helper;
|
import io.lbry.browser.utils.Helper;
|
||||||
import io.lbry.browser.utils.Lbry;
|
import io.lbry.browser.utils.Lbry;
|
||||||
import lombok.Setter;
|
|
||||||
|
|
||||||
public class CreateSupportDialogFragment extends BottomSheetDialogFragment implements WalletBalanceListener {
|
public class CreateSupportDialogFragment extends BottomSheetDialogFragment implements WalletBalanceListener {
|
||||||
public static final String TAG = "CreateSupportDialog";
|
public static final String TAG = "CreateSupportDialog";
|
||||||
|
@ -61,13 +59,17 @@ public class CreateSupportDialogFragment extends BottomSheetDialogFragment imple
|
||||||
private ProgressBar progressLoadingChannels;
|
private ProgressBar progressLoadingChannels;
|
||||||
|
|
||||||
|
|
||||||
@Setter
|
private final CreateSupportListener listener;
|
||||||
private CreateSupportListener listener;
|
private final Claim claim;
|
||||||
@Setter
|
|
||||||
private Claim claim;
|
|
||||||
|
|
||||||
public static CreateSupportDialogFragment newInstance() {
|
private CreateSupportDialogFragment(Claim claim, CreateSupportListener listener) {
|
||||||
return new CreateSupportDialogFragment();
|
super();
|
||||||
|
this.claim = claim;
|
||||||
|
this.listener = listener;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static CreateSupportDialogFragment newInstance(Claim claim, CreateSupportListener listener) {
|
||||||
|
return new CreateSupportDialogFragment(claim, listener);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void disableControls() {
|
private void disableControls() {
|
||||||
|
@ -225,9 +227,10 @@ public class CreateSupportDialogFragment extends BottomSheetDialogFragment imple
|
||||||
if (!isTip) {
|
if (!isTip) {
|
||||||
sendButton.setText(R.string.send_revocable_support);
|
sendButton.setText(R.string.send_revocable_support);
|
||||||
} else {
|
} else {
|
||||||
String amountString = Helper.getValue(inputAmount.getText());
|
String amountString = Helper.getValue(inputAmount.getText(), "0");
|
||||||
double parsedAmount = Helper.parseDouble(amountString, 0);
|
double parsedAmount = Helper.parseDouble(amountString, 0);
|
||||||
sendButton.setText(parsedAmount == 0 ? getString(R.string.send_a_tip) : getString(R.string.send_lbc_tip, amountString));
|
String text = getResources().getQuantityString(R.plurals.send_lbc_tip, parsedAmount == 1.0 ? 1 : 2, amountString);
|
||||||
|
sendButton.setText(text);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -142,7 +142,7 @@ public class CustomizeTagsDialogFragment extends BottomSheetDialogFragment {
|
||||||
return view;
|
return view;
|
||||||
}
|
}
|
||||||
|
|
||||||
private TagListAdapter.TagClickListener customizeTagClickListener = new TagListAdapter.TagClickListener() {
|
private final TagListAdapter.TagClickListener customizeTagClickListener = new TagListAdapter.TagClickListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onTagClicked(Tag tag, int customizeMode) {
|
public void onTagClicked(Tag tag, int customizeMode) {
|
||||||
if (customizeMode == TagListAdapter.CUSTOMIZE_MODE_ADD) {
|
if (customizeMode == TagListAdapter.CUSTOMIZE_MODE_ADD) {
|
||||||
|
|
|
@ -5,7 +5,6 @@ import android.os.Bundle;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.ProgressBar;
|
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.recyclerview.widget.GridLayoutManager;
|
import androidx.recyclerview.widget.GridLayoutManager;
|
||||||
|
|
|
@ -37,7 +37,6 @@ import io.lbry.browser.tasks.claim.StreamRepostTask;
|
||||||
import io.lbry.browser.utils.Helper;
|
import io.lbry.browser.utils.Helper;
|
||||||
import io.lbry.browser.utils.Lbry;
|
import io.lbry.browser.utils.Lbry;
|
||||||
import io.lbry.browser.utils.LbryUri;
|
import io.lbry.browser.utils.LbryUri;
|
||||||
import lombok.Setter;
|
|
||||||
|
|
||||||
public class RepostClaimDialogFragment extends BottomSheetDialogFragment implements WalletBalanceListener {
|
public class RepostClaimDialogFragment extends BottomSheetDialogFragment implements WalletBalanceListener {
|
||||||
public static final String TAG = "RepostClaimDialog";
|
public static final String TAG = "RepostClaimDialog";
|
||||||
|
@ -57,13 +56,17 @@ public class RepostClaimDialogFragment extends BottomSheetDialogFragment impleme
|
||||||
private TextView linkToggleAdvanced;
|
private TextView linkToggleAdvanced;
|
||||||
private View advancedContainer;
|
private View advancedContainer;
|
||||||
|
|
||||||
@Setter
|
private final RepostClaimListener listener;
|
||||||
private RepostClaimListener listener;
|
private final Claim claim;
|
||||||
@Setter
|
|
||||||
private Claim claim;
|
|
||||||
|
|
||||||
public static RepostClaimDialogFragment newInstance() {
|
private RepostClaimDialogFragment(Claim claim, RepostClaimListener listener) {
|
||||||
return new RepostClaimDialogFragment();
|
super();
|
||||||
|
this.listener = listener;
|
||||||
|
this.claim = claim;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static RepostClaimDialogFragment newInstance(Claim claim, RepostClaimListener listener) {
|
||||||
|
return new RepostClaimDialogFragment(claim, listener);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -7,4 +7,7 @@ public interface SignInListener {
|
||||||
void onPhoneAdded(String countryCode, String phoneNumber);
|
void onPhoneAdded(String countryCode, String phoneNumber);
|
||||||
void onPhoneVerified();
|
void onPhoneVerified();
|
||||||
void onManualVerifyContinue();
|
void onManualVerifyContinue();
|
||||||
|
void onSkipQueueAction();
|
||||||
|
void onTwitterVerified();
|
||||||
|
void onManualProgress(boolean progress);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
package io.lbry.browser.model;
|
package io.lbry.browser.model;
|
||||||
|
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
|
|
||||||
import com.google.gson.FieldNamingPolicy;
|
import com.google.gson.FieldNamingPolicy;
|
||||||
import com.google.gson.Gson;
|
import com.google.gson.Gson;
|
||||||
import com.google.gson.GsonBuilder;
|
import com.google.gson.GsonBuilder;
|
||||||
|
@ -15,7 +17,6 @@ import java.text.SimpleDateFormat;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.stream.Stream;
|
|
||||||
|
|
||||||
import io.lbry.browser.utils.Helper;
|
import io.lbry.browser.utils.Helper;
|
||||||
import io.lbry.browser.utils.LbryUri;
|
import io.lbry.browser.utils.LbryUri;
|
||||||
|
@ -54,6 +55,7 @@ public class Claim {
|
||||||
@EqualsAndHashCode.Include
|
@EqualsAndHashCode.Include
|
||||||
private boolean placeholder;
|
private boolean placeholder;
|
||||||
private boolean placeholderAnonymous;
|
private boolean placeholderAnonymous;
|
||||||
|
private boolean loadingPlaceholder;
|
||||||
private boolean featured;
|
private boolean featured;
|
||||||
private boolean unresolved; // used for featured
|
private boolean unresolved; // used for featured
|
||||||
private String address;
|
private String address;
|
||||||
|
@ -137,6 +139,14 @@ public class Claim {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean hasSource() {
|
||||||
|
if (value instanceof StreamMetadata) {
|
||||||
|
StreamMetadata metadata = (StreamMetadata) value;
|
||||||
|
return metadata.getSource() != null;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
public boolean isPlayable() {
|
public boolean isPlayable() {
|
||||||
if (value instanceof StreamMetadata) {
|
if (value instanceof StreamMetadata) {
|
||||||
StreamMetadata metadata = (StreamMetadata) value;
|
StreamMetadata metadata = (StreamMetadata) value;
|
||||||
|
@ -176,6 +186,21 @@ public class Claim {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the URL from the CDN where getting the image file
|
||||||
|
* @param width Pass zero for width and height for the full size image file
|
||||||
|
* @param height Pass zero for width and height for the full size image file
|
||||||
|
* @param q Desired quality for the image to be retrieved
|
||||||
|
* @return URL from the CDN from where image can be retrieved
|
||||||
|
*/
|
||||||
|
public String getThumbnailUrl(int width, int height, int q) {
|
||||||
|
if (value != null && value.getThumbnail() != null) {
|
||||||
|
ImageCDNUrl imageCDNUrl = new ImageCDNUrl(Math.max(width, 0), Math.max(height, 0), q, null, value.getThumbnail().getUrl());
|
||||||
|
return imageCDNUrl.toString();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
public String getCoverUrl() {
|
public String getCoverUrl() {
|
||||||
if (TYPE_CHANNEL.equals(valueType) && value != null && value instanceof ChannelMetadata && ((ChannelMetadata) value).getCover() != null) {
|
if (TYPE_CHANNEL.equals(valueType) && value != null && value instanceof ChannelMetadata && ((ChannelMetadata) value).getCover() != null) {
|
||||||
return ((ChannelMetadata) value).getCover().getUrl();
|
return ((ChannelMetadata) value).getCover().getUrl();
|
||||||
|
@ -483,6 +508,30 @@ public class Claim {
|
||||||
private String url;
|
private String url;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Object to be instantiated. In order to get the URLto the CDN, call toString() on it
|
||||||
|
*/
|
||||||
|
static class ImageCDNUrl {
|
||||||
|
private String appendedPath = "";
|
||||||
|
|
||||||
|
public ImageCDNUrl(int width, int height, int quality, @Nullable String format, String thumbnailUrl) {
|
||||||
|
if (width != 0 && height != 0)
|
||||||
|
appendedPath = "s:".concat(String.valueOf(width)).concat(":").concat(String.valueOf(height)).concat("/");
|
||||||
|
|
||||||
|
appendedPath = appendedPath.concat("quality:").concat(String.valueOf(quality)).concat("/");
|
||||||
|
|
||||||
|
appendedPath = appendedPath.concat("plain/").concat(thumbnailUrl);
|
||||||
|
|
||||||
|
if (format != null)
|
||||||
|
appendedPath = appendedPath.concat("@").concat(format);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
String url = "https://image-processor.vanwanet.com/optimize/";
|
||||||
|
return url.concat(appendedPath);
|
||||||
|
}
|
||||||
|
}
|
||||||
@Data
|
@Data
|
||||||
public static class StreamInfo {
|
public static class StreamInfo {
|
||||||
private long duration; // video / audio
|
private long duration; // video / audio
|
||||||
|
|
|
@ -40,7 +40,7 @@ public class ClaimCacheKey {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean equals(@Nullable Object obj) {
|
public boolean equals(@Nullable Object obj) {
|
||||||
if (obj == null || !(obj instanceof ClaimCacheKey)) {
|
if (!(obj instanceof ClaimCacheKey)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
ClaimCacheKey key = (ClaimCacheKey) obj;
|
ClaimCacheKey key = (ClaimCacheKey) obj;
|
||||||
|
|
|
@ -1,19 +1,15 @@
|
||||||
package io.lbry.browser.model;
|
package io.lbry.browser.model;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Date;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.Setter;
|
|
||||||
|
|
||||||
public class ClaimSearchCacheValue {
|
public class ClaimSearchCacheValue {
|
||||||
@Getter
|
@Getter
|
||||||
@Setter
|
private final List<Claim> claims;
|
||||||
private List<Claim> claims;
|
|
||||||
@Getter
|
@Getter
|
||||||
@Setter
|
private final long timestamp;
|
||||||
private long timestamp;
|
|
||||||
|
|
||||||
public ClaimSearchCacheValue(List<Claim> claims, long timestamp) {
|
public ClaimSearchCacheValue(List<Claim> claims, long timestamp) {
|
||||||
this.claims = new ArrayList<>(claims);
|
this.claims = new ArrayList<>(claims);
|
||||||
|
|
|
@ -3,7 +3,6 @@ package io.lbry.browser.model;
|
||||||
import org.json.JSONException;
|
import org.json.JSONException;
|
||||||
import org.json.JSONObject;
|
import org.json.JSONObject;
|
||||||
|
|
||||||
import java.lang.reflect.Array;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
@ -11,8 +10,7 @@ import io.lbry.browser.utils.Helper;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
public class Comment {
|
public class Comment implements Comparable<Comment> {
|
||||||
public static final double LBC_COST = 1;
|
|
||||||
public static final int MAX_LENGTH = 2000;
|
public static final int MAX_LENGTH = 2000;
|
||||||
|
|
||||||
private Claim poster;
|
private Claim poster;
|
||||||
|
@ -66,4 +64,9 @@ public class Comment {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int compareTo(Comment comment) {
|
||||||
|
return (int)(this.getTimestamp() - comment.getTimestamp());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,9 +4,9 @@ import lombok.Data;
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
public class Language {
|
public class Language {
|
||||||
private String code;
|
private final String code;
|
||||||
private String name;
|
private final String name;
|
||||||
private int stringResourceId;
|
private final int stringResourceId;
|
||||||
|
|
||||||
public Language(String code, String name, int stringResourceId) {
|
public Language(String code, String name, int stringResourceId) {
|
||||||
this.code = code;
|
this.code = code;
|
||||||
|
|
|
@ -4,9 +4,9 @@ import lombok.Data;
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
public class License {
|
public class License {
|
||||||
private String name;
|
private final String name;
|
||||||
private String url;
|
private String url;
|
||||||
private int stringResourceId;
|
private final int stringResourceId;
|
||||||
|
|
||||||
public License(String name, int stringResourceId) {
|
public License(String name, int stringResourceId) {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
|
|
|
@ -2,8 +2,6 @@ package io.lbry.browser.model;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
|
||||||
import androidx.core.content.res.ResourcesCompat;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
@ -20,6 +18,7 @@ public class NavMenuItem {
|
||||||
public static final int ID_ITEM_FOLLOWING = 101;
|
public static final int ID_ITEM_FOLLOWING = 101;
|
||||||
public static final int ID_ITEM_EDITORS_CHOICE = 102;
|
public static final int ID_ITEM_EDITORS_CHOICE = 102;
|
||||||
public static final int ID_ITEM_ALL_CONTENT = 103;
|
public static final int ID_ITEM_ALL_CONTENT = 103;
|
||||||
|
public static final int ID_ITEM_SHUFFLE = 104;
|
||||||
|
|
||||||
// Your Content
|
// Your Content
|
||||||
public static final int ID_ITEM_CHANNELS = 201;
|
public static final int ID_ITEM_CHANNELS = 201;
|
||||||
|
@ -36,8 +35,8 @@ public class NavMenuItem {
|
||||||
public static final int ID_ITEM_SETTINGS = 401;
|
public static final int ID_ITEM_SETTINGS = 401;
|
||||||
public static final int ID_ITEM_ABOUT = 402;
|
public static final int ID_ITEM_ABOUT = 402;
|
||||||
|
|
||||||
private Context context;
|
private final Context context;
|
||||||
private int id;
|
private final int id;
|
||||||
private boolean group;
|
private boolean group;
|
||||||
private int icon;
|
private int icon;
|
||||||
private String title;
|
private String title;
|
||||||
|
|
11
app/src/main/java/io/lbry/browser/model/StartupStage.java
Normal file
11
app/src/main/java/io/lbry/browser/model/StartupStage.java
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
package io.lbry.browser.model;
|
||||||
|
|
||||||
|
public class StartupStage {
|
||||||
|
public final Integer stage;
|
||||||
|
public final Boolean stageDone;
|
||||||
|
|
||||||
|
public StartupStage(Integer stage, Boolean stageDone) {
|
||||||
|
this.stage = stage;
|
||||||
|
this.stageDone = stageDone;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,9 @@
|
||||||
|
package io.lbry.browser.model;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class TwitterOauth {
|
||||||
|
private String oauthToken;
|
||||||
|
private String oauthTokenSecret;
|
||||||
|
}
|
|
@ -3,9 +3,7 @@ package io.lbry.browser.model;
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
import io.lbry.browser.exceptions.LbryUriException;
|
|
||||||
import io.lbry.browser.utils.LbryUri;
|
import io.lbry.browser.utils.LbryUri;
|
||||||
import io.lbry.browser.utils.Lbryio;
|
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
|
|
|
@ -6,14 +6,28 @@ import java.math.BigDecimal;
|
||||||
|
|
||||||
import io.lbry.browser.utils.Helper;
|
import io.lbry.browser.utils.Helper;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
public class WalletBalance {
|
public class WalletBalance {
|
||||||
|
@Setter
|
||||||
|
@Getter
|
||||||
private BigDecimal available;
|
private BigDecimal available;
|
||||||
|
@Setter
|
||||||
|
@Getter
|
||||||
private BigDecimal reserved;
|
private BigDecimal reserved;
|
||||||
|
@Setter
|
||||||
|
@Getter
|
||||||
private BigDecimal claims;
|
private BigDecimal claims;
|
||||||
|
@Setter
|
||||||
|
@Getter
|
||||||
private BigDecimal supports;
|
private BigDecimal supports;
|
||||||
|
@Setter
|
||||||
|
@Getter
|
||||||
private BigDecimal tips;
|
private BigDecimal tips;
|
||||||
|
@Setter
|
||||||
|
@Getter
|
||||||
private BigDecimal total;
|
private BigDecimal total;
|
||||||
|
|
||||||
public WalletBalance() {
|
public WalletBalance() {
|
||||||
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
package io.lbry.browser.model;
|
||||||
|
|
||||||
|
public class WalletDetailItem {
|
||||||
|
public String detail;
|
||||||
|
public String detailDesc;
|
||||||
|
public String detailAmount;
|
||||||
|
public boolean isUnlockable;
|
||||||
|
public boolean isInProgress;
|
||||||
|
|
||||||
|
public WalletDetailItem(String detail, String detailDesc, String detailAmount, boolean isUnlockable, boolean isInProgress) {
|
||||||
|
this.detail = detail;
|
||||||
|
this.detailDesc = detailDesc;
|
||||||
|
this.detailAmount = detailAmount;
|
||||||
|
this.isUnlockable = isUnlockable;
|
||||||
|
this.isInProgress = isInProgress;
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,11 +1,15 @@
|
||||||
package io.lbry.browser.model;
|
package io.lbry.browser.model;
|
||||||
|
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
public class WalletSync {
|
public class WalletSync {
|
||||||
private String hash;
|
@Getter
|
||||||
private String data;
|
private final String hash;
|
||||||
|
@Getter
|
||||||
|
private final String data;
|
||||||
|
@Getter
|
||||||
private boolean changed;
|
private boolean changed;
|
||||||
|
|
||||||
public WalletSync(String hash, String data) {
|
public WalletSync(String hash, String data) {
|
||||||
|
@ -17,4 +21,5 @@ public class WalletSync {
|
||||||
this(hash, data);
|
this(hash, data);
|
||||||
this.changed = changed;
|
this.changed = changed;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,40 @@
|
||||||
|
package io.lbry.browser.model.lbryinc;
|
||||||
|
|
||||||
|
import java.util.Comparator;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
import io.lbry.browser.model.Claim;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = false, onlyExplicitlyIncluded = true)
|
||||||
|
public class LbryNotification implements Comparator<LbryNotification> {
|
||||||
|
private long id;
|
||||||
|
@EqualsAndHashCode.Include
|
||||||
|
private long remoteId;
|
||||||
|
private String title;
|
||||||
|
private String description;
|
||||||
|
private String thumbnailUrl;
|
||||||
|
private String rule;
|
||||||
|
private String targetUrl;
|
||||||
|
private boolean read;
|
||||||
|
private boolean seen;
|
||||||
|
private Date timestamp;
|
||||||
|
|
||||||
|
// only for comment notifications
|
||||||
|
private String authorUrl;
|
||||||
|
private Claim commentAuthor;
|
||||||
|
|
||||||
|
public int compare(LbryNotification a, LbryNotification b) {
|
||||||
|
long t1 = a.getTimestamp() != null ? a.getTimestamp().getTime() : 0;
|
||||||
|
long t2 = b.getTimestamp() != null ? b.getTimestamp().getTime() : 0;
|
||||||
|
if (t1 < t2) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (t1 > t2) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
|
@ -9,7 +9,6 @@ import org.json.JSONObject;
|
||||||
|
|
||||||
import java.lang.reflect.Type;
|
import java.lang.reflect.Type;
|
||||||
|
|
||||||
import io.lbry.browser.model.Claim;
|
|
||||||
import io.lbry.browser.utils.Helper;
|
import io.lbry.browser.utils.Helper;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
package io.lbry.browser.model.lbryinc;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class RewardVerified {
|
||||||
|
private long userId;
|
||||||
|
private boolean isRewardApproved;
|
||||||
|
}
|
|
@ -11,17 +11,21 @@ public class Subscription {
|
||||||
@Getter
|
@Getter
|
||||||
@Setter
|
@Setter
|
||||||
private String url;
|
private String url;
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
private boolean isNotificationsDisabled;
|
||||||
|
|
||||||
public Subscription() {
|
public Subscription() {
|
||||||
|
|
||||||
}
|
}
|
||||||
public Subscription(String channelName, String url) {
|
public Subscription(String channelName, String url, boolean isNotificationsDisabled) {
|
||||||
this.channelName = channelName;
|
this.channelName = channelName;
|
||||||
this.url = url;
|
this.url = url;
|
||||||
|
this.isNotificationsDisabled = isNotificationsDisabled;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Subscription fromClaim(Claim claim) {
|
public static Subscription fromClaim(Claim claim) {
|
||||||
return new Subscription(claim.getName(), claim.getPermanentUrl());
|
return new Subscription(claim.getName(), claim.getPermanentUrl(), false);
|
||||||
}
|
}
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return url;
|
return url;
|
||||||
|
|
|
@ -12,16 +12,17 @@ import okhttp3.OkHttpClient;
|
||||||
import okhttp3.Request;
|
import okhttp3.Request;
|
||||||
import okhttp3.RequestBody;
|
import okhttp3.RequestBody;
|
||||||
import okhttp3.Response;
|
import okhttp3.Response;
|
||||||
|
import okhttp3.ResponseBody;
|
||||||
|
|
||||||
public class BufferEventTask extends AsyncTask<Void, Void, Void> {
|
public class BufferEventTask extends AsyncTask<Void, Void, Void> {
|
||||||
private static final String TAG = "LbryBufferEvent";
|
private static final String TAG = "LbryBufferEvent";
|
||||||
private static final String ENDPOINT = "https://collector-service.api.lbry.tv/api/v1/events/video";
|
private static final String ENDPOINT = "https://collector-service.api.lbry.tv/api/v1/events/video";
|
||||||
|
|
||||||
private String streamUrl;
|
private final String streamUrl;
|
||||||
private String userIdHash;
|
private final String userIdHash;
|
||||||
private long streamDuration;
|
private final long streamDuration;
|
||||||
private long streamPosition;
|
private final long streamPosition;
|
||||||
private long bufferDuration;
|
private final long bufferDuration;
|
||||||
|
|
||||||
public BufferEventTask(String streamUrl, long streamDuration, long streamPosition, long bufferDuration, String userIdHash) {
|
public BufferEventTask(String streamUrl, long streamDuration, long streamPosition, long bufferDuration, String userIdHash) {
|
||||||
this.streamUrl = streamUrl;
|
this.streamUrl = streamUrl;
|
||||||
|
@ -53,7 +54,11 @@ public class BufferEventTask extends AsyncTask<Void, Void, Void> {
|
||||||
build();
|
build();
|
||||||
|
|
||||||
Response response = client.newCall(request).execute();
|
Response response = client.newCall(request).execute();
|
||||||
String responseString = response.body().string();
|
ResponseBody resBody = response.body();
|
||||||
|
String responseString = "";
|
||||||
|
if (resBody != null) {
|
||||||
|
responseString = response.body().string();
|
||||||
|
}
|
||||||
Log.d(TAG, String.format("buffer event sent: %s", responseString));
|
Log.d(TAG, String.format("buffer event sent: %s", responseString));
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
// we don't want to fail if a buffer event fails to register
|
// we don't want to fail if a buffer event fails to register
|
||||||
|
|
|
@ -0,0 +1,85 @@
|
||||||
|
package io.lbry.browser.tasks;
|
||||||
|
|
||||||
|
import android.os.AsyncTask;
|
||||||
|
import android.view.View;
|
||||||
|
|
||||||
|
import org.json.JSONException;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
import io.lbry.browser.exceptions.ApiCallException;
|
||||||
|
import io.lbry.browser.model.Comment;
|
||||||
|
import io.lbry.browser.utils.Comments;
|
||||||
|
import io.lbry.browser.utils.Helper;
|
||||||
|
import okhttp3.Response;
|
||||||
|
|
||||||
|
public class CommentCreateTask extends AsyncTask<Void, Void, Comment> {
|
||||||
|
private final Comment comment;
|
||||||
|
private final View progressView;
|
||||||
|
private final CommentCreateWithTipHandler handler;
|
||||||
|
private Exception error;
|
||||||
|
|
||||||
|
public CommentCreateTask(Comment comment, View progressView, CommentCreateWithTipHandler handler) {
|
||||||
|
this.comment = comment;
|
||||||
|
this.progressView = progressView;
|
||||||
|
this.handler = handler;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void onPreExecute() {
|
||||||
|
Helper.setViewVisibility(progressView, View.VISIBLE);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Comment doInBackground(Void... params) {
|
||||||
|
Comment createdComment = null;
|
||||||
|
try {
|
||||||
|
// check comments status endpoint
|
||||||
|
Comments.checkCommentsEndpointStatus();
|
||||||
|
|
||||||
|
JSONObject comment_body = new JSONObject();
|
||||||
|
comment_body.put("comment", comment.getText());
|
||||||
|
comment_body.put("claim_id", comment.getClaimId());
|
||||||
|
if (!Helper.isNullOrEmpty(comment.getParentId())) {
|
||||||
|
comment_body.put("parent_id", comment.getParentId());
|
||||||
|
}
|
||||||
|
comment_body.put("channel_id", comment.getChannelId());
|
||||||
|
comment_body.put("channel_name", comment.getChannelName());
|
||||||
|
|
||||||
|
JSONObject jsonChannelSign = Comments.channelSign(comment_body, comment.getChannelId(), comment.getChannelName());
|
||||||
|
|
||||||
|
if (jsonChannelSign.has("signature") && jsonChannelSign.has("signing_ts")) {
|
||||||
|
comment_body.put("signature", jsonChannelSign.getString("signature"));
|
||||||
|
comment_body.put("signing_ts", jsonChannelSign.getString("signing_ts"));
|
||||||
|
}
|
||||||
|
|
||||||
|
Response resp = Comments.performRequest(comment_body, "comment.Create");
|
||||||
|
String responseString = Objects.requireNonNull(resp.body()).string();
|
||||||
|
resp.close();
|
||||||
|
JSONObject jsonResponse = new JSONObject(responseString);
|
||||||
|
|
||||||
|
if (jsonResponse.has("result"))
|
||||||
|
createdComment = Comment.fromJSONObject(jsonResponse.getJSONObject("result"));
|
||||||
|
} catch (ApiCallException | ClassCastException | IOException | JSONException ex) {
|
||||||
|
error = ex;
|
||||||
|
}
|
||||||
|
|
||||||
|
return createdComment;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void onPostExecute(Comment createdComment) {
|
||||||
|
Helper.setViewVisibility(progressView, View.GONE);
|
||||||
|
if (handler != null) {
|
||||||
|
if (createdComment != null) {
|
||||||
|
handler.onSuccess(createdComment);
|
||||||
|
} else {
|
||||||
|
handler.onError(error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface CommentCreateWithTipHandler {
|
||||||
|
void onSuccess(Comment createdComment);
|
||||||
|
void onError(Exception error);
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,103 +0,0 @@
|
||||||
package io.lbry.browser.tasks;
|
|
||||||
|
|
||||||
import android.os.AsyncTask;
|
|
||||||
import android.view.View;
|
|
||||||
|
|
||||||
import org.json.JSONException;
|
|
||||||
import org.json.JSONObject;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.math.BigDecimal;
|
|
||||||
import java.text.DecimalFormat;
|
|
||||||
import java.text.DecimalFormatSymbols;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Locale;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.concurrent.TimeUnit;
|
|
||||||
|
|
||||||
import io.lbry.browser.exceptions.ApiCallException;
|
|
||||||
import io.lbry.browser.model.Comment;
|
|
||||||
import io.lbry.browser.utils.Helper;
|
|
||||||
import io.lbry.browser.utils.Lbry;
|
|
||||||
import io.lbry.browser.utils.Lbryio;
|
|
||||||
import okhttp3.OkHttpClient;
|
|
||||||
import okhttp3.Request;
|
|
||||||
import okhttp3.Response;
|
|
||||||
|
|
||||||
public class CommentCreateWithTipTask extends AsyncTask<Void, Void, Comment> {
|
|
||||||
private static final String STATUS_ENDPOINT = "https://comments.lbry.com";
|
|
||||||
|
|
||||||
private Comment comment;
|
|
||||||
private BigDecimal amount;
|
|
||||||
private View progressView;
|
|
||||||
private CommentCreateWithTipHandler handler;
|
|
||||||
private Exception error;
|
|
||||||
|
|
||||||
public CommentCreateWithTipTask(Comment comment, BigDecimal amount, View progressView, CommentCreateWithTipHandler handler) {
|
|
||||||
this.comment = comment;
|
|
||||||
this.amount = amount;
|
|
||||||
this.progressView = progressView;
|
|
||||||
this.handler = handler;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void onPreExecute() {
|
|
||||||
Helper.setViewVisibility(progressView, View.VISIBLE);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Comment doInBackground(Void... params) {
|
|
||||||
Comment createdComment = null;
|
|
||||||
try {
|
|
||||||
// check comments status endpoint
|
|
||||||
Request request = new Request.Builder().url(STATUS_ENDPOINT).build();
|
|
||||||
OkHttpClient client = new OkHttpClient.Builder().
|
|
||||||
writeTimeout(30, TimeUnit.SECONDS).
|
|
||||||
readTimeout(30, TimeUnit.SECONDS).
|
|
||||||
build();
|
|
||||||
Response response = client.newCall(request).execute();
|
|
||||||
JSONObject status = new JSONObject(response.body().string());
|
|
||||||
String statusText = Helper.getJSONString("text", null, status);
|
|
||||||
boolean isRunning = Helper.getJSONBoolean("is_running", false, status);
|
|
||||||
if (!"ok".equalsIgnoreCase(statusText) || !isRunning) {
|
|
||||||
throw new ApiCallException("The comment server is not available at this time. Please try again later.");
|
|
||||||
}
|
|
||||||
|
|
||||||
Map<String, Object> options = new HashMap<>();
|
|
||||||
options.put("blocking", true);
|
|
||||||
options.put("claim_id", comment.getClaimId());
|
|
||||||
options.put("amount", new DecimalFormat(Helper.SDK_AMOUNT_FORMAT, new DecimalFormatSymbols(Locale.US)).format(amount.doubleValue()));
|
|
||||||
options.put("tip", true);
|
|
||||||
Lbry.genericApiCall(Lbry.METHOD_SUPPORT_CREATE, options);
|
|
||||||
|
|
||||||
options = new HashMap<>();
|
|
||||||
options.put("comment", comment.getText());
|
|
||||||
options.put("claim_id", comment.getClaimId());
|
|
||||||
options.put("channel_id", comment.getChannelId());
|
|
||||||
options.put("channel_name", comment.getChannelName());
|
|
||||||
if (!Helper.isNullOrEmpty(comment.getParentId())) {
|
|
||||||
options.put("parent_id", comment.getParentId());
|
|
||||||
}
|
|
||||||
JSONObject jsonObject = (JSONObject) Lbry.genericApiCall(Lbry.METHOD_COMMENT_CREATE, options);
|
|
||||||
createdComment = Comment.fromJSONObject(jsonObject);
|
|
||||||
} catch (ApiCallException | ClassCastException | IOException | JSONException ex) {
|
|
||||||
error = ex;
|
|
||||||
}
|
|
||||||
|
|
||||||
return createdComment;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void onPostExecute(Comment createdComment) {
|
|
||||||
Helper.setViewVisibility(progressView, View.GONE);
|
|
||||||
if (handler != null) {
|
|
||||||
if (createdComment != null) {
|
|
||||||
handler.onSuccess(createdComment);
|
|
||||||
} else {
|
|
||||||
handler.onError(error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public interface CommentCreateWithTipHandler {
|
|
||||||
void onSuccess(Comment createdComment);
|
|
||||||
void onError(Exception error);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -8,11 +8,13 @@ import org.json.JSONArray;
|
||||||
import org.json.JSONObject;
|
import org.json.JSONObject;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import io.lbry.browser.model.Comment;
|
import io.lbry.browser.model.Comment;
|
||||||
|
import io.lbry.browser.utils.Comments;
|
||||||
import io.lbry.browser.utils.Helper;
|
import io.lbry.browser.utils.Helper;
|
||||||
import io.lbry.browser.utils.Lbry;
|
import io.lbry.browser.utils.Lbry;
|
||||||
|
|
||||||
|
@ -20,8 +22,8 @@ public class CommentListTask extends AsyncTask<Void, Void, List<Comment>> {
|
||||||
private final int page;
|
private final int page;
|
||||||
private final int pageSize;
|
private final int pageSize;
|
||||||
private final String claim;
|
private final String claim;
|
||||||
private ProgressBar progressBar;
|
private final ProgressBar progressBar;
|
||||||
private CommentListHandler handler;
|
private final CommentListHandler handler;
|
||||||
private Exception error;
|
private Exception error;
|
||||||
|
|
||||||
public CommentListTask(int page, int pageSize, String claim, ProgressBar progressBar, CommentListHandler handler) {
|
public CommentListTask(int page, int pageSize, String claim, ProgressBar progressBar, CommentListHandler handler) {
|
||||||
|
@ -45,12 +47,13 @@ public class CommentListTask extends AsyncTask<Void, Void, List<Comment>> {
|
||||||
options.put("claim_id", claim);
|
options.put("claim_id", claim);
|
||||||
options.put("page", page);
|
options.put("page", page);
|
||||||
options.put("page_size", pageSize);
|
options.put("page_size", pageSize);
|
||||||
|
options.put("hidden", false);
|
||||||
options.put("include_replies", false);
|
options.put("include_replies", false);
|
||||||
options.put("is_channel_signature_valid", true);
|
options.put("is_channel_signature_valid", true);
|
||||||
|
options.put("skip_validation", true);
|
||||||
options.put("visible", true);
|
options.put("visible", true);
|
||||||
options.put("hidden", false);
|
|
||||||
|
|
||||||
JSONObject result = (JSONObject) Lbry.genericApiCall(Lbry.METHOD_COMMENT_LIST, options);
|
JSONObject result = (JSONObject) Lbry.parseResponse(Comments.performRequest(Lbry.buildJsonParams(options), "comment.List"));
|
||||||
JSONArray items = result.getJSONArray("items");
|
JSONArray items = result.getJSONArray("items");
|
||||||
|
|
||||||
List<Comment> children = new ArrayList<>();
|
List<Comment> children = new ArrayList<>();
|
||||||
|
@ -66,6 +69,9 @@ public class CommentListTask extends AsyncTask<Void, Void, List<Comment>> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Sort all replies from oldest to newest at once
|
||||||
|
Collections.sort(children);
|
||||||
|
|
||||||
for (Comment child : children) {
|
for (Comment child : children) {
|
||||||
for (Comment parent : comments) {
|
for (Comment parent : comments) {
|
||||||
if (parent.getId().equalsIgnoreCase(child.getParentId())) {
|
if (parent.getId().equalsIgnoreCase(child.getParentId())) {
|
||||||
|
|
|
@ -10,10 +10,10 @@ import io.lbry.browser.model.Tag;
|
||||||
import io.lbry.browser.utils.Lbry;
|
import io.lbry.browser.utils.Lbry;
|
||||||
|
|
||||||
public class FollowUnfollowTagTask extends AsyncTask<Void, Void, Boolean> {
|
public class FollowUnfollowTagTask extends AsyncTask<Void, Void, Boolean> {
|
||||||
private Tag tag;
|
private final Tag tag;
|
||||||
private boolean unfollowing;
|
private final boolean unfollowing;
|
||||||
private Context context;
|
private final Context context;
|
||||||
private FollowUnfollowTagHandler handler;
|
private final FollowUnfollowTagHandler handler;
|
||||||
private Exception error;
|
private Exception error;
|
||||||
|
|
||||||
public FollowUnfollowTagTask(Tag tag, boolean unfollowing, Context context, FollowUnfollowTagHandler handler) {
|
public FollowUnfollowTagTask(Tag tag, boolean unfollowing, Context context, FollowUnfollowTagHandler handler) {
|
||||||
|
|
|
@ -12,9 +12,9 @@ import io.lbry.browser.utils.Helper;
|
||||||
import io.lbry.browser.utils.Lighthouse;
|
import io.lbry.browser.utils.Lighthouse;
|
||||||
|
|
||||||
public class LighthouseAutoCompleteTask extends AsyncTask<Void, Void, List<UrlSuggestion>> {
|
public class LighthouseAutoCompleteTask extends AsyncTask<Void, Void, List<UrlSuggestion>> {
|
||||||
private String text;
|
private final String text;
|
||||||
private AutoCompleteResultHandler handler;
|
private final AutoCompleteResultHandler handler;
|
||||||
private View progressView;
|
private final View progressView;
|
||||||
private Exception error;
|
private Exception error;
|
||||||
|
|
||||||
public LighthouseAutoCompleteTask(String text, View progressView, AutoCompleteResultHandler handler) {
|
public LighthouseAutoCompleteTask(String text, View progressView, AutoCompleteResultHandler handler) {
|
||||||
|
|
|
@ -14,13 +14,13 @@ import io.lbry.browser.utils.Helper;
|
||||||
import io.lbry.browser.utils.Lighthouse;
|
import io.lbry.browser.utils.Lighthouse;
|
||||||
|
|
||||||
public class LighthouseSearchTask extends AsyncTask<Void, Void, List<Claim>> {
|
public class LighthouseSearchTask extends AsyncTask<Void, Void, List<Claim>> {
|
||||||
private String rawQuery;
|
private final String rawQuery;
|
||||||
private int size;
|
private final int size;
|
||||||
private int from;
|
private final int from;
|
||||||
private boolean nsfw;
|
private final boolean nsfw;
|
||||||
private String relatedTo;
|
private final String relatedTo;
|
||||||
private ClaimSearchResultHandler handler;
|
private final ClaimSearchResultHandler handler;
|
||||||
private ProgressBar progressBar;
|
private final ProgressBar progressBar;
|
||||||
private Exception error;
|
private Exception error;
|
||||||
|
|
||||||
public LighthouseSearchTask(String rawQuery, int size, int from, boolean nsfw, String relatedTo, ProgressBar progressBar, ClaimSearchResultHandler handler) {
|
public LighthouseSearchTask(String rawQuery, int size, int from, boolean nsfw, String relatedTo, ProgressBar progressBar, ClaimSearchResultHandler handler) {
|
||||||
|
|
|
@ -4,22 +4,16 @@ import android.content.Context;
|
||||||
import android.database.sqlite.SQLiteDatabase;
|
import android.database.sqlite.SQLiteDatabase;
|
||||||
import android.database.sqlite.SQLiteException;
|
import android.database.sqlite.SQLiteException;
|
||||||
import android.os.AsyncTask;
|
import android.os.AsyncTask;
|
||||||
import android.view.View;
|
|
||||||
import android.widget.ProgressBar;
|
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import io.lbry.browser.MainActivity;
|
import io.lbry.browser.MainActivity;
|
||||||
import io.lbry.browser.data.DatabaseHelper;
|
import io.lbry.browser.data.DatabaseHelper;
|
||||||
import io.lbry.browser.exceptions.LbryRequestException;
|
|
||||||
import io.lbry.browser.exceptions.LbryResponseException;
|
|
||||||
import io.lbry.browser.model.Claim;
|
|
||||||
import io.lbry.browser.model.Tag;
|
import io.lbry.browser.model.Tag;
|
||||||
import io.lbry.browser.utils.Helper;
|
|
||||||
|
|
||||||
public class LoadTagsTask extends AsyncTask<Void, Void, List<Tag>> {
|
public class LoadTagsTask extends AsyncTask<Void, Void, List<Tag>> {
|
||||||
private Context context;
|
private final Context context;
|
||||||
private LoadTagsHandler handler;
|
private final LoadTagsHandler handler;
|
||||||
private Exception error;
|
private Exception error;
|
||||||
|
|
||||||
public LoadTagsTask(Context context, LoadTagsHandler handler) {
|
public LoadTagsTask(Context context, LoadTagsHandler handler) {
|
||||||
|
|
|
@ -4,7 +4,6 @@ import android.content.Context;
|
||||||
import android.database.sqlite.SQLiteDatabase;
|
import android.database.sqlite.SQLiteDatabase;
|
||||||
import android.database.sqlite.SQLiteException;
|
import android.database.sqlite.SQLiteException;
|
||||||
import android.os.AsyncTask;
|
import android.os.AsyncTask;
|
||||||
import android.util.Log;
|
|
||||||
|
|
||||||
import org.json.JSONArray;
|
import org.json.JSONArray;
|
||||||
import org.json.JSONException;
|
import org.json.JSONException;
|
||||||
|
@ -17,24 +16,21 @@ import java.util.Map;
|
||||||
|
|
||||||
import io.lbry.browser.MainActivity;
|
import io.lbry.browser.MainActivity;
|
||||||
import io.lbry.browser.data.DatabaseHelper;
|
import io.lbry.browser.data.DatabaseHelper;
|
||||||
import io.lbry.browser.exceptions.LbryUriException;
|
|
||||||
import io.lbry.browser.exceptions.LbryioRequestException;
|
import io.lbry.browser.exceptions.LbryioRequestException;
|
||||||
import io.lbry.browser.exceptions.LbryioResponseException;
|
import io.lbry.browser.exceptions.LbryioResponseException;
|
||||||
import io.lbry.browser.model.lbryinc.Subscription;
|
import io.lbry.browser.model.lbryinc.Subscription;
|
||||||
import io.lbry.browser.utils.Helper;
|
|
||||||
import io.lbry.browser.utils.LbryUri;
|
import io.lbry.browser.utils.LbryUri;
|
||||||
import io.lbry.browser.utils.Lbryio;
|
import io.lbry.browser.utils.Lbryio;
|
||||||
import okhttp3.Response;
|
|
||||||
|
|
||||||
// background task to create a diff of local and remote subscriptions and try to merge
|
// background task to create a diff of local and remote subscriptions and try to merge
|
||||||
public class MergeSubscriptionsTask extends AsyncTask<Void, Void, List<Subscription>> {
|
public class MergeSubscriptionsTask extends AsyncTask<Void, Void, List<Subscription>> {
|
||||||
private static final String TAG = "MergeSubscriptionsTask";
|
private static final String TAG = "MergeSubscriptionsTask";
|
||||||
private Context context;
|
private final Context context;
|
||||||
private List<Subscription> base;
|
private final List<Subscription> base;
|
||||||
private List<Subscription> diff;
|
private List<Subscription> diff;
|
||||||
private MergeSubscriptionsHandler handler;
|
private final MergeSubscriptionsHandler handler;
|
||||||
private Exception error;
|
private Exception error;
|
||||||
private boolean replaceLocal;
|
private final boolean replaceLocal;
|
||||||
|
|
||||||
public MergeSubscriptionsTask(List<Subscription> base, boolean replaceLocal, Context context, MergeSubscriptionsHandler handler) {
|
public MergeSubscriptionsTask(List<Subscription> base, boolean replaceLocal, Context context, MergeSubscriptionsHandler handler) {
|
||||||
this.base = base;
|
this.base = base;
|
||||||
|
@ -60,12 +56,12 @@ public class MergeSubscriptionsTask extends AsyncTask<Void, Void, List<Subscript
|
||||||
for (Subscription sub : base) {
|
for (Subscription sub : base) {
|
||||||
DatabaseHelper.createOrUpdateSubscription(sub, db);
|
DatabaseHelper.createOrUpdateSubscription(sub, db);
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
|
localSubs = DatabaseHelper.getSubscriptions(db);
|
||||||
localSubs = DatabaseHelper.getSubscriptions(db);
|
for (Subscription sub : localSubs) {
|
||||||
for (Subscription sub : localSubs) {
|
if (!combined.contains(sub)) {
|
||||||
if (!combined.contains(sub)) {
|
combined.add(sub);
|
||||||
combined.add(sub);
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -76,13 +72,15 @@ public class MergeSubscriptionsTask extends AsyncTask<Void, Void, List<Subscript
|
||||||
// check for any remote subs that may have been removed, and unsubscribe from them
|
// check for any remote subs that may have been removed, and unsubscribe from them
|
||||||
for (int i = 0; i < array.length(); i++) {
|
for (int i = 0; i < array.length(); i++) {
|
||||||
JSONObject item = array.getJSONObject(i);
|
JSONObject item = array.getJSONObject(i);
|
||||||
|
// TODO: Refactor by creating static Subscription.fromJSON method
|
||||||
String claimId = item.getString("claim_id");
|
String claimId = item.getString("claim_id");
|
||||||
String channelName = item.getString("channel_name");
|
String channelName = item.getString("channel_name");
|
||||||
|
boolean isNotificationsDisabled = item.getBoolean("is_notifications_disabled");
|
||||||
|
|
||||||
LbryUri url = new LbryUri();
|
LbryUri url = new LbryUri();
|
||||||
url.setChannelName(channelName);
|
url.setChannelName(channelName);
|
||||||
url.setClaimId(claimId);
|
url.setClaimId(claimId);
|
||||||
Subscription subscription = new Subscription(channelName, url.toString());
|
Subscription subscription = new Subscription(channelName, url.toString(), isNotificationsDisabled);
|
||||||
remoteSubs.add(subscription);
|
remoteSubs.add(subscription);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -113,13 +111,13 @@ public class MergeSubscriptionsTask extends AsyncTask<Void, Void, List<Subscript
|
||||||
diff.add(local);
|
diff.add(local);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
for (int i = 0; i < finalRemoteSubs.size(); i++) {
|
||||||
for (int i = 0; i < finalRemoteSubs.size(); i++) {
|
Subscription remote = finalRemoteSubs.get(i);
|
||||||
Subscription remote = finalRemoteSubs.get(i);
|
if (!combined.contains(remote)) {
|
||||||
if (!combined.contains(remote)) {
|
combined.add(remote);
|
||||||
combined.add(remote);
|
if (!diff.contains(remote)) {
|
||||||
if (!diff.contains(remote)) {
|
diff.add(remote);
|
||||||
diff.add(remote);
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,18 +4,15 @@ import android.os.AsyncTask;
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
import java.io.BufferedReader;
|
||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
||||||
import java.io.FileNotFoundException;
|
|
||||||
import java.io.FileReader;
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStreamReader;
|
import java.io.InputStreamReader;
|
||||||
import java.nio.Buffer;
|
|
||||||
|
|
||||||
import io.lbry.browser.utils.Helper;
|
import io.lbry.browser.utils.Helper;
|
||||||
|
|
||||||
public class ReadTextFileTask extends AsyncTask<Void, Void, String> {
|
public class ReadTextFileTask extends AsyncTask<Void, Void, String> {
|
||||||
private String filePath;
|
private final String filePath;
|
||||||
private Exception error;
|
private Exception error;
|
||||||
private ReadTextFileHandler handler;
|
private final ReadTextFileHandler handler;
|
||||||
public ReadTextFileTask(String filePath, ReadTextFileHandler handler) {
|
public ReadTextFileTask(String filePath, ReadTextFileHandler handler) {
|
||||||
this.filePath = filePath;
|
this.filePath = filePath;
|
||||||
this.handler = handler;
|
this.handler = handler;
|
||||||
|
|
|
@ -0,0 +1,8 @@
|
||||||
|
package io.lbry.browser.tasks;
|
||||||
|
|
||||||
|
import io.lbry.browser.model.lbryinc.RewardVerified;
|
||||||
|
|
||||||
|
public interface RewardVerifiedHandler {
|
||||||
|
void onSuccess(RewardVerified rewardVerified);
|
||||||
|
void onError(Exception error);
|
||||||
|
}
|
|
@ -9,9 +9,9 @@ import io.lbry.browser.exceptions.ApiCallException;
|
||||||
import io.lbry.browser.utils.Lbry;
|
import io.lbry.browser.utils.Lbry;
|
||||||
|
|
||||||
public class SetSdkSettingTask extends AsyncTask<Void, Void, Boolean> {
|
public class SetSdkSettingTask extends AsyncTask<Void, Void, Boolean> {
|
||||||
private String key;
|
private final String key;
|
||||||
private String value;
|
private final String value;
|
||||||
private GenericTaskHandler handler;
|
private final GenericTaskHandler handler;
|
||||||
private Exception error;
|
private Exception error;
|
||||||
public SetSdkSettingTask(String key, String value, GenericTaskHandler handler) {
|
public SetSdkSettingTask(String key, String value, GenericTaskHandler handler) {
|
||||||
this.key = key;
|
this.key = key;
|
||||||
|
|
|
@ -0,0 +1,8 @@
|
||||||
|
package io.lbry.browser.tasks;
|
||||||
|
|
||||||
|
import io.lbry.browser.model.TwitterOauth;
|
||||||
|
|
||||||
|
public interface TwitterOauthHandler {
|
||||||
|
void onSuccess(TwitterOauth twitterOauth);
|
||||||
|
void onError(Exception error);
|
||||||
|
}
|
|
@ -13,13 +13,13 @@ import io.lbry.browser.utils.Lbry;
|
||||||
|
|
||||||
public class UpdateSuggestedTagsTask extends AsyncTask<Void, Void, List<Tag>> {
|
public class UpdateSuggestedTagsTask extends AsyncTask<Void, Void, List<Tag>> {
|
||||||
|
|
||||||
private boolean clearPrevious;
|
private final boolean clearPrevious;
|
||||||
private boolean excludeMature;
|
private final boolean excludeMature;
|
||||||
private int limit;
|
private final int limit;
|
||||||
private String filter;
|
private final String filter;
|
||||||
private TagListAdapter addedTagsAdapter;
|
private final TagListAdapter addedTagsAdapter;
|
||||||
private TagListAdapter suggestedTagsAdapter;
|
private final TagListAdapter suggestedTagsAdapter;
|
||||||
private KnownTagsHandler handler;
|
private final KnownTagsHandler handler;
|
||||||
|
|
||||||
public UpdateSuggestedTagsTask(
|
public UpdateSuggestedTagsTask(
|
||||||
String filter,
|
String filter,
|
||||||
|
|
|
@ -21,9 +21,9 @@ import okhttp3.RequestBody;
|
||||||
import okhttp3.Response;
|
import okhttp3.Response;
|
||||||
|
|
||||||
public class UploadImageTask extends AsyncTask<Void, Void, String> {
|
public class UploadImageTask extends AsyncTask<Void, Void, String> {
|
||||||
private String filePath;
|
private final String filePath;
|
||||||
private View progressView;
|
private final View progressView;
|
||||||
private UploadThumbnailHandler handler;
|
private final UploadThumbnailHandler handler;
|
||||||
private Exception error;
|
private Exception error;
|
||||||
|
|
||||||
public UploadImageTask(String filePath, View progressView, UploadThumbnailHandler handler) {
|
public UploadImageTask(String filePath, View progressView, UploadThumbnailHandler handler) {
|
||||||
|
|
|
@ -11,17 +11,16 @@ import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import io.lbry.browser.exceptions.ApiCallException;
|
import io.lbry.browser.exceptions.ApiCallException;
|
||||||
import io.lbry.browser.tasks.GenericTaskHandler;
|
|
||||||
import io.lbry.browser.utils.Helper;
|
import io.lbry.browser.utils.Helper;
|
||||||
import io.lbry.browser.utils.Lbry;
|
import io.lbry.browser.utils.Lbry;
|
||||||
|
|
||||||
public class AbandonChannelTask extends AsyncTask<Void, Void, Boolean> {
|
public class AbandonChannelTask extends AsyncTask<Void, Void, Boolean> {
|
||||||
private List<String> claimIds;
|
private final List<String> claimIds;
|
||||||
private List<String> successfulClaimIds;
|
private List<String> successfulClaimIds;
|
||||||
private List<String> failedClaimIds;
|
private List<String> failedClaimIds;
|
||||||
private List<Exception> failedExceptions;
|
private List<Exception> failedExceptions;
|
||||||
private View progressView;
|
private final View progressView;
|
||||||
private AbandonHandler handler;
|
private final AbandonHandler handler;
|
||||||
|
|
||||||
public AbandonChannelTask(List<String> claimIds, View progressView, AbandonHandler handler) {
|
public AbandonChannelTask(List<String> claimIds, View progressView, AbandonHandler handler) {
|
||||||
this.claimIds = claimIds;
|
this.claimIds = claimIds;
|
||||||
|
|
|
@ -11,17 +11,16 @@ import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import io.lbry.browser.exceptions.ApiCallException;
|
import io.lbry.browser.exceptions.ApiCallException;
|
||||||
import io.lbry.browser.tasks.GenericTaskHandler;
|
|
||||||
import io.lbry.browser.utils.Helper;
|
import io.lbry.browser.utils.Helper;
|
||||||
import io.lbry.browser.utils.Lbry;
|
import io.lbry.browser.utils.Lbry;
|
||||||
|
|
||||||
public class AbandonStreamTask extends AsyncTask<Void, Void, Boolean> {
|
public class AbandonStreamTask extends AsyncTask<Void, Void, Boolean> {
|
||||||
private List<String> claimIds;
|
private final List<String> claimIds;
|
||||||
private List<String> successfulClaimIds;
|
private List<String> successfulClaimIds;
|
||||||
private List<String> failedClaimIds;
|
private List<String> failedClaimIds;
|
||||||
private List<Exception> failedExceptions;
|
private List<Exception> failedExceptions;
|
||||||
private View progressView;
|
private final View progressView;
|
||||||
private AbandonHandler handler;
|
private final AbandonHandler handler;
|
||||||
|
|
||||||
public AbandonStreamTask(List<String> claimIds, View progressView, AbandonHandler handler) {
|
public AbandonStreamTask(List<String> claimIds, View progressView, AbandonHandler handler) {
|
||||||
this.claimIds = claimIds;
|
this.claimIds = claimIds;
|
||||||
|
|
|
@ -21,12 +21,12 @@ import io.lbry.browser.utils.Helper;
|
||||||
import io.lbry.browser.utils.Lbry;
|
import io.lbry.browser.utils.Lbry;
|
||||||
|
|
||||||
public class ChannelCreateUpdateTask extends AsyncTask<Void, Void, Claim> {
|
public class ChannelCreateUpdateTask extends AsyncTask<Void, Void, Claim> {
|
||||||
private Claim claim;
|
private final Claim claim;
|
||||||
private BigDecimal deposit;
|
private final BigDecimal deposit;
|
||||||
private boolean update;
|
private final boolean update;
|
||||||
private Exception error;
|
private Exception error;
|
||||||
private ClaimResultHandler handler;
|
private final ClaimResultHandler handler;
|
||||||
private View progressView;
|
private final View progressView;
|
||||||
|
|
||||||
public ChannelCreateUpdateTask(Claim claim, BigDecimal deposit, boolean update, View progressView, ClaimResultHandler handler) {
|
public ChannelCreateUpdateTask(Claim claim, BigDecimal deposit, boolean update, View progressView, ClaimResultHandler handler) {
|
||||||
this.claim = claim;
|
this.claim = claim;
|
||||||
|
|
|
@ -19,9 +19,9 @@ import io.lbry.browser.utils.Helper;
|
||||||
import io.lbry.browser.utils.Lbry;
|
import io.lbry.browser.utils.Lbry;
|
||||||
|
|
||||||
public class ClaimListTask extends AsyncTask<Void, Void, List<Claim>> {
|
public class ClaimListTask extends AsyncTask<Void, Void, List<Claim>> {
|
||||||
private List<String> types;
|
private final List<String> types;
|
||||||
private View progressView;
|
private final View progressView;
|
||||||
private ClaimListResultHandler handler;
|
private final ClaimListResultHandler handler;
|
||||||
private Exception error;
|
private Exception error;
|
||||||
|
|
||||||
public ClaimListTask(String type, View progressView, ClaimListResultHandler handler) {
|
public ClaimListTask(String type, View progressView, ClaimListResultHandler handler) {
|
||||||
|
|
|
@ -12,10 +12,10 @@ import io.lbry.browser.utils.Helper;
|
||||||
import io.lbry.browser.utils.Lbry;
|
import io.lbry.browser.utils.Lbry;
|
||||||
|
|
||||||
public class ClaimSearchTask extends AsyncTask<Void, Void, List<Claim>> {
|
public class ClaimSearchTask extends AsyncTask<Void, Void, List<Claim>> {
|
||||||
private Map<String, Object> options;
|
private final Map<String, Object> options;
|
||||||
private String connectionString;
|
private final String connectionString;
|
||||||
private ClaimSearchResultHandler handler;
|
private final ClaimSearchResultHandler handler;
|
||||||
private View progressView;
|
private final View progressView;
|
||||||
private ApiCallException error;
|
private ApiCallException error;
|
||||||
|
|
||||||
public ClaimSearchTask(Map<String, Object> options, String connectionString, View progressView, ClaimSearchResultHandler handler) {
|
public ClaimSearchTask(Map<String, Object> options, String connectionString, View progressView, ClaimSearchResultHandler handler) {
|
||||||
|
|
|
@ -21,10 +21,10 @@ import io.lbry.browser.utils.Helper;
|
||||||
import io.lbry.browser.utils.Lbry;
|
import io.lbry.browser.utils.Lbry;
|
||||||
|
|
||||||
public class PublishClaimTask extends AsyncTask<Void, Void, Claim> {
|
public class PublishClaimTask extends AsyncTask<Void, Void, Claim> {
|
||||||
private Claim claim;
|
private final Claim claim;
|
||||||
private String filePath;
|
private final String filePath;
|
||||||
private View progressView;
|
private final View progressView;
|
||||||
private ClaimResultHandler handler;
|
private final ClaimResultHandler handler;
|
||||||
private Exception error;
|
private Exception error;
|
||||||
public PublishClaimTask(Claim claim, String filePath, View progressView, ClaimResultHandler handler) {
|
public PublishClaimTask(Claim claim, String filePath, View progressView, ClaimResultHandler handler) {
|
||||||
this.claim = claim;
|
this.claim = claim;
|
||||||
|
|
|
@ -21,8 +21,8 @@ public class PurchaseListTask extends AsyncTask<Void, Void, List<Claim>> {
|
||||||
private String claimId;
|
private String claimId;
|
||||||
private int page;
|
private int page;
|
||||||
private int pageSize;
|
private int pageSize;
|
||||||
private ClaimSearchResultHandler handler;
|
private final ClaimSearchResultHandler handler;
|
||||||
private View progressView;
|
private final View progressView;
|
||||||
private Exception error;
|
private Exception error;
|
||||||
|
|
||||||
public PurchaseListTask(String claimId, View progressView, ClaimSearchResultHandler handler) {
|
public PurchaseListTask(String claimId, View progressView, ClaimSearchResultHandler handler) {
|
||||||
|
|
|
@ -13,10 +13,10 @@ import io.lbry.browser.utils.Helper;
|
||||||
import io.lbry.browser.utils.Lbry;
|
import io.lbry.browser.utils.Lbry;
|
||||||
|
|
||||||
public class ResolveTask extends AsyncTask<Void, Void, List<Claim>> {
|
public class ResolveTask extends AsyncTask<Void, Void, List<Claim>> {
|
||||||
private List<String> urls;
|
private final List<String> urls;
|
||||||
private String connectionString;
|
private final String connectionString;
|
||||||
private ClaimListResultHandler handler;
|
private final ClaimListResultHandler handler;
|
||||||
private View progressView;
|
private final View progressView;
|
||||||
private ApiCallException error;
|
private ApiCallException error;
|
||||||
|
|
||||||
public ResolveTask(String url, String connectionString, View progressView, ClaimListResultHandler handler) {
|
public ResolveTask(String url, String connectionString, View progressView, ClaimListResultHandler handler) {
|
||||||
|
|
|
@ -20,12 +20,12 @@ import io.lbry.browser.utils.Helper;
|
||||||
import io.lbry.browser.utils.Lbry;
|
import io.lbry.browser.utils.Lbry;
|
||||||
|
|
||||||
public class StreamRepostTask extends AsyncTask<Void, Void, Claim> {
|
public class StreamRepostTask extends AsyncTask<Void, Void, Claim> {
|
||||||
private String name;
|
private final String name;
|
||||||
private BigDecimal bid;
|
private final BigDecimal bid;
|
||||||
private String claimId;
|
private final String claimId;
|
||||||
private String channelId;
|
private final String channelId;
|
||||||
private View progressView;
|
private final View progressView;
|
||||||
private ClaimResultHandler handler;
|
private final ClaimResultHandler handler;
|
||||||
private Exception error;
|
private Exception error;
|
||||||
|
|
||||||
public StreamRepostTask(String name, BigDecimal bid, String claimId, String channelId, View progressView, ClaimResultHandler handler) {
|
public StreamRepostTask(String name, BigDecimal bid, String claimId, String channelId, View progressView, ClaimResultHandler handler) {
|
||||||
|
|
|
@ -7,12 +7,11 @@ import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import io.lbry.browser.exceptions.ApiCallException;
|
import io.lbry.browser.exceptions.ApiCallException;
|
||||||
import io.lbry.browser.tasks.GenericTaskHandler;
|
|
||||||
import io.lbry.browser.utils.Lbry;
|
import io.lbry.browser.utils.Lbry;
|
||||||
|
|
||||||
// Just run delete on the specified claim IDs (no need for a handler)
|
// Just run delete on the specified claim IDs (no need for a handler)
|
||||||
public class BulkDeleteFilesTask extends AsyncTask<Void, Void, Boolean> {
|
public class BulkDeleteFilesTask extends AsyncTask<Void, Void, Boolean> {
|
||||||
private List<String> claimIds;
|
private final List<String> claimIds;
|
||||||
public BulkDeleteFilesTask(List<String> claimIds) {
|
public BulkDeleteFilesTask(List<String> claimIds) {
|
||||||
this.claimIds = claimIds;
|
this.claimIds = claimIds;
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,9 +10,9 @@ import io.lbry.browser.tasks.GenericTaskHandler;
|
||||||
import io.lbry.browser.utils.Lbry;
|
import io.lbry.browser.utils.Lbry;
|
||||||
|
|
||||||
public class DeleteFileTask extends AsyncTask<Void, Void, Boolean> {
|
public class DeleteFileTask extends AsyncTask<Void, Void, Boolean> {
|
||||||
private String claimId;
|
private final String claimId;
|
||||||
private Exception error;
|
private Exception error;
|
||||||
private GenericTaskHandler handler;
|
private final GenericTaskHandler handler;
|
||||||
|
|
||||||
public DeleteFileTask(String claimId, GenericTaskHandler handler) {
|
public DeleteFileTask(String claimId, GenericTaskHandler handler) {
|
||||||
this.claimId = claimId;
|
this.claimId = claimId;
|
||||||
|
|
|
@ -11,12 +11,12 @@ import io.lbry.browser.utils.Helper;
|
||||||
import io.lbry.browser.utils.Lbry;
|
import io.lbry.browser.utils.Lbry;
|
||||||
|
|
||||||
public class FileListTask extends AsyncTask<Void, Void, List<LbryFile>> {
|
public class FileListTask extends AsyncTask<Void, Void, List<LbryFile>> {
|
||||||
private String claimId;
|
private final String claimId;
|
||||||
private boolean downloads;
|
private boolean downloads;
|
||||||
private int page;
|
private int page;
|
||||||
private int pageSize;
|
private int pageSize;
|
||||||
private FileListResultHandler handler;
|
private final FileListResultHandler handler;
|
||||||
private View progressView;
|
private final View progressView;
|
||||||
private ApiCallException error;
|
private ApiCallException error;
|
||||||
|
|
||||||
public FileListTask(int page, int pageSize, boolean downloads, View progressView, FileListResultHandler handler) {
|
public FileListTask(int page, int pageSize, boolean downloads, View progressView, FileListResultHandler handler) {
|
||||||
|
|
|
@ -14,10 +14,10 @@ import io.lbry.browser.utils.Helper;
|
||||||
import io.lbry.browser.utils.Lbry;
|
import io.lbry.browser.utils.Lbry;
|
||||||
|
|
||||||
public class GetFileTask extends AsyncTask<Void, Void, LbryFile> {
|
public class GetFileTask extends AsyncTask<Void, Void, LbryFile> {
|
||||||
private String uri;
|
private final String uri;
|
||||||
private boolean saveFile;
|
private final boolean saveFile;
|
||||||
private View progressView;
|
private final View progressView;
|
||||||
private GetFileHandler handler;
|
private final GetFileHandler handler;
|
||||||
private Exception error;
|
private Exception error;
|
||||||
|
|
||||||
public GetFileTask(String uri, boolean saveFile, View progressView, GetFileHandler handler) {
|
public GetFileTask(String uri, boolean saveFile, View progressView, GetFileHandler handler) {
|
||||||
|
|
|
@ -0,0 +1,66 @@
|
||||||
|
package io.lbry.browser.tasks.lbryinc;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.os.AsyncTask;
|
||||||
|
import android.view.View;
|
||||||
|
|
||||||
|
import com.google.gson.FieldNamingPolicy;
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import com.google.gson.GsonBuilder;
|
||||||
|
import com.google.gson.reflect.TypeToken;
|
||||||
|
|
||||||
|
import org.json.JSONObject;
|
||||||
|
|
||||||
|
import java.lang.reflect.Type;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import io.lbry.browser.model.lbryinc.RewardVerified;
|
||||||
|
import io.lbry.browser.tasks.RewardVerifiedHandler;
|
||||||
|
import io.lbry.browser.utils.Helper;
|
||||||
|
import io.lbry.browser.utils.Lbryio;
|
||||||
|
|
||||||
|
public class AndroidPurchaseTask extends AsyncTask<Void, Void, RewardVerified> {
|
||||||
|
private final Context context;
|
||||||
|
private final View progressView;
|
||||||
|
private final String purchaseToken;
|
||||||
|
private final RewardVerifiedHandler handler;
|
||||||
|
private Exception error;
|
||||||
|
|
||||||
|
public AndroidPurchaseTask(String purchaseToken, View progressView, Context context, RewardVerifiedHandler handler) {
|
||||||
|
this.purchaseToken = purchaseToken;
|
||||||
|
this.progressView = progressView;
|
||||||
|
this.context = context;
|
||||||
|
this.handler = handler;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void onPreExecute() {
|
||||||
|
Helper.setViewVisibility(progressView, View.VISIBLE);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected RewardVerified doInBackground(Void... params) {
|
||||||
|
try {
|
||||||
|
Map<String, String> options = new HashMap<>();
|
||||||
|
options.put("purchase_token", purchaseToken);
|
||||||
|
|
||||||
|
JSONObject object = (JSONObject) Lbryio.parseResponse(Lbryio.call("verification", "android_purchase", options, context));
|
||||||
|
Type type = new TypeToken<RewardVerified>(){}.getType();
|
||||||
|
Gson gson = new GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create();
|
||||||
|
return gson.fromJson(object.toString(), type);
|
||||||
|
} catch (Exception ex) {
|
||||||
|
error = ex;
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void onPostExecute(RewardVerified result) {
|
||||||
|
Helper.setViewVisibility(progressView, View.GONE);
|
||||||
|
if (handler != null) {
|
||||||
|
if (result != null) {
|
||||||
|
handler.onSuccess(result);
|
||||||
|
} else {
|
||||||
|
handler.onError(error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -13,16 +13,15 @@ import io.lbry.browser.data.DatabaseHelper;
|
||||||
import io.lbry.browser.exceptions.LbryioRequestException;
|
import io.lbry.browser.exceptions.LbryioRequestException;
|
||||||
import io.lbry.browser.exceptions.LbryioResponseException;
|
import io.lbry.browser.exceptions.LbryioResponseException;
|
||||||
import io.lbry.browser.model.lbryinc.Subscription;
|
import io.lbry.browser.model.lbryinc.Subscription;
|
||||||
import io.lbry.browser.utils.Helper;
|
|
||||||
import io.lbry.browser.utils.Lbryio;
|
import io.lbry.browser.utils.Lbryio;
|
||||||
|
|
||||||
public class ChannelSubscribeTask extends AsyncTask<Void, Void, Boolean> {
|
public class ChannelSubscribeTask extends AsyncTask<Void, Void, Boolean> {
|
||||||
private Context context;
|
private final Context context;
|
||||||
private String channelClaimId;
|
private final String channelClaimId;
|
||||||
private Subscription subscription;
|
private final Subscription subscription;
|
||||||
private ChannelSubscribeHandler handler;
|
private final ChannelSubscribeHandler handler;
|
||||||
private Exception error;
|
private Exception error;
|
||||||
private boolean isUnsubscribing;
|
private final boolean isUnsubscribing;
|
||||||
|
|
||||||
public ChannelSubscribeTask(Context context, String channelClaimId, Subscription subscription, boolean isUnsubscribing, ChannelSubscribeHandler handler) {
|
public ChannelSubscribeTask(Context context, String channelClaimId, Subscription subscription, boolean isUnsubscribing, ChannelSubscribeHandler handler) {
|
||||||
this.context = context;
|
this.context = context;
|
||||||
|
@ -51,11 +50,11 @@ public class ChannelSubscribeTask extends AsyncTask<Void, Void, Boolean> {
|
||||||
options.put("claim_id", channelClaimId);
|
options.put("claim_id", channelClaimId);
|
||||||
if (!isUnsubscribing) {
|
if (!isUnsubscribing) {
|
||||||
options.put("channel_name", subscription.getChannelName());
|
options.put("channel_name", subscription.getChannelName());
|
||||||
|
options.put("notifications_disabled", String.valueOf(subscription.isNotificationsDisabled()).toLowerCase());
|
||||||
}
|
}
|
||||||
|
|
||||||
String action = isUnsubscribing ? "delete" : "new";
|
String action = isUnsubscribing ? "delete" : "new";
|
||||||
Lbryio.call("subscription", action, options, context);
|
Object response = Lbryio.parseResponse(Lbryio.call("subscription", action, options, context));
|
||||||
|
|
||||||
if (!isUnsubscribing) {
|
if (!isUnsubscribing) {
|
||||||
Lbryio.addSubscription(subscription);
|
Lbryio.addSubscription(subscription);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -9,7 +9,6 @@ import org.json.JSONException;
|
||||||
import org.json.JSONObject;
|
import org.json.JSONObject;
|
||||||
|
|
||||||
import java.text.DecimalFormat;
|
import java.text.DecimalFormat;
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
@ -25,12 +24,12 @@ import io.lbry.browser.utils.Lbryio;
|
||||||
|
|
||||||
public class ClaimRewardTask extends AsyncTask<Void, Void, String> {
|
public class ClaimRewardTask extends AsyncTask<Void, Void, String> {
|
||||||
|
|
||||||
private Context context;
|
private final Context context;
|
||||||
private String type;
|
private final String type;
|
||||||
private String rewardCode;
|
private final String rewardCode;
|
||||||
private View progressView;
|
private final View progressView;
|
||||||
private double amountClaimed;
|
private double amountClaimed;
|
||||||
private ClaimRewardHandler handler;
|
private final ClaimRewardHandler handler;
|
||||||
private Exception error;
|
private Exception error;
|
||||||
|
|
||||||
public ClaimRewardTask(String type, String rewardCode, View progressView, Context context, ClaimRewardHandler handler) {
|
public ClaimRewardTask(String type, String rewardCode, View progressView, Context context, ClaimRewardHandler handler) {
|
||||||
|
|
|
@ -7,9 +7,9 @@ import io.lbry.browser.model.lbryinc.User;
|
||||||
import io.lbry.browser.utils.Lbryio;
|
import io.lbry.browser.utils.Lbryio;
|
||||||
|
|
||||||
public class FetchCurrentUserTask extends AsyncTask<Void, Void, User> {
|
public class FetchCurrentUserTask extends AsyncTask<Void, Void, User> {
|
||||||
private Context context;
|
private final Context context;
|
||||||
private Exception error;
|
private Exception error;
|
||||||
private FetchUserTaskHandler handler;
|
private final FetchUserTaskHandler handler;
|
||||||
|
|
||||||
public FetchCurrentUserTask(Context context, FetchUserTaskHandler handler) {
|
public FetchCurrentUserTask(Context context, FetchUserTaskHandler handler) {
|
||||||
this.context = context;
|
this.context = context;
|
||||||
|
|
|
@ -17,8 +17,8 @@ import io.lbry.browser.utils.Helper;
|
||||||
import io.lbry.browser.utils.Lbryio;
|
import io.lbry.browser.utils.Lbryio;
|
||||||
|
|
||||||
public class FetchInviteStatusTask extends AsyncTask<Void, Void, List<Invitee>> {
|
public class FetchInviteStatusTask extends AsyncTask<Void, Void, List<Invitee>> {
|
||||||
private FetchInviteStatusHandler handler;
|
private final FetchInviteStatusHandler handler;
|
||||||
private View progressView;
|
private final View progressView;
|
||||||
private Exception error;
|
private Exception error;
|
||||||
|
|
||||||
public FetchInviteStatusTask(View progressView, FetchInviteStatusHandler handler) {
|
public FetchInviteStatusTask(View progressView, FetchInviteStatusHandler handler) {
|
||||||
|
|
|
@ -12,8 +12,8 @@ import io.lbry.browser.utils.Helper;
|
||||||
import io.lbry.browser.utils.Lbryio;
|
import io.lbry.browser.utils.Lbryio;
|
||||||
|
|
||||||
public class FetchReferralCodeTask extends AsyncTask<Void, Void, String> {
|
public class FetchReferralCodeTask extends AsyncTask<Void, Void, String> {
|
||||||
private FetchReferralCodeHandler handler;
|
private final FetchReferralCodeHandler handler;
|
||||||
private View progressView;
|
private final View progressView;
|
||||||
private Exception error;
|
private Exception error;
|
||||||
|
|
||||||
public FetchReferralCodeTask(View progressView, FetchReferralCodeHandler handler) {
|
public FetchReferralCodeTask(View progressView, FetchReferralCodeHandler handler) {
|
||||||
|
|
|
@ -18,8 +18,8 @@ import io.lbry.browser.utils.Helper;
|
||||||
import io.lbry.browser.utils.Lbryio;
|
import io.lbry.browser.utils.Lbryio;
|
||||||
|
|
||||||
public class FetchRewardsTask extends AsyncTask<Void, Void, List<Reward>> {
|
public class FetchRewardsTask extends AsyncTask<Void, Void, List<Reward>> {
|
||||||
private FetchRewardsHandler handler;
|
private final FetchRewardsHandler handler;
|
||||||
private View progressView;
|
private final View progressView;
|
||||||
private Exception error;
|
private Exception error;
|
||||||
|
|
||||||
public FetchRewardsTask(View progressView, FetchRewardsHandler handler) {
|
public FetchRewardsTask(View progressView, FetchRewardsHandler handler) {
|
||||||
|
|
|
@ -15,10 +15,10 @@ public class FetchStatCountTask extends AsyncTask<Void, Void, Integer> {
|
||||||
public static final int STAT_VIEW_COUNT = 1;
|
public static final int STAT_VIEW_COUNT = 1;
|
||||||
public static final int STAT_SUB_COUNT = 2;
|
public static final int STAT_SUB_COUNT = 2;
|
||||||
|
|
||||||
private String claimId;
|
private final String claimId;
|
||||||
private int stat;
|
private final int stat;
|
||||||
private FetchStatCountHandler handler;
|
private final FetchStatCountHandler handler;
|
||||||
private View progressView;
|
private final View progressView;
|
||||||
private Exception error;
|
private Exception error;
|
||||||
|
|
||||||
public FetchStatCountTask(int stat, String claimId, View progressView, FetchStatCountHandler handler) {
|
public FetchStatCountTask(int stat, String claimId, View progressView, FetchStatCountHandler handler) {
|
||||||
|
|
|
@ -23,9 +23,9 @@ import io.lbry.browser.utils.LbryUri;
|
||||||
import io.lbry.browser.utils.Lbryio;
|
import io.lbry.browser.utils.Lbryio;
|
||||||
|
|
||||||
public class FetchSubscriptionsTask extends AsyncTask<Void, Void, List<Subscription>> {
|
public class FetchSubscriptionsTask extends AsyncTask<Void, Void, List<Subscription>> {
|
||||||
private Context context;
|
private final Context context;
|
||||||
private FetchSubscriptionsHandler handler;
|
private final FetchSubscriptionsHandler handler;
|
||||||
private ProgressBar progressBar;
|
private final ProgressBar progressBar;
|
||||||
private Exception error;
|
private Exception error;
|
||||||
|
|
||||||
public FetchSubscriptionsTask(Context context, ProgressBar progressBar, FetchSubscriptionsHandler handler) {
|
public FetchSubscriptionsTask(Context context, ProgressBar progressBar, FetchSubscriptionsHandler handler) {
|
||||||
|
@ -49,11 +49,12 @@ public class FetchSubscriptionsTask extends AsyncTask<Void, Void, List<Subscript
|
||||||
JSONObject item = array.getJSONObject(i);
|
JSONObject item = array.getJSONObject(i);
|
||||||
String claimId = item.getString("claim_id");
|
String claimId = item.getString("claim_id");
|
||||||
String channelName = item.getString("channel_name");
|
String channelName = item.getString("channel_name");
|
||||||
|
boolean isNotificationsDisabled = item.getBoolean("is_notifications_disabled");
|
||||||
|
|
||||||
LbryUri url = new LbryUri();
|
LbryUri url = new LbryUri();
|
||||||
url.setChannelName(channelName);
|
url.setChannelName(channelName);
|
||||||
url.setClaimId(claimId);
|
url.setClaimId(claimId);
|
||||||
Subscription subscription = new Subscription(channelName, url.toString());
|
Subscription subscription = new Subscription(channelName, url.toString(), isNotificationsDisabled);
|
||||||
subscriptions.add(subscription);
|
subscriptions.add(subscription);
|
||||||
// Persist the subscription locally if it doesn't exist
|
// Persist the subscription locally if it doesn't exist
|
||||||
if (db != null) {
|
if (db != null) {
|
||||||
|
|
|
@ -14,9 +14,9 @@ import io.lbry.browser.utils.Helper;
|
||||||
import io.lbry.browser.utils.Lbryio;
|
import io.lbry.browser.utils.Lbryio;
|
||||||
|
|
||||||
public class InviteByEmailTask extends AsyncTask<Void, Void, Boolean> {
|
public class InviteByEmailTask extends AsyncTask<Void, Void, Boolean> {
|
||||||
private String email;
|
private final String email;
|
||||||
private View progressView;
|
private final View progressView;
|
||||||
private GenericTaskHandler handler;
|
private final GenericTaskHandler handler;
|
||||||
private Exception error;
|
private Exception error;
|
||||||
|
|
||||||
public InviteByEmailTask(String email, View progressView, GenericTaskHandler handler) {
|
public InviteByEmailTask(String email, View progressView, GenericTaskHandler handler) {
|
||||||
|
|
|
@ -2,24 +2,21 @@ package io.lbry.browser.tasks.lbryinc;
|
||||||
|
|
||||||
import android.os.AsyncTask;
|
import android.os.AsyncTask;
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.concurrent.Executor;
|
|
||||||
|
|
||||||
import io.lbry.browser.exceptions.LbryioRequestException;
|
import io.lbry.browser.exceptions.LbryioRequestException;
|
||||||
import io.lbry.browser.exceptions.LbryioResponseException;
|
import io.lbry.browser.exceptions.LbryioResponseException;
|
||||||
import io.lbry.browser.model.Claim;
|
import io.lbry.browser.model.Claim;
|
||||||
import io.lbry.browser.tasks.GenericTaskHandler;
|
import io.lbry.browser.tasks.GenericTaskHandler;
|
||||||
import io.lbry.browser.utils.Lbryio;
|
import io.lbry.browser.utils.Lbryio;
|
||||||
import okhttp3.Response;
|
|
||||||
|
|
||||||
public class LogFileViewTask extends AsyncTask<Void, Void, Boolean> {
|
public class LogFileViewTask extends AsyncTask<Void, Void, Boolean> {
|
||||||
private String uri;
|
private final String uri;
|
||||||
private Claim claim;
|
private final Claim claim;
|
||||||
private Exception error;
|
private Exception error;
|
||||||
private GenericTaskHandler handler;
|
private final GenericTaskHandler handler;
|
||||||
private long timeToStart;
|
private final long timeToStart;
|
||||||
|
|
||||||
public LogFileViewTask(String uri, Claim claim, long timeToStart, GenericTaskHandler handler) {
|
public LogFileViewTask(String uri, Claim claim, long timeToStart, GenericTaskHandler handler) {
|
||||||
this.uri = uri;
|
this.uri = uri;
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue