mirror of
https://github.com/kiwix/kiwix-android.git
synced 2025-09-18 11:55:38 -04:00
Add new objectbox databases and replace usages of old dbs. Use Kapt for annotationProcesing. Raise MinSDK. Add timeouts to network requests.
This commit is contained in:
parent
9a3d44b77f
commit
a892668acb
@ -16,8 +16,10 @@ buildscript {
|
|||||||
apply plugin: 'com.android.application'
|
apply plugin: 'com.android.application'
|
||||||
apply plugin: 'kotlin-android'
|
apply plugin: 'kotlin-android'
|
||||||
apply plugin: 'kotlin-android-extensions'
|
apply plugin: 'kotlin-android-extensions'
|
||||||
|
apply plugin: 'kotlin-kapt'
|
||||||
apply plugin: 'checkstyle'
|
apply plugin: 'checkstyle'
|
||||||
apply plugin: 'testdroid'
|
apply plugin: 'testdroid'
|
||||||
|
apply plugin: 'io.objectbox'
|
||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
@ -29,7 +31,6 @@ repositories {
|
|||||||
}
|
}
|
||||||
|
|
||||||
String[] archs = ['arm64-v8a', 'armeabi', 'mips', 'mips64', 'x86', 'x86_64']
|
String[] archs = ['arm64-v8a', 'armeabi', 'mips', 'mips64', 'x86', 'x86_64']
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
|
||||||
// Get kiwixlib online if it is not populated locally
|
// Get kiwixlib online if it is not populated locally
|
||||||
@ -79,14 +80,14 @@ dependencies {
|
|||||||
androidTestCompileOnly "javax.annotation:javax.annotation-api:$javaxAnnotationVersion"
|
androidTestCompileOnly "javax.annotation:javax.annotation-api:$javaxAnnotationVersion"
|
||||||
implementation "com.google.dagger:dagger:$daggerVersion"
|
implementation "com.google.dagger:dagger:$daggerVersion"
|
||||||
implementation "com.google.dagger:dagger-android:$daggerVersion"
|
implementation "com.google.dagger:dagger-android:$daggerVersion"
|
||||||
annotationProcessor "com.google.dagger:dagger-compiler:$daggerVersion"
|
kapt "com.google.dagger:dagger-compiler:$daggerVersion"
|
||||||
annotationProcessor "com.google.dagger:dagger-android-processor:$daggerVersion"
|
kapt "com.google.dagger:dagger-android-processor:$daggerVersion"
|
||||||
androidTestAnnotationProcessor "com.google.dagger:dagger-compiler:$daggerVersion"
|
kaptAndroidTest "com.google.dagger:dagger-compiler:$daggerVersion"
|
||||||
|
|
||||||
// SquiDB
|
// SquiDB
|
||||||
implementation 'com.yahoo.squidb:squidb:2.0.0'
|
implementation 'com.yahoo.squidb:squidb:2.0.0'
|
||||||
implementation 'com.yahoo.squidb:squidb-annotations:2.0.0'
|
implementation 'com.yahoo.squidb:squidb-annotations:2.0.0'
|
||||||
annotationProcessor 'com.yahoo.squidb:squidb-processor:2.0.0'
|
kapt 'com.yahoo.squidb:squidb-processor:2.0.0'
|
||||||
|
|
||||||
// Square
|
// Square
|
||||||
implementation "com.squareup.okhttp3:okhttp:$okHttpVersion"
|
implementation "com.squareup.okhttp3:okhttp:$okHttpVersion"
|
||||||
@ -102,7 +103,7 @@ dependencies {
|
|||||||
|
|
||||||
// Butterknife
|
// Butterknife
|
||||||
implementation 'com.jakewharton:butterknife:8.0.1'
|
implementation 'com.jakewharton:butterknife:8.0.1'
|
||||||
annotationProcessor 'com.jakewharton:butterknife-compiler:8.0.1'
|
kapt 'com.jakewharton:butterknife-compiler:8.0.1'
|
||||||
|
|
||||||
// RxJava
|
// RxJava
|
||||||
implementation "io.reactivex.rxjava2:rxandroid:$rxAndroidVersion"
|
implementation "io.reactivex.rxjava2:rxandroid:$rxAndroidVersion"
|
||||||
@ -133,6 +134,8 @@ dependencies {
|
|||||||
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
|
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
|
||||||
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
|
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
|
||||||
implementation "android.arch.lifecycle:extensions:1.1.1"
|
implementation "android.arch.lifecycle:extensions:1.1.1"
|
||||||
|
implementation "io.objectbox:objectbox-kotlin:$objectboxVersion"
|
||||||
|
implementation "io.objectbox:objectbox-rxjava:$objectboxVersion"
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set custom app import directory
|
// Set custom app import directory
|
||||||
@ -158,7 +161,7 @@ android {
|
|||||||
compileSdkVersion 27
|
compileSdkVersion 27
|
||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
minSdkVersion 14
|
minSdkVersion 15
|
||||||
targetSdkVersion 27
|
targetSdkVersion 27
|
||||||
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
|
||||||
// See https://github.com/linkedin/dexmaker/issues/65 for why we need the following line.
|
// See https://github.com/linkedin/dexmaker/issues/65 for why we need the following line.
|
||||||
|
203
app/objectbox-models/default.json
Normal file
203
app/objectbox-models/default.json
Normal file
@ -0,0 +1,203 @@
|
|||||||
|
{
|
||||||
|
"_note1": "KEEP THIS FILE! Check it into a version control system (VCS) like git.",
|
||||||
|
"_note2": "ObjectBox manages crucial IDs for your object model. See docs for details.",
|
||||||
|
"_note3": "If you have VCS merge conflicts, you must resolve them according to ObjectBox docs.",
|
||||||
|
"entities": [
|
||||||
|
{
|
||||||
|
"id": "1:7257718270326155947",
|
||||||
|
"lastPropertyId": "17:8085320504542486236",
|
||||||
|
"name": "DownloadEntity",
|
||||||
|
"properties": [
|
||||||
|
{
|
||||||
|
"id": "1:2266566996008201697",
|
||||||
|
"name": "id"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "2:1953917250527765737",
|
||||||
|
"name": "downloadId"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "5:6575412958851693470",
|
||||||
|
"name": "bookId"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "6:1075612111256674117",
|
||||||
|
"name": "title"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "7:2831524841121029990",
|
||||||
|
"name": "description"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "8:2334902404590133038",
|
||||||
|
"name": "language"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "9:5087250349738158996",
|
||||||
|
"name": "creator"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "10:6128960350043895299",
|
||||||
|
"name": "publisher"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "11:3850323036475883785",
|
||||||
|
"name": "date"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "12:5288623325038033644",
|
||||||
|
"name": "url"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "13:2501711400901908648",
|
||||||
|
"name": "articleCount"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "14:3550975911715416030",
|
||||||
|
"name": "mediaCount"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "15:8949996430663588693",
|
||||||
|
"name": "size"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "16:7554483297276446029",
|
||||||
|
"name": "name"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "17:8085320504542486236",
|
||||||
|
"name": "favIcon"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"relations": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "3:5536749840871435068",
|
||||||
|
"lastPropertyId": "16:6142333908132117423",
|
||||||
|
"name": "BookOnDiskEntity",
|
||||||
|
"properties": [
|
||||||
|
{
|
||||||
|
"id": "1:4248832782795400383",
|
||||||
|
"name": "id"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "2:2644395282642821815",
|
||||||
|
"name": "file"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "4:3145196313443812205",
|
||||||
|
"name": "bookId"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "5:597997298666253723",
|
||||||
|
"name": "title"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "6:8028706022307902131",
|
||||||
|
"name": "description"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "7:4257578632233656657",
|
||||||
|
"name": "language"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "8:7771231471515752814",
|
||||||
|
"name": "creator"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "9:892859866782486178",
|
||||||
|
"name": "publisher"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "10:1925365063061602631",
|
||||||
|
"name": "date"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "11:1111395522977944209",
|
||||||
|
"name": "url"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "12:3765116904492031525",
|
||||||
|
"name": "articleCount"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "13:5901922417972273396",
|
||||||
|
"name": "mediaCount"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "14:1229023184984372602",
|
||||||
|
"name": "size"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "15:6851856791814492874",
|
||||||
|
"name": "name"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "16:6142333908132117423",
|
||||||
|
"name": "favIcon"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"relations": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "4:6278838675135543734",
|
||||||
|
"lastPropertyId": "4:8812214350305159407",
|
||||||
|
"name": "LanguageEntity",
|
||||||
|
"properties": [
|
||||||
|
{
|
||||||
|
"id": "1:7795244654012809404",
|
||||||
|
"name": "id"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "2:9116495537035444904",
|
||||||
|
"name": "locale"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "3:452531964346972307",
|
||||||
|
"name": "active"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "4:8812214350305159407",
|
||||||
|
"name": "occurencesOfLanguage"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"relations": []
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"lastEntityId": "4:6278838675135543734",
|
||||||
|
"lastIndexId": "4:4868787482832538530",
|
||||||
|
"lastRelationId": "0:0",
|
||||||
|
"lastSequenceId": "0:0",
|
||||||
|
"modelVersion": 4,
|
||||||
|
"modelVersionParserMinimum": 4,
|
||||||
|
"retiredEntityUids": [
|
||||||
|
349148274283701276
|
||||||
|
],
|
||||||
|
"retiredIndexUids": [
|
||||||
|
1293695782925933448,
|
||||||
|
3655049272366703856,
|
||||||
|
7576716732364166705,
|
||||||
|
4868787482832538530
|
||||||
|
],
|
||||||
|
"retiredPropertyUids": [
|
||||||
|
4712434661554562781,
|
||||||
|
1521665545502891268,
|
||||||
|
1831899651198481824,
|
||||||
|
8913656606098213241,
|
||||||
|
4745760836781949968,
|
||||||
|
9177466730609383913,
|
||||||
|
6985467229796102081,
|
||||||
|
4417830652027770707,
|
||||||
|
3485079785941052658,
|
||||||
|
2875347328622347138,
|
||||||
|
96906195091428769,
|
||||||
|
305997162787053035,
|
||||||
|
8804682238892773896,
|
||||||
|
3464301918251637220,
|
||||||
|
5620508895870653354,
|
||||||
|
7273406943564025911,
|
||||||
|
428251106490095982
|
||||||
|
],
|
||||||
|
"retiredRelationUids": [],
|
||||||
|
"version": 1
|
||||||
|
}
|
179
app/objectbox-models/default.json.bak
Normal file
179
app/objectbox-models/default.json.bak
Normal file
@ -0,0 +1,179 @@
|
|||||||
|
{
|
||||||
|
"_note1": "KEEP THIS FILE! Check it into a version control system (VCS) like git.",
|
||||||
|
"_note2": "ObjectBox manages crucial IDs for your object model. See docs for details.",
|
||||||
|
"_note3": "If you have VCS merge conflicts, you must resolve them according to ObjectBox docs.",
|
||||||
|
"entities": [
|
||||||
|
{
|
||||||
|
"id": "1:7257718270326155947",
|
||||||
|
"lastPropertyId": "17:8085320504542486236",
|
||||||
|
"name": "DownloadEntity",
|
||||||
|
"properties": [
|
||||||
|
{
|
||||||
|
"id": "1:2266566996008201697",
|
||||||
|
"name": "id"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "2:1953917250527765737",
|
||||||
|
"name": "downloadId"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "5:6575412958851693470",
|
||||||
|
"name": "bookId"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "6:1075612111256674117",
|
||||||
|
"name": "title"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "7:2831524841121029990",
|
||||||
|
"name": "description"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "8:2334902404590133038",
|
||||||
|
"name": "language"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "9:5087250349738158996",
|
||||||
|
"name": "creator"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "10:6128960350043895299",
|
||||||
|
"name": "publisher"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "11:3850323036475883785",
|
||||||
|
"name": "date"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "12:5288623325038033644",
|
||||||
|
"name": "url"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "13:2501711400901908648",
|
||||||
|
"name": "articleCount"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "14:3550975911715416030",
|
||||||
|
"name": "mediaCount"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "15:8949996430663588693",
|
||||||
|
"name": "size"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "16:7554483297276446029",
|
||||||
|
"name": "name"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "17:8085320504542486236",
|
||||||
|
"name": "favIcon"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"relations": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "3:5536749840871435068",
|
||||||
|
"lastPropertyId": "16:6142333908132117423",
|
||||||
|
"name": "BookOnDiskEntity",
|
||||||
|
"properties": [
|
||||||
|
{
|
||||||
|
"id": "1:4248832782795400383",
|
||||||
|
"name": "id"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "2:2644395282642821815",
|
||||||
|
"name": "file"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "4:3145196313443812205",
|
||||||
|
"name": "bookId"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "5:597997298666253723",
|
||||||
|
"name": "title"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "6:8028706022307902131",
|
||||||
|
"name": "description"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "7:4257578632233656657",
|
||||||
|
"name": "language"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "8:7771231471515752814",
|
||||||
|
"name": "creator"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "9:892859866782486178",
|
||||||
|
"name": "publisher"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "10:1925365063061602631",
|
||||||
|
"name": "date"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "11:1111395522977944209",
|
||||||
|
"name": "url"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "12:3765116904492031525",
|
||||||
|
"name": "articleCount"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "13:5901922417972273396",
|
||||||
|
"name": "mediaCount"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "14:1229023184984372602",
|
||||||
|
"name": "size"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "15:6851856791814492874",
|
||||||
|
"name": "name"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "16:6142333908132117423",
|
||||||
|
"name": "favIcon"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"relations": []
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"lastEntityId": "3:5536749840871435068",
|
||||||
|
"lastIndexId": "4:4868787482832538530",
|
||||||
|
"lastRelationId": "0:0",
|
||||||
|
"lastSequenceId": "0:0",
|
||||||
|
"modelVersion": 4,
|
||||||
|
"modelVersionParserMinimum": 4,
|
||||||
|
"retiredEntityUids": [
|
||||||
|
349148274283701276
|
||||||
|
],
|
||||||
|
"retiredIndexUids": [
|
||||||
|
1293695782925933448,
|
||||||
|
3655049272366703856,
|
||||||
|
7576716732364166705,
|
||||||
|
4868787482832538530
|
||||||
|
],
|
||||||
|
"retiredPropertyUids": [
|
||||||
|
4712434661554562781,
|
||||||
|
1521665545502891268,
|
||||||
|
1831899651198481824,
|
||||||
|
8913656606098213241,
|
||||||
|
4745760836781949968,
|
||||||
|
9177466730609383913,
|
||||||
|
6985467229796102081,
|
||||||
|
4417830652027770707,
|
||||||
|
3485079785941052658,
|
||||||
|
2875347328622347138,
|
||||||
|
96906195091428769,
|
||||||
|
305997162787053035,
|
||||||
|
8804682238892773896,
|
||||||
|
3464301918251637220,
|
||||||
|
5620508895870653354,
|
||||||
|
7273406943564025911,
|
||||||
|
428251106490095982
|
||||||
|
],
|
||||||
|
"retiredRelationUids": [],
|
||||||
|
"version": 1
|
||||||
|
}
|
@ -15,7 +15,7 @@ import java.io.File;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
import org.kiwix.kiwixmobile.base.BaseActivity;
|
import org.kiwix.kiwixmobile.base.BaseActivity;
|
||||||
import org.kiwix.kiwixmobile.database.BookDao;
|
import org.kiwix.kiwixmobile.database.newdb.dao.NewBookDao;
|
||||||
import org.kiwix.kiwixmobile.downloader.model.BookOnDisk;
|
import org.kiwix.kiwixmobile.downloader.model.BookOnDisk;
|
||||||
import org.kiwix.kiwixmobile.library.entity.LibraryNetworkEntity;
|
import org.kiwix.kiwixmobile.library.entity.LibraryNetworkEntity;
|
||||||
import org.kiwix.kiwixmobile.utils.SplashActivity;
|
import org.kiwix.kiwixmobile.utils.SplashActivity;
|
||||||
@ -25,7 +25,7 @@ import static org.kiwix.kiwixmobile.utils.LanguageUtils.getCurrentLocale;
|
|||||||
public class KiwixErrorActivity extends BaseActivity {
|
public class KiwixErrorActivity extends BaseActivity {
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
BookDao bookDao;
|
NewBookDao bookDao;
|
||||||
|
|
||||||
@BindView(R.id.reportButton)
|
@BindView(R.id.reportButton)
|
||||||
Button reportButton;
|
Button reportButton;
|
||||||
|
@ -1,133 +0,0 @@
|
|||||||
/*
|
|
||||||
* Kiwix Android
|
|
||||||
* Copyright (C) 2018 Kiwix <android.kiwix.org>
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
package org.kiwix.kiwixmobile.database;
|
|
||||||
|
|
||||||
import com.yahoo.squidb.data.SquidCursor;
|
|
||||||
import com.yahoo.squidb.data.TableModel;
|
|
||||||
import com.yahoo.squidb.sql.Query;
|
|
||||||
import com.yahoo.squidb.sql.TableStatement;
|
|
||||||
import io.reactivex.Flowable;
|
|
||||||
import io.reactivex.processors.BehaviorProcessor;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
import javax.inject.Inject;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
import org.kiwix.kiwixmobile.database.entity.DownloadDatabaseEntity;
|
|
||||||
import org.kiwix.kiwixmobile.downloader.model.DownloadModel;
|
|
||||||
import org.kiwix.kiwixmobile.library.entity.LibraryNetworkEntity;
|
|
||||||
|
|
||||||
public class DownloadDao extends BaseDao {
|
|
||||||
|
|
||||||
private final BehaviorProcessor<List<DownloadModel>> downloadsProcessor =
|
|
||||||
BehaviorProcessor.create();
|
|
||||||
|
|
||||||
@Inject
|
|
||||||
public DownloadDao(KiwixDatabase kiwixDatabase) {
|
|
||||||
super(kiwixDatabase, DownloadDatabaseEntity.TABLE);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onUpdateToTable() {
|
|
||||||
downloadsProcessor.onNext(getDownloads());
|
|
||||||
}
|
|
||||||
|
|
||||||
public void insert(final DownloadModel downloadModel) {
|
|
||||||
kiwixDatabase.persistWithOnConflict(databaseEntity(downloadModel),
|
|
||||||
TableStatement.ConflictAlgorithm.REPLACE);
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean doesNotAlreadyExist(LibraryNetworkEntity.Book book) {
|
|
||||||
return kiwixDatabase.count(
|
|
||||||
DownloadDatabaseEntity.class,
|
|
||||||
DownloadDatabaseEntity.BOOK_ID.eq(book.getId())
|
|
||||||
) == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean containsAny(@NotNull Long[] downloadIds) {
|
|
||||||
return kiwixDatabase.count(
|
|
||||||
DownloadDatabaseEntity.class,
|
|
||||||
DownloadDatabaseEntity.DOWNLOAD_ID.in((Object[]) downloadIds)
|
|
||||||
) > 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void delete(@NotNull Long... downloadIds) {
|
|
||||||
if (downloadIds.length > 0) {
|
|
||||||
kiwixDatabase.deleteWhere(DownloadDatabaseEntity.class,
|
|
||||||
DownloadDatabaseEntity.DOWNLOAD_ID.in((Object[]) downloadIds));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public Flowable<List<DownloadModel>> downloads() {
|
|
||||||
return downloadsProcessor;
|
|
||||||
}
|
|
||||||
|
|
||||||
private TableModel databaseEntity(final DownloadModel downloadModel) {
|
|
||||||
final LibraryNetworkEntity.Book book = downloadModel.getBook();
|
|
||||||
return new DownloadDatabaseEntity()
|
|
||||||
.setDownloadId(downloadModel.getDownloadId())
|
|
||||||
.setBookId(book.getId())
|
|
||||||
.setTitle(book.getTitle())
|
|
||||||
.setDescription(book.getDescription())
|
|
||||||
.setLanguage(book.getLanguage())
|
|
||||||
.setBookCreator(book.getCreator())
|
|
||||||
.setPublisher(book.getPublisher())
|
|
||||||
.setDate(book.getDate())
|
|
||||||
.setUrl(book.getUrl())
|
|
||||||
.setArticleCount(book.getArticleCount())
|
|
||||||
.setMediaCount(book.getMediaCount())
|
|
||||||
.setSize(book.getSize())
|
|
||||||
.setName(book.getName())
|
|
||||||
.setFavIcon(book.getFavicon());
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<DownloadModel> getDownloads() {
|
|
||||||
return toList(kiwixDatabase.query(DownloadDatabaseEntity.class, Query.select()));
|
|
||||||
}
|
|
||||||
|
|
||||||
private List<DownloadModel> toList(final SquidCursor<DownloadDatabaseEntity> cursor) {
|
|
||||||
final ArrayList<DownloadModel> downloadModels = new ArrayList<>();
|
|
||||||
final DownloadDatabaseEntity downloadDatabaseEntity = new DownloadDatabaseEntity();
|
|
||||||
while (cursor.moveToNext()) {
|
|
||||||
downloadDatabaseEntity.readPropertiesFromCursor(cursor);
|
|
||||||
downloadModels.add(new DownloadModel(
|
|
||||||
downloadDatabaseEntity.getDownloadId(),
|
|
||||||
toBook(downloadDatabaseEntity)
|
|
||||||
));
|
|
||||||
}
|
|
||||||
cursor.close();
|
|
||||||
return downloadModels;
|
|
||||||
}
|
|
||||||
|
|
||||||
private LibraryNetworkEntity.Book toBook(DownloadDatabaseEntity downloadDatabaseEntity) {
|
|
||||||
final LibraryNetworkEntity.Book book = new LibraryNetworkEntity.Book();
|
|
||||||
book.id = downloadDatabaseEntity.getBookId();
|
|
||||||
book.title = downloadDatabaseEntity.getTitle();
|
|
||||||
book.description = downloadDatabaseEntity.getDescription();
|
|
||||||
book.language = downloadDatabaseEntity.getLanguage();
|
|
||||||
book.creator = downloadDatabaseEntity.getBookCreator();
|
|
||||||
book.publisher = downloadDatabaseEntity.getPublisher();
|
|
||||||
book.date = downloadDatabaseEntity.getDate();
|
|
||||||
book.url = downloadDatabaseEntity.getUrl();
|
|
||||||
book.articleCount = downloadDatabaseEntity.getArticleCount();
|
|
||||||
book.mediaCount = downloadDatabaseEntity.getMediaCount();
|
|
||||||
book.size = downloadDatabaseEntity.getSize();
|
|
||||||
book.bookName = downloadDatabaseEntity.getName();
|
|
||||||
book.favicon = downloadDatabaseEntity.getFavIcon();
|
|
||||||
return book;
|
|
||||||
}
|
|
||||||
}
|
|
@ -34,7 +34,6 @@ import javax.inject.Singleton;
|
|||||||
import org.kiwix.kiwixmobile.ZimContentProvider;
|
import org.kiwix.kiwixmobile.ZimContentProvider;
|
||||||
import org.kiwix.kiwixmobile.database.entity.BookDatabaseEntity;
|
import org.kiwix.kiwixmobile.database.entity.BookDatabaseEntity;
|
||||||
import org.kiwix.kiwixmobile.database.entity.Bookmarks;
|
import org.kiwix.kiwixmobile.database.entity.Bookmarks;
|
||||||
import org.kiwix.kiwixmobile.database.entity.DownloadDatabaseEntity;
|
|
||||||
import org.kiwix.kiwixmobile.database.entity.LibraryDatabaseEntity;
|
import org.kiwix.kiwixmobile.database.entity.LibraryDatabaseEntity;
|
||||||
import org.kiwix.kiwixmobile.database.entity.NetworkLanguageDatabaseEntity;
|
import org.kiwix.kiwixmobile.database.entity.NetworkLanguageDatabaseEntity;
|
||||||
import org.kiwix.kiwixmobile.database.entity.RecentSearch;
|
import org.kiwix.kiwixmobile.database.entity.RecentSearch;
|
||||||
@ -67,7 +66,6 @@ public class KiwixDatabase extends SquidDatabase {
|
|||||||
RecentSearch.TABLE,
|
RecentSearch.TABLE,
|
||||||
Bookmarks.TABLE,
|
Bookmarks.TABLE,
|
||||||
NetworkLanguageDatabaseEntity.TABLE,
|
NetworkLanguageDatabaseEntity.TABLE,
|
||||||
DownloadDatabaseEntity.TABLE
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,38 +0,0 @@
|
|||||||
/*
|
|
||||||
* Kiwix Android
|
|
||||||
* Copyright (C) 2018 Kiwix <android.kiwix.org>
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
package org.kiwix.kiwixmobile.database.entity;
|
|
||||||
|
|
||||||
import com.yahoo.squidb.annotations.TableModelSpec;
|
|
||||||
|
|
||||||
@TableModelSpec(className = "DownloadDatabaseEntity", tableName = "downloads")
|
|
||||||
public class DownloadsSpec {
|
|
||||||
public Long downloadId;
|
|
||||||
public String bookId;
|
|
||||||
public String favIcon;
|
|
||||||
public String title;
|
|
||||||
public String description;
|
|
||||||
public String language;
|
|
||||||
public String bookCreator;
|
|
||||||
public String publisher;
|
|
||||||
public String date;
|
|
||||||
public String url;
|
|
||||||
public String articleCount;
|
|
||||||
public String mediaCount;
|
|
||||||
public String size;
|
|
||||||
public String name;
|
|
||||||
}
|
|
@ -0,0 +1,50 @@
|
|||||||
|
/*
|
||||||
|
* Kiwix Android
|
||||||
|
* Copyright (C) 2018 Kiwix <android.kiwix.org>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
package org.kiwix.kiwixmobile.database.newdb.dao
|
||||||
|
|
||||||
|
import io.objectbox.Box
|
||||||
|
import io.objectbox.kotlin.inValues
|
||||||
|
import io.objectbox.kotlin.query
|
||||||
|
import org.kiwix.kiwixmobile.database.newdb.entities.BookOnDiskEntity
|
||||||
|
import org.kiwix.kiwixmobile.database.newdb.entities.BookOnDiskEntity_
|
||||||
|
import org.kiwix.kiwixmobile.downloader.model.BookOnDisk
|
||||||
|
import javax.inject.Inject
|
||||||
|
|
||||||
|
class NewBookDao @Inject constructor(private val box: Box<BookOnDiskEntity>) {
|
||||||
|
|
||||||
|
fun books() = box.asFlowable()
|
||||||
|
.map { it.map(::BookOnDisk) }
|
||||||
|
|
||||||
|
fun getBooks() = box.all.map(::BookOnDisk)
|
||||||
|
|
||||||
|
fun insert(booksOnDisk: List<BookOnDisk>) {
|
||||||
|
box.store.callInTx {
|
||||||
|
box
|
||||||
|
.query {
|
||||||
|
inValues(BookOnDiskEntity_.bookId, booksOnDisk.map { it.book.id }.toTypedArray())
|
||||||
|
}
|
||||||
|
.remove()
|
||||||
|
box.put(booksOnDisk.map(::BookOnDiskEntity))
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
fun delete(databaseId: Long) {
|
||||||
|
box.remove(databaseId)
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,45 @@
|
|||||||
|
package org.kiwix.kiwixmobile.database.newdb.dao
|
||||||
|
|
||||||
|
import android.util.Log
|
||||||
|
import io.objectbox.Box
|
||||||
|
import io.objectbox.kotlin.inValues
|
||||||
|
import io.objectbox.kotlin.query
|
||||||
|
import io.objectbox.rx.RxQuery
|
||||||
|
import io.reactivex.BackpressureStrategy.LATEST
|
||||||
|
import org.kiwix.kiwixmobile.database.newdb.entities.DownloadEntity
|
||||||
|
import org.kiwix.kiwixmobile.database.newdb.entities.DownloadEntity_
|
||||||
|
import org.kiwix.kiwixmobile.downloader.model.DownloadModel
|
||||||
|
import org.kiwix.kiwixmobile.library.entity.LibraryNetworkEntity.Book
|
||||||
|
import javax.inject.Inject
|
||||||
|
|
||||||
|
class NewDownloadDao @Inject constructor(private val box: Box<DownloadEntity>) {
|
||||||
|
|
||||||
|
fun downloads() = box.asFlowable()
|
||||||
|
.map { it.map(DownloadEntity::toDownloadModel) }
|
||||||
|
|
||||||
|
fun delete(vararg downloadIds: Long) {
|
||||||
|
box
|
||||||
|
.query {
|
||||||
|
inValues(DownloadEntity_.downloadId, downloadIds)
|
||||||
|
}
|
||||||
|
.remove()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun containsAny(vararg downloadIds: Long) =
|
||||||
|
box
|
||||||
|
.query {
|
||||||
|
inValues(DownloadEntity_.downloadId, downloadIds)
|
||||||
|
}
|
||||||
|
.count() > 0
|
||||||
|
|
||||||
|
fun doesNotAlreadyExist(book: Book) =
|
||||||
|
box
|
||||||
|
.query {
|
||||||
|
equal(DownloadEntity_.bookId, book.id)
|
||||||
|
}
|
||||||
|
.count() == 0L
|
||||||
|
|
||||||
|
fun insert(downloadModel: DownloadModel) {
|
||||||
|
box.put(DownloadEntity(downloadModel))
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,43 @@
|
|||||||
|
/*
|
||||||
|
* Kiwix Android
|
||||||
|
* Copyright (C) 2018 Kiwix <android.kiwix.org>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
package org.kiwix.kiwixmobile.database.newdb.dao
|
||||||
|
|
||||||
|
import io.objectbox.Box
|
||||||
|
import io.objectbox.kotlin.query
|
||||||
|
import io.objectbox.rx.RxQuery
|
||||||
|
import io.reactivex.BackpressureStrategy
|
||||||
|
import io.reactivex.BackpressureStrategy.LATEST
|
||||||
|
import org.kiwix.kiwixmobile.database.newdb.entities.LanguageEntity
|
||||||
|
import org.kiwix.kiwixmobile.zim_manager.library_view.adapter.Language
|
||||||
|
import javax.inject.Inject
|
||||||
|
|
||||||
|
class NewLanguagesDao @Inject constructor(private val box: Box<LanguageEntity>) {
|
||||||
|
fun languages() = box.asFlowable()
|
||||||
|
.map { it.map(LanguageEntity::toLanguageModel) }
|
||||||
|
|
||||||
|
fun insert(languages: List<Language>) {
|
||||||
|
box.store.callInTx {
|
||||||
|
box.removeAll()
|
||||||
|
box.put(languages.map(::LanguageEntity))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
internal fun <T> Box<T>.asFlowable(backpressureStrategy: BackpressureStrategy = LATEST) =
|
||||||
|
RxQuery.observable(query {}).toFlowable(backpressureStrategy)
|
@ -0,0 +1,71 @@
|
|||||||
|
package org.kiwix.kiwixmobile.database.newdb.entities
|
||||||
|
|
||||||
|
import io.objectbox.annotation.Convert
|
||||||
|
import io.objectbox.annotation.Entity
|
||||||
|
import io.objectbox.annotation.Id
|
||||||
|
import io.objectbox.converter.PropertyConverter
|
||||||
|
import org.kiwix.kiwixmobile.downloader.model.BookOnDisk
|
||||||
|
import org.kiwix.kiwixmobile.library.entity.LibraryNetworkEntity.Book
|
||||||
|
import java.io.File
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
data class BookOnDiskEntity(
|
||||||
|
@Id var id: Long = 0,
|
||||||
|
@Convert(converter = StringToFileConverter::class, dbType = String::class)
|
||||||
|
val file: File = File(""),
|
||||||
|
val bookId: String,
|
||||||
|
val title: String,
|
||||||
|
val description: String,
|
||||||
|
val language: String,
|
||||||
|
val creator: String,
|
||||||
|
val publisher: String,
|
||||||
|
val date: String,
|
||||||
|
val url: String?,
|
||||||
|
val articleCount: String?,
|
||||||
|
val mediaCount: String?,
|
||||||
|
val size: String,
|
||||||
|
val name: String?,
|
||||||
|
val favIcon: String
|
||||||
|
) {
|
||||||
|
constructor(bookOnDisk: BookOnDisk) : this(
|
||||||
|
0,
|
||||||
|
bookOnDisk.file,
|
||||||
|
bookOnDisk.book.getId(),
|
||||||
|
bookOnDisk.book.getTitle(),
|
||||||
|
bookOnDisk.book.getDescription(),
|
||||||
|
bookOnDisk.book.getLanguage(),
|
||||||
|
bookOnDisk.book.getCreator(),
|
||||||
|
bookOnDisk.book.getPublisher(),
|
||||||
|
bookOnDisk.book.getDate(),
|
||||||
|
bookOnDisk.book.getUrl(),
|
||||||
|
bookOnDisk.book.getArticleCount(),
|
||||||
|
bookOnDisk.book.getMediaCount(),
|
||||||
|
bookOnDisk.book.getSize(),
|
||||||
|
bookOnDisk.book.getName(),
|
||||||
|
bookOnDisk.book.getFavicon()
|
||||||
|
)
|
||||||
|
|
||||||
|
fun toBook() = Book().apply {
|
||||||
|
id = this@BookOnDiskEntity.bookId
|
||||||
|
title = this@BookOnDiskEntity.title
|
||||||
|
description = this@BookOnDiskEntity.description
|
||||||
|
language = this@BookOnDiskEntity.language
|
||||||
|
creator = this@BookOnDiskEntity.creator
|
||||||
|
publisher = this@BookOnDiskEntity.publisher
|
||||||
|
date = this@BookOnDiskEntity.date
|
||||||
|
url = this@BookOnDiskEntity.url
|
||||||
|
articleCount = this@BookOnDiskEntity.articleCount
|
||||||
|
mediaCount = this@BookOnDiskEntity.mediaCount
|
||||||
|
size = this@BookOnDiskEntity.size
|
||||||
|
bookName = this@BookOnDiskEntity.name
|
||||||
|
favicon = this@BookOnDiskEntity.favIcon
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
class StringToFileConverter : PropertyConverter<File, String> {
|
||||||
|
override fun convertToDatabaseValue(entityProperty: File?) = entityProperty?.path ?: ""
|
||||||
|
|
||||||
|
override fun convertToEntityProperty(databaseValue: String?) = File(databaseValue ?: "")
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,78 @@
|
|||||||
|
/*
|
||||||
|
* Kiwix Android
|
||||||
|
* Copyright (C) 2018 Kiwix <android.kiwix.org>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
package org.kiwix.kiwixmobile.database.newdb.entities
|
||||||
|
|
||||||
|
import io.objectbox.annotation.Entity
|
||||||
|
import io.objectbox.annotation.Id
|
||||||
|
import org.kiwix.kiwixmobile.downloader.model.DownloadModel
|
||||||
|
import org.kiwix.kiwixmobile.library.entity.LibraryNetworkEntity.Book
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
data class DownloadEntity(
|
||||||
|
@Id var id: Long = 0,
|
||||||
|
val downloadId: Long,
|
||||||
|
val bookId: String,
|
||||||
|
val title: String,
|
||||||
|
val description: String,
|
||||||
|
val language: String,
|
||||||
|
val creator: String,
|
||||||
|
val publisher: String,
|
||||||
|
val date: String,
|
||||||
|
val url: String?,
|
||||||
|
val articleCount: String?,
|
||||||
|
val mediaCount: String?,
|
||||||
|
val size: String,
|
||||||
|
val name: String?,
|
||||||
|
val favIcon: String
|
||||||
|
) {
|
||||||
|
constructor(downloadModel: DownloadModel) : this(
|
||||||
|
0,
|
||||||
|
downloadModel.downloadId,
|
||||||
|
downloadModel.book.getId(),
|
||||||
|
downloadModel.book.getTitle(),
|
||||||
|
downloadModel.book.getDescription(),
|
||||||
|
downloadModel.book.getLanguage(),
|
||||||
|
downloadModel.book.getCreator(),
|
||||||
|
downloadModel.book.getPublisher(),
|
||||||
|
downloadModel.book.getDate(),
|
||||||
|
downloadModel.book.getUrl(),
|
||||||
|
downloadModel.book.getArticleCount(),
|
||||||
|
downloadModel.book.getMediaCount(),
|
||||||
|
downloadModel.book.getSize(),
|
||||||
|
downloadModel.book.getName(),
|
||||||
|
downloadModel.book.getFavicon()
|
||||||
|
)
|
||||||
|
|
||||||
|
fun toDownloadModel() = DownloadModel(id, downloadId, toBook())
|
||||||
|
|
||||||
|
private fun toBook() = Book().apply {
|
||||||
|
id = this@DownloadEntity.bookId
|
||||||
|
title = this@DownloadEntity.title
|
||||||
|
description = this@DownloadEntity.description
|
||||||
|
language = this@DownloadEntity.language
|
||||||
|
creator = this@DownloadEntity.creator
|
||||||
|
publisher = this@DownloadEntity.publisher
|
||||||
|
date = this@DownloadEntity.date
|
||||||
|
url = this@DownloadEntity.url
|
||||||
|
articleCount = this@DownloadEntity.articleCount
|
||||||
|
mediaCount = this@DownloadEntity.mediaCount
|
||||||
|
size = this@DownloadEntity.size
|
||||||
|
bookName = this@DownloadEntity.name
|
||||||
|
favicon = this@DownloadEntity.favIcon
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,36 @@
|
|||||||
|
package org.kiwix.kiwixmobile.database.newdb.entities
|
||||||
|
|
||||||
|
import io.objectbox.annotation.Convert
|
||||||
|
import io.objectbox.annotation.Entity
|
||||||
|
import io.objectbox.annotation.Id
|
||||||
|
import io.objectbox.converter.PropertyConverter
|
||||||
|
import org.kiwix.kiwixmobile.zim_manager.library_view.adapter.Language
|
||||||
|
import java.util.Locale
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
data class LanguageEntity(
|
||||||
|
@Id var id: Long = 0,
|
||||||
|
@Convert(converter = StringToLocaleConverter::class, dbType = String::class)
|
||||||
|
val locale: Locale = Locale.ENGLISH,
|
||||||
|
var active: Boolean = false,
|
||||||
|
var occurencesOfLanguage: Int = 0
|
||||||
|
) {
|
||||||
|
|
||||||
|
constructor(language: Language) : this(
|
||||||
|
0,
|
||||||
|
Locale(language.languageCode),
|
||||||
|
language.active,
|
||||||
|
language.occurencesOfLanguage
|
||||||
|
)
|
||||||
|
|
||||||
|
fun toLanguageModel() = Language(locale, active, occurencesOfLanguage)
|
||||||
|
}
|
||||||
|
|
||||||
|
class StringToLocaleConverter : PropertyConverter<Locale, String> {
|
||||||
|
override fun convertToDatabaseValue(entityProperty: Locale?) =
|
||||||
|
entityProperty?.isO3Language ?: Locale.ENGLISH.isO3Language
|
||||||
|
|
||||||
|
override fun convertToEntityProperty(databaseValue: String?) =
|
||||||
|
databaseValue?.let(::Locale) ?: Locale.ENGLISH
|
||||||
|
|
||||||
|
}
|
@ -28,8 +28,11 @@ import javax.inject.Singleton;
|
|||||||
import org.kiwix.kiwixmobile.utils.BookUtils;
|
import org.kiwix.kiwixmobile.utils.BookUtils;
|
||||||
|
|
||||||
@Module(includes = {
|
@Module(includes = {
|
||||||
ActivityBindingModule.class, AndroidInjectionModule.class, DownloaderModule.class,
|
ActivityBindingModule.class,
|
||||||
ViewModelModule.class
|
AndroidInjectionModule.class,
|
||||||
|
DownloaderModule.class,
|
||||||
|
ViewModelModule.class,
|
||||||
|
DatabaseModule.class
|
||||||
})
|
})
|
||||||
public class ApplicationModule {
|
public class ApplicationModule {
|
||||||
|
|
||||||
|
@ -0,0 +1,44 @@
|
|||||||
|
/*
|
||||||
|
* Kiwix Android
|
||||||
|
* Copyright (C) 2018 Kiwix <android.kiwix.org>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
package org.kiwix.kiwixmobile.di.modules
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import dagger.Module
|
||||||
|
import dagger.Provides
|
||||||
|
import io.objectbox.BoxStore
|
||||||
|
import io.objectbox.kotlin.boxFor
|
||||||
|
import org.kiwix.kiwixmobile.database.newdb.dao.NewBookDao
|
||||||
|
import org.kiwix.kiwixmobile.database.newdb.dao.NewDownloadDao
|
||||||
|
import org.kiwix.kiwixmobile.database.newdb.dao.NewLanguagesDao
|
||||||
|
import org.kiwix.kiwixmobile.database.newdb.entities.MyObjectBox
|
||||||
|
import javax.inject.Singleton
|
||||||
|
|
||||||
|
@Module
|
||||||
|
class DatabaseModule {
|
||||||
|
@Provides @Singleton fun providesBoxStore(context: Context): BoxStore =
|
||||||
|
MyObjectBox.builder().androidContext(context.applicationContext).build()
|
||||||
|
|
||||||
|
@Provides @Singleton fun providesNewDownloadDao(boxStore: BoxStore): NewDownloadDao =
|
||||||
|
NewDownloadDao(boxStore.boxFor())
|
||||||
|
|
||||||
|
@Provides @Singleton fun providesNewBookDao(boxStore: BoxStore): NewBookDao =
|
||||||
|
NewBookDao(boxStore.boxFor())
|
||||||
|
|
||||||
|
@Provides @Singleton fun providesNewLanguagesDao(boxStore: BoxStore): NewLanguagesDao =
|
||||||
|
NewLanguagesDao(boxStore.boxFor())
|
||||||
|
}
|
@ -19,18 +19,16 @@ package org.kiwix.kiwixmobile.di.modules;
|
|||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.net.ConnectivityManager;
|
import android.net.ConnectivityManager;
|
||||||
|
import dagger.Module;
|
||||||
|
import dagger.Provides;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
import javax.inject.Singleton;
|
||||||
|
import okhttp3.OkHttpClient;
|
||||||
|
import okhttp3.logging.HttpLoggingInterceptor;
|
||||||
import org.kiwix.kiwixmobile.BuildConfig;
|
import org.kiwix.kiwixmobile.BuildConfig;
|
||||||
import org.kiwix.kiwixmobile.network.KiwixService;
|
import org.kiwix.kiwixmobile.network.KiwixService;
|
||||||
import org.kiwix.kiwixmobile.network.UserAgentInterceptor;
|
import org.kiwix.kiwixmobile.network.UserAgentInterceptor;
|
||||||
|
|
||||||
import javax.inject.Singleton;
|
|
||||||
|
|
||||||
import dagger.Module;
|
|
||||||
import dagger.Provides;
|
|
||||||
import okhttp3.OkHttpClient;
|
|
||||||
import okhttp3.logging.HttpLoggingInterceptor;
|
|
||||||
|
|
||||||
@Module public class NetworkModule {
|
@Module public class NetworkModule {
|
||||||
|
|
||||||
public static String KIWIX_DOWNLOAD_URL = BuildConfig.KIWIX_DOWNLOAD_URL; //"http://download.kiwix.org/";
|
public static String KIWIX_DOWNLOAD_URL = BuildConfig.KIWIX_DOWNLOAD_URL; //"http://download.kiwix.org/";
|
||||||
@ -41,6 +39,8 @@ import okhttp3.logging.HttpLoggingInterceptor;
|
|||||||
logging.setLevel(HttpLoggingInterceptor.Level.BASIC);
|
logging.setLevel(HttpLoggingInterceptor.Level.BASIC);
|
||||||
|
|
||||||
return new OkHttpClient().newBuilder().followRedirects(true).followSslRedirects(true)
|
return new OkHttpClient().newBuilder().followRedirects(true).followSslRedirects(true)
|
||||||
|
.connectTimeout(10, TimeUnit.SECONDS)
|
||||||
|
.readTimeout(10, TimeUnit.SECONDS)
|
||||||
.addNetworkInterceptor(logging)
|
.addNetworkInterceptor(logging)
|
||||||
.addNetworkInterceptor(new UserAgentInterceptor(useragent)).build();
|
.addNetworkInterceptor(new UserAgentInterceptor(useragent)).build();
|
||||||
}
|
}
|
||||||
|
@ -52,7 +52,7 @@ import okio.BufferedSource;
|
|||||||
import org.kiwix.kiwixmobile.KiwixApplication;
|
import org.kiwix.kiwixmobile.KiwixApplication;
|
||||||
import org.kiwix.kiwixmobile.KiwixMobileActivity;
|
import org.kiwix.kiwixmobile.KiwixMobileActivity;
|
||||||
import org.kiwix.kiwixmobile.R;
|
import org.kiwix.kiwixmobile.R;
|
||||||
import org.kiwix.kiwixmobile.database.BookDao;
|
import org.kiwix.kiwixmobile.database.newdb.dao.NewBookDao;
|
||||||
import org.kiwix.kiwixmobile.library.entity.LibraryNetworkEntity;
|
import org.kiwix.kiwixmobile.library.entity.LibraryNetworkEntity;
|
||||||
import org.kiwix.kiwixmobile.network.KiwixService;
|
import org.kiwix.kiwixmobile.network.KiwixService;
|
||||||
import org.kiwix.kiwixmobile.utils.Constants;
|
import org.kiwix.kiwixmobile.utils.Constants;
|
||||||
@ -106,7 +106,7 @@ public class DownloadService extends Service {
|
|||||||
SharedPreferenceUtil sharedPreferenceUtil;
|
SharedPreferenceUtil sharedPreferenceUtil;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
BookDao bookDao;
|
NewBookDao bookDao;
|
||||||
|
|
||||||
public static void setDownloadFragment(DownloadFragment dFragment) {
|
public static void setDownloadFragment(DownloadFragment dFragment) {
|
||||||
downloadFragment = dFragment;
|
downloadFragment = dFragment;
|
||||||
|
@ -18,8 +18,7 @@
|
|||||||
|
|
||||||
package org.kiwix.kiwixmobile.downloader
|
package org.kiwix.kiwixmobile.downloader
|
||||||
|
|
||||||
import io.reactivex.schedulers.Schedulers
|
import org.kiwix.kiwixmobile.database.newdb.dao.NewDownloadDao
|
||||||
import org.kiwix.kiwixmobile.database.DownloadDao
|
|
||||||
import org.kiwix.kiwixmobile.downloader.model.DownloadItem
|
import org.kiwix.kiwixmobile.downloader.model.DownloadItem
|
||||||
import org.kiwix.kiwixmobile.downloader.model.DownloadModel
|
import org.kiwix.kiwixmobile.downloader.model.DownloadModel
|
||||||
import org.kiwix.kiwixmobile.downloader.model.DownloadRequest
|
import org.kiwix.kiwixmobile.downloader.model.DownloadRequest
|
||||||
@ -29,14 +28,12 @@ import javax.inject.Inject
|
|||||||
|
|
||||||
class DownloaderImpl @Inject constructor(
|
class DownloaderImpl @Inject constructor(
|
||||||
private val downloadRequester: DownloadRequester,
|
private val downloadRequester: DownloadRequester,
|
||||||
private val downloadDao: DownloadDao,
|
private val downloadDao: NewDownloadDao,
|
||||||
private val kiwixService: KiwixService
|
private val kiwixService: KiwixService
|
||||||
) : Downloader {
|
) : Downloader {
|
||||||
|
|
||||||
override fun download(book: LibraryNetworkEntity.Book) {
|
override fun download(book: LibraryNetworkEntity.Book) {
|
||||||
kiwixService.getMetaLinks(book.url)
|
kiwixService.getMetaLinks(book.url)
|
||||||
.subscribeOn(Schedulers.io())
|
|
||||||
.observeOn(Schedulers.io())
|
|
||||||
.take(1)
|
.take(1)
|
||||||
.subscribe(
|
.subscribe(
|
||||||
{
|
{
|
||||||
@ -45,7 +42,7 @@ class DownloaderImpl @Inject constructor(
|
|||||||
DownloadRequest(it, book)
|
DownloadRequest(it, book)
|
||||||
)
|
)
|
||||||
downloadDao.insert(
|
downloadDao.insert(
|
||||||
DownloadModel(downloadId, book)
|
DownloadModel(downloadId = downloadId, book = book)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package org.kiwix.kiwixmobile.downloader.model
|
package org.kiwix.kiwixmobile.downloader.model
|
||||||
|
|
||||||
|
import org.kiwix.kiwixmobile.database.newdb.entities.BookOnDiskEntity
|
||||||
import org.kiwix.kiwixmobile.library.entity.LibraryNetworkEntity.Book
|
import org.kiwix.kiwixmobile.library.entity.LibraryNetworkEntity.Book
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
@ -7,4 +8,10 @@ data class BookOnDisk(
|
|||||||
val databaseId: Long? = null,
|
val databaseId: Long? = null,
|
||||||
val book: Book,
|
val book: Book,
|
||||||
val file: File
|
val file: File
|
||||||
|
) {
|
||||||
|
constructor(bookOnDiskEntity: BookOnDiskEntity) : this(
|
||||||
|
bookOnDiskEntity.id,
|
||||||
|
bookOnDiskEntity.toBook(),
|
||||||
|
bookOnDiskEntity.file
|
||||||
)
|
)
|
||||||
|
}
|
@ -17,9 +17,12 @@
|
|||||||
*/
|
*/
|
||||||
package org.kiwix.kiwixmobile.downloader.model
|
package org.kiwix.kiwixmobile.downloader.model
|
||||||
|
|
||||||
|
import android.view.WindowId
|
||||||
|
import org.kiwix.kiwixmobile.database.newdb.entities.DownloadEntity
|
||||||
import org.kiwix.kiwixmobile.library.entity.LibraryNetworkEntity
|
import org.kiwix.kiwixmobile.library.entity.LibraryNetworkEntity
|
||||||
|
|
||||||
data class DownloadModel(
|
data class DownloadModel(
|
||||||
|
val databaseId: Long? = null,
|
||||||
val downloadId: Long,
|
val downloadId: Long,
|
||||||
val book: LibraryNetworkEntity.Book
|
val book: LibraryNetworkEntity.Book
|
||||||
)
|
)
|
||||||
|
@ -22,10 +22,8 @@ import android.net.ConnectivityManager;
|
|||||||
import android.net.NetworkInfo;
|
import android.net.NetworkInfo;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
import org.kiwix.kiwixmobile.R;
|
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
import org.kiwix.kiwixmobile.R;
|
||||||
|
|
||||||
import static org.kiwix.kiwixmobile.utils.Constants.TAG_KIWIX;
|
import static org.kiwix.kiwixmobile.utils.Constants.TAG_KIWIX;
|
||||||
|
|
||||||
@ -86,9 +84,11 @@ public class NetworkUtils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static String parseURL(Context context, String url) {
|
public static String parseURL(Context context, String url) {
|
||||||
String details;
|
if (url == null) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
try {
|
try {
|
||||||
details = url.substring(url.lastIndexOf("/") + 1);
|
String details = url.substring(url.lastIndexOf("/") + 1);
|
||||||
int beginIndex = details.indexOf("_", details.indexOf("_") + 1) + 1;
|
int beginIndex = details.indexOf("_", details.indexOf("_") + 1) + 1;
|
||||||
int endIndex = details.lastIndexOf("_");
|
int endIndex = details.lastIndexOf("_");
|
||||||
if (beginIndex < 0 || endIndex > details.length() || beginIndex > endIndex) {
|
if (beginIndex < 0 || endIndex > details.length() || beginIndex > endIndex) {
|
||||||
|
@ -20,14 +20,15 @@ package org.kiwix.kiwixmobile.zim_manager
|
|||||||
import android.app.DownloadManager
|
import android.app.DownloadManager
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
|
import android.os.Bundle
|
||||||
import org.kiwix.kiwixmobile.KiwixApplication
|
import org.kiwix.kiwixmobile.KiwixApplication
|
||||||
import org.kiwix.kiwixmobile.database.DownloadDao
|
import org.kiwix.kiwixmobile.database.newdb.dao.NewDownloadDao
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
class DownloadNotificationClickedReceiver : BaseBroadcastReceiver() {
|
class DownloadNotificationClickedReceiver : BaseBroadcastReceiver() {
|
||||||
override val action: String = DownloadManager.ACTION_NOTIFICATION_CLICKED
|
override val action: String = DownloadManager.ACTION_NOTIFICATION_CLICKED
|
||||||
|
|
||||||
@Inject lateinit var downloadDao: DownloadDao
|
@Inject lateinit var downloadDao: NewDownloadDao
|
||||||
|
|
||||||
override fun onIntentWithActionReceived(
|
override fun onIntentWithActionReceived(
|
||||||
context: Context,
|
context: Context,
|
||||||
@ -35,10 +36,7 @@ class DownloadNotificationClickedReceiver : BaseBroadcastReceiver() {
|
|||||||
) {
|
) {
|
||||||
KiwixApplication.getApplicationComponent()
|
KiwixApplication.getApplicationComponent()
|
||||||
.inject(this)
|
.inject(this)
|
||||||
val longArray =
|
if (downloadDao.containsAny(*longArrayFrom(intent.extras))) {
|
||||||
intent.extras?.getLongArray(DownloadManager.EXTRA_NOTIFICATION_CLICK_DOWNLOAD_IDS)
|
|
||||||
?: longArrayOf()
|
|
||||||
if (downloadDao.containsAny(longArray.toTypedArray())) {
|
|
||||||
context.startActivity(
|
context.startActivity(
|
||||||
Intent(context, ZimManageActivity::class.java).apply {
|
Intent(context, ZimManageActivity::class.java).apply {
|
||||||
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
||||||
@ -47,4 +45,7 @@ class DownloadNotificationClickedReceiver : BaseBroadcastReceiver() {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun longArrayFrom(extras: Bundle?) =
|
||||||
|
extras?.getLongArray(DownloadManager.EXTRA_NOTIFICATION_CLICK_DOWNLOAD_IDS) ?: longArrayOf()
|
||||||
}
|
}
|
||||||
|
@ -41,7 +41,7 @@ import org.kiwix.kiwixmobile.R.layout
|
|||||||
import org.kiwix.kiwixmobile.R.string
|
import org.kiwix.kiwixmobile.R.string
|
||||||
import org.kiwix.kiwixmobile.R.style
|
import org.kiwix.kiwixmobile.R.style
|
||||||
import org.kiwix.kiwixmobile.base.BaseActivity
|
import org.kiwix.kiwixmobile.base.BaseActivity
|
||||||
import org.kiwix.kiwixmobile.database.NetworkLanguageDao
|
import org.kiwix.kiwixmobile.database.newdb.dao.NewLanguagesDao
|
||||||
import org.kiwix.kiwixmobile.extensions.toast
|
import org.kiwix.kiwixmobile.extensions.toast
|
||||||
import org.kiwix.kiwixmobile.settings.KiwixSettingsActivity
|
import org.kiwix.kiwixmobile.settings.KiwixSettingsActivity
|
||||||
import org.kiwix.kiwixmobile.utils.Constants.TAG_KIWIX
|
import org.kiwix.kiwixmobile.utils.Constants.TAG_KIWIX
|
||||||
@ -68,7 +68,7 @@ class ZimManageActivity : BaseActivity() {
|
|||||||
|
|
||||||
@Inject lateinit var viewModelFactory: ViewModelProvider.Factory
|
@Inject lateinit var viewModelFactory: ViewModelProvider.Factory
|
||||||
@Inject lateinit var sharedPreferenceUtil: SharedPreferenceUtil
|
@Inject lateinit var sharedPreferenceUtil: SharedPreferenceUtil
|
||||||
@Inject lateinit var languagesDao: NetworkLanguageDao
|
@Inject lateinit var languagesDao: NewLanguagesDao
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
@ -111,7 +111,7 @@ class ZimManageActivity : BaseActivity() {
|
|||||||
.apply {
|
.apply {
|
||||||
onOkClicked = {
|
onOkClicked = {
|
||||||
Flowable.fromCallable {
|
Flowable.fromCallable {
|
||||||
languagesDao.saveFilteredLanguages(it)
|
languagesDao.insert(it)
|
||||||
}
|
}
|
||||||
.subscribeOn(Schedulers.io())
|
.subscribeOn(Schedulers.io())
|
||||||
.subscribe()
|
.subscribe()
|
||||||
|
@ -21,6 +21,7 @@ package org.kiwix.kiwixmobile.zim_manager
|
|||||||
import android.app.Application
|
import android.app.Application
|
||||||
import android.arch.lifecycle.MutableLiveData
|
import android.arch.lifecycle.MutableLiveData
|
||||||
import android.arch.lifecycle.ViewModel
|
import android.arch.lifecycle.ViewModel
|
||||||
|
import android.util.Log
|
||||||
import io.reactivex.Flowable
|
import io.reactivex.Flowable
|
||||||
import io.reactivex.disposables.CompositeDisposable
|
import io.reactivex.disposables.CompositeDisposable
|
||||||
import io.reactivex.disposables.Disposable
|
import io.reactivex.disposables.Disposable
|
||||||
@ -30,9 +31,9 @@ import io.reactivex.processors.BehaviorProcessor
|
|||||||
import io.reactivex.processors.PublishProcessor
|
import io.reactivex.processors.PublishProcessor
|
||||||
import io.reactivex.schedulers.Schedulers
|
import io.reactivex.schedulers.Schedulers
|
||||||
import org.kiwix.kiwixmobile.R
|
import org.kiwix.kiwixmobile.R
|
||||||
import org.kiwix.kiwixmobile.database.BookDao
|
import org.kiwix.kiwixmobile.database.newdb.dao.NewBookDao
|
||||||
import org.kiwix.kiwixmobile.database.DownloadDao
|
import org.kiwix.kiwixmobile.database.newdb.dao.NewDownloadDao
|
||||||
import org.kiwix.kiwixmobile.database.NetworkLanguageDao
|
import org.kiwix.kiwixmobile.database.newdb.dao.NewLanguagesDao
|
||||||
import org.kiwix.kiwixmobile.downloader.Downloader
|
import org.kiwix.kiwixmobile.downloader.Downloader
|
||||||
import org.kiwix.kiwixmobile.downloader.model.BookOnDisk
|
import org.kiwix.kiwixmobile.downloader.model.BookOnDisk
|
||||||
import org.kiwix.kiwixmobile.downloader.model.DownloadItem
|
import org.kiwix.kiwixmobile.downloader.model.DownloadItem
|
||||||
@ -62,9 +63,9 @@ import java.util.concurrent.TimeUnit.SECONDS
|
|||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
class ZimManageViewModel @Inject constructor(
|
class ZimManageViewModel @Inject constructor(
|
||||||
private val downloadDao: DownloadDao,
|
private val downloadDao: NewDownloadDao,
|
||||||
private val bookDao: BookDao,
|
private val bookDao: NewBookDao,
|
||||||
private val languageDao: NetworkLanguageDao,
|
private val languageDao: NewLanguagesDao,
|
||||||
private val downloader: Downloader,
|
private val downloader: Downloader,
|
||||||
private val storageObserver: StorageObserver,
|
private val storageObserver: StorageObserver,
|
||||||
private val kiwixService: KiwixService,
|
private val kiwixService: KiwixService,
|
||||||
@ -101,7 +102,7 @@ class ZimManageViewModel @Inject constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun disposables(): Array<Disposable> {
|
private fun disposables(): Array<Disposable> {
|
||||||
val downloads: Flowable<MutableList<DownloadModel>> = downloadDao.downloads()
|
val downloads = downloadDao.downloads()
|
||||||
val downloadStatuses = downloadStatuses(downloads)
|
val downloadStatuses = downloadStatuses(downloads)
|
||||||
val booksFromDao = books()
|
val booksFromDao = books()
|
||||||
val networkLibrary = PublishProcessor.create<LibraryNetworkEntity>()
|
val networkLibrary = PublishProcessor.create<LibraryNetworkEntity>()
|
||||||
@ -131,7 +132,10 @@ class ZimManageViewModel @Inject constructor(
|
|||||||
.observeOn(Schedulers.io())
|
.observeOn(Schedulers.io())
|
||||||
.subscribe(
|
.subscribe(
|
||||||
{
|
{
|
||||||
kiwixService.library.subscribe(
|
kiwixService.library
|
||||||
|
.timeout(10, SECONDS)
|
||||||
|
.retry(5)
|
||||||
|
.subscribe(
|
||||||
{ library.onNext(it) },
|
{ library.onNext(it) },
|
||||||
{
|
{
|
||||||
it.printStackTrace()
|
it.printStackTrace()
|
||||||
@ -144,7 +148,7 @@ class ZimManageViewModel @Inject constructor(
|
|||||||
|
|
||||||
private fun removeNonExistingDownloadsFromDb(
|
private fun removeNonExistingDownloadsFromDb(
|
||||||
downloadStatuses: Flowable<List<DownloadStatus>>,
|
downloadStatuses: Flowable<List<DownloadStatus>>,
|
||||||
downloads: Flowable<MutableList<DownloadModel>>
|
downloads: Flowable<List<DownloadModel>>
|
||||||
) = downloadStatuses
|
) = downloadStatuses
|
||||||
.withLatestFrom(
|
.withLatestFrom(
|
||||||
downloads,
|
downloads,
|
||||||
@ -154,17 +158,16 @@ class ZimManageViewModel @Inject constructor(
|
|||||||
.map(this::downloadIdsWithNoStatusesOverBufferPeriod)
|
.map(this::downloadIdsWithNoStatusesOverBufferPeriod)
|
||||||
.subscribe(
|
.subscribe(
|
||||||
{
|
{
|
||||||
downloadDao.delete(*it.toTypedArray())
|
downloadDao.delete(*it.toLongArray())
|
||||||
},
|
},
|
||||||
Throwable::printStackTrace
|
Throwable::printStackTrace
|
||||||
)
|
)
|
||||||
|
|
||||||
private fun downloadIdsWithNoStatusesOverBufferPeriod(it: List<MutableList<Long>>) =
|
private fun downloadIdsWithNoStatusesOverBufferPeriod(noStatusIds: List<MutableList<Long>>) =
|
||||||
it.flatten()
|
noStatusIds.flatten()
|
||||||
.fold(mutableMapOf<Long, Int>(),
|
.fold(mutableMapOf<Long, Int>(), { acc, id -> acc.increment(id) })
|
||||||
{ acc, id -> acc.increment(id) })
|
.filter { (_, count) -> count == noStatusIds.size }
|
||||||
.filter { (_, value) -> value == it.size }
|
.map { (id, _) -> id }
|
||||||
.map { (key, _) -> key }
|
|
||||||
|
|
||||||
private fun combineToDownloadsWithoutStatuses(
|
private fun combineToDownloadsWithoutStatuses(
|
||||||
statuses: List<DownloadStatus>,
|
statuses: List<DownloadStatus>,
|
||||||
@ -183,7 +186,7 @@ class ZimManageViewModel @Inject constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun updateLanguageItemsForDialog() = requestLanguagesDialog
|
private fun updateLanguageItemsForDialog() = requestLanguagesDialog
|
||||||
.withLatestFrom(languageDao.allLanguages(),
|
.withLatestFrom(languageDao.languages(),
|
||||||
BiFunction<Unit, List<Language>, List<Language>> { _, languages -> languages })
|
BiFunction<Unit, List<Language>, List<Language>> { _, languages -> languages })
|
||||||
.subscribe(
|
.subscribe(
|
||||||
languageItems::postValue,
|
languageItems::postValue,
|
||||||
@ -197,12 +200,12 @@ class ZimManageViewModel @Inject constructor(
|
|||||||
|
|
||||||
private fun updateLibraryItems(
|
private fun updateLibraryItems(
|
||||||
booksFromDao: Flowable<List<BookOnDisk>>,
|
booksFromDao: Flowable<List<BookOnDisk>>,
|
||||||
downloads: Flowable<MutableList<DownloadModel>>,
|
downloads: Flowable<List<DownloadModel>>,
|
||||||
library: Flowable<LibraryNetworkEntity>
|
library: Flowable<LibraryNetworkEntity>
|
||||||
) = Flowable.combineLatest(
|
) = Flowable.combineLatest(
|
||||||
booksFromDao,
|
booksFromDao,
|
||||||
downloads,
|
downloads,
|
||||||
languageDao.allLanguages().filter { it.isNotEmpty() },
|
languageDao.languages().filter { it.isNotEmpty() },
|
||||||
library,
|
library,
|
||||||
requestFiltering
|
requestFiltering
|
||||||
.doOnNext { libraryListIsRefreshing.postValue(true) }
|
.doOnNext { libraryListIsRefreshing.postValue(true) }
|
||||||
@ -224,12 +227,12 @@ class ZimManageViewModel @Inject constructor(
|
|||||||
.subscribeOn(Schedulers.io())
|
.subscribeOn(Schedulers.io())
|
||||||
.map { it.books }
|
.map { it.books }
|
||||||
.withLatestFrom(
|
.withLatestFrom(
|
||||||
languageDao.allLanguages(),
|
languageDao.languages(),
|
||||||
BiFunction(this::combineToLanguageList)
|
BiFunction(this::combineToLanguageList)
|
||||||
)
|
)
|
||||||
.map { it.sortedBy(Language::language) }
|
.map { it.sortedBy(Language::language) }
|
||||||
.subscribe(
|
.subscribe(
|
||||||
languageDao::saveFilteredLanguages,
|
languageDao::insert,
|
||||||
Throwable::printStackTrace
|
Throwable::printStackTrace
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -334,14 +337,13 @@ class ZimManageViewModel @Inject constructor(
|
|||||||
books: List<Book>,
|
books: List<Book>,
|
||||||
sectionStringId: Int,
|
sectionStringId: Int,
|
||||||
sectionId: Long
|
sectionId: Long
|
||||||
) = if (books.isNotEmpty()) {
|
) =
|
||||||
|
if (books.isNotEmpty())
|
||||||
arrayOf(
|
arrayOf(
|
||||||
DividerItem(sectionId, context.getString(sectionStringId)),
|
DividerItem(sectionId, context.getString(sectionStringId)),
|
||||||
*toBookItems(books)
|
*toBookItems(books)
|
||||||
)
|
)
|
||||||
} else {
|
else emptyArray()
|
||||||
emptyArray()
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun applyUserFilter(
|
private fun applyUserFilter(
|
||||||
booksUnfilteredByLanguage: List<Book>,
|
booksUnfilteredByLanguage: List<Book>,
|
||||||
@ -370,8 +372,9 @@ class ZimManageViewModel @Inject constructor(
|
|||||||
)
|
)
|
||||||
.onBackpressureDrop()
|
.onBackpressureDrop()
|
||||||
.doOnNext { deviceListIsRefreshing.postValue(false) }
|
.doOnNext { deviceListIsRefreshing.postValue(false) }
|
||||||
|
.filter { it.isNotEmpty() }
|
||||||
.subscribe(
|
.subscribe(
|
||||||
bookDao::saveBooks,
|
bookDao::insert,
|
||||||
Throwable::printStackTrace
|
Throwable::printStackTrace
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -405,11 +408,12 @@ class ZimManageViewModel @Inject constructor(
|
|||||||
.observeOn(Schedulers.io())
|
.observeOn(Schedulers.io())
|
||||||
.subscribeOn(Schedulers.io())
|
.subscribeOn(Schedulers.io())
|
||||||
.map { it.filter { status -> status.state == Successful } }
|
.map { it.filter { status -> status.state == Successful } }
|
||||||
|
.filter { it.isNotEmpty() }
|
||||||
.subscribe(
|
.subscribe(
|
||||||
{
|
{
|
||||||
bookDao.saveBooks(it.map { downloadStatus -> downloadStatus.toBookOnDisk() })
|
bookDao.insert(it.map { downloadStatus -> downloadStatus.toBookOnDisk() })
|
||||||
downloadDao.delete(
|
downloadDao.delete(
|
||||||
*it.map { status -> status.downloadId }.toTypedArray()
|
*it.map { status -> status.downloadId }.toLongArray()
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
Throwable::printStackTrace
|
Throwable::printStackTrace
|
||||||
@ -423,7 +427,7 @@ class ZimManageViewModel @Inject constructor(
|
|||||||
Throwable::printStackTrace
|
Throwable::printStackTrace
|
||||||
)
|
)
|
||||||
|
|
||||||
private fun downloadStatuses(downloads: Flowable<MutableList<DownloadModel>>) =
|
private fun downloadStatuses(downloads: Flowable<List<DownloadModel>>) =
|
||||||
Flowable.combineLatest(
|
Flowable.combineLatest(
|
||||||
downloads,
|
downloads,
|
||||||
Flowable.interval(1, SECONDS),
|
Flowable.interval(1, SECONDS),
|
||||||
|
@ -3,7 +3,8 @@ package org.kiwix.kiwixmobile.zim_manager.fileselect_view
|
|||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import io.reactivex.processors.PublishProcessor
|
import io.reactivex.processors.PublishProcessor
|
||||||
import org.kiwix.kiwixmobile.database.DownloadDao
|
import io.reactivex.schedulers.Schedulers
|
||||||
|
import org.kiwix.kiwixmobile.database.newdb.dao.NewDownloadDao
|
||||||
import org.kiwix.kiwixmobile.downloader.model.BookOnDisk
|
import org.kiwix.kiwixmobile.downloader.model.BookOnDisk
|
||||||
import org.kiwix.kiwixmobile.downloader.model.DownloadModel
|
import org.kiwix.kiwixmobile.downloader.model.DownloadModel
|
||||||
import org.kiwix.kiwixmobile.utils.SharedPreferenceUtil
|
import org.kiwix.kiwixmobile.utils.SharedPreferenceUtil
|
||||||
@ -14,14 +15,19 @@ import javax.inject.Inject
|
|||||||
class StorageObserver @Inject constructor(
|
class StorageObserver @Inject constructor(
|
||||||
private val context: Context,
|
private val context: Context,
|
||||||
private val sharedPreferenceUtil: SharedPreferenceUtil,
|
private val sharedPreferenceUtil: SharedPreferenceUtil,
|
||||||
private val downloadDao: DownloadDao
|
private val downloadDao: NewDownloadDao
|
||||||
) {
|
) {
|
||||||
|
|
||||||
private val _booksOnFileSystem = PublishProcessor.create<Collection<BookOnDisk>>()
|
private val _booksOnFileSystem = PublishProcessor.create<Collection<BookOnDisk>>()
|
||||||
val booksOnFileSystem = _booksOnFileSystem.distinctUntilChanged()
|
val booksOnFileSystem = _booksOnFileSystem.distinctUntilChanged()
|
||||||
.doOnSubscribe { scanFiles(downloadDao.downloads) }
|
.doOnSubscribe {
|
||||||
|
downloadDao.downloads()
|
||||||
|
.subscribeOn(Schedulers.io())
|
||||||
|
.take(1)
|
||||||
|
.subscribe(this::scanFiles, Throwable::printStackTrace)
|
||||||
|
}
|
||||||
|
|
||||||
private fun scanFiles(downloads: MutableList<DownloadModel>) {
|
private fun scanFiles(downloads: List<DownloadModel>) {
|
||||||
FileSearch(context, downloads, object : ResultListener {
|
FileSearch(context, downloads, object : ResultListener {
|
||||||
val foundBooks = mutableSetOf<BookOnDisk>()
|
val foundBooks = mutableSetOf<BookOnDisk>()
|
||||||
|
|
||||||
|
@ -38,7 +38,7 @@ import org.kiwix.kiwixmobile.R
|
|||||||
import org.kiwix.kiwixmobile.R.string
|
import org.kiwix.kiwixmobile.R.string
|
||||||
import org.kiwix.kiwixmobile.ZimContentProvider
|
import org.kiwix.kiwixmobile.ZimContentProvider
|
||||||
import org.kiwix.kiwixmobile.base.BaseFragment
|
import org.kiwix.kiwixmobile.base.BaseFragment
|
||||||
import org.kiwix.kiwixmobile.database.BookDao
|
import org.kiwix.kiwixmobile.database.newdb.dao.NewBookDao
|
||||||
import org.kiwix.kiwixmobile.di.components.ActivityComponent
|
import org.kiwix.kiwixmobile.di.components.ActivityComponent
|
||||||
import org.kiwix.kiwixmobile.downloader.model.BookOnDisk
|
import org.kiwix.kiwixmobile.downloader.model.BookOnDisk
|
||||||
import org.kiwix.kiwixmobile.extensions.toast
|
import org.kiwix.kiwixmobile.extensions.toast
|
||||||
@ -56,7 +56,7 @@ import javax.inject.Inject
|
|||||||
class ZimFileSelectFragment : BaseFragment() {
|
class ZimFileSelectFragment : BaseFragment() {
|
||||||
|
|
||||||
@Inject lateinit var sharedPreferenceUtil: SharedPreferenceUtil
|
@Inject lateinit var sharedPreferenceUtil: SharedPreferenceUtil
|
||||||
@Inject lateinit var bookDao: BookDao
|
@Inject lateinit var bookDao: NewBookDao
|
||||||
@Inject lateinit var dialogShower: DialogShower
|
@Inject lateinit var dialogShower: DialogShower
|
||||||
@Inject lateinit var viewModelFactory: ViewModelProvider.Factory
|
@Inject lateinit var viewModelFactory: ViewModelProvider.Factory
|
||||||
@Inject lateinit var bookUtils: BookUtils
|
@Inject lateinit var bookUtils: BookUtils
|
||||||
@ -161,7 +161,7 @@ class ZimFileSelectFragment : BaseFragment() {
|
|||||||
if (file.exists()) {
|
if (file.exists()) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
bookDao.deleteBook(book.databaseId)
|
bookDao.delete(book.databaseId!!)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,12 +1,14 @@
|
|||||||
buildscript {
|
buildscript {
|
||||||
ext.kotlin_version = '1.3.31'
|
ext.kotlin_version = '1.3.31'
|
||||||
|
ext.objectboxVersion = '2.3.4'
|
||||||
repositories {
|
repositories {
|
||||||
jcenter()
|
jcenter()
|
||||||
google()
|
google()
|
||||||
}
|
}
|
||||||
dependencies {
|
dependencies {
|
||||||
classpath 'com.android.tools.build:gradle:3.4.0'
|
classpath 'com.android.tools.build:gradle:3.4.1'
|
||||||
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
||||||
|
classpath "io.objectbox:objectbox-gradle-plugin:$objectboxVersion"
|
||||||
|
|
||||||
// NOTE: Do not place your application dependencies here; they belong
|
// NOTE: Do not place your application dependencies here; they belong
|
||||||
// in the individual module build.gradle files
|
// in the individual module build.gradle files
|
||||||
|
Loading…
x
Reference in New Issue
Block a user