From bf7e9984febec31bcd778adf626954412630489b Mon Sep 17 00:00:00 2001 From: amitshekhariitbhu Date: Sun, 20 Jan 2019 00:52:58 +0530 Subject: [PATCH 01/13] Add dbFactory --- debug-db-base/build.gradle | 1 - .../main/java/com/amitshekhar/DebugDB.java | 5 +- .../com/amitshekhar/server/ClientServer.java | 7 ++- .../amitshekhar/server/RequestHandler.java | 11 ++-- .../com/amitshekhar/sqlite/DBFactory.java | 9 +++ debug-db-encrypt/build.gradle | 1 + .../encrypt/DebugDBEncryptInitProvider.java | 3 +- .../encrypt/sqlite/DebugDBEncryptFactory.java | 18 ++++++ .../encrypt/sqlite/DebugEncryptSQLiteDB.java | 62 +++++++++++++++++++ .../debug/DebugDBInitProvider.java | 3 +- .../debug/sqlite/DebugDBFactory.java | 16 +++++ .../debug}/sqlite/DebugSQLiteDB.java | 9 +-- 12 files changed, 125 insertions(+), 20 deletions(-) create mode 100644 debug-db-base/src/main/java/com/amitshekhar/sqlite/DBFactory.java create mode 100644 debug-db-encrypt/src/main/java/com/amitshekhar/debug/encrypt/sqlite/DebugDBEncryptFactory.java create mode 100644 debug-db-encrypt/src/main/java/com/amitshekhar/debug/encrypt/sqlite/DebugEncryptSQLiteDB.java create mode 100644 debug-db/src/main/java/com/amitshekhar/debug/sqlite/DebugDBFactory.java rename {debug-db-base/src/main/java/com/amitshekhar => debug-db/src/main/java/com/amitshekhar/debug}/sqlite/DebugSQLiteDB.java (91%) diff --git a/debug-db-base/build.gradle b/debug-db-base/build.gradle index 48b8e85..c8dd52f 100644 --- a/debug-db-base/build.gradle +++ b/debug-db-base/build.gradle @@ -39,7 +39,6 @@ android { dependencies { implementation 'com.google.code.gson:gson:2.8.5' - implementation 'net.zetetic:android-database-sqlcipher:3.5.9' implementation 'android.arch.persistence.room:runtime:1.1.1' implementation 'com.android.support:appcompat-v7:28.0.0' testImplementation 'junit:junit:4.12' diff --git a/debug-db-base/src/main/java/com/amitshekhar/DebugDB.java b/debug-db-base/src/main/java/com/amitshekhar/DebugDB.java index 66a8f64..d891525 100644 --- a/debug-db-base/src/main/java/com/amitshekhar/DebugDB.java +++ b/debug-db-base/src/main/java/com/amitshekhar/DebugDB.java @@ -25,6 +25,7 @@ import android.util.Pair; import com.amitshekhar.server.ClientServer; +import com.amitshekhar.sqlite.DBFactory; import com.amitshekhar.utils.NetworkUtils; import java.io.File; @@ -45,7 +46,7 @@ private DebugDB() { // This class in not publicly instantiable } - public static void initialize(Context context) { + public static void initialize(Context context, DBFactory dbFactory) { int portNumber; try { @@ -56,7 +57,7 @@ public static void initialize(Context context) { Log.i(TAG, "Using Default port : " + DEFAULT_PORT); } - clientServer = new ClientServer(context, portNumber); + clientServer = new ClientServer(context, portNumber, dbFactory); clientServer.start(); addressLog = NetworkUtils.getAddressLog(context, portNumber); Log.d(TAG, addressLog); diff --git a/debug-db-base/src/main/java/com/amitshekhar/server/ClientServer.java b/debug-db-base/src/main/java/com/amitshekhar/server/ClientServer.java index ded3f4e..151307d 100644 --- a/debug-db-base/src/main/java/com/amitshekhar/server/ClientServer.java +++ b/debug-db-base/src/main/java/com/amitshekhar/server/ClientServer.java @@ -23,12 +23,13 @@ * Created by amitshekhar on 15/11/16. */ - import android.arch.persistence.db.SupportSQLiteDatabase; import android.content.Context; import android.util.Log; import android.util.Pair; +import com.amitshekhar.sqlite.DBFactory; + import java.io.File; import java.io.IOException; import java.net.ServerSocket; @@ -45,8 +46,8 @@ public class ClientServer implements Runnable { private boolean mIsRunning; private ServerSocket mServerSocket; - public ClientServer(Context context, int port) { - mRequestHandler = new RequestHandler(context); + public ClientServer(Context context, int port, DBFactory dbFactory) { + mRequestHandler = new RequestHandler(context, dbFactory); mPort = port; } diff --git a/debug-db-base/src/main/java/com/amitshekhar/server/RequestHandler.java b/debug-db-base/src/main/java/com/amitshekhar/server/RequestHandler.java index 1285ab4..709a19c 100644 --- a/debug-db-base/src/main/java/com/amitshekhar/server/RequestHandler.java +++ b/debug-db-base/src/main/java/com/amitshekhar/server/RequestHandler.java @@ -30,7 +30,7 @@ import com.amitshekhar.model.RowDataRequest; import com.amitshekhar.model.TableDataResponse; import com.amitshekhar.model.UpdateRowResponse; -import com.amitshekhar.sqlite.DebugSQLiteDB; +import com.amitshekhar.sqlite.DBFactory; import com.amitshekhar.sqlite.InMemoryDebugSQLiteDB; import com.amitshekhar.sqlite.SQLiteDB; import com.amitshekhar.utils.Constants; @@ -42,8 +42,6 @@ import com.google.gson.GsonBuilder; import com.google.gson.reflect.TypeToken; -import net.sqlcipher.database.SQLiteDatabase; - import java.io.BufferedReader; import java.io.File; import java.io.IOException; @@ -63,6 +61,7 @@ public class RequestHandler { private final Context mContext; private final Gson mGson; private final AssetManager mAssets; + private final DBFactory mDbFactory; private boolean isDbOpened; private SQLiteDB sqLiteDB; private HashMap> mDatabaseFiles; @@ -70,10 +69,11 @@ public class RequestHandler { private String mSelectedDatabase = null; private HashMap mRoomInMemoryDatabases = new HashMap<>(); - public RequestHandler(Context context) { + public RequestHandler(Context context, DBFactory dbFactory) { mContext = context; mAssets = context.getResources().getAssets(); mGson = new GsonBuilder().serializeNulls().create(); + mDbFactory = dbFactory; } public void handle(Socket socket) throws IOException { @@ -184,8 +184,7 @@ private void openDatabase(String database) { } else { File databaseFile = mDatabaseFiles.get(database).first; String password = mDatabaseFiles.get(database).second; - SQLiteDatabase.loadLibs(mContext); - sqLiteDB = new DebugSQLiteDB(SQLiteDatabase.openOrCreateDatabase(databaseFile.getAbsolutePath(), password, null)); + sqLiteDB = mDbFactory.create(mContext, databaseFile.getAbsolutePath(), password); } isDbOpened = true; } diff --git a/debug-db-base/src/main/java/com/amitshekhar/sqlite/DBFactory.java b/debug-db-base/src/main/java/com/amitshekhar/sqlite/DBFactory.java new file mode 100644 index 0000000..0378184 --- /dev/null +++ b/debug-db-base/src/main/java/com/amitshekhar/sqlite/DBFactory.java @@ -0,0 +1,9 @@ +package com.amitshekhar.sqlite; + +import android.content.Context; + +public interface DBFactory { + + SQLiteDB create(Context context, String path, String password); + +} diff --git a/debug-db-encrypt/build.gradle b/debug-db-encrypt/build.gradle index d76d484..b68fd8b 100644 --- a/debug-db-encrypt/build.gradle +++ b/debug-db-encrypt/build.gradle @@ -19,6 +19,7 @@ android { dependencies { implementation project(':debug-db-base') + implementation 'net.zetetic:android-database-sqlcipher:3.5.9' testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' diff --git a/debug-db-encrypt/src/main/java/com/amitshekhar/debug/encrypt/DebugDBEncryptInitProvider.java b/debug-db-encrypt/src/main/java/com/amitshekhar/debug/encrypt/DebugDBEncryptInitProvider.java index e3c5d68..9403b4f 100644 --- a/debug-db-encrypt/src/main/java/com/amitshekhar/debug/encrypt/DebugDBEncryptInitProvider.java +++ b/debug-db-encrypt/src/main/java/com/amitshekhar/debug/encrypt/DebugDBEncryptInitProvider.java @@ -8,6 +8,7 @@ import android.net.Uri; import com.amitshekhar.DebugDB; +import com.amitshekhar.debug.encrypt.sqlite.DebugDBEncryptFactory; public class DebugDBEncryptInitProvider extends ContentProvider { @@ -17,7 +18,7 @@ public DebugDBEncryptInitProvider() { @Override public boolean onCreate() { - DebugDB.initialize(getContext()); + DebugDB.initialize(getContext(), new DebugDBEncryptFactory()); return true; } diff --git a/debug-db-encrypt/src/main/java/com/amitshekhar/debug/encrypt/sqlite/DebugDBEncryptFactory.java b/debug-db-encrypt/src/main/java/com/amitshekhar/debug/encrypt/sqlite/DebugDBEncryptFactory.java new file mode 100644 index 0000000..af0294a --- /dev/null +++ b/debug-db-encrypt/src/main/java/com/amitshekhar/debug/encrypt/sqlite/DebugDBEncryptFactory.java @@ -0,0 +1,18 @@ +package com.amitshekhar.debug.encrypt.sqlite; + +import android.content.Context; + +import com.amitshekhar.sqlite.DBFactory; +import com.amitshekhar.sqlite.SQLiteDB; + +import net.sqlcipher.database.SQLiteDatabase; + +public class DebugDBEncryptFactory implements DBFactory { + + @Override + public SQLiteDB create(Context context, String path, String password) { + SQLiteDatabase.loadLibs(context); + return new DebugEncryptSQLiteDB(SQLiteDatabase.openOrCreateDatabase(path, password, null)); + } + +} diff --git a/debug-db-encrypt/src/main/java/com/amitshekhar/debug/encrypt/sqlite/DebugEncryptSQLiteDB.java b/debug-db-encrypt/src/main/java/com/amitshekhar/debug/encrypt/sqlite/DebugEncryptSQLiteDB.java new file mode 100644 index 0000000..5c387cb --- /dev/null +++ b/debug-db-encrypt/src/main/java/com/amitshekhar/debug/encrypt/sqlite/DebugEncryptSQLiteDB.java @@ -0,0 +1,62 @@ +package com.amitshekhar.debug.encrypt.sqlite; + +import android.content.ContentValues; +import android.database.Cursor; +import android.database.SQLException; + +import com.amitshekhar.sqlite.SQLiteDB; + +import net.sqlcipher.database.SQLiteDatabase; + +/** + * Created by anandgaurav on 12/02/18. + */ + +public class DebugEncryptSQLiteDB implements SQLiteDB { + + private final SQLiteDatabase database; + + public DebugEncryptSQLiteDB(SQLiteDatabase database) { + this.database = database; + } + + @Override + public int delete(String table, String whereClause, String[] whereArgs) { + return database.delete(table, whereClause, whereArgs); + } + + @Override + public boolean isOpen() { + return database.isOpen(); + } + + @Override + public void close() { + database.close(); + } + + @Override + public Cursor rawQuery(String sql, String[] selectionArgs) { + return database.rawQuery(sql, selectionArgs); + } + + @Override + public void execSQL(String sql) throws SQLException { + database.execSQL(sql); + } + + @Override + public long insert(String table, String nullColumnHack, ContentValues values) { + return database.insert(table, nullColumnHack, values); + } + + @Override + public int update(String table, ContentValues values, String whereClause, String[] whereArgs) { + return database.update(table, values, whereClause, whereArgs); + } + + @Override + public int getVersion() { + return database.getVersion(); + } +} diff --git a/debug-db/src/main/java/com/amitshekhar/debug/DebugDBInitProvider.java b/debug-db/src/main/java/com/amitshekhar/debug/DebugDBInitProvider.java index 6cea096..d9d88c1 100644 --- a/debug-db/src/main/java/com/amitshekhar/debug/DebugDBInitProvider.java +++ b/debug-db/src/main/java/com/amitshekhar/debug/DebugDBInitProvider.java @@ -27,6 +27,7 @@ import android.net.Uri; import com.amitshekhar.DebugDB; +import com.amitshekhar.debug.sqlite.DebugDBFactory; /** * Created by amitshekhar on 16/11/16. @@ -40,7 +41,7 @@ public DebugDBInitProvider() { @Override public boolean onCreate() { - DebugDB.initialize(getContext()); + DebugDB.initialize(getContext(), new DebugDBFactory()); return true; } diff --git a/debug-db/src/main/java/com/amitshekhar/debug/sqlite/DebugDBFactory.java b/debug-db/src/main/java/com/amitshekhar/debug/sqlite/DebugDBFactory.java new file mode 100644 index 0000000..3a797f5 --- /dev/null +++ b/debug-db/src/main/java/com/amitshekhar/debug/sqlite/DebugDBFactory.java @@ -0,0 +1,16 @@ +package com.amitshekhar.debug.sqlite; + +import android.content.Context; +import android.database.sqlite.SQLiteDatabase; + +import com.amitshekhar.sqlite.DBFactory; +import com.amitshekhar.sqlite.SQLiteDB; + +public class DebugDBFactory implements DBFactory { + + @Override + public SQLiteDB create(Context context, String path, String password) { + return new DebugSQLiteDB(SQLiteDatabase.openOrCreateDatabase(path, null)); + } + +} diff --git a/debug-db-base/src/main/java/com/amitshekhar/sqlite/DebugSQLiteDB.java b/debug-db/src/main/java/com/amitshekhar/debug/sqlite/DebugSQLiteDB.java similarity index 91% rename from debug-db-base/src/main/java/com/amitshekhar/sqlite/DebugSQLiteDB.java rename to debug-db/src/main/java/com/amitshekhar/debug/sqlite/DebugSQLiteDB.java index 385934d..fa6512c 100644 --- a/debug-db-base/src/main/java/com/amitshekhar/sqlite/DebugSQLiteDB.java +++ b/debug-db/src/main/java/com/amitshekhar/debug/sqlite/DebugSQLiteDB.java @@ -1,14 +1,11 @@ -package com.amitshekhar.sqlite; +package com.amitshekhar.debug.sqlite; import android.content.ContentValues; import android.database.Cursor; import android.database.SQLException; +import android.database.sqlite.SQLiteDatabase; -import net.sqlcipher.database.SQLiteDatabase; - -/** - * Created by anandgaurav on 12/02/18. - */ +import com.amitshekhar.sqlite.SQLiteDB; public class DebugSQLiteDB implements SQLiteDB { From 9b8b504ab500a75ca2ad137992e5eb4f83b2e91f Mon Sep 17 00:00:00 2001 From: amitshekhariitbhu Date: Sun, 20 Jan 2019 01:10:35 +0530 Subject: [PATCH 02/13] Remove support lib --- app/build.gradle | 2 +- debug-db-base/build.gradle | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 43c3bc7..fbc380c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -42,7 +42,7 @@ android { } dependencies { - debugImplementation project(':debug-db') + debugImplementation project(':debug-db-encrypt') implementation 'com.android.support:appcompat-v7:28.0.0' implementation 'net.zetetic:android-database-sqlcipher:3.5.9' implementation 'android.arch.persistence.room:runtime:1.1.1' diff --git a/debug-db-base/build.gradle b/debug-db-base/build.gradle index c8dd52f..157e8bb 100644 --- a/debug-db-base/build.gradle +++ b/debug-db-base/build.gradle @@ -40,7 +40,6 @@ android { dependencies { implementation 'com.google.code.gson:gson:2.8.5' implementation 'android.arch.persistence.room:runtime:1.1.1' - implementation 'com.android.support:appcompat-v7:28.0.0' testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' From 7f0204eeadaff759829cb66fec5ebb81706080f2 Mon Sep 17 00:00:00 2001 From: amitshekhariitbhu Date: Sun, 20 Jan 2019 01:21:51 +0530 Subject: [PATCH 03/13] Add upload gradle for all --- debug-db-base/build.gradle | 2 +- debug-db-base/debug-db-base-upload.gradle | 103 ++++++++++++++++++ debug-db-encrypt/build.gradle | 2 + .../debug-db-encrypt-upload.gradle | 103 ++++++++++++++++++ debug-db/build.gradle | 2 + .../debug-db-upload.gradle | 0 6 files changed, 211 insertions(+), 1 deletion(-) create mode 100755 debug-db-base/debug-db-base-upload.gradle create mode 100755 debug-db-encrypt/debug-db-encrypt-upload.gradle rename {debug-db-base => debug-db}/debug-db-upload.gradle (100%) diff --git a/debug-db-base/build.gradle b/debug-db-base/build.gradle index 157e8bb..db2510f 100644 --- a/debug-db-base/build.gradle +++ b/debug-db-base/build.gradle @@ -45,4 +45,4 @@ dependencies { androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' } -//apply from: 'debug-db-upload.gradle' +//apply from: 'debug-db-base-upload.gradle' diff --git a/debug-db-base/debug-db-base-upload.gradle b/debug-db-base/debug-db-base-upload.gradle new file mode 100755 index 0000000..931b5bd --- /dev/null +++ b/debug-db-base/debug-db-base-upload.gradle @@ -0,0 +1,103 @@ +/* + * + * * Copyright (C) 2019 Amit Shekhar + * * Copyright (C) 2011 Android Open Source Project + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * + */ + +apply plugin: 'com.github.dcendents.android-maven' +apply plugin: "com.jfrog.bintray" + +def siteUrl = 'https://github.com/amitshekhariitbhu/Android-Debug-Database' +def gitUrl = 'https://github.com/amitshekhariitbhu/Android-Debug-Database.git' + +group = "com.amitshekhar.android" +version = '1.0.4' + +install { + repositories.mavenInstaller { + pom.project { + packaging 'aar' + + name 'Android Debug Database' + description 'Android Debug Database is a powerful library for debugging databases in Android applications' + + url siteUrl + + licenses { + license { + name 'The Apache Software License, Version 2.0' + url 'http://www.apache.org/licenses/LICENSE-2.0.txt' + } + } + + developers { + developer { + id 'amitshekhariitbhu' + name 'Amit Shekhar' + email 'amit.shekhar.iitbhu@gmail.com' + } + } + + scm { + connection gitUrl + developerConnection gitUrl + url siteUrl + } + } + } +} + +task sourcesJar(type: Jar) { + from android.sourceSets.main.java.srcDirs + classifier = 'sources' +} + +task javadoc(type: Javadoc) { + source = android.sourceSets.main.java.srcDirs + classpath += project.files(android.getBootClasspath().join(File.pathSeparator)) + classpath += configurations.compile +} + +task javadocJar(type: Jar, dependsOn: javadoc) { + classifier = 'javadoc' + from javadoc.destinationDir +} +artifacts { + archives javadocJar + archives sourcesJar +} + +if (project.rootProject.file("local.properties").exists()) { + Properties properties = new Properties() + properties.load(project.rootProject.file('local.properties').newDataInputStream()) + + bintray { + user = properties.getProperty("bintray.user") + key = properties.getProperty("bintray.apikey") + + configurations = ['archives'] + dryRun = false + + pkg { + repo = "maven" + name = "debug-db-base" + websiteUrl = siteUrl + vcsUrl = gitUrl + licenses = ["Apache-2.0"] + publish = true + } + } +} diff --git a/debug-db-encrypt/build.gradle b/debug-db-encrypt/build.gradle index b68fd8b..e883bc9 100644 --- a/debug-db-encrypt/build.gradle +++ b/debug-db-encrypt/build.gradle @@ -24,3 +24,5 @@ dependencies { androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' } + +//apply from: 'debug-db-encrypt-upload.gradle' \ No newline at end of file diff --git a/debug-db-encrypt/debug-db-encrypt-upload.gradle b/debug-db-encrypt/debug-db-encrypt-upload.gradle new file mode 100755 index 0000000..9ac680c --- /dev/null +++ b/debug-db-encrypt/debug-db-encrypt-upload.gradle @@ -0,0 +1,103 @@ +/* + * + * * Copyright (C) 2019 Amit Shekhar + * * Copyright (C) 2011 Android Open Source Project + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * + */ + +apply plugin: 'com.github.dcendents.android-maven' +apply plugin: "com.jfrog.bintray" + +def siteUrl = 'https://github.com/amitshekhariitbhu/Android-Debug-Database' +def gitUrl = 'https://github.com/amitshekhariitbhu/Android-Debug-Database.git' + +group = "com.amitshekhar.android" +version = '1.0.4' + +install { + repositories.mavenInstaller { + pom.project { + packaging 'aar' + + name 'Android Debug Database' + description 'Android Debug Database is a powerful library for debugging databases in Android applications' + + url siteUrl + + licenses { + license { + name 'The Apache Software License, Version 2.0' + url 'http://www.apache.org/licenses/LICENSE-2.0.txt' + } + } + + developers { + developer { + id 'amitshekhariitbhu' + name 'Amit Shekhar' + email 'amit.shekhar.iitbhu@gmail.com' + } + } + + scm { + connection gitUrl + developerConnection gitUrl + url siteUrl + } + } + } +} + +task sourcesJar(type: Jar) { + from android.sourceSets.main.java.srcDirs + classifier = 'sources' +} + +task javadoc(type: Javadoc) { + source = android.sourceSets.main.java.srcDirs + classpath += project.files(android.getBootClasspath().join(File.pathSeparator)) + classpath += configurations.compile +} + +task javadocJar(type: Jar, dependsOn: javadoc) { + classifier = 'javadoc' + from javadoc.destinationDir +} +artifacts { + archives javadocJar + archives sourcesJar +} + +if (project.rootProject.file("local.properties").exists()) { + Properties properties = new Properties() + properties.load(project.rootProject.file('local.properties').newDataInputStream()) + + bintray { + user = properties.getProperty("bintray.user") + key = properties.getProperty("bintray.apikey") + + configurations = ['archives'] + dryRun = false + + pkg { + repo = "maven" + name = "debug-db-encrypt" + websiteUrl = siteUrl + vcsUrl = gitUrl + licenses = ["Apache-2.0"] + publish = true + } + } +} diff --git a/debug-db/build.gradle b/debug-db/build.gradle index d76d484..41f9805 100644 --- a/debug-db/build.gradle +++ b/debug-db/build.gradle @@ -23,3 +23,5 @@ dependencies { androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' } + +//apply from: 'debug-db-upload.gradle' \ No newline at end of file diff --git a/debug-db-base/debug-db-upload.gradle b/debug-db/debug-db-upload.gradle similarity index 100% rename from debug-db-base/debug-db-upload.gradle rename to debug-db/debug-db-upload.gradle From 43beb2e52f510cc7f80beba0f8a48a642851d437 Mon Sep 17 00:00:00 2001 From: amitshekhariitbhu Date: Thu, 14 Feb 2019 13:18:20 +0530 Subject: [PATCH 04/13] Bump version to 1.0.5 --- README.md | 2 +- debug-db-base/debug-db-base-upload.gradle | 2 +- debug-db-encrypt/debug-db-encrypt-upload.gradle | 2 +- debug-db/debug-db-upload.gradle | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index e3cd36f..82c307d 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ Add this to your app's build.gradle ```groovy -debugImplementation 'com.amitshekhar.android:debug-db:1.0.4' +debugImplementation 'com.amitshekhar.android:debug-db:1.0.5' ``` Use `debugImplementation` so that it will only compile in your debug build and not in your release build. diff --git a/debug-db-base/debug-db-base-upload.gradle b/debug-db-base/debug-db-base-upload.gradle index 931b5bd..797abd0 100755 --- a/debug-db-base/debug-db-base-upload.gradle +++ b/debug-db-base/debug-db-base-upload.gradle @@ -24,7 +24,7 @@ def siteUrl = 'https://github.com/amitshekhariitbhu/Android-Debug-Database' def gitUrl = 'https://github.com/amitshekhariitbhu/Android-Debug-Database.git' group = "com.amitshekhar.android" -version = '1.0.4' +version = '1.0.5' install { repositories.mavenInstaller { diff --git a/debug-db-encrypt/debug-db-encrypt-upload.gradle b/debug-db-encrypt/debug-db-encrypt-upload.gradle index 9ac680c..2132ec6 100755 --- a/debug-db-encrypt/debug-db-encrypt-upload.gradle +++ b/debug-db-encrypt/debug-db-encrypt-upload.gradle @@ -24,7 +24,7 @@ def siteUrl = 'https://github.com/amitshekhariitbhu/Android-Debug-Database' def gitUrl = 'https://github.com/amitshekhariitbhu/Android-Debug-Database.git' group = "com.amitshekhar.android" -version = '1.0.4' +version = '1.0.5' install { repositories.mavenInstaller { diff --git a/debug-db/debug-db-upload.gradle b/debug-db/debug-db-upload.gradle index 9c4769a..744a524 100755 --- a/debug-db/debug-db-upload.gradle +++ b/debug-db/debug-db-upload.gradle @@ -24,7 +24,7 @@ def siteUrl = 'https://github.com/amitshekhariitbhu/Android-Debug-Database' def gitUrl = 'https://github.com/amitshekhariitbhu/Android-Debug-Database.git' group = "com.amitshekhar.android" -version = '1.0.4' +version = '1.0.5' install { repositories.mavenInstaller { From f091d61df43ef5628dbda669938c893c82b8c69c Mon Sep 17 00:00:00 2001 From: amitshekhariitbhu Date: Fri, 15 Feb 2019 19:38:34 +0530 Subject: [PATCH 05/13] Create sample-app for encrypt --- .../com/sample/database/PersonDBHelper.java | 136 -------------- sample-app-encrypt/.gitignore | 1 + sample-app-encrypt/build.gradle | 36 ++++ .../proguard-rules.pro | 0 .../encrypt/ExampleInstrumentedTest.java | 26 +++ .../src/main/AndroidManifest.xml | 21 +++ .../java/com/sample/encrypt/MainActivity.java | 13 ++ .../drawable-v24/ic_launcher_foreground.xml | 34 ++++ .../res/drawable/ic_launcher_background.xml | 170 ++++++++++++++++++ .../src/main/res/layout/activity_main.xml | 18 ++ .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 2963 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 4905 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2060 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 2783 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4490 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 6895 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 6387 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 10413 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 9128 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 15132 bytes .../src/main/res/values/colors.xml | 6 + .../src/main/res/values/dimens.xml | 0 .../src/main/res/values/strings.xml | 3 + .../src/main/res/values/styles.xml | 11 ++ .../com/sample/encrypt/ExampleUnitTest.java | 17 ++ {app => sample-app}/build.gradle | 0 sample-app/proguard-rules.pro | 21 +++ .../com/sample/ExampleInstrumentedTest.java | 0 .../src/main/AndroidManifest.xml | 0 .../main/java/com/sample/MainActivity.java | 0 .../java/com/sample/database/CarDBHelper.java | 0 .../com/sample/database/ContactDBHelper.java | 0 .../com/sample/database/ExtTestDBHelper.java | 0 .../com/sample/database/room/AppDatabase.java | 0 .../java/com/sample/database/room/User.java | 0 .../sample/database/room/UserDBHelper.java | 0 .../com/sample/database/room/UserDao.java | 0 .../src/main/java/com/sample/utils/Utils.java | 0 .../src/main/res/layout/activity_main.xml | 0 .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin .../src/main/res/values-w820dp/dimens.xml | 0 .../src/main/res/values/colors.xml | 0 sample-app/src/main/res/values/dimens.xml | 24 +++ .../src/main/res/values/strings.xml | 0 .../src/main/res/values/styles.xml | 0 .../test/java/com/sample/ExampleUnitTest.java | 0 52 files changed, 411 insertions(+), 136 deletions(-) delete mode 100644 app/src/main/java/com/sample/database/PersonDBHelper.java create mode 100644 sample-app-encrypt/.gitignore create mode 100644 sample-app-encrypt/build.gradle rename {app => sample-app-encrypt}/proguard-rules.pro (100%) create mode 100644 sample-app-encrypt/src/androidTest/java/com/sample/encrypt/ExampleInstrumentedTest.java create mode 100644 sample-app-encrypt/src/main/AndroidManifest.xml create mode 100644 sample-app-encrypt/src/main/java/com/sample/encrypt/MainActivity.java create mode 100644 sample-app-encrypt/src/main/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 sample-app-encrypt/src/main/res/drawable/ic_launcher_background.xml create mode 100644 sample-app-encrypt/src/main/res/layout/activity_main.xml create mode 100644 sample-app-encrypt/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 sample-app-encrypt/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 sample-app-encrypt/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 sample-app-encrypt/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 sample-app-encrypt/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 sample-app-encrypt/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 sample-app-encrypt/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 sample-app-encrypt/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 sample-app-encrypt/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 sample-app-encrypt/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 sample-app-encrypt/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 sample-app-encrypt/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 sample-app-encrypt/src/main/res/values/colors.xml rename {app => sample-app-encrypt}/src/main/res/values/dimens.xml (100%) create mode 100644 sample-app-encrypt/src/main/res/values/strings.xml create mode 100644 sample-app-encrypt/src/main/res/values/styles.xml create mode 100644 sample-app-encrypt/src/test/java/com/sample/encrypt/ExampleUnitTest.java rename {app => sample-app}/build.gradle (100%) create mode 100644 sample-app/proguard-rules.pro rename {app => sample-app}/src/androidTest/java/com/sample/ExampleInstrumentedTest.java (100%) rename {app => sample-app}/src/main/AndroidManifest.xml (100%) rename {app => sample-app}/src/main/java/com/sample/MainActivity.java (100%) rename {app => sample-app}/src/main/java/com/sample/database/CarDBHelper.java (100%) rename {app => sample-app}/src/main/java/com/sample/database/ContactDBHelper.java (100%) rename {app => sample-app}/src/main/java/com/sample/database/ExtTestDBHelper.java (100%) rename {app => sample-app}/src/main/java/com/sample/database/room/AppDatabase.java (100%) rename {app => sample-app}/src/main/java/com/sample/database/room/User.java (100%) rename {app => sample-app}/src/main/java/com/sample/database/room/UserDBHelper.java (100%) rename {app => sample-app}/src/main/java/com/sample/database/room/UserDao.java (100%) rename {app => sample-app}/src/main/java/com/sample/utils/Utils.java (100%) rename {app => sample-app}/src/main/res/layout/activity_main.xml (100%) rename {app => sample-app}/src/main/res/mipmap-hdpi/ic_launcher.png (100%) rename {app => sample-app}/src/main/res/mipmap-mdpi/ic_launcher.png (100%) rename {app => sample-app}/src/main/res/mipmap-xhdpi/ic_launcher.png (100%) rename {app => sample-app}/src/main/res/mipmap-xxhdpi/ic_launcher.png (100%) rename {app => sample-app}/src/main/res/mipmap-xxxhdpi/ic_launcher.png (100%) rename {app => sample-app}/src/main/res/values-w820dp/dimens.xml (100%) rename {app => sample-app}/src/main/res/values/colors.xml (100%) create mode 100644 sample-app/src/main/res/values/dimens.xml rename {app => sample-app}/src/main/res/values/strings.xml (100%) rename {app => sample-app}/src/main/res/values/styles.xml (100%) rename {app => sample-app}/src/test/java/com/sample/ExampleUnitTest.java (100%) diff --git a/app/src/main/java/com/sample/database/PersonDBHelper.java b/app/src/main/java/com/sample/database/PersonDBHelper.java deleted file mode 100644 index 7af93ff..0000000 --- a/app/src/main/java/com/sample/database/PersonDBHelper.java +++ /dev/null @@ -1,136 +0,0 @@ -/* - * - * * Copyright (C) 2019 Amit Shekhar - * * Copyright (C) 2011 Android Open Source Project - * * - * * Licensed under the Apache License, Version 2.0 (the "License"); - * * you may not use this file except in compliance with the License. - * * You may obtain a copy of the License at - * * - * * http://www.apache.org/licenses/LICENSE-2.0 - * * - * * Unless required by applicable law or agreed to in writing, software - * * distributed under the License is distributed on an "AS IS" BASIS, - * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * * See the License for the specific language governing permissions and - * * limitations under the License. - * - */ - -package com.sample.database; - -import android.content.ContentValues; -import android.content.Context; -import android.database.Cursor; - -import net.sqlcipher.DatabaseUtils; -import net.sqlcipher.database.SQLiteDatabase; -import net.sqlcipher.database.SQLiteOpenHelper; - -import java.util.ArrayList; - -public class PersonDBHelper extends SQLiteOpenHelper { - - public static final String DATABASE_NAME = "Person.db"; - public static final String PERSON_TABLE_NAME = "person"; - public static final String PERSON_COLUMN_ID = "id"; - public static final String PERSON_COLUMN_FIRST_NAME = "first_name"; - public static final String PERSON_COLUMN_LAST_NAME = "last_name"; - public static final String PERSON_COLUMN_ADDRESS = "address"; - private static final String DB_PASSWORD = "a_password"; - - public PersonDBHelper(Context context) { - - super(context, DATABASE_NAME, null, 1); - SQLiteDatabase.loadLibs(context); - } - - @Override - public void onCreate(SQLiteDatabase db) { - db.execSQL( - "create table person " + - "(id integer primary key, first_name text, last_name text, address text)" - ); - } - - @Override - public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { - db.execSQL("DROP TABLE IF EXISTS person"); - onCreate(db); - } - - public boolean insertPerson(String firstName, String lastName, String address) { - SQLiteDatabase db = this.getWritableDatabase(DB_PASSWORD); - ContentValues contentValues = new ContentValues(); - contentValues.put("first_name", firstName); - contentValues.put("last_name", lastName); - contentValues.put("address", address); - db.insert("person", null, contentValues); - db.close(); - return true; - } - - public Cursor getData(int id) { - SQLiteDatabase db = this.getReadableDatabase(DB_PASSWORD); - Cursor res = db.rawQuery("select * from person where id=" + id + "", null); - return res; - } - - public int numberOfRows() { - SQLiteDatabase db = this.getReadableDatabase(DB_PASSWORD); - int numRows = (int) DatabaseUtils.queryNumEntries(db, PERSON_TABLE_NAME); - return numRows; - } - - public boolean updatePerson(Integer id, String firstName, String lastName, String address, float mileage) { - SQLiteDatabase db = this.getWritableDatabase(DB_PASSWORD); - ContentValues contentValues = new ContentValues(); - contentValues.put("first_name", firstName); - contentValues.put("last_name", lastName); - contentValues.put("address", address); - db.update("person", contentValues, "id = ? ", new String[]{Integer.toString(id)}); - db.close(); - return true; - } - - public Integer deletePerson(Integer id) { - SQLiteDatabase db = this.getWritableDatabase(DB_PASSWORD); - return db.delete("person", - "id = ? ", - new String[]{Integer.toString(id)}); - } - - public ArrayList getAllPerson() { - ArrayList arrayList = new ArrayList<>(); - - SQLiteDatabase db = this.getReadableDatabase(DB_PASSWORD); - Cursor res = db.rawQuery("select * from person", null); - res.moveToFirst(); - - while (!res.isAfterLast()) { - arrayList.add( - res.getString(res.getColumnIndex(PERSON_COLUMN_FIRST_NAME)) + " " + - res.getString(res.getColumnIndex(PERSON_COLUMN_LAST_NAME))); - res.moveToNext(); - } - res.close(); - db.close(); - return arrayList; - } - - public int count() { - SQLiteDatabase db = getReadableDatabase(DB_PASSWORD); - Cursor cursor = db.rawQuery("select * from person", null); - try { - if (cursor != null && cursor.getCount() > 0) { - cursor.moveToFirst(); - return cursor.getInt(0); - } else { - return 0; - } - } finally { - cursor.close(); - db.close(); - } - } -} diff --git a/sample-app-encrypt/.gitignore b/sample-app-encrypt/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/sample-app-encrypt/.gitignore @@ -0,0 +1 @@ +/build diff --git a/sample-app-encrypt/build.gradle b/sample-app-encrypt/build.gradle new file mode 100644 index 0000000..e7cb4f6 --- /dev/null +++ b/sample-app-encrypt/build.gradle @@ -0,0 +1,36 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 28 + + + + defaultConfig { + applicationId "com.sample.encrypt" + minSdkVersion 15 + targetSdkVersion 28 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + + implementation 'com.android.support:appcompat-v7:28.0.0' + implementation 'com.android.support.constraint:constraint-layout:1.1.3' + testImplementation 'junit:junit:4.12' + androidTestImplementation 'com.android.support.test:runner:1.0.2' + androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' +} diff --git a/app/proguard-rules.pro b/sample-app-encrypt/proguard-rules.pro similarity index 100% rename from app/proguard-rules.pro rename to sample-app-encrypt/proguard-rules.pro diff --git a/sample-app-encrypt/src/androidTest/java/com/sample/encrypt/ExampleInstrumentedTest.java b/sample-app-encrypt/src/androidTest/java/com/sample/encrypt/ExampleInstrumentedTest.java new file mode 100644 index 0000000..f9938b2 --- /dev/null +++ b/sample-app-encrypt/src/androidTest/java/com/sample/encrypt/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.sample.encrypt; + +import android.content.Context; +import android.support.test.InstrumentationRegistry; +import android.support.test.runner.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getTargetContext(); + + assertEquals("com.sample.encrypt", appContext.getPackageName()); + } +} diff --git a/sample-app-encrypt/src/main/AndroidManifest.xml b/sample-app-encrypt/src/main/AndroidManifest.xml new file mode 100644 index 0000000..ad21f88 --- /dev/null +++ b/sample-app-encrypt/src/main/AndroidManifest.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sample-app-encrypt/src/main/java/com/sample/encrypt/MainActivity.java b/sample-app-encrypt/src/main/java/com/sample/encrypt/MainActivity.java new file mode 100644 index 0000000..93d016c --- /dev/null +++ b/sample-app-encrypt/src/main/java/com/sample/encrypt/MainActivity.java @@ -0,0 +1,13 @@ +package com.sample.encrypt; + +import android.support.v7.app.AppCompatActivity; +import android.os.Bundle; + +public class MainActivity extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + } +} diff --git a/sample-app-encrypt/src/main/res/drawable-v24/ic_launcher_foreground.xml b/sample-app-encrypt/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..1f6bb29 --- /dev/null +++ b/sample-app-encrypt/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + diff --git a/sample-app-encrypt/src/main/res/drawable/ic_launcher_background.xml b/sample-app-encrypt/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..0d025f9 --- /dev/null +++ b/sample-app-encrypt/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sample-app-encrypt/src/main/res/layout/activity_main.xml b/sample-app-encrypt/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..84f1951 --- /dev/null +++ b/sample-app-encrypt/src/main/res/layout/activity_main.xml @@ -0,0 +1,18 @@ + + + + + + \ No newline at end of file diff --git a/sample-app-encrypt/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/sample-app-encrypt/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..eca70cf --- /dev/null +++ b/sample-app-encrypt/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/sample-app-encrypt/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/sample-app-encrypt/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..eca70cf --- /dev/null +++ b/sample-app-encrypt/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/sample-app-encrypt/src/main/res/mipmap-hdpi/ic_launcher.png b/sample-app-encrypt/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..898f3ed59ac9f3248734a00e5902736c9367d455 GIT binary patch literal 2963 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 JPDHLkV1g@XpTGbB literal 0 HcmV?d00001 diff --git a/sample-app-encrypt/src/main/res/mipmap-hdpi/ic_launcher_round.png b/sample-app-encrypt/src/main/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..dffca3601eba7bf5f409bdd520820e2eb5122c75 GIT binary patch literal 4905 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 lV%Z2*hu);6rydA(}wUDXPCF_W1vnaRBK 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 literal 0 HcmV?d00001 diff --git a/sample-app-encrypt/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/sample-app-encrypt/src/main/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..14ed0af35023e4f1901cf03487b6c524257b8483 GIT binary patch literal 6895 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 literal 0 HcmV?d00001 diff --git a/sample-app-encrypt/src/main/res/mipmap-xxhdpi/ic_launcher.png b/sample-app-encrypt/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..b0907cac3bfd8fbfdc46e1108247f0a1055387ec GIT binary patch literal 6387 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 literal 0 HcmV?d00001 diff --git a/sample-app-encrypt/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/sample-app-encrypt/src/main/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..d8ae03154975f397f8ed1b84f2d4bf9783ecfa26 GIT binary patch literal 10413 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 XdJ+W}DiIkV00000NkvXXu0mjfKBlg6 literal 0 HcmV?d00001 diff --git a/sample-app-encrypt/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/sample-app-encrypt/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..2c18de9e66108411737e910f5c1972476f03ddbf GIT binary patch literal 9128 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 I20H400LcNok^lez literal 0 HcmV?d00001 diff --git a/sample-app-encrypt/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/sample-app-encrypt/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..beed3cdd2c32af5114a7dc70b9ef5b698eb8797e GIT binary patch literal 15132 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 literal 0 HcmV?d00001 diff --git a/sample-app-encrypt/src/main/res/values/colors.xml b/sample-app-encrypt/src/main/res/values/colors.xml new file mode 100644 index 0000000..69b2233 --- /dev/null +++ b/sample-app-encrypt/src/main/res/values/colors.xml @@ -0,0 +1,6 @@ + + + #008577 + #00574B + #D81B60 + diff --git a/app/src/main/res/values/dimens.xml b/sample-app-encrypt/src/main/res/values/dimens.xml similarity index 100% rename from app/src/main/res/values/dimens.xml rename to sample-app-encrypt/src/main/res/values/dimens.xml diff --git a/sample-app-encrypt/src/main/res/values/strings.xml b/sample-app-encrypt/src/main/res/values/strings.xml new file mode 100644 index 0000000..4e9db46 --- /dev/null +++ b/sample-app-encrypt/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + Sample App Encrypt + diff --git a/sample-app-encrypt/src/main/res/values/styles.xml b/sample-app-encrypt/src/main/res/values/styles.xml new file mode 100644 index 0000000..5885930 --- /dev/null +++ b/sample-app-encrypt/src/main/res/values/styles.xml @@ -0,0 +1,11 @@ + + + + + + diff --git a/sample-app-encrypt/src/test/java/com/sample/encrypt/ExampleUnitTest.java b/sample-app-encrypt/src/test/java/com/sample/encrypt/ExampleUnitTest.java new file mode 100644 index 0000000..9f50bfb --- /dev/null +++ b/sample-app-encrypt/src/test/java/com/sample/encrypt/ExampleUnitTest.java @@ -0,0 +1,17 @@ +package com.sample.encrypt; + +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Example local unit test, which will execute on the development machine (host). + * + * @see Testing documentation + */ +public class ExampleUnitTest { + @Test + public void addition_isCorrect() { + assertEquals(4, 2 + 2); + } +} \ No newline at end of file diff --git a/app/build.gradle b/sample-app/build.gradle similarity index 100% rename from app/build.gradle rename to sample-app/build.gradle diff --git a/sample-app/proguard-rules.pro b/sample-app/proguard-rules.pro new file mode 100644 index 0000000..f1b4245 --- /dev/null +++ b/sample-app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/app/src/androidTest/java/com/sample/ExampleInstrumentedTest.java b/sample-app/src/androidTest/java/com/sample/ExampleInstrumentedTest.java similarity index 100% rename from app/src/androidTest/java/com/sample/ExampleInstrumentedTest.java rename to sample-app/src/androidTest/java/com/sample/ExampleInstrumentedTest.java diff --git a/app/src/main/AndroidManifest.xml b/sample-app/src/main/AndroidManifest.xml similarity index 100% rename from app/src/main/AndroidManifest.xml rename to sample-app/src/main/AndroidManifest.xml diff --git a/app/src/main/java/com/sample/MainActivity.java b/sample-app/src/main/java/com/sample/MainActivity.java similarity index 100% rename from app/src/main/java/com/sample/MainActivity.java rename to sample-app/src/main/java/com/sample/MainActivity.java diff --git a/app/src/main/java/com/sample/database/CarDBHelper.java b/sample-app/src/main/java/com/sample/database/CarDBHelper.java similarity index 100% rename from app/src/main/java/com/sample/database/CarDBHelper.java rename to sample-app/src/main/java/com/sample/database/CarDBHelper.java diff --git a/app/src/main/java/com/sample/database/ContactDBHelper.java b/sample-app/src/main/java/com/sample/database/ContactDBHelper.java similarity index 100% rename from app/src/main/java/com/sample/database/ContactDBHelper.java rename to sample-app/src/main/java/com/sample/database/ContactDBHelper.java diff --git a/app/src/main/java/com/sample/database/ExtTestDBHelper.java b/sample-app/src/main/java/com/sample/database/ExtTestDBHelper.java similarity index 100% rename from app/src/main/java/com/sample/database/ExtTestDBHelper.java rename to sample-app/src/main/java/com/sample/database/ExtTestDBHelper.java diff --git a/app/src/main/java/com/sample/database/room/AppDatabase.java b/sample-app/src/main/java/com/sample/database/room/AppDatabase.java similarity index 100% rename from app/src/main/java/com/sample/database/room/AppDatabase.java rename to sample-app/src/main/java/com/sample/database/room/AppDatabase.java diff --git a/app/src/main/java/com/sample/database/room/User.java b/sample-app/src/main/java/com/sample/database/room/User.java similarity index 100% rename from app/src/main/java/com/sample/database/room/User.java rename to sample-app/src/main/java/com/sample/database/room/User.java diff --git a/app/src/main/java/com/sample/database/room/UserDBHelper.java b/sample-app/src/main/java/com/sample/database/room/UserDBHelper.java similarity index 100% rename from app/src/main/java/com/sample/database/room/UserDBHelper.java rename to sample-app/src/main/java/com/sample/database/room/UserDBHelper.java diff --git a/app/src/main/java/com/sample/database/room/UserDao.java b/sample-app/src/main/java/com/sample/database/room/UserDao.java similarity index 100% rename from app/src/main/java/com/sample/database/room/UserDao.java rename to sample-app/src/main/java/com/sample/database/room/UserDao.java diff --git a/app/src/main/java/com/sample/utils/Utils.java b/sample-app/src/main/java/com/sample/utils/Utils.java similarity index 100% rename from app/src/main/java/com/sample/utils/Utils.java rename to sample-app/src/main/java/com/sample/utils/Utils.java diff --git a/app/src/main/res/layout/activity_main.xml b/sample-app/src/main/res/layout/activity_main.xml similarity index 100% rename from app/src/main/res/layout/activity_main.xml rename to sample-app/src/main/res/layout/activity_main.xml diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/sample-app/src/main/res/mipmap-hdpi/ic_launcher.png similarity index 100% rename from app/src/main/res/mipmap-hdpi/ic_launcher.png rename to sample-app/src/main/res/mipmap-hdpi/ic_launcher.png diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/sample-app/src/main/res/mipmap-mdpi/ic_launcher.png similarity index 100% rename from app/src/main/res/mipmap-mdpi/ic_launcher.png rename to sample-app/src/main/res/mipmap-mdpi/ic_launcher.png diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/sample-app/src/main/res/mipmap-xhdpi/ic_launcher.png similarity index 100% rename from app/src/main/res/mipmap-xhdpi/ic_launcher.png rename to sample-app/src/main/res/mipmap-xhdpi/ic_launcher.png diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/sample-app/src/main/res/mipmap-xxhdpi/ic_launcher.png similarity index 100% rename from app/src/main/res/mipmap-xxhdpi/ic_launcher.png rename to sample-app/src/main/res/mipmap-xxhdpi/ic_launcher.png diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/sample-app/src/main/res/mipmap-xxxhdpi/ic_launcher.png similarity index 100% rename from app/src/main/res/mipmap-xxxhdpi/ic_launcher.png rename to sample-app/src/main/res/mipmap-xxxhdpi/ic_launcher.png diff --git a/app/src/main/res/values-w820dp/dimens.xml b/sample-app/src/main/res/values-w820dp/dimens.xml similarity index 100% rename from app/src/main/res/values-w820dp/dimens.xml rename to sample-app/src/main/res/values-w820dp/dimens.xml diff --git a/app/src/main/res/values/colors.xml b/sample-app/src/main/res/values/colors.xml similarity index 100% rename from app/src/main/res/values/colors.xml rename to sample-app/src/main/res/values/colors.xml diff --git a/sample-app/src/main/res/values/dimens.xml b/sample-app/src/main/res/values/dimens.xml new file mode 100644 index 0000000..2bbc6ea --- /dev/null +++ b/sample-app/src/main/res/values/dimens.xml @@ -0,0 +1,24 @@ + + + + + 16dp + 16dp + diff --git a/app/src/main/res/values/strings.xml b/sample-app/src/main/res/values/strings.xml similarity index 100% rename from app/src/main/res/values/strings.xml rename to sample-app/src/main/res/values/strings.xml diff --git a/app/src/main/res/values/styles.xml b/sample-app/src/main/res/values/styles.xml similarity index 100% rename from app/src/main/res/values/styles.xml rename to sample-app/src/main/res/values/styles.xml diff --git a/app/src/test/java/com/sample/ExampleUnitTest.java b/sample-app/src/test/java/com/sample/ExampleUnitTest.java similarity index 100% rename from app/src/test/java/com/sample/ExampleUnitTest.java rename to sample-app/src/test/java/com/sample/ExampleUnitTest.java From f76b95ae8d1928a7cf1ebf068c4a1819fb0cbb51 Mon Sep 17 00:00:00 2001 From: amitshekhariitbhu Date: Fri, 15 Feb 2019 19:41:24 +0530 Subject: [PATCH 06/13] Create sample-app for encrypt --- sample-app-encrypt/build.gradle | 19 ++- .../java/com/sample/encrypt/MainActivity.java | 136 +++++++++++++++++- .../sample/encrypt/database/CarDBHelper.java | 134 +++++++++++++++++ .../encrypt/database/ContactDBHelper.java | 136 ++++++++++++++++++ .../encrypt/database/ExtTestDBHelper.java | 92 ++++++++++++ .../encrypt/database/PersonDBHelper.java | 136 ++++++++++++++++++ .../encrypt/database/room/AppDatabase.java | 14 ++ .../sample/encrypt/database/room/User.java | 17 +++ .../encrypt/database/room/UserDBHelper.java | 46 ++++++ .../sample/encrypt/database/room/UserDao.java | 33 +++++ .../java/com/sample/encrypt/utils/Utils.java | 91 ++++++++++++ .../src/main/res/layout/activity_main.xml | 43 ++++-- .../src/main/res/values/strings.xml | 1 + sample-app/build.gradle | 4 +- .../main/java/com/sample/MainActivity.java | 12 -- settings.gradle | 2 +- 16 files changed, 878 insertions(+), 38 deletions(-) create mode 100644 sample-app-encrypt/src/main/java/com/sample/encrypt/database/CarDBHelper.java create mode 100644 sample-app-encrypt/src/main/java/com/sample/encrypt/database/ContactDBHelper.java create mode 100644 sample-app-encrypt/src/main/java/com/sample/encrypt/database/ExtTestDBHelper.java create mode 100644 sample-app-encrypt/src/main/java/com/sample/encrypt/database/PersonDBHelper.java create mode 100644 sample-app-encrypt/src/main/java/com/sample/encrypt/database/room/AppDatabase.java create mode 100644 sample-app-encrypt/src/main/java/com/sample/encrypt/database/room/User.java create mode 100644 sample-app-encrypt/src/main/java/com/sample/encrypt/database/room/UserDBHelper.java create mode 100644 sample-app-encrypt/src/main/java/com/sample/encrypt/database/room/UserDao.java create mode 100644 sample-app-encrypt/src/main/java/com/sample/encrypt/utils/Utils.java diff --git a/sample-app-encrypt/build.gradle b/sample-app-encrypt/build.gradle index e7cb4f6..ae27b46 100644 --- a/sample-app-encrypt/build.gradle +++ b/sample-app-encrypt/build.gradle @@ -2,34 +2,33 @@ apply plugin: 'com.android.application' android { compileSdkVersion 28 - - - defaultConfig { applicationId "com.sample.encrypt" minSdkVersion 15 targetSdkVersion 28 versionCode 1 versionName "1.0" - testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } - buildTypes { + debug { + resValue("string", "PORT_NUMBER", "8080") + resValue("string", "DB_PASSWORD_PERSON", "a_password") + } release { minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } - } dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar']) - + debugImplementation project(':debug-db-encrypt') implementation 'com.android.support:appcompat-v7:28.0.0' - implementation 'com.android.support.constraint:constraint-layout:1.1.3' + implementation 'net.zetetic:android-database-sqlcipher:3.5.9' + implementation 'android.arch.persistence.room:runtime:1.1.1' + annotationProcessor 'android.arch.persistence.room:compiler:1.1.1' testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' diff --git a/sample-app-encrypt/src/main/java/com/sample/encrypt/MainActivity.java b/sample-app-encrypt/src/main/java/com/sample/encrypt/MainActivity.java index 93d016c..e035da3 100644 --- a/sample-app-encrypt/src/main/java/com/sample/encrypt/MainActivity.java +++ b/sample-app-encrypt/src/main/java/com/sample/encrypt/MainActivity.java @@ -1,13 +1,147 @@ +/* + * + * * Copyright (C) 2019 Amit Shekhar + * * Copyright (C) 2011 Android Open Source Project + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * + */ + package com.sample.encrypt; -import android.support.v7.app.AppCompatActivity; +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.SharedPreferences; import android.os.Bundle; +import android.preference.PreferenceManager; +import android.support.v7.app.AppCompatActivity; +import android.view.View; + +import com.sample.encrypt.database.CarDBHelper; +import com.sample.encrypt.database.ContactDBHelper; +import com.sample.encrypt.database.ExtTestDBHelper; +import com.sample.encrypt.database.PersonDBHelper; +import com.sample.encrypt.database.room.User; +import com.sample.encrypt.database.room.UserDBHelper; +import com.sample.encrypt.utils.Utils; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; public class MainActivity extends AppCompatActivity { + @SuppressLint("CommitPrefEdits") @Override protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + + Set stringSet = new HashSet<>(); + stringSet.add("SetOne"); + stringSet.add("SetTwo"); + stringSet.add("SetThree"); + + SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); + + SharedPreferences prefsOne = getSharedPreferences("countPrefOne", Context.MODE_PRIVATE); + SharedPreferences prefsTwo = getSharedPreferences("countPrefTwo", Context.MODE_PRIVATE); + + sharedPreferences.edit().putString("testOne", "one").commit(); + sharedPreferences.edit().putInt("testTwo", 2).commit(); + sharedPreferences.edit().putLong("testThree", 100000L).commit(); + sharedPreferences.edit().putFloat("testFour", 3.01F).commit(); + sharedPreferences.edit().putBoolean("testFive", true).commit(); + sharedPreferences.edit().putStringSet("testSix", stringSet).commit(); + + prefsOne.edit().putString("testOneNew", "one").commit(); + + prefsTwo.edit().putString("testTwoNew", "two").commit(); + + ContactDBHelper contactDBHelper = new ContactDBHelper(getApplicationContext()); + if (contactDBHelper.count() == 0) { + for (int i = 0; i < 100; i++) { + String name = "name_" + i; + String phone = "phone_" + i; + String email = "email_" + i; + String street = "street_" + i; + String place = "place_" + i; + contactDBHelper.insertContact(name, phone, email, street, place); + } + } + + CarDBHelper carDBHelper = new CarDBHelper(getApplicationContext()); + if (carDBHelper.count() == 0) { + for (int i = 0; i < 50; i++) { + String name = "name_" + i; + String color = "RED"; + float mileage = i + 10.45f; + carDBHelper.insertCar(name, color, mileage); + } + } + + ExtTestDBHelper extTestDBHelper = new ExtTestDBHelper(getApplicationContext()); + if (extTestDBHelper.count() == 0) { + for (int i = 0; i < 20; i++) { + String value = "value_" + i; + extTestDBHelper.insertTest(value); + } + } + + // Create Person encrypted database + PersonDBHelper personDBHelper = new PersonDBHelper(getApplicationContext()); + if (personDBHelper.count() == 0) { + for (int i = 0; i < 100; i++) { + String firstName = PersonDBHelper.PERSON_COLUMN_FIRST_NAME + "_" + i; + String lastName = PersonDBHelper.PERSON_COLUMN_LAST_NAME + "_" + i; + String address = PersonDBHelper.PERSON_COLUMN_ADDRESS + "_" + i; + personDBHelper.insertPerson(firstName, lastName, address); + } + } + + // Room database + UserDBHelper userDBHelper = new UserDBHelper(getApplicationContext()); + if (userDBHelper.count() == 0) { + List userList = new ArrayList<>(); + for (int i = 0; i < 20; i++) { + User user = new User(); + user.id = (long) (i + 1); + user.name = "user_" + i; + userList.add(user); + } + userDBHelper.insertUser(userList); + } + + // Room inMemory database + if (userDBHelper.countInMemory() == 0) { + List userList = new ArrayList<>(); + for (int i = 0; i < 20; i++) { + User user = new User(); + user.id = (long) (i + 1); + user.name = "in_memory_user_" + i; + userList.add(user); + } + userDBHelper.insertUserInMemory(userList); + } + + Utils.setCustomDatabaseFiles(getApplicationContext()); + Utils.setInMemoryRoomDatabases(userDBHelper.getInMemoryDatabase()); + } + + public void showDebugDbAddress(View view) { + Utils.showDebugDBAddressLogToast(getApplicationContext()); } } diff --git a/sample-app-encrypt/src/main/java/com/sample/encrypt/database/CarDBHelper.java b/sample-app-encrypt/src/main/java/com/sample/encrypt/database/CarDBHelper.java new file mode 100644 index 0000000..c620a4d --- /dev/null +++ b/sample-app-encrypt/src/main/java/com/sample/encrypt/database/CarDBHelper.java @@ -0,0 +1,134 @@ +/* + * + * * Copyright (C) 2019 Amit Shekhar + * * Copyright (C) 2011 Android Open Source Project + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * + */ + +package com.sample.encrypt.database; + +import android.content.ContentValues; +import android.content.Context; +import android.database.Cursor; +import android.database.DatabaseUtils; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteOpenHelper; + +import java.util.ArrayList; + +/** + * Created by amitshekhar on 06/02/17. + */ + +public class CarDBHelper extends SQLiteOpenHelper { + + public static final String DATABASE_NAME = "Car.db"; + public static final String CARS_TABLE_NAME = "cars"; + public static final String CARS_COLUMN_ID = "id"; + public static final String CARS_COLUMN_NAME = "name"; + public static final String CARS_COLUMN_COLOR = "color"; + public static final String CCARS_COLUMN_MILEAGE = "mileage"; + + public CarDBHelper(Context context) { + super(context, DATABASE_NAME, null, 1); + } + + @Override + public void onCreate(SQLiteDatabase db) { + // TODO Auto-generated method stub + db.execSQL( + "create table cars " + + "(id integer primary key, name text, color text, mileage real)" + ); + + db.execSQL("create table [transaction] (id integer primary key, name text)"); + + for (int i = 0; i < 10; i++) { + db.execSQL("insert into [transaction] (name) values ('hello');"); + } + } + + @Override + public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { + // TODO Auto-generated method stub + db.execSQL("DROP TABLE IF EXISTS cars"); + onCreate(db); + } + + public boolean insertCar(String name, String color, float mileage) { + SQLiteDatabase db = this.getWritableDatabase(); + ContentValues contentValues = new ContentValues(); + contentValues.put("name", name); + contentValues.put("color", color); + contentValues.put("mileage", mileage); + db.insert("cars", null, contentValues); + return true; + } + + public Cursor getData(int id) { + SQLiteDatabase db = this.getReadableDatabase(); + Cursor res = db.rawQuery("select * from cars where id=" + id + "", null); + return res; + } + + public int numberOfRows() { + SQLiteDatabase db = this.getReadableDatabase(); + int numRows = (int) DatabaseUtils.queryNumEntries(db, CARS_TABLE_NAME); + return numRows; + } + + public boolean updateCar(Integer id, String name, String color, float mileage) { + SQLiteDatabase db = this.getWritableDatabase(); + ContentValues contentValues = new ContentValues(); + contentValues.put("name", name); + contentValues.put("color", color); + contentValues.put("mileage", mileage); + db.update("cars", contentValues, "id = ? ", new String[]{Integer.toString(id)}); + return true; + } + + public Integer deleteCar(Integer id) { + SQLiteDatabase db = this.getWritableDatabase(); + return db.delete("cars", + "id = ? ", + new String[]{Integer.toString(id)}); + } + + public ArrayList getAllCars() { + ArrayList arrayList = new ArrayList<>(); + + //hp = new HashMap(); + SQLiteDatabase db = this.getReadableDatabase(); + Cursor res = db.rawQuery("select * from cars", null); + res.moveToFirst(); + + while (!res.isAfterLast()) { + arrayList.add(res.getString(res.getColumnIndex(CARS_COLUMN_NAME))); + res.moveToNext(); + } + return arrayList; + } + + public int count() { + SQLiteDatabase db = getReadableDatabase(); + Cursor cursor = db.rawQuery("select * from cars", null); + if (cursor != null && cursor.getCount() > 0) { + cursor.moveToFirst(); + return cursor.getInt(0); + } else { + return 0; + } + } +} diff --git a/sample-app-encrypt/src/main/java/com/sample/encrypt/database/ContactDBHelper.java b/sample-app-encrypt/src/main/java/com/sample/encrypt/database/ContactDBHelper.java new file mode 100644 index 0000000..b0f4ef3 --- /dev/null +++ b/sample-app-encrypt/src/main/java/com/sample/encrypt/database/ContactDBHelper.java @@ -0,0 +1,136 @@ +/* + * + * * Copyright (C) 2019 Amit Shekhar + * * Copyright (C) 2011 Android Open Source Project + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * + */ + +package com.sample.encrypt.database; + +import android.content.ContentValues; +import android.content.Context; +import android.database.Cursor; +import android.database.DatabaseUtils; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteOpenHelper; + +import java.util.ArrayList; +import java.util.Calendar; + +/** + * Created by amitshekhar on 16/11/16. + */ +public class ContactDBHelper extends SQLiteOpenHelper { + + public static final String DATABASE_NAME = "Contact.db"; + public static final String CONTACTS_TABLE_NAME = "contacts"; + public static final String CONTACTS_COLUMN_ID = "id"; + public static final String CONTACTS_COLUMN_NAME = "name"; + public static final String CONTACTS_COLUMN_EMAIL = "email"; + public static final String CONTACTS_COLUMN_STREET = "street"; + public static final String CONTACTS_COLUMN_CITY = "place"; + public static final String CONTACTS_COLUMN_PHONE = "phone"; + public static final String CONTACTS_CREATED_AT = "createdAt"; + + public ContactDBHelper(Context context) { + super(context, DATABASE_NAME, null, 1); + } + + @Override + public void onCreate(SQLiteDatabase db) { + // TODO Auto-generated method stub + db.execSQL( + "create table contacts " + + "(id integer primary key, name text, phone text, email text, street text, place text, createdAt integer)" + ); + } + + @Override + public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { + // TODO Auto-generated method stub + db.execSQL("DROP TABLE IF EXISTS contacts"); + onCreate(db); + } + + public boolean insertContact(String name, String phone, String email, String street, String place) { + SQLiteDatabase db = this.getWritableDatabase(); + ContentValues contentValues = new ContentValues(); + contentValues.put("name", name); + contentValues.put("phone", phone); + contentValues.put("email", email); + contentValues.put("street", street); + contentValues.put("place", place); + contentValues.put(CONTACTS_CREATED_AT, Calendar.getInstance().getTimeInMillis()); + db.insert("contacts", null, contentValues); + return true; + } + + public Cursor getData(int id) { + SQLiteDatabase db = this.getReadableDatabase(); + Cursor res = db.rawQuery("select * from contacts where id=" + id + "", null); + return res; + } + + public int numberOfRows() { + SQLiteDatabase db = this.getReadableDatabase(); + int numRows = (int) DatabaseUtils.queryNumEntries(db, CONTACTS_TABLE_NAME); + return numRows; + } + + public boolean updateContact(Integer id, String name, String phone, String email, String street, String place) { + SQLiteDatabase db = this.getWritableDatabase(); + ContentValues contentValues = new ContentValues(); + contentValues.put("name", name); + contentValues.put("phone", phone); + contentValues.put("email", email); + contentValues.put("street", street); + contentValues.put("place", place); + db.update("contacts", contentValues, "id = ? ", new String[]{Integer.toString(id)}); + return true; + } + + public Integer deleteContact(Integer id) { + SQLiteDatabase db = this.getWritableDatabase(); + return db.delete("contacts", + "id = ? ", + new String[]{Integer.toString(id)}); + } + + public ArrayList getAllCotacts() { + ArrayList arrayList = new ArrayList<>(); + + //hp = new HashMap(); + SQLiteDatabase db = this.getReadableDatabase(); + Cursor res = db.rawQuery("select * from contacts", null); + res.moveToFirst(); + + while (!res.isAfterLast()) { + arrayList.add(res.getString(res.getColumnIndex(CONTACTS_COLUMN_NAME))); + res.moveToNext(); + } + return arrayList; + } + + public int count() { + SQLiteDatabase db = getReadableDatabase(); + Cursor cursor = db.rawQuery("select * from contacts", null); + if (cursor != null && cursor.getCount() > 0) { + cursor.moveToFirst(); + return cursor.getInt(0); + } else { + return 0; + } + } +} diff --git a/sample-app-encrypt/src/main/java/com/sample/encrypt/database/ExtTestDBHelper.java b/sample-app-encrypt/src/main/java/com/sample/encrypt/database/ExtTestDBHelper.java new file mode 100644 index 0000000..582a9f3 --- /dev/null +++ b/sample-app-encrypt/src/main/java/com/sample/encrypt/database/ExtTestDBHelper.java @@ -0,0 +1,92 @@ +package com.sample.encrypt.database; + +import android.content.ContentValues; +import android.content.Context; +import android.content.ContextWrapper; +import android.database.Cursor; +import android.database.DatabaseErrorHandler; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteOpenHelper; + +import java.io.File; +import java.util.Calendar; + +public class ExtTestDBHelper extends SQLiteOpenHelper { + + public static final String DIR_NAME = "custom_dir"; + public static final String DATABASE_NAME = "ExtTest.db"; + public static final String TEST_TABLE_NAME = "test"; + public static final String TEST_ID = "id"; + public static final String TEST_COLUMN_VALUE = "value"; + public static final String TEST_CREATED_AT = "createdAt"; + + public ExtTestDBHelper(Context context) { + super(new CustomDatabasePathContext(context), DATABASE_NAME, null, 1); + } + + @Override + public void onCreate(SQLiteDatabase db) { + // TODO Auto-generated method stub + db.execSQL( + String.format( + "create table %s (%s integer primary key, %s text, %s integer)", + TEST_TABLE_NAME, + TEST_ID, + TEST_COLUMN_VALUE, + TEST_CREATED_AT + ) + ); + } + + @Override + public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { + // TODO Auto-generated method stub + db.execSQL("DROP TABLE IF EXISTS " + TEST_TABLE_NAME); + onCreate(db); + } + + public boolean insertTest(String value) { + SQLiteDatabase db = this.getWritableDatabase(); + ContentValues contentValues = new ContentValues(); + contentValues.put("value", value); + contentValues.put(TEST_CREATED_AT, Calendar.getInstance().getTimeInMillis()); + db.insert(TEST_TABLE_NAME, null, contentValues); + return true; + } + + public int count() { + SQLiteDatabase db = getReadableDatabase(); + Cursor cursor = db.rawQuery("select COUNT(*) from " + TEST_TABLE_NAME, null); + if (cursor != null && cursor.getCount() > 0) { + cursor.moveToFirst(); + return cursor.getInt(0); + } else { + return 0; + } + } + + private static class CustomDatabasePathContext extends ContextWrapper { + + public CustomDatabasePathContext(Context base) { + super(base); + } + + @Override + public File getDatabasePath(String name) { + File databaseDir = new File(String.format("%s/%s", getFilesDir(), ExtTestDBHelper.DIR_NAME)); + databaseDir.mkdirs(); + File databaseFile = new File(String.format("%s/%s/%s", getFilesDir(), ExtTestDBHelper.DIR_NAME, name)); + return databaseFile; + } + + @Override + public SQLiteDatabase openOrCreateDatabase(String name, int mode, SQLiteDatabase.CursorFactory factory) { + return SQLiteDatabase.openOrCreateDatabase(getDatabasePath(name), null); + } + + @Override + public SQLiteDatabase openOrCreateDatabase(String name, int mode, SQLiteDatabase.CursorFactory factory, DatabaseErrorHandler errorHandler) { + return SQLiteDatabase.openOrCreateDatabase(getDatabasePath(name), null); + } + } +} diff --git a/sample-app-encrypt/src/main/java/com/sample/encrypt/database/PersonDBHelper.java b/sample-app-encrypt/src/main/java/com/sample/encrypt/database/PersonDBHelper.java new file mode 100644 index 0000000..bb95c46 --- /dev/null +++ b/sample-app-encrypt/src/main/java/com/sample/encrypt/database/PersonDBHelper.java @@ -0,0 +1,136 @@ +/* + * + * * Copyright (C) 2019 Amit Shekhar + * * Copyright (C) 2011 Android Open Source Project + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * + */ + +package com.sample.encrypt.database; + +import android.content.ContentValues; +import android.content.Context; +import android.database.Cursor; + +import net.sqlcipher.DatabaseUtils; +import net.sqlcipher.database.SQLiteDatabase; +import net.sqlcipher.database.SQLiteOpenHelper; + +import java.util.ArrayList; + +public class PersonDBHelper extends SQLiteOpenHelper { + + public static final String DATABASE_NAME = "Person.db"; + public static final String PERSON_TABLE_NAME = "person"; + public static final String PERSON_COLUMN_ID = "id"; + public static final String PERSON_COLUMN_FIRST_NAME = "first_name"; + public static final String PERSON_COLUMN_LAST_NAME = "last_name"; + public static final String PERSON_COLUMN_ADDRESS = "address"; + private static final String DB_PASSWORD = "a_password"; + + public PersonDBHelper(Context context) { + + super(context, DATABASE_NAME, null, 1); + SQLiteDatabase.loadLibs(context); + } + + @Override + public void onCreate(SQLiteDatabase db) { + db.execSQL( + "create table person " + + "(id integer primary key, first_name text, last_name text, address text)" + ); + } + + @Override + public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { + db.execSQL("DROP TABLE IF EXISTS person"); + onCreate(db); + } + + public boolean insertPerson(String firstName, String lastName, String address) { + SQLiteDatabase db = this.getWritableDatabase(DB_PASSWORD); + ContentValues contentValues = new ContentValues(); + contentValues.put("first_name", firstName); + contentValues.put("last_name", lastName); + contentValues.put("address", address); + db.insert("person", null, contentValues); + db.close(); + return true; + } + + public Cursor getData(int id) { + SQLiteDatabase db = this.getReadableDatabase(DB_PASSWORD); + Cursor res = db.rawQuery("select * from person where id=" + id + "", null); + return res; + } + + public int numberOfRows() { + SQLiteDatabase db = this.getReadableDatabase(DB_PASSWORD); + int numRows = (int) DatabaseUtils.queryNumEntries(db, PERSON_TABLE_NAME); + return numRows; + } + + public boolean updatePerson(Integer id, String firstName, String lastName, String address, float mileage) { + SQLiteDatabase db = this.getWritableDatabase(DB_PASSWORD); + ContentValues contentValues = new ContentValues(); + contentValues.put("first_name", firstName); + contentValues.put("last_name", lastName); + contentValues.put("address", address); + db.update("person", contentValues, "id = ? ", new String[]{Integer.toString(id)}); + db.close(); + return true; + } + + public Integer deletePerson(Integer id) { + SQLiteDatabase db = this.getWritableDatabase(DB_PASSWORD); + return db.delete("person", + "id = ? ", + new String[]{Integer.toString(id)}); + } + + public ArrayList getAllPerson() { + ArrayList arrayList = new ArrayList<>(); + + SQLiteDatabase db = this.getReadableDatabase(DB_PASSWORD); + Cursor res = db.rawQuery("select * from person", null); + res.moveToFirst(); + + while (!res.isAfterLast()) { + arrayList.add( + res.getString(res.getColumnIndex(PERSON_COLUMN_FIRST_NAME)) + " " + + res.getString(res.getColumnIndex(PERSON_COLUMN_LAST_NAME))); + res.moveToNext(); + } + res.close(); + db.close(); + return arrayList; + } + + public int count() { + SQLiteDatabase db = getReadableDatabase(DB_PASSWORD); + Cursor cursor = db.rawQuery("select * from person", null); + try { + if (cursor != null && cursor.getCount() > 0) { + cursor.moveToFirst(); + return cursor.getInt(0); + } else { + return 0; + } + } finally { + cursor.close(); + db.close(); + } + } +} diff --git a/sample-app-encrypt/src/main/java/com/sample/encrypt/database/room/AppDatabase.java b/sample-app-encrypt/src/main/java/com/sample/encrypt/database/room/AppDatabase.java new file mode 100644 index 0000000..63aa947 --- /dev/null +++ b/sample-app-encrypt/src/main/java/com/sample/encrypt/database/room/AppDatabase.java @@ -0,0 +1,14 @@ +package com.sample.encrypt.database.room; + +import android.arch.persistence.room.Database; +import android.arch.persistence.room.RoomDatabase; + +/** + * Created by anandgaurav on 12/02/18. + */ +@Database(entities = {User.class}, version = 1, exportSchema = false) +public abstract class AppDatabase extends RoomDatabase { + + public abstract UserDao userDao(); + +} diff --git a/sample-app-encrypt/src/main/java/com/sample/encrypt/database/room/User.java b/sample-app-encrypt/src/main/java/com/sample/encrypt/database/room/User.java new file mode 100644 index 0000000..f5fdf32 --- /dev/null +++ b/sample-app-encrypt/src/main/java/com/sample/encrypt/database/room/User.java @@ -0,0 +1,17 @@ +package com.sample.encrypt.database.room; + +import android.arch.persistence.room.Entity; +import android.arch.persistence.room.PrimaryKey; + +/** + * Created by anandgaurav on 12/02/18. + */ +@Entity(tableName = "users") +public class User { + + @PrimaryKey + public Long id; + + public String name; + +} diff --git a/sample-app-encrypt/src/main/java/com/sample/encrypt/database/room/UserDBHelper.java b/sample-app-encrypt/src/main/java/com/sample/encrypt/database/room/UserDBHelper.java new file mode 100644 index 0000000..7304480 --- /dev/null +++ b/sample-app-encrypt/src/main/java/com/sample/encrypt/database/room/UserDBHelper.java @@ -0,0 +1,46 @@ +package com.sample.encrypt.database.room; + +import android.arch.persistence.db.SupportSQLiteDatabase; +import android.arch.persistence.room.Room; +import android.content.Context; + +import java.util.List; + +/** + * Created by anandgaurav on 12/02/18. + */ + +public class UserDBHelper { + + private final AppDatabase appDatabase; + private final AppDatabase inMemoryAppDatabase; + + public UserDBHelper(Context context) { + appDatabase = Room.databaseBuilder(context, AppDatabase.class, "User.db") + .allowMainThreadQueries() + .build(); + inMemoryAppDatabase = Room.inMemoryDatabaseBuilder(context, AppDatabase.class) + .allowMainThreadQueries() + .build(); + } + + public void insertUser(List userList) { + appDatabase.userDao().insertAll(userList); + } + + public void insertUserInMemory(List userList) { + inMemoryAppDatabase.userDao().insertAll(userList); + } + + public int count() { + return appDatabase.userDao().loadAll().size(); + } + + public int countInMemory() { + return inMemoryAppDatabase.userDao().loadAll().size(); + } + + public SupportSQLiteDatabase getInMemoryDatabase() { + return inMemoryAppDatabase.getOpenHelper().getWritableDatabase(); + } +} diff --git a/sample-app-encrypt/src/main/java/com/sample/encrypt/database/room/UserDao.java b/sample-app-encrypt/src/main/java/com/sample/encrypt/database/room/UserDao.java new file mode 100644 index 0000000..e93f507 --- /dev/null +++ b/sample-app-encrypt/src/main/java/com/sample/encrypt/database/room/UserDao.java @@ -0,0 +1,33 @@ +package com.sample.encrypt.database.room; + +import android.arch.persistence.room.Dao; +import android.arch.persistence.room.Delete; +import android.arch.persistence.room.Insert; +import android.arch.persistence.room.OnConflictStrategy; +import android.arch.persistence.room.Query; + +import java.util.List; + +/** + * Created by anandgaurav on 12/02/18. + */ + +@Dao +public interface UserDao { + + @Query("SELECT * FROM users") + List loadAll(); + + @Query("SELECT * FROM users WHERE id IN (:userIds)") + List loadAllByIds(List userIds); + + @Insert(onConflict = OnConflictStrategy.REPLACE) + void insert(User user); + + @Insert(onConflict = OnConflictStrategy.REPLACE) + void insertAll(List users); + + @Delete + void delete(User user); + +} diff --git a/sample-app-encrypt/src/main/java/com/sample/encrypt/utils/Utils.java b/sample-app-encrypt/src/main/java/com/sample/encrypt/utils/Utils.java new file mode 100644 index 0000000..f6aa926 --- /dev/null +++ b/sample-app-encrypt/src/main/java/com/sample/encrypt/utils/Utils.java @@ -0,0 +1,91 @@ +/* + * + * * Copyright (C) 2019 Amit Shekhar + * * Copyright (C) 2011 Android Open Source Project + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * + */ + +package com.sample.encrypt.utils; + +import android.arch.persistence.db.SupportSQLiteDatabase; +import android.content.Context; +import android.util.Pair; +import android.widget.Toast; + +import com.sample.encrypt.BuildConfig; +import com.sample.encrypt.database.ExtTestDBHelper; + +import java.io.File; +import java.lang.reflect.Method; +import java.util.HashMap; + +/** + * Created by amitshekhar on 07/02/17. + */ + +public class Utils { + + private Utils() { + // This class is not publicly instantiable + } + + public static void showDebugDBAddressLogToast(Context context) { + if (BuildConfig.DEBUG) { + try { + Class debugDB = Class.forName("com.amitshekhar.DebugDB"); + Method getAddressLog = debugDB.getMethod("getAddressLog"); + Object value = getAddressLog.invoke(null); + Toast.makeText(context, (String) value, Toast.LENGTH_LONG).show(); + } catch (Exception ignore) { + + } + } + } + + public static void setCustomDatabaseFiles(Context context) { + if (BuildConfig.DEBUG) { + try { + Class debugDB = Class.forName("com.amitshekhar.DebugDB"); + Class[] argTypes = new Class[]{HashMap.class}; + Method setCustomDatabaseFiles = debugDB.getMethod("setCustomDatabaseFiles", argTypes); + HashMap> customDatabaseFiles = new HashMap<>(); + // set your custom database files + customDatabaseFiles.put(ExtTestDBHelper.DATABASE_NAME, + new Pair<>(new File(context.getFilesDir() + "/" + ExtTestDBHelper.DIR_NAME + + "/" + ExtTestDBHelper.DATABASE_NAME), "")); + setCustomDatabaseFiles.invoke(null, customDatabaseFiles); + } catch (Exception ignore) { + + } + } + } + + public static void setInMemoryRoomDatabases(SupportSQLiteDatabase... database) { + if (BuildConfig.DEBUG) { + try { + Class debugDB = Class.forName("com.amitshekhar.DebugDB"); + Class[] argTypes = new Class[]{HashMap.class}; + HashMap inMemoryDatabases = new HashMap<>(); + // set your inMemory databases + inMemoryDatabases.put("InMemoryOne.db", database[0]); + Method setRoomInMemoryDatabase = debugDB.getMethod("setInMemoryRoomDatabases", argTypes); + setRoomInMemoryDatabase.invoke(null, inMemoryDatabases); + } catch (Exception ignore) { + + } + } + } + +} diff --git a/sample-app-encrypt/src/main/res/layout/activity_main.xml b/sample-app-encrypt/src/main/res/layout/activity_main.xml index 84f1951..b5d361c 100644 --- a/sample-app-encrypt/src/main/res/layout/activity_main.xml +++ b/sample-app-encrypt/src/main/res/layout/activity_main.xml @@ -1,18 +1,39 @@ - - + + + android:paddingBottom="@dimen/activity_vertical_margin" + android:paddingLeft="@dimen/activity_horizontal_margin" + android:paddingRight="@dimen/activity_horizontal_margin" + android:paddingTop="@dimen/activity_vertical_margin" + tools:context="com.sample.encrypt.MainActivity"> - + android:textColor="@android:color/black" + android:onClick="showDebugDbAddress" + android:layout_gravity="center" + android:text="@string/show_debug_db_address" /> - \ No newline at end of file + diff --git a/sample-app-encrypt/src/main/res/values/strings.xml b/sample-app-encrypt/src/main/res/values/strings.xml index 4e9db46..5de66ea 100644 --- a/sample-app-encrypt/src/main/res/values/strings.xml +++ b/sample-app-encrypt/src/main/res/values/strings.xml @@ -1,3 +1,4 @@ Sample App Encrypt + Show Debug Db Address diff --git a/sample-app/build.gradle b/sample-app/build.gradle index fbc380c..b81a721 100644 --- a/sample-app/build.gradle +++ b/sample-app/build.gradle @@ -32,7 +32,6 @@ android { buildTypes { debug { resValue("string", "PORT_NUMBER", "8080") - resValue("string", "DB_PASSWORD_PERSON", "a_password") } release { minifyEnabled false @@ -42,9 +41,8 @@ android { } dependencies { - debugImplementation project(':debug-db-encrypt') + debugImplementation project(':debug-db') implementation 'com.android.support:appcompat-v7:28.0.0' - implementation 'net.zetetic:android-database-sqlcipher:3.5.9' implementation 'android.arch.persistence.room:runtime:1.1.1' annotationProcessor 'android.arch.persistence.room:compiler:1.1.1' testImplementation 'junit:junit:4.12' diff --git a/sample-app/src/main/java/com/sample/MainActivity.java b/sample-app/src/main/java/com/sample/MainActivity.java index 3634b36..79d86ac 100644 --- a/sample-app/src/main/java/com/sample/MainActivity.java +++ b/sample-app/src/main/java/com/sample/MainActivity.java @@ -30,7 +30,6 @@ import com.sample.database.CarDBHelper; import com.sample.database.ContactDBHelper; import com.sample.database.ExtTestDBHelper; -import com.sample.database.PersonDBHelper; import com.sample.database.room.User; import com.sample.database.room.UserDBHelper; import com.sample.utils.Utils; @@ -101,17 +100,6 @@ protected void onCreate(Bundle savedInstanceState) { } } - // Create Person encrypted database - PersonDBHelper personDBHelper = new PersonDBHelper(getApplicationContext()); - if (personDBHelper.count() == 0) { - for (int i = 0; i < 100; i++) { - String firstName = PersonDBHelper.PERSON_COLUMN_FIRST_NAME + "_" + i; - String lastName = PersonDBHelper.PERSON_COLUMN_LAST_NAME + "_" + i; - String address = PersonDBHelper.PERSON_COLUMN_ADDRESS + "_" + i; - personDBHelper.insertPerson(firstName, lastName, address); - } - } - // Room database UserDBHelper userDBHelper = new UserDBHelper(getApplicationContext()); if (userDBHelper.count() == 0) { diff --git a/settings.gradle b/settings.gradle index 1cdd68f..b36a834 100644 --- a/settings.gradle +++ b/settings.gradle @@ -17,4 +17,4 @@ * */ -include ':app', ':debug-db-base', ':debug-db', ':debug-db-encrypt' +include ':sample-app', ':debug-db-base', ':debug-db', ':debug-db-encrypt', ':sample-app-encrypt' From 92de6c4944ac089436065e0874486fe3d046fd46 Mon Sep 17 00:00:00 2001 From: amitshekhariitbhu Date: Sat, 16 Feb 2019 09:41:37 +0530 Subject: [PATCH 07/13] Update gradle --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 7153aea..d2353ea 100644 --- a/build.gradle +++ b/build.gradle @@ -23,7 +23,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.3.0' + classpath 'com.android.tools.build:gradle:3.3.1' classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.4' classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1' } From c08ba2519a542e92fe19714f8ec51be22b458003 Mon Sep 17 00:00:00 2001 From: amitshekhariitbhu Date: Sat, 16 Feb 2019 10:33:07 +0530 Subject: [PATCH 08/13] Add FailOnError False for Javadoc --- debug-db-base/debug-db-base-upload.gradle | 1 + debug-db-encrypt/debug-db-encrypt-upload.gradle | 1 + debug-db/debug-db-upload.gradle | 1 + 3 files changed, 3 insertions(+) diff --git a/debug-db-base/debug-db-base-upload.gradle b/debug-db-base/debug-db-base-upload.gradle index 797abd0..1fc145e 100755 --- a/debug-db-base/debug-db-base-upload.gradle +++ b/debug-db-base/debug-db-base-upload.gradle @@ -67,6 +67,7 @@ task sourcesJar(type: Jar) { task javadoc(type: Javadoc) { source = android.sourceSets.main.java.srcDirs + failOnError false classpath += project.files(android.getBootClasspath().join(File.pathSeparator)) classpath += configurations.compile } diff --git a/debug-db-encrypt/debug-db-encrypt-upload.gradle b/debug-db-encrypt/debug-db-encrypt-upload.gradle index 2132ec6..cfbf250 100755 --- a/debug-db-encrypt/debug-db-encrypt-upload.gradle +++ b/debug-db-encrypt/debug-db-encrypt-upload.gradle @@ -67,6 +67,7 @@ task sourcesJar(type: Jar) { task javadoc(type: Javadoc) { source = android.sourceSets.main.java.srcDirs + failOnError false classpath += project.files(android.getBootClasspath().join(File.pathSeparator)) classpath += configurations.compile } diff --git a/debug-db/debug-db-upload.gradle b/debug-db/debug-db-upload.gradle index 744a524..bac7d85 100755 --- a/debug-db/debug-db-upload.gradle +++ b/debug-db/debug-db-upload.gradle @@ -67,6 +67,7 @@ task sourcesJar(type: Jar) { task javadoc(type: Javadoc) { source = android.sourceSets.main.java.srcDirs + failOnError false classpath += project.files(android.getBootClasspath().join(File.pathSeparator)) classpath += configurations.compile } From 3d3a2320e039da86cdc5ef67353899410d9c2227 Mon Sep 17 00:00:00 2001 From: amitshekhariitbhu Date: Mon, 18 Feb 2019 13:29:33 +0530 Subject: [PATCH 09/13] Add info for encrypt --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 82c307d..0e4fc8c 100644 --- a/README.md +++ b/README.md @@ -43,6 +43,12 @@ Add this to your app's build.gradle debugImplementation 'com.amitshekhar.android:debug-db:1.0.5' ``` +Using the Android Debug Database with encrypted database + +```groovy +debugImplementation 'com.amitshekhar.android:debug-db-encrypt:1.0.5' +``` + Use `debugImplementation` so that it will only compile in your debug build and not in your release build. That’s all, just start the application, you will see in the logcat an entry like follows : From 6b4db146d534776a0c4363b38a2a7ce0845903eb Mon Sep 17 00:00:00 2001 From: amitshekhariitbhu Date: Mon, 18 Feb 2019 13:41:57 +0530 Subject: [PATCH 10/13] Update CHANGELOG.md --- CHANGELOG.md | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dcdfbf1..4153b53 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,15 @@ Change Log ========== +Version 1.0.5 *(2019-02-18)* +---------------------------- + +* Reduce size by taking out encrypted database library as a separate module +* New: Add support for database delete +* Changed compile to implementation +* Fix: Minor bug fixes + + Version 1.0.4 *(2018-06-23)* ---------------------------- @@ -48,7 +57,7 @@ Version 0.5.0 *(2017-01-21)* * New: Export DB * New: Method to get DB version -* Fix: Fix prouard issue and other minor issues +* Fix: Fix proguard issue and other minor issues Version 0.4.0 *(2016-11-29)* From bae78e95bfb847e14c43c844e3e062ca215717a6 Mon Sep 17 00:00:00 2001 From: amitshekhariitbhu Date: Sat, 23 Feb 2019 10:20:26 +0530 Subject: [PATCH 11/13] Change implementation to api --- debug-db-encrypt/build.gradle | 2 +- debug-db/build.gradle | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/debug-db-encrypt/build.gradle b/debug-db-encrypt/build.gradle index e883bc9..ab7d87a 100644 --- a/debug-db-encrypt/build.gradle +++ b/debug-db-encrypt/build.gradle @@ -18,7 +18,7 @@ android { } dependencies { - implementation project(':debug-db-base') + api project(':debug-db-base') implementation 'net.zetetic:android-database-sqlcipher:3.5.9' testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.2' diff --git a/debug-db/build.gradle b/debug-db/build.gradle index 41f9805..c6f76ed 100644 --- a/debug-db/build.gradle +++ b/debug-db/build.gradle @@ -18,7 +18,7 @@ android { } dependencies { - implementation project(':debug-db-base') + api project(':debug-db-base') testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' From c227bcca0962e562fa857e3fc1317ebeaff3ed01 Mon Sep 17 00:00:00 2001 From: amitshekhariitbhu Date: Thu, 7 Mar 2019 15:16:56 +0530 Subject: [PATCH 12/13] Fix select query error --- .../com/amitshekhar/utils/DatabaseHelper.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/debug-db-base/src/main/java/com/amitshekhar/utils/DatabaseHelper.java b/debug-db-base/src/main/java/com/amitshekhar/utils/DatabaseHelper.java index 4acaf9a..adf36e6 100644 --- a/debug-db-base/src/main/java/com/amitshekhar/utils/DatabaseHelper.java +++ b/debug-db-base/src/main/java/com/amitshekhar/utils/DatabaseHelper.java @@ -124,6 +124,25 @@ public static TableDataResponse getTableData(SQLiteDB db, String selectQuery, St tableData.isSuccessful = true; tableData.rows = new ArrayList<>(); + + String[] columnNames = cursor.getColumnNames(); + + List tableInfoListModified = new ArrayList<>(); + + for (String columnName : columnNames) { + for (TableDataResponse.TableInfo tableInfo : tableData.tableInfos) { + if (columnName.equals(tableInfo.title)) { + tableInfoListModified.add(tableInfo); + break; + } + } + } + + if (tableData.tableInfos.size() != tableInfoListModified.size()) { + tableData.tableInfos = tableInfoListModified; + tableData.isEditable = false; + } + if (cursor.getCount() > 0) { do { From cfdf936f764aedcaea3d4b28da4904ddcad8a69b Mon Sep 17 00:00:00 2001 From: amitshekhariitbhu Date: Thu, 7 Mar 2019 15:20:58 +0530 Subject: [PATCH 13/13] Bump version to 1.0.6 --- CHANGELOG.md | 7 +++++++ README.md | 4 ++-- debug-db-base/debug-db-base-upload.gradle | 2 +- debug-db-encrypt/debug-db-encrypt-upload.gradle | 2 +- debug-db/debug-db-upload.gradle | 2 +- 5 files changed, 12 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4153b53..27b7bb9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,13 @@ Change Log ========== +Version 1.0.6 *(2019-03-07)* +---------------------------- + +* Fix: Fix query error +* Fix: Fix DebugDb class not found error + + Version 1.0.5 *(2019-02-18)* ---------------------------- diff --git a/README.md b/README.md index 0e4fc8c..41ef88c 100644 --- a/README.md +++ b/README.md @@ -40,13 +40,13 @@ Add this to your app's build.gradle ```groovy -debugImplementation 'com.amitshekhar.android:debug-db:1.0.5' +debugImplementation 'com.amitshekhar.android:debug-db:1.0.6' ``` Using the Android Debug Database with encrypted database ```groovy -debugImplementation 'com.amitshekhar.android:debug-db-encrypt:1.0.5' +debugImplementation 'com.amitshekhar.android:debug-db-encrypt:1.0.6' ``` Use `debugImplementation` so that it will only compile in your debug build and not in your release build. diff --git a/debug-db-base/debug-db-base-upload.gradle b/debug-db-base/debug-db-base-upload.gradle index 1fc145e..62d53ba 100755 --- a/debug-db-base/debug-db-base-upload.gradle +++ b/debug-db-base/debug-db-base-upload.gradle @@ -24,7 +24,7 @@ def siteUrl = 'https://github.com/amitshekhariitbhu/Android-Debug-Database' def gitUrl = 'https://github.com/amitshekhariitbhu/Android-Debug-Database.git' group = "com.amitshekhar.android" -version = '1.0.5' +version = '1.0.6' install { repositories.mavenInstaller { diff --git a/debug-db-encrypt/debug-db-encrypt-upload.gradle b/debug-db-encrypt/debug-db-encrypt-upload.gradle index cfbf250..6f60e6a 100755 --- a/debug-db-encrypt/debug-db-encrypt-upload.gradle +++ b/debug-db-encrypt/debug-db-encrypt-upload.gradle @@ -24,7 +24,7 @@ def siteUrl = 'https://github.com/amitshekhariitbhu/Android-Debug-Database' def gitUrl = 'https://github.com/amitshekhariitbhu/Android-Debug-Database.git' group = "com.amitshekhar.android" -version = '1.0.5' +version = '1.0.6' install { repositories.mavenInstaller { diff --git a/debug-db/debug-db-upload.gradle b/debug-db/debug-db-upload.gradle index bac7d85..b4dfd79 100755 --- a/debug-db/debug-db-upload.gradle +++ b/debug-db/debug-db-upload.gradle @@ -24,7 +24,7 @@ def siteUrl = 'https://github.com/amitshekhariitbhu/Android-Debug-Database' def gitUrl = 'https://github.com/amitshekhariitbhu/Android-Debug-Database.git' group = "com.amitshekhar.android" -version = '1.0.5' +version = '1.0.6' install { repositories.mavenInstaller {