From 3a27979136f228cede9b86494af2ad7d66646340 Mon Sep 17 00:00:00 2001 From: Orlando Aliaga Date: Wed, 27 Jan 2016 16:27:22 -0300 Subject: [PATCH] Add support for Android 6 --- app/src/main/AndroidManifest.xml | 7 +- app/src/main/java/com/prey/PreyApp.java | 31 ++-- app/src/main/java/com/prey/PreyConfig.java | 99 ++++++++--- app/src/main/java/com/prey/PreyEmail.java | 9 + .../main/java/com/prey/PreyPermission.java | 73 ++++++++ app/src/main/java/com/prey/PreyPhone.java | 151 +++++++++++++++-- .../actions/geofences/GeofenceController.java | 88 +++++----- .../prey/actions/location/LocationThread.java | 11 +- .../prey/actions/location/LocationUtil.java | 23 ++- .../PreyGooglePlayServiceLocation.java | 37 ++-- .../com/prey/actions/picture/PictureUtil.java | 57 ++++--- .../prey/activities/DeviceReadyActivity.java | 160 ++++++++++++++++-- .../com/prey/activities/LoginActivity.java | 15 +- .../PreyConfigurationSMSActivity.java | 39 ++++- .../prey/beta/actions/PreyBetaController.java | 12 +- .../beta/services/PreyBetaRunnerService.java | 3 +- .../prey/events/factories/EventFactory.java | 41 +++++ .../prey/managers/PreyTelephonyManager.java | 21 +-- .../java/com/prey/net/PreyWebServices.java | 18 +- .../com/prey/services/LocationService.java | 52 +++--- .../com/prey/services/PreyRunnerService.java | 3 +- .../main/res/layout-large-port/warning.xml | 85 ++++++++++ .../{layout => layout-port}/frame_home0.xml | 0 .../{layout => layout-port}/frame_home1.xml | 0 .../{layout => layout-port}/frame_home2.xml | 0 .../{layout => layout-port}/frame_home3.xml | 0 .../{layout => layout-port}/frame_home4.xml | 0 .../{layout => layout-port}/frame_home5.xml | 0 .../{layout => layout-port}/frame_home6.xml | 0 .../res/{layout => layout-port}/tour1.xml | 0 .../res/{layout => layout-port}/tour2.xml | 0 .../res/{layout => layout-port}/tour3.xml | 0 .../res/{layout => layout-port}/tour4.xml | 0 .../res/{layout => layout-port}/tour5.xml | 0 .../res/{layout => layout-port}/tour6.xml | 0 app/src/main/res/layout-port/warning.xml | 85 ++++++++++ .../main/res/layout-small-port/warning.xml | 85 ++++++++++ app/src/main/res/values-es/strings.xml | 11 +- app/src/main/res/values-v21/styles.xml | 9 + app/src/main/res/values/strings.xml | 9 + app/src/main/res/values/styles.xml | 5 +- 41 files changed, 1010 insertions(+), 229 deletions(-) create mode 100644 app/src/main/java/com/prey/PreyPermission.java create mode 100644 app/src/main/res/layout-large-port/warning.xml rename app/src/main/res/{layout => layout-port}/frame_home0.xml (100%) rename app/src/main/res/{layout => layout-port}/frame_home1.xml (100%) rename app/src/main/res/{layout => layout-port}/frame_home2.xml (100%) rename app/src/main/res/{layout => layout-port}/frame_home3.xml (100%) rename app/src/main/res/{layout => layout-port}/frame_home4.xml (100%) rename app/src/main/res/{layout => layout-port}/frame_home5.xml (100%) rename app/src/main/res/{layout => layout-port}/frame_home6.xml (100%) rename app/src/main/res/{layout => layout-port}/tour1.xml (100%) rename app/src/main/res/{layout => layout-port}/tour2.xml (100%) rename app/src/main/res/{layout => layout-port}/tour3.xml (100%) rename app/src/main/res/{layout => layout-port}/tour4.xml (100%) rename app/src/main/res/{layout => layout-port}/tour5.xml (100%) rename app/src/main/res/{layout => layout-port}/tour6.xml (100%) create mode 100644 app/src/main/res/layout-port/warning.xml create mode 100644 app/src/main/res/layout-small-port/warning.xml create mode 100644 app/src/main/res/values-v21/styles.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 4b46ee94..9524e8b8 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -126,7 +126,12 @@ android:name="com.prey.activities.DeviceReadyActivity" android:configChanges="keyboardHidden|orientation" android:noHistory="true" - android:screenOrientation="portrait" /> + android:screenOrientation="portrait" + android:theme="@style/Theme.AppCompat.Light" /> + + + + Build.VERSION_CODES.FROYO; + return android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.FROYO; } public boolean isGingerbreadOrAbove() { - return android.os.Build.VERSION.SDK_INT> Build.VERSION_CODES.GINGERBREAD; + return android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD; } public boolean isIceCreamSandwichOrAbove() { - return android.os.Build.VERSION.SDK_INT> Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1; + return android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1; } public boolean isEclairOrAbove(){ - return android.os.Build.VERSION.SDK_INT> Build.VERSION_CODES.ECLAIR; + return android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.ECLAIR; } public boolean isCupcakeOrAbove() { - return android.os.Build.VERSION.SDK_INT> Build.VERSION_CODES.CUPCAKE; + return android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.CUPCAKE; + } + + public boolean isMarshmallowOrAbove() { + return android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M; } public String getLastEvent() { @@ -347,8 +396,8 @@ public boolean isThisDeviceAlreadyRegisteredWithPrey() { } public boolean isSimChanged() { - TelephonyManager telephonyManager = (TelephonyManager)ctx.getSystemService(Context.TELEPHONY_SERVICE); - String simSerial=telephonyManager.getSimSerialNumber(); + + String simSerial=new PreyPhone(ctx).getSimSerialNumber(); PreyLogger.i("simSerial:" + simSerial + " actual:" + getSimSerialNumber()); if (getSimSerialNumber()==null||"".equals(getSimSerialNumber())){ if(simSerial!=null&&!"".equals(simSerial)){ @@ -395,8 +444,11 @@ public void setRun(boolean run) { public void registerC2dm(){ boolean error=false; - if (PreyEmail.getEmail(this.ctx) != null) { + PreyLogger.i("c2dm:"+PreyEmail.getEmail(this.ctx)); + +// if (PreyEmail.getEmail(this.ctx) != null) { String deviceId = PreyConfig.getPreyConfig(ctx).getDeviceId(); + PreyLogger.i("deviceId:"+deviceId); if (deviceId != null && !"".equals(deviceId)) { try { @@ -419,7 +471,7 @@ public void registerC2dm(){ if (error) { try { - if (PreyEmail.getEmail(this.ctx) != null) { + // if (PreyEmail.getEmail(this.ctx) != null) { PreyLogger.d("______________________"); PreyLogger.d("___ registerC2dm 2_____"); @@ -430,14 +482,14 @@ public void registerC2dm(){ PreyLogger.d("______________________"); - } + // } } catch (Exception e) { PreyLogger.e("Error :" + e.getMessage(), e); } } } - } + // } } @@ -567,7 +619,7 @@ public String getEmail() { return getString(PreyConfig.EMAIL, ""); } - public void setEmail(String email){ + public void setEmail(String email) { saveString(PreyConfig.EMAIL, email); } @@ -577,7 +629,7 @@ public void setAccountVerified() { public boolean isSendData(){ - return getBoolean(PreyConfig.SEND_DATA,false); + return getBoolean(PreyConfig.SEND_DATA, false); } public void setSendData(boolean sendData) { @@ -596,8 +648,7 @@ public void saveAccount(PreyAccountData accountData) { } public void saveSimInformation() { - TelephonyManager telephonyManager = (TelephonyManager) ctx.getSystemService(Context.TELEPHONY_SERVICE); - String simSerial=telephonyManager.getSimSerialNumber(); + String simSerial=new PreyPhone(ctx).getSimSerialNumber(); if (simSerial !=null){ this.setSimSerialNumber(simSerial); } @@ -605,9 +656,6 @@ public void saveSimInformation() { PreyLogger.d("SIM Serial number stored: " + this.getSimSerialNumber()); } - - - public boolean isMissing() { return getBoolean(PreyConfig.PREFS_IS_MISSING, false); } @@ -750,11 +798,11 @@ public void setPinNumber(int pin){ saveInt(PreyConfig.PIN_NUMBER, pin); } - public int getPinNumber(){ - return getInt(PreyConfig.PIN_NUMBER,-1); + public int getPinNumber() { + return getInt(PreyConfig.PIN_NUMBER, -1); } - public void setSmsCommand(boolean smsCommand){ + public void setSmsCommand(boolean smsCommand) { saveBoolean(PreyConfig.SMS_COMMAND, smsCommand); } @@ -781,4 +829,7 @@ public boolean isLocationLowBattery() { public int getGeofenceMaximumAccuracy(){ return FileConfigReader.getInstance(this.ctx).getGeofenceMaximumAccuracy(); } + + + } diff --git a/app/src/main/java/com/prey/PreyEmail.java b/app/src/main/java/com/prey/PreyEmail.java index 2bea685a..036137fa 100644 --- a/app/src/main/java/com/prey/PreyEmail.java +++ b/app/src/main/java/com/prey/PreyEmail.java @@ -50,7 +50,12 @@ public static String getEmail(Context context) { Account account = getAccount(context,accountManager); if (account != null) { return account.name; + }else{ + PreyLogger.i("account nulo"); } + + }else{ + PreyLogger.i("sdk menor"); } return null; @@ -63,7 +68,11 @@ private static Account getAccount(Context context,AccountManager accountManager) Account[] accounts = accountManager.getAccountsByType("com.google"); if (accounts.length > 0) { return accounts[0]; + }else{ + PreyLogger.i("account length 0"); } + }else { + PreyLogger.i("account bajo eckair"); } return null; } diff --git a/app/src/main/java/com/prey/PreyPermission.java b/app/src/main/java/com/prey/PreyPermission.java new file mode 100644 index 00000000..44a6bb7d --- /dev/null +++ b/app/src/main/java/com/prey/PreyPermission.java @@ -0,0 +1,73 @@ +/******************************************************************************* + * Created by Orlando Aliaga + * Copyright 2015 Prey Inc. All rights reserved. + * License: GPLv3 + * Full license at "/LICENSE" + ******************************************************************************/ +package com.prey; + +import android.Manifest; +import android.content.Context; +import android.support.v4.content.PermissionChecker; + +public class PreyPermission { + + public static boolean canAccessFineLocation(Context ctx) { + boolean canAccessFineLocation=(PermissionChecker + .checkSelfPermission(ctx, android.Manifest.permission.ACCESS_FINE_LOCATION) == + PermissionChecker.PERMISSION_GRANTED ); + PreyLogger.d("canAccessFineLocation:" + canAccessFineLocation); + return canAccessFineLocation; + } + + public static boolean canAccessCoarseLocation(Context ctx) { + boolean canAccessCoarseLocation= PermissionChecker + .checkSelfPermission(ctx, android.Manifest.permission.ACCESS_COARSE_LOCATION) == + PermissionChecker.PERMISSION_GRANTED; + PreyLogger.d("canAccessCoarseLocation:"+canAccessCoarseLocation); + return canAccessCoarseLocation; + } + + + + public static boolean canAccessCamera(Context ctx) { + boolean canAccessCamera= PermissionChecker + .checkSelfPermission(ctx, android.Manifest.permission.CAMERA) == + PermissionChecker.PERMISSION_GRANTED; + PreyLogger.d("canAccessCamera:"+canAccessCamera); + return canAccessCamera; + } + + + public static boolean canAccessReadPhoneState(Context ctx) { + boolean canAccessReadPhoneState= PermissionChecker + .checkSelfPermission(ctx, Manifest.permission.READ_PHONE_STATE) == + PermissionChecker.PERMISSION_GRANTED; + PreyLogger.d("canAccessReadPhoneState:"+canAccessReadPhoneState); + return canAccessReadPhoneState; + } + + public static boolean canAccessSendSms(Context ctx) { + boolean canAccessSendSms= PermissionChecker + .checkSelfPermission(ctx, Manifest.permission.SEND_SMS) == + PermissionChecker.PERMISSION_GRANTED; + PreyLogger.d("canAccessSendSms:"+canAccessSendSms); + return canAccessSendSms; + } + + public static boolean canAccessReceiveSms(Context ctx) { + boolean canAccessReceiveSms= PermissionChecker + .checkSelfPermission(ctx, Manifest.permission.RECEIVE_SMS) == + PermissionChecker.PERMISSION_GRANTED; + PreyLogger.d("canAccessReceiveSms:"+canAccessReceiveSms); + return canAccessReceiveSms; + } + + public static boolean canAccessReadSms(Context ctx) { + boolean canAccessReadSms= PermissionChecker + .checkSelfPermission(ctx, Manifest.permission.READ_SMS) == + PermissionChecker.PERMISSION_GRANTED; + PreyLogger.d("canAccessReadSms:"+canAccessReadSms); + return canAccessReadSms; + } +} diff --git a/app/src/main/java/com/prey/PreyPhone.java b/app/src/main/java/com/prey/PreyPhone.java index b3e4da68..1da0935f 100644 --- a/app/src/main/java/com/prey/PreyPhone.java +++ b/app/src/main/java/com/prey/PreyPhone.java @@ -26,16 +26,20 @@ import com.prey.managers.PreyConnectivityManager; +import android.*; +import android.Manifest; import android.annotation.TargetApi; import android.app.ActivityManager; import android.app.ActivityManager.MemoryInfo; import android.content.Context; +import android.content.pm.PackageManager; import android.net.DhcpInfo; import android.net.wifi.ScanResult; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; import android.os.Build; import android.os.Debug; +import android.support.v4.app.ActivityCompat; import android.telephony.TelephonyManager; public class PreyPhone { @@ -66,6 +70,7 @@ private void updateHardware() { Map mapData = getProcessorData(); hardware = new Hardware(); hardware.setUuid(getUuid()); + hardware.setAndroidDeviceId(getAndroidDeviceId()); hardware.setBiosVendor(Build.MANUFACTURER); hardware.setBiosVersion(mapData.get("Revision")); hardware.setMbVendor(Build.MANUFACTURER); @@ -237,18 +242,23 @@ private String formatterIp(int ipAddress) { private void updateListWifi() { listWifi = new ArrayList(); - WifiManager wifiMgr = (WifiManager) ctx.getSystemService(Context.WIFI_SERVICE); - List listScanResults = wifiMgr.getScanResults(); - for (int i = 0; listScanResults != null && i < listScanResults.size(); i++) { - ScanResult scan = listScanResults.get(i); - Wifi _wifi = new Wifi(); - _wifi.setSsid(scan.SSID); - _wifi.setMacAddress(scan.BSSID); - _wifi.setSecurity(scan.capabilities); - _wifi.setSignalStrength(String.valueOf(scan.level)); - _wifi.setChannel(String.valueOf(getChannelFromFrequency(scan.frequency))); - listWifi.add(_wifi); + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M + || (ActivityCompat.checkSelfPermission(ctx, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED + || ActivityCompat.checkSelfPermission(ctx, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED)) { + WifiManager wifiMgr = (WifiManager) ctx.getSystemService(Context.WIFI_SERVICE); + List listScanResults = wifiMgr.getScanResults(); + for (int i = 0; listScanResults != null && i < listScanResults.size(); i++) { + ScanResult scan = listScanResults.get(i); + Wifi _wifi = new Wifi(); + _wifi.setSsid(scan.SSID); + _wifi.setMacAddress(scan.BSSID); + _wifi.setSecurity(scan.capabilities); + _wifi.setSignalStrength(String.valueOf(scan.level)); + _wifi.setChannel(String.valueOf(getChannelFromFrequency(scan.frequency))); + listWifi.add(_wifi); + + } } } @@ -288,7 +298,7 @@ public class Hardware { private long totalMemory; private long freeMemory; private long busyMemory; - + private String androidDeviceId; public long getTotalMemory() { return totalMemory; @@ -418,6 +428,10 @@ public void setCpuCores(String cpuCores) { this.cpuCores = cpuCores; } + public void setAndroidDeviceId(String androidDeviceId) { this.androidDeviceId = androidDeviceId; } + + public String getAndroidDeviceId() { return androidDeviceId; } + } public class Wifi { @@ -586,11 +600,9 @@ private int getCpuCores() { } private String getSerialNumber() { - PreyConfig config = PreyConfig.getPreyConfig(ctx); - if (config.isFroyoOrAbove()) { - TelephonyManager tManager = (TelephonyManager) ctx.getSystemService(Context.TELEPHONY_SERVICE); - return tManager.getDeviceId(); - } else { + try{ + return getUuid(); + } catch(Exception e) { return ""; } } @@ -627,12 +639,115 @@ public String getIPAddress() { return ip; } + private static final int REQUEST_READ_PHONE_STATE_PERMISSION = 225; + + + + private String getAndroidDeviceId() { + return android.provider.Settings.Secure.getString(ctx.getContentResolver(), android.provider.Settings.Secure.ANDROID_ID); + } + + + public int getSimState(){ + TelephonyManager tManager = (TelephonyManager) ctx.getSystemService(Context.TELEPHONY_SERVICE); + int simState =-1; + try { + if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + if (ctx.checkSelfPermission(android.Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) { + simState = tManager.getSimState(); + }else{ + PreyLogger.i("___________ask for permission getSimState READ_PHONE_STATE"); + } + }else { + simState = tManager.getSimState(); + } + }catch (Exception e){ + PreyLogger.e("Error getSimSerialNumber:"+e.getMessage(),e); + } + return simState; + } + + private String getUuid() { + String uuid=""; TelephonyManager tManager = (TelephonyManager) ctx.getSystemService(Context.TELEPHONY_SERVICE); - String uuid = tManager.getDeviceId(); + try { + if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + if (ctx.checkSelfPermission(android.Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) { + uuid=tManager.getDeviceId(); + }else{ + PreyLogger.i("___________ask for permission getDeviceId READ_PHONE_STATE"); + } + }else { + uuid = tManager.getDeviceId(); + } + }catch (Exception e){ + PreyLogger.e("Error getUuid:"+e.getMessage(),e); + } + PreyLogger.d("uuid["+uuid+"]"); return uuid; } + public String getSimSerialNumber(){ + TelephonyManager tManager = (TelephonyManager) ctx.getSystemService(Context.TELEPHONY_SERVICE); + String simSerialNumber =""; + try { + if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + if (ctx.checkSelfPermission(android.Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) { + simSerialNumber = tManager.getSimSerialNumber(); + }else{ + PreyLogger.i("___________ask for permission getSimSerialNumber READ_PHONE_STATE"); + } + }else { + simSerialNumber = tManager.getSimSerialNumber(); + } + }catch (Exception e){ + PreyLogger.e("Error getSimSerialNumber:"+e.getMessage(),e); + } + PreyLogger.d("simSerialNumber["+simSerialNumber+"]"); + return simSerialNumber; + } + + + public int getDataState(){ + TelephonyManager tManager = (TelephonyManager) ctx.getSystemService(Context.TELEPHONY_SERVICE); + int dataState =-1; + try { + if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + if (ctx.checkSelfPermission(android.Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) { + dataState = tManager.getDataState(); + }else{ + PreyLogger.i("___________ask for permission getDataState READ_PHONE_STATE"); + } + }else { + dataState = tManager.getDataState(); + } + }catch (Exception e){ + PreyLogger.e("Error getDataState:"+e.getMessage(),e); + } + return dataState; + } + + + public String getLine1Number(){ + TelephonyManager tManager = (TelephonyManager) ctx.getSystemService(Context.TELEPHONY_SERVICE); + String line1Number =""; + try { + if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + if (ctx.checkSelfPermission(android.Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) { + line1Number = tManager.getLine1Number(); + }else{ + PreyLogger.i("___________ask for permission getLine1Number READ_PHONE_STATE"); + } + }else { + line1Number = tManager.getLine1Number(); + } + }catch (Exception e){ + PreyLogger.e("Error getDataState:"+e.getMessage(),e); + } + return line1Number; + } + } diff --git a/app/src/main/java/com/prey/actions/geofences/GeofenceController.java b/app/src/main/java/com/prey/actions/geofences/GeofenceController.java index c1d92c2c..2e1347b4 100644 --- a/app/src/main/java/com/prey/actions/geofences/GeofenceController.java +++ b/app/src/main/java/com/prey/actions/geofences/GeofenceController.java @@ -6,10 +6,14 @@ ******************************************************************************/ package com.prey.actions.geofences; +import android.Manifest; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; +import android.content.pm.PackageManager; +import android.os.Build; import android.os.Bundle; +import android.support.v4.app.ActivityCompat; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.api.GoogleApiClient; @@ -93,7 +97,7 @@ private void deleteZones(final Context ctx) { } } - public void deleteAllZones(Context ctx){ + public void deleteAllZones(Context ctx) { List removeList = new ArrayList(); for (int i = 0; listBD != null && i < listBD.size(); i++) { GeofenceDto geo = listBD.get(i); @@ -153,28 +157,32 @@ private void addZones(final Context ctx) { try { Intent intent = new Intent(ctx, GeofenceIntentService.class); PendingIntent pendingIntent = PendingIntent.getService(ctx, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); - PendingResult result = LocationServices.GeofencingApi.addGeofences( - mGoogleApiClient, - geofencingRequest, - pendingIntent - ); - result.setResultCallback(new ResultCallback() { - @Override - public void onResult(Status status) { - PreyLogger.d("*********************connectionAddListener status"); - if (status.isSuccess()) { - PreyLogger.d("********saveGeofence"); - sendNotify(ctx, UtilJson.makeMapParam("start", "geofencing", "started", infoExtra)); - GeofenceDataSource dataSource = new GeofenceDataSource(ctx); - for (int i = 0; listToBdAdd != null && i < listToBdAdd.size(); i++) { - dataSource.createGeofence(listToBdAdd.get(i)); + if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.M ||ActivityCompat.checkSelfPermission(ctx, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { + PendingResult result = LocationServices.GeofencingApi.addGeofences( + mGoogleApiClient, + geofencingRequest, + pendingIntent + ); + result.setResultCallback(new ResultCallback() { + @Override + public void onResult(Status status) { + PreyLogger.d("*********************connectionAddListener status"); + if (status.isSuccess()) { + PreyLogger.d("********saveGeofence"); + sendNotify(ctx, UtilJson.makeMapParam("start", "geofencing", "started", infoExtra)); + GeofenceDataSource dataSource = new GeofenceDataSource(ctx); + for (int i = 0; listToBdAdd != null && i < listToBdAdd.size(); i++) { + dataSource.createGeofence(listToBdAdd.get(i)); + } + } else { + PreyLogger.d("*********************Registering geofence failed: " + status.getStatusMessage() + " : " + status.getStatusCode()); + sendNotify(ctx, UtilJson.makeMapParam("start", "geofencing", "failed", "status:" + status.isSuccess())); } - } else { - PreyLogger.d("*********************Registering geofence failed: " + status.getStatusMessage() + " : " + status.getStatusCode()); - sendNotify(ctx, UtilJson.makeMapParam("start", "geofencing", "failed", "status:" + status.isSuccess())); } - } - }); + }); + } + + } catch (Exception e) { PreyLogger.e("error ---->isConnected:" + e.getMessage(), e); sendNotify(ctx, UtilJson.makeMapParam("start", "geofencing", "failed", "error:" + e.getMessage())); @@ -226,25 +234,27 @@ public void init(final Context ctx) { if (mGoogleApiClient.isConnected()) { PreyLogger.d("---->isConnected"); try { - Intent intent = new Intent(ctx, GeofenceIntentService.class); - PendingIntent pendingIntent = PendingIntent.getService(ctx, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); - PendingResult result = LocationServices.GeofencingApi.addGeofences( - mGoogleApiClient, - geofencingRequest, - pendingIntent - ); - result.setResultCallback(new ResultCallback() { - @Override - public void onResult(Status status) { - PreyLogger.d("*********************connectionAddListener status :" + status); - if (status.isSuccess()) { - PreyLogger.d("********saveGeofence"); - } else { - PreyLogger.d("*********************Registering geofence failed: " + status.getStatusMessage() + " : " + status.getStatusCode()); - sendNotify(ctx, UtilJson.makeMapParam("start", "geofencing", "failed", "status:" + status.isSuccess())); + if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.M ||ActivityCompat.checkSelfPermission(ctx, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { + Intent intent = new Intent(ctx, GeofenceIntentService.class); + PendingIntent pendingIntent = PendingIntent.getService(ctx, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); + PendingResult result = LocationServices.GeofencingApi.addGeofences( + mGoogleApiClient, + geofencingRequest, + pendingIntent + ); + result.setResultCallback(new ResultCallback() { + @Override + public void onResult(Status status) { + PreyLogger.d("*********************connectionAddListener status :" + status); + if (status.isSuccess()) { + PreyLogger.d("********saveGeofence"); + } else { + PreyLogger.d("*********************Registering geofence failed: " + status.getStatusMessage() + " : " + status.getStatusCode()); + sendNotify(ctx, UtilJson.makeMapParam("start", "geofencing", "failed", "status:" + status.isSuccess())); + } } - } - }); + }); + } } catch (Exception e) { PreyLogger.e("error ---->isConnected:" + e.getMessage(), e); sendNotify(ctx, UtilJson.makeMapParam("start", "geofencing", "failed", "error:" + e.getMessage())); diff --git a/app/src/main/java/com/prey/actions/location/LocationThread.java b/app/src/main/java/com/prey/actions/location/LocationThread.java index f0a97354..01e39ceb 100644 --- a/app/src/main/java/com/prey/actions/location/LocationThread.java +++ b/app/src/main/java/com/prey/actions/location/LocationThread.java @@ -11,7 +11,11 @@ import com.prey.PreyLogger; import com.prey.actions.HttpDataService; +import android.Manifest; import android.content.Context; +import android.content.pm.PackageManager; +import android.os.Build; +import android.support.v4.app.ActivityCompat; import android.telephony.SmsManager; public class LocationThread extends Thread { @@ -38,8 +42,11 @@ public void run() { } private void sendSMS(String phoneNumber, String message) { - SmsManager sms = SmsManager.getDefault(); - sms.sendTextMessage(phoneNumber, null, message, null, null); + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M + || (ActivityCompat.checkSelfPermission(ctx, Manifest.permission.SEND_SMS) == PackageManager.PERMISSION_GRANTED )) { + SmsManager sms = SmsManager.getDefault(); + sms.sendTextMessage(phoneNumber, null, message, null, null); + } } diff --git a/app/src/main/java/com/prey/actions/location/LocationUtil.java b/app/src/main/java/com/prey/actions/location/LocationUtil.java index d4eff7a5..5ba07eb3 100644 --- a/app/src/main/java/com/prey/actions/location/LocationUtil.java +++ b/app/src/main/java/com/prey/actions/location/LocationUtil.java @@ -10,10 +10,14 @@ import java.util.List; import java.util.Map; +import android.Manifest; import android.content.Context; import android.content.Intent; +import android.content.pm.PackageManager; import android.location.Location; import android.location.LocationManager; +import android.os.Build; +import android.support.v4.app.ActivityCompat; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.GooglePlayServicesUtil; @@ -43,13 +47,20 @@ public static HttpDataService dataLocation(Context ctx) { PreyLogger.d("gps status:" + isGpsEnabled); PreyLogger.d("net status:" + isNetworkEnabled); PreyLocation location = null; - if (isGpsEnabled || isNetworkEnabled) { - String method=getMethod(isGpsEnabled,isNetworkEnabled); - PreyLocation locationPlay=null; - int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(ctx); - if (ConnectionResult.SUCCESS == resultCode) { - location = getPreyLocationPlayService(ctx, method); + + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M + || (ActivityCompat.checkSelfPermission(ctx, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED + || ActivityCompat.checkSelfPermission(ctx, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED)) { + if (isGpsEnabled || isNetworkEnabled) { + String method = getMethod(isGpsEnabled, isNetworkEnabled); + PreyLocation locationPlay = null; + int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(ctx); + if (ConnectionResult.SUCCESS == resultCode) { + location = getPreyLocationPlayService(ctx, method); + } } + }else{ + PreyLogger.d("ask for permission location"); } if(location==null) location = getDataLocationWifi(ctx); diff --git a/app/src/main/java/com/prey/actions/location/PreyGooglePlayServiceLocation.java b/app/src/main/java/com/prey/actions/location/PreyGooglePlayServiceLocation.java index 94dcc340..1ea0bca9 100644 --- a/app/src/main/java/com/prey/actions/location/PreyGooglePlayServiceLocation.java +++ b/app/src/main/java/com/prey/actions/location/PreyGooglePlayServiceLocation.java @@ -6,10 +6,14 @@ ******************************************************************************/ package com.prey.actions.location; +import android.Manifest; import android.content.Context; +import android.content.pm.PackageManager; import android.location.Location; +import android.os.Build; import android.os.Bundle; import android.os.Looper; +import android.support.v4.app.ActivityCompat; import com.google.android.gms.common.ConnectionResult; @@ -43,10 +47,10 @@ public class PreyGooglePlayServiceLocation implements private Context ctx; public void init(Context ctx) { - this.ctx=ctx; + this.ctx = ctx; PreyLogger.d("init"); - mCurrentLocation=null; - mLastUpdateTime=null; + mCurrentLocation = null; + mLastUpdateTime = null; mRequestingLocationUpdates = false; buildGoogleApiClient(); } @@ -74,7 +78,7 @@ protected synchronized void buildGoogleApiClient() { if (connectionResult.isSuccess() && mGoogleApiClient.isConnected()) { createLocationRequest(); startLocationUpdates(); - } else{ + } else { PreyLogger.i(String.format(GOOGLE_API_CLIENT_ERROR_MSG, connectionResult.getErrorCode())); } @@ -88,7 +92,7 @@ protected void createLocationRequest() { mLocationRequest.setFastestInterval(PreyConfig.FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS); - mLocationRequest.setPriority(PreyConfig.LOCATION_PRIORITY); + mLocationRequest.setPriority(PreyConfig.LOCATION_PRIORITY_HIGHT); } @@ -101,14 +105,13 @@ public void onConnected(Bundle connectionHint) { public void onLocationChanged(Location location) { PreyLogger.d("onLocationChanged"); mCurrentLocation = location; - if(location!=null) { + if (location != null) { mLastUpdateTime = DateFormat.getTimeInstance().format(new Date()); PreyLogger.d("latitude:" + location.getLatitude() + " longitude:" + location.getLongitude() + " accuracy:" + location.getAccuracy()); stopLocationUpdates(); } - } protected void stopLocationUpdates() { @@ -121,21 +124,25 @@ public void onConnectionSuspended(int cause) { mGoogleApiClient.connect(); } - @Override public void onConnectionFailed(ConnectionResult result) { PreyLogger.d("Connection failed: ConnectionResult.getErrorCode() = " + result.getErrorCode()); } protected void startLocationUpdates() { - try { - Looper.prepare(); - LocationServices.FusedLocationApi.requestLocationUpdates( - mGoogleApiClient, mLocationRequest, this); - Looper.loop(); - }catch (Exception e){ - PreyLogger.d("Error startLocationUpdates: "+e.getMessage()); + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M + || (ActivityCompat.checkSelfPermission(ctx, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED + && ActivityCompat.checkSelfPermission(ctx, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED)) { + try { + Looper.prepare(); + LocationServices.FusedLocationApi.requestLocationUpdates( + mGoogleApiClient, mLocationRequest, this); + Looper.loop(); + }catch (Exception e){ + PreyLogger.d("Error startLocationUpdates: "+e.getMessage()); + } } + } diff --git a/app/src/main/java/com/prey/actions/picture/PictureUtil.java b/app/src/main/java/com/prey/actions/picture/PictureUtil.java index 20f54365..6b756d30 100644 --- a/app/src/main/java/com/prey/actions/picture/PictureUtil.java +++ b/app/src/main/java/com/prey/actions/picture/PictureUtil.java @@ -9,9 +9,13 @@ import java.io.ByteArrayInputStream; import java.io.InputStream; +import android.Manifest; import android.content.Context; import android.content.Intent; +import android.content.pm.PackageManager; import android.media.AudioManager; +import android.os.Build; +import android.support.v4.app.ActivityCompat; import com.prey.PreyLogger; import com.prey.actions.HttpDataService; @@ -25,35 +29,40 @@ public class PictureUtil { public static HttpDataService getPicture(Context ctx) { HttpDataService data = null; try { - byte[] frontPicture = getPicture(ctx, "front"); - data = new HttpDataService(CameraAction.DATA_ID); - data.setList(true); - if (frontPicture != null) { - PreyLogger.d("front data length=" + frontPicture.length); - InputStream file = new ByteArrayInputStream(frontPicture); - EntityFile entityFile = new EntityFile(); - entityFile.setFile(file); - entityFile.setMimeType("image/png"); - entityFile.setName("picture.jpg"); - entityFile.setType("picture"); - entityFile.setLength(frontPicture.length); - data.addEntityFile(entityFile); - } - Integer numberOfCameras = SimpleCameraActivity.getNumberOfCameras(); - if (numberOfCameras!=null&&numberOfCameras > 1) { - Thread.sleep(6000); - byte[] backPicture = getPicture(ctx, "back"); - if (backPicture != null) { - PreyLogger.d("back data length=" + backPicture.length); - InputStream file = new ByteArrayInputStream(backPicture); + + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M + || ActivityCompat.checkSelfPermission(ctx, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED + ) { + byte[] frontPicture = getPicture(ctx, "front"); + data = new HttpDataService(CameraAction.DATA_ID); + data.setList(true); + if (frontPicture != null) { + PreyLogger.d("front data length=" + frontPicture.length); + InputStream file = new ByteArrayInputStream(frontPicture); EntityFile entityFile = new EntityFile(); entityFile.setFile(file); entityFile.setMimeType("image/png"); - entityFile.setName("screenshot.jpg"); - entityFile.setType("screenshot"); - entityFile.setLength(backPicture.length); + entityFile.setName("picture.jpg"); + entityFile.setType("picture"); + entityFile.setLength(frontPicture.length); data.addEntityFile(entityFile); } + Integer numberOfCameras = SimpleCameraActivity.getNumberOfCameras(); + if (numberOfCameras != null && numberOfCameras > 1) { + Thread.sleep(6000); + byte[] backPicture = getPicture(ctx, "back"); + if (backPicture != null) { + PreyLogger.d("back data length=" + backPicture.length); + InputStream file = new ByteArrayInputStream(backPicture); + EntityFile entityFile = new EntityFile(); + entityFile.setFile(file); + entityFile.setMimeType("image/png"); + entityFile.setName("screenshot.jpg"); + entityFile.setType("screenshot"); + entityFile.setLength(backPicture.length); + data.addEntityFile(entityFile); + } + } } } catch (Exception e) { PreyLogger.e("Error:" + e.getMessage() + e.getMessage(), e); diff --git a/app/src/main/java/com/prey/activities/DeviceReadyActivity.java b/app/src/main/java/com/prey/activities/DeviceReadyActivity.java index 86c2d5fa..aa48104c 100644 --- a/app/src/main/java/com/prey/activities/DeviceReadyActivity.java +++ b/app/src/main/java/com/prey/activities/DeviceReadyActivity.java @@ -6,56 +6,72 @@ ******************************************************************************/ package com.prey.activities; +import android.Manifest; +import android.annotation.TargetApi; import android.app.Activity; +import android.app.AlertDialog; +import android.app.NotificationManager; +import android.content.Context; import android.content.Intent; import android.content.pm.ActivityInfo; +import android.content.pm.PackageManager; import android.content.res.Configuration; import android.graphics.Typeface; import android.net.Uri; +import android.os.Build; import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.v4.app.ActivityCompat; +import android.support.v4.app.FragmentManager; +import android.support.v4.app.FragmentTransaction; +import android.support.v4.content.PermissionChecker; +import android.support.v7.app.AppCompatActivity; +import android.view.LayoutInflater; import android.view.View; import android.view.Window; +import android.view.WindowManager; +import android.widget.Button; +import android.widget.FrameLayout; +import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import com.prey.PreyConfig; import com.prey.PreyLogger; +import com.prey.PreyPermission; import com.prey.PreyStatus; import com.prey.R; -public class DeviceReadyActivity extends Activity { +public class DeviceReadyActivity extends AppCompatActivity + implements ActivityCompat.OnRequestPermissionsResultCallback { + @Override - public void onResume() { - PreyLogger.d("onResume of DeviceReadyActivity"); + protected void onResume() + { super.onResume(); + NotificationManager nManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); + nManager.cancel(PreyConfig.TAG,PreyConfig.NOTIFY_ANDROID_6); } @Override - public void onPause() { - PreyLogger.d("onPause of DeviceReadyActivity"); - super.onPause(); - } + protected void onCreate(Bundle savedInstanceState) { - @Override - public void onConfigurationChanged(Configuration newConfig) { - super.onConfigurationChanged(newConfig); - } - @Override - protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - requestWindowFeature(Window.FEATURE_NO_TITLE); + supportRequestWindowFeature(Window.FEATURE_NO_TITLE); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); - this.setContentView(R.layout.device_ready); + + setContentView(R.layout.device_ready); + PreyLogger.i("onCreate of DeviceReadyActivity"); TextView textView6=(TextView) findViewById(R.id.textView6); - Typeface titilliumWebRegular = Typeface.createFromAsset(getAssets(), "fonts/Titillium_Web/TitilliumWeb-Regular.ttf"); - Typeface titilliumWebBold = Typeface.createFromAsset(getAssets(), "fonts/Titillium_Web/TitilliumWeb-Bold.ttf"); - Typeface magdacleanmonoRegular = Typeface.createFromAsset(getAssets(), "fonts/MagdaClean/magdacleanmono-regular.ttf"); + final Typeface titilliumWebRegular = Typeface.createFromAsset(getAssets(), "fonts/Titillium_Web/TitilliumWeb-Regular.ttf"); + final Typeface titilliumWebBold = Typeface.createFromAsset(getAssets(), "fonts/Titillium_Web/TitilliumWeb-Bold.ttf"); + final Typeface magdacleanmonoRegular = Typeface.createFromAsset(getAssets(), "fonts/MagdaClean/magdacleanmono-regular.ttf"); TextView textView1=(TextView)findViewById(R.id.textView1); TextView textView2=(TextView)findViewById(R.id.textView2); @@ -149,7 +165,115 @@ public void onClick(View v) { } } + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){ + + PreyConfig.getPreyConfig(this).setCanAccessCamara(PreyPermission.canAccessCamera(this)); + PreyConfig.getPreyConfig(this).setCanAccessCoarseLocation(PreyPermission.canAccessCoarseLocation(this)); + PreyConfig.getPreyConfig(this).setCanAccessFineLocation(PreyPermission.canAccessFineLocation(this)); + PreyConfig.getPreyConfig(this).setCanAccessReadPhoneState(PreyPermission.canAccessReadPhoneState(this)); + + if(!PreyPermission.canAccessFineLocation(this)||!PreyPermission.canAccessCoarseLocation(this)||!PreyPermission.canAccessCamera(this)|| !PreyPermission.canAccessReadPhoneState(this)){ + + + AlertDialog.Builder builder = new AlertDialog.Builder(this); + + final FrameLayout frameView = new FrameLayout(this); + builder.setView(frameView); + + final AlertDialog alertDialog = builder.create(); + LayoutInflater inflater = alertDialog.getLayoutInflater(); + View dialoglayout = inflater.inflate(R.layout.warning, frameView); + + TextView warning_title=(TextView)dialoglayout.findViewById(R.id.warning_title); + TextView warning_body=(TextView)dialoglayout.findViewById(R.id.warning_body); + + warning_title.setTypeface(magdacleanmonoRegular); + warning_body.setTypeface(titilliumWebBold); + + + Button button_ok = (Button) dialoglayout.findViewById(R.id.button_ok); + Button button_close = (Button) dialoglayout.findViewById(R.id.button_close); + button_ok.setTypeface(titilliumWebBold); + button_close.setTypeface(titilliumWebBold); + + final Activity thisActivity=this; + button_ok.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + askForPermission(); + alertDialog.dismiss(); + + } + }); + + button_close.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + + + alertDialog.dismiss(); + } + }); + + + alertDialog.show(); + } + + + } + } + + @TargetApi(Build.VERSION_CODES.M) + private void askForPermission() { + ActivityCompat.requestPermissions(this, INITIAL_PERMS, REQUEST_PERMISSIONS); + } + + + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + PreyLogger.i("_______onRequestPermissionsResult_______requestCode:" + requestCode + " permissions:" + permissions.toString() + " grantResults:" + grantResults.toString()); + + switch (requestCode) { + case REQUEST_PERMISSIONS: { + if (grantResults[0] == + PackageManager.PERMISSION_GRANTED){ + PreyConfig.getPreyConfig(getApplicationContext()).setCanAccessCamara(true); + PreyLogger.i("______setCanAccessCamara"); + } + if (grantResults[1] == + PackageManager.PERMISSION_GRANTED){ + PreyConfig.getPreyConfig(getApplicationContext()).setCanAccessFineLocation(true); + } + if (grantResults[2] == + PackageManager.PERMISSION_GRANTED){ + PreyConfig.getPreyConfig(getApplicationContext()).setCanAccessCoarseLocation(true); + } + if (grantResults[3] == + PackageManager.PERMISSION_GRANTED){ + PreyConfig.getPreyConfig(getApplicationContext()).setCanAccessReadPhoneState(true); + } + return; + } + } + + } + + + private static final int REQUEST_PERMISSIONS = 1; + + private static final String[] INITIAL_PERMS={ + Manifest.permission.CAMERA, + Manifest.permission.ACCESS_FINE_LOCATION, + Manifest.permission.ACCESS_COARSE_LOCATION, + Manifest.permission.READ_PHONE_STATE + }; + + + + } diff --git a/app/src/main/java/com/prey/activities/LoginActivity.java b/app/src/main/java/com/prey/activities/LoginActivity.java index 49ddf7ee..b630e00c 100644 --- a/app/src/main/java/com/prey/activities/LoginActivity.java +++ b/app/src/main/java/com/prey/activities/LoginActivity.java @@ -6,26 +6,16 @@ ******************************************************************************/ package com.prey.activities; -import android.app.NotificationManager; - -import com.prey.PreyLogger; -import com.prey.PreyStatus; import com.prey.PreyVerify; -import com.prey.R; import android.content.Context; import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.res.Configuration; -import android.net.Uri; import android.os.Bundle; -import android.view.View; import android.view.Window; -import android.widget.Button; -import android.widget.TextView; import com.prey.PreyConfig; -import com.prey.backwardcompatibility.FroyoSupport; import com.prey.services.PreyDisablePowerOptionsService; public class LoginActivity extends PasswordActivity { @@ -41,10 +31,11 @@ protected void onCreate(Bundle savedInstanceState) { requestWindowFeature(Window.FEATURE_NO_TITLE); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); // Delete notifications (in case Activity was started by one of them) - NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); - nm.cancel(R.string.app_name); + startup(); + + boolean disablePowerOptions = PreyConfig.getPreyConfig(getApplicationContext()).isDisablePowerOptions(); if (disablePowerOptions) { startService(new Intent(getApplicationContext(), PreyDisablePowerOptionsService.class)); diff --git a/app/src/main/java/com/prey/activities/PreyConfigurationSMSActivity.java b/app/src/main/java/com/prey/activities/PreyConfigurationSMSActivity.java index a2d72297..92097a7d 100644 --- a/app/src/main/java/com/prey/activities/PreyConfigurationSMSActivity.java +++ b/app/src/main/java/com/prey/activities/PreyConfigurationSMSActivity.java @@ -6,18 +6,22 @@ ******************************************************************************/ package com.prey.activities; +import android.Manifest; import android.content.Intent; import android.content.pm.ActivityInfo; import android.net.Uri; +import android.os.Build; import android.os.Bundle; import android.preference.CheckBoxPreference; import android.preference.Preference; import android.preference.PreferenceActivity; import android.preference.PreferenceCategory; +import android.support.v4.app.ActivityCompat; import com.prey.PreyConfig; import com.prey.PreyEmail; import com.prey.PreyLogger; +import com.prey.PreyPermission; import com.prey.PreyStatus; import com.prey.R; import com.prey.backwardcompatibility.FroyoSupport; @@ -41,11 +45,15 @@ protected void onCreate(Bundle savedInstanceState) { pSMS.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { - CheckBoxPreference pSMS= (CheckBoxPreference)findPreference("PREFS_SMS_COMMAND"); - PreyLogger.i("preyConfig.newValue:"+newValue); - PreyConfig.getPreyConfig(getApplicationContext()).setSmsCommand((Boolean) newValue); - pSMS.setChecked((Boolean) newValue); - pSMS.setDefaultValue((Boolean) newValue); + CheckBoxPreference pSMS = (CheckBoxPreference) findPreference("PREFS_SMS_COMMAND"); + PreyLogger.i("preyConfig.newValue:" + newValue); + boolean value=((Boolean) newValue).booleanValue(); + PreyConfig.getPreyConfig(getApplicationContext()).setSmsCommand(value); + pSMS.setChecked(value); + pSMS.setDefaultValue(value); + if(value){ + requestPermission();; + } return false; } }); @@ -56,6 +64,9 @@ public boolean onPreferenceChange(Preference preference, Object newValue) { }else{ pSMS.setChecked(true); pSMS.setDefaultValue(true); + + + } } catch (Exception e) { @@ -68,10 +79,14 @@ public boolean onPreferenceChange(Preference preference, Object newValue) { protected void onResume() { super.onResume(); + } - - - + private void requestPermission(){ + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){ + if(!PreyPermission.canAccessSendSms(this)||!PreyPermission.canAccessReceiveSms(this)||!PreyPermission.canAccessReadSms(this)){ + ActivityCompat.requestPermissions(this, INITIAL_PERMS, REQUEST_PERMISSIONS); + } + } } @@ -88,6 +103,14 @@ protected void onPause() { } + private static final int REQUEST_PERMISSIONS = 5; + + private static final String[] INITIAL_PERMS={ + Manifest.permission.SEND_SMS, + Manifest.permission.RECEIVE_SMS, + Manifest.permission.READ_SMS + }; + diff --git a/app/src/main/java/com/prey/beta/actions/PreyBetaController.java b/app/src/main/java/com/prey/beta/actions/PreyBetaController.java index f33294b9..00bb2b0c 100644 --- a/app/src/main/java/com/prey/beta/actions/PreyBetaController.java +++ b/app/src/main/java/com/prey/beta/actions/PreyBetaController.java @@ -6,11 +6,14 @@ ******************************************************************************/ package com.prey.beta.actions; +import android.Manifest; import android.app.NotificationManager; import android.content.Context; import android.content.Intent; +import android.support.v4.content.PermissionChecker; import com.prey.PreyConfig; +import com.prey.PreyPermission; import com.prey.beta.services.PreyBetaRunnerService; public class PreyBetaController { @@ -23,8 +26,11 @@ public static void startPrey(Context ctx, String cmd) { PreyConfig config = PreyConfig.getPreyConfig(ctx); if (config.isThisDeviceAlreadyRegisteredWithPrey()) { // Cancelling the notification of the SMS that started Prey - NotificationManager nm = (NotificationManager) ctx.getSystemService(Context.NOTIFICATION_SERVICE); - nm.cancelAll(); + + PreyConfig.getPreyConfig(ctx).setCanAccessCamara(PreyPermission.canAccessCamera(ctx)); + PreyConfig.getPreyConfig(ctx).setCanAccessCoarseLocation(PreyPermission.canAccessCoarseLocation(ctx)); + PreyConfig.getPreyConfig(ctx).setCanAccessFineLocation(PreyPermission.canAccessFineLocation(ctx)); + PreyConfig.getPreyConfig(ctx).setCanAccessReadPhoneState(PreyPermission.canAccessReadPhoneState(ctx)); config.setRun(true); final Context context = ctx; @@ -49,5 +55,7 @@ public static void stopPrey(Context ctx) { ctx.stopService(new Intent(ctx, PreyBetaRunnerService.class)); } + + } diff --git a/app/src/main/java/com/prey/beta/services/PreyBetaRunnerService.java b/app/src/main/java/com/prey/beta/services/PreyBetaRunnerService.java index e3156bbb..62246fe3 100644 --- a/app/src/main/java/com/prey/beta/services/PreyBetaRunnerService.java +++ b/app/src/main/java/com/prey/beta/services/PreyBetaRunnerService.java @@ -63,8 +63,7 @@ public void onStart(Intent intent, int startId) { public void onDestroy() { PreyLogger.d("********************"); PreyLogger.d("PreyRunnerService is going to be destroyed"); - NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); - nm.cancelAll(); + ActionsController.getInstance(PreyBetaRunnerService.this).finishRunningJosb(); running = false; PreyLogger.d("PreyRunnerService has been destroyed"); 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 8b216ea6..9d44bc76 100644 --- a/app/src/main/java/com/prey/events/factories/EventFactory.java +++ b/app/src/main/java/com/prey/events/factories/EventFactory.java @@ -13,15 +13,21 @@ import org.json.JSONObject; +import android.app.NotificationManager; +import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.net.ConnectivityManager; import android.net.wifi.WifiManager; +import android.os.Build; import android.os.Bundle; import android.provider.Settings; import com.prey.PreyConfig; import com.prey.PreyLogger; +import com.prey.PreyPermission; +import com.prey.R; +import com.prey.activities.DeviceReadyActivity; import com.prey.beta.actions.PreyBetaController; import com.prey.events.Event; import com.prey.managers.PreyConnectivityManager; @@ -40,6 +46,7 @@ public static Event getEvent(Context ctx, Intent intent) { String message = "getEvent[" + intent.getAction() + "]"; PreyLogger.d(message); if (BOOT_COMPLETED.equals(intent.getAction())) { + notification(ctx); if (PreyConfig.getPreyConfig(ctx).isSimChanged()) { JSONObject info = new JSONObject(); try { @@ -111,6 +118,7 @@ public static Event getEvent(Context ctx, Intent intent) { } if (AIRPLANE_MODE.equals(intent.getAction())) { if (!isAirplaneModeOn(ctx)) { + notification(ctx); try { Thread.sleep(4000); } catch (Exception e) { @@ -149,5 +157,38 @@ public static boolean isValidLowBattery(Context ctx) { return false; } } + + + public static void notification(Context ctx){ + if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + PreyLogger.i("7________"); + 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)); + PreyConfig.getPreyConfig(ctx).setCanAccessReadPhoneState(PreyPermission.canAccessReadPhoneState(ctx)); + if (!PreyPermission.canAccessCamera(ctx) || !PreyPermission.canAccessCoarseLocation(ctx) || !PreyPermission.canAccessFineLocation(ctx)|| !PreyPermission.canAccessReadPhoneState(ctx)) { + Intent intent3 = new Intent(ctx, DeviceReadyActivity.class); + intent3.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | + Intent.FLAG_ACTIVITY_CLEAR_TASK); + PendingIntent pendingIntent = PendingIntent.getActivity( + ctx, + 0, + intent3, + PendingIntent.FLAG_UPDATE_CURRENT); + NotificationManager nManager = (NotificationManager) ctx.getSystemService(Context.NOTIFICATION_SERVICE); + android.support.v4.app.NotificationCompat.Builder mBuilder = + new android.support.v4.app.NotificationCompat.Builder(ctx) + .setSmallIcon(R.drawable.logo) + .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()); + } + } + PreyLogger.i("8________"); + } + } } diff --git a/app/src/main/java/com/prey/managers/PreyTelephonyManager.java b/app/src/main/java/com/prey/managers/PreyTelephonyManager.java index 65fbab76..8589bd3e 100644 --- a/app/src/main/java/com/prey/managers/PreyTelephonyManager.java +++ b/app/src/main/java/com/prey/managers/PreyTelephonyManager.java @@ -9,15 +9,16 @@ import android.content.Context; import android.telephony.TelephonyManager; +import com.prey.PreyPhone; + public class PreyTelephonyManager { - private String simSerialNumber=null; - private TelephonyManager telephony=null; + + private Context ctx; private static PreyTelephonyManager _instance = null; private PreyTelephonyManager(Context ctx) { - telephony = (TelephonyManager) ctx.getSystemService(Context.TELEPHONY_SERVICE); - simSerialNumber=telephony.getSimSerialNumber(); + this.ctx=ctx; } public static PreyTelephonyManager getInstance(Context ctx) { @@ -27,11 +28,11 @@ public static PreyTelephonyManager getInstance(Context ctx) { } public boolean isDataConnectivityEnabled(){ - return telephony.getDataState()==TelephonyManager.DATA_CONNECTED; + return new PreyPhone(ctx).getDataState()==TelephonyManager.DATA_CONNECTED; } public int getSimState(){ - return telephony.getSimState(); + return new PreyPhone(ctx).getSimState(); } public boolean isSimStateAbsent(){ @@ -42,15 +43,9 @@ public boolean isSimStateReady(){ return getSimState()==TelephonyManager.SIM_STATE_READY; } - public String getSimSerialNumber(){ - return simSerialNumber; - } - public void setSimSerialNumber(String simSerialNumber){ - this.simSerialNumber=simSerialNumber; - } public String getLine1Number(){ - return telephony.getLine1Number(); + return new PreyPhone(ctx).getLine1Number(); } diff --git a/app/src/main/java/com/prey/net/PreyWebServices.java b/app/src/main/java/com/prey/net/PreyWebServices.java index ea371dee..29b7e1f2 100644 --- a/app/src/main/java/com/prey/net/PreyWebServices.java +++ b/app/src/main/java/com/prey/net/PreyWebServices.java @@ -173,9 +173,10 @@ private PreyHttpResponse registerNewDevice(Context ctx, String api_key, String d String model = Build.MODEL; String vendor = "Google"; - if (!PreyConfig.getPreyConfig(ctx).isCupcakeOrAbove()) + try { vendor = AboveCupcakeSupport.getDeviceVendor(); - + }catch(Exception e){ + } HashMap parameters = new HashMap(); parameters.put("api_key", api_key); parameters.put("title", vendor + " " + model); @@ -190,7 +191,7 @@ private PreyHttpResponse registerNewDevice(Context ctx, String api_key, String d parameters = increaseData(ctx, parameters); TelephonyManager mTelephonyMgr = (TelephonyManager) ctx.getSystemService(Context.TELEPHONY_SERVICE); //String imsi = mTelephonyMgr.getSubscriberId(); - String imei = mTelephonyMgr.getDeviceId(); + String imei = new PreyPhone(ctx).getHardware().getAndroidDeviceId(); parameters.put("physical_address", imei); PreyHttpResponse response = null; @@ -494,6 +495,12 @@ public PreyHttpResponse sendPreyHttpData(Context ctx, ArrayList } + parameters.put( "hardware_attributes[uuid]", hardware.getUuid()); + parameters.put( "hardware_attributes[serial_number]", hardware.getSerialNumber()); + + + + // parameters.put("notification_id", preyConfig.getNotificationId()); @@ -605,7 +612,7 @@ public String sendNotifyActionResultPreyHttp(Context ctx, Map pa public PreyHttpResponse sendPreyHttpReport(Context ctx, List dataToSend) { PreyConfig preyConfig = PreyConfig.getPreyConfig(ctx); - Map parameters = new HashMap(); + HashMap parameters = new HashMap(); List entityFiles = new ArrayList(); for (HttpDataService httpDataService : dataToSend) { if (httpDataService != null) { @@ -616,9 +623,6 @@ public PreyHttpResponse sendPreyHttpReport(Context ctx, List da } } - //parameters.put("api_key", preyConfig.getApiKey()); - - PreyHttpResponse preyHttpResponse = null; try { String url = getReportUrlJson(ctx); diff --git a/app/src/main/java/com/prey/services/LocationService.java b/app/src/main/java/com/prey/services/LocationService.java index adc8108d..dc9a987b 100644 --- a/app/src/main/java/com/prey/services/LocationService.java +++ b/app/src/main/java/com/prey/services/LocationService.java @@ -6,16 +6,20 @@ ******************************************************************************/ package com.prey.services; +import android.Manifest; import android.app.Service; import android.content.Context; import android.content.Intent; +import android.content.pm.PackageManager; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.location.LocationProvider; import android.os.Binder; +import android.os.Build; import android.os.Bundle; import android.os.IBinder; +import android.support.v4.app.ActivityCompat; import com.prey.PreyConfig; import com.prey.PreyLogger; @@ -51,36 +55,44 @@ LocationService getService() { public void onCreate() { PreyLogger.d("LocationService is going to be started..."); - androidLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); - LocationProvider gpsLocationProvider = androidLocationManager.getProvider(LocationManager.GPS_PROVIDER); - LocationProvider networkProvider = androidLocationManager.getProvider(LocationManager.NETWORK_PROVIDER); - - if (gpsLocationProvider != null && androidLocationManager.isProviderEnabled(gpsLocationProvider.getName())) { - androidLocationManager.requestLocationUpdates(gpsLocationProvider.getName(), PreyConfig.UPDATE_INTERVAL, PreyConfig.LOCATION_PROVIDERS_MIN_REFRESH_DISTANCE, - gpsLocationListener); - PreyLogger.d("GPS Location provider has been started."); - } - - // 4x faster refreshing rate since this provider doesn't consume much battery. - if (networkProvider != null && androidLocationManager.isProviderEnabled(networkProvider.getName())) { - androidLocationManager.requestLocationUpdates(networkProvider.getName(), PreyConfig.UPDATE_INTERVAL / 4, PreyConfig.LOCATION_PROVIDERS_MIN_REFRESH_DISTANCE, - networkLocationListener); - PreyLogger.d("NETWORK Location provider has been started."); + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M + || (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED + || ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED)) { + + LocationProvider gpsLocationProvider = androidLocationManager.getProvider(LocationManager.GPS_PROVIDER); + LocationProvider networkProvider = androidLocationManager.getProvider(LocationManager.NETWORK_PROVIDER); + if (gpsLocationProvider != null && androidLocationManager.isProviderEnabled(gpsLocationProvider.getName())) { + androidLocationManager.requestLocationUpdates(gpsLocationProvider.getName(), PreyConfig.UPDATE_INTERVAL, PreyConfig.LOCATION_PROVIDERS_MIN_REFRESH_DISTANCE, + gpsLocationListener); + PreyLogger.d("GPS Location provider has been started."); + } + if (networkProvider != null && androidLocationManager.isProviderEnabled(networkProvider.getName())) { + androidLocationManager.requestLocationUpdates(networkProvider.getName(), PreyConfig.UPDATE_INTERVAL / 4, PreyConfig.LOCATION_PROVIDERS_MIN_REFRESH_DISTANCE, + networkLocationListener); + PreyLogger.d("NETWORK Location provider has been started."); + } + } else { + PreyLogger.i("___________ask for permission LocationService ACCESS_FINE_LOCATION"); } - PreyLogger.d("LocationService has been started..."); } @Override public void onDestroy() { - //PreyLogger.d("Location Serviceis going to be stopped"); + if (androidLocationManager != null) { - androidLocationManager.removeUpdates(gpsLocationListener); - androidLocationManager.removeUpdates(networkLocationListener); + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M + || (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED + && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED)) { + androidLocationManager.removeUpdates(gpsLocationListener); + androidLocationManager.removeUpdates(networkLocationListener); + + } + } - //PreyLogger.d("Location Service has been stopped"); + } @Override diff --git a/app/src/main/java/com/prey/services/PreyRunnerService.java b/app/src/main/java/com/prey/services/PreyRunnerService.java index 478fd01b..c25fdea4 100644 --- a/app/src/main/java/com/prey/services/PreyRunnerService.java +++ b/app/src/main/java/com/prey/services/PreyRunnerService.java @@ -55,8 +55,7 @@ public void onCreate() { public void onDestroy() { //PreyLogger.d("PreyRunnerService is going to be destroyed"); PreyConfig preyConfig = PreyConfig.getPreyConfig(PreyRunnerService.this); - NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); - nm.cancelAll(); + ActionsController.getInstance(PreyRunnerService.this).finishRunningJosb(); running = false; //PreyLogger.d("PreyRunnerService has been destroyed"); diff --git a/app/src/main/res/layout-large-port/warning.xml b/app/src/main/res/layout-large-port/warning.xml new file mode 100644 index 00000000..f32fdace --- /dev/null +++ b/app/src/main/res/layout-large-port/warning.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + +