Skip to content

Commit e6a97be

Browse files
committed
Merge branch 'archie94-room_experiments'
2 parents b8d4b9e + 4016ae1 commit e6a97be

38 files changed

+1410
-571
lines changed

build.gradle

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
buildscript {
2+
ext.kotlin_version = '1.3.0'
23
repositories {
34
google()
45
jcenter()
56
}
67
dependencies {
7-
classpath 'com.android.tools.build:gradle:3.5.0-alpha01'
8+
classpath 'com.android.tools.build:gradle:3.3.0'
9+
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
810
}
911

1012
}
@@ -23,6 +25,12 @@ def getVersionName = { ->
2325

2426
apply plugin: 'com.android.application'
2527

28+
apply plugin: 'kotlin-android'
29+
30+
apply plugin: 'kotlin-android-extensions'
31+
32+
apply plugin: 'kotlin-kapt'
33+
2634
repositories {
2735
google()
2836
jcenter()
@@ -89,6 +97,17 @@ android {
8997
ndk {
9098
abiFilters "armeabi", "armeabi-v7a", "x86"
9199
}
100+
101+
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
102+
103+
// clear app state completely between tests
104+
testInstrumentationRunnerArguments clearPackageData: 'true'
105+
106+
javaCompileOptions {
107+
annotationProcessorOptions {
108+
arguments = ["room.schemaLocation": "$projectDir/schemas".toString()]
109+
}
110+
}
92111
}
93112

94113

@@ -107,6 +126,10 @@ android {
107126
checkReleaseBuilds false
108127
abortOnError false
109128
}
129+
130+
sourceSets {
131+
androidTest.assets.srcDirs += files("$projectDir/schemas".toString())
132+
}
110133
}
111134

112135
dependencies {
@@ -119,7 +142,6 @@ dependencies {
119142
implementation 'com.google.android.material:material:1.0.0'
120143
implementation 'com.wdullaer:materialdatetimepicker:4.1.1'
121144
implementation 'com.github.guardianproject:signal-cli-android:v0.6.0-android-beta-1'
122-
implementation 'com.github.satyan:sugar:1.5'
123145
implementation 'net.the4thdimension:audio-wife:1.0.3'
124146
implementation 'com.github.apl-devs:appintro:master' /* use master until androidx ver is released */
125147
implementation 'info.guardianproject.netcipher:netcipher:2.0.0-beta1'
@@ -140,4 +162,22 @@ dependencies {
140162
implementation 'io.github.silvaren:easyrs:0.5.3'
141163
implementation 'org.jcodec:jcodec:0.2.3'
142164
implementation 'org.jcodec:jcodec-android:0.2.3'
165+
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
166+
167+
// Room
168+
implementation "android.arch.persistence.room:runtime:1.1.1"
169+
kapt "android.arch.persistence.room:compiler:1.1.1"
170+
implementation "android.arch.lifecycle:runtime:1.1.1"
171+
implementation "android.arch.lifecycle:extensions:1.1.1"
172+
173+
testImplementation "junit:junit:4.12"
174+
androidTestImplementation 'androidx.test:runner:1.1.0'
175+
androidTestImplementation 'androidx.test:core:1.0.0'
176+
androidTestImplementation 'androidx.test:rules:1.1.0'
177+
androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0'
178+
androidTestImplementation 'androidx.test.espresso:espresso-intents:3.1.0'
179+
androidTestImplementation "android.arch.persistence.room:testing:1.1.1"
180+
181+
// android-job
182+
implementation 'com.evernote:android-job:1.2.6'
143183
}
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
{
2+
"formatVersion": 1,
3+
"database": {
4+
"version": 4,
5+
"identityHash": "e6812687ff1f63ddcb6ebbf062ac6267",
6+
"entities": [
7+
{
8+
"tableName": "EVENT",
9+
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`ID` INTEGER PRIMARY KEY AUTOINCREMENT, `M_START_TIME` INTEGER)",
10+
"fields": [
11+
{
12+
"fieldPath": "id",
13+
"columnName": "ID",
14+
"affinity": "INTEGER",
15+
"notNull": false
16+
},
17+
{
18+
"fieldPath": "mStartTime",
19+
"columnName": "M_START_TIME",
20+
"affinity": "INTEGER",
21+
"notNull": false
22+
}
23+
],
24+
"primaryKey": {
25+
"columnNames": [
26+
"ID"
27+
],
28+
"autoGenerate": true
29+
},
30+
"indices": [],
31+
"foreignKeys": []
32+
},
33+
{
34+
"tableName": "EVENT_TRIGGER",
35+
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`ID` INTEGER PRIMARY KEY AUTOINCREMENT, `M_TYPE` INTEGER, `M_TIME` INTEGER, `M_EVENT_ID` INTEGER, `M_PATH` TEXT)",
36+
"fields": [
37+
{
38+
"fieldPath": "id",
39+
"columnName": "ID",
40+
"affinity": "INTEGER",
41+
"notNull": false
42+
},
43+
{
44+
"fieldPath": "mType",
45+
"columnName": "M_TYPE",
46+
"affinity": "INTEGER",
47+
"notNull": false
48+
},
49+
{
50+
"fieldPath": "mTime",
51+
"columnName": "M_TIME",
52+
"affinity": "INTEGER",
53+
"notNull": false
54+
},
55+
{
56+
"fieldPath": "mEventId",
57+
"columnName": "M_EVENT_ID",
58+
"affinity": "INTEGER",
59+
"notNull": false
60+
},
61+
{
62+
"fieldPath": "mPath",
63+
"columnName": "M_PATH",
64+
"affinity": "TEXT",
65+
"notNull": false
66+
}
67+
],
68+
"primaryKey": {
69+
"columnNames": [
70+
"ID"
71+
],
72+
"autoGenerate": true
73+
},
74+
"indices": [],
75+
"foreignKeys": []
76+
}
77+
],
78+
"setupQueries": [
79+
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
80+
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, \"e6812687ff1f63ddcb6ebbf062ac6267\")"
81+
]
82+
}
83+
}
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package org.havenapp.main.database.migration
2+
3+
import androidx.test.core.app.ApplicationProvider
4+
import androidx.room.Room
5+
import androidx.room.testing.MigrationTestHelper
6+
import androidx.sqlite.db.framework.FrameworkSQLiteOpenHelperFactory
7+
import androidx.test.platform.app.InstrumentationRegistry
8+
import junit.framework.Assert.assertEquals
9+
import org.havenapp.main.database.HavenEventDB
10+
import org.havenapp.main.database.converter.HavenEventDBConverters.Companion.dateToTimestamp
11+
import org.junit.After
12+
import org.junit.Before
13+
import org.junit.Rule
14+
import org.junit.Test
15+
16+
/**
17+
* Created by Arka Prava Basu <[email protected]> on 27/10/18.
18+
*/
19+
class RoomMigrationTest {
20+
@get:Rule
21+
val migrationTestHelper = MigrationTestHelper(InstrumentationRegistry.getInstrumentation(),
22+
HavenEventDB::class.java.canonicalName,
23+
FrameworkSQLiteOpenHelperFactory())
24+
25+
private var sugarDbOpenHelper: SugarDbOpenHelper? = null
26+
27+
private val TEST_DB_NAME = "test.db"
28+
29+
@Before
30+
fun setUpDb() {
31+
sugarDbOpenHelper =
32+
SugarDbOpenHelper(ApplicationProvider.getApplicationContext(), TEST_DB_NAME)
33+
SugarDbTestHelper.createTables(sugarDbOpenHelper!!)
34+
}
35+
36+
@Test
37+
fun validateMigrationAndData() {
38+
SugarDbTestHelper.insertEvent(123, sugarDbOpenHelper!!)
39+
SugarDbTestHelper.insertEventTrigger(1, "abcabd", 124, 1, sugarDbOpenHelper!!)
40+
41+
migrationTestHelper.runMigrationsAndValidate(TEST_DB_NAME, 4,
42+
true, RoomMigration())
43+
44+
val migratedDb = getMigratedRoomDb()
45+
46+
val event = migratedDb.getEventDAO().getAllEvent()[0]
47+
val eventTrigger = migratedDb.getEventTriggerDAO().getAllEventTriggers()[0]
48+
49+
assertEquals(dateToTimestamp(event.startTime)?.toInt(), 123)
50+
51+
assertEquals(dateToTimestamp(eventTrigger.time)?.toInt(), 124)
52+
assertEquals(eventTrigger.path, "abcabd")
53+
assertEquals(eventTrigger.type, 1)
54+
}
55+
56+
@After
57+
fun clearDb() {
58+
SugarDbTestHelper.clearDb(sugarDbOpenHelper!!)
59+
}
60+
61+
private fun getMigratedRoomDb(): org.havenapp.main.database.HavenEventDB {
62+
val db = Room.databaseBuilder(ApplicationProvider.getApplicationContext(),
63+
org.havenapp.main.database.HavenEventDB::class.java, TEST_DB_NAME)
64+
.addMigrations(RoomMigration())
65+
.build()
66+
67+
migrationTestHelper.closeWhenFinished(db)
68+
69+
return db
70+
}
71+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package org.havenapp.main.database.migration
2+
3+
import android.content.Context
4+
import android.content.Context.MODE_PRIVATE
5+
import android.database.sqlite.SQLiteDatabase
6+
import android.database.sqlite.SQLiteOpenHelper
7+
8+
/**
9+
* Created by Arka Prava Basu <[email protected]> on 27/10/18.
10+
*/
11+
class SugarDbOpenHelper(context: Context, dbName: String)
12+
: SQLiteOpenHelper(context, dbName, null, 3) {
13+
14+
15+
private val createEventTable =
16+
"CREATE TABLE IF NOT EXISTS EVENT ( ID INTEGER PRIMARY KEY AUTOINCREMENT , M_START_TIME INTEGER )"
17+
private val createEventTriggerTable =
18+
"CREATE TABLE IF NOT EXISTS EVENT_TRIGGER ( ID INTEGER PRIMARY KEY AUTOINCREMENT , M_EVENT_ID INTEGER, M_PATH TEXT, M_TIME INTEGER , M_TYPE INTEGER )"
19+
20+
override fun onCreate(db: SQLiteDatabase?) {
21+
db?.execSQL(createEventTable)
22+
db?.execSQL(createEventTriggerTable)
23+
}
24+
25+
override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {
26+
27+
}
28+
29+
override fun onDowngrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {
30+
31+
}
32+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package org.havenapp.main.database.migration
2+
3+
/**
4+
* Created by Arka Prava Basu <[email protected]> on 28/10/18.
5+
*/
6+
class SugarDbTestHelper {
7+
8+
companion object {
9+
fun createTables(helper: SugarDbOpenHelper) {
10+
val db = helper.writableDatabase
11+
12+
val createEventTable =
13+
"CREATE TABLE IF NOT EXISTS EVENT ( ID INTEGER PRIMARY KEY AUTOINCREMENT , M_START_TIME INTEGER )"
14+
val createEventTriggerTable =
15+
"CREATE TABLE IF NOT EXISTS EVENT_TRIGGER ( ID INTEGER PRIMARY KEY AUTOINCREMENT , M_EVENT_ID INTEGER, M_PATH TEXT, M_TIME INTEGER , M_TYPE INTEGER )"
16+
17+
db.execSQL(createEventTable)
18+
db.execSQL(createEventTriggerTable)
19+
20+
db.close()
21+
}
22+
23+
24+
fun insertEvent(startTime: Int, helper: SugarDbOpenHelper) {
25+
val db = helper.writableDatabase
26+
27+
db?.execSQL("INSERT INTO EVENT(M_START_TIME) VALUES ($startTime)")
28+
29+
db.close()
30+
}
31+
32+
fun insertEventTrigger(eventId: Int, path: String, startTime: Int,
33+
type: Int, helper: SugarDbOpenHelper) {
34+
val db = helper.writableDatabase
35+
36+
db?.execSQL("INSERT INTO EVENT_TRIGGER(M_EVENT_ID, M_PATH, M_TIME, M_TYPE) VALUES ($eventId, \"$path\", $startTime, $type)")
37+
38+
db.close()
39+
}
40+
41+
fun clearDb(helper: SugarDbOpenHelper) {
42+
val db = helper.writableDatabase
43+
44+
db?.execSQL("DROP TABLE IF EXISTS EVENT")
45+
db?.execSQL("DROP TABLE IF EXISTS EVENT_TRIGGER")
46+
47+
db.close()
48+
}
49+
}
50+
}

src/main/AndroidManifest.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
android:label="@string/app_name"
4343
android:largeHeap="true"
4444
android:theme="@style/AppTheme"
45+
android:fullBackupContent="@xml/backup_config"
4546
android:supportsRtl="false"
4647
tools:replace="android:allowBackup,android:supportsRtl"
4748
tools:ignore="GoogleAppIndexingWarning">
@@ -85,6 +86,9 @@
8586
android:name=".service.MonitorService"
8687
android:exported="false" />
8788

89+
<service android:name=".service.RemoveDeletedFilesJob"
90+
android:exported="false" />
91+
8892
<meta-data
8993
android:name="DATABASE"
9094
android:value="haven.db" />

0 commit comments

Comments
 (0)