From 4fe08078e0e118f61f9c994298c883c01d8fb05b Mon Sep 17 00:00:00 2001
From: wesaphzt <45947243+wesaphzt@users.noreply.github.com>
Date: Wed, 3 Jul 2019 15:52:27 +0000
Subject: [PATCH 01/23] Update README.md
---
README.md | 1 -
1 file changed, 1 deletion(-)
diff --git a/README.md b/README.md
index bb951b0..8959b81 100644
--- a/README.md
+++ b/README.md
@@ -4,7 +4,6 @@
[
](https://f-droid.org/packages/com.wesaphzt.privatelock/)
-[description]
A simple app to automatically lock your phone based on movement force, or the acceleration to be more accurate.
Private Lock can help protect your privacy and security by monitoring the accelerometer in the background and if the threshold is breached, lock the screen.
From 785f8d3eac1cb6ab143b543998013e0d3756b86a Mon Sep 17 00:00:00 2001
From: wesaphzt <45947243+wesaphzt@users.noreply.github.com>
Date: Wed, 3 Jul 2019 16:02:07 +0000
Subject: [PATCH 02/23] Update README.md
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 8959b81..d932c78 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
# Private Lock
-[](LICENSE)
+[](LICENSE)
[
](https://f-droid.org/packages/com.wesaphzt.privatelock/)
From 480907063bf6705ec6dd9c2af600651cfa37c7c1 Mon Sep 17 00:00:00 2001
From: wesaphzt
Date: Thu, 4 Jul 2019 10:16:15 +0100
Subject: [PATCH 03/23] Update gradle.properties
---
.idea/vcs.xml | 6 ++++++
gradle.properties | 7 ++++++-
2 files changed, 12 insertions(+), 1 deletion(-)
create mode 100644 .idea/vcs.xml
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..94a25f7
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/gradle.properties b/gradle.properties
index d546dea..024fd7e 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -14,4 +14,9 @@ org.gradle.jvmargs=-Xmx1536m
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true
-
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip
+distributionSha256Sum=53b71812f18cdb2777e9f1b2a0f2038683907c90bdc406bc64d8b400e1fb2c3b
From cd8226cddcbdbf3f81c0e74b1c8f8a6a80447f9f Mon Sep 17 00:00:00 2001
From: wesaphzt
Date: Sat, 7 Sep 2019 15:58:27 +0100
Subject: [PATCH 04/23] gradle update
---
.idea/codeStyles/Project.xml | 116 +++++++++++++++++++++++
build.gradle | 2 +-
gradle/wrapper/gradle-wrapper.properties | 4 +-
3 files changed, 119 insertions(+), 3 deletions(-)
create mode 100644 .idea/codeStyles/Project.xml
diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml
new file mode 100644
index 0000000..681f41a
--- /dev/null
+++ b/.idea/codeStyles/Project.xml
@@ -0,0 +1,116 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ xmlns:android
+
+ ^$
+
+
+
+
+
+
+
+
+ xmlns:.*
+
+ ^$
+
+
+ BY_NAME
+
+
+
+
+
+
+ .*:id
+
+ http://schemas.android.com/apk/res/android
+
+
+
+
+
+
+
+
+ .*:name
+
+ http://schemas.android.com/apk/res/android
+
+
+
+
+
+
+
+
+ name
+
+ ^$
+
+
+
+
+
+
+
+
+ style
+
+ ^$
+
+
+
+
+
+
+
+
+ .*
+
+ ^$
+
+
+ BY_NAME
+
+
+
+
+
+
+ .*
+
+ http://schemas.android.com/apk/res/android
+
+
+ ANDROID_ATTRIBUTE_ORDER
+
+
+
+
+
+
+ .*
+
+ .*
+
+
+ BY_NAME
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
index ab373f6..171c15e 100644
--- a/build.gradle
+++ b/build.gradle
@@ -7,7 +7,7 @@ buildscript {
}
dependencies {
- classpath 'com.android.tools.build:gradle:3.4.1'
+ classpath 'com.android.tools.build:gradle:3.5.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index d8f104c..2fd976f 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
-#Sun May 26 22:24:42 BST 2019
+#Fri Sep 06 22:42:44 BST 2019
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip
From 87e349d02a949e722878a0f93542611314693f65 Mon Sep 17 00:00:00 2001
From: wesaphzt
Date: Sat, 7 Sep 2019 16:00:32 +0100
Subject: [PATCH 05/23] animation scaling issues fixed
---
.../wesaphzt/privatelock/MainActivity.java | 25 +++++++++++++++++--
.../privatelock/animation/Circle.java | 17 +++++++++----
app/src/main/res/layout/content_main.xml | 18 +++++++------
3 files changed, 45 insertions(+), 15 deletions(-)
diff --git a/app/src/main/java/com/wesaphzt/privatelock/MainActivity.java b/app/src/main/java/com/wesaphzt/privatelock/MainActivity.java
index a6e5b97..16d88b8 100644
--- a/app/src/main/java/com/wesaphzt/privatelock/MainActivity.java
+++ b/app/src/main/java/com/wesaphzt/privatelock/MainActivity.java
@@ -22,10 +22,11 @@ import androidx.fragment.app.FragmentTransaction;
import android.os.CountDownTimer;
import android.preference.PreferenceManager;
-import android.util.Log;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
+import android.view.ViewTreeObserver;
+import android.widget.RelativeLayout;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;
@@ -126,10 +127,30 @@ public class MainActivity extends AppCompatActivity {
}
});
- //https://stackoverflow.com/questions/29381474/how-to-draw-a-circle-with-animation-in-android-with-circle-size-based-on-a-value
circle = findViewById(R.id.circle);
circle_bg = findViewById(R.id.circle_bg);
+ final RelativeLayout relativeLayout = findViewById(R.id.content_main);
+ final RelativeLayout rlCircle = findViewById(R.id.rlCircle);
+
+ //scale height/width of animation
+ relativeLayout.getViewTreeObserver().addOnGlobalLayoutListener(
+ new ViewTreeObserver.OnGlobalLayoutListener() {
+
+ @Override
+ public void onGlobalLayout() {
+ //only want to do this once
+ relativeLayout.getViewTreeObserver().removeGlobalOnLayoutListener(this);
+
+ circle.setRect((circle.getHeight() / 2), (circle.getHeight()) / 2);
+ circle_bg.setRect((circle_bg.getHeight() / 2), (circle_bg.getHeight()) / 2);
+
+ circle.setX((rlCircle.getWidth() - circle.getRect()) / 2);
+ circle_bg.setX((rlCircle.getWidth() - circle.getRect()) / 2);
+ }
+ });
+
+
circle.setColor(circleDefaultR, circleDefaultG, circleDefaultB);
//set background circle
CircleAngleAnimation animation = new CircleAngleAnimation(circle_bg, 360);
diff --git a/app/src/main/java/com/wesaphzt/privatelock/animation/Circle.java b/app/src/main/java/com/wesaphzt/privatelock/animation/Circle.java
index fc914ef..229d5ce 100644
--- a/app/src/main/java/com/wesaphzt/privatelock/animation/Circle.java
+++ b/app/src/main/java/com/wesaphzt/privatelock/animation/Circle.java
@@ -13,15 +13,14 @@ public class Circle extends View {
private static final int START_ANGLE_POINT = 90;
private final Paint paint;
- private final RectF rect;
+ private RectF rect;
private float angle;
+ private final int strokeWidth = 10;
public Circle(Context context, AttributeSet attrs) {
super(context, attrs);
- final int strokeWidth = 10;
-
paint = new Paint();
paint.setAntiAlias(true);
paint.setStyle(Paint.Style.FILL);
@@ -29,8 +28,8 @@ public class Circle extends View {
//circle color (currently set upon instance)
//paint.setColor(Color.BLUE);
- //size
- rect = new RectF(strokeWidth, strokeWidth, 600 + strokeWidth, 600 + strokeWidth);
+ //size (currently set upon instance)
+ //rect = new RectF(strokeWidth, strokeWidth, 230 + strokeWidth, 230 + strokeWidth);
//initial angle (optional)
angle = 0;
@@ -53,4 +52,12 @@ public class Circle extends View {
public void setAngle(float angle) {
this.angle = angle;
}
+
+ public void setRect(int right, int bottom) {
+ this.rect = new RectF(strokeWidth, strokeWidth, right, bottom);
+ }
+
+ public float getRect() {
+ return rect.right;
+ }
}
\ No newline at end of file
diff --git a/app/src/main/res/layout/content_main.xml b/app/src/main/res/layout/content_main.xml
index 87ea85d..5718324 100644
--- a/app/src/main/res/layout/content_main.xml
+++ b/app/src/main/res/layout/content_main.xml
@@ -142,22 +142,24 @@
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_centerHorizontal="true"
+ android:gravity="center_horizontal" />
From 0a0079db3720801aa492726ce4a8c6dba52d44b8 Mon Sep 17 00:00:00 2001
From: wesaphzt
Date: Sat, 7 Sep 2019 16:09:45 +0100
Subject: [PATCH 06/23] intro slide changes
---
app/src/main/res/drawable/ic_intro_lock.xml | 32 ++++++---------------
app/src/main/res/values/strings.xml | 9 +++---
2 files changed, 14 insertions(+), 27 deletions(-)
diff --git a/app/src/main/res/drawable/ic_intro_lock.xml b/app/src/main/res/drawable/ic_intro_lock.xml
index 6cf40c7..eaf2dbf 100644
--- a/app/src/main/res/drawable/ic_intro_lock.xml
+++ b/app/src/main/res/drawable/ic_intro_lock.xml
@@ -1,24 +1,10 @@
-
-
-
-
-
-
-
+
+
+
+
+
+
+
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 3372656..93248c1 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -16,12 +16,13 @@
Value: %1$s
- Private Lock
+ @string/app_name
Private Lock, the perfect companion to help protect your phone privacy and security.
- Protect against theft
+ Protect Against Theft
If someone takes your phone while you\'re using it, your phone is unlocked and all your private data is up for grabs.
- Always running
- Should something happen, your phone will be quickly locked, dependent on the sensitivity you\'ve set.
+ Always Running
+ Should something happen, your phone will be quickly locked, dependent on the sensitivity you\'ve set.
+ \n\nDon\'t forget to disable battery optimization!
Start
From 4d67f4dd47217e9196a49e1a40e2ab50999e7c6f Mon Sep 17 00:00:00 2001
From: wesaphzt
Date: Sat, 7 Sep 2019 19:54:36 +0100
Subject: [PATCH 07/23] notification priority for nougat & < changed to low
---
.../java/com/wesaphzt/privatelock/service/LockService.java | 3 +++
1 file changed, 3 insertions(+)
diff --git a/app/src/main/java/com/wesaphzt/privatelock/service/LockService.java b/app/src/main/java/com/wesaphzt/privatelock/service/LockService.java
index 1fbc0f9..72b2960 100644
--- a/app/src/main/java/com/wesaphzt/privatelock/service/LockService.java
+++ b/app/src/main/java/com/wesaphzt/privatelock/service/LockService.java
@@ -31,6 +31,7 @@ import com.wesaphzt.privatelock.receivers.NotificationReceiver;
import com.wesaphzt.privatelock.receivers.PauseReceiver;
import com.wesaphzt.privatelock.receivers.PresenceReceiver;
+import static androidx.core.app.NotificationCompat.PRIORITY_LOW;
import static androidx.core.app.NotificationCompat.PRIORITY_MIN;
public class LockService extends JobIntentService {
@@ -206,6 +207,7 @@ public class LockService extends JobIntentService {
.setTicker(getString(R.string.app_name) + " is running")
.addAction(android.R.drawable.ic_menu_close_clear_cancel, "STOP", pendingCloseIntent)
.addAction(android.R.drawable.ic_menu_close_clear_cancel, "PAUSE", pendingPauseIntent)
+ .setPriority(PRIORITY_LOW)
.setOngoing(true)
.build();
@@ -221,6 +223,7 @@ public class LockService extends JobIntentService {
.setTicker(getString(R.string.app_name) + " is running")
.addAction(android.R.drawable.ic_menu_close_clear_cancel, "STOP", pendingCloseIntent)
.addAction(android.R.drawable.ic_menu_close_clear_cancel, "PAUSE", pendingPauseIntent)
+ .setPriority(PRIORITY_LOW)
.setOngoing(true)
.build();
}
From 53828ddc3f3e4bc03b24c398483a538a92c3719b Mon Sep 17 00:00:00 2001
From: wesaphzt
Date: Sun, 8 Sep 2019 20:00:33 +0100
Subject: [PATCH 08/23] fix to stop service correctly preventing mem leak &
code cleanup
---
.../wesaphzt/privatelock/MainActivity.java | 24 +---
.../receivers/NotificationReceiver.java | 41 +-----
.../privatelock/service/LockService.java | 130 +++++++++++++-----
.../widget/LockWidgetProvider.java | 48 ++-----
4 files changed, 117 insertions(+), 126 deletions(-)
diff --git a/app/src/main/java/com/wesaphzt/privatelock/MainActivity.java b/app/src/main/java/com/wesaphzt/privatelock/MainActivity.java
index 16d88b8..bb6aa04 100644
--- a/app/src/main/java/com/wesaphzt/privatelock/MainActivity.java
+++ b/app/src/main/java/com/wesaphzt/privatelock/MainActivity.java
@@ -37,7 +37,6 @@ import com.wesaphzt.privatelock.fragments.FragmentAbout;
import com.wesaphzt.privatelock.fragments.FragmentDonate;
import com.wesaphzt.privatelock.fragments.FragmentSettings;
import com.wesaphzt.privatelock.receivers.DeviceAdminReceiver;
-import com.wesaphzt.privatelock.receivers.PauseReceiver;
import com.wesaphzt.privatelock.service.LockService;
import com.wesaphzt.privatelock.widget.LockWidgetProvider;
@@ -291,27 +290,12 @@ public class MainActivity extends AppCompatActivity {
private void startServicePrep() {
//stop this listener
mSensorManager.unregisterListener(mActiveListener);
- Intent intent = new Intent(context, LockService.class);
- try {
- //stop any already running service
- LockService.mSensorManager.unregisterListener(LockService.activeListener);
- startLockService(intent);
- LockWidgetProvider lockWidgetProvider = new LockWidgetProvider();
- lockWidgetProvider.setWidgetStart(context);
+ //start service intent
+ Intent startIntent = new Intent(context, LockService.class);
+ startIntent.setAction(LockService.ACTION_START_FOREGROUND_SERVICE);
- //cancel any pause timer that might be running
- try {
- PauseReceiver.mCountdown.cancel();
- } catch (Exception e) {
- e.printStackTrace();
- }
-
- } catch (Exception e) {
- startLockService(intent);
- LockWidgetProvider lockWidgetProvider = new LockWidgetProvider();
- lockWidgetProvider.setWidgetStart(context);
- }
+ startLockService(startIntent);
}
@Override
diff --git a/app/src/main/java/com/wesaphzt/privatelock/receivers/NotificationReceiver.java b/app/src/main/java/com/wesaphzt/privatelock/receivers/NotificationReceiver.java
index cb57455..92453ef 100644
--- a/app/src/main/java/com/wesaphzt/privatelock/receivers/NotificationReceiver.java
+++ b/app/src/main/java/com/wesaphzt/privatelock/receivers/NotificationReceiver.java
@@ -1,20 +1,11 @@
package com.wesaphzt.privatelock.receivers;
-import android.app.NotificationManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
-import android.content.SharedPreferences;
import android.os.Build;
-import android.preference.PreferenceManager;
import com.wesaphzt.privatelock.service.LockService;
-import com.wesaphzt.privatelock.widget.LockWidgetProvider;
-import com.wesaphzt.privatelock.R;
-
-import static com.wesaphzt.privatelock.service.LockService.activeListener;
-import static com.wesaphzt.privatelock.service.LockService.mSensorManager;
-import static com.wesaphzt.privatelock.service.LockService.disabled;
public class NotificationReceiver extends BroadcastReceiver {
@@ -23,37 +14,13 @@ public class NotificationReceiver extends BroadcastReceiver {
String action = intent.getStringExtra("lock_service");
if (action.equals("lock_service_notification")) {
- SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
- NotificationManager notificationManager =
- (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
- LockWidgetProvider lockWidgetProvider = new LockWidgetProvider();
+ Intent stopIntent = new Intent(context, LockService.class);
+ stopIntent.setAction(LockService.ACTION_STOP_FOREGROUND_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
- String id = context.getString(R.string.notification_main_channel_id);
- notificationManager.deleteNotificationChannel(id);
- if(PauseReceiver.isRunning) {
- PauseReceiver.mCountdown.cancel(); PauseReceiver.isRunning = false;
- disabled = true;
- mSensorManager.unregisterListener(activeListener);
- lockWidgetProvider.setWidgetStop(context);
- } else {
- disabled = true;
- mSensorManager.unregisterListener(activeListener);
- lockWidgetProvider.setWidgetStop(context);
- }
-
+ context.startForegroundService(stopIntent);
} else {
- notificationManager.cancel(LockService.NOTIFICATION_ID);
- if(PauseReceiver.isRunning) {
- PauseReceiver.mCountdown.cancel(); PauseReceiver.isRunning = false;
- disabled = true;
- mSensorManager.unregisterListener(activeListener);
- lockWidgetProvider.setWidgetStop(context);
- } else {
- disabled = true;
- mSensorManager.unregisterListener(activeListener);
- lockWidgetProvider.setWidgetStop(context);
- }
+ context.startService(stopIntent);
}
}
}
diff --git a/app/src/main/java/com/wesaphzt/privatelock/service/LockService.java b/app/src/main/java/com/wesaphzt/privatelock/service/LockService.java
index 72b2960..7dc19eb 100644
--- a/app/src/main/java/com/wesaphzt/privatelock/service/LockService.java
+++ b/app/src/main/java/com/wesaphzt/privatelock/service/LockService.java
@@ -30,6 +30,7 @@ import com.wesaphzt.privatelock.receivers.DeviceAdminReceiver;
import com.wesaphzt.privatelock.receivers.NotificationReceiver;
import com.wesaphzt.privatelock.receivers.PauseReceiver;
import com.wesaphzt.privatelock.receivers.PresenceReceiver;
+import com.wesaphzt.privatelock.widget.LockWidgetProvider;
import static androidx.core.app.NotificationCompat.PRIORITY_LOW;
import static androidx.core.app.NotificationCompat.PRIORITY_MIN;
@@ -67,53 +68,115 @@ public class LockService extends JobIntentService {
public static final int DEFAULT_SENSITIVITY = 10;
public static int SENSITIVITY;
+ public static final String ACTION_STOP_FOREGROUND_SERVICE = "ACTION_STOP_FOREGROUND_SERVICE";
+ public static final String ACTION_START_FOREGROUND_SERVICE = "ACTION_START_FOREGROUND_SERVICE";
+
+ PresenceReceiver presenceReceiver;
+
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
context = getApplicationContext();
CHANNEL_ID = getString(R.string.notification_main_channel_id);
CHANNEL_NAME = getString(R.string.notification_main_channel_name);
//------------------------------------------------------------------------------------------
- PresenceReceiver presenceReceiver = new PresenceReceiver();
+ if (intent != null) {
+ String action = intent.getAction();
- IntentFilter intentFilter = new IntentFilter(Intent.ACTION_USER_PRESENT);
- intentFilter.addAction(Intent.ACTION_SCREEN_OFF);
- registerReceiver(presenceReceiver, intentFilter);
- //------------------------------------------------------------------------------------------
- SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
- try {
- SENSITIVITY = prefs.getInt(MainActivity.PREFS_THRESHOLD, DEFAULT_SENSITIVITY);
- } catch (Exception e) {
- Toast.makeText(context, "Unable to retrieve threshold", Toast.LENGTH_LONG).show();
+ LockWidgetProvider lockWidgetProvider = new LockWidgetProvider();
- }
- //------------------------------------------------------------------------------------------
- notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
+ switch (action) {
- //dpm
- mDPM = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
- mDeviceAdmin = new ComponentName(this, DeviceAdminReceiver.class);
+ case ACTION_START_FOREGROUND_SERVICE:
+ presenceReceiver = new PresenceReceiver();
- //prevent lock animation artifacts
- mInitialized = false;
+ IntentFilter intentFilter = new IntentFilter(Intent.ACTION_USER_PRESENT);
+ intentFilter.addAction(Intent.ACTION_SCREEN_OFF);
+ registerReceiver(presenceReceiver, intentFilter);
- mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
- mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
+ //------------------------------------------------------------------------------------------
+ SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
+ try {
+ SENSITIVITY = prefs.getInt(MainActivity.PREFS_THRESHOLD, DEFAULT_SENSITIVITY);
+ } catch (Exception e) {
+ Toast.makeText(context, "Unable to retrieve threshold", Toast.LENGTH_LONG).show();
+ }
+ //------------------------------------------------------------------------------------------
+ notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
- setSensorListener();
- mSensorManager.registerListener(activeListener, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);
+ //dpm
+ mDPM = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
+ mDeviceAdmin = new ComponentName(this, DeviceAdminReceiver.class);
- setNotification();
- //------------------------------------------------------------------------------------------
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
- //create foreground service
- startForeground(NOTIFICATION_ID, notification);
- disabled = false;
+ //prevent lock animation artifacts
+ mInitialized = false;
+ mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
+ mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
+
+ setSensorListener();
+ mSensorManager.registerListener(activeListener, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);
+
+ setNotification();
+ //------------------------------------------------------------------------------------------
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+ //create foreground service
+ startForeground(NOTIFICATION_ID, notification);
+ lockWidgetProvider.setWidgetStart(context);
+ disabled = false;
+
+ } else {
+ notificationManager.notify(NOTIFICATION_ID, notification);
+ lockWidgetProvider.setWidgetStart(context);
+ disabled = false;
+ }
+
+ break;
+
+ case ACTION_STOP_FOREGROUND_SERVICE:
+ try {
+ unregisterReceiver(presenceReceiver);
+ mSensorManager.unregisterListener(activeListener);
+
+ disabled = true;
+ mInitialized = false;
+
+ if (PauseReceiver.isRunning) {
+ PauseReceiver.mCountdown.cancel();
+ PauseReceiver.isRunning = false;
+ }
+ } catch (Exception e) {
+ disabled = true;
+ mInitialized = false;
+
+ if (PauseReceiver.isRunning) {
+ PauseReceiver.mCountdown.cancel();
+ PauseReceiver.isRunning = false;
+ }
+ }
+
+ try {
+ NotificationManager notificationManager =
+ (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+ String id = context.getString(R.string.notification_main_channel_id);
+ notificationManager.deleteNotificationChannel(id);
+ } else {
+ notificationManager.cancel(LockService.NOTIFICATION_ID);
+ }
+ } catch (Exception e) {
+ lockWidgetProvider.setWidgetStop(context);
+ stopService(intent);
+ }
+
+ lockWidgetProvider.setWidgetStop(context);
+ stopService(intent);
+
+ break;
+ }
} else {
- notificationManager.notify(NOTIFICATION_ID, notification);
- disabled = false;
+ Toast.makeText(context, "Something went wrong...", Toast.LENGTH_LONG).show();
}
- //------------------------------------------------------------------------------------------
+
return LockService.START_STICKY;
}
@@ -126,6 +189,11 @@ public class LockService extends JobIntentService {
@Override
protected void onHandleWork(@NonNull Intent intent) { }
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+ }
+
private void setSensorListener() {
activeListener = new SensorEventListener() {
@Override
diff --git a/app/src/main/java/com/wesaphzt/privatelock/widget/LockWidgetProvider.java b/app/src/main/java/com/wesaphzt/privatelock/widget/LockWidgetProvider.java
index 0f973a6..8fe1ecb 100644
--- a/app/src/main/java/com/wesaphzt/privatelock/widget/LockWidgetProvider.java
+++ b/app/src/main/java/com/wesaphzt/privatelock/widget/LockWidgetProvider.java
@@ -1,6 +1,5 @@
package com.wesaphzt.privatelock.widget;
-import android.app.NotificationManager;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
@@ -14,12 +13,6 @@ import android.widget.RemoteViews;
import com.wesaphzt.privatelock.service.LockService;
import com.wesaphzt.privatelock.R;
-import com.wesaphzt.privatelock.receivers.PauseReceiver;
-
-import static com.wesaphzt.privatelock.service.LockService.CHANNEL_ID;
-import static com.wesaphzt.privatelock.service.LockService.activeListener;
-import static com.wesaphzt.privatelock.service.LockService.disabled;
-import static com.wesaphzt.privatelock.service.LockService.mSensorManager;
public class LockWidgetProvider extends AppWidgetProvider {
@@ -72,33 +65,14 @@ public class LockWidgetProvider extends AppWidgetProvider {
editor.putBoolean(context.getString(R.string.widget_prefs_service_id), false);
editor.apply();
- NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
+ Intent stopIntent = new Intent(context, LockService.class);
+ stopIntent.setAction(LockService.ACTION_STOP_FOREGROUND_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
- notificationManager.deleteNotificationChannel(CHANNEL_ID);
- //if countdown timer is running (pause), cancel
- if(PauseReceiver.isRunning) {
- PauseReceiver.mCountdown.cancel(); PauseReceiver.isRunning = false;
- disabled = true;
- mSensorManager.unregisterListener(activeListener);
- setWidgetStop(context);
- } else {
- disabled = true;
- mSensorManager.unregisterListener(activeListener);
- setWidgetStop(context);
- }
+ context.startForegroundService(stopIntent);
+
} else {
- notificationManager.cancel(LockService.NOTIFICATION_ID);
- if(PauseReceiver.isRunning) {
- PauseReceiver.mCountdown.cancel(); PauseReceiver.isRunning = false;
- disabled = true;
- mSensorManager.unregisterListener(activeListener);
- setWidgetStop(context);
- } else {
- disabled = true;
- mSensorManager.unregisterListener(activeListener);
- setWidgetStop(context);
- }
+ context.startService(stopIntent);
}
//if service is not running
@@ -106,15 +80,13 @@ public class LockWidgetProvider extends AppWidgetProvider {
editor.putBoolean(context.getString(R.string.widget_prefs_service_id), true);
editor.commit();
- Intent i = new Intent(context, LockService.class);
+ Intent startIntent = new Intent(context, LockService.class);
+ startIntent.setAction(LockService.ACTION_START_FOREGROUND_SERVICE);
+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
- disabled = false;
- context.startForegroundService(i);
- setWidgetStart(context);
+ context.startForegroundService(startIntent);
} else {
- disabled = false;
- context.startService(i);
- setWidgetStart(context);
+ context.startService(startIntent);
}
}
}
From 813b948f1995f9162856e15cfab9ae0857786cb6 Mon Sep 17 00:00:00 2001
From: wesaphzt
Date: Mon, 9 Sep 2019 13:33:04 +0100
Subject: [PATCH 09/23] option to run locking functionality while phone is
locked to force pin
---
.../fragments/FragmentSettings.java | 43 ++++++++++++++++++-
.../privatelock/receivers/BootReceiver.java | 2 +-
.../privatelock/service/LockService.java | 21 +++++----
app/src/main/res/values/strings.xml | 3 ++
app/src/main/res/xml/preferences.xml | 21 +++++----
5 files changed, 71 insertions(+), 19 deletions(-)
diff --git a/app/src/main/java/com/wesaphzt/privatelock/fragments/FragmentSettings.java b/app/src/main/java/com/wesaphzt/privatelock/fragments/FragmentSettings.java
index 5456de0..5289f55 100644
--- a/app/src/main/java/com/wesaphzt/privatelock/fragments/FragmentSettings.java
+++ b/app/src/main/java/com/wesaphzt/privatelock/fragments/FragmentSettings.java
@@ -7,7 +7,9 @@ import androidx.annotation.Nullable;
import android.view.Menu;
import android.view.View;
+import android.widget.Toast;
+import androidx.preference.CheckBoxPreference;
import androidx.preference.PreferenceFragmentCompat;
import androidx.preference.PreferenceManager;
@@ -15,17 +17,26 @@ import com.wesaphzt.privatelock.R;
public class FragmentSettings extends PreferenceFragmentCompat {
- private SharedPreferences prefs;
+ private Context context;
+
+ private CheckBoxPreference cbRunConstant;
+
+ private SharedPreferences sharedPreferences;
+ private SharedPreferences.OnSharedPreferenceChangeListener sharedPreferenceChangeListener;
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
addPreferencesFromResource(R.xml.preferences);
setHasOptionsMenu(true);
- Context context = getContext();
+ context = getContext();
+
+ sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
//this static call will reset default values only on the first read
PreferenceManager.setDefaultValues(context, R.xml.preferences, false);
+
+ cbRunConstant = (CheckBoxPreference) findPreference("RUN_CONSTANT");
}
@Override
@@ -33,6 +44,24 @@ public class FragmentSettings extends PreferenceFragmentCompat {
super.onCreate(savedInstanceState);
}
+ @Override
+ public void onResume() {
+ super.onResume();
+ sharedPreferences.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener);
+ }
+
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+ sharedPreferences.unregisterOnSharedPreferenceChangeListener(sharedPreferenceChangeListener);
+ }
+
+ @Override
+ public void onPause() {
+ super.onPause();
+ sharedPreferences.unregisterOnSharedPreferenceChangeListener(sharedPreferenceChangeListener);
+ }
+
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
@@ -41,6 +70,16 @@ public class FragmentSettings extends PreferenceFragmentCompat {
//bg color
view.setBackgroundColor(getResources().getColor(R.color.white));
+
+ sharedPreferenceChangeListener = new SharedPreferences.OnSharedPreferenceChangeListener() {
+ @Override
+ public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
+ if(key.equals("RUN_CONSTANT") && cbRunConstant.isChecked()) {
+ Toast.makeText(context, getString(R.string.settings_restart_service_toast), Toast.LENGTH_LONG).show();
+ }
+ }
+ };
+ sharedPreferences.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener);
}
@Override
diff --git a/app/src/main/java/com/wesaphzt/privatelock/receivers/BootReceiver.java b/app/src/main/java/com/wesaphzt/privatelock/receivers/BootReceiver.java
index 7c27e60..115483a 100644
--- a/app/src/main/java/com/wesaphzt/privatelock/receivers/BootReceiver.java
+++ b/app/src/main/java/com/wesaphzt/privatelock/receivers/BootReceiver.java
@@ -16,7 +16,7 @@ public class BootReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
- SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);;
+ SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
if(prefs.getBoolean("START_ON_BOOT", false)) {
Intent i = new Intent(context, LockService.class);
diff --git a/app/src/main/java/com/wesaphzt/privatelock/service/LockService.java b/app/src/main/java/com/wesaphzt/privatelock/service/LockService.java
index 7dc19eb..e68c528 100644
--- a/app/src/main/java/com/wesaphzt/privatelock/service/LockService.java
+++ b/app/src/main/java/com/wesaphzt/privatelock/service/LockService.java
@@ -83,18 +83,18 @@ public class LockService extends JobIntentService {
String action = intent.getAction();
LockWidgetProvider lockWidgetProvider = new LockWidgetProvider();
+ SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
switch (action) {
-
case ACTION_START_FOREGROUND_SERVICE:
- presenceReceiver = new PresenceReceiver();
-
- IntentFilter intentFilter = new IntentFilter(Intent.ACTION_USER_PRESENT);
- intentFilter.addAction(Intent.ACTION_SCREEN_OFF);
- registerReceiver(presenceReceiver, intentFilter);
+ if(! prefs.getBoolean("RUN_CONSTANT", false)) {
+ presenceReceiver = new PresenceReceiver();
+ IntentFilter intentFilter = new IntentFilter(Intent.ACTION_USER_PRESENT);
+ intentFilter.addAction(Intent.ACTION_SCREEN_OFF);
+ registerReceiver(presenceReceiver, intentFilter);
+ }
//------------------------------------------------------------------------------------------
- SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
try {
SENSITIVITY = prefs.getInt(MainActivity.PREFS_THRESHOLD, DEFAULT_SENSITIVITY);
} catch (Exception e) {
@@ -134,7 +134,9 @@ public class LockService extends JobIntentService {
case ACTION_STOP_FOREGROUND_SERVICE:
try {
- unregisterReceiver(presenceReceiver);
+ if(! prefs.getBoolean("RUN_CONSTANT", false)) {
+ unregisterReceiver(presenceReceiver);
+ }
mSensorManager.unregisterListener(activeListener);
disabled = true;
@@ -145,6 +147,9 @@ public class LockService extends JobIntentService {
PauseReceiver.isRunning = false;
}
} catch (Exception e) {
+ if(! prefs.getBoolean("RUN_CONSTANT", false)) {
+ unregisterReceiver(presenceReceiver);
+ }
disabled = true;
mInitialized = false;
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 93248c1..ca2b24a 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -62,6 +62,9 @@
Bug report image
+
+ If service is running, restart for setting to take effect.
+
Bitcoin image
Litecoin image
diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml
index 4ef18b6..c60b8a6 100644
--- a/app/src/main/res/xml/preferences.xml
+++ b/app/src/main/res/xml/preferences.xml
@@ -2,20 +2,25 @@
+
+
+
+
+
-
+ android:title="Pause length" />
-
-
\ No newline at end of file
From 1b2a5139b91ed77b31f4ba1f455167d71ab1bfa8 Mon Sep 17 00:00:00 2001
From: wesaphzt
Date: Mon, 9 Sep 2019 13:48:09 +0100
Subject: [PATCH 10/23] version increase
---
app/build.gradle | 12 ++++++------
fastlane/metadata/android/en-US/changelogs/2.txt | 5 +++++
2 files changed, 11 insertions(+), 6 deletions(-)
create mode 100644 fastlane/metadata/android/en-US/changelogs/2.txt
diff --git a/app/build.gradle b/app/build.gradle
index 951f4aa..03d19fe 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -1,13 +1,13 @@
apply plugin: 'com.android.application'
android {
- compileSdkVersion 28
+ compileSdkVersion 29
defaultConfig {
applicationId "com.wesaphzt.privatelock"
minSdkVersion 17
- targetSdkVersion 28
- versionCode 1
- versionName "1.0"
+ targetSdkVersion 29
+ versionCode 2
+ versionName "1.1"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
@@ -22,10 +22,10 @@ dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.intuit.sdp:sdp-android:1.0.3'
- implementation 'androidx.preference:preference:1.0.0'
+ implementation 'androidx.preference:preference:1.1.0'
implementation 'com.github.AppIntro:AppIntro:5.1.0'
- implementation 'androidx.appcompat:appcompat:1.0.2'
+ implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'com.google.android.material:material:1.0.0'
diff --git a/fastlane/metadata/android/en-US/changelogs/2.txt b/fastlane/metadata/android/en-US/changelogs/2.txt
new file mode 100644
index 0000000..53b95b4
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/2.txt
@@ -0,0 +1,5 @@
+- Animation scaling issues fixed
+- Stop service correctly to fix memory leak & reduce code
+- Notification priority changed to low for Nougat and lower
+- Option added to run service when screen is off to be able to force PIN entry
+- Gradle & library updates
\ No newline at end of file
From 10db550988ad6c5c4c1f1e9965b47031576dbcc6 Mon Sep 17 00:00:00 2001
From: wesaphzt
Date: Mon, 9 Sep 2019 16:13:21 +0100
Subject: [PATCH 11/23] boot update
---
.../wesaphzt/privatelock/receivers/BootReceiver.java | 12 ++++--------
1 file changed, 4 insertions(+), 8 deletions(-)
diff --git a/app/src/main/java/com/wesaphzt/privatelock/receivers/BootReceiver.java b/app/src/main/java/com/wesaphzt/privatelock/receivers/BootReceiver.java
index 115483a..d2babb0 100644
--- a/app/src/main/java/com/wesaphzt/privatelock/receivers/BootReceiver.java
+++ b/app/src/main/java/com/wesaphzt/privatelock/receivers/BootReceiver.java
@@ -8,7 +8,6 @@ import android.os.Build;
import android.preference.PreferenceManager;
import com.wesaphzt.privatelock.service.LockService;
-import com.wesaphzt.privatelock.widget.LockWidgetProvider;
public class BootReceiver extends BroadcastReceiver {
@@ -18,17 +17,14 @@ public class BootReceiver extends BroadcastReceiver {
if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
if(prefs.getBoolean("START_ON_BOOT", false)) {
- Intent i = new Intent(context, LockService.class);
+ Intent startIntent = new Intent(context, LockService.class);
+ startIntent.setAction(LockService.ACTION_START_FOREGROUND_SERVICE);
//check android api
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
- context.startForegroundService(i);
- LockWidgetProvider lockWidgetProvider = new LockWidgetProvider();
- lockWidgetProvider.setWidgetStart(context);
+ context.startForegroundService(startIntent);
} else {
- context.startService(i);
- LockWidgetProvider lockWidgetProvider = new LockWidgetProvider();
- lockWidgetProvider.setWidgetStart(context);
+ context.startService(startIntent);
}
}
}
From 063beba464f1af5e8177c4892ce940222e761ea3 Mon Sep 17 00:00:00 2001
From: wesaphzt
Date: Mon, 9 Sep 2019 20:21:24 +0100
Subject: [PATCH 12/23] adjust constant run option slightly to prevent annoying
artifact
---
.../receivers/PresenceReceiver.java | 8 +++-
.../privatelock/service/LockService.java | 43 +++++++------------
2 files changed, 22 insertions(+), 29 deletions(-)
diff --git a/app/src/main/java/com/wesaphzt/privatelock/receivers/PresenceReceiver.java b/app/src/main/java/com/wesaphzt/privatelock/receivers/PresenceReceiver.java
index 0aad1e3..02e8331 100644
--- a/app/src/main/java/com/wesaphzt/privatelock/receivers/PresenceReceiver.java
+++ b/app/src/main/java/com/wesaphzt/privatelock/receivers/PresenceReceiver.java
@@ -3,6 +3,8 @@ package com.wesaphzt.privatelock.receivers;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
+import android.content.SharedPreferences;
+import android.preference.PreferenceManager;
import static com.wesaphzt.privatelock.service.LockService.disabled;
import static com.wesaphzt.privatelock.service.LockService.mInitialized;
@@ -11,6 +13,8 @@ public class PresenceReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
+ SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
+
if (intent.getAction().equals(Intent.ACTION_USER_PRESENT)) {
//prevent lock animation artifacts
mInitialized = false;
@@ -18,7 +22,9 @@ public class PresenceReceiver extends BroadcastReceiver {
disabled = false;
} else if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
- disabled = true;
+ if(! prefs.getBoolean("RUN_CONSTANT", false)) {
+ disabled = true;
+ }
}
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/wesaphzt/privatelock/service/LockService.java b/app/src/main/java/com/wesaphzt/privatelock/service/LockService.java
index e68c528..0543cfa 100644
--- a/app/src/main/java/com/wesaphzt/privatelock/service/LockService.java
+++ b/app/src/main/java/com/wesaphzt/privatelock/service/LockService.java
@@ -87,13 +87,11 @@ public class LockService extends JobIntentService {
switch (action) {
case ACTION_START_FOREGROUND_SERVICE:
- if(! prefs.getBoolean("RUN_CONSTANT", false)) {
- presenceReceiver = new PresenceReceiver();
+ presenceReceiver = new PresenceReceiver();
- IntentFilter intentFilter = new IntentFilter(Intent.ACTION_USER_PRESENT);
- intentFilter.addAction(Intent.ACTION_SCREEN_OFF);
- registerReceiver(presenceReceiver, intentFilter);
- }
+ IntentFilter intentFilter = new IntentFilter(Intent.ACTION_USER_PRESENT);
+ intentFilter.addAction(Intent.ACTION_SCREEN_OFF);
+ registerReceiver(presenceReceiver, intentFilter);
//------------------------------------------------------------------------------------------
try {
SENSITIVITY = prefs.getInt(MainActivity.PREFS_THRESHOLD, DEFAULT_SENSITIVITY);
@@ -134,29 +132,19 @@ public class LockService extends JobIntentService {
case ACTION_STOP_FOREGROUND_SERVICE:
try {
- if(! prefs.getBoolean("RUN_CONSTANT", false)) {
- unregisterReceiver(presenceReceiver);
- }
mSensorManager.unregisterListener(activeListener);
-
- disabled = true;
- mInitialized = false;
-
- if (PauseReceiver.isRunning) {
- PauseReceiver.mCountdown.cancel();
- PauseReceiver.isRunning = false;
- }
} catch (Exception e) {
- if(! prefs.getBoolean("RUN_CONSTANT", false)) {
- unregisterReceiver(presenceReceiver);
- }
- disabled = true;
- mInitialized = false;
+ e.printStackTrace();
+ }
- if (PauseReceiver.isRunning) {
- PauseReceiver.mCountdown.cancel();
- PauseReceiver.isRunning = false;
- }
+ unregisterReceiver(presenceReceiver);
+
+ disabled = true;
+ mInitialized = false;
+
+ if (PauseReceiver.isRunning) {
+ PauseReceiver.mCountdown.cancel();
+ PauseReceiver.isRunning = false;
}
try {
@@ -169,8 +157,7 @@ public class LockService extends JobIntentService {
notificationManager.cancel(LockService.NOTIFICATION_ID);
}
} catch (Exception e) {
- lockWidgetProvider.setWidgetStop(context);
- stopService(intent);
+ e.printStackTrace();
}
lockWidgetProvider.setWidgetStop(context);
From 1cc68f0fff26efb54a7e15e2049ac52f3041f591 Mon Sep 17 00:00:00 2001
From: wesaphzt
Date: Wed, 11 Sep 2019 22:43:45 +0100
Subject: [PATCH 13/23] add onActivityResult super
---
app/src/main/java/com/wesaphzt/privatelock/MainActivity.java | 1 +
1 file changed, 1 insertion(+)
diff --git a/app/src/main/java/com/wesaphzt/privatelock/MainActivity.java b/app/src/main/java/com/wesaphzt/privatelock/MainActivity.java
index bb6aa04..3d4dc50 100644
--- a/app/src/main/java/com/wesaphzt/privatelock/MainActivity.java
+++ b/app/src/main/java/com/wesaphzt/privatelock/MainActivity.java
@@ -242,6 +242,7 @@ public class MainActivity extends AppCompatActivity {
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+ super.onActivityResult(requestCode, resultCode, data);
//launch service if permission granted
if (requestCode == REQUEST_CODE_ENABLE_ADMIN) {
if(resultCode == Activity.RESULT_OK) {
From 18018360d3f46aa7bd0f6096fc3fcd014e65280a Mon Sep 17 00:00:00 2001
From: wesaphzt
Date: Wed, 11 Sep 2019 22:45:25 +0100
Subject: [PATCH 14/23] check for admin
---
.../com/wesaphzt/privatelock/service/LockService.java | 11 +++++++++--
1 file changed, 9 insertions(+), 2 deletions(-)
diff --git a/app/src/main/java/com/wesaphzt/privatelock/service/LockService.java b/app/src/main/java/com/wesaphzt/privatelock/service/LockService.java
index 0543cfa..5ae9c43 100644
--- a/app/src/main/java/com/wesaphzt/privatelock/service/LockService.java
+++ b/app/src/main/java/com/wesaphzt/privatelock/service/LockService.java
@@ -229,13 +229,20 @@ public class LockService extends JobIntentService {
if (total > SENSITIVITY) {
try {
- mDPM.lockNow();
+ if (isActiveAdmin()) {
+ mDPM.lockNow();
+ } else {
+ Toast.makeText(context, "Device admin not enabled", Toast.LENGTH_LONG).show();
+ }
} catch (Exception e) {
- Toast.makeText(context, "Error locking, does app have device admin permissions?", Toast.LENGTH_SHORT).show();
+ Toast.makeText(context, "Unknown locking error", Toast.LENGTH_SHORT).show();
}
}
}
}
+ private boolean isActiveAdmin() {
+ return mDPM.isAdminActive(mDeviceAdmin);
+ }
private void setNotification() {
//notification
From e51a510645240a8b1029e5f5807d6f85d8ae196c Mon Sep 17 00:00:00 2001
From: wesaphzt
Date: Sat, 14 Sep 2019 16:39:18 +0100
Subject: [PATCH 15/23] reworked animation logic
---
.../wesaphzt/privatelock/MainActivity.java | 51 +++++++++++--------
.../privatelock/service/LockService.java | 2 +-
2 files changed, 32 insertions(+), 21 deletions(-)
diff --git a/app/src/main/java/com/wesaphzt/privatelock/MainActivity.java b/app/src/main/java/com/wesaphzt/privatelock/MainActivity.java
index 3d4dc50..37e2b0c 100644
--- a/app/src/main/java/com/wesaphzt/privatelock/MainActivity.java
+++ b/app/src/main/java/com/wesaphzt/privatelock/MainActivity.java
@@ -70,8 +70,9 @@ public class MainActivity extends AppCompatActivity {
public static final String PREFS_THRESHOLD = "THRESHOLD";
private CountDownTimer cdTimer;
- private final int cdTimerLength = 2000;
+ private final int cdTimerLength = 1500;
private boolean isRunning = false;
+ private boolean isHit = false;
private Circle circle;
private Circle circle_bg;
@@ -83,6 +84,8 @@ public class MainActivity extends AppCompatActivity {
private int circleLockR = 88; private int circleLockG = 255; private int circleLockB = 135;
int animationDuration = 220;
+ CircleAngleAnimation animation;
+
//first run
final private String PREF_VERSION_CODE_KEY = "VERSION_CODE";
final private int DOESNT_EXIST = -1;
@@ -168,11 +171,14 @@ public class MainActivity extends AppCompatActivity {
//timer when lock hit
cdTimer = new CountDownTimer(cdTimerLength, 1000) {
+
public void onTick(long millisUntilFinished) {
isRunning = true;
+ isHit = true;
}
public void onFinish() {
isRunning = false;
+ isHit = false;
circle.setColor(circleDefaultR, circleDefaultG, circleDefaultB);
}
};
@@ -425,35 +431,40 @@ public class MainActivity extends AppCompatActivity {
mLastY = y;
mLastZ = z;
- float total = (float) Math.sqrt(deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ);
+ float total = (float) Math.sqrt((deltaX * deltaX) + (deltaY * deltaY) + (deltaZ * deltaZ));
- int calculatedAngleInt;
+ int calculatedAngleInt = 0;
- if (total <= mSensitivity) {
- //do nothing if timer currently running
+ if (total >= mSensitivity) {
+ //lock screen threshold hit
+
+ if(!isHit) {
+ CircleAngleAnimation anim = new CircleAngleAnimation(circle, 360);
+ circle.setColor(circleLockR, circleLockG, circleLockB);
+ anim.setDuration(animationDuration);
+ //set lock color
+ circle.startAnimation(anim);
+
+ isHit = true;
+ cdTimer.start();
+ } else {
+ if(!isRunning) {
+ isRunning = true;
+ }
+ }
+ } else {
if(isRunning)
return;
+ if(isHit)
+ return;
+
calculatedAngleInt = Math.round((total / mSensitivity) * 360);
- CircleAngleAnimation animation = new CircleAngleAnimation(circle, calculatedAngleInt);
+ animation = new CircleAngleAnimation(circle, calculatedAngleInt);
animation.setDuration(animationDuration);
circle.startAnimation(animation);
- } else if (total > mSensitivity) {
- //lock screen threshold hit
- if(isRunning)
- //do nothing if timer currently running
- return;
-
- CircleAngleAnimation animation = new CircleAngleAnimation(circle, 360);
- animation.setDuration(animationDuration);
- //set lock color
- circle.setColor(circleLockR, circleLockG, circleLockB);
- circle.startAnimation(animation);
-
- cdTimer.start();
}
}
}
-
}
diff --git a/app/src/main/java/com/wesaphzt/privatelock/service/LockService.java b/app/src/main/java/com/wesaphzt/privatelock/service/LockService.java
index 5ae9c43..92eb0b0 100644
--- a/app/src/main/java/com/wesaphzt/privatelock/service/LockService.java
+++ b/app/src/main/java/com/wesaphzt/privatelock/service/LockService.java
@@ -225,7 +225,7 @@ public class LockService extends JobIntentService {
mLastY = y;
mLastZ = z;
- float total = (float) Math.sqrt(deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ);
+ float total = (float) Math.sqrt((deltaX * deltaX) + (deltaY * deltaY) + (deltaZ * deltaZ));
if (total > SENSITIVITY) {
try {
From 000eb550a2c89451789a937837893df9fa6e67b1 Mon Sep 17 00:00:00 2001
From: wesaphzt
Date: Sun, 15 Sep 2019 14:53:47 +0100
Subject: [PATCH 16/23] fix links
---
.../com/wesaphzt/privatelock/fragments/FragmentAbout.java | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/app/src/main/java/com/wesaphzt/privatelock/fragments/FragmentAbout.java b/app/src/main/java/com/wesaphzt/privatelock/fragments/FragmentAbout.java
index 67d8a44..d11cc99 100644
--- a/app/src/main/java/com/wesaphzt/privatelock/fragments/FragmentAbout.java
+++ b/app/src/main/java/com/wesaphzt/privatelock/fragments/FragmentAbout.java
@@ -21,9 +21,8 @@ import com.wesaphzt.privatelock.R;
public class FragmentAbout extends Fragment {
private static String GITHUB_URI;
- private static final String LICENSE_URI = GITHUB_URI + "/blob/master/LICENSE.txt";
- private static final String BUG_REPORT_URI = GITHUB_URI + "/issues";
-
+ private static String LICENSE_URI;
+ private static String BUG_REPORT_URI;
private static String AUTHOR_GITHUB;
@Nullable
@@ -32,6 +31,8 @@ public class FragmentAbout extends Fragment {
View v = inflater.inflate(R.layout.fragment_about, container, false);
GITHUB_URI = getString(R.string.app_github);
+ LICENSE_URI = GITHUB_URI + "/blob/master/LICENSE";
+ BUG_REPORT_URI = GITHUB_URI + "/issues";
AUTHOR_GITHUB = getString(R.string.app_github_dev);
String versionName = "";
From 248a8eeb0b3b8deabe98cae1c24d457e22f0bbdb Mon Sep 17 00:00:00 2001
From: wesaphzt
Date: Tue, 17 Sep 2019 13:26:58 +0100
Subject: [PATCH 17/23] haptic feedback
---
app/src/main/AndroidManifest.xml | 1 +
.../privatelock/service/LockService.java | 49 ++++++++++++++++++-
app/src/main/res/xml/preferences.xml | 6 +++
3 files changed, 55 insertions(+), 1 deletion(-)
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 02f9247..8551446 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -5,6 +5,7 @@
+
diff --git a/app/src/main/java/com/wesaphzt/privatelock/service/LockService.java b/app/src/main/java/com/wesaphzt/privatelock/service/LockService.java
index 92eb0b0..69157f4 100644
--- a/app/src/main/java/com/wesaphzt/privatelock/service/LockService.java
+++ b/app/src/main/java/com/wesaphzt/privatelock/service/LockService.java
@@ -15,12 +15,15 @@ import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Build;
+import android.os.CountDownTimer;
import android.os.IBinder;
import androidx.annotation.NonNull;
import androidx.core.app.JobIntentService;
import androidx.core.app.NotificationCompat;
+import android.os.VibrationEffect;
+import android.os.Vibrator;
import android.preference.PreferenceManager;
import android.widget.Toast;
@@ -32,6 +35,8 @@ import com.wesaphzt.privatelock.receivers.PauseReceiver;
import com.wesaphzt.privatelock.receivers.PresenceReceiver;
import com.wesaphzt.privatelock.widget.LockWidgetProvider;
+import java.util.Objects;
+
import static androidx.core.app.NotificationCompat.PRIORITY_LOW;
import static androidx.core.app.NotificationCompat.PRIORITY_MIN;
@@ -73,6 +78,13 @@ public class LockService extends JobIntentService {
PresenceReceiver presenceReceiver;
+ //check to stop multiple triggers
+ boolean isHit = false;
+
+ //vibrate
+ boolean isHaptic = false;
+ private final int vibrateTime = 100;
+
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
context = getApplicationContext();
@@ -193,6 +205,11 @@ public class LockService extends JobIntentService {
if(LockService.disabled)
return;
+ //check prefs here so options can be changed without service restart
+ SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
+
+ isHaptic = prefs.getBoolean("HAPTIC_FEEDBACK", false);
+
sensorCalc(event);
}
@@ -230,7 +247,28 @@ public class LockService extends JobIntentService {
if (total > SENSITIVITY) {
try {
if (isActiveAdmin()) {
- mDPM.lockNow();
+
+ if(!isHaptic) {
+ mDPM.lockNow();
+ } else { //if haptic
+ if(!isHit) { //run if not triggered yet
+ isHit = true;
+
+ mDPM.lockNow();
+ vibrateItBaby();
+
+ //stop multiple haptic triggers in a row
+ new CountDownTimer(1000, 1000) {
+ public void onTick(long millisUntilFinished) {
+ isHit = true;
+ }
+ public void onFinish() {
+ isHit = false;
+ }
+ }.start();
+ }
+ }
+
} else {
Toast.makeText(context, "Device admin not enabled", Toast.LENGTH_LONG).show();
}
@@ -240,6 +278,15 @@ public class LockService extends JobIntentService {
}
}
}
+
+ private void vibrateItBaby() {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+ ((Vibrator) Objects.requireNonNull(getSystemService(VIBRATOR_SERVICE))).vibrate(VibrationEffect.createOneShot(vibrateTime, VibrationEffect.DEFAULT_AMPLITUDE));
+ } else {
+ ((Vibrator) getSystemService(VIBRATOR_SERVICE)).vibrate(vibrateTime);
+ }
+ }
+
private boolean isActiveAdmin() {
return mDPM.isAdminActive(mDeviceAdmin);
}
diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml
index c60b8a6..b9ad5ab 100644
--- a/app/src/main/res/xml/preferences.xml
+++ b/app/src/main/res/xml/preferences.xml
@@ -8,6 +8,12 @@
android:key="START_ON_BOOT"
android:title="System start" />
+
+
Date: Fri, 20 Sep 2019 13:04:11 +0100
Subject: [PATCH 18/23] fix background service for < 8.0
---
.../java/com/wesaphzt/privatelock/service/LockService.java | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/app/src/main/java/com/wesaphzt/privatelock/service/LockService.java b/app/src/main/java/com/wesaphzt/privatelock/service/LockService.java
index 69157f4..76ed2f3 100644
--- a/app/src/main/java/com/wesaphzt/privatelock/service/LockService.java
+++ b/app/src/main/java/com/wesaphzt/privatelock/service/LockService.java
@@ -178,11 +178,10 @@ public class LockService extends JobIntentService {
break;
}
} else {
- Toast.makeText(context, "Something went wrong...", Toast.LENGTH_LONG).show();
+ return LockService.START_REDELIVER_INTENT;
}
-
- return LockService.START_STICKY;
+ return LockService.START_REDELIVER_INTENT;
}
@Override
From 36bb398fd4a32ded8a8bd9a06fee71b71a75001b Mon Sep 17 00:00:00 2001
From: wesaphzt
Date: Fri, 20 Sep 2019 13:06:13 +0100
Subject: [PATCH 19/23] release 1.2
---
app/build.gradle | 4 ++--
fastlane/metadata/android/en-US/changelogs/3.txt | 4 ++++
2 files changed, 6 insertions(+), 2 deletions(-)
create mode 100644 fastlane/metadata/android/en-US/changelogs/3.txt
diff --git a/app/build.gradle b/app/build.gradle
index 03d19fe..3e2080a 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -6,8 +6,8 @@ android {
applicationId "com.wesaphzt.privatelock"
minSdkVersion 17
targetSdkVersion 29
- versionCode 2
- versionName "1.1"
+ versionCode 3
+ versionName "1.2"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
diff --git a/fastlane/metadata/android/en-US/changelogs/3.txt b/fastlane/metadata/android/en-US/changelogs/3.txt
new file mode 100644
index 0000000..cc9c35f
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/3.txt
@@ -0,0 +1,4 @@
+- Fix for background service < Android 8.0/Oreo
+- Add option for haptic feedback (vibration) on lock trigger
+- Reworked animation logic
+- Fix 'License' and 'Bug report' links on about page
\ No newline at end of file
From 0aa22e93e372956a4cfd286d6934149377d4d448 Mon Sep 17 00:00:00 2001
From: wesaphzt
Date: Sun, 22 Sep 2019 13:34:05 +0100
Subject: [PATCH 20/23] add changelog
---
CHANGELOG.md | 21 +++++++++++++++++++++
1 file changed, 21 insertions(+)
create mode 100644 CHANGELOG.md
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000..a8b6df3
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,21 @@
+Changelog
+==========
+
+Release 1.2 *(2019-09-21)*
+----------------------------
+ * Fix for background service < Android 8.0/Oreo
+ * Add option for haptic feedback (vibration) on lock trigger
+ * Reworked animation logic
+ * Fix 'License' and 'Bug report' links on about page
+
+Release 1.1 *(2019-06-25)*
+----------------------------
+ * Animation scaling issues fixed
+ * Stop service correctly to fix memory leak & reduce code
+ * Notification priority changed to low for Nougat and lower
+ * Option added to run service when screen is off to be able to force PIN entry
+ * Gradle & library updates
+
+Release 1.0 *(2019-06-01)*
+----------------------------
+ * Initial release
\ No newline at end of file
From 995403a1292605d52122c5ea6b1f172596a414db Mon Sep 17 00:00:00 2001
From: wesaphzt
Date: Sun, 22 Sep 2019 13:38:19 +0100
Subject: [PATCH 21/23] formatting
---
fastlane/metadata/android/en-US/changelogs/1.txt | 2 +-
fastlane/metadata/android/en-US/changelogs/2.txt | 10 +++++-----
fastlane/metadata/android/en-US/changelogs/3.txt | 8 ++++----
3 files changed, 10 insertions(+), 10 deletions(-)
diff --git a/fastlane/metadata/android/en-US/changelogs/1.txt b/fastlane/metadata/android/en-US/changelogs/1.txt
index feb0d17..c2eba09 100644
--- a/fastlane/metadata/android/en-US/changelogs/1.txt
+++ b/fastlane/metadata/android/en-US/changelogs/1.txt
@@ -1 +1 @@
-Initial release.
+ * Initial release.
diff --git a/fastlane/metadata/android/en-US/changelogs/2.txt b/fastlane/metadata/android/en-US/changelogs/2.txt
index 53b95b4..481cb52 100644
--- a/fastlane/metadata/android/en-US/changelogs/2.txt
+++ b/fastlane/metadata/android/en-US/changelogs/2.txt
@@ -1,5 +1,5 @@
-- Animation scaling issues fixed
-- Stop service correctly to fix memory leak & reduce code
-- Notification priority changed to low for Nougat and lower
-- Option added to run service when screen is off to be able to force PIN entry
-- Gradle & library updates
\ No newline at end of file
+ * Animation scaling issues fixed
+ * Stop service correctly to fix memory leak & reduce code
+ * Notification priority changed to low for Nougat and lower
+ * Option added to run service when screen is off to be able to force PIN entry
+ * Gradle & library updates
\ No newline at end of file
diff --git a/fastlane/metadata/android/en-US/changelogs/3.txt b/fastlane/metadata/android/en-US/changelogs/3.txt
index cc9c35f..3139b55 100644
--- a/fastlane/metadata/android/en-US/changelogs/3.txt
+++ b/fastlane/metadata/android/en-US/changelogs/3.txt
@@ -1,4 +1,4 @@
-- Fix for background service < Android 8.0/Oreo
-- Add option for haptic feedback (vibration) on lock trigger
-- Reworked animation logic
-- Fix 'License' and 'Bug report' links on about page
\ No newline at end of file
+ * Fix for background service < Android 8.0/Oreo
+ * Add option for haptic feedback (vibration) on lock trigger
+ * Reworked animation logic
+ * Fix 'License' and 'Bug report' links on about page
\ No newline at end of file
From 1b0d587a8d5af676e1ff645f41bd6555a07b9571 Mon Sep 17 00:00:00 2001
From: wesaphzt
Date: Sun, 22 Sep 2019 16:12:21 +0100
Subject: [PATCH 22/23] minor code clean up
---
.../java/com/wesaphzt/privatelock/service/LockService.java | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/app/src/main/java/com/wesaphzt/privatelock/service/LockService.java b/app/src/main/java/com/wesaphzt/privatelock/service/LockService.java
index 76ed2f3..3f5adc7 100644
--- a/app/src/main/java/com/wesaphzt/privatelock/service/LockService.java
+++ b/app/src/main/java/com/wesaphzt/privatelock/service/LockService.java
@@ -47,7 +47,6 @@ public class LockService extends JobIntentService {
private float mLastX, mLastY, mLastZ;
public static boolean mInitialized;
public static SensorManager mSensorManager;
- private final float NOISE = (float) 2.0;
public static Sensor mAccelerometer;
public static SensorEventListener activeListener;
@@ -83,7 +82,6 @@ public class LockService extends JobIntentService {
//vibrate
boolean isHaptic = false;
- private final int vibrateTime = 100;
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
@@ -97,6 +95,7 @@ public class LockService extends JobIntentService {
LockWidgetProvider lockWidgetProvider = new LockWidgetProvider();
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
+ assert action != null;
switch (action) {
case ACTION_START_FOREGROUND_SERVICE:
presenceReceiver = new PresenceReceiver();
@@ -233,6 +232,7 @@ public class LockService extends JobIntentService {
float deltaY = Math.abs(mLastY - y);
float deltaZ = Math.abs(mLastZ - z);
+ float NOISE = (float) 2.0;
if (deltaX < NOISE) deltaX = (float) 0.0;
if (deltaY < NOISE) deltaY = (float) 0.0;
if (deltaZ < NOISE) deltaZ = (float) 0.0;
@@ -279,6 +279,7 @@ public class LockService extends JobIntentService {
}
private void vibrateItBaby() {
+ int vibrateTime = 100;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
((Vibrator) Objects.requireNonNull(getSystemService(VIBRATOR_SERVICE))).vibrate(VibrationEffect.createOneShot(vibrateTime, VibrationEffect.DEFAULT_AMPLITUDE));
} else {
From 0cfce130fd48c5de01bf96ba0e1103c66f7f5833 Mon Sep 17 00:00:00 2001
From: wesaphzt
Date: Sun, 22 Sep 2019 16:12:49 +0100
Subject: [PATCH 23/23] add lock stats
---
.../wesaphzt/privatelock/MainActivity.java | 59 ++++++++++++---
app/src/main/res/layout/content_main.xml | 73 +++++++++++++++++++
app/src/main/res/values/strings.xml | 6 ++
3 files changed, 128 insertions(+), 10 deletions(-)
diff --git a/app/src/main/java/com/wesaphzt/privatelock/MainActivity.java b/app/src/main/java/com/wesaphzt/privatelock/MainActivity.java
index 37e2b0c..8580647 100644
--- a/app/src/main/java/com/wesaphzt/privatelock/MainActivity.java
+++ b/app/src/main/java/com/wesaphzt/privatelock/MainActivity.java
@@ -40,6 +40,8 @@ import com.wesaphzt.privatelock.receivers.DeviceAdminReceiver;
import com.wesaphzt.privatelock.service.LockService;
import com.wesaphzt.privatelock.widget.LockWidgetProvider;
+import java.util.Locale;
+
import static com.wesaphzt.privatelock.service.LockService.CHANNEL_ID;
import static com.wesaphzt.privatelock.service.LockService.DEFAULT_SENSITIVITY;
import static com.wesaphzt.privatelock.service.LockService.activeListener;
@@ -54,7 +56,6 @@ public class MainActivity extends AppCompatActivity {
private boolean mInitialized;
private static SensorManager mSensorManager;
private Sensor mAccelerometer;
- private final float NOISE = (float) 2.0;
private SensorEventListener mActiveListener;
@@ -74,22 +75,23 @@ public class MainActivity extends AppCompatActivity {
private boolean isRunning = false;
private boolean isHit = false;
+ //stats
+ private TextView tvLastBreachValue;
+ private TextView tvAvgBreachValue;
+ private TextView tvHighestBreachValue;
+
+ private int triggerCount = 0;
+ private float avgBreachValueTotal = 0;
+ private double highestBreach = 0;
+
private Circle circle;
private Circle circle_bg;
- //circle bg color
- private int circleBgR = 240; private int circleBgG = 240; private int circleBgB = 240;
//circle color
private int circleDefaultR = 88; private int circleDefaultG = 186; private int circleDefaultB = 255;
- //circle lock color
- private int circleLockR = 88; private int circleLockG = 255; private int circleLockB = 135;
int animationDuration = 220;
CircleAngleAnimation animation;
- //first run
- final private String PREF_VERSION_CODE_KEY = "VERSION_CODE";
- final private int DOESNT_EXIST = -1;
-
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -129,6 +131,7 @@ public class MainActivity extends AppCompatActivity {
}
});
+ //animation
circle = findViewById(R.id.circle);
circle_bg = findViewById(R.id.circle_bg);
@@ -158,10 +161,19 @@ public class MainActivity extends AppCompatActivity {
CircleAngleAnimation animation = new CircleAngleAnimation(circle_bg, 360);
//initial animation
animation.setDuration(500);
- circle_bg.setColor(circleBgR,circleBgG,circleBgB);
+ //circle bg color
+ int circleBgR = 240;
+ int circleBgG = 240;
+ int circleBgB = 240;
+ circle_bg.setColor(circleBgR, circleBgG, circleBgB);
circle_bg.startAnimation(animation);
+ //stats
+ tvLastBreachValue = findViewById(R.id.tvLastBreachValue);
+ tvAvgBreachValue = findViewById(R.id.tvAvgBreachValue);
+ tvHighestBreachValue = findViewById(R.id.tvHighestBreachValue);
+
//shared prefs
try {
mSensitivity = prefs.getInt(PREFS_THRESHOLD, DEFAULT_SENSITIVITY);
@@ -180,6 +192,10 @@ public class MainActivity extends AppCompatActivity {
isRunning = false;
isHit = false;
circle.setColor(circleDefaultR, circleDefaultG, circleDefaultB);
+ //reset stat variables
+ triggerCount = 0;
+ avgBreachValueTotal = 0;
+ highestBreach = 0;
}
};
@@ -388,7 +404,10 @@ public class MainActivity extends AppCompatActivity {
//get current version code
int currentVersionCode = BuildConfig.VERSION_CODE;
//get saved version code
+ int DOESNT_EXIST = -1;
int savedVersionCode = DOESNT_EXIST;
+ //first run
+ String PREF_VERSION_CODE_KEY = "VERSION_CODE";
try {
savedVersionCode = this.prefs.getInt(PREF_VERSION_CODE_KEY, DOESNT_EXIST);
} catch (Exception e) {
@@ -423,6 +442,7 @@ public class MainActivity extends AppCompatActivity {
float deltaY = Math.abs(mLastY - y);
float deltaZ = Math.abs(mLastZ - z);
+ float NOISE = (float) 2.0;
if (deltaX < NOISE) deltaX = (float) 0.0;
if (deltaY < NOISE) deltaY = (float) 0.0;
if (deltaZ < NOISE) deltaZ = (float) 0.0;
@@ -438,8 +458,14 @@ public class MainActivity extends AppCompatActivity {
if (total >= mSensitivity) {
//lock screen threshold hit
+ stats(total);
+
if(!isHit) {
CircleAngleAnimation anim = new CircleAngleAnimation(circle, 360);
+ //circle lock color
+ int circleLockR = 88;
+ int circleLockG = 255;
+ int circleLockB = 135;
circle.setColor(circleLockR, circleLockG, circleLockB);
anim.setDuration(animationDuration);
//set lock color
@@ -467,4 +493,17 @@ public class MainActivity extends AppCompatActivity {
}
}
}
+
+ private void stats(float total) {
+ tvLastBreachValue.setText(String.format(Locale.ENGLISH, "%.1f", (double) total));
+
+ if(total == 0 || total > highestBreach) {
+ highestBreach = total;
+ }
+ tvHighestBreachValue.setText(String.format(Locale.ENGLISH, "%.1f", highestBreach));
+
+ triggerCount += 1;
+ avgBreachValueTotal += total;
+ tvAvgBreachValue.setText(String.format(Locale.ENGLISH, "%.1f", avgBreachValueTotal / triggerCount));
+ }
}
diff --git a/app/src/main/res/layout/content_main.xml b/app/src/main/res/layout/content_main.xml
index 5718324..ac201b4 100644
--- a/app/src/main/res/layout/content_main.xml
+++ b/app/src/main/res/layout/content_main.xml
@@ -141,6 +141,79 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
→
Value: %1$s
+
+ Last Breach Value:
+ Avg. Breach Value:
+ Highest Breach Value:
+ 0
+
@string/app_name
Private Lock, the perfect companion to help protect your phone privacy and security.