mirror of
https://github.com/iSoron/uhabits.git
synced 2025-12-06 09:08:52 -06:00
Remove dependency: ActiveAndroid
This commit is contained in:
@@ -0,0 +1,79 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2017 Álinson Santos Xavier <isoron@gmail.com>
|
||||||
|
*
|
||||||
|
* This file is part of Loop Habit Tracker.
|
||||||
|
*
|
||||||
|
* Loop Habit Tracker 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.
|
||||||
|
*
|
||||||
|
* Loop Habit Tracker 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.isoron.androidbase.storage;
|
||||||
|
|
||||||
|
import android.content.*;
|
||||||
|
import android.database.sqlite.*;
|
||||||
|
|
||||||
|
import org.isoron.androidbase.*;
|
||||||
|
|
||||||
|
import java.io.*;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
|
||||||
|
public class BaseSQLiteOpenHelper extends SQLiteOpenHelper
|
||||||
|
{
|
||||||
|
private final Context context;
|
||||||
|
|
||||||
|
private final int version;
|
||||||
|
|
||||||
|
public BaseSQLiteOpenHelper(@AppContext Context context,
|
||||||
|
String databaseFilename,
|
||||||
|
int version)
|
||||||
|
{
|
||||||
|
super(context, databaseFilename, null, version);
|
||||||
|
this.context = context;
|
||||||
|
this.version = version;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreate(SQLiteDatabase db)
|
||||||
|
{
|
||||||
|
executeMigrations(db, -1, version);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
|
||||||
|
{
|
||||||
|
executeMigrations(db, oldVersion, newVersion);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void executeMigrations(SQLiteDatabase db,
|
||||||
|
int oldVersion,
|
||||||
|
int newVersion)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
for (int v = oldVersion + 1; v <= newVersion; v++)
|
||||||
|
{
|
||||||
|
String fname = String.format(Locale.US, "migrations/%d.sql", v);
|
||||||
|
InputStream stream = context.getAssets().open(fname);
|
||||||
|
for (String command : SQLParser.parse(stream))
|
||||||
|
db.execSQL(command);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,163 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2014 Markus Pfeiffer
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.isoron.androidbase.storage;
|
||||||
|
|
||||||
|
import java.io.BufferedInputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
class Tokenizer {
|
||||||
|
|
||||||
|
private final InputStream mStream;
|
||||||
|
|
||||||
|
private boolean mIsNext;
|
||||||
|
private int mCurrent;
|
||||||
|
|
||||||
|
public Tokenizer(final InputStream in) {
|
||||||
|
this.mStream = in;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean hasNext() throws IOException {
|
||||||
|
|
||||||
|
if (!this.mIsNext) {
|
||||||
|
this.mIsNext = true;
|
||||||
|
this.mCurrent = this.mStream.read();
|
||||||
|
}
|
||||||
|
return this.mCurrent != -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int next() throws IOException {
|
||||||
|
|
||||||
|
if (!this.mIsNext) {
|
||||||
|
this.mCurrent = this.mStream.read();
|
||||||
|
}
|
||||||
|
this.mIsNext = false;
|
||||||
|
return this.mCurrent;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean skip(final String s) throws IOException {
|
||||||
|
|
||||||
|
if (s == null || s.length() == 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (s.charAt(0) != this.mCurrent) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
final int len = s.length();
|
||||||
|
this.mStream.mark(len - 1);
|
||||||
|
|
||||||
|
for (int n = 1; n < len; n++) {
|
||||||
|
final int value = this.mStream.read();
|
||||||
|
|
||||||
|
if (value != s.charAt(n)) {
|
||||||
|
this.mStream.reset();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public class SQLParser {
|
||||||
|
|
||||||
|
public final static int STATE_NONE = 0;
|
||||||
|
public final static int STATE_STRING = 1;
|
||||||
|
public final static int STATE_COMMENT = 2;
|
||||||
|
public final static int STATE_COMMENT_BLOCK = 3;
|
||||||
|
|
||||||
|
public static List<String> parse(final InputStream stream) throws IOException {
|
||||||
|
|
||||||
|
final BufferedInputStream buffer = new BufferedInputStream(stream);
|
||||||
|
final List<String> commands = new ArrayList<String>();
|
||||||
|
final StringBuffer sb = new StringBuffer();
|
||||||
|
|
||||||
|
try {
|
||||||
|
final Tokenizer tokenizer = new Tokenizer(buffer);
|
||||||
|
int state = STATE_NONE;
|
||||||
|
|
||||||
|
while (tokenizer.hasNext()) {
|
||||||
|
final char c = (char) tokenizer.next();
|
||||||
|
|
||||||
|
if (state == STATE_COMMENT_BLOCK) {
|
||||||
|
if (tokenizer.skip("*/")) {
|
||||||
|
state = STATE_NONE;
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
|
||||||
|
} else if (state == STATE_COMMENT) {
|
||||||
|
if (isNewLine(c)) {
|
||||||
|
state = STATE_NONE;
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
|
||||||
|
} else if (state == STATE_NONE && tokenizer.skip("/*")) {
|
||||||
|
state = STATE_COMMENT_BLOCK;
|
||||||
|
continue;
|
||||||
|
|
||||||
|
} else if (state == STATE_NONE && tokenizer.skip("--")) {
|
||||||
|
state = STATE_COMMENT;
|
||||||
|
continue;
|
||||||
|
|
||||||
|
} else if (state == STATE_NONE && c == ';') {
|
||||||
|
final String command = sb.toString().trim();
|
||||||
|
commands.add(command);
|
||||||
|
sb.setLength(0);
|
||||||
|
continue;
|
||||||
|
|
||||||
|
} else if (state == STATE_NONE && c == '\'') {
|
||||||
|
state = STATE_STRING;
|
||||||
|
|
||||||
|
} else if (state == STATE_STRING && c == '\'') {
|
||||||
|
state = STATE_NONE;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (state == STATE_NONE || state == STATE_STRING) {
|
||||||
|
if (state == STATE_NONE && isWhitespace(c)) {
|
||||||
|
if (sb.length() > 0 && sb.charAt(sb.length() - 1) != ' ') {
|
||||||
|
sb.append(' ');
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
sb.append(c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} finally {
|
||||||
|
buffer.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sb.length() > 0) {
|
||||||
|
commands.add(sb.toString().trim());
|
||||||
|
}
|
||||||
|
|
||||||
|
return commands;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean isNewLine(final char c) {
|
||||||
|
return c == '\r' || c == '\n';
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean isWhitespace(final char c) {
|
||||||
|
return c == '\r' || c == '\n' || c == '\t' || c == ' ';
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -64,7 +64,6 @@ dependencies {
|
|||||||
implementation 'com.github.paolorotolo:appintro:3.4.0'
|
implementation 'com.github.paolorotolo:appintro:3.4.0'
|
||||||
implementation 'com.google.dagger:dagger:2.9'
|
implementation 'com.google.dagger:dagger:2.9'
|
||||||
implementation 'com.jakewharton:butterknife:8.6.1-SNAPSHOT'
|
implementation 'com.jakewharton:butterknife:8.6.1-SNAPSHOT'
|
||||||
implementation 'com.michaelpardo:activeandroid:3.1.0-SNAPSHOT'
|
|
||||||
implementation 'org.apmem.tools:layouts:1.10'
|
implementation 'org.apmem.tools:layouts:1.10'
|
||||||
implementation 'org.jetbrains:annotations-java5:15.0'
|
implementation 'org.jetbrains:annotations-java5:15.0'
|
||||||
implementation 'com.google.code.gson:gson:2.7'
|
implementation 'com.google.code.gson:gson:2.7'
|
||||||
|
|||||||
@@ -22,12 +22,11 @@ package org.isoron.uhabits.models.sqlite;
|
|||||||
import android.support.test.runner.*;
|
import android.support.test.runner.*;
|
||||||
import android.test.suitebuilder.annotation.*;
|
import android.test.suitebuilder.annotation.*;
|
||||||
|
|
||||||
import com.activeandroid.*;
|
|
||||||
|
|
||||||
import org.isoron.androidbase.storage.*;
|
import org.isoron.androidbase.storage.*;
|
||||||
import org.isoron.uhabits.*;
|
import org.isoron.uhabits.*;
|
||||||
import org.isoron.uhabits.core.models.*;
|
import org.isoron.uhabits.core.models.*;
|
||||||
import org.isoron.uhabits.models.sqlite.records.*;
|
import org.isoron.uhabits.models.sqlite.records.*;
|
||||||
|
import org.isoron.uhabits.utils.*;
|
||||||
import org.junit.*;
|
import org.junit.*;
|
||||||
import org.junit.runner.*;
|
import org.junit.runner.*;
|
||||||
|
|
||||||
@@ -41,7 +40,7 @@ public class HabitRecordTest extends BaseAndroidTest
|
|||||||
private Habit habit;
|
private Habit habit;
|
||||||
|
|
||||||
private SQLiteRepository<HabitRecord> sqlite =
|
private SQLiteRepository<HabitRecord> sqlite =
|
||||||
new SQLiteRepository<>(HabitRecord.class, Cache.openDatabase());
|
new SQLiteRepository<>(HabitRecord.class, DatabaseUtils.openDatabase());
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -22,13 +22,13 @@ package org.isoron.uhabits.models.sqlite;
|
|||||||
import android.support.test.runner.*;
|
import android.support.test.runner.*;
|
||||||
import android.test.suitebuilder.annotation.*;
|
import android.test.suitebuilder.annotation.*;
|
||||||
|
|
||||||
import com.activeandroid.*;
|
|
||||||
import com.google.common.collect.*;
|
import com.google.common.collect.*;
|
||||||
|
|
||||||
import org.isoron.androidbase.storage.*;
|
import org.isoron.androidbase.storage.*;
|
||||||
import org.isoron.uhabits.*;
|
import org.isoron.uhabits.*;
|
||||||
import org.isoron.uhabits.core.models.*;
|
import org.isoron.uhabits.core.models.*;
|
||||||
import org.isoron.uhabits.models.sqlite.records.*;
|
import org.isoron.uhabits.models.sqlite.records.*;
|
||||||
|
import org.isoron.uhabits.utils.*;
|
||||||
import org.junit.*;
|
import org.junit.*;
|
||||||
import org.junit.rules.*;
|
import org.junit.rules.*;
|
||||||
import org.junit.runner.*;
|
import org.junit.runner.*;
|
||||||
@@ -61,7 +61,8 @@ public class SQLiteHabitListTest extends BaseAndroidTest
|
|||||||
|
|
||||||
modelFactory = component.getModelFactory();
|
modelFactory = component.getModelFactory();
|
||||||
repository =
|
repository =
|
||||||
new SQLiteRepository<>(HabitRecord.class, Cache.openDatabase());
|
new SQLiteRepository<>(HabitRecord.class,
|
||||||
|
DatabaseUtils.openDatabase());
|
||||||
|
|
||||||
for (int i = 0; i < 10; i++)
|
for (int i = 0; i < 10; i++)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -23,13 +23,12 @@ import android.support.annotation.*;
|
|||||||
import android.support.test.runner.*;
|
import android.support.test.runner.*;
|
||||||
import android.test.suitebuilder.annotation.*;
|
import android.test.suitebuilder.annotation.*;
|
||||||
|
|
||||||
import com.activeandroid.*;
|
|
||||||
|
|
||||||
import org.isoron.androidbase.storage.*;
|
import org.isoron.androidbase.storage.*;
|
||||||
import org.isoron.uhabits.*;
|
import org.isoron.uhabits.*;
|
||||||
import org.isoron.uhabits.core.models.*;
|
import org.isoron.uhabits.core.models.*;
|
||||||
import org.isoron.uhabits.core.utils.*;
|
import org.isoron.uhabits.core.utils.*;
|
||||||
import org.isoron.uhabits.models.sqlite.records.*;
|
import org.isoron.uhabits.models.sqlite.records.*;
|
||||||
|
import org.isoron.uhabits.utils.*;
|
||||||
import org.junit.*;
|
import org.junit.*;
|
||||||
import org.junit.runner.*;
|
import org.junit.runner.*;
|
||||||
|
|
||||||
@@ -63,7 +62,7 @@ public class SQLiteRepetitionListTest extends BaseAndroidTest
|
|||||||
today = DateUtils.getStartOfToday();
|
today = DateUtils.getStartOfToday();
|
||||||
day = DateUtils.millisecondsInOneDay;
|
day = DateUtils.millisecondsInOneDay;
|
||||||
sqlite = new SQLiteRepository<>(RepetitionRecord.class,
|
sqlite = new SQLiteRepository<>(RepetitionRecord.class,
|
||||||
Cache.openDatabase());
|
DatabaseUtils.openDatabase());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|||||||
@@ -23,11 +23,10 @@ import android.database.sqlite.*;
|
|||||||
import android.support.test.runner.*;
|
import android.support.test.runner.*;
|
||||||
import android.test.suitebuilder.annotation.*;
|
import android.test.suitebuilder.annotation.*;
|
||||||
|
|
||||||
import com.activeandroid.*;
|
|
||||||
|
|
||||||
import org.apache.commons.lang3.builder.*;
|
import org.apache.commons.lang3.builder.*;
|
||||||
import org.isoron.androidbase.storage.*;
|
import org.isoron.androidbase.storage.*;
|
||||||
import org.isoron.uhabits.*;
|
import org.isoron.uhabits.*;
|
||||||
|
import org.isoron.uhabits.utils.*;
|
||||||
import org.junit.*;
|
import org.junit.*;
|
||||||
import org.junit.runner.*;
|
import org.junit.runner.*;
|
||||||
|
|
||||||
@@ -47,10 +46,9 @@ public class SQLiteRepositoryTest extends BaseAndroidTest
|
|||||||
public void setUp()
|
public void setUp()
|
||||||
{
|
{
|
||||||
super.setUp();
|
super.setUp();
|
||||||
repository =
|
this.db = DatabaseUtils.openDatabase();
|
||||||
new SQLiteRepository<>(ThingRecord.class, Cache.openDatabase());
|
repository = new SQLiteRepository<>(ThingRecord.class, db);
|
||||||
|
|
||||||
db = Cache.openDatabase();
|
|
||||||
db.execSQL("drop table if exists tests");
|
db.execSQL("drop table if exists tests");
|
||||||
db.execSQL("create table tests(" +
|
db.execSQL("create table tests(" +
|
||||||
"id integer not null primary key autoincrement, " +
|
"id integer not null primary key autoincrement, " +
|
||||||
|
|||||||
@@ -22,8 +22,6 @@ package org.isoron.uhabits;
|
|||||||
import android.app.*;
|
import android.app.*;
|
||||||
import android.content.*;
|
import android.content.*;
|
||||||
|
|
||||||
import com.activeandroid.*;
|
|
||||||
|
|
||||||
import org.isoron.androidbase.*;
|
import org.isoron.androidbase.*;
|
||||||
import org.isoron.uhabits.core.preferences.*;
|
import org.isoron.uhabits.core.preferences.*;
|
||||||
import org.isoron.uhabits.core.reminders.*;
|
import org.isoron.uhabits.core.reminders.*;
|
||||||
@@ -92,13 +90,13 @@ public class HabitsApplication extends Application
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
DatabaseUtils.initializeActiveAndroid(context);
|
DatabaseUtils.initializeDatabase(context);
|
||||||
}
|
}
|
||||||
catch (InvalidDatabaseVersionException e)
|
catch (InvalidDatabaseVersionException e)
|
||||||
{
|
{
|
||||||
File db = DatabaseUtils.getDatabaseFile(context);
|
File db = DatabaseUtils.getDatabaseFile(context);
|
||||||
db.renameTo(new File(db.getAbsolutePath() + ".invalid"));
|
db.renameTo(new File(db.getAbsolutePath() + ".invalid"));
|
||||||
DatabaseUtils.initializeActiveAndroid(context);
|
DatabaseUtils.initializeDatabase(context);
|
||||||
}
|
}
|
||||||
|
|
||||||
widgetUpdater = component.getWidgetUpdater();
|
widgetUpdater = component.getWidgetUpdater();
|
||||||
@@ -124,8 +122,6 @@ public class HabitsApplication extends Application
|
|||||||
public void onTerminate()
|
public void onTerminate()
|
||||||
{
|
{
|
||||||
context = null;
|
context = null;
|
||||||
ActiveAndroid.dispose();
|
|
||||||
|
|
||||||
reminderScheduler.stopListening();
|
reminderScheduler.stopListening();
|
||||||
widgetUpdater.stopListening();
|
widgetUpdater.stopListening();
|
||||||
notificationTray.stopListening();
|
notificationTray.stopListening();
|
||||||
|
|||||||
@@ -21,7 +21,6 @@ package org.isoron.uhabits.io;
|
|||||||
|
|
||||||
import android.support.annotation.*;
|
import android.support.annotation.*;
|
||||||
|
|
||||||
import com.activeandroid.*;
|
|
||||||
import com.opencsv.*;
|
import com.opencsv.*;
|
||||||
|
|
||||||
import org.isoron.uhabits.core.models.*;
|
import org.isoron.uhabits.core.models.*;
|
||||||
@@ -32,6 +31,8 @@ import java.util.*;
|
|||||||
|
|
||||||
import javax.inject.*;
|
import javax.inject.*;
|
||||||
|
|
||||||
|
import static org.isoron.uhabits.utils.DatabaseUtils.executeAsTransaction;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class that imports data from HabitBull CSV files.
|
* Class that imports data from HabitBull CSV files.
|
||||||
*/
|
*/
|
||||||
@@ -59,16 +60,7 @@ public class HabitBullCSVImporter extends AbstractImporter
|
|||||||
@Override
|
@Override
|
||||||
public void importHabitsFromFile(@NonNull final File file) throws IOException
|
public void importHabitsFromFile(@NonNull final File file) throws IOException
|
||||||
{
|
{
|
||||||
ActiveAndroid.beginTransaction();
|
executeAsTransaction(() -> parseFile(file));
|
||||||
try
|
|
||||||
{
|
|
||||||
parseFile(file);
|
|
||||||
ActiveAndroid.setTransactionSuccessful();
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
ActiveAndroid.endTransaction();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void parseFile(@NonNull File file) throws IOException
|
private void parseFile(@NonNull File file) throws IOException
|
||||||
|
|||||||
@@ -25,8 +25,6 @@ import android.database.sqlite.*;
|
|||||||
import android.support.annotation.*;
|
import android.support.annotation.*;
|
||||||
import android.util.*;
|
import android.util.*;
|
||||||
|
|
||||||
import com.activeandroid.*;
|
|
||||||
|
|
||||||
import org.isoron.androidbase.*;
|
import org.isoron.androidbase.*;
|
||||||
import org.isoron.androidbase.utils.*;
|
import org.isoron.androidbase.utils.*;
|
||||||
import org.isoron.uhabits.BuildConfig;
|
import org.isoron.uhabits.BuildConfig;
|
||||||
@@ -89,9 +87,9 @@ public class LoopDBImporter extends AbstractImporter
|
|||||||
@Override
|
@Override
|
||||||
public void importHabitsFromFile(@NonNull File file) throws IOException
|
public void importHabitsFromFile(@NonNull File file) throws IOException
|
||||||
{
|
{
|
||||||
ActiveAndroid.dispose();
|
DatabaseUtils.dispose();
|
||||||
File originalDB = DatabaseUtils.getDatabaseFile(context);
|
File originalDB = DatabaseUtils.getDatabaseFile(context);
|
||||||
FileUtils.copy(file, originalDB);
|
FileUtils.copy(file, originalDB);
|
||||||
DatabaseUtils.initializeActiveAndroid(context);
|
DatabaseUtils.initializeDatabase(context);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,12 +22,11 @@ package org.isoron.uhabits.models.sqlite;
|
|||||||
import android.database.sqlite.*;
|
import android.database.sqlite.*;
|
||||||
import android.support.annotation.*;
|
import android.support.annotation.*;
|
||||||
|
|
||||||
import com.activeandroid.*;
|
|
||||||
|
|
||||||
import org.isoron.androidbase.storage.*;
|
import org.isoron.androidbase.storage.*;
|
||||||
import org.isoron.uhabits.core.models.*;
|
import org.isoron.uhabits.core.models.*;
|
||||||
import org.isoron.uhabits.core.models.memory.*;
|
import org.isoron.uhabits.core.models.memory.*;
|
||||||
import org.isoron.uhabits.models.sqlite.records.*;
|
import org.isoron.uhabits.models.sqlite.records.*;
|
||||||
|
import org.isoron.uhabits.utils.*;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
@@ -58,7 +57,7 @@ public class SQLiteHabitList extends HabitList
|
|||||||
this.list = new MemoryHabitList();
|
this.list = new MemoryHabitList();
|
||||||
|
|
||||||
repository =
|
repository =
|
||||||
new SQLiteRepository<>(HabitRecord.class, Cache.openDatabase());
|
new SQLiteRepository<>(HabitRecord.class, DatabaseUtils.openDatabase());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void loadRecords()
|
private void loadRecords()
|
||||||
@@ -185,7 +184,7 @@ public class SQLiteHabitList extends HabitList
|
|||||||
{
|
{
|
||||||
loadRecords();
|
loadRecords();
|
||||||
list.removeAll();
|
list.removeAll();
|
||||||
SQLiteDatabase db = Cache.openDatabase();
|
SQLiteDatabase db = DatabaseUtils.openDatabase();
|
||||||
db.execSQL("delete from habits");
|
db.execSQL("delete from habits");
|
||||||
db.execSQL("delete from repetitions");
|
db.execSQL("delete from repetitions");
|
||||||
}
|
}
|
||||||
@@ -206,7 +205,7 @@ public class SQLiteHabitList extends HabitList
|
|||||||
|
|
||||||
Integer fromPos = fromRecord.position;
|
Integer fromPos = fromRecord.position;
|
||||||
Integer toPos = toRecord.position;
|
Integer toPos = toRecord.position;
|
||||||
SQLiteDatabase db = Cache.openDatabase();
|
SQLiteDatabase db = DatabaseUtils.openDatabase();
|
||||||
if (toPos < fromPos)
|
if (toPos < fromPos)
|
||||||
{
|
{
|
||||||
db.execSQL("update habits set position = position + 1 " +
|
db.execSQL("update habits set position = position + 1 " +
|
||||||
|
|||||||
@@ -22,12 +22,11 @@ package org.isoron.uhabits.models.sqlite;
|
|||||||
import android.support.annotation.*;
|
import android.support.annotation.*;
|
||||||
import android.support.annotation.Nullable;
|
import android.support.annotation.Nullable;
|
||||||
|
|
||||||
import com.activeandroid.*;
|
|
||||||
|
|
||||||
import org.isoron.androidbase.storage.*;
|
import org.isoron.androidbase.storage.*;
|
||||||
import org.isoron.uhabits.core.models.*;
|
import org.isoron.uhabits.core.models.*;
|
||||||
import org.isoron.uhabits.core.models.memory.*;
|
import org.isoron.uhabits.core.models.memory.*;
|
||||||
import org.isoron.uhabits.models.sqlite.records.*;
|
import org.isoron.uhabits.models.sqlite.records.*;
|
||||||
|
import org.isoron.uhabits.utils.*;
|
||||||
import org.jetbrains.annotations.*;
|
import org.jetbrains.annotations.*;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
@@ -47,7 +46,7 @@ public class SQLiteRepetitionList extends RepetitionList
|
|||||||
{
|
{
|
||||||
super(habit);
|
super(habit);
|
||||||
repository = new SQLiteRepository<>(RepetitionRecord.class,
|
repository = new SQLiteRepository<>(RepetitionRecord.class,
|
||||||
Cache.openDatabase());
|
DatabaseUtils.openDatabase());
|
||||||
list = new MemoryRepetitionList(habit);
|
list = new MemoryRepetitionList(habit);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -19,8 +19,6 @@
|
|||||||
|
|
||||||
package org.isoron.uhabits.models.sqlite.records;
|
package org.isoron.uhabits.models.sqlite.records;
|
||||||
|
|
||||||
import com.activeandroid.*;
|
|
||||||
|
|
||||||
import org.apache.commons.lang3.builder.*;
|
import org.apache.commons.lang3.builder.*;
|
||||||
import org.isoron.androidbase.storage.*;
|
import org.isoron.androidbase.storage.*;
|
||||||
import org.isoron.uhabits.core.models.*;
|
import org.isoron.uhabits.core.models.*;
|
||||||
@@ -29,67 +27,51 @@ import org.isoron.uhabits.core.models.*;
|
|||||||
* The SQLite database record corresponding to a {@link Habit}.
|
* The SQLite database record corresponding to a {@link Habit}.
|
||||||
*/
|
*/
|
||||||
@Table(name = "habits")
|
@Table(name = "habits")
|
||||||
@com.activeandroid.annotation.Table(name = "Habits")
|
public class HabitRecord
|
||||||
public class HabitRecord extends Model
|
|
||||||
{
|
{
|
||||||
@Column
|
@Column
|
||||||
@com.activeandroid.annotation.Column
|
|
||||||
public String description;
|
public String description;
|
||||||
|
|
||||||
@Column
|
@Column
|
||||||
@com.activeandroid.annotation.Column
|
|
||||||
public String name;
|
public String name;
|
||||||
|
|
||||||
@Column(name = "freq_num")
|
@Column(name = "freq_num")
|
||||||
@com.activeandroid.annotation.Column(name = "freq_num")
|
|
||||||
public Integer freqNum;
|
public Integer freqNum;
|
||||||
|
|
||||||
@Column(name = "freq_den")
|
@Column(name = "freq_den")
|
||||||
@com.activeandroid.annotation.Column(name = "freq_den")
|
|
||||||
public Integer freqDen;
|
public Integer freqDen;
|
||||||
|
|
||||||
@Column
|
@Column
|
||||||
@com.activeandroid.annotation.Column
|
|
||||||
public Integer color;
|
public Integer color;
|
||||||
|
|
||||||
@Column
|
@Column
|
||||||
@com.activeandroid.annotation.Column
|
|
||||||
public Integer position;
|
public Integer position;
|
||||||
|
|
||||||
@Column(name = "reminder_hour")
|
@Column(name = "reminder_hour")
|
||||||
@com.activeandroid.annotation.Column(name = "reminder_hour")
|
|
||||||
public Integer reminderHour;
|
public Integer reminderHour;
|
||||||
|
|
||||||
@Column(name = "reminder_min")
|
@Column(name = "reminder_min")
|
||||||
@com.activeandroid.annotation.Column(name = "reminder_min")
|
|
||||||
public Integer reminderMin;
|
public Integer reminderMin;
|
||||||
|
|
||||||
@Column(name = "reminder_days")
|
@Column(name = "reminder_days")
|
||||||
@com.activeandroid.annotation.Column(name = "reminder_days")
|
|
||||||
public Integer reminderDays;
|
public Integer reminderDays;
|
||||||
|
|
||||||
@Column
|
@Column
|
||||||
@com.activeandroid.annotation.Column
|
|
||||||
public Integer highlight;
|
public Integer highlight;
|
||||||
|
|
||||||
@Column
|
@Column
|
||||||
@com.activeandroid.annotation.Column
|
|
||||||
public Integer archived;
|
public Integer archived;
|
||||||
|
|
||||||
@Column
|
@Column
|
||||||
@com.activeandroid.annotation.Column
|
|
||||||
public Integer type;
|
public Integer type;
|
||||||
|
|
||||||
@Column(name = "target_value")
|
@Column(name = "target_value")
|
||||||
@com.activeandroid.annotation.Column(name = "target_value")
|
|
||||||
public Double targetValue;
|
public Double targetValue;
|
||||||
|
|
||||||
@Column(name = "target_type")
|
@Column(name = "target_type")
|
||||||
@com.activeandroid.annotation.Column(name = "target_type")
|
|
||||||
public Integer targetType;
|
public Integer targetType;
|
||||||
|
|
||||||
@Column
|
@Column
|
||||||
@com.activeandroid.annotation.Column
|
|
||||||
public String unit;
|
public String unit;
|
||||||
|
|
||||||
@Column
|
@Column
|
||||||
|
|||||||
@@ -19,8 +19,6 @@
|
|||||||
|
|
||||||
package org.isoron.uhabits.models.sqlite.records;
|
package org.isoron.uhabits.models.sqlite.records;
|
||||||
|
|
||||||
import com.activeandroid.*;
|
|
||||||
|
|
||||||
import org.isoron.androidbase.storage.*;
|
import org.isoron.androidbase.storage.*;
|
||||||
import org.isoron.uhabits.core.models.*;
|
import org.isoron.uhabits.core.models.*;
|
||||||
|
|
||||||
@@ -28,21 +26,17 @@ import org.isoron.uhabits.core.models.*;
|
|||||||
* The SQLite database record corresponding to a {@link Repetition}.
|
* The SQLite database record corresponding to a {@link Repetition}.
|
||||||
*/
|
*/
|
||||||
@Table(name = "Repetitions")
|
@Table(name = "Repetitions")
|
||||||
@com.activeandroid.annotation.Table(name = "Repetitions")
|
public class RepetitionRecord
|
||||||
public class RepetitionRecord extends Model
|
|
||||||
{
|
{
|
||||||
@com.activeandroid.annotation.Column(name = "habit")
|
|
||||||
public HabitRecord habit;
|
public HabitRecord habit;
|
||||||
|
|
||||||
@Column(name = "habit")
|
@Column(name = "habit")
|
||||||
public Long habit_id;
|
public Long habit_id;
|
||||||
|
|
||||||
@Column
|
@Column
|
||||||
@com.activeandroid.annotation.Column(name = "timestamp")
|
|
||||||
public Long timestamp;
|
public Long timestamp;
|
||||||
|
|
||||||
@Column
|
@Column
|
||||||
@com.activeandroid.annotation.Column(name = "value")
|
|
||||||
public Integer value;
|
public Integer value;
|
||||||
|
|
||||||
@Column
|
@Column
|
||||||
|
|||||||
@@ -19,18 +19,17 @@
|
|||||||
|
|
||||||
package org.isoron.uhabits.sync;
|
package org.isoron.uhabits.sync;
|
||||||
|
|
||||||
import android.support.annotation.NonNull;
|
import android.support.annotation.*;
|
||||||
|
|
||||||
import com.activeandroid.Model;
|
import org.isoron.androidbase.storage.*;
|
||||||
import com.activeandroid.annotation.Column;
|
|
||||||
import com.activeandroid.annotation.Table;
|
|
||||||
import com.activeandroid.query.Select;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
@Table(name = "Events")
|
@Table(name = "Events")
|
||||||
public class Event extends Model
|
public class Event
|
||||||
{
|
{
|
||||||
|
@Nullable
|
||||||
|
@Column
|
||||||
|
public Long id;
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
@Column(name = "timestamp")
|
@Column(name = "timestamp")
|
||||||
public Long timestamp;
|
public Long timestamp;
|
||||||
@@ -56,10 +55,4 @@ public class Event extends Model
|
|||||||
this.timestamp = timestamp;
|
this.timestamp = timestamp;
|
||||||
this.message = message;
|
this.message = message;
|
||||||
}
|
}
|
||||||
|
|
||||||
@NonNull
|
|
||||||
public static List<Event> getAll()
|
|
||||||
{
|
|
||||||
return new Select().from(Event.class).orderBy("timestamp").execute();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,10 +23,12 @@ import android.support.annotation.*;
|
|||||||
import android.util.*;
|
import android.util.*;
|
||||||
|
|
||||||
import org.isoron.androidbase.*;
|
import org.isoron.androidbase.*;
|
||||||
|
import org.isoron.androidbase.storage.*;
|
||||||
import org.isoron.uhabits.BuildConfig;
|
import org.isoron.uhabits.BuildConfig;
|
||||||
import org.isoron.uhabits.core.*;
|
import org.isoron.uhabits.core.*;
|
||||||
import org.isoron.uhabits.core.commands.*;
|
import org.isoron.uhabits.core.commands.*;
|
||||||
import org.isoron.uhabits.core.preferences.*;
|
import org.isoron.uhabits.core.preferences.*;
|
||||||
|
import org.isoron.uhabits.utils.*;
|
||||||
import org.json.*;
|
import org.json.*;
|
||||||
|
|
||||||
import java.net.*;
|
import java.net.*;
|
||||||
@@ -95,6 +97,8 @@ public class SyncManager implements CommandRunner.Listener
|
|||||||
|
|
||||||
private SSLContextProvider sslProvider;
|
private SSLContextProvider sslProvider;
|
||||||
|
|
||||||
|
private final SQLiteRepository<Event> repository;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public SyncManager(@NonNull SSLContextProvider sslProvider,
|
public SyncManager(@NonNull SSLContextProvider sslProvider,
|
||||||
@NonNull Preferences prefs,
|
@NonNull Preferences prefs,
|
||||||
@@ -109,8 +113,10 @@ public class SyncManager implements CommandRunner.Listener
|
|||||||
this.commandParser = commandParser;
|
this.commandParser = commandParser;
|
||||||
this.isListening = false;
|
this.isListening = false;
|
||||||
|
|
||||||
|
repository =
|
||||||
|
new SQLiteRepository<>(Event.class, DatabaseUtils.openDatabase());
|
||||||
pendingConfirmation = new LinkedList<>();
|
pendingConfirmation = new LinkedList<>();
|
||||||
pendingEmit = new LinkedList<>(Event.getAll());
|
pendingEmit = new LinkedList<>(repository.findAll("order by timestamp"));
|
||||||
|
|
||||||
groupKey = prefs.getSyncKey();
|
groupKey = prefs.getSyncKey();
|
||||||
clientId = prefs.getSyncClientId();
|
clientId = prefs.getSyncClientId();
|
||||||
@@ -129,7 +135,7 @@ public class SyncManager implements CommandRunner.Listener
|
|||||||
JSONObject msg = toJSONObject(command.toJson());
|
JSONObject msg = toJSONObject(command.toJson());
|
||||||
Long now = new Date().getTime();
|
Long now = new Date().getTime();
|
||||||
Event e = new Event(command.getId(), now, msg.toString());
|
Event e = new Event(command.getId(), now, msg.toString());
|
||||||
e.save();
|
repository.save(e);
|
||||||
|
|
||||||
Log.i("SyncManager", "Adding to outbox: " + msg.toString());
|
Log.i("SyncManager", "Adding to outbox: " + msg.toString());
|
||||||
|
|
||||||
@@ -337,7 +343,7 @@ public class SyncManager implements CommandRunner.Listener
|
|||||||
{
|
{
|
||||||
Log.i("SyncManager", "Pending command confirmed");
|
Log.i("SyncManager", "Pending command confirmed");
|
||||||
pendingConfirmation.remove(e);
|
pendingConfirmation.remove(e);
|
||||||
e.delete();
|
repository.remove(e);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,33 +20,41 @@
|
|||||||
package org.isoron.uhabits.utils;
|
package org.isoron.uhabits.utils;
|
||||||
|
|
||||||
import android.content.*;
|
import android.content.*;
|
||||||
|
import android.database.sqlite.*;
|
||||||
import android.support.annotation.*;
|
import android.support.annotation.*;
|
||||||
|
|
||||||
import com.activeandroid.*;
|
import org.isoron.androidbase.storage.*;
|
||||||
|
|
||||||
import org.isoron.androidbase.utils.*;
|
import org.isoron.androidbase.utils.*;
|
||||||
import org.isoron.uhabits.*;
|
import org.isoron.uhabits.*;
|
||||||
import org.isoron.uhabits.core.utils.*;
|
import org.isoron.uhabits.core.utils.*;
|
||||||
import org.isoron.uhabits.models.sqlite.*;
|
import org.isoron.uhabits.models.sqlite.*;
|
||||||
import org.isoron.uhabits.models.sqlite.records.*;
|
|
||||||
import org.isoron.uhabits.sync.*;
|
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.text.*;
|
import java.text.*;
|
||||||
|
|
||||||
public abstract class DatabaseUtils
|
public abstract class DatabaseUtils
|
||||||
{
|
{
|
||||||
|
@Nullable
|
||||||
|
private static BaseSQLiteOpenHelper helper = null;
|
||||||
|
|
||||||
public static void executeAsTransaction(Callback callback)
|
public static void executeAsTransaction(Callback callback)
|
||||||
{
|
{
|
||||||
ActiveAndroid.beginTransaction();
|
try (SQLiteDatabase db = openDatabase())
|
||||||
|
{
|
||||||
|
db.beginTransaction();
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
callback.execute();
|
callback.execute();
|
||||||
ActiveAndroid.setTransactionSuccessful();
|
db.setTransactionSuccessful();
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
ActiveAndroid.endTransaction();
|
db.endTransaction();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -71,17 +79,12 @@ public abstract class DatabaseUtils
|
|||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public static void initializeActiveAndroid(Context context)
|
public static void initializeDatabase(Context context)
|
||||||
{
|
{
|
||||||
Configuration dbConfig = new Configuration.Builder(context)
|
|
||||||
.setDatabaseName(getDatabaseFilename())
|
|
||||||
.setDatabaseVersion(BuildConfig.databaseVersion)
|
|
||||||
.addModelClasses(HabitRecord.class, RepetitionRecord.class,
|
|
||||||
Event.class).create();
|
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
ActiveAndroid.initialize(dbConfig);
|
helper = new BaseSQLiteOpenHelper(context, getDatabaseFilename(),
|
||||||
|
BuildConfig.databaseVersion);
|
||||||
}
|
}
|
||||||
catch (RuntimeException e)
|
catch (RuntimeException e)
|
||||||
{
|
{
|
||||||
@@ -92,7 +95,8 @@ public abstract class DatabaseUtils
|
|||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("ResultOfMethodCallIgnored")
|
@SuppressWarnings("ResultOfMethodCallIgnored")
|
||||||
public static String saveDatabaseCopy(Context context, File dir) throws IOException
|
public static String saveDatabaseCopy(Context context, File dir)
|
||||||
|
throws IOException
|
||||||
{
|
{
|
||||||
SimpleDateFormat dateFormat = DateFormats.getBackupDateFormat();
|
SimpleDateFormat dateFormat = DateFormats.getBackupDateFormat();
|
||||||
String date = dateFormat.format(DateUtils.getLocalTime());
|
String date = dateFormat.format(DateUtils.getLocalTime());
|
||||||
@@ -106,8 +110,20 @@ public abstract class DatabaseUtils
|
|||||||
return dbCopy.getAbsolutePath();
|
return dbCopy.getAbsolutePath();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
public static SQLiteDatabase openDatabase()
|
||||||
|
{
|
||||||
|
if(helper == null) throw new IllegalStateException();
|
||||||
|
return helper.getWritableDatabase();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void dispose()
|
||||||
|
{
|
||||||
|
helper = null;
|
||||||
|
}
|
||||||
|
|
||||||
public interface Callback
|
public interface Callback
|
||||||
{
|
{
|
||||||
void execute();
|
void execute() throws Exception;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,14 +25,15 @@ import android.os.*;
|
|||||||
import android.support.annotation.*;
|
import android.support.annotation.*;
|
||||||
import android.widget.*;
|
import android.widget.*;
|
||||||
|
|
||||||
import com.activeandroid.util.*;
|
|
||||||
|
|
||||||
import org.isoron.uhabits.*;
|
import org.isoron.uhabits.*;
|
||||||
import org.isoron.uhabits.core.models.*;
|
import org.isoron.uhabits.core.models.*;
|
||||||
import org.isoron.uhabits.core.preferences.*;
|
import org.isoron.uhabits.core.preferences.*;
|
||||||
|
|
||||||
import static android.appwidget.AppWidgetManager.*;
|
import static android.appwidget.AppWidgetManager.OPTION_APPWIDGET_MAX_HEIGHT;
|
||||||
import static org.isoron.androidbase.utils.InterfaceUtils.*;
|
import static android.appwidget.AppWidgetManager.OPTION_APPWIDGET_MAX_WIDTH;
|
||||||
|
import static android.appwidget.AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT;
|
||||||
|
import static android.appwidget.AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH;
|
||||||
|
import static org.isoron.androidbase.utils.InterfaceUtils.dpToPixels;
|
||||||
|
|
||||||
public abstract class BaseWidgetProvider extends AppWidgetProvider
|
public abstract class BaseWidgetProvider extends AppWidgetProvider
|
||||||
{
|
{
|
||||||
@@ -109,7 +110,7 @@ public abstract class BaseWidgetProvider extends AppWidgetProvider
|
|||||||
}
|
}
|
||||||
catch (HabitNotFoundException e)
|
catch (HabitNotFoundException e)
|
||||||
{
|
{
|
||||||
Log.e("BaseWidgetProvider", e);
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user