Commit ce03974d authored by Bartek Fabiszewski's avatar Bartek Fabiszewski
Browse files

Add waypoint activity and task

parent b7d03627
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -45,7 +45,9 @@ android {

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    testImplementation 'junit:junit:4.12'
    implementation 'androidx.appcompat:appcompat:1.1.0-beta01'
    implementation 'androidx.preference:preference:1.1.0-beta01'
    implementation 'androidx.exifinterface:exifinterface:1.0.0'
    testImplementation 'junit:junit:4.12'
    implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0'
}
+12 −16
Original line number Diff line number Diff line
<?xml version="1.0" encoding="utf-8"?>
<!--
  ~ Copyright (c) 2017 Bartek Fabiszewski
  ~ http://www.fabiszewski.net
  ~
  ~ This file is part of μlogger-android.
  ~ Licensed under GPL, either version 3, or any later.
  ~ See <http://www.gnu.org/licenses/>
  -->

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="net.fabiszewski.ulogger">
@@ -15,35 +6,39 @@
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <!-- Write camera images -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <!-- For auto start -->
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <!-- For web sync retries -->
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <!-- For foreground services API >= 28 -->
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />

    <!-- Needed if app targets API >= 21 -->
    <!-- For location API >= 21 -->
    <uses-feature android:name="android.hardware.location.gps" />
    <uses-feature android:name="android.hardware.location.network" />

    <!-- Todo: attach camera image to position -->
    <!-- <uses-feature android:name="android.hardware.camera" android:required="false" /> -->
    <!-- For attaching images to waypoints -->
    <uses-feature android:name="android.hardware.camera" android:required="false" />

    <application
        android:allowBackup="true"
        android:fullBackupContent="@xml/backup"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:networkSecurityConfig="@xml/network_security_config"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"
        android:networkSecurityConfig="@xml/network_security_config"
        tools:ignore="UnusedAttribute">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".WaypointActivity"
            android:parentActivityName=".MainActivity" />
        <activity android:name=".SettingsActivity" />

        <service
@@ -54,10 +49,10 @@
        <service
            android:name=".WebSyncService"
            android:exported="false" />

        <service
            android:name=".GpxExportService"
            android:exported="false" />
        <service android:name=".LoggerSingleService" />

        <receiver
            android:name=".RestartBroadcastReceiver"
@@ -67,6 +62,7 @@
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <action android:name="android.intent.action.QUICKBOOT_POWERON" />
                <action android:name="android.intent.action.MY_PACKAGE_REPLACED" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </receiver>
+17 −1
Original line number Diff line number Diff line
@@ -76,6 +76,17 @@ class DbAccess {
     * @param loc Location
     */
    void writeLocation(Location loc) {
        writeLocation(loc, null, null);
    }

    /**
     * Write location to database.
     *
     * @param loc Location
     * @param comment Comment
     * @param imageUri Image URI
     */
    void writeLocation(Location loc, String comment, String imageUri) {
        if (Logger.DEBUG) { Log.d(TAG, "[writeLocation]"); }
        ContentValues values = new ContentValues();
        values.put(DbContract.Positions.COLUMN_TIME, loc.getTime() / 1000);
@@ -94,7 +105,12 @@ class DbAccess {
            values.put(DbContract.Positions.COLUMN_ACCURACY, loc.getAccuracy());
        }
        values.put(DbContract.Positions.COLUMN_PROVIDER, loc.getProvider());

        if (comment != null && !comment.isEmpty()) {
            values.put(DbContract.Positions.COLUMN_COMMENT, comment);
        }
        if (imageUri != null && !imageUri.isEmpty()) {
            values.put(DbContract.Positions.COLUMN_IMAGE_URI, imageUri);
        }
        db.insert(DbContract.Positions.TABLE_NAME, null, values);
    }

+16 −14
Original line number Diff line number Diff line
@@ -22,23 +22,25 @@ final class DbContract {

    /** Positions table */
    public static class Positions implements BaseColumns {
        public static final String TABLE_NAME = "positions";
        public static final String COLUMN_TIME = "time";
        public static final String COLUMN_LONGITUDE = "longitude";
        public static final String COLUMN_LATITUDE = "latitude";
        public static final String COLUMN_ALTITUDE = "altitude";
        public static final String COLUMN_ACCURACY = "accuracy";
        public static final String COLUMN_SPEED = "speed";
        public static final String COLUMN_BEARING = "bearing";
        public static final String COLUMN_PROVIDER = "provider";
        public static final String COLUMN_SYNCED = "synced";
        public static final String COLUMN_ERROR = "error";
        static final String TABLE_NAME = "positions";
        static final String COLUMN_TIME = "time";
        static final String COLUMN_LONGITUDE = "longitude";
        static final String COLUMN_LATITUDE = "latitude";
        static final String COLUMN_ALTITUDE = "altitude";
        static final String COLUMN_ACCURACY = "accuracy";
        static final String COLUMN_SPEED = "speed";
        static final String COLUMN_BEARING = "bearing";
        static final String COLUMN_PROVIDER = "provider";
        static final String COLUMN_COMMENT = "comment";
        static final String COLUMN_IMAGE_URI = "imageUri";
        static final String COLUMN_SYNCED = "synced";
        static final String COLUMN_ERROR = "error";
    }

    /** Track table */
    public static class Track {
        public static final String TABLE_NAME = "track";
        public static final String COLUMN_ID = "id";
        public static final String COLUMN_NAME = "name";
        static final String TABLE_NAME = "track";
        static final String COLUMN_ID = "id";
        static final String COLUMN_NAME = "name";
    }
}
+82 −10
Original line number Diff line number Diff line
@@ -22,8 +22,9 @@ class DbHelper extends SQLiteOpenHelper {

    private static DbHelper sInstance;

    private static final int DATABASE_VERSION = 1;
    private static final int DATABASE_VERSION = 2;
    private static final String DATABASE_NAME = "ulogger.db";
    private static final String BACKUP_SUFFIX = "_backup";

    private static final String SQL_CREATE_POSITIONS =
            "CREATE TABLE " + DbContract.Positions.TABLE_NAME + " (" +
@@ -36,18 +37,61 @@ class DbHelper extends SQLiteOpenHelper {
            DbContract.Positions.COLUMN_SPEED + " TEXT DEFAULT NULL," +
            DbContract.Positions.COLUMN_ACCURACY + " TEXT DEFAULT NULL," +
            DbContract.Positions.COLUMN_PROVIDER + " TEXT," +
            DbContract.Positions.COLUMN_COMMENT + " TEXT DEFAULT NULL," +
            DbContract.Positions.COLUMN_IMAGE_URI + " TEXT DEFAULT NULL," +
            DbContract.Positions.COLUMN_SYNCED + " INTEGER DEFAULT 0," +
            DbContract.Positions.COLUMN_ERROR + " TEXT DEFAULT NULL)";
    private static final String SQL_CREATE_INDEX_SYNCED =
            "CREATE INDEX syncedIdx ON " + DbContract.Positions.TABLE_NAME + "(" +
            DbContract.Positions.COLUMN_SYNCED + ")";
    private static final String SQL_CREATE_TRACK =
            "CREATE TABLE " + DbContract.Track.TABLE_NAME + " (" +
            DbContract.Track.COLUMN_ID + " INTEGER DEFAULT NULL," +
            DbContract.Track.COLUMN_NAME + " TEXT)";

    private static final String SQL_DELETE_POSITIONS =
    private static final String SQL_DROP_POSITIONS =
            "DROP TABLE IF EXISTS " + DbContract.Positions.TABLE_NAME;
    private static final String SQL_DELETE_TRACK =
    private static final String SQL_DROP_TRACK =
            "DROP TABLE IF EXISTS " + DbContract.Track.TABLE_NAME;

    private static final String SQL_ADD_COLUMN_COMMENT =
            "ALTER TABLE " + DbContract.Positions.TABLE_NAME + " ADD COLUMN " +
            DbContract.Positions.COLUMN_IMAGE_URI + " TEXT DEFAULT NULL";

    private static final String SQL_ADD_COLUMN_IMAGE_URI =
            "ALTER TABLE " + DbContract.Positions.TABLE_NAME + " ADD COLUMN " +
            DbContract.Positions.COLUMN_COMMENT + " TEXT DEFAULT NULL";

    private static final String SQL_RENAME_POSITIONS_V1 =
            "ALTER TABLE " + DbContract.Positions.TABLE_NAME + " " +
                    "RENAME TO " + DbContract.Positions.TABLE_NAME + BACKUP_SUFFIX;
    private static final String SQL_INSERT_FROM_BACKUP_V1 =
            "INSERT INTO " + DbContract.Positions.TABLE_NAME + " (" +
            DbContract.Positions.COLUMN_TIME + "," +
            DbContract.Positions.COLUMN_LATITUDE + "," +
            DbContract.Positions.COLUMN_LONGITUDE + "," +
            DbContract.Positions.COLUMN_ALTITUDE + "," +
            DbContract.Positions.COLUMN_BEARING + "," +
            DbContract.Positions.COLUMN_SPEED + "," +
            DbContract.Positions.COLUMN_ACCURACY + "," +
            DbContract.Positions.COLUMN_PROVIDER + "," +
            DbContract.Positions.COLUMN_SYNCED + "," +
            DbContract.Positions.COLUMN_ERROR + ") " +
            "SELECT " +
            DbContract.Positions.COLUMN_TIME + "," +
            DbContract.Positions.COLUMN_LATITUDE + "," +
            DbContract.Positions.COLUMN_LONGITUDE + "," +
            DbContract.Positions.COLUMN_ALTITUDE + "," +
            DbContract.Positions.COLUMN_BEARING + "," +
            DbContract.Positions.COLUMN_SPEED + "," +
            DbContract.Positions.COLUMN_ACCURACY + "," +
            DbContract.Positions.COLUMN_PROVIDER + "," +
            DbContract.Positions.COLUMN_SYNCED + "," +
            DbContract.Positions.COLUMN_ERROR + " " +
            "FROM " + DbContract.Positions.TABLE_NAME + BACKUP_SUFFIX;
    private static final String SQL_DROP_POSITIONS_BACKUP =
            "DROP TABLE IF EXISTS " + DbContract.Positions.TABLE_NAME + BACKUP_SUFFIX;

    /**
     * Private constructor
     *
@@ -77,28 +121,56 @@ class DbHelper extends SQLiteOpenHelper {
     */
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(SQL_CREATE_POSITIONS);
        db.execSQL(SQL_CREATE_INDEX_SYNCED);
        db.execSQL(SQL_CREATE_TRACK);
    }

    /**
     * On upgrade delete all tables, call create
     * On upgrade
     * @param db Database handle
     * @param oldVersion Old version number
     * @param newVersion New version number
     */
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL(SQL_DELETE_POSITIONS);
        db.execSQL(SQL_DELETE_TRACK);
        if (oldVersion == 1 && newVersion == 2) {
            migrateToVersion2(db);
        } else {
            dropAndCreate(db);
        }
    }

    private void dropAndCreate(SQLiteDatabase db) {
        db.execSQL(SQL_DROP_POSITIONS);
        db.execSQL(SQL_DROP_TRACK);
        onCreate(db);
    }

    private void migrateToVersion2(SQLiteDatabase db) {
        // only affects positions schema
        db.execSQL(SQL_ADD_COLUMN_COMMENT);
        db.execSQL(SQL_ADD_COLUMN_IMAGE_URI);
        db.execSQL(SQL_CREATE_INDEX_SYNCED);

    }

    /**
     * On downgrade behave as on upgrade
     * On downgrade
     * @param db Database handle
     * @param oldVersion Old version number
     * @param newVersion New version number
     */
    public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        onUpgrade(db, oldVersion, newVersion);
        if (oldVersion == 2 && newVersion == 1) {
            downgradeToVersion1(db);
        } else {
            dropAndCreate(db);
        }
    }

    private void downgradeToVersion1(SQLiteDatabase db) {
        db.execSQL(SQL_RENAME_POSITIONS_V1);
        db.execSQL(SQL_CREATE_POSITIONS);
        db.execSQL(SQL_INSERT_FROM_BACKUP_V1);
        db.execSQL(SQL_DROP_POSITIONS_BACKUP);
    }
}
Loading