/* HVCStorage Copyright (c) 2016 NTT DOCOMO,INC. Released under the MIT license http://opensource.org/licenses/mit-license.php */ package org.deviceconnect.android.deviceplugin.hvcc2w.manager; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.provider.BaseColumns; import org.deviceconnect.android.deviceplugin.hvcc2w.manager.data.FaceRecognitionDataModel; import org.deviceconnect.android.deviceplugin.hvcc2w.manager.data.FaceRecognitionObject; import org.deviceconnect.android.deviceplugin.hvcc2w.manager.data.UserDataModel; import org.deviceconnect.android.deviceplugin.hvcc2w.manager.data.UserDataObject; import java.util.ArrayList; import java.util.List; /** * HVC Storage. * @author NTT DOCOMO, INC. */ public enum HVCStorage { /** * Singleton instance. */ INSTANCE; /** * DB Name. */ private static final String DB_NAME = "hvc_c2w_deviceconnect.db"; /** * DB Version. */ private static final int DB_VERSION = 1; /** * User Data Table. */ private static final String USER_DATA_TBL_NAME = "user_data_tbl"; /** * Face Recognition Table. */ private static final String FACE_RECOGNITION_TBL_NAME = "face_recognition_tbl"; /** * User Data param: {@value} . */ private static final String USER_EMAIL = "email"; /** * User Data param: {@value}. */ private static final String USER_PASSWORD = "password"; /** * User Data Param: {@value}. */ private static final String USER_ACCESS_TOKEN = "access_token"; /** * Face Recognition Param: {@value}. */ private static final String FACE_RECOGNITION_NAME = "name"; /** * Face Recognition Param: {@value}. */ private static final String FACE_RECOGNITION_SERVICE_ID = "service_id"; /** * Face Recognition Param: {@value}. */ private static final String FACE_RECOGNITION_USER_ID = "user_id"; /** * Face Recognition Param: {@value}. */ private static final String FACE_RECOGNITION_DATA_ID = "data_id"; /** * DB Helper. */ private HVCDBHelper mHVCDBHelper; /** * Constructor. */ private HVCStorage() { } /** * Initialize. * * @param context Context。 */ public void init(final Context context) { mHVCDBHelper = new HVCDBHelper(context); } /** * Register HVC User Data. * @param object User Data Object * @return Success or failure */ public synchronized long registerUserData(final UserDataObject object) { ContentValues values = makeUserDataContentValue(object); SQLiteDatabase db = mHVCDBHelper.getWritableDatabase(); long result = -1; try { result = db.insert(USER_DATA_TBL_NAME, null, values); } finally { db.close(); return result; } } /** * Register Face Recognition Data. * @param object Face Recognition Data Object * @return Success or failure */ public synchronized long registerFaceRecognitionData(final FaceRecognitionObject object) { ContentValues values = makeFaceRecognitionDataContentValue(object); SQLiteDatabase db = mHVCDBHelper.getWritableDatabase(); long result = -1; try { result = db.insert(FACE_RECOGNITION_TBL_NAME, null, values); } finally { db.close(); return result; } } /** * Remove HVC User Data Object. * @param email User Data Address * @return Success or failure */ public synchronized long removeUserData(final String email) { String whereClause = USER_EMAIL + "=?"; String[] whereArgs = { email }; SQLiteDatabase db = mHVCDBHelper.getWritableDatabase(); int isDelete = -1; try { isDelete = db.delete(USER_DATA_TBL_NAME, whereClause, whereArgs); } finally { db.close(); return isDelete; } } /** * Remove Face Recognition Object. * @param name Face Recognition name * @return Success or failure */ public synchronized long removeFaceRecognitionData(final String name) { String whereClause = FACE_RECOGNITION_NAME + "=?"; String[] whereArgs = { name }; SQLiteDatabase db = mHVCDBHelper.getWritableDatabase(); int isDelete = -1; try { isDelete = db.delete(FACE_RECOGNITION_TBL_NAME, whereClause, whereArgs); } finally { db.close(); return isDelete; } } /** * Get User Data List. * @return UserDataList */ public synchronized List<UserDataObject> getUserDatas(final String email) { String sql = "SELECT * FROM " + USER_DATA_TBL_NAME; if (email != null) { sql += " WHERE " + USER_EMAIL + "='" + email + "' "; } String[] selectionArgs = {}; SQLiteDatabase db = null; List<UserDataObject> objects = new ArrayList<UserDataObject>(); try { db = mHVCDBHelper.getReadableDatabase(); Cursor cursor = db.rawQuery(sql, selectionArgs); boolean next = cursor.moveToFirst(); while (next) { String emailAddress = cursor.getString(cursor.getColumnIndex(USER_EMAIL)); String password = cursor.getString(cursor.getColumnIndex(USER_PASSWORD)); String accessToken = cursor.getString(cursor.getColumnIndex(USER_ACCESS_TOKEN)); UserDataObject object = new UserDataModel(emailAddress, password, accessToken); objects.add(object); next = cursor.moveToNext(); } } finally { db.close(); } return objects; } /** * Get Face Recognition Data List. * @return Face Recognition Data List */ public synchronized List<FaceRecognitionObject> getFaceRecognitionDatas(final String name) { String sql = "SELECT * FROM " + FACE_RECOGNITION_TBL_NAME; if (name != null) { sql += " WHERE " + FACE_RECOGNITION_NAME + "='" + name + "' "; } sql += " ORDER BY " + FACE_RECOGNITION_USER_ID + " ASC;"; String[] selectionArgs = {}; SQLiteDatabase db = null; List<FaceRecognitionObject> objects = new ArrayList<FaceRecognitionObject>(); try { db = mHVCDBHelper.getReadableDatabase(); Cursor cursor = db.rawQuery(sql, selectionArgs); boolean next = cursor.moveToFirst(); while (next) { String n = cursor.getString(cursor.getColumnIndex(FACE_RECOGNITION_NAME)); String deviceId = cursor.getString(cursor.getColumnIndex(FACE_RECOGNITION_SERVICE_ID)); int userId = cursor.getInt(cursor.getColumnIndex(FACE_RECOGNITION_USER_ID)); int dataId = cursor.getInt(cursor.getColumnIndex(FACE_RECOGNITION_DATA_ID)); FaceRecognitionObject object = new FaceRecognitionDataModel(n, deviceId, userId, dataId); objects.add(object); next = cursor.moveToNext(); } } finally { db.close(); } return objects; } /** * Get Face Recognition Data List For UserId. * @param id UserId * @return Face Recognition Data List */ public synchronized List<FaceRecognitionObject> getFaceRecognitionDatasForUserId(final int id) { String sql = "SELECT * FROM " + FACE_RECOGNITION_TBL_NAME; if (id > -1) { sql += " WHERE " + FACE_RECOGNITION_USER_ID + "=" + id + ""; } sql += " ORDER BY " + FACE_RECOGNITION_USER_ID + " ASC;"; String[] selectionArgs = {}; SQLiteDatabase db = null; List<FaceRecognitionObject> objects = new ArrayList<FaceRecognitionObject>(); try { db = mHVCDBHelper.getReadableDatabase(); Cursor cursor = db.rawQuery(sql, selectionArgs); boolean next = cursor.moveToFirst(); while (next) { String n = cursor.getString(cursor.getColumnIndex(FACE_RECOGNITION_NAME)); String deviceId = cursor.getString(cursor.getColumnIndex(FACE_RECOGNITION_SERVICE_ID)); int userId = cursor.getInt(cursor.getColumnIndex(FACE_RECOGNITION_USER_ID)); int dataId = cursor.getInt(cursor.getColumnIndex(FACE_RECOGNITION_DATA_ID)); FaceRecognitionObject object = new FaceRecognitionDataModel(n, deviceId, userId, dataId); objects.add(object); next = cursor.moveToNext(); } } finally { db.close(); } return objects; } /** * Get Face Recognition Data List For UserId. * @param id UserId * @return Face Recognition Data List */ public synchronized List<FaceRecognitionObject> getFaceRecognitionDatasForDeviceId(final String id) { String sql = "SELECT * FROM " + FACE_RECOGNITION_TBL_NAME; if (id != null) { sql += " WHERE " + FACE_RECOGNITION_SERVICE_ID + "='" + id + "'"; } sql += " ORDER BY " + FACE_RECOGNITION_USER_ID + " ASC;"; String[] selectionArgs = {}; SQLiteDatabase db = null; List<FaceRecognitionObject> objects = new ArrayList<FaceRecognitionObject>(); try { db = mHVCDBHelper.getReadableDatabase(); Cursor cursor = db.rawQuery(sql, selectionArgs); boolean next = cursor.moveToFirst(); while (next) { String n = cursor.getString(cursor.getColumnIndex(FACE_RECOGNITION_NAME)); String deviceId = cursor.getString(cursor.getColumnIndex(FACE_RECOGNITION_SERVICE_ID)); int userId = cursor.getInt(cursor.getColumnIndex(FACE_RECOGNITION_USER_ID)); int dataId = cursor.getInt(cursor.getColumnIndex(FACE_RECOGNITION_DATA_ID)); FaceRecognitionObject object = new FaceRecognitionDataModel(n, deviceId, userId, dataId); objects.add(object); next = cursor.moveToNext(); } } finally { db.close(); } return objects; } /** Make User Data Content Value. */ private ContentValues makeUserDataContentValue(final UserDataObject object) { ContentValues values = new ContentValues(); values.put(USER_EMAIL, object.getEmail()); values.put(USER_PASSWORD, object.getPassword()); values.put(USER_ACCESS_TOKEN, object.getAccessToken()); return values; } /** Make Face Recognition Data Content Value. */ private ContentValues makeFaceRecognitionDataContentValue(final FaceRecognitionObject object) { ContentValues values = new ContentValues(); values.put(FACE_RECOGNITION_NAME, object.getName()); values.put(FACE_RECOGNITION_SERVICE_ID, object.getDeviceId()); values.put(FACE_RECOGNITION_USER_ID, object.getUserId()); values.put(FACE_RECOGNITION_DATA_ID, object.getDataId()); return values; } /** * DB Helper to store the HVC storage */ private class HVCDBHelper extends SQLiteOpenHelper { /** * Constructor. * @param context application context */ public HVCDBHelper(Context context) { super(context, DB_NAME, null, DB_VERSION); } @Override public void onCreate(final SQLiteDatabase db) { createDB(db); } @Override public void onUpgrade(final SQLiteDatabase db, final int oldVersion, final int newVersion) { db.execSQL("DROP TABLE IF EXISTS " + USER_DATA_TBL_NAME); db.execSQL("DROP TABLE IF EXISTS " + FACE_RECOGNITION_TBL_NAME); createDB(db); } /** * DB to store the HVC storage * @param db DB */ private void createDB(final SQLiteDatabase db) { String userdataSQL = "CREATE TABLE " + USER_DATA_TBL_NAME + " (" + BaseColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + USER_EMAIL + " TEXT NOT NULL," + USER_PASSWORD + " TEXT," + USER_ACCESS_TOKEN + " TEXT" + ");"; db.execSQL(userdataSQL); String faceRecognitionSQL = "CREATE TABLE " + FACE_RECOGNITION_TBL_NAME + " (" + FACE_RECOGNITION_NAME + " TEXT NOT NULL PRIMARY KEY," + FACE_RECOGNITION_SERVICE_ID + " TEXT," + FACE_RECOGNITION_USER_ID + " INTEGER," + FACE_RECOGNITION_DATA_ID + " INTEGER" + ");"; db.execSQL(faceRecognitionSQL); } } }