From 29ecfba7c14d61da9ab16ce7294f7845bb402ba9 Mon Sep 17 00:00:00 2001 From: Morgan Hager Date: Wed, 4 Dec 2024 13:35:15 -0700 Subject: [PATCH 1/9] Add proper edge-to-edge support --- app/build.gradle | 6 +++++ .../wesaphzt/privatelock/MainActivity.java | 22 +++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/app/build.gradle b/app/build.gradle index 669124b..039dd86 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -35,4 +35,10 @@ dependencies { testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test:runner:1.6.2' androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1' + + // Java language implementation + implementation("androidx.activity:activity:1.9.3") + // Kotlin + implementation("androidx.activity:activity-ktx:1.9.3") + } diff --git a/app/src/main/java/com/wesaphzt/privatelock/MainActivity.java b/app/src/main/java/com/wesaphzt/privatelock/MainActivity.java index 3f1b4d7..725c2b1 100644 --- a/app/src/main/java/com/wesaphzt/privatelock/MainActivity.java +++ b/app/src/main/java/com/wesaphzt/privatelock/MainActivity.java @@ -18,6 +18,9 @@ import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; +import androidx.core.graphics.Insets; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowInsetsCompat; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentTransaction; @@ -27,6 +30,7 @@ import android.view.View; import android.view.Menu; import android.view.MenuItem; +import android.view.ViewGroup; import android.view.ViewTreeObserver; import android.widget.RelativeLayout; import android.widget.SeekBar; @@ -108,6 +112,24 @@ protected void onCreate(Bundle savedInstanceState) { Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); + ViewCompat.setOnApplyWindowInsetsListener(toolbar, (v, windowInsets) -> { + Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()); + // Apply the insets as a margin to the view. This solution sets only the + // bottom, left, and right dimensions, but you can apply whichever insets are + // appropriate to your layout. You can also update the view padding if that's + // more appropriate. + ViewGroup.MarginLayoutParams mlp = (ViewGroup.MarginLayoutParams) v.getLayoutParams(); + mlp.leftMargin = insets.left; + mlp.topMargin = insets.top; + mlp.rightMargin = insets.right; + v.setLayoutParams(mlp); + + // Return CONSUMED if you don't want want the window insets to keep passing + // down to descendant views. + return WindowInsetsCompat.CONSUMED; + }); + + getSupportFragmentManager().addOnBackStackChangedListener( new FragmentManager.OnBackStackChangedListener() { public void onBackStackChanged() { From 2f07a1c279b09f395cc8d4116e194363aa3aa8cd Mon Sep 17 00:00:00 2001 From: Morgan Hager Date: Wed, 4 Dec 2024 15:46:57 -0700 Subject: [PATCH 2/9] Update service for latest Android API --- app/src/main/AndroidManifest.xml | 5 ++++- .../java/com/wesaphzt/privatelock/MainActivity.java | 10 +++++++--- .../com/wesaphzt/privatelock/service/LockService.java | 4 ++-- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1ac7256..c9d797e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -4,6 +4,8 @@ + + @@ -53,7 +55,8 @@ + android:permission="android.permission.BIND_JOB_SERVICE" + android:foregroundServiceType="specialUse" /> diff --git a/app/src/main/java/com/wesaphzt/privatelock/MainActivity.java b/app/src/main/java/com/wesaphzt/privatelock/MainActivity.java index 725c2b1..3684713 100644 --- a/app/src/main/java/com/wesaphzt/privatelock/MainActivity.java +++ b/app/src/main/java/com/wesaphzt/privatelock/MainActivity.java @@ -359,9 +359,13 @@ public boolean onOptionsItemSelected(MenuItem item) { } } else if (id == R.id.action_stop) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - NotificationManager notificationManager = - (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); - notificationManager.deleteNotificationChannel(CHANNEL_ID); + try { + NotificationManager notificationManager = + (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); + notificationManager.deleteNotificationChannel(CHANNEL_ID); + } catch (java.lang.SecurityException e) { + // to be expected tbh + } disabled = true; mSensorManager.unregisterListener(activeListener); 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 285d343..681fe49 100644 --- a/app/src/main/java/com/wesaphzt/privatelock/service/LockService.java +++ b/app/src/main/java/com/wesaphzt/privatelock/service/LockService.java @@ -301,12 +301,12 @@ private void setNotification() { //notification stop button Intent intentStopAction = new Intent(context, NotificationReceiver.class); intentStopAction.putExtra("lock_service","lock_service_notification"); - pendingCloseIntent = PendingIntent.getBroadcast(context,0, intentStopAction, PendingIntent.FLAG_UPDATE_CURRENT); + pendingCloseIntent = PendingIntent.getBroadcast(context,0, intentStopAction, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE); //notification pause button Intent intentPauseAction = new Intent(context, PauseReceiver.class); intentPauseAction.putExtra("pause_service","pause_service_time"); - pendingPauseIntent = PendingIntent.getBroadcast(context,0, intentPauseAction, PendingIntent.FLAG_UPDATE_CURRENT); + pendingPauseIntent = PendingIntent.getBroadcast(context,0, intentPauseAction, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE); NotificationCompat.Builder notificationBuilder; From c68829dd3ac254b87d09ba1129e23d9bb39fa3f9 Mon Sep 17 00:00:00 2001 From: Morgan Hager Date: Wed, 4 Dec 2024 16:54:32 -0700 Subject: [PATCH 3/9] Fix monochrome launcher icon --- .../res/drawable/ic_launcher_monochrome.xml | 36 +++++++------------ .../mipmap-anydpi-v26/ic_launcher_round.xml | 1 + 2 files changed, 13 insertions(+), 24 deletions(-) diff --git a/app/src/main/res/drawable/ic_launcher_monochrome.xml b/app/src/main/res/drawable/ic_launcher_monochrome.xml index 272a74b..ab2a5d2 100644 --- a/app/src/main/res/drawable/ic_launcher_monochrome.xml +++ b/app/src/main/res/drawable/ic_launcher_monochrome.xml @@ -1,25 +1,13 @@ - - - - - - - - + + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml index 7353dbd..1084c24 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -2,4 +2,5 @@ + \ No newline at end of file From fef85d992ea468599f7ee534240a1f98eac829f8 Mon Sep 17 00:00:00 2001 From: Morgan Hager Date: Wed, 4 Dec 2024 19:55:51 -0700 Subject: [PATCH 4/9] Migrate to Material 3 --- app/build.gradle | 1 + app/src/main/AndroidManifest.xml | 2 +- .../wesaphzt/privatelock/IntroActivity.java | 2 + .../wesaphzt/privatelock/MainActivity.java | 23 +- .../fragments/FragmentSettings.java | 15 +- app/src/main/res/layout/activity_main.xml | 1 - app/src/main/res/layout/content_main.xml | 289 +++++++++--------- app/src/main/res/layout/fragment_about.xml | 147 +++++---- app/src/main/res/layout/fragment_donate.xml | 24 +- app/src/main/res/values/styles.xml | 14 +- 10 files changed, 277 insertions(+), 241 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 039dd86..218635b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -31,6 +31,7 @@ dependencies { implementation 'androidx.appcompat:appcompat:1.7.0' implementation 'androidx.constraintlayout:constraintlayout:2.2.0-beta01' implementation 'com.google.android.material:material:1.13.0-alpha06' + implementation 'com.android.support:cardview-v7:28.0.0' testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test:runner:1.6.2' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c9d797e..576da27 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -30,7 +30,7 @@ + android:theme="@style/AppTheme.NoActionBar" /> { + Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()); + // Apply the insets as a margin to the view. This solution sets only the + // bottom, left, and right dimensions, but you can apply whichever insets are + // appropriate to your layout. You can also update the view padding if that's + // more appropriate. + ViewGroup.MarginLayoutParams mlp = (ViewGroup.MarginLayoutParams) v.getLayoutParams(); + mlp.bottomMargin = insets.bottom; + v.setLayoutParams(mlp); + + // Return CONSUMED if you don't want want the window insets to keep passing + // down to descendant views. + return WindowInsetsCompat.CONSUMED; + }); + getSupportFragmentManager().addOnBackStackChangedListener( new FragmentManager.OnBackStackChangedListener() { @@ -399,7 +418,7 @@ public boolean onOptionsItemSelected(MenuItem item) { if (fragment != null) { FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); fragmentTransaction.setCustomAnimations(R.anim.enter_from_left, R.anim.exit_to_right, R.anim.enter_from_right, R.anim.exit_to_left); - fragmentTransaction.add(R.id.content_main, fragment); + fragmentTransaction.replace(R.id.content_main, fragment); fragmentTransaction.addToBackStack(null); fragmentTransaction.commit(); } 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 5289f55..f8bdb87 100644 --- a/app/src/main/java/com/wesaphzt/privatelock/fragments/FragmentSettings.java +++ b/app/src/main/java/com/wesaphzt/privatelock/fragments/FragmentSettings.java @@ -1,7 +1,10 @@ package com.wesaphzt.privatelock.fragments; +import android.annotation.SuppressLint; import android.content.Context; import android.content.SharedPreferences; +import android.content.res.Resources; +import android.content.res.TypedArray; import android.os.Bundle; import androidx.annotation.Nullable; @@ -13,6 +16,9 @@ import androidx.preference.PreferenceFragmentCompat; import androidx.preference.PreferenceManager; +import com.google.android.material.color.DynamicColors; +import com.google.android.material.color.DynamicColorsOptions; +import com.google.android.material.color.MaterialColors; import com.wesaphzt.privatelock.R; public class FragmentSettings extends PreferenceFragmentCompat { @@ -68,8 +74,13 @@ public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { //set title getActivity().setTitle("Settings"); - //bg color - view.setBackgroundColor(getResources().getColor(R.color.white)); + TypedArray array = context.getTheme().obtainStyledAttributes(new int[] { + android.R.attr.colorBackground, + }); + int backgroundColor = array.getColor(0, 0xFF00FF); + array.recycle(); + + view.setBackgroundColor(backgroundColor); sharedPreferenceChangeListener = new SharedPreferences.OnSharedPreferenceChangeListener() { @Override diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 9c96440..f94772a 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -15,7 +15,6 @@ android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" - android:background="?attr/colorPrimary" app:popupTheme="@style/AppTheme.PopupOverlay" /> diff --git a/app/src/main/res/layout/content_main.xml b/app/src/main/res/layout/content_main.xml index ac201b4..e149573 100644 --- a/app/src/main/res/layout/content_main.xml +++ b/app/src/main/res/layout/content_main.xml @@ -15,17 +15,17 @@ android:layout_margin="@dimen/_10sdp" tools:ignore="UselessParent"> - + android:orientation="vertical"> + android:textStyle="bold" /> + android:layout_height="wrap_content" + android:paddingBottom="8dp"> + android:textStyle="italic" /> - - + - + - + - - + - + - + + - + - + android:orientation="vertical"> - - - - - - - + android:textStyle="bold" /> - - - - - - - - - - - + - + + + + + + + + + + + + + + + + + + + - + - - + - + - + - + - + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_about.xml b/app/src/main/res/layout/fragment_about.xml index 7254b0e..df0a134 100644 --- a/app/src/main/res/layout/fragment_about.xml +++ b/app/src/main/res/layout/fragment_about.xml @@ -1,21 +1,20 @@ - + android:background="?attr/colorSurface" + app:layout_behavior="@string/appbar_scrolling_view_behavior"> + android:orientation="vertical" + android:padding="16dp"> - + android:orientation="horizontal" + android:padding="@dimen/activity_margin_small"> + android:contentDescription="@string/about_overview_logo_desc" + android:src="@mipmap/ic_launcher" /> + android:background="?android:attr/selectableItemBackground" + android:orientation="vertical"> + android:textStyle="bold" /> + android:text="@string/app_desc" + android:textStyle="bold" /> - + - + android:orientation="vertical"> + android:gravity="center_vertical" + android:orientation="horizontal" + android:paddingTop="@dimen/activity_margin_small" + android:paddingBottom="@dimen/activity_margin_small"> + android:contentDescription="@string/about_version_image_desc" + android:src="@drawable/ic_about_info_outline_black_24dp" /> + android:gravity="center_vertical" + android:orientation="vertical"> + android:textAppearance="?android:attr/textAppearanceSmall" /> @@ -116,41 +115,41 @@ + android:gravity="center_vertical" + android:orientation="horizontal" + android:paddingTop="@dimen/activity_margin_small" + android:paddingBottom="@dimen/activity_margin_small"> + android:gravity="center_vertical" + android:orientation="vertical"> + android:textStyle="bold" /> + android:text="@string/about_license_desc" + android:textAppearance="?android:attr/textAppearanceSmall" /> @@ -158,35 +157,35 @@ + android:gravity="center_vertical" + android:orientation="horizontal" + android:paddingTop="@dimen/activity_margin_small" + android:paddingBottom="@dimen/activity_margin_small"> + android:textAppearance="?android:attr/textAppearanceMedium" + android:textStyle="bold" /> - + - + android:textStyle="bold" /> + android:gravity="center_vertical" + android:orientation="horizontal" + android:paddingTop="@dimen/activity_margin_small" + android:paddingBottom="@dimen/activity_margin_small"> + android:gravity="center_vertical" + android:orientation="vertical"> + android:text="@string/about_developer_desc" + android:textAppearance="?android:attr/textAppearanceSmall" /> @@ -255,9 +254,9 @@ - + - + android:textStyle="bold" /> + android:gravity="center_vertical" + android:orientation="horizontal" + android:paddingTop="@dimen/activity_margin_small" + android:paddingBottom="@dimen/activity_margin_small"> + android:gravity="center_vertical" + android:orientation="vertical"> + android:text="@string/about_contribute_desc" + android:textAppearance="?android:attr/textAppearanceSmall" /> - + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_donate.xml b/app/src/main/res/layout/fragment_donate.xml index 09c8b3c..b83559b 100644 --- a/app/src/main/res/layout/fragment_donate.xml +++ b/app/src/main/res/layout/fragment_donate.xml @@ -1,22 +1,22 @@ - + android:background="?attr/colorSurface" + app:layout_behavior="@string/appbar_scrolling_view_behavior"> + android:orientation="vertical" + android:padding="8dp"> - + android:paddingBottom="@dimen/activity_margin_small"> + android:textSize="@dimen/_12sdp" /> - + \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 545b9c6..a20e1a6 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -1,11 +1,13 @@ - + - -