From ae0dbd2937d85565be004a942535d7a1ccbee1e0 Mon Sep 17 00:00:00 2001 From: spuday90 Date: Fri, 9 Jul 2021 08:21:13 +0530 Subject: [PATCH 01/28] refactor move App class to logs package --- .../java/com/parishod/watomatic/adapter/SupportedAppsAdapter.kt | 2 +- .../java/com/parishod/watomatic/fragment/EnabledAppsFragment.kt | 2 +- .../main/java/com/parishod/watomatic/fragment/MainFragment.java | 2 +- .../main/java/com/parishod/watomatic/model/{ => logs}/App.kt | 2 +- .../watomatic/model/preferences/PreferencesManager.java | 2 +- .../main/java/com/parishod/watomatic/model/utils/Constants.kt | 2 +- .../com/parishod/watomatic/model/utils/NotificationHelper.java | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) rename app/src/main/java/com/parishod/watomatic/model/{ => logs}/App.kt (64%) diff --git a/app/src/main/java/com/parishod/watomatic/adapter/SupportedAppsAdapter.kt b/app/src/main/java/com/parishod/watomatic/adapter/SupportedAppsAdapter.kt index b9077ddb8..e22d6ad81 100644 --- a/app/src/main/java/com/parishod/watomatic/adapter/SupportedAppsAdapter.kt +++ b/app/src/main/java/com/parishod/watomatic/adapter/SupportedAppsAdapter.kt @@ -11,7 +11,7 @@ import android.widget.Toast import androidx.recyclerview.widget.RecyclerView import com.google.android.material.switchmaterial.SwitchMaterial import com.parishod.watomatic.R -import com.parishod.watomatic.model.App +import com.parishod.watomatic.model.logs.App import com.parishod.watomatic.model.preferences.PreferencesManager import com.parishod.watomatic.model.utils.Constants import kotlinx.android.synthetic.main.supported_apps_list.view.* diff --git a/app/src/main/java/com/parishod/watomatic/fragment/EnabledAppsFragment.kt b/app/src/main/java/com/parishod/watomatic/fragment/EnabledAppsFragment.kt index 8e45eae0a..4498132d6 100644 --- a/app/src/main/java/com/parishod/watomatic/fragment/EnabledAppsFragment.kt +++ b/app/src/main/java/com/parishod/watomatic/fragment/EnabledAppsFragment.kt @@ -8,7 +8,7 @@ import androidx.fragment.app.Fragment import androidx.recyclerview.widget.LinearLayoutManager import com.parishod.watomatic.R import com.parishod.watomatic.adapter.SupportedAppsAdapter -import com.parishod.watomatic.model.App +import com.parishod.watomatic.model.logs.App import com.parishod.watomatic.model.utils.Constants import kotlinx.android.synthetic.main.fragment_enabled_apps.view.* diff --git a/app/src/main/java/com/parishod/watomatic/fragment/MainFragment.java b/app/src/main/java/com/parishod/watomatic/fragment/MainFragment.java index ebc2e8a88..c686e71e5 100644 --- a/app/src/main/java/com/parishod/watomatic/fragment/MainFragment.java +++ b/app/src/main/java/com/parishod/watomatic/fragment/MainFragment.java @@ -43,7 +43,7 @@ import com.parishod.watomatic.activity.enabledapps.EnabledAppsActivity; import com.parishod.watomatic.activity.settings.SettingsActivity; import com.parishod.watomatic.adapter.SupportedAppsAdapter; -import com.parishod.watomatic.model.App; +import com.parishod.watomatic.model.logs.App; import com.parishod.watomatic.model.CustomRepliesData; import com.parishod.watomatic.model.preferences.PreferencesManager; import com.parishod.watomatic.model.utils.Constants; diff --git a/app/src/main/java/com/parishod/watomatic/model/App.kt b/app/src/main/java/com/parishod/watomatic/model/logs/App.kt similarity index 64% rename from app/src/main/java/com/parishod/watomatic/model/App.kt rename to app/src/main/java/com/parishod/watomatic/model/logs/App.kt index afe714ce2..25589cf37 100644 --- a/app/src/main/java/com/parishod/watomatic/model/App.kt +++ b/app/src/main/java/com/parishod/watomatic/model/logs/App.kt @@ -1,4 +1,4 @@ -package com.parishod.watomatic.model +package com.parishod.watomatic.model.logs data class App( val name:String, diff --git a/app/src/main/java/com/parishod/watomatic/model/preferences/PreferencesManager.java b/app/src/main/java/com/parishod/watomatic/model/preferences/PreferencesManager.java index b1216a024..fb7408a8b 100644 --- a/app/src/main/java/com/parishod/watomatic/model/preferences/PreferencesManager.java +++ b/app/src/main/java/com/parishod/watomatic/model/preferences/PreferencesManager.java @@ -9,7 +9,7 @@ import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import com.parishod.watomatic.R; -import com.parishod.watomatic.model.App; +import com.parishod.watomatic.model.logs.App; import com.parishod.watomatic.model.utils.AppUtils; import com.parishod.watomatic.model.utils.Constants; diff --git a/app/src/main/java/com/parishod/watomatic/model/utils/Constants.kt b/app/src/main/java/com/parishod/watomatic/model/utils/Constants.kt index dcf5516e4..e1677f980 100644 --- a/app/src/main/java/com/parishod/watomatic/model/utils/Constants.kt +++ b/app/src/main/java/com/parishod/watomatic/model/utils/Constants.kt @@ -1,6 +1,6 @@ package com.parishod.watomatic.model.utils -import com.parishod.watomatic.model.App +import com.parishod.watomatic.model.logs.App object Constants { const val PERMISSION_DIALOG_TITLE = "permission_dialog_title" diff --git a/app/src/main/java/com/parishod/watomatic/model/utils/NotificationHelper.java b/app/src/main/java/com/parishod/watomatic/model/utils/NotificationHelper.java index c6c0e2a5c..786e1696a 100644 --- a/app/src/main/java/com/parishod/watomatic/model/utils/NotificationHelper.java +++ b/app/src/main/java/com/parishod/watomatic/model/utils/NotificationHelper.java @@ -14,7 +14,7 @@ import com.parishod.watomatic.BuildConfig; import com.parishod.watomatic.R; import com.parishod.watomatic.activity.notification.NotificationIntentActivity; -import com.parishod.watomatic.model.App; +import com.parishod.watomatic.model.logs.App; import org.json.JSONException; import org.json.JSONObject; From 341af96f215c4ff91be8401b9ad50e98e45e9ec8 Mon Sep 17 00:00:00 2001 From: spuday90 Date: Fri, 9 Jul 2021 08:26:56 +0530 Subject: [PATCH 02/28] convert App class to Room Entity --- .../main/java/com/parishod/watomatic/model/logs/App.kt | 10 ++++++++-- .../model/preferences/PreferencesManager.java | 2 +- .../com/parishod/watomatic/model/utils/Constants.kt | 4 ++-- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/parishod/watomatic/model/logs/App.kt b/app/src/main/java/com/parishod/watomatic/model/logs/App.kt index 25589cf37..a9ed95eef 100644 --- a/app/src/main/java/com/parishod/watomatic/model/logs/App.kt +++ b/app/src/main/java/com/parishod/watomatic/model/logs/App.kt @@ -1,6 +1,12 @@ package com.parishod.watomatic.model.logs +import androidx.room.ColumnInfo +import androidx.room.Entity +import androidx.room.PrimaryKey + +@Entity(tableName = "supported_apps") data class App( - val name:String, - val packageName:String, + @PrimaryKey(autoGenerate = true) val id:Int, + @ColumnInfo(name = "app_name") val name:String, + @ColumnInfo(name = "package_name") val packageName:String, ) \ No newline at end of file diff --git a/app/src/main/java/com/parishod/watomatic/model/preferences/PreferencesManager.java b/app/src/main/java/com/parishod/watomatic/model/preferences/PreferencesManager.java index fb7408a8b..14b2f64c9 100644 --- a/app/src/main/java/com/parishod/watomatic/model/preferences/PreferencesManager.java +++ b/app/src/main/java/com/parishod/watomatic/model/preferences/PreferencesManager.java @@ -124,7 +124,7 @@ public Set getEnabledApps(){ // For upgrading users, preserve functionality by enabling only WhatsApp // (remove this when time most users would have updated. May be in 3 weeks after deploying this?) if (enabledAppsJsonStr == null || enabledAppsJsonStr.equals("[]")) { - enabledAppsJsonStr = setAppsAsEnabled(Collections.singleton(new App("WhatsApp", "com.whatsapp"))); + enabledAppsJsonStr = setAppsAsEnabled(Collections.singleton(new App(1, "WhatsApp", "com.whatsapp"))); } Type type = new TypeToken>(){}.getType(); diff --git a/app/src/main/java/com/parishod/watomatic/model/utils/Constants.kt b/app/src/main/java/com/parishod/watomatic/model/utils/Constants.kt index e1677f980..9094ec8b8 100644 --- a/app/src/main/java/com/parishod/watomatic/model/utils/Constants.kt +++ b/app/src/main/java/com/parishod/watomatic/model/utils/Constants.kt @@ -25,8 +25,8 @@ object Constants { */ @JvmField val SUPPORTED_APPS: Set = setOf( - App("WhatsApp", "com.whatsapp"), - App("Facebook Messenger", "com.facebook.orca"), + App(1, "WhatsApp", "com.whatsapp"), + App(2, "Facebook Messenger", "com.facebook.orca"), // App("Facebook Messenger Lite", "com.facebook.mlite"), ) From 2414229da0ace7d58d0d98bf3b00d33e09245512 Mon Sep 17 00:00:00 2001 From: spuday90 Date: Fri, 9 Jul 2021 08:29:56 +0530 Subject: [PATCH 03/28] create interface to read and write supported app data to db --- .../3.json | 155 ++++++++++++++++++ .../watomatic/model/logs/MessageLogsDB.java | 4 +- .../model/logs/SupportedAppsDao.java | 15 ++ 3 files changed, 173 insertions(+), 1 deletion(-) create mode 100644 app/schemas/com.parishod.watomatic.model.logs.MessageLogsDB/3.json create mode 100644 app/src/main/java/com/parishod/watomatic/model/logs/SupportedAppsDao.java diff --git a/app/schemas/com.parishod.watomatic.model.logs.MessageLogsDB/3.json b/app/schemas/com.parishod.watomatic.model.logs.MessageLogsDB/3.json new file mode 100644 index 000000000..1663dfdbc --- /dev/null +++ b/app/schemas/com.parishod.watomatic.model.logs.MessageLogsDB/3.json @@ -0,0 +1,155 @@ +{ + "formatVersion": 1, + "database": { + "version": 3, + "identityHash": "f0a16badd4937ca91d1282f6c510fd7d", + "entities": [ + { + "tableName": "message_logs", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `index` INTEGER NOT NULL, `notif_id` TEXT, `notif_title` TEXT, `notif_arrived_time` INTEGER NOT NULL, `notif_is_replied` INTEGER NOT NULL, `notif_replied_msg` TEXT, `notif_reply_time` INTEGER NOT NULL, FOREIGN KEY(`index`) REFERENCES `app_packages`(`index`) ON UPDATE NO ACTION ON DELETE CASCADE )", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "index", + "columnName": "index", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "notifId", + "columnName": "notif_id", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "notifTitle", + "columnName": "notif_title", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "notifArrivedTime", + "columnName": "notif_arrived_time", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "notifIsReplied", + "columnName": "notif_is_replied", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "notifRepliedMsg", + "columnName": "notif_replied_msg", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "notifReplyTime", + "columnName": "notif_reply_time", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [ + { + "name": "index_message_logs_index", + "unique": false, + "columnNames": [ + "index" + ], + "createSql": "CREATE INDEX IF NOT EXISTS `index_message_logs_index` ON `${TABLE_NAME}` (`index`)" + } + ], + "foreignKeys": [ + { + "table": "app_packages", + "onDelete": "CASCADE", + "onUpdate": "NO ACTION", + "columns": [ + "index" + ], + "referencedColumns": [ + "index" + ] + } + ] + }, + { + "tableName": "app_packages", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`index` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `package_name` TEXT)", + "fields": [ + { + "fieldPath": "index", + "columnName": "index", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "packageName", + "columnName": "package_name", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "index" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "supported_apps", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `app_name` TEXT NOT NULL, `package_name` TEXT NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "app_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "packageName", + "columnName": "package_name", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + } + ], + "views": [], + "setupQueries": [ + "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'f0a16badd4937ca91d1282f6c510fd7d')" + ] + } +} \ No newline at end of file diff --git a/app/src/main/java/com/parishod/watomatic/model/logs/MessageLogsDB.java b/app/src/main/java/com/parishod/watomatic/model/logs/MessageLogsDB.java index 1b67a413c..677f86256 100644 --- a/app/src/main/java/com/parishod/watomatic/model/logs/MessageLogsDB.java +++ b/app/src/main/java/com/parishod/watomatic/model/logs/MessageLogsDB.java @@ -8,7 +8,7 @@ import com.parishod.watomatic.model.utils.Constants; -@Database(entities = {MessageLog.class, AppPackage.class}, version = 2) +@Database(entities = {MessageLog.class, AppPackage.class, App.class}, version = 3) public abstract class MessageLogsDB extends RoomDatabase { private static final String DB_NAME = Constants.LOGS_DB_NAME; private static MessageLogsDB _instance; @@ -26,4 +26,6 @@ public static synchronized MessageLogsDB getInstance(Context context){ public abstract MessageLogsDao logsDao(); public abstract AppPackageDao appPackageDao(); + + public abstract SupportedAppsDao supportedAppsDao(); } diff --git a/app/src/main/java/com/parishod/watomatic/model/logs/SupportedAppsDao.java b/app/src/main/java/com/parishod/watomatic/model/logs/SupportedAppsDao.java new file mode 100644 index 000000000..0f309b78e --- /dev/null +++ b/app/src/main/java/com/parishod/watomatic/model/logs/SupportedAppsDao.java @@ -0,0 +1,15 @@ +package com.parishod.watomatic.model.logs; + +import androidx.room.Dao; +import androidx.room.Insert; +import androidx.room.Query; + +import java.util.List; + +@Dao +public interface SupportedAppsDao { + @Query("SELECT * FROM supported_apps") + List getSupportedApps(); + @Insert + void insertSupportedApp(App app); +} From 42562ee673359ae65ef696760a82a98afea8a60a Mon Sep 17 00:00:00 2001 From: spuday90 Date: Fri, 9 Jul 2021 08:35:43 +0530 Subject: [PATCH 04/28] read/write supported app data from db --- .../watomatic/fragment/EnabledAppsFragment.kt | 4 +++- .../parishod/watomatic/fragment/MainFragment.java | 15 +++++++++++++-- .../model/preferences/PreferencesManager.java | 4 ++-- .../parishod/watomatic/model/utils/DbUtils.java | 14 ++++++++++++++ .../watomatic/model/utils/NotificationHelper.java | 12 +++++++++--- 5 files changed, 41 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/parishod/watomatic/fragment/EnabledAppsFragment.kt b/app/src/main/java/com/parishod/watomatic/fragment/EnabledAppsFragment.kt index 4498132d6..7c64df71d 100644 --- a/app/src/main/java/com/parishod/watomatic/fragment/EnabledAppsFragment.kt +++ b/app/src/main/java/com/parishod/watomatic/fragment/EnabledAppsFragment.kt @@ -10,6 +10,7 @@ import com.parishod.watomatic.R import com.parishod.watomatic.adapter.SupportedAppsAdapter import com.parishod.watomatic.model.logs.App import com.parishod.watomatic.model.utils.Constants +import com.parishod.watomatic.model.utils.DbUtils import kotlinx.android.synthetic.main.fragment_enabled_apps.view.* @@ -20,7 +21,8 @@ class EnabledAppsFragment: Fragment() { val layoutManager = LinearLayoutManager(context) - val supportedAppsAdapter = SupportedAppsAdapter(Constants.EnabledAppsDisplayType.VERTICAL, ArrayList(Constants.SUPPORTED_APPS)) + val dbUtils = DbUtils(context) + val supportedAppsAdapter = SupportedAppsAdapter(Constants.EnabledAppsDisplayType.VERTICAL, ArrayList(dbUtils.supportedApps)) view.supportedAppsList.layoutManager = layoutManager view.supportedAppsList.adapter = supportedAppsAdapter diff --git a/app/src/main/java/com/parishod/watomatic/fragment/MainFragment.java b/app/src/main/java/com/parishod/watomatic/fragment/MainFragment.java index c686e71e5..cecaa6908 100644 --- a/app/src/main/java/com/parishod/watomatic/fragment/MainFragment.java +++ b/app/src/main/java/com/parishod/watomatic/fragment/MainFragment.java @@ -88,6 +88,8 @@ public class MainFragment extends Fragment { private GridLayoutManager layoutManager; private SupportedAppsAdapter supportedAppsAdapter; private List enabledApps = new ArrayList<>(); + private Set supportedApps; + private DbUtils dbUtils; @Nullable @Override @@ -98,6 +100,16 @@ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup c mActivity = getActivity(); + dbUtils = new DbUtils(mActivity); + supportedApps = dbUtils.getSupportedApps(); + if(supportedApps.isEmpty()){ + supportedApps = Constants.SUPPORTED_APPS; + for (App app: supportedApps + ) { + dbUtils.insertSupportedApp(app); + } + } + customRepliesData = CustomRepliesData.getInstance(mActivity); preferencesManager = PreferencesManager.getPreferencesInstance(mActivity); @@ -191,7 +203,7 @@ private List getEnabledApps() { enabledApps.clear(); } enabledApps = new ArrayList<>(); - for(App app: Constants.SUPPORTED_APPS){ + for(App app: supportedApps){ if(preferencesManager.isAppEnabled(app)){ enabledApps.add(app); } @@ -293,7 +305,6 @@ public static boolean isAppInstalledFromStore(Context context) { } private boolean isAppUsedSufficientlyToAskRating(){ - DbUtils dbUtils = new DbUtils(mActivity); long firstRepliedTime = dbUtils.getFirstRepliedTime(); if(firstRepliedTime >0 && System.currentTimeMillis() - firstRepliedTime > 2 * 24 * 60 * 60 * 1000L && dbUtils.getNunReplies() >= MIN_REPLIES_TO_ASK_APP_RATING){ return true; diff --git a/app/src/main/java/com/parishod/watomatic/model/preferences/PreferencesManager.java b/app/src/main/java/com/parishod/watomatic/model/preferences/PreferencesManager.java index 14b2f64c9..5c5adbdab 100644 --- a/app/src/main/java/com/parishod/watomatic/model/preferences/PreferencesManager.java +++ b/app/src/main/java/com/parishod/watomatic/model/preferences/PreferencesManager.java @@ -11,7 +11,7 @@ import com.parishod.watomatic.R; import com.parishod.watomatic.model.logs.App; import com.parishod.watomatic.model.utils.AppUtils; -import com.parishod.watomatic.model.utils.Constants; +import com.parishod.watomatic.model.utils.DbUtils; import java.lang.reflect.Type; import java.util.Collection; @@ -68,7 +68,7 @@ private void init () { && !_sharedPrefs.contains(KEY_SELECTED_APPS_ARR); if (newInstall) { // Enable all supported apps for new install - setAppsAsEnabled(Constants.SUPPORTED_APPS); + setAppsAsEnabled(new DbUtils(thisAppContext).getSupportedApps()); // Set notifications ON for new installs setShowNotificationPref(true); diff --git a/app/src/main/java/com/parishod/watomatic/model/utils/DbUtils.java b/app/src/main/java/com/parishod/watomatic/model/utils/DbUtils.java index 1a0b6953a..bc349fcd0 100644 --- a/app/src/main/java/com/parishod/watomatic/model/utils/DbUtils.java +++ b/app/src/main/java/com/parishod/watomatic/model/utils/DbUtils.java @@ -4,10 +4,14 @@ import android.service.notification.StatusBarNotification; import com.parishod.watomatic.model.CustomRepliesData; +import com.parishod.watomatic.model.logs.App; import com.parishod.watomatic.model.logs.AppPackage; import com.parishod.watomatic.model.logs.MessageLog; import com.parishod.watomatic.model.logs.MessageLogsDB; +import java.util.HashSet; +import java.util.Set; + public class DbUtils { private Context mContext; private CustomRepliesData customRepliesData; @@ -48,4 +52,14 @@ public long getFirstRepliedTime(){ MessageLogsDB messageLogsDB = MessageLogsDB.getInstance(mContext.getApplicationContext()); return messageLogsDB.logsDao().getFirstRepliedTime(); } + + public Set getSupportedApps(){ + MessageLogsDB messageLogsDB = MessageLogsDB.getInstance(mContext.getApplicationContext()); + return new HashSet<>(messageLogsDB.supportedAppsDao().getSupportedApps()); + } + + public void insertSupportedApp(App app){ + MessageLogsDB messageLogsDB = MessageLogsDB.getInstance(mContext.getApplicationContext()); + messageLogsDB.supportedAppsDao().insertSupportedApp(app); + } } diff --git a/app/src/main/java/com/parishod/watomatic/model/utils/NotificationHelper.java b/app/src/main/java/com/parishod/watomatic/model/utils/NotificationHelper.java index 786e1696a..e0560b9d0 100644 --- a/app/src/main/java/com/parishod/watomatic/model/utils/NotificationHelper.java +++ b/app/src/main/java/com/parishod/watomatic/model/utils/NotificationHelper.java @@ -18,11 +18,15 @@ import org.json.JSONException; import org.json.JSONObject; +import java.util.Set; + public class NotificationHelper { final private Context appContext; private static NotificationHelper _INSTANCE; private static NotificationManager notificationManager; private static JSONObject appsList = new JSONObject(); + private Set supportedApps; + private DbUtils dbUtils; private NotificationHelper(Context appContext){ this.appContext = appContext; @@ -37,7 +41,9 @@ private void init() { notificationManager.createNotificationChannel(notificationChannel); } - for (App supportedApp: Constants.SUPPORTED_APPS) { + dbUtils = new DbUtils(appContext); + supportedApps = dbUtils.getSupportedApps(); + for (App supportedApp: supportedApps) { try { appsList.put(supportedApp.getPackageName(), false); } catch (JSONException e) { @@ -54,7 +60,7 @@ public static NotificationHelper getInstance (Context context) { } public void sendNotification(String title, String message, String packageName){ - for (App supportedApp: Constants.SUPPORTED_APPS) { + for (App supportedApp: supportedApps) { if(supportedApp.getPackageName().equalsIgnoreCase(packageName)){ title = supportedApp.getName() + ":" + title; break; @@ -78,7 +84,7 @@ public void sendNotification(String title, String message, String packageName){ //logic to detect if notifications exists else generate summary notification if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) { StatusBarNotification[] notifications = notificationManager.getActiveNotifications(); - for (App supportedApp: Constants.SUPPORTED_APPS) { + for (App supportedApp: supportedApps) { try { appsList.put(supportedApp.getPackageName(), false); } catch (JSONException e) { From 01fa773ea7fe5bd2069542fb4beb3c8c04af9b96 Mon Sep 17 00:00:00 2001 From: spuday90 Date: Fri, 9 Jul 2021 08:52:10 +0530 Subject: [PATCH 05/28] bugfix use packagename itself as primary key --- .../3.json | 16 +++++----------- .../com/parishod/watomatic/model/logs/App.kt | 3 +-- .../model/preferences/PreferencesManager.java | 2 +- .../parishod/watomatic/model/utils/Constants.kt | 4 ++-- 4 files changed, 9 insertions(+), 16 deletions(-) diff --git a/app/schemas/com.parishod.watomatic.model.logs.MessageLogsDB/3.json b/app/schemas/com.parishod.watomatic.model.logs.MessageLogsDB/3.json index 1663dfdbc..e7b848ea7 100644 --- a/app/schemas/com.parishod.watomatic.model.logs.MessageLogsDB/3.json +++ b/app/schemas/com.parishod.watomatic.model.logs.MessageLogsDB/3.json @@ -2,7 +2,7 @@ "formatVersion": 1, "database": { "version": 3, - "identityHash": "f0a16badd4937ca91d1282f6c510fd7d", + "identityHash": "7e7d32963dbe325d983a4c069be65e75", "entities": [ { "tableName": "message_logs", @@ -115,14 +115,8 @@ }, { "tableName": "supported_apps", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `app_name` TEXT NOT NULL, `package_name` TEXT NOT NULL)", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`app_name` TEXT NOT NULL, `package_name` TEXT NOT NULL, PRIMARY KEY(`package_name`))", "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "INTEGER", - "notNull": true - }, { "fieldPath": "name", "columnName": "app_name", @@ -138,9 +132,9 @@ ], "primaryKey": { "columnNames": [ - "id" + "package_name" ], - "autoGenerate": true + "autoGenerate": false }, "indices": [], "foreignKeys": [] @@ -149,7 +143,7 @@ "views": [], "setupQueries": [ "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", - "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'f0a16badd4937ca91d1282f6c510fd7d')" + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '7e7d32963dbe325d983a4c069be65e75')" ] } } \ No newline at end of file diff --git a/app/src/main/java/com/parishod/watomatic/model/logs/App.kt b/app/src/main/java/com/parishod/watomatic/model/logs/App.kt index a9ed95eef..1bdf492b2 100644 --- a/app/src/main/java/com/parishod/watomatic/model/logs/App.kt +++ b/app/src/main/java/com/parishod/watomatic/model/logs/App.kt @@ -6,7 +6,6 @@ import androidx.room.PrimaryKey @Entity(tableName = "supported_apps") data class App( - @PrimaryKey(autoGenerate = true) val id:Int, @ColumnInfo(name = "app_name") val name:String, - @ColumnInfo(name = "package_name") val packageName:String, + @PrimaryKey @ColumnInfo(name = "package_name") val packageName:String, ) \ No newline at end of file diff --git a/app/src/main/java/com/parishod/watomatic/model/preferences/PreferencesManager.java b/app/src/main/java/com/parishod/watomatic/model/preferences/PreferencesManager.java index 5c5adbdab..65578fe80 100644 --- a/app/src/main/java/com/parishod/watomatic/model/preferences/PreferencesManager.java +++ b/app/src/main/java/com/parishod/watomatic/model/preferences/PreferencesManager.java @@ -124,7 +124,7 @@ public Set getEnabledApps(){ // For upgrading users, preserve functionality by enabling only WhatsApp // (remove this when time most users would have updated. May be in 3 weeks after deploying this?) if (enabledAppsJsonStr == null || enabledAppsJsonStr.equals("[]")) { - enabledAppsJsonStr = setAppsAsEnabled(Collections.singleton(new App(1, "WhatsApp", "com.whatsapp"))); + enabledAppsJsonStr = setAppsAsEnabled(Collections.singleton(new App( "WhatsApp", "com.whatsapp"))); } Type type = new TypeToken>(){}.getType(); diff --git a/app/src/main/java/com/parishod/watomatic/model/utils/Constants.kt b/app/src/main/java/com/parishod/watomatic/model/utils/Constants.kt index 9094ec8b8..e1677f980 100644 --- a/app/src/main/java/com/parishod/watomatic/model/utils/Constants.kt +++ b/app/src/main/java/com/parishod/watomatic/model/utils/Constants.kt @@ -25,8 +25,8 @@ object Constants { */ @JvmField val SUPPORTED_APPS: Set = setOf( - App(1, "WhatsApp", "com.whatsapp"), - App(2, "Facebook Messenger", "com.facebook.orca"), + App("WhatsApp", "com.whatsapp"), + App("Facebook Messenger", "com.facebook.orca"), // App("Facebook Messenger Lite", "com.facebook.mlite"), ) From 7ce776514652415c7f944b79a0c2c4652bdefb7b Mon Sep 17 00:00:00 2001 From: spuday90 Date: Fri, 9 Jul 2021 09:01:36 +0530 Subject: [PATCH 06/28] implement feature to add custom app --- app/src/main/AndroidManifest.xml | 4 + .../customapp/CustomAppsAdditionActivity.kt | 13 ++++ .../fragment/AdvancedSettingsFragment.java | 9 ++- .../fragment/CustomAppsAdditionFragment.kt | 75 +++++++++++++++++++ .../main/res/layout/activity_custom_apps.xml | 21 ++++++ .../main/res/layout/fragment_custom_apps.xml | 73 ++++++++++++++++++ app/src/main/res/values/strings.xml | 4 + .../res/xml/fragment_advanced_settings.xml | 4 + 8 files changed, 202 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/com/parishod/watomatic/activity/customapp/CustomAppsAdditionActivity.kt create mode 100644 app/src/main/java/com/parishod/watomatic/fragment/CustomAppsAdditionFragment.kt create mode 100644 app/src/main/res/layout/activity_custom_apps.xml create mode 100644 app/src/main/res/layout/fragment_custom_apps.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7242233a0..a70dfb787 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -87,6 +87,10 @@ android:label="@string/donations_activity_title" android:parentActivityName=".activity.main.MainActivity"/> + + { + startActivity(new Intent(getActivity(), CustomAppsAdditionActivity.class)); + return true; + }); } } diff --git a/app/src/main/java/com/parishod/watomatic/fragment/CustomAppsAdditionFragment.kt b/app/src/main/java/com/parishod/watomatic/fragment/CustomAppsAdditionFragment.kt new file mode 100644 index 000000000..3a677ab00 --- /dev/null +++ b/app/src/main/java/com/parishod/watomatic/fragment/CustomAppsAdditionFragment.kt @@ -0,0 +1,75 @@ +package com.parishod.watomatic.fragment + +import android.os.Bundle +import android.text.Editable +import android.text.TextWatcher +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.Toast +import androidx.fragment.app.Fragment +import com.parishod.watomatic.R +import com.parishod.watomatic.model.logs.App + +import com.parishod.watomatic.model.utils.DbUtils +import kotlinx.android.synthetic.main.fragment_custom_apps.view.* + +class CustomAppsAdditionFragment: Fragment() { + lateinit var fragmentView: View + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + fragmentView = inflater.inflate(R.layout.fragment_custom_apps, container, false) + + fragmentView.customAppTextInputEditText.addTextChangedListener(object : TextWatcher { + override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { + + } + override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { + fragmentView.customAppTextInputLayout.isErrorEnabled = false + } + + override fun afterTextChanged(s: Editable?) { + + } + }) + fragmentView.customPackageTextInputEditText.addTextChangedListener(object : TextWatcher { + override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { + + } + override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { + fragmentView.customPackageTextInputLayout.isErrorEnabled = false + } + + override fun afterTextChanged(s: Editable?) { + + } + }) + fragmentView.saveCustomPackageBtn.setOnClickListener{ + when { + fragmentView.customAppTextInputEditText.text.isNullOrEmpty() -> { + fragmentView.customAppTextInputLayout.isErrorEnabled = true + fragmentView.customAppTextInputLayout.error = "App name cannot be empty" + } + fragmentView.customPackageTextInputEditText.text.isNullOrEmpty() -> { + fragmentView.customPackageTextInputLayout.isErrorEnabled = true + fragmentView.customPackageTextInputLayout.error = "Package name cannot be empty" + } + else -> { + val dbutils = DbUtils(activity) + val app = App( + fragmentView.customAppTextInputEditText.text.toString(), + fragmentView.customPackageTextInputEditText.text.toString() + ) + dbutils.insertSupportedApp(app) + (fragmentView.customAppTextInputEditText.text as Editable).clear() + (fragmentView.customPackageTextInputEditText.text as Editable).clear() + Toast.makeText(activity, "Custom App Saved", Toast.LENGTH_SHORT).show() + } + } + } + return fragmentView + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_custom_apps.xml b/app/src/main/res/layout/activity_custom_apps.xml new file mode 100644 index 000000000..2cce64df0 --- /dev/null +++ b/app/src/main/res/layout/activity_custom_apps.xml @@ -0,0 +1,21 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_custom_apps.xml b/app/src/main/res/layout/fragment_custom_apps.xml new file mode 100644 index 000000000..feabc4517 --- /dev/null +++ b/app/src/main/res/layout/fragment_custom_apps.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + +