Skip to content

Commit 9f3ef2b

Browse files
authored
Merge pull request #3 from akaMrNagar/dev
Major improvements and bug fixes
2 parents cf6f6dd + b98c6a8 commit 9f3ef2b

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+1352
-836
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ migrate_working_dir/
3232
.pub-cache/
3333
.pub/
3434
/build/
35+
untranslated_strings.json
3536

3637
# Symbolication related
3738
app.*.symbols

android/app/src/main/java/com/mindful/android/MainActivity.java

Lines changed: 42 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -12,23 +12,16 @@
1212

1313
package com.mindful.android;
1414

15+
import static com.mindful.android.generics.ServiceBinder.ACTION_START_MINDFUL_SERVICE;
1516
import static com.mindful.android.helpers.NewActivitiesLaunchHelper.INTENT_EXTRA_IS_SELF_RESTART;
16-
import static com.mindful.android.services.EmergencyPauseService.ACTION_START_SERVICE_EMERGENCY;
17-
import static com.mindful.android.services.FocusSessionService.ACTION_START_FOCUS_SERVICE;
1817
import static com.mindful.android.services.OverlayDialogService.INTENT_EXTRA_PACKAGE_NAME;
1918

20-
import android.annotation.SuppressLint;
21-
import android.app.AlarmManager;
22-
import android.content.Context;
2319
import android.content.Intent;
2420
import android.content.res.Configuration;
25-
import android.net.Uri;
26-
import android.os.Build;
2721
import android.os.Bundle;
28-
import android.os.PowerManager;
29-
import android.provider.Settings;
30-
import android.widget.Toast;
3122

23+
import androidx.activity.result.ActivityResultLauncher;
24+
import androidx.activity.result.contract.ActivityResultContracts;
3225
import androidx.annotation.NonNull;
3326
import androidx.annotation.Nullable;
3427

@@ -66,17 +59,29 @@ public class MainActivity extends FlutterFragmentActivity implements MethodChann
6659
private SafeServiceConnection<MindfulTrackerService> mTrackerServiceConn;
6760
private SafeServiceConnection<MindfulVpnService> mVpnServiceConn;
6861
private SafeServiceConnection<FocusSessionService> mFocusServiceConn;
62+
private ActivityResultLauncher<Intent> mVpnPermissionLauncher;
6963

7064
@Override
7165
protected void onCreate(Bundle savedInstanceState) {
7266
super.onCreate(savedInstanceState);
7367

68+
// Store uncaught exceptions
69+
Thread.setDefaultUncaughtExceptionHandler((thread, exception) -> SharedPrefsHelper.insertCrashLogToPrefs(this, exception));
70+
7471
// Register notification channels
7572
NotificationHelper.registerNotificationChannels(this);
7673

7774
// Schedule midnight 12 task if already not scheduled
7875
AlarmTasksSchedulingHelper.scheduleMidnightResetTask(this, true);
7976

77+
// register permission launcher for result
78+
mVpnPermissionLauncher = registerForActivityResult(
79+
new ActivityResultContracts.StartActivityForResult(),
80+
result -> {
81+
// Ignored
82+
}
83+
);
84+
8085
// Initialize service connections
8186
mTrackerServiceConn = new SafeServiceConnection<>(MindfulTrackerService.class, this);
8287
mVpnServiceConn = new SafeServiceConnection<>(MindfulVpnService.class, this);
@@ -152,7 +157,15 @@ public void onMethodCall(@NonNull MethodCall call, @NonNull MethodChannel.Result
152157
result.success(true);
153158
break;
154159
}
155-
160+
case "getNativeCrashLogs": {
161+
result.success(SharedPrefsHelper.getCrashLogsArrayString(this));
162+
break;
163+
}
164+
case "clearNativeCrashLogs": {
165+
SharedPrefsHelper.clearCrashLogs(this);
166+
result.success(true);
167+
break;
168+
}
156169
// SECTION: Foreground service and Worker methods ---------------------------------------------------------------------------
157170
case "updateAppRestrictions": {
158171
HashMap<String, AppRestrictions> appRestrictions = SharedPrefsHelper.getSetAppRestrictions(this, Utils.notNullStr(call.arguments()));
@@ -172,7 +185,7 @@ public void onMethodCall(@NonNull MethodCall call, @NonNull MethodChannel.Result
172185
mVpnServiceConn.getService().updateBlockedApps(blockedApps);
173186
} else if (!blockedApps.isEmpty() && getAndAskVpnPermission(false)) {
174187
mVpnServiceConn.setOnConnectedCallback(service -> service.updateBlockedApps(blockedApps));
175-
mVpnServiceConn.startAndBind(MindfulVpnService.ACTION_START_SERVICE_VPN);
188+
mVpnServiceConn.startAndBind();
176189
}
177190
result.success(true);
178191
break;
@@ -189,6 +202,9 @@ public void onMethodCall(@NonNull MethodCall call, @NonNull MethodChannel.Result
189202
AlarmTasksSchedulingHelper.scheduleBedtimeRoutineTasks(this, bedtimeSettings);
190203
} else {
191204
AlarmTasksSchedulingHelper.cancelBedtimeRoutineTasks(this);
205+
if (bedtimeSettings.shouldStartDnd) {
206+
NotificationHelper.toggleDnd(this, false);
207+
}
192208
}
193209
result.success(true);
194210
break;
@@ -197,7 +213,7 @@ public void onMethodCall(@NonNull MethodCall call, @NonNull MethodChannel.Result
197213
if (!Utils.isServiceRunning(this, EmergencyPauseService.class.getName())
198214
&& Utils.isServiceRunning(this, MindfulTrackerService.class.getName())
199215
) {
200-
startService(new Intent(getApplicationContext(), EmergencyPauseService.class).setAction(ACTION_START_SERVICE_EMERGENCY));
216+
startService(new Intent(getApplicationContext(), EmergencyPauseService.class).setAction(ACTION_START_MINDFUL_SERVICE));
201217
result.success(true);
202218
} else {
203219
result.success(false);
@@ -210,7 +226,7 @@ public void onMethodCall(@NonNull MethodCall call, @NonNull MethodChannel.Result
210226
mFocusServiceConn.getService().updateFocusSession(focusSession);
211227
} else {
212228
mFocusServiceConn.setOnConnectedCallback(service -> service.startFocusSession(focusSession));
213-
mFocusServiceConn.startAndBind(ACTION_START_FOCUS_SERVICE);
229+
mFocusServiceConn.startAndBind();
214230
}
215231
result.success(true);
216232
break;
@@ -246,19 +262,19 @@ public void onMethodCall(@NonNull MethodCall call, @NonNull MethodChannel.Result
246262
break;
247263
}
248264
case "getAndAskIgnoreBatteryOptimizationPermission": {
249-
result.success(getAndAskIgnoreBatteryOptimizationPermission(Boolean.TRUE.equals(call.arguments())));
250-
break;
251-
}
252-
case "getAndAskVpnPermission": {
253-
result.success(getAndAskVpnPermission(Boolean.TRUE.equals(call.arguments())));
265+
result.success(PermissionsHelper.getAndAskIgnoreBatteryOptimizationPermission(this, Boolean.TRUE.equals(call.arguments())));
254266
break;
255267
}
256268
case "getAndAskDisplayOverlayPermission": {
257-
result.success(getAndAskDisplayOverlayPermission(Boolean.TRUE.equals(call.arguments())));
269+
result.success(PermissionsHelper.getAndAskDisplayOverlayPermission(this, Boolean.TRUE.equals(call.arguments())));
258270
break;
259271
}
260272
case "getAndAskExactAlarmPermission": {
261-
result.success(getAndAskExactAlarmPermission(Boolean.TRUE.equals(call.arguments())));
273+
result.success(PermissionsHelper.getAndAskExactAlarmPermission(this, Boolean.TRUE.equals(call.arguments())));
274+
break;
275+
}
276+
case "getAndAskVpnPermission": {
277+
result.success(getAndAskVpnPermission(Boolean.TRUE.equals(call.arguments())));
262278
break;
263279
}
264280
case "disableDeviceAdmin": {
@@ -269,12 +285,12 @@ public void onMethodCall(@NonNull MethodCall call, @NonNull MethodChannel.Result
269285

270286
// SECTION: New Activity Launch methods ------------------------------------------------------
271287
case "openAppWithPackage": {
272-
NewActivitiesLaunchHelper.openAppWithPackage(this, call.arguments());
288+
NewActivitiesLaunchHelper.openAppWithPackage(this, Utils.notNullStr(call.arguments()));
273289
result.success(true);
274290
break;
275291
}
276292
case "openAppSettingsForPackage": {
277-
NewActivitiesLaunchHelper.openSettingsForPackage(this, call.arguments());
293+
NewActivitiesLaunchHelper.openSettingsForPackage(this, Utils.notNullStr(call.arguments()));
278294
result.success(true);
279295
break;
280296
}
@@ -328,7 +344,7 @@ private void updateTrackerServiceRestrictions(
328344
|| (restrictionGroups != null && !restrictionGroups.isEmpty())
329345
) {
330346
mTrackerServiceConn.setOnConnectedCallback(service -> service.updateRestrictionData(appRestrictions, restrictionGroups));
331-
mTrackerServiceConn.startAndBind(MindfulTrackerService.ACTION_START_RESTRICTION_MODE);
347+
mTrackerServiceConn.startAndBind();
332348
}
333349
}
334350

@@ -340,77 +356,12 @@ private void updateTrackerServiceRestrictions(
340356
*/
341357
private boolean getAndAskVpnPermission(boolean askPermissionToo) {
342358
Intent intent = MindfulVpnService.prepare(this);
343-
if (askPermissionToo && intent != null) {
344-
startActivityForResult(intent, 0);
359+
if (askPermissionToo && intent != null && mVpnPermissionLauncher != null) {
360+
mVpnPermissionLauncher.launch(intent);
345361
}
346362
return intent == null;
347363
}
348364

349-
/**
350-
* Checks if the Display Over Other Apps permission is granted and optionally asks for it if not granted.
351-
*
352-
* @param askPermissionToo Whether to prompt the user to enable Display Over Other Apps permission if not granted.
353-
* @return True if Display Over Other Apps permission is granted, false otherwise.
354-
*/
355-
private boolean getAndAskDisplayOverlayPermission(boolean askPermissionToo) {
356-
if (Settings.canDrawOverlays(this)) return true;
357-
358-
if (askPermissionToo) {
359-
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
360-
intent.setData(android.net.Uri.parse("package:" + getPackageName()));
361-
startActivityForResult(intent, 0);
362-
Toast.makeText(this, "Please allow Mindful to display overlay", Toast.LENGTH_LONG).show();
363-
}
364-
return false;
365-
}
366-
367-
/**
368-
* Checks if the Set Exact Alarm permission is granted and optionally asks for it if not granted.
369-
*
370-
* @param askPermissionToo Whether to prompt the user to enable Set Exact Alarm permission if not granted.
371-
* @return True if Set Exact Alarm permission is granted, false otherwise.
372-
*/
373-
public boolean getAndAskExactAlarmPermission(boolean askPermissionToo) {
374-
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) return true;
375-
376-
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
377-
if (alarmManager.canScheduleExactAlarms()) return true;
378-
379-
if (askPermissionToo) {
380-
Intent intent = new Intent(Settings.ACTION_REQUEST_SCHEDULE_EXACT_ALARM);
381-
intent.setData(android.net.Uri.parse("package:" + getPackageName()));
382-
startActivityForResult(intent, 0);
383-
}
384-
return false;
385-
}
386-
387-
/**
388-
* Checks if the Ignore Battery Optimization permission is granted and optionally asks for it if not granted.
389-
*
390-
* @param askPermissionToo Whether to prompt the user to enable Ignore Battery Optimization permission if not granted.
391-
* @return True if Ignore Battery Optimization permission is granted, false otherwise.
392-
*/
393-
public boolean getAndAskIgnoreBatteryOptimizationPermission(boolean askPermissionToo) {
394-
PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
395-
if (powerManager.isIgnoringBatteryOptimizations(getPackageName())) return true;
396-
397-
if (askPermissionToo) {
398-
@SuppressLint("BatteryLife") Intent intent = new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
399-
intent.setData(Uri.parse("package:" + getPackageName()));
400-
startActivityForResult(intent, 0);
401-
}
402-
return false;
403-
}
404-
405-
@Override
406-
protected void onStop() {
407-
super.onStop();
408-
// Notify VPN service that it can restart if needed
409-
if (mVpnServiceConn.isConnected()) {
410-
mVpnServiceConn.getService().onApplicationStop();
411-
}
412-
}
413-
414365
@Override
415366
protected void onDestroy() {
416367
super.onDestroy();

android/app/src/main/java/com/mindful/android/generics/SafeServiceConnection.java

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@
1212

1313
package com.mindful.android.generics;
1414

15+
import static com.mindful.android.generics.ServiceBinder.ACTION_BIND_TO_MINDFUL;
16+
import static com.mindful.android.generics.ServiceBinder.ACTION_START_MINDFUL_SERVICE;
17+
1518
import android.app.Service;
1619
import android.content.ComponentName;
1720
import android.content.Context;
@@ -31,7 +34,6 @@
3134
* @param <T> The type of Service this class is designed to connect to.
3235
*/
3336
public class SafeServiceConnection<T extends Service> implements ServiceConnection {
34-
3537
private final Class<T> mServiceClass;
3638
private final Context mContext;
3739
private T mService = null;
@@ -50,15 +52,19 @@ public SafeServiceConnection(Class<T> serviceClass, @NonNull Context context) {
5052
mContext = context.getApplicationContext();
5153
}
5254

55+
@SuppressWarnings("unchecked")
5356
@Override
54-
public void onServiceConnected(ComponentName name, IBinder service) {
55-
mService = ((ServiceBinder<T>) service).getService();
56-
57-
if (mService != null) {
58-
mIsBound = true;
59-
if (mConnectionSuccessCallback != null) {
60-
mConnectionSuccessCallback.onSuccess(mService);
57+
public void onServiceConnected(ComponentName name, IBinder binder) {
58+
try {
59+
mService = ((ServiceBinder<T>) binder).getService();
60+
61+
if (mService != null) {
62+
mIsBound = true;
63+
if (mConnectionSuccessCallback != null) {
64+
mConnectionSuccessCallback.onSuccess(mService);
65+
}
6166
}
67+
} catch (Exception ignored) {
6268
}
6369
}
6470

@@ -91,7 +97,9 @@ public boolean isConnected() {
9197
public void bindService() {
9298
if (!mIsBound && Utils.isServiceRunning(mContext, mServiceClass.getName())) {
9399
try {
94-
mContext.bindService(new Intent(mContext, mServiceClass), this, Context.BIND_WAIVE_PRIORITY);
100+
Intent bindIntent = new Intent(mContext, mServiceClass);
101+
bindIntent.setAction(ACTION_BIND_TO_MINDFUL);
102+
mContext.bindService(bindIntent, this, Context.BIND_WAIVE_PRIORITY);
95103
} catch (Exception e) {
96104
Log.e("Mindful.SafeServiceConnection", "bindService: Failed to bind " + mServiceClass.getName(), e);
97105

@@ -120,9 +128,9 @@ public void unBindService() {
120128
/**
121129
* Starts and binds the service if it is not already running.
122130
*/
123-
public void startAndBind(String action) {
131+
public void startAndBind() {
124132
if (!Utils.isServiceRunning(mContext, mServiceClass.getName())) {
125-
mContext.startService(new Intent(mContext, mServiceClass).setAction(action));
133+
mContext.startService(new Intent(mContext, mServiceClass).setAction(ACTION_START_MINDFUL_SERVICE));
126134
}
127135
bindService();
128136
}

android/app/src/main/java/com/mindful/android/generics/ServiceBinder.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
package com.mindful.android.generics;
1414

15+
import android.app.Service;
1516
import android.os.Binder;
1617

1718
/**
@@ -20,8 +21,9 @@
2021
*
2122
* @param <T> The type of the service being bound.
2223
*/
23-
public class ServiceBinder<T> extends Binder {
24-
// public static final String ACTION_START_SERVICE = "com.mindful.android.service.START";
24+
public class ServiceBinder<T extends Service> extends Binder {
25+
public static final String ACTION_START_MINDFUL_SERVICE = "com.mindful.android.ServiceBinder.ACTION_START_MINDFUL_SERVICE";
26+
public static final String ACTION_BIND_TO_MINDFUL = "com.mindful.android.ServiceBinder.ACTION_BIND_TO_MINDFUL";
2527

2628

2729
private final T mService;

android/app/src/main/java/com/mindful/android/helpers/AlarmTasksSchedulingHelper.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,12 @@
2121
import android.content.Context;
2222
import android.content.Intent;
2323
import android.os.Build;
24+
import android.os.Handler;
2425
import android.util.Log;
2526

2627
import androidx.annotation.NonNull;
2728

29+
import com.mindful.android.generics.SafeServiceConnection;
2830
import com.mindful.android.models.BedtimeSettings;
2931
import com.mindful.android.receivers.alarm.BedtimeRoutineReceiver;
3032
import com.mindful.android.receivers.alarm.MidnightResetReceiver;
@@ -123,15 +125,13 @@ public static void cancelBedtimeRoutineTasks(@NonNull Context context) {
123125
alarmManager.cancel(startPendingIntent);
124126
alarmManager.cancel(stopPendingIntent);
125127

126-
// Turn off Dnd
127-
NotificationHelper.toggleDnd(context, false);
128-
129128
// Let service know
130129
if (Utils.isServiceRunning(context, MindfulTrackerService.class.getName())) {
131-
Intent serviceIntent = new Intent(context.getApplicationContext(), MindfulTrackerService.class).setAction(MindfulTrackerService.ACTION_STOP_BEDTIME_MODE);
132-
context.startService(serviceIntent);
130+
SafeServiceConnection<MindfulTrackerService> conn = new SafeServiceConnection<>(MindfulTrackerService.class, context);
131+
conn.setOnConnectedCallback(s -> s.startStopBedtimeMode(null));
132+
conn.bindService();
133+
conn.unBindService();
133134
}
134-
135135
Log.d(TAG, "cancelBedtimeRoutineTasks: Bedtime routine tasks cancelled successfully");
136136
}
137137

0 commit comments

Comments
 (0)