155fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk/*
255fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk * Copyright (C) 2013 The Android Open Source Project
355fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk *
455fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk * Licensed under the Apache License, Version 2.0 (the "License");
555fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk * you may not use this file except in compliance with the License.
655fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk * You may obtain a copy of the License at
755fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk *
855fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk *      http://www.apache.org/licenses/LICENSE-2.0
955fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk *
1055fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk * Unless required by applicable law or agreed to in writing, software
1155fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk * distributed under the License is distributed on an "AS IS" BASIS,
1255fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1355fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk * See the License for the specific language governing permissions and
1455fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk * limitations under the License.
1555fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk */
1655fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunkpackage com.android.gallery3d.filtershow.data;
1755fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk
1855fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunkimport android.content.ContentValues;
1955fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunkimport android.content.Context;
2055fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunkimport android.database.Cursor;
2155fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunkimport android.database.sqlite.SQLiteDatabase;
2255fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunkimport android.database.sqlite.SQLiteException;
2355fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunkimport android.util.Log;
2455fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunkimport android.util.Pair;
2555fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk
2655fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunkimport com.android.gallery3d.filtershow.data.FilterStackDBHelper.FilterStack;
27fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroardimport com.android.gallery3d.filtershow.filters.FilterUserPresetRepresentation;
28fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroardimport com.android.gallery3d.filtershow.pipeline.ImagePreset;
2955fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk
3055fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunkimport java.util.ArrayList;
3155fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunkimport java.util.List;
3255fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk
3355fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunkpublic class FilterStackSource {
3455fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk    private static final String LOGTAG = "FilterStackSource";
3555fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk
36fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard    private SQLiteDatabase database = null;
3755fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk    private final FilterStackDBHelper dbHelper;
3855fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk
3955fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk    public FilterStackSource(Context context) {
4055fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk        dbHelper = new FilterStackDBHelper(context);
4155fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk    }
4255fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk
4355fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk    public void open() {
4455fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk        try {
4555fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk            database = dbHelper.getWritableDatabase();
4655fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk        } catch (SQLiteException e) {
4755fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk            Log.w(LOGTAG, "could not open database", e);
4855fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk        }
4955fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk    }
5055fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk
5155fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk    public void close() {
5255fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk        database = null;
5355fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk        dbHelper.close();
5455fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk    }
5555fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk
5655fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk    public boolean insertStack(String stackName, byte[] stackBlob) {
5755fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk        boolean ret = true;
5855fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk        ContentValues val = new ContentValues();
5955fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk        val.put(FilterStack.STACK_ID, stackName);
6055fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk        val.put(FilterStack.FILTER_STACK, stackBlob);
6155fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk        database.beginTransaction();
6255fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk        try {
6355fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk            ret = (-1 != database.insert(FilterStack.TABLE, null, val));
6455fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk            database.setTransactionSuccessful();
6555fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk        } finally {
6655fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk            database.endTransaction();
6755fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk        }
6855fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk        return ret;
6955fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk    }
7055fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk
71fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard    public void updateStackName(int id, String stackName) {
72fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        ContentValues val = new ContentValues();
73fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        val.put(FilterStack.STACK_ID, stackName);
74fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        database.beginTransaction();
75fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        try {
76fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard            database.update(FilterStack.TABLE, val, FilterStack._ID + " = ?",
77fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard                    new String[] { "" + id});
78fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard            database.setTransactionSuccessful();
79fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        } finally {
80fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard            database.endTransaction();
81fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        }
82fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard    }
83fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard
84fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard    public boolean removeStack(int id) {
8555fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk        boolean ret = true;
8655fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk        database.beginTransaction();
8755fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk        try {
88fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard            ret = (0 != database.delete(FilterStack.TABLE, FilterStack._ID + " = ?",
89fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard                    new String[] { "" + id }));
9055fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk            database.setTransactionSuccessful();
9155fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk        } finally {
9255fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk            database.endTransaction();
9355fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk        }
9455fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk        return ret;
9555fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk    }
9655fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk
9755fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk    public void removeAllStacks() {
9855fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk        database.beginTransaction();
9955fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk        try {
10055fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk            database.delete(FilterStack.TABLE, null, null);
10155fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk            database.setTransactionSuccessful();
10255fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk        } finally {
10355fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk            database.endTransaction();
10455fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk        }
10555fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk    }
10655fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk
10755fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk    public byte[] getStack(String stackName) {
10855fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk        byte[] ret = null;
10955fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk        Cursor c = null;
11055fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk        database.beginTransaction();
11155fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk        try {
11255fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk            c = database.query(FilterStack.TABLE,
11355fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk                    new String[] { FilterStack.FILTER_STACK },
11455fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk                    FilterStack.STACK_ID + " = ?",
11555fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk                    new String[] { stackName }, null, null, null, null);
11655fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk            if (c != null && c.moveToFirst() && !c.isNull(0)) {
11755fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk                ret = c.getBlob(0);
11855fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk            }
11955fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk            database.setTransactionSuccessful();
12055fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk        } finally {
12155fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk            if (c != null) {
12255fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk                c.close();
12355fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk            }
12455fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk            database.endTransaction();
12555fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk        }
12655fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk        return ret;
12755fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk    }
12855fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk
129fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard    public ArrayList<FilterUserPresetRepresentation> getAllUserPresets() {
130fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        ArrayList<FilterUserPresetRepresentation> ret =
131fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard                new ArrayList<FilterUserPresetRepresentation>();
132fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard
133fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        Cursor c = null;
134fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        database.beginTransaction();
135fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        try {
136fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard            c = database.query(FilterStack.TABLE,
137fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard                    new String[] { FilterStack._ID,
138fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard                            FilterStack.STACK_ID,
139fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard                            FilterStack.FILTER_STACK },
140fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard                    null, null, null, null, null, null);
141fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard            if (c != null) {
142fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard                boolean loopCheck = c.moveToFirst();
143fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard                while (loopCheck) {
144fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard                    int id = c.getInt(0);
145fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard                    String name = (c.isNull(1)) ?  null : c.getString(1);
146fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard                    byte[] b = (c.isNull(2)) ? null : c.getBlob(2);
147fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard                    String json = new String(b);
148fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard
149fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard                    ImagePreset preset = new ImagePreset();
150fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard                    preset.readJsonFromString(json);
151fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard                    FilterUserPresetRepresentation representation =
152fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard                            new FilterUserPresetRepresentation(name, preset, id);
153fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard                    ret.add(representation);
154fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard                    loopCheck = c.moveToNext();
155fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard                }
156fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard            }
157fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard            database.setTransactionSuccessful();
158fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        } finally {
159fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard            if (c != null) {
160fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard                c.close();
161fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard            }
162fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard            database.endTransaction();
163fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        }
164fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard
165fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        return ret;
166fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard    }
167fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard
16855fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk    public List<Pair<String, byte[]>> getAllStacks() {
16955fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk        List<Pair<String, byte[]>> ret = new ArrayList<Pair<String, byte[]>>();
17055fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk        Cursor c = null;
17155fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk        database.beginTransaction();
17255fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk        try {
17355fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk            c = database.query(FilterStack.TABLE,
17455fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk                    new String[] { FilterStack.STACK_ID, FilterStack.FILTER_STACK },
17555fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk                    null, null, null, null, null, null);
17655fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk            if (c != null) {
17755fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk                boolean loopCheck = c.moveToFirst();
17855fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk                while (loopCheck) {
17955fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk                    String name = (c.isNull(0)) ?  null : c.getString(0);
18055fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk                    byte[] b = (c.isNull(1)) ? null : c.getBlob(1);
18155fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk                    ret.add(new Pair<String, byte[]>(name, b));
18255fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk                    loopCheck = c.moveToNext();
18355fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk                }
18455fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk            }
18555fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk            database.setTransactionSuccessful();
18655fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk        } finally {
18755fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk            if (c != null) {
18855fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk                c.close();
18955fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk            }
19055fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk            database.endTransaction();
19155fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk        }
19255fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk        if (ret.size() <= 0) {
19355fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk            return null;
19455fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk        }
19555fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk        return ret;
19655fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk    }
19755fccf8e63d3eb50800f81ca1211b2205fe15060Ruben Brunk}
198