Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 48305afa authored by Pavel Kirpichyov's avatar Pavel Kirpichyov Committed by Michael Bestas
Browse files

Provide upgrade path for cm-14.1 -> lineage-18.0

This just takes care of making the database is up to date with cm-14.1

* Increasing alarm and switch to profile still need to be implemented.

Includes the following changes:

  Author: Michael W <baddaemon87@gmail.com>
  Date:   Thu Jul 9 23:55:59 2020 +0200

    DeskClock: Remove references to org.lineageos.platform.internal

    * Was used for a feature that isn't used anymore
    * We need to create new tables because dropping columns isn't supported
      -> create temp tables, copy over values, remove old tables, rename temp
         tables
    * Also fixes alarm inserts, which partially failed due to increasing
      volume and profile being indexed wrong:
    "CursorWindow: Failed to read row 0, column 11 from a CursorWindow which
    has 1 rows, 11 columns."
    * Above fix is required for "new Alarms(cursor)" to not fail so we can
      actually get a valid Alarms object to insert into our (temp) database

    Change-Id: I80e495792dcb65955de09268c7df9c6846cee559

  Author: Michael Bestas <mkbestas@lineageos.org>
  Date:   Sat Jul 11 22:51:10 2020 +0300

    DeskClock: Stop depending on platform APIs

    * We can build with sdk_version = current after latest changes

    Change-Id: Ie424ffd156e9595082dc8ad935fb1c9e8e22bd87

Change-Id: Ibbb2b618ddeb6f93cd95a0fba3923bfd6d3fbbbb
parent 9e121293
Loading
Loading
Loading
Loading
+16 −2
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ import android.media.RingtoneManager;
import android.net.Uri;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.ParcelUuid;
import androidx.loader.content.CursorLoader;

import com.android.deskclock.R;
@@ -35,6 +36,7 @@ import com.android.deskclock.data.Weekdays;
import java.util.Calendar;
import java.util.LinkedList;
import java.util.List;
import java.util.UUID;

public final class Alarm implements Parcelable, ClockContract.AlarmsColumns {
    /**
@@ -59,7 +61,8 @@ public final class Alarm implements Parcelable, ClockContract.AlarmsColumns {
            VIBRATE,
            LABEL,
            RINGTONE,
            DELETE_AFTER_USE
            DELETE_AFTER_USE,
            INCREASING_VOLUME,
    };

    private static final String[] QUERY_ALARMS_WITH_INSTANCES_COLUMNS = {
@@ -72,6 +75,7 @@ public final class Alarm implements Parcelable, ClockContract.AlarmsColumns {
            ClockDatabaseHelper.ALARMS_TABLE_NAME + "." + LABEL,
            ClockDatabaseHelper.ALARMS_TABLE_NAME + "." + RINGTONE,
            ClockDatabaseHelper.ALARMS_TABLE_NAME + "." + DELETE_AFTER_USE,
            ClockDatabaseHelper.ALARMS_TABLE_NAME + "." + INCREASING_VOLUME,
            ClockDatabaseHelper.INSTANCES_TABLE_NAME + "."
                    + ClockContract.InstancesColumns.ALARM_STATE,
            ClockDatabaseHelper.INSTANCES_TABLE_NAME + "." + ClockContract.InstancesColumns._ID,
@@ -97,6 +101,8 @@ public final class Alarm implements Parcelable, ClockContract.AlarmsColumns {
    private static final int LABEL_INDEX = 6;
    private static final int RINGTONE_INDEX = 7;
    private static final int DELETE_AFTER_USE_INDEX = 8;
    private static final int INCREASING_VOLUME_INDEX = 9;

    private static final int INSTANCE_STATE_INDEX = 9;
    public static final int INSTANCE_ID_INDEX = 10;
    public static final int INSTANCE_YEAR_INDEX = 11;
@@ -107,7 +113,7 @@ public final class Alarm implements Parcelable, ClockContract.AlarmsColumns {
    public static final int INSTANCE_LABEL_INDEX = 16;
    public static final int INSTANCE_VIBRATE_INDEX = 17;

    private static final int COLUMN_COUNT = DELETE_AFTER_USE_INDEX + 1;
    private static final int COLUMN_COUNT = INCREASING_VOLUME_INDEX + 1;
    private static final int ALARM_JOIN_INSTANCE_COLUMN_COUNT = INSTANCE_VIBRATE_INDEX + 1;

    public static ContentValues createContentValues(Alarm alarm) {
@@ -123,6 +129,7 @@ public final class Alarm implements Parcelable, ClockContract.AlarmsColumns {
        values.put(VIBRATE, alarm.vibrate ? 1 : 0);
        values.put(LABEL, alarm.label);
        values.put(DELETE_AFTER_USE, alarm.deleteAfterUse);
        values.put(INCREASING_VOLUME, alarm.increasingVolume ? 1 : 0);
        if (alarm.alert == null) {
            // We want to put null, so default alarm changes
            values.putNull(RINGTONE);
@@ -284,6 +291,7 @@ public final class Alarm implements Parcelable, ClockContract.AlarmsColumns {
    public String label;
    public Uri alert;
    public boolean deleteAfterUse;
    public boolean increasingVolume;
    public int instanceState;
    public int instanceId;

@@ -301,6 +309,7 @@ public final class Alarm implements Parcelable, ClockContract.AlarmsColumns {
        this.label = "";
        this.alert = DataModel.getDataModel().getDefaultAlarmRingtoneUri();
        this.deleteAfterUse = false;
        this.increasingVolume = false;
    }

    public Alarm(Cursor c) {
@@ -312,6 +321,7 @@ public final class Alarm implements Parcelable, ClockContract.AlarmsColumns {
        vibrate = c.getInt(VIBRATE_INDEX) == 1;
        label = c.getString(LABEL_INDEX);
        deleteAfterUse = c.getInt(DELETE_AFTER_USE_INDEX) == 1;
        increasingVolume = c.getInt(INCREASING_VOLUME_INDEX) == 1;

        if (c.getColumnCount() == ALARM_JOIN_INSTANCE_COLUMN_COUNT) {
            instanceState = c.getInt(INSTANCE_STATE_INDEX);
@@ -337,6 +347,7 @@ public final class Alarm implements Parcelable, ClockContract.AlarmsColumns {
        label = p.readString();
        alert = p.readParcelable(null);
        deleteAfterUse = p.readInt() == 1;
        increasingVolume = p.readInt() == 1;
    }

    /**
@@ -371,6 +382,7 @@ public final class Alarm implements Parcelable, ClockContract.AlarmsColumns {
        p.writeString(label);
        p.writeParcelable(alert, flags);
        p.writeInt(deleteAfterUse ? 1 : 0);
        p.writeInt(increasingVolume ? 1 : 0);
    }

    public int describeContents() {
@@ -383,6 +395,7 @@ public final class Alarm implements Parcelable, ClockContract.AlarmsColumns {
        result.mVibrate = vibrate;
        result.mLabel = label;
        result.mRingtone = alert;
        result.mIncreasingVolume = increasingVolume;
        return result;
    }

@@ -463,6 +476,7 @@ public final class Alarm implements Parcelable, ClockContract.AlarmsColumns {
                ", vibrate=" + vibrate +
                ", label='" + label + '\'' +
                ", deleteAfterUse=" + deleteAfterUse +
                ", increasingVolume=" + increasingVolume +
                '}';
    }
}
+12 −2
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@ import com.android.deskclock.data.DataModel;
import java.util.Calendar;
import java.util.LinkedList;
import java.util.List;
import java.util.UUID;

public final class AlarmInstance implements ClockContract.InstancesColumns {
    /**
@@ -66,7 +67,8 @@ public final class AlarmInstance implements ClockContract.InstancesColumns {
            VIBRATE,
            RINGTONE,
            ALARM_ID,
            ALARM_STATE
            ALARM_STATE,
            INCREASING_VOLUME
    };

    /**
@@ -84,8 +86,9 @@ public final class AlarmInstance implements ClockContract.InstancesColumns {
    private static final int RINGTONE_INDEX = 8;
    private static final int ALARM_ID_INDEX = 9;
    private static final int ALARM_STATE_INDEX = 10;
    private static final int INCREASING_VOLUME_INDEX = 11;

    private static final int COLUMN_COUNT = ALARM_STATE_INDEX + 1;
    private static final int COLUMN_COUNT = INCREASING_VOLUME_INDEX + 1;

    public static ContentValues createContentValues(AlarmInstance instance) {
        ContentValues values = new ContentValues(COLUMN_COUNT);
@@ -109,6 +112,8 @@ public final class AlarmInstance implements ClockContract.InstancesColumns {
        }
        values.put(ALARM_ID, instance.mAlarmId);
        values.put(ALARM_STATE, instance.mAlarmState);
        values.put(INCREASING_VOLUME, instance.mIncreasingVolume ? 1 : 0);

        return values;
    }

@@ -295,6 +300,7 @@ public final class AlarmInstance implements ClockContract.InstancesColumns {
    public Uri mRingtone;
    public Long mAlarmId;
    public int mAlarmState;
    public boolean mIncreasingVolume;

    public AlarmInstance(Calendar calendar, Long alarmId) {
        this(calendar);
@@ -308,6 +314,7 @@ public final class AlarmInstance implements ClockContract.InstancesColumns {
        mVibrate = false;
        mRingtone = null;
        mAlarmState = SILENT_STATE;
        mIncreasingVolume = false;
    }

    public AlarmInstance(AlarmInstance instance) {
@@ -322,6 +329,7 @@ public final class AlarmInstance implements ClockContract.InstancesColumns {
         this.mRingtone = instance.mRingtone;
         this.mAlarmId = instance.mAlarmId;
         this.mAlarmState = instance.mAlarmState;
         this.mIncreasingVolume = instance.mIncreasingVolume;
    }

    public AlarmInstance(Cursor c, boolean joinedTable) {
@@ -356,6 +364,7 @@ public final class AlarmInstance implements ClockContract.InstancesColumns {
            mAlarmId = c.getLong(ALARM_ID_INDEX);
        }
        mAlarmState = c.getInt(ALARM_STATE_INDEX);
        mIncreasingVolume = c.getInt(INCREASING_VOLUME_INDEX) == 1;
    }

    /**
@@ -471,6 +480,7 @@ public final class AlarmInstance implements ClockContract.InstancesColumns {
                ", mRingtone=" + mRingtone +
                ", mAlarmId=" + mAlarmId +
                ", mAlarmState=" + mAlarmState +
                ", mIncreasingVolume=" + mIncreasingVolume +
                '}';
    }
}
+6 −0
Original line number Diff line number Diff line
@@ -84,6 +84,12 @@ public final class ClockContract {
         * <p>Type: STRING</p>
         */
        String RINGTONE = "ringtone";

        /**
         * True if alarm should start off quiet and slowly increase volume
         * <P>Type: BOOLEAN</P>
         */
        public static final String INCREASING_VOLUME = "incvol";
    }

    /**
+97 −15
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.deskclock.provider;

import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
@@ -29,6 +30,7 @@ import com.android.deskclock.LogUtils;
import com.android.deskclock.data.Weekdays;

import java.util.Calendar;
import java.util.UUID;

/**
 * Helper class for opening the database from multiple providers.  Also provides
@@ -57,11 +59,26 @@ class ClockDatabaseHelper extends SQLiteOpenHelper {
     */
    private static final int VERSION_8 = 8;

    /**
     * Added increasing alarm volume mode
     */
    private static final int VERSION_9 = 10;

    /**
     * Added change profile
     */
    private static final int VERSION_10 = 11;

    /**
     * Removed change profile
     */
    private static final int VERSION_11 = 12;

    // This creates a default alarm at 8:30 for every Mon,Tue,Wed,Thu,Fri
    private static final String DEFAULT_ALARM_1 = "(8, 30, 31, 0, 1, '', NULL, 0);";
    private static final String DEFAULT_ALARM_1 = "(8, 30, 31, 0, 1, '', NULL, 0, 0);";

    // This creates a default alarm at 9:30 for every Sat,Sun
    private static final String DEFAULT_ALARM_2 = "(9, 00, 96, 0, 1, '', NULL, 0);";
    private static final String DEFAULT_ALARM_2 = "(9, 00, 96, 0, 1, '', NULL, 0, 0);";

    // Database and table names
    static final String DATABASE_NAME = "alarms.db";
@@ -70,8 +87,8 @@ class ClockDatabaseHelper extends SQLiteOpenHelper {
    static final String INSTANCES_TABLE_NAME = "alarm_instances";
    private static final String SELECTED_CITIES_TABLE_NAME = "selected_cities";

    private static void createAlarmsTable(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE " + ALARMS_TABLE_NAME + " (" +
    private static void createAlarmsTable(SQLiteDatabase db, String alarmsTableName) {
        db.execSQL("CREATE TABLE " + alarmsTableName + " (" +
                ClockContract.AlarmsColumns._ID + " INTEGER PRIMARY KEY," +
                ClockContract.AlarmsColumns.HOUR + " INTEGER NOT NULL, " +
                ClockContract.AlarmsColumns.MINUTES + " INTEGER NOT NULL, " +
@@ -80,12 +97,13 @@ class ClockDatabaseHelper extends SQLiteOpenHelper {
                ClockContract.AlarmsColumns.VIBRATE + " INTEGER NOT NULL, " +
                ClockContract.AlarmsColumns.LABEL + " TEXT NOT NULL, " +
                ClockContract.AlarmsColumns.RINGTONE + " TEXT, " +
                ClockContract.AlarmsColumns.DELETE_AFTER_USE + " INTEGER NOT NULL DEFAULT 0);");
                ClockContract.AlarmsColumns.DELETE_AFTER_USE + " INTEGER NOT NULL DEFAULT 0, " +
                ClockContract.AlarmsColumns.INCREASING_VOLUME + " INTEGER NOT NULL DEFAULT 0);");
        LogUtils.i("Alarms Table created");
    }

    private static void createInstanceTable(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE " + INSTANCES_TABLE_NAME + " (" +
    private static void createInstanceTable(SQLiteDatabase db, String instanceTableName) {
        db.execSQL("CREATE TABLE " + instanceTableName + " (" +
                ClockContract.InstancesColumns._ID + " INTEGER PRIMARY KEY," +
                ClockContract.InstancesColumns.YEAR + " INTEGER NOT NULL, " +
                ClockContract.InstancesColumns.MONTH + " INTEGER NOT NULL, " +
@@ -98,19 +116,19 @@ class ClockDatabaseHelper extends SQLiteOpenHelper {
                ClockContract.InstancesColumns.ALARM_STATE + " INTEGER NOT NULL, " +
                ClockContract.InstancesColumns.ALARM_ID + " INTEGER REFERENCES " +
                    ALARMS_TABLE_NAME + "(" + ClockContract.AlarmsColumns._ID + ") " +
                    "ON UPDATE CASCADE ON DELETE CASCADE" +
                ");");
                    "ON UPDATE CASCADE ON DELETE CASCADE, " +
                ClockContract.InstancesColumns.INCREASING_VOLUME + " INTEGER NOT NULL DEFAULT 0);");
        LogUtils.i("Instance table created");
    }

    public ClockDatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, VERSION_8);
        super(context, DATABASE_NAME, null, VERSION_11);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        createAlarmsTable(db);
        createInstanceTable(db);
        createAlarmsTable(db, ALARMS_TABLE_NAME);
        createInstanceTable(db, INSTANCES_TABLE_NAME);

        // insert default alarms
        LogUtils.i("Inserting default alarms");
@@ -123,7 +141,8 @@ class ClockDatabaseHelper extends SQLiteOpenHelper {
                ClockContract.AlarmsColumns.VIBRATE + cs +
                ClockContract.AlarmsColumns.LABEL + cs +
                ClockContract.AlarmsColumns.RINGTONE + cs +
                ClockContract.AlarmsColumns.DELETE_AFTER_USE + ") VALUES ";
                ClockContract.AlarmsColumns.DELETE_AFTER_USE + cs +
                ClockContract.AlarmsColumns.INCREASING_VOLUME + ") VALUES ";
        db.execSQL(insertMe + DEFAULT_ALARM_1);
        db.execSQL(insertMe + DEFAULT_ALARM_2);
    }
@@ -142,8 +161,8 @@ class ClockDatabaseHelper extends SQLiteOpenHelper {
            db.execSQL("DROP TABLE IF EXISTS " + INSTANCES_TABLE_NAME + ";");

            // Create new alarms table and copy over the data
            createAlarmsTable(db);
            createInstanceTable(db);
            createAlarmsTable(db, ALARMS_TABLE_NAME);
            createInstanceTable(db, INSTANCES_TABLE_NAME);

            LogUtils.i("Copying old alarms to new table");
            final String[] OLD_TABLE_COLUMNS = {
@@ -155,6 +174,7 @@ class ClockDatabaseHelper extends SQLiteOpenHelper {
                    "vibrate",
                    "message",
                    "alert",
                    "incvol"
            };
            try (Cursor cursor = db.query(OLD_ALARMS_TABLE_NAME, OLD_TABLE_COLUMNS,
                    null, null, null, null, null)) {
@@ -176,6 +196,7 @@ class ClockDatabaseHelper extends SQLiteOpenHelper {
                        alarm.alert =
                                TextUtils.isEmpty(alertString) ? null : Uri.parse(alertString);
                    }
                    alarm.increasingVolume = cursor.getInt(8) == 1;

                    // Save new version of alarm and create alarm instance for it
                    db.insert(ALARMS_TABLE_NAME, null, Alarm.createContentValues(alarm));
@@ -189,6 +210,67 @@ class ClockDatabaseHelper extends SQLiteOpenHelper {

            LogUtils.i("Dropping old alarm table");
            db.execSQL("DROP TABLE IF EXISTS " + OLD_ALARMS_TABLE_NAME + ";");
            return;
        }

        if (oldVersion < VERSION_9) {
            db.execSQL("ALTER TABLE " + ALARMS_TABLE_NAME
                    + " ADD COLUMN " + ClockContract.AlarmsColumns.INCREASING_VOLUME
                    + " INTEGER NOT NULL DEFAULT 0;");
            db.execSQL("ALTER TABLE " + INSTANCES_TABLE_NAME
                    + " ADD COLUMN " + ClockContract.InstancesColumns.INCREASING_VOLUME
                    + " INTEGER NOT NULL DEFAULT 0;");
        }

        if (oldVersion < VERSION_10) {
            db.execSQL("ALTER TABLE " + ALARMS_TABLE_NAME
                    + " ADD COLUMN profile"
                    + " TEXT NOT NULL DEFAULT '';");
            db.execSQL("ALTER TABLE " + INSTANCES_TABLE_NAME
                    + " ADD COLUMN profile"
                    + " TEXT NOT NULL DEFAULT '';");
        }

        if (oldVersion < VERSION_11) {
            LogUtils.i("Copying alarms to temporary table");
            final String TEMP_ALARMS_TABLE_NAME = ALARMS_TABLE_NAME + "_temp";
            final String TEMP_INSTANCES_TABLE_NAME = INSTANCES_TABLE_NAME + "_temp";
            createAlarmsTable(db, TEMP_ALARMS_TABLE_NAME);
            createInstanceTable(db, TEMP_INSTANCES_TABLE_NAME);
            final String[] OLD_TABLE_COLUMNS = {
                    ClockContract.AlarmsColumns._ID,
                    ClockContract.AlarmsColumns.HOUR,
                    ClockContract.AlarmsColumns.MINUTES,
                    ClockContract.AlarmsColumns.DAYS_OF_WEEK,
                    ClockContract.AlarmsColumns.ENABLED,
                    ClockContract.AlarmsColumns.VIBRATE,
                    ClockContract.AlarmsColumns.LABEL,
                    ClockContract.AlarmsColumns.RINGTONE,
                    ClockContract.AlarmsColumns.DELETE_AFTER_USE,
                    ClockContract.AlarmsColumns.INCREASING_VOLUME
            };

            try (Cursor cursor = db.query(ALARMS_TABLE_NAME, OLD_TABLE_COLUMNS,
                    null, null, null, null, null)) {
                final Calendar currentTime = Calendar.getInstance();
                while (cursor != null && cursor.moveToNext()) {
                    final Alarm alarm = new Alarm(cursor);
                    // Save new version of alarm and create alarm instance for it
                    db.insert(TEMP_ALARMS_TABLE_NAME, null,
                            Alarm.createContentValues(alarm));
                    if (alarm.enabled) {
                        AlarmInstance newInstance = alarm.createInstanceAfter(currentTime);
                        db.insert(TEMP_INSTANCES_TABLE_NAME, null,
                                AlarmInstance.createContentValues(newInstance));
                    }
                }
            }
            db.execSQL("DROP TABLE IF EXISTS " + ALARMS_TABLE_NAME + ";");
            db.execSQL("DROP TABLE IF EXISTS " + INSTANCES_TABLE_NAME + ";");
            db.execSQL("ALTER TABLE " + TEMP_ALARMS_TABLE_NAME
                    + " RENAME TO " + ALARMS_TABLE_NAME + ";");
            db.execSQL("ALTER TABLE " + TEMP_INSTANCES_TABLE_NAME
                    + " RENAME TO " + INSTANCES_TABLE_NAME + ";");
        }
    }

+2 −0
Original line number Diff line number Diff line
@@ -75,6 +75,8 @@ public class ClockProvider extends ContentProvider {
                ALARMS_TABLE_NAME + "." + AlarmsColumns.RINGTONE);
        sAlarmsWithInstancesProjection.put(ALARMS_TABLE_NAME + "." + AlarmsColumns.DELETE_AFTER_USE,
                ALARMS_TABLE_NAME + "." + AlarmsColumns.DELETE_AFTER_USE);
        sAlarmsWithInstancesProjection.put(ALARMS_TABLE_NAME + "." + AlarmsColumns.INCREASING_VOLUME,
                ALARMS_TABLE_NAME + "." + AlarmsColumns.INCREASING_VOLUME);
        sAlarmsWithInstancesProjection.put(INSTANCES_TABLE_NAME + "."
                + InstancesColumns.ALARM_STATE,
                INSTANCES_TABLE_NAME + "." + InstancesColumns.ALARM_STATE);