summaryrefslogtreecommitdiffstats
path: root/src/com/android/launcher3/stats/internal/db/DatabaseHelper.java
blob: 7ffd509ff5614b15ec57fa52b7ada07bac80af9f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
package com.android.launcher3.stats.internal.db;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import com.android.launcher3.stats.internal.model.TrackingEvent;
import com.android.launcher3.stats.util.Logger;

import java.util.ArrayList;
import java.util.List;

/**
 * <pre>
 *     Helper for accessing the database
 * </pre>
 *
 * @see {@link SQLiteOpenHelper}
 */
public class DatabaseHelper extends SQLiteOpenHelper {

    // Constants
    private static final String TAG = DatabaseHelper.class.getSimpleName();
    private static final String DATABASE_NAME = "events";
    private static final int DATABASE_VERSION = 1;

    // Instance
    private static DatabaseHelper sInstance = null;

    /**
     * Constructor
     *
     * @param context {@link Context}
     * @return {@link DatabaseHelper}
     * @throws IllegalArgumentException {@link IllegalArgumentException}
     */
    public static DatabaseHelper createInstance(Context context) throws IllegalArgumentException {
        if (sInstance == null) {
            sInstance = new DatabaseHelper(context);
        }
        return sInstance;
    }

    /**
     * Constructor
     *
     * @param context {@link Context}
     */
    public DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    /**
     * Write an event to the database
     *
     * @param trackingEvent {@link TrackingEvent}
     * @throws IllegalArgumentException {@link IllegalArgumentException}
     */
    public void writeEvent(TrackingEvent trackingEvent)
            throws IllegalArgumentException {
        if (trackingEvent == null) {
            throw new IllegalArgumentException("'trackingEvent' cannot be null!");
        }
        Logger.logd(TAG, "Event written to database: " + trackingEvent);
        SQLiteDatabase db = getWritableDatabase();
        ContentValues contentValues = trackingEvent.toContentValues();
        db.insert(TrackingEventContract.EVENT_TABLE_NAME, null, contentValues);
        db.close();
    }

    /**
     * Get a list of tracking events
     *
     * @param instanceId {@link Integer}
     * @return {@link List}
     * @throws IllegalArgumentException {@link IllegalArgumentException}
     */
    public List<TrackingEvent> getTrackingEventsByCategory(int instanceId,
                                TrackingEvent.Category category) throws IllegalArgumentException {
        if (category == null) {
            throw new IllegalArgumentException("'category' cannot be null!");
        }

        List<TrackingEvent> eventList = new ArrayList<TrackingEvent>();

        // Get a writable database
        SQLiteDatabase db = getWritableDatabase();

        // Update unclaimed items for this instance
        ContentValues contentValues = new ContentValues();
        contentValues.put(TrackingEventContract.EVENT_COLUMN_INSTANCE, instanceId);
        String whereClause = TrackingEventContract.EVENT_COLUMN_INSTANCE + " IS NULL AND "
                + TrackingEventContract.EVENT_COLUMN_CATEGORY + " = ? ";
        String[] whereArgs = new String[] {
               category.name(),
        };
        int cnt = db.update(TrackingEventContract.EVENT_TABLE_NAME, contentValues, whereClause,
                whereArgs);

        // Short circuit empty update
        if (cnt < 1) {
            return eventList;
        }

        // Select all tagged items
        String selection = TrackingEventContract.EVENT_COLUMN_CATEGORY + " = ? AND "
                + TrackingEventContract.EVENT_COLUMN_INSTANCE + " = ? ";
        String[] selectionArgs = new String[]{
                category.name(),
                String.valueOf(instanceId),
        };
        Cursor c = db.query(TrackingEventContract.EVENT_TABLE_NAME, null, selection, selectionArgs,
                null, null, null);

        // Build return list
        while (c != null && c.getCount() > 0 && c.moveToNext()) {
            eventList.add(new TrackingEvent(c));
        }

        db.close();

        return eventList;
    }

    /**
     * Deletes events related to the instance
     *
     * @param instanceId {@link Integer}
     * @return {@link Integer}
     */
    public int deleteEventsByInstanceId(int instanceId) {
        SQLiteDatabase db = getWritableDatabase();
        String whereClause = TrackingEventContract.EVENT_COLUMN_INSTANCE + " = ?";
        String[] whereArgs = new String[]{
                String.valueOf(instanceId),
        };
        int cnt = db.delete(TrackingEventContract.EVENT_TABLE_NAME, whereClause, whereArgs);
        db.close();
        return cnt;
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(TrackingEventContract.CREATE_EVENT_TABLE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

        // [NOTE][MSB]: This will lose data, need to make sure this is handled if/when database
        // schema changes

        // db.execSQL("DROP TABLE IF EXISTS " + TrackingEventContract.EVENT_TABLE_NAME);
        // onCreate(db);

    }

}