mirror of
https://github.com/kiwix/kiwix-android.git
synced 2025-09-16 19:05:27 -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: 'kotlin-android'
|
||||
apply plugin: 'kotlin-android-extensions'
|
||||
apply plugin: 'kotlin-kapt'
|
||||
apply plugin: 'checkstyle'
|
||||
apply plugin: 'testdroid'
|
||||
apply plugin: 'io.objectbox'
|
||||
|
||||
repositories {
|
||||
mavenCentral()
|
||||
@ -29,7 +31,6 @@ repositories {
|
||||
}
|
||||
|
||||
String[] archs = ['arm64-v8a', 'armeabi', 'mips', 'mips64', 'x86', 'x86_64']
|
||||
|
||||
dependencies {
|
||||
|
||||
// Get kiwixlib online if it is not populated locally
|
||||
@ -79,14 +80,14 @@ dependencies {
|
||||
androidTestCompileOnly "javax.annotation:javax.annotation-api:$javaxAnnotationVersion"
|
||||
implementation "com.google.dagger:dagger:$daggerVersion"
|
||||
implementation "com.google.dagger:dagger-android:$daggerVersion"
|
||||
annotationProcessor "com.google.dagger:dagger-compiler:$daggerVersion"
|
||||
annotationProcessor "com.google.dagger:dagger-android-processor:$daggerVersion"
|
||||
androidTestAnnotationProcessor "com.google.dagger:dagger-compiler:$daggerVersion"
|
||||
kapt "com.google.dagger:dagger-compiler:$daggerVersion"
|
||||
kapt "com.google.dagger:dagger-android-processor:$daggerVersion"
|
||||
kaptAndroidTest "com.google.dagger:dagger-compiler:$daggerVersion"
|
||||
|
||||
// SquiDB
|
||||
implementation 'com.yahoo.squidb:squidb: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
|
||||
implementation "com.squareup.okhttp3:okhttp:$okHttpVersion"
|
||||
@ -102,7 +103,7 @@ dependencies {
|
||||
|
||||
// Butterknife
|
||||
implementation 'com.jakewharton:butterknife:8.0.1'
|
||||
annotationProcessor 'com.jakewharton:butterknife-compiler:8.0.1'
|
||||
kapt 'com.jakewharton:butterknife-compiler:8.0.1'
|
||||
|
||||
// RxJava
|
||||
implementation "io.reactivex.rxjava2:rxandroid:$rxAndroidVersion"
|
||||
@ -133,6 +134,8 @@ dependencies {
|
||||
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
|
||||
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
|
||||
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
|
||||
@ -158,7 +161,7 @@ android {
|
||||
compileSdkVersion 27
|
||||
|
||||
defaultConfig {
|
||||
minSdkVersion 14
|
||||
minSdkVersion 15
|
||||
targetSdkVersion 27
|
||||
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
|
||||
// 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 javax.inject.Inject;
|
||||
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.library.entity.LibraryNetworkEntity;
|
||||
import org.kiwix.kiwixmobile.utils.SplashActivity;
|
||||
@ -25,7 +25,7 @@ import static org.kiwix.kiwixmobile.utils.LanguageUtils.getCurrentLocale;
|
||||
public class KiwixErrorActivity extends BaseActivity {
|
||||
|
||||
@Inject
|
||||
BookDao bookDao;
|
||||
NewBookDao bookDao;
|
||||
|
||||
@BindView(R.id.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.database.entity.BookDatabaseEntity;
|
||||
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.NetworkLanguageDatabaseEntity;
|
||||
import org.kiwix.kiwixmobile.database.entity.RecentSearch;
|
||||
@ -67,7 +66,6 @@ public class KiwixDatabase extends SquidDatabase {
|
||||
RecentSearch.TABLE,
|
||||
Bookmarks.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;
|
||||
|
||||
@Module(includes = {
|
||||
ActivityBindingModule.class, AndroidInjectionModule.class, DownloaderModule.class,
|
||||
ViewModelModule.class
|
||||
ActivityBindingModule.class,
|
||||
AndroidInjectionModule.class,
|
||||
DownloaderModule.class,
|
||||
ViewModelModule.class,
|
||||
DatabaseModule.class
|
||||
})
|
||||
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.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.network.KiwixService;
|
||||
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 {
|
||||
|
||||
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);
|
||||
|
||||
return new OkHttpClient().newBuilder().followRedirects(true).followSslRedirects(true)
|
||||
.connectTimeout(10, TimeUnit.SECONDS)
|
||||
.readTimeout(10, TimeUnit.SECONDS)
|
||||
.addNetworkInterceptor(logging)
|
||||
.addNetworkInterceptor(new UserAgentInterceptor(useragent)).build();
|
||||
}
|
||||
|
@ -52,7 +52,7 @@ import okio.BufferedSource;
|
||||
import org.kiwix.kiwixmobile.KiwixApplication;
|
||||
import org.kiwix.kiwixmobile.KiwixMobileActivity;
|
||||
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.network.KiwixService;
|
||||
import org.kiwix.kiwixmobile.utils.Constants;
|
||||
@ -106,7 +106,7 @@ public class DownloadService extends Service {
|
||||
SharedPreferenceUtil sharedPreferenceUtil;
|
||||
|
||||
@Inject
|
||||
BookDao bookDao;
|
||||
NewBookDao bookDao;
|
||||
|
||||
public static void setDownloadFragment(DownloadFragment dFragment) {
|
||||
downloadFragment = dFragment;
|
||||
|
@ -18,8 +18,7 @@
|
||||
|
||||
package org.kiwix.kiwixmobile.downloader
|
||||
|
||||
import io.reactivex.schedulers.Schedulers
|
||||
import org.kiwix.kiwixmobile.database.DownloadDao
|
||||
import org.kiwix.kiwixmobile.database.newdb.dao.NewDownloadDao
|
||||
import org.kiwix.kiwixmobile.downloader.model.DownloadItem
|
||||
import org.kiwix.kiwixmobile.downloader.model.DownloadModel
|
||||
import org.kiwix.kiwixmobile.downloader.model.DownloadRequest
|
||||
@ -29,14 +28,12 @@ import javax.inject.Inject
|
||||
|
||||
class DownloaderImpl @Inject constructor(
|
||||
private val downloadRequester: DownloadRequester,
|
||||
private val downloadDao: DownloadDao,
|
||||
private val downloadDao: NewDownloadDao,
|
||||
private val kiwixService: KiwixService
|
||||
) : Downloader {
|
||||
|
||||
override fun download(book: LibraryNetworkEntity.Book) {
|
||||
kiwixService.getMetaLinks(book.url)
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(Schedulers.io())
|
||||
.take(1)
|
||||
.subscribe(
|
||||
{
|
||||
@ -45,7 +42,7 @@ class DownloaderImpl @Inject constructor(
|
||||
DownloadRequest(it, book)
|
||||
)
|
||||
downloadDao.insert(
|
||||
DownloadModel(downloadId, book)
|
||||
DownloadModel(downloadId = downloadId, book = book)
|
||||
)
|
||||
}
|
||||
},
|
||||
|
@ -1,5 +1,6 @@
|
||||
package org.kiwix.kiwixmobile.downloader.model
|
||||
|
||||
import org.kiwix.kiwixmobile.database.newdb.entities.BookOnDiskEntity
|
||||
import org.kiwix.kiwixmobile.library.entity.LibraryNetworkEntity.Book
|
||||
import java.io.File
|
||||
|
||||
@ -7,4 +8,10 @@ data class BookOnDisk(
|
||||
val databaseId: Long? = null,
|
||||
val book: Book,
|
||||
val file: File
|
||||
) {
|
||||
constructor(bookOnDiskEntity: BookOnDiskEntity) : this(
|
||||
bookOnDiskEntity.id,
|
||||
bookOnDiskEntity.toBook(),
|
||||
bookOnDiskEntity.file
|
||||
)
|
||||
}
|
@ -17,9 +17,12 @@
|
||||
*/
|
||||
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
|
||||
|
||||
data class DownloadModel(
|
||||
val databaseId: Long? = null,
|
||||
val downloadId: Long,
|
||||
val book: LibraryNetworkEntity.Book
|
||||
)
|
||||
|
@ -22,10 +22,8 @@ import android.net.ConnectivityManager;
|
||||
import android.net.NetworkInfo;
|
||||
import android.os.Build;
|
||||
import android.util.Log;
|
||||
|
||||
import org.kiwix.kiwixmobile.R;
|
||||
|
||||
import java.util.UUID;
|
||||
import org.kiwix.kiwixmobile.R;
|
||||
|
||||
import static org.kiwix.kiwixmobile.utils.Constants.TAG_KIWIX;
|
||||
|
||||
@ -86,9 +84,11 @@ public class NetworkUtils {
|
||||
}
|
||||
|
||||
public static String parseURL(Context context, String url) {
|
||||
String details;
|
||||
if (url == null) {
|
||||
return "";
|
||||
}
|
||||
try {
|
||||
details = url.substring(url.lastIndexOf("/") + 1);
|
||||
String details = url.substring(url.lastIndexOf("/") + 1);
|
||||
int beginIndex = details.indexOf("_", details.indexOf("_") + 1) + 1;
|
||||
int endIndex = details.lastIndexOf("_");
|
||||
if (beginIndex < 0 || endIndex > details.length() || beginIndex > endIndex) {
|
||||
|
@ -20,14 +20,15 @@ package org.kiwix.kiwixmobile.zim_manager
|
||||
import android.app.DownloadManager
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.os.Bundle
|
||||
import org.kiwix.kiwixmobile.KiwixApplication
|
||||
import org.kiwix.kiwixmobile.database.DownloadDao
|
||||
import org.kiwix.kiwixmobile.database.newdb.dao.NewDownloadDao
|
||||
import javax.inject.Inject
|
||||
|
||||
class DownloadNotificationClickedReceiver : BaseBroadcastReceiver() {
|
||||
override val action: String = DownloadManager.ACTION_NOTIFICATION_CLICKED
|
||||
|
||||
@Inject lateinit var downloadDao: DownloadDao
|
||||
@Inject lateinit var downloadDao: NewDownloadDao
|
||||
|
||||
override fun onIntentWithActionReceived(
|
||||
context: Context,
|
||||
@ -35,10 +36,7 @@ class DownloadNotificationClickedReceiver : BaseBroadcastReceiver() {
|
||||
) {
|
||||
KiwixApplication.getApplicationComponent()
|
||||
.inject(this)
|
||||
val longArray =
|
||||
intent.extras?.getLongArray(DownloadManager.EXTRA_NOTIFICATION_CLICK_DOWNLOAD_IDS)
|
||||
?: longArrayOf()
|
||||
if (downloadDao.containsAny(longArray.toTypedArray())) {
|
||||
if (downloadDao.containsAny(*longArrayFrom(intent.extras))) {
|
||||
context.startActivity(
|
||||
Intent(context, ZimManageActivity::class.java).apply {
|
||||
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.style
|
||||
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.settings.KiwixSettingsActivity
|
||||
import org.kiwix.kiwixmobile.utils.Constants.TAG_KIWIX
|
||||
@ -68,7 +68,7 @@ class ZimManageActivity : BaseActivity() {
|
||||
|
||||
@Inject lateinit var viewModelFactory: ViewModelProvider.Factory
|
||||
@Inject lateinit var sharedPreferenceUtil: SharedPreferenceUtil
|
||||
@Inject lateinit var languagesDao: NetworkLanguageDao
|
||||
@Inject lateinit var languagesDao: NewLanguagesDao
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
@ -111,7 +111,7 @@ class ZimManageActivity : BaseActivity() {
|
||||
.apply {
|
||||
onOkClicked = {
|
||||
Flowable.fromCallable {
|
||||
languagesDao.saveFilteredLanguages(it)
|
||||
languagesDao.insert(it)
|
||||
}
|
||||
.subscribeOn(Schedulers.io())
|
||||
.subscribe()
|
||||
|
@ -21,6 +21,7 @@ package org.kiwix.kiwixmobile.zim_manager
|
||||
import android.app.Application
|
||||
import android.arch.lifecycle.MutableLiveData
|
||||
import android.arch.lifecycle.ViewModel
|
||||
import android.util.Log
|
||||
import io.reactivex.Flowable
|
||||
import io.reactivex.disposables.CompositeDisposable
|
||||
import io.reactivex.disposables.Disposable
|
||||
@ -30,9 +31,9 @@ import io.reactivex.processors.BehaviorProcessor
|
||||
import io.reactivex.processors.PublishProcessor
|
||||
import io.reactivex.schedulers.Schedulers
|
||||
import org.kiwix.kiwixmobile.R
|
||||
import org.kiwix.kiwixmobile.database.BookDao
|
||||
import org.kiwix.kiwixmobile.database.DownloadDao
|
||||
import org.kiwix.kiwixmobile.database.NetworkLanguageDao
|
||||
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.downloader.Downloader
|
||||
import org.kiwix.kiwixmobile.downloader.model.BookOnDisk
|
||||
import org.kiwix.kiwixmobile.downloader.model.DownloadItem
|
||||
@ -62,9 +63,9 @@ import java.util.concurrent.TimeUnit.SECONDS
|
||||
import javax.inject.Inject
|
||||
|
||||
class ZimManageViewModel @Inject constructor(
|
||||
private val downloadDao: DownloadDao,
|
||||
private val bookDao: BookDao,
|
||||
private val languageDao: NetworkLanguageDao,
|
||||
private val downloadDao: NewDownloadDao,
|
||||
private val bookDao: NewBookDao,
|
||||
private val languageDao: NewLanguagesDao,
|
||||
private val downloader: Downloader,
|
||||
private val storageObserver: StorageObserver,
|
||||
private val kiwixService: KiwixService,
|
||||
@ -101,7 +102,7 @@ class ZimManageViewModel @Inject constructor(
|
||||
}
|
||||
|
||||
private fun disposables(): Array<Disposable> {
|
||||
val downloads: Flowable<MutableList<DownloadModel>> = downloadDao.downloads()
|
||||
val downloads = downloadDao.downloads()
|
||||
val downloadStatuses = downloadStatuses(downloads)
|
||||
val booksFromDao = books()
|
||||
val networkLibrary = PublishProcessor.create<LibraryNetworkEntity>()
|
||||
@ -131,7 +132,10 @@ class ZimManageViewModel @Inject constructor(
|
||||
.observeOn(Schedulers.io())
|
||||
.subscribe(
|
||||
{
|
||||
kiwixService.library.subscribe(
|
||||
kiwixService.library
|
||||
.timeout(10, SECONDS)
|
||||
.retry(5)
|
||||
.subscribe(
|
||||
{ library.onNext(it) },
|
||||
{
|
||||
it.printStackTrace()
|
||||
@ -144,7 +148,7 @@ class ZimManageViewModel @Inject constructor(
|
||||
|
||||
private fun removeNonExistingDownloadsFromDb(
|
||||
downloadStatuses: Flowable<List<DownloadStatus>>,
|
||||
downloads: Flowable<MutableList<DownloadModel>>
|
||||
downloads: Flowable<List<DownloadModel>>
|
||||
) = downloadStatuses
|
||||
.withLatestFrom(
|
||||
downloads,
|
||||
@ -154,17 +158,16 @@ class ZimManageViewModel @Inject constructor(
|
||||
.map(this::downloadIdsWithNoStatusesOverBufferPeriod)
|
||||
.subscribe(
|
||||
{
|
||||
downloadDao.delete(*it.toTypedArray())
|
||||
downloadDao.delete(*it.toLongArray())
|
||||
},
|
||||
Throwable::printStackTrace
|
||||
)
|
||||
|
||||
private fun downloadIdsWithNoStatusesOverBufferPeriod(it: List<MutableList<Long>>) =
|
||||
it.flatten()
|
||||
.fold(mutableMapOf<Long, Int>(),
|
||||
{ acc, id -> acc.increment(id) })
|
||||
.filter { (_, value) -> value == it.size }
|
||||
.map { (key, _) -> key }
|
||||
private fun downloadIdsWithNoStatusesOverBufferPeriod(noStatusIds: List<MutableList<Long>>) =
|
||||
noStatusIds.flatten()
|
||||
.fold(mutableMapOf<Long, Int>(), { acc, id -> acc.increment(id) })
|
||||
.filter { (_, count) -> count == noStatusIds.size }
|
||||
.map { (id, _) -> id }
|
||||
|
||||
private fun combineToDownloadsWithoutStatuses(
|
||||
statuses: List<DownloadStatus>,
|
||||
@ -183,7 +186,7 @@ class ZimManageViewModel @Inject constructor(
|
||||
}
|
||||
|
||||
private fun updateLanguageItemsForDialog() = requestLanguagesDialog
|
||||
.withLatestFrom(languageDao.allLanguages(),
|
||||
.withLatestFrom(languageDao.languages(),
|
||||
BiFunction<Unit, List<Language>, List<Language>> { _, languages -> languages })
|
||||
.subscribe(
|
||||
languageItems::postValue,
|
||||
@ -197,12 +200,12 @@ class ZimManageViewModel @Inject constructor(
|
||||
|
||||
private fun updateLibraryItems(
|
||||
booksFromDao: Flowable<List<BookOnDisk>>,
|
||||
downloads: Flowable<MutableList<DownloadModel>>,
|
||||
downloads: Flowable<List<DownloadModel>>,
|
||||
library: Flowable<LibraryNetworkEntity>
|
||||
) = Flowable.combineLatest(
|
||||
booksFromDao,
|
||||
downloads,
|
||||
languageDao.allLanguages().filter { it.isNotEmpty() },
|
||||
languageDao.languages().filter { it.isNotEmpty() },
|
||||
library,
|
||||
requestFiltering
|
||||
.doOnNext { libraryListIsRefreshing.postValue(true) }
|
||||
@ -224,12 +227,12 @@ class ZimManageViewModel @Inject constructor(
|
||||
.subscribeOn(Schedulers.io())
|
||||
.map { it.books }
|
||||
.withLatestFrom(
|
||||
languageDao.allLanguages(),
|
||||
languageDao.languages(),
|
||||
BiFunction(this::combineToLanguageList)
|
||||
)
|
||||
.map { it.sortedBy(Language::language) }
|
||||
.subscribe(
|
||||
languageDao::saveFilteredLanguages,
|
||||
languageDao::insert,
|
||||
Throwable::printStackTrace
|
||||
)
|
||||
|
||||
@ -334,14 +337,13 @@ class ZimManageViewModel @Inject constructor(
|
||||
books: List<Book>,
|
||||
sectionStringId: Int,
|
||||
sectionId: Long
|
||||
) = if (books.isNotEmpty()) {
|
||||
) =
|
||||
if (books.isNotEmpty())
|
||||
arrayOf(
|
||||
DividerItem(sectionId, context.getString(sectionStringId)),
|
||||
*toBookItems(books)
|
||||
)
|
||||
} else {
|
||||
emptyArray()
|
||||
}
|
||||
else emptyArray()
|
||||
|
||||
private fun applyUserFilter(
|
||||
booksUnfilteredByLanguage: List<Book>,
|
||||
@ -370,8 +372,9 @@ class ZimManageViewModel @Inject constructor(
|
||||
)
|
||||
.onBackpressureDrop()
|
||||
.doOnNext { deviceListIsRefreshing.postValue(false) }
|
||||
.filter { it.isNotEmpty() }
|
||||
.subscribe(
|
||||
bookDao::saveBooks,
|
||||
bookDao::insert,
|
||||
Throwable::printStackTrace
|
||||
)
|
||||
|
||||
@ -405,11 +408,12 @@ class ZimManageViewModel @Inject constructor(
|
||||
.observeOn(Schedulers.io())
|
||||
.subscribeOn(Schedulers.io())
|
||||
.map { it.filter { status -> status.state == Successful } }
|
||||
.filter { it.isNotEmpty() }
|
||||
.subscribe(
|
||||
{
|
||||
bookDao.saveBooks(it.map { downloadStatus -> downloadStatus.toBookOnDisk() })
|
||||
bookDao.insert(it.map { downloadStatus -> downloadStatus.toBookOnDisk() })
|
||||
downloadDao.delete(
|
||||
*it.map { status -> status.downloadId }.toTypedArray()
|
||||
*it.map { status -> status.downloadId }.toLongArray()
|
||||
)
|
||||
},
|
||||
Throwable::printStackTrace
|
||||
@ -423,7 +427,7 @@ class ZimManageViewModel @Inject constructor(
|
||||
Throwable::printStackTrace
|
||||
)
|
||||
|
||||
private fun downloadStatuses(downloads: Flowable<MutableList<DownloadModel>>) =
|
||||
private fun downloadStatuses(downloads: Flowable<List<DownloadModel>>) =
|
||||
Flowable.combineLatest(
|
||||
downloads,
|
||||
Flowable.interval(1, SECONDS),
|
||||
|
@ -3,7 +3,8 @@ package org.kiwix.kiwixmobile.zim_manager.fileselect_view
|
||||
import android.content.Context
|
||||
import android.util.Log
|
||||
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.DownloadModel
|
||||
import org.kiwix.kiwixmobile.utils.SharedPreferenceUtil
|
||||
@ -14,14 +15,19 @@ import javax.inject.Inject
|
||||
class StorageObserver @Inject constructor(
|
||||
private val context: Context,
|
||||
private val sharedPreferenceUtil: SharedPreferenceUtil,
|
||||
private val downloadDao: DownloadDao
|
||||
private val downloadDao: NewDownloadDao
|
||||
) {
|
||||
|
||||
private val _booksOnFileSystem = PublishProcessor.create<Collection<BookOnDisk>>()
|
||||
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 {
|
||||
val foundBooks = mutableSetOf<BookOnDisk>()
|
||||
|
||||
|
@ -38,7 +38,7 @@ import org.kiwix.kiwixmobile.R
|
||||
import org.kiwix.kiwixmobile.R.string
|
||||
import org.kiwix.kiwixmobile.ZimContentProvider
|
||||
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.downloader.model.BookOnDisk
|
||||
import org.kiwix.kiwixmobile.extensions.toast
|
||||
@ -56,7 +56,7 @@ import javax.inject.Inject
|
||||
class ZimFileSelectFragment : BaseFragment() {
|
||||
|
||||
@Inject lateinit var sharedPreferenceUtil: SharedPreferenceUtil
|
||||
@Inject lateinit var bookDao: BookDao
|
||||
@Inject lateinit var bookDao: NewBookDao
|
||||
@Inject lateinit var dialogShower: DialogShower
|
||||
@Inject lateinit var viewModelFactory: ViewModelProvider.Factory
|
||||
@Inject lateinit var bookUtils: BookUtils
|
||||
@ -161,7 +161,7 @@ class ZimFileSelectFragment : BaseFragment() {
|
||||
if (file.exists()) {
|
||||
return false
|
||||
}
|
||||
bookDao.deleteBook(book.databaseId)
|
||||
bookDao.delete(book.databaseId!!)
|
||||
return true
|
||||
}
|
||||
}
|
@ -1,12 +1,14 @@
|
||||
buildscript {
|
||||
ext.kotlin_version = '1.3.31'
|
||||
ext.objectboxVersion = '2.3.4'
|
||||
repositories {
|
||||
jcenter()
|
||||
google()
|
||||
}
|
||||
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 "io.objectbox:objectbox-gradle-plugin:$objectboxVersion"
|
||||
|
||||
// NOTE: Do not place your application dependencies here; they belong
|
||||
// in the individual module build.gradle files
|
||||
|
Loading…
x
Reference in New Issue
Block a user