diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index f981b688..5838d3b7 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -35,8 +35,8 @@
+
-
@@ -276,6 +276,13 @@
android:windowSoftInputMode="stateHidden|adjustResize"
android:configChanges="keyboardHidden|orientation"
/>
+
+
+
+
0;
}
+ /**
+ * Method that validates if the accessibility method should request it
+ *
+ * @param ctx context
+ * @return true if accessibility method should request it, false otherwise
+ */
public static boolean isAccessibilityServiceView(Context ctx) {
boolean isAccessibilityServiceEnabled = isAccessibilityServiceEnabled(ctx);
PreyLogger.d(String.format("isAccessibilityServiceEnabled:%s", isAccessibilityServiceEnabled));
@@ -134,4 +141,70 @@ public static boolean isAccessibilityServiceView(Context ctx) {
}
}
}
+
+ /**
+ * Method to obtain if storage is enabled
+ * @param ctx context
+ * @return true if storage enabled, false otherwise
+ */
+ public static boolean isExternalStorageManager(Context ctx){
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
+ if (Environment.isExternalStorageManager()) {
+ return true;
+ }else{
+ return false;
+ }
+ }else{
+ return true;
+ }
+ }
+
+ /**
+ * Method that validates if the storage method should request it
+ *
+ * @param ctx context
+ * @return true if storage method should request it, false otherwise
+ */
+ public static boolean isExternalStorageManagerView(Context ctx) {
+ boolean isExternalStorageManager = isExternalStorageManager(ctx);
+ PreyLogger.d(String.format("isExternalStorageManager:%s", isExternalStorageManager));
+ if (isExternalStorageManager) {
+ return isExternalStorageManager;
+ } else {
+ boolean allFilesDenied = PreyConfig.getPreyConfig(ctx).getAllFilesDenied();
+ PreyLogger.d(String.format("allFilesDenied:%s", allFilesDenied));
+ if (allFilesDenied) {
+ return allFilesDenied;
+ } else {
+ boolean isTimeNextAllFiles = PreyConfig.getPreyConfig(ctx).isTimeNextAllFiles();
+ PreyLogger.d(String.format("isTimeNextAllFiles:%s", isTimeNextAllFiles));
+ return isTimeNextAllFiles;
+ }
+ }
+ }
+
+ /**
+ * Method that validates if the background location method should request it
+ *
+ * @param ctx context
+ * @return true if background location method should request it, false otherwise
+ */
+ public static boolean canAccessBackgroundLocationView(Context ctx) {
+ boolean canAccessBackgroundLocation = canAccessBackgroundLocation(ctx);
+ PreyLogger.d(String.format("canAccessBackgroundLocation:%s", canAccessBackgroundLocation));
+ if (canAccessBackgroundLocation) {
+ return canAccessBackgroundLocation;
+ } else {
+ boolean locatinBgDenied = PreyConfig.getPreyConfig(ctx).getLocationBgDenied();
+ PreyLogger.d(String.format("locatinBgDenied:%s", locatinBgDenied));
+ if (locatinBgDenied) {
+ return locatinBgDenied;
+ } else {
+ boolean isTimeNextLocationBg = PreyConfig.getPreyConfig(ctx).isTimeNextLocationBg();
+ PreyLogger.d(String.format("isTimeNextLocationBg:%s", isTimeNextLocationBg));
+ return isTimeNextLocationBg;
+ }
+ }
+ }
+
}
diff --git a/app/src/main/java/com/prey/activities/CheckPasswordHtmlActivity.java b/app/src/main/java/com/prey/activities/CheckPasswordHtmlActivity.java
index 32c827c0..6c5733c3 100644
--- a/app/src/main/java/com/prey/activities/CheckPasswordHtmlActivity.java
+++ b/app/src/main/java/com/prey/activities/CheckPasswordHtmlActivity.java
@@ -10,6 +10,8 @@
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.app.Activity;
+import android.app.NotificationManager;
+import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
@@ -41,8 +43,10 @@
import com.prey.activities.js.CustomWebView;
import com.prey.activities.js.WebAppInterface;
import com.prey.backwardcompatibility.FroyoSupport;
+import com.prey.events.factories.EventFactory;
import com.prey.services.PreyAccessibilityService;
import com.prey.services.PreyOverlayService;
+import com.prey.services.PreyStorageService;
import java.io.File;
import java.io.FileOutputStream;
@@ -179,7 +183,14 @@ public String getUrl(Context ctx) {
boolean canAccessCoarseLocation = PreyPermission.canAccessCoarseLocation(this);
boolean canAccessCamera = PreyPermission.canAccessCamera(this);
boolean canAccessStorage = PreyPermission.canAccessStorage(this);
- boolean canAccessBackgroundLocation = PreyPermission.canAccessBackgroundLocation(this);
+ boolean canAccessBackgroundLocation = PreyPermission.canAccessBackgroundLocationView(this);
+ boolean verifyNotification = EventFactory.verifyNotification(ctx);
+ if (verifyNotification) {
+ EventFactory.notification(ctx);
+ } else {
+ NotificationManager manager = (NotificationManager) ctx.getSystemService(Service.NOTIFICATION_SERVICE);
+ manager.cancel(EventFactory.NOTIFICATION_ID);
+ }
PreyLogger.d(String.format("CheckPasswordHtmlActivity: canAccessFineLocation:%s", canAccessFineLocation));
PreyLogger.d(String.format("CheckPasswordHtmlActivity: canAccessCoarseLocation:%s", canAccessCoarseLocation));
PreyLogger.d(String.format("CheckPasswordHtmlActivity: canAccessCamera:%s", canAccessCamera));
@@ -191,8 +202,10 @@ public String getUrl(Context ctx) {
PreyLogger.d(String.format("CheckPasswordHtmlActivity: canAccessibility:%s", canAccessibility));
boolean isAdminActive = FroyoSupport.getInstance(this).isAdminActive();
PreyLogger.d(String.format("CheckPasswordHtmlActivity: isAdminActive:%s", isAdminActive));
+ boolean isStorage = PreyPermission.isExternalStorageManagerView(this);
+ PreyLogger.d(String.format("CheckPasswordHtmlActivity: isStorage:%s", isStorage));
boolean configurated = (canAccessFineLocation || canAccessCoarseLocation) && canAccessBackgroundLocation && canAccessCamera
- && canAccessStorage && isAdminActive && canDrawOverlays && canAccessibility;
+ && canAccessStorage && isAdminActive && canDrawOverlays && canAccessibility && isStorage;
String installationStatus = PreyConfig.getPreyConfig(this).getInstallationStatus();
PreyLogger.d(String.format("CheckPasswordHtmlActivity: configurated:%s installationStatus:%s", configurated, installationStatus));
if (configurated) {
@@ -216,29 +229,32 @@ public String getUrl(Context ctx) {
}
}
} else {
- boolean permissions = (canAccessFineLocation || canAccessCoarseLocation) && canAccessCamera
- && canAccessStorage && isAdminActive && canDrawOverlays && canAccessibility;
- boolean permissions3 = (canAccessFineLocation || canAccessCoarseLocation) && canAccessCamera
- && canAccessStorage && isAdminActive && canDrawOverlays;
- boolean permissions2 = (canAccessFineLocation || canAccessCoarseLocation) || canAccessCamera
- || canAccessStorage || isAdminActive || canDrawOverlays || canAccessibility;
- PreyLogger.d(String.format("CheckPasswordHtmlActivity permissions:%s", permissions));
- PreyLogger.d(String.format("CheckPasswordHtmlActivity canAccessBackgroundLocation:%s", canAccessBackgroundLocation));
- if (permissions) {
- if (canAccessBackgroundLocation) {
- url.append(URL_ONB).append("#/").append(lng).append("/permissions");
- } else {
- url.append(URL_ONB).append("#/").append(lng).append("/bgloc");
- }
+ boolean permissionsAndBasic = (canAccessFineLocation || canAccessCoarseLocation) && canAccessCamera
+ && canAccessStorage && isAdminActive && canDrawOverlays ;
+ boolean permissionsOrBasic = canAccessFineLocation || canAccessCoarseLocation || canAccessCamera
+ || canAccessStorage || isAdminActive || canDrawOverlays ;
+ if (!permissionsOrBasic) {
+ url.append(URL_ONB).append("#/").append(lng).append("/start");
} else {
- if (permissions2) {
- if (permissions3) {
+ if (permissionsAndBasic) {
+ if (!canAccessibility) {
+ PreyLogger.d(String.format("CheckPasswordHtmlActivity !canAccessibility"));
url.append(URL_ONB).append("#/").append(lng).append("/accessibility");
} else {
- url.append(URL_ONB).append("#/").append(lng).append("/permissions");
+ if (!canAccessBackgroundLocation) {
+ PreyLogger.d(String.format("CheckPasswordHtmlActivity !canAccessBackgroundLocation"));
+ url.append(URL_ONB).append("#/").append(lng).append("/bgloc");
+ } else {
+ if (!isStorage) {
+ PreyLogger.d(String.format("CheckPasswordHtmlActivity !isStorage"));
+ url.append(URL_ONB).append("#/").append(lng).append("/allfiles");
+ } else {
+ url.append(URL_ONB).append("#/").append(lng).append("/permissions");
+ }
+ }
}
- } else {
- url.append(URL_ONB).append("#/").append(lng).append("/start");
+ }else{
+ url.append(URL_ONB).append("#/").append(lng).append("/permissions");
}
}
}
@@ -498,4 +514,22 @@ public String getFileNameHelp(Context ctx, Uri uri) {
return fileNameHelp;
}
+ /**
+ * Method for requesting storage permission
+ */
+ public void allFiles() {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
+ if (Environment.isExternalStorageManager()) {
+ PreyLogger.i("todo when permission is granted");
+ } else {
+ Intent intentService = new Intent(getApplicationContext(), PreyStorageService.class);
+ startService(intentService);
+ Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
+ Uri uri = Uri.fromParts("package", getPackageName(), null);
+ intent.setData(uri);
+ startActivity(intent);
+ }
+ }
+ }
+
}
\ No newline at end of file
diff --git a/app/src/main/java/com/prey/activities/OpenSettingsActivity.java b/app/src/main/java/com/prey/activities/OpenSettingsActivity.java
new file mode 100644
index 00000000..f3d2e692
--- /dev/null
+++ b/app/src/main/java/com/prey/activities/OpenSettingsActivity.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Created by Orlando Aliaga
+ * Copyright 2022 Prey Inc. All rights reserved.
+ * License: GPLv3
+ * Full license at "/LICENSE"
+ ******************************************************************************/
+package com.prey.activities;
+
+import android.app.Activity;
+import android.app.NotificationManager;
+import android.app.Service;
+import android.content.Intent;
+import android.content.pm.ActivityInfo;
+import android.net.Uri;
+import android.os.Bundle;
+import android.view.Window;
+
+import com.prey.R;
+import com.prey.events.factories.EventFactory;
+
+public class OpenSettingsActivity extends Activity {
+
+ /**
+ * Activity that checks if it should hide the notification or
+ * should open the settings to grant permissions
+ *
+ * @param savedInstanceState
+ */
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ requestWindowFeature(Window.FEATURE_NO_TITLE);
+ setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
+ setContentView(R.layout.splash_batch);
+ boolean verifyNotification = EventFactory.verifyNotification(this);
+ if (verifyNotification) {
+ NotificationManager manager = (NotificationManager) this.getSystemService(Service.NOTIFICATION_SERVICE);
+ manager.cancel(EventFactory.NOTIFICATION_ID);
+ } else {
+ Intent intentSetting = new Intent();
+ intentSetting.setAction(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
+ Uri uri = Uri.fromParts("package", this.getPackageName(), null);
+ intentSetting.setData(uri);
+ intentSetting.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
+ this.startActivity(intentSetting);
+ }
+ finish();
+ }
+
+}
diff --git a/app/src/main/java/com/prey/activities/js/WebAppInterface.java b/app/src/main/java/com/prey/activities/js/WebAppInterface.java
index 0d0840fd..862f7d69 100644
--- a/app/src/main/java/com/prey/activities/js/WebAppInterface.java
+++ b/app/src/main/java/com/prey/activities/js/WebAppInterface.java
@@ -36,6 +36,7 @@
import com.prey.actions.location.PreyLocation;
import com.prey.activities.CheckPasswordHtmlActivity;
import com.prey.activities.CloseActivity;
+import com.prey.activities.LoginActivity;
import com.prey.activities.PanelWebActivity;
import com.prey.activities.PasswordHtmlActivity;
import com.prey.activities.PreReportActivity;
@@ -54,7 +55,6 @@
import org.json.JSONArray;
import org.json.JSONObject;
-import org.json.JSONStringer;
import java.io.File;
import java.net.HttpURLConnection;
@@ -927,9 +927,14 @@ public void skipPermissions(){
PreyLogger.d("skipPermissions");
}
+ /**
+ * Method to bypass background location permission
+ */
@JavascriptInterface
public void skipPermissionsBg(){
PreyLogger.d("skipPermissionsBg");
+ PreyConfig.getPreyConfig(mContext).setLocationBgDenied(true);
+ refresh();
}
@JavascriptInterface
@@ -1150,22 +1155,96 @@ public String getHelpFile() {
return displayName;
}
+ /**
+ * Method to bypass accessibility permission
+ */
@JavascriptInterface
public void accessibilitySkip(){
PreyLogger.d("accessibilitySkip");
PreyConfig.getPreyConfig(mContext).setTimeNextAccessibility();
+ refresh();
}
+ /**
+ * Method to deny accessibility permission
+ */
@JavascriptInterface
public void accessibilityDeny(){
PreyLogger.d("accessibilityDeny");
PreyConfig.getPreyConfig(mContext).setAccessibilityDenied(true);
+ refresh();
}
+ /**
+ * Method to grant accessibility permission
+ */
@JavascriptInterface
public void accessibilityAgree(){
PreyLogger.d("accessibilityAgree");
mActivity.accessibility();
}
+ /**
+ * Method to refresh view
+ */
+ @JavascriptInterface
+ public void refresh(){
+ PreyLogger.d("refresh");
+ Intent intentLogin = new Intent(mContext, LoginActivity.class);
+ intentLogin.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ mContext.startActivity(intentLogin);
+ mActivity.finish();
+ }
+
+ /**
+ * Method to bypass storage permission
+ */
+ @JavascriptInterface
+ public void allFilesSkip(){
+ PreyLogger.d("allFilesSkip");
+ PreyConfig.getPreyConfig(mContext).setTimeNextAllFiles();
+ refresh();
+ }
+
+ /**
+ * Method to deny storage permission
+ */
+ @JavascriptInterface
+ public void allFilesDeny(){
+ PreyLogger.d("allFilesDeny");
+ PreyConfig.getPreyConfig(mContext).setAllFilesDenied(true);
+ refresh();
+ }
+
+ /**
+ * Method to grant storage permission
+ */
+ @JavascriptInterface
+ public void allFilesAgree(){
+ PreyLogger.d("allFilesAgree");
+ mActivity.allFiles();
+ }
+
+ /**
+ * Method to verify that permissions are not removed
+ */
+ @JavascriptInterface
+ public void appIsntUsed() {
+ PreyLogger.d("appIsntUsed");
+ Intent intentSetting = new Intent();
+ intentSetting.setAction(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
+ Uri uri = Uri.fromParts("package", mContext.getPackageName(), null);
+ intentSetting.setData(uri);
+ mContext.startActivity(intentSetting);
+ }
+
+ /**
+ * Method that returns if the version is velvet
+ *
+ * @return version is velvet
+ */
+ @JavascriptInterface
+ public boolean versionIsRedVelvetCake() {
+ return android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.R;
+ }
}
diff --git a/app/src/main/java/com/prey/events/factories/EventFactory.java b/app/src/main/java/com/prey/events/factories/EventFactory.java
index 5be8fa5d..b0aada06 100644
--- a/app/src/main/java/com/prey/events/factories/EventFactory.java
+++ b/app/src/main/java/com/prey/events/factories/EventFactory.java
@@ -13,10 +13,13 @@
import org.json.JSONObject;
+import android.app.Notification;
+import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
+import android.graphics.BitmapFactory;
import android.net.ConnectivityManager;
import android.net.wifi.WifiManager;
import android.os.Build;
@@ -24,6 +27,8 @@
import android.provider.Settings;
import androidx.core.app.NotificationCompat;
+import androidx.core.app.NotificationManagerCompat;
+import androidx.core.content.ContextCompat;
import com.prey.PreyConfig;
import com.prey.PreyLogger;
@@ -35,12 +40,12 @@
import com.prey.actions.location.PreyLocation;
import com.prey.actions.triggers.BatteryTriggerReceiver;
import com.prey.actions.triggers.SimTriggerReceiver;
-import com.prey.activities.CheckPasswordHtmlActivity;
import com.prey.beta.actions.PreyBetaController;
import com.prey.events.Event;
-import com.prey.json.actions.Lock;
import com.prey.managers.PreyConnectivityManager;
import com.prey.net.UtilConnection;
+import com.prey.services.PreyCloseNotificationService;
+import com.prey.services.PreyPermissionService;
public class EventFactory {
@@ -56,6 +61,7 @@ public class EventFactory {
public static final String ACTION_POWER_DISCONNECTED = "android.intent.action.ACTION_POWER_DISCONNECTED";
public static final String LOCATION_MODE_CHANGED = "android.location.MODE_CHANGED";
public static final String LOCATION_PROVIDERS_CHANGED = "android.location.PROVIDERS_CHANGED";
+ public static final int NOTIFICATION_ID = 888;
public static Event getEvent(final Context ctx, Intent intent) {
String message = "getEvent[" + intent.getAction() + "]";
@@ -205,35 +211,89 @@ public static boolean isValidLowBattery(Context ctx) {
}
}
+ /**
+ * Method that returns if it has all the permissions
+ *
+ * @param ctx context
+ * @return if you have all permissions
+ */
+ public static boolean verifyNotification(Context ctx) {
+ boolean canAccessCamera = PreyPermission.canAccessCamera(ctx);
+ boolean canAccessCoarseLocation = PreyPermission.canAccessCoarseLocation(ctx);
+ boolean canAccessFineLocation = PreyPermission.canAccessFineLocation(ctx);
+ boolean canAccessStorage = PreyPermission.canAccessStorage(ctx);
+ return canAccessCamera && (canAccessCoarseLocation || canAccessFineLocation) && canAccessStorage;
+ }
+
+ /**
+ * Method that opens the notification missing permissions
+ *
+ * @param ctx context
+ */
public static void notification(Context ctx) {
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (PreyConfig.getPreyConfig(ctx).isThisDeviceAlreadyRegisteredWithPrey(false)) {
- PreyConfig.getPreyConfig(ctx).setCanAccessCamara(PreyPermission.canAccessCamera(ctx));
- PreyConfig.getPreyConfig(ctx).setCanAccessCoarseLocation(PreyPermission.canAccessCoarseLocation(ctx));
- PreyConfig.getPreyConfig(ctx).setCanAccessFineLocation(PreyPermission.canAccessFineLocation(ctx));
- boolean warning = !PreyPermission.canAccessCamera(ctx) || !PreyPermission.canAccessCoarseLocation(ctx) || !PreyPermission.canAccessFineLocation(ctx);
- PreyLogger.d("notification warning:" + warning);
- if (warning) {
- Intent intentPassword = new Intent(ctx, CheckPasswordHtmlActivity.class);
- intentPassword.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
- Intent.FLAG_ACTIVITY_CLEAR_TASK);
- PendingIntent pendingIntent = PendingIntent.getActivity(
- ctx,
- 0,
- intentPassword,
- PendingIntent.FLAG_UPDATE_CURRENT|PendingIntent.FLAG_IMMUTABLE);
- NotificationManager nManager = (NotificationManager) ctx.getSystemService(Context.NOTIFICATION_SERVICE);
-
- NotificationCompat.Builder mBuilder =
- new NotificationCompat.Builder(ctx)
- .setSmallIcon(R.drawable.icon2)
- .setContentTitle(ctx.getResources().getString(R.string.warning_notification_title))
- .setContentText(ctx.getResources().getString(R.string.warning_notification_body));
- mBuilder.setContentIntent(pendingIntent);
- mBuilder.setAutoCancel(true);
- nManager.notify(PreyConfig.TAG, PreyConfig.NOTIFY_ANDROID_6, mBuilder.build());
+ String channelId = null;
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+ channelId = "channelPrey2";
+ CharSequence channelName = "Prey2";
+ int channelImportance = NotificationManager.IMPORTANCE_HIGH;
+ boolean channelEnableVibrate = false;
+ int channelLockscreenVisibility = NotificationCompat.VISIBILITY_PRIVATE;
+ NotificationChannel notificationChannel =
+ new NotificationChannel(channelId, channelName, channelImportance);
+ notificationChannel.enableVibration(channelEnableVibrate);
+ notificationChannel.setLockscreenVisibility(channelLockscreenVisibility);
+ NotificationManager notificationManager =
+ (NotificationManager) ctx.getSystemService(Context.NOTIFICATION_SERVICE);
+ notificationManager.createNotificationChannel(notificationChannel);
}
+ Intent permissionIntent = new Intent(ctx, PreyPermissionService.class);
+ permissionIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
+ PendingIntent permissionPendingIntent = PendingIntent.getService(ctx, 0, permissionIntent, PendingIntent.FLAG_IMMUTABLE);
+ NotificationCompat.Action permissionAction =
+ new NotificationCompat.Action.Builder(
+ R.drawable.icon,
+ ctx.getResources().getString(R.string.warning_re_approve),
+ permissionPendingIntent)
+ .build();
+ Intent closeIntent = new Intent(ctx, PreyCloseNotificationService.class);
+ closeIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
+ PendingIntent closePendingIntent = PendingIntent.getService(ctx, 0, closeIntent, PendingIntent.FLAG_IMMUTABLE);
+ NotificationCompat.Action closeAction =
+ new NotificationCompat.Action.Builder(
+ R.drawable.icon,
+ ctx.getResources().getString(R.string.warning_close),
+ closePendingIntent)
+ .build();
+ NotificationCompat.BigTextStyle bigTextStyle = new NotificationCompat.BigTextStyle()
+ .bigText(ctx.getResources().getString(R.string.warning_notification_body))
+ .setBigContentTitle(ctx.getResources().getString(R.string.warning_notification_title))
+ .setSummaryText(ctx.getResources().getString(R.string.warning_notification_body));
+ NotificationCompat.Builder notificationCompatBuilder =
+ new NotificationCompat.Builder(
+ ctx, channelId);
+ Notification notification = notificationCompatBuilder
+ .setStyle(bigTextStyle)
+ .setContentTitle(ctx.getResources().getString(R.string.warning_notification_title))
+ .setContentText(ctx.getResources().getString(R.string.warning_notification_body))
+ .setSmallIcon(R.drawable.icon2)
+ .setLargeIcon(BitmapFactory.decodeResource(
+ ctx.getResources(),
+ R.drawable.icon2))
+ .setDefaults(NotificationCompat.DEFAULT_ALL)
+ .setColor(ContextCompat.getColor(ctx, R.color.colorPrimary))
+ .setCategory(Notification.CATEGORY_REMINDER)
+ .setPriority(NotificationCompat.PRIORITY_DEFAULT)
+ .setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
+ .addAction(permissionAction)
+ .addAction(closeAction)
+ .build();
+ NotificationManagerCompat mNotificationManagerCompat = NotificationManagerCompat.from(ctx);
+ mNotificationManagerCompat.notify(NOTIFICATION_ID, notification);
+
}
}
}
+
}
\ No newline at end of file
diff --git a/app/src/main/java/com/prey/receivers/AlarmDisablePowerReceiver.java b/app/src/main/java/com/prey/receivers/AlarmDisablePowerReceiver.java
index f738b91a..00427e93 100644
--- a/app/src/main/java/com/prey/receivers/AlarmDisablePowerReceiver.java
+++ b/app/src/main/java/com/prey/receivers/AlarmDisablePowerReceiver.java
@@ -19,11 +19,11 @@ public class AlarmDisablePowerReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
PreyLogger.d("______AlarmDisablePowerReceiver onReceive_________");
try {
- if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.P) {
+ if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.P) {
context.startService(new Intent(context, PreyDisablePowerOptionsService.class));
}
} catch (Exception e) {
- PreyLogger.e("Error:" + e.getMessage(), e);
+ PreyLogger.e(String.format("Error: %s", e.getMessage()), e);
}
}
diff --git a/app/src/main/java/com/prey/services/PreyCloseNotificationService.java b/app/src/main/java/com/prey/services/PreyCloseNotificationService.java
new file mode 100644
index 00000000..c38a85e4
--- /dev/null
+++ b/app/src/main/java/com/prey/services/PreyCloseNotificationService.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Created by Orlando Aliaga
+ * Copyright 2022 Prey Inc. All rights reserved.
+ * License: GPLv3
+ * Full license at "/LICENSE"
+ ******************************************************************************/
+package com.prey.services;
+
+import android.app.NotificationManager;
+import android.app.Service;
+import android.content.Intent;
+import android.os.IBinder;
+
+import com.prey.events.factories.EventFactory;
+
+public class PreyCloseNotificationService extends Service {
+
+ public IBinder onBind(Intent intent) {
+ return null;
+ }
+
+ public void onCreate() {
+ super.onCreate();
+ }
+
+ /**
+ * Service that closes the notification
+ *
+ * @param intent
+ * @param startId
+ */
+ public void onStart(Intent intent, int startId) {
+ super.onStart(intent, startId);
+ NotificationManager manager = (NotificationManager) getSystemService(Service.NOTIFICATION_SERVICE);
+ manager.cancel(EventFactory.NOTIFICATION_ID);
+ }
+
+}
diff --git a/app/src/main/java/com/prey/services/PreyPermissionService.java b/app/src/main/java/com/prey/services/PreyPermissionService.java
new file mode 100644
index 00000000..ff16bf46
--- /dev/null
+++ b/app/src/main/java/com/prey/services/PreyPermissionService.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Created by Orlando Aliaga
+ * Copyright 2022 Prey Inc. All rights reserved.
+ * License: GPLv3
+ * Full license at "/LICENSE"
+ ******************************************************************************/
+package com.prey.services;
+
+import android.app.Service;
+import android.content.Context;
+import android.content.Intent;
+import android.os.IBinder;
+
+import com.prey.activities.OpenSettingsActivity;
+
+public class PreyPermissionService extends Service {
+
+ public IBinder onBind(Intent intent) {
+ return null;
+ }
+
+ public void onCreate() {
+ super.onCreate();
+ }
+
+ /**
+ * Service that calls the open activity OpenSettingsActivity
+ *
+ * @param intent
+ * @param startId
+ */
+ public void onStart(Intent intent, int startId) {
+ super.onStart(intent, startId);
+ final Context ctx = this;
+ Intent intentConfiguration = new Intent(ctx, OpenSettingsActivity.class);
+ intentConfiguration.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
+ startActivity(intentConfiguration);
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/prey/services/PreyStorageService.java b/app/src/main/java/com/prey/services/PreyStorageService.java
new file mode 100644
index 00000000..882d9591
--- /dev/null
+++ b/app/src/main/java/com/prey/services/PreyStorageService.java
@@ -0,0 +1,69 @@
+/*******************************************************************************
+ * Created by Orlando Aliaga
+ * Copyright 2022 Prey Inc. All rights reserved.
+ * License: GPLv3
+ * Full license at "/LICENSE"
+ ******************************************************************************/
+package com.prey.services;
+
+import android.app.Service;
+import android.content.Context;
+import android.content.Intent;
+import android.os.IBinder;
+
+import com.prey.PreyLogger;
+import com.prey.PreyPermission;
+import com.prey.activities.CheckPasswordHtmlActivity;
+
+public class PreyStorageService extends Service {
+
+ public IBinder onBind(Intent intent) {
+ return null;
+ }
+
+ public void onCreate() {
+ super.onCreate();
+ }
+
+ /**
+ * Service that listens if storage permission is granted and changes view
+ *
+ * @param intent
+ * @param startId
+ */
+ public void onStart(Intent intent, int startId) {
+ super.onStart(intent, startId);
+ final Context ctx = this;
+ new Thread() {
+ public void run() {
+ int i = 0;
+ boolean run = true;
+ while (run) {
+ try {
+ Thread.sleep(1000);
+ boolean isStorage = PreyPermission.isExternalStorageManager(ctx);
+ PreyLogger.d(String.format("PreyStorageService: %b", isStorage));
+ if (isStorage) {
+ run = false;
+ Intent intentActivity = new Intent(ctx, CheckPasswordHtmlActivity.class);
+ intentActivity.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
+ startActivity(intentActivity);
+ stopSelf();
+ break;
+ }
+ //TODO:Waiting time for storage to be active
+ if (i > 40) {
+ run = false;
+ stopSelf();
+ break;
+ }
+ i++;
+ } catch (Exception e) {
+ PreyLogger.e(String.format("Error: %s", e.getMessage()), e);
+ }
+ }
+ }
+ }.start();
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml
index 97a278a6..dc430e11 100644
--- a/app/src/main/res/values-es/strings.xml
+++ b/app/src/main/res/values-es/strings.xml
@@ -229,7 +229,7 @@
Obtiene la ubicación de su dispositivo cuando la batería se encuentra baja
- ¡Atención!Prey necesita permisos
+ ¡Atención! Prey necesita permisos
Toca aquí para otorgar permisos
Prey requiere múltiples permisos de Android para funcionar al máximo, estos son:
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 9af6571f..6b4e47b5 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -232,7 +232,7 @@
- Warning!Prey needs permissions
+ Warning! Prey needs permissions
Tap to provide permissions.
Prey requires multiple privileges from Android to work at maximum capacity, these are: