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