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: