From 246a02371ad1ba3e80befebe4f9e4bd7ab6aa777 Mon Sep 17 00:00:00 2001 From: Jens Date: Mon, 10 Jan 2022 23:00:36 +0100 Subject: [PATCH] notification action --- app/src/apkFlavor/AndroidManifest.xml | 1 + app/src/fdroidFlavor/AndroidManifest.xml | 1 + app/src/googlePlayFlavor/AndroidManifest.xml | 1 + .../java/com/jens/automation2/Action.java | 7 + .../java/com/jens/automation2/Actions.java | 14 +- ...ActivityManageActionCloseNotification.java | 405 ++++++++++++++++++ .../jens/automation2/ActivityManageRule.java | 43 +- ...ivity_manage_action_close_notification.xml | 147 +++++++ app/src/main/res/values/strings.xml | 2 + 9 files changed, 616 insertions(+), 5 deletions(-) create mode 100644 app/src/main/java/com/jens/automation2/ActivityManageActionCloseNotification.java create mode 100644 app/src/main/res/layout/activity_manage_action_close_notification.xml diff --git a/app/src/apkFlavor/AndroidManifest.xml b/app/src/apkFlavor/AndroidManifest.xml index 84884a9..dda2ec1 100644 --- a/app/src/apkFlavor/AndroidManifest.xml +++ b/app/src/apkFlavor/AndroidManifest.xml @@ -147,6 +147,7 @@ + diff --git a/app/src/fdroidFlavor/AndroidManifest.xml b/app/src/fdroidFlavor/AndroidManifest.xml index f8274d1..949361a 100644 --- a/app/src/fdroidFlavor/AndroidManifest.xml +++ b/app/src/fdroidFlavor/AndroidManifest.xml @@ -150,6 +150,7 @@ + diff --git a/app/src/googlePlayFlavor/AndroidManifest.xml b/app/src/googlePlayFlavor/AndroidManifest.xml index 761e0fe..dba361f 100644 --- a/app/src/googlePlayFlavor/AndroidManifest.xml +++ b/app/src/googlePlayFlavor/AndroidManifest.xml @@ -144,6 +144,7 @@ + diff --git a/app/src/main/java/com/jens/automation2/Action.java b/app/src/main/java/com/jens/automation2/Action.java index bb31d05..1a5da67 100644 --- a/app/src/main/java/com/jens/automation2/Action.java +++ b/app/src/main/java/com/jens/automation2/Action.java @@ -45,6 +45,7 @@ public class Action playSound, vibrate, createNotification, + closeNotification, sendTextMessage; public String getFullName(Context context) @@ -243,6 +244,9 @@ public class Action case createNotification: returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.createNotification)); break; + case closeNotification: + returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.closeNotifications)); + break; default: returnString.append(action.toString()); } @@ -460,6 +464,9 @@ public class Action case createNotification: Actions.createNotification(this); break; + case closeNotification: + Actions.closeNotification(this); + break; default: Miscellaneous.logEvent("w", "Action", context.getResources().getString(R.string.unknownActionSpecified), 3); break; diff --git a/app/src/main/java/com/jens/automation2/Actions.java b/app/src/main/java/com/jens/automation2/Actions.java index 0858fb4..03ded08 100644 --- a/app/src/main/java/com/jens/automation2/Actions.java +++ b/app/src/main/java/com/jens/automation2/Actions.java @@ -3,6 +3,7 @@ package com.jens.automation2; import android.Manifest; import android.annotation.SuppressLint; import android.annotation.TargetApi; +import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.app.admin.DevicePolicyManager; @@ -23,6 +24,7 @@ import android.os.PowerManager.WakeLock; import android.os.VibrationEffect; import android.os.Vibrator; import android.provider.MediaStore; +import android.service.notification.StatusBarNotification; import android.telephony.SmsManager; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; @@ -98,7 +100,17 @@ public class Actions } } - public static class WifiStuff + @RequiresApi(api = Build.VERSION_CODES.M) + public static void closeNotification(Action action) + { + NotificationManager nm = (NotificationManager) Miscellaneous.getAnyContext().getSystemService(Context.NOTIFICATION_SERVICE); + for(StatusBarNotification n : nm.getActiveNotifications()) + { + n. + } + } + + public static class WifiStuff { public static Boolean setWifi(Context context, Boolean desiredState, boolean toggleActionIfPossible) { diff --git a/app/src/main/java/com/jens/automation2/ActivityManageActionCloseNotification.java b/app/src/main/java/com/jens/automation2/ActivityManageActionCloseNotification.java new file mode 100644 index 0000000..a2691ec --- /dev/null +++ b/app/src/main/java/com/jens/automation2/ActivityManageActionCloseNotification.java @@ -0,0 +1,405 @@ +package com.jens.automation2; + +import static com.jens.automation2.Trigger.triggerParameter2Split; + +import android.app.Activity; +import android.app.AlertDialog; +import android.app.ProgressDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.pm.ActivityInfo; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.os.AsyncTask; +import android.os.Bundle; +import android.view.View; +import android.view.View.OnClickListener; +import android.widget.ArrayAdapter; +import android.widget.Button; +import android.widget.CheckBox; +import android.widget.CompoundButton; +import android.widget.EditText; +import android.widget.Spinner; +import android.widget.TextView; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +public class ActivityManageActionCloseNotification extends Activity +{ + public static final String intentNameNotificationApp = "app"; + public static final String intentNameNotificationTitleDir = "titleDir"; + public static final String intentNameNotificationTitle = "title"; + public static final String intentNameNotificationTextDir = "textDir"; + public static final String intentNameNotificationText = "text"; + public static final String intentNameNotificationDirection = "direction"; + + public static Trigger editedNotificationTrigger; + boolean edit = false; + ProgressDialog progressDialog = null; + + EditText etNotificationTitle, etNotificationText; + Button bSelectApp, bSaveTriggerNotification; + Spinner spinnerTitleDirection, spinnerTextDirection; + TextView tvSelectedApplication; + CheckBox chkNotificationDirection; + + private static List pInfos = null; + public static Trigger resultingTrigger; + + private static String[] directions; + + ArrayAdapter directionSpinnerAdapter; + + public static void getActivityList(final Context context) + { + if(pInfos == null) + { + pInfos = context.getPackageManager().getInstalledPackages(PackageManager.GET_ACTIVITIES); + Collections.sort(pInfos, new Comparator() + { + public int compare(PackageInfo obj1, PackageInfo obj2) + { + String name1 = ""; + String name2 = ""; + + ApplicationInfo aInfo1 = obj1.applicationInfo; + if (aInfo1 != null) + { + name1 = (String) context.getPackageManager().getApplicationLabel(aInfo1); + } + ApplicationInfo aInfo2 = obj2.applicationInfo; + if (aInfo2 != null) + { + name2 = (String) context.getPackageManager().getApplicationLabel(aInfo2); + } + + return name1.compareTo(name2); + } + }); + } + } + + public static String[] getApplicationNameListString(Context myContext) + { + // Generate the actual list + getActivityList(myContext); + + ArrayList returnList = new ArrayList(); + + for (PackageInfo pInfo : pInfos) + { + ApplicationInfo aInfo = pInfo.applicationInfo; + if (aInfo != null) + { + String aLabel; + + aLabel = (String) myContext.getPackageManager().getApplicationLabel(aInfo); + + ActivityInfo[] aInfos = pInfo.activities; + if (aInfos != null && aInfos.length > 0) // Only put Applications into the list that have packages. + { + if(!returnList.contains(aLabel)) + returnList.add(aLabel); + } + } + } + + return returnList.toArray(new String[returnList.size()]); + } + + public static String[] getPackageListString(Context myContext, String applicationLabel) + { + // Generate the actual list + getActivityList(myContext); + + ArrayList returnList = new ArrayList(); + + for (PackageInfo pInfo : pInfos) + { + if(myContext.getPackageManager().getApplicationLabel(pInfo.applicationInfo).equals(applicationLabel)) + { + ActivityInfo[] aInfos = pInfo.activities; + if (aInfos != null && aInfos.length > 0) + { + returnList.add(pInfo.packageName); + } + } + } + + return returnList.toArray(new String[returnList.size()]); + } + + public static String[] getPackageListString(Context myContext) + { + // Generate the actual list + getActivityList(myContext); + + ArrayList returnList = new ArrayList(); + + for (PackageInfo pInfo : pInfos) + { + ActivityInfo[] aInfos = pInfo.activities; + if (aInfos != null && aInfos.length > 0) + { + returnList.add(pInfo.packageName); + } + else + Miscellaneous.logEvent("w", "Empty Application", "Application " + myContext.getPackageManager().getApplicationLabel(pInfo.applicationInfo) + " doesn\'t have packages.", 5); + } + + return returnList.toArray(new String[returnList.size()]); + } + + public static String[] getActivityListForPackageName(String packageName) + { + ArrayList returnList = new ArrayList(); + + for (PackageInfo pInfo : pInfos) + { + if(pInfo.packageName.equals(packageName)) + { + ActivityInfo[] aInfos = pInfo.activities; + if (aInfos != null) + { + for (ActivityInfo activityInfo : aInfos) + { + returnList.add(activityInfo.name); + } + } + } + } + + return returnList.toArray(new String[returnList.size()]); + } + + public static ActivityInfo getActivityInfoForPackageNameAndActivityName(String packageName, String activityName) + { + for (PackageInfo pInfo : pInfos) + { + if(pInfo.packageName.equals(packageName)) + { + ActivityInfo[] aInfos = pInfo.activities; + if (aInfos != null) + { + for (ActivityInfo activityInfo : aInfos) + { + if(activityInfo.name.equals(activityName)) + return activityInfo; + } + } + } + } + + return null; + } + + private AlertDialog getActionStartActivityDialog1() + { + AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this); + alertDialogBuilder.setTitle(getResources().getString(R.string.selectApplication)); + final String[] applicationArray = ActivityManageActionCloseNotification.getApplicationNameListString(this); + alertDialogBuilder.setItems(applicationArray, new DialogInterface.OnClickListener() + { + @Override + public void onClick(DialogInterface dialog, int which) + { + dialog.dismiss(); + getActionStartActivityDialog2(applicationArray[which]).show(); + } + }); + AlertDialog alertDialog = alertDialogBuilder.create(); + + return alertDialog; + } + private AlertDialog getActionStartActivityDialog2(String applicationName) + { + AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this); + alertDialogBuilder.setTitle(getResources().getString(R.string.selectPackageOfApplication)); + final String[] packageArray = ActivityManageActionCloseNotification.getPackageListString(this, applicationName); + alertDialogBuilder.setItems(packageArray, new DialogInterface.OnClickListener() + { + @Override + public void onClick(DialogInterface dialog, int which) + { + //getActionStartActivityDialog3(packageArray[which]).show(); + //Miscellaneous.messageBox(getResources().getString(R.string.hint), getResources().getString(R.string.chooseActivityHint), ActivityManageNotificationTrigger.this).show(); + tvSelectedApplication.setText(packageArray[which]); + } + }); + AlertDialog alertDialog = alertDialogBuilder.create(); + + return alertDialog; + } + private AlertDialog getActionStartActivityDialog3(final String packageName) + { + AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this); + alertDialogBuilder.setTitle(getResources().getString(R.string.selectActivityToBeStarted)); + final String activityArray[] = ActivityManageActionCloseNotification.getActivityListForPackageName(packageName); + alertDialogBuilder.setItems(activityArray, new DialogInterface.OnClickListener() + { + @Override + public void onClick(DialogInterface dialog, int which) + { + ActivityInfo ai = ActivityManageActionCloseNotification.getActivityInfoForPackageNameAndActivityName(packageName, activityArray[which]); + tvSelectedApplication.setText(ai.packageName + ";" + ai.name); + } + }); + AlertDialog alertDialog = alertDialogBuilder.create(); + + return alertDialog; + } + + @Override + protected void onCreate(Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_manage_trigger_notification); + + etNotificationTitle = (EditText)findViewById(R.id.etNotificationTitle); + etNotificationText = (EditText)findViewById(R.id.etNotificationText); + bSelectApp = (Button)findViewById(R.id.bSelectApp); + bSaveTriggerNotification = (Button)findViewById(R.id.bSaveTriggerNotification); + spinnerTitleDirection = (Spinner)findViewById(R.id.spinnerTitleDirection); + spinnerTextDirection = (Spinner)findViewById(R.id.spinnerTextDirection); + tvSelectedApplication = (TextView)findViewById(R.id.etActivityOrActionPath); + chkNotificationDirection = (CheckBox)findViewById(R.id.chkNotificationDirection); + + directions = new String[] { + getResources().getString(R.string.directionStringEquals), + getResources().getString(R.string.directionStringContains), + getResources().getString(R.string.directionStringStartsWith), + getResources().getString(R.string.directionStringEndsWith), + getResources().getString(R.string.directionStringNotEquals) + }; + + directionSpinnerAdapter = new ArrayAdapter(this, R.layout.text_view_for_poi_listview_mediumtextsize, ActivityManageActionCloseNotification.directions); + spinnerTitleDirection.setAdapter(directionSpinnerAdapter); + spinnerTextDirection.setAdapter(directionSpinnerAdapter); + directionSpinnerAdapter.notifyDataSetChanged(); + + bSelectApp.setOnClickListener(new OnClickListener() + { + @Override + public void onClick(View v) + { + GetActivityListTask getActivityListTask = new GetActivityListTask(); + getActivityListTask.execute(); + progressDialog = ProgressDialog.show(ActivityManageActionCloseNotification.this, "", ActivityManageActionCloseNotification.this.getResources().getString(R.string.gettingListOfInstalledApplications)); + } + }); + + chkNotificationDirection.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() + { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) + { + if(isChecked) + chkNotificationDirection.setText(getResources().getString(R.string.notificationAppears)); + else + chkNotificationDirection.setText(getResources().getString(R.string.notificationDisappears)); + } + }); + + bSaveTriggerNotification.setOnClickListener(new OnClickListener() + { + @Override + public void onClick(View v) + { + String app; + if(tvSelectedApplication.getText().toString().equalsIgnoreCase(getResources().getString(R.string.anyApp))) + app = "-1"; + else + app = tvSelectedApplication.getText().toString(); + + String titleDir = Trigger.getMatchCode(spinnerTitleDirection.getSelectedItem().toString()); + String title = etNotificationTitle.getText().toString(); + String textDir = Trigger.getMatchCode(spinnerTextDirection.getSelectedItem().toString()); + String text = etNotificationText.getText().toString(); + + if(edit) + { + editedNotificationTrigger.setTriggerParameter(chkNotificationDirection.isChecked()); + editedNotificationTrigger.setTriggerParameter2(app + triggerParameter2Split + titleDir + triggerParameter2Split + title + triggerParameter2Split + textDir + triggerParameter2Split + text); + ActivityManageActionCloseNotification.this.setResult(RESULT_OK); + } + else + { + Intent data = new Intent(); + data.putExtra(intentNameNotificationDirection, chkNotificationDirection.isChecked()); + data.putExtra(intentNameNotificationApp, app); + data.putExtra(intentNameNotificationTitleDir, titleDir); + data.putExtra(intentNameNotificationTitle, title); + data.putExtra(intentNameNotificationTextDir, textDir); + data.putExtra(intentNameNotificationText, text); + ActivityManageActionCloseNotification.this.setResult(RESULT_OK, data); + } + + finish(); + } + }); + + Intent i = getIntent(); + if(i.getBooleanExtra("edit", false) == true) + { + edit = true; + loadValuesIntoGui(); + } + } + + private void loadValuesIntoGui() + { + chkNotificationDirection.setChecked(editedNotificationTrigger.getTriggerParameter()); + + String[] params = editedNotificationTrigger.getTriggerParameter2().split(triggerParameter2Split); + + String app = params[0]; + String titleDir = params[1]; + String title = params[2]; + String textDir = params[3]; + String text; + if (params.length >= 5) + text = params[4]; + else + text = ""; + + if(!app.equals("-1")) + tvSelectedApplication.setText(app); + + for(int i = 0; i < directions.length; i++) + { + if(Trigger.getMatchCode(directions[i]).equalsIgnoreCase(titleDir)) + spinnerTitleDirection.setSelection(i); + + if(Trigger.getMatchCode(directions[i]).equalsIgnoreCase(textDir)) + spinnerTextDirection.setSelection(i); + } + + if(title.length() > 0) + etNotificationTitle.setText(title); + + if(text.length() > 0) + etNotificationText.setText(text); + } + + private class GetActivityListTask extends AsyncTask + { + @Override + protected Void doInBackground(Void... params) + { + getActivityList(ActivityManageActionCloseNotification.this); + return null; + } + + @Override + protected void onPostExecute(Void result) + { + progressDialog.dismiss(); + getActionStartActivityDialog1().show(); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/jens/automation2/ActivityManageRule.java b/app/src/main/java/com/jens/automation2/ActivityManageRule.java index 6e49f4a..dbbee8b 100644 --- a/app/src/main/java/com/jens/automation2/ActivityManageRule.java +++ b/app/src/main/java/com/jens/automation2/ActivityManageRule.java @@ -102,7 +102,7 @@ public class ActivityManageRule extends Activity final static int requestCodeTriggerDeviceOrientationAdd = 301; final static int requestCodeTriggerDeviceOrientationEdit = 302; final static int requestCodeTriggerNotificationAdd = 8000; - final static int requestCodeTriggerNfcNotificationEdit = 8001; + final static int requestCodeTriggerNotificationEdit = 8001; final static int requestCodeActionPlaySoundAdd = 501; final static int requestCodeActionPlaySoundEdit = 502; final static int requestCodeTriggerPhoneCallAdd = 601; @@ -117,6 +117,8 @@ public class ActivityManageRule extends Activity final static int requestCodeActionVibrateEdit = 802; final static int requestCodeActionCreateNotificationAdd = 803; final static int requestCodeActionCreateNotificationEdit = 804; + final static int requestCodeActionCloseNotificationAdd = 805; + final static int requestCodeActionCloseNotificationEdit = 806; public static ActivityManageRule getInstance() { @@ -268,7 +270,7 @@ public class ActivityManageRule extends Activity ActivityManageTriggerNotification.editedNotificationTrigger = selectedTrigger; Intent notificationEditor = new Intent(ActivityManageRule.this, ActivityManageTriggerNotification.class); notificationEditor.putExtra("edit", true); - startActivityForResult(notificationEditor, requestCodeTriggerNfcNotificationEdit); + startActivityForResult(notificationEditor, requestCodeTriggerNotificationEdit); break; case phoneCall: ActivityManageTriggerPhoneCall.editedPhoneCallTrigger = selectedTrigger; @@ -371,6 +373,11 @@ public class ActivityManageRule extends Activity activityEditCreateNotificationIntent.putExtra(ActivityManageActionCreateNotification.intentNameNotificationText, elements[1]); startActivityForResult(activityEditCreateNotificationIntent, requestCodeActionCreateNotificationEdit); break; + case closeNotification: + Intent activityEditCloseNotificationIntent = new Intent(ActivityManageRule.this, ActivityManageActionCloseNotification.class); + activityEditCloseNotificationIntent.putExtra(intentNameActionParameter2, a.getParameter2()); + startActivityForResult(activityEditCloseNotificationIntent, requestCodeActionCloseNotificationEdit); + break; case playSound: Intent actionPlaySoundIntent = new Intent(context, ActivityManageActionPlaySound.class); actionPlaySoundIntent.putExtra("edit", true); @@ -1269,7 +1276,7 @@ public class ActivityManageRule extends Activity this.refreshTriggerList(); } } - else if(requestCode == requestCodeTriggerNfcNotificationEdit) + else if(requestCode == requestCodeTriggerNotificationEdit) { if(resultCode == RESULT_OK) { @@ -1390,6 +1397,16 @@ public class ActivityManageRule extends Activity this.refreshActionList(); } } + else if(requestCode == requestCodeActionCloseNotificationAdd) + { + if(resultCode == RESULT_OK) + { + newAction.setParentRule(ruleToEdit); + newAction.setParameter2(data.getStringExtra(intentNameActionParameter2)); + ruleToEdit.getActionSet().add(newAction); + this.refreshActionList(); + } + } else if(requestCode == requestCodeActionVibrateEdit) { if(resultCode == RESULT_OK) @@ -1418,6 +1435,18 @@ public class ActivityManageRule extends Activity this.refreshActionList(); } } + else if(requestCode == requestCodeActionCloseNotificationEdit) + { + if(resultCode == RESULT_OK) + { + ruleToEdit.getActionSet().get(editIndex).setParentRule(ruleToEdit); + + if(data.hasExtra(intentNameActionParameter2)) + ruleToEdit.getActionSet().get(editIndex).setParameter2(data.getStringExtra(intentNameActionParameter2)); + + this.refreshActionList(); + } + } else if(requestCode == requestCodeActionPlaySoundAdd) { if(resultCode == RESULT_OK) @@ -1728,6 +1757,12 @@ public class ActivityManageRule extends Activity Intent intent = new Intent(ActivityManageRule.this, ActivityManageActionCreateNotification.class); startActivityForResult(intent, requestCodeActionCreateNotificationAdd); } + else if(Action.getActionTypesAsArray()[which].toString().equals(Action_Enum.closeNotification.toString())) + { + newAction.setAction(Action_Enum.closeNotification); + Intent intent = new Intent(ActivityManageRule.this, ActivityManageActionCloseNotification.class); + startActivityForResult(intent, requestCodeActionCloseNotificationAdd); + } else if(Action.getActionTypesAsArray()[which].toString().equals(Action_Enum.setScreenBrightness.toString())) { newAction.setAction(Action_Enum.setScreenBrightness); @@ -1998,4 +2033,4 @@ public class ActivityManageRule extends Activity imm.hideSoftInputFromWindow(view.getWindowToken(), 0); } } -} +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_manage_action_close_notification.xml b/app/src/main/res/layout/activity_manage_action_close_notification.xml new file mode 100644 index 0000000..8737c4e --- /dev/null +++ b/app/src/main/res/layout/activity_manage_action_close_notification.xml @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + +