Skip to content

Commit 8b1c0a3

Browse files
Refactor: Worked out a better way for moving around the app.
Changed from using ViewPager2 for changing apps of the app. Added animations for changing to different fragments of the app
1 parent fc81f75 commit 8b1c0a3

32 files changed

+361
-291
lines changed

app/src/main/AndroidManifest.xml

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44

55
<uses-permission android:name="android.permission.SET_WALLPAPER" />
66
<uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />
7-
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
7+
<uses-permission
8+
android:name="android.permission.READ_EXTERNAL_STORAGE"
89
android:maxSdkVersion="32" />
910

1011
<uses-permission android:name="android.permission.USE_BIOMETRIC" />
@@ -13,11 +14,11 @@
1314
tools:ignore="QueryAllPackagesPermission" />
1415
<uses-permission android:name="android.permission.REQUEST_DELETE_PACKAGES" />
1516
<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
16-
<uses-permission android:name="android.permission.BIND_APPWIDGET"
17+
<uses-permission
18+
android:name="android.permission.BIND_APPWIDGET"
1719
tools:ignore="ProtectedPermissions" />
1820
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
1921

20-
2122
<queries>
2223
<intent>
2324
<action android:name="android.intent.action.MAIN" />
@@ -34,10 +35,6 @@
3435
android:label="@string/app_name"
3536
android:supportsRtl="true"
3637
android:theme="@style/Theme.Launcher">
37-
<activity
38-
android:name=".ui.activities.SettingsActivity"
39-
android:exported="false" />
40-
4138
<activity
4239
android:name=".ui.activities.LauncherActivity"
4340
android:enabled="false"
@@ -95,13 +92,14 @@
9592
android:resource="@xml/policies" />
9693
<intent-filter>
9794
<action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
95+
<action android:name="android.app.action.DEVICE_ADMIN_DISABLED" />
9896
</intent-filter>
9997
</receiver>
10098

10199
<service
102-
android:name=".accessibility.MyAccessibilityService"
100+
android:name=".accessibility.ActionService"
103101
android:exported="false"
104-
android:label="@string/app_name"
102+
android:label="@string/accessibility_service_name"
105103
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
106104
<meta-data
107105
android:name="android.accessibilityservice"

app/src/main/java/com/github/droidworksstudio/launcher/Constants.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,5 +65,4 @@ object Constants {
6565
const val APP_WIDGET_HOST_ID = 1024
6666
const val TRIPLE_TAP_DELAY_MS = 300
6767
const val LONG_PRESS_DELAY_MS = 500
68-
const val REQUEST_CODE_ENABLE_ADMIN = 123
6968
}
Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,16 @@ import com.github.droidworksstudio.launcher.R
1212
import com.google.android.material.dialog.MaterialAlertDialogBuilder
1313
import java.lang.ref.WeakReference
1414

15-
class MyAccessibilityService : AccessibilityService() {
15+
class ActionService : AccessibilityService() {
1616

1717
private var info: AccessibilityServiceInfo = AccessibilityServiceInfo()
1818

1919
override fun onServiceConnected() {
2020
mInstance = WeakReference(this)
2121

2222
info.apply {
23-
eventTypes = AccessibilityEvent.TYPE_VIEW_CLICKED or AccessibilityEvent.TYPE_VIEW_FOCUSED
23+
eventTypes =
24+
AccessibilityEvent.TYPE_VIEW_CLICKED or AccessibilityEvent.TYPE_VIEW_FOCUSED
2425

2526
feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC
2627

@@ -95,8 +96,8 @@ class MyAccessibilityService : AccessibilityService() {
9596
return
9697
}
9798

98-
private var mInstance: WeakReference<MyAccessibilityService> = WeakReference(null)
99-
fun instance(): MyAccessibilityService? {
99+
private var mInstance: WeakReference<ActionService> = WeakReference(null)
100+
fun instance(): ActionService? {
100101
return mInstance.get()
101102
}
102103
}

app/src/main/java/com/github/droidworksstudio/launcher/helper/AppHelper.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ import androidx.appcompat.widget.LinearLayoutCompat
2727
import com.google.android.material.dialog.MaterialAlertDialogBuilder
2828
import com.github.droidworksstudio.launcher.Constants
2929
import com.github.droidworksstudio.launcher.R
30-
import com.github.droidworksstudio.launcher.accessibility.MyAccessibilityService
30+
import com.github.droidworksstudio.launcher.accessibility.ActionService
3131
import com.github.droidworksstudio.launcher.data.entities.AppInfo
3232
import com.github.droidworksstudio.launcher.ui.activities.FakeHomeActivity
3333
import java.util.Calendar
@@ -95,8 +95,8 @@ class AppHelper @Inject constructor() {
9595
.invoke(context.getSystemService(Constants.NOTIFICATION_SERVICE))
9696
} catch (exception: Exception) {
9797
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
98-
MyAccessibilityService.runAccessibilityMode(context)
99-
MyAccessibilityService.instance()?.openNotifications()
98+
ActionService.runAccessibilityMode(context)
99+
ActionService.instance()?.openNotifications()
100100
}
101101
exception.printStackTrace()
102102
}
@@ -110,8 +110,8 @@ class AppHelper @Inject constructor() {
110110
.invoke(context.getSystemService(Constants.QUICKSETTINGS_SERVICE))
111111
} catch (exception: Exception) {
112112
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
113-
MyAccessibilityService.runAccessibilityMode(context)
114-
MyAccessibilityService.instance()?.openQuickSettings()
113+
ActionService.runAccessibilityMode(context)
114+
ActionService.instance()?.openQuickSettings()
115115
}
116116
exception.printStackTrace()
117117
}

app/src/main/java/com/github/droidworksstudio/launcher/helper/FingerprintHelper.kt

Lines changed: 43 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
package com.github.droidworksstudio.launcher.helper
22

3-
import android.content.Intent
43
import androidx.biometric.BiometricManager
54
import androidx.biometric.BiometricPrompt
65
import androidx.core.content.ContextCompat
76
import androidx.fragment.app.Fragment
7+
import androidx.navigation.fragment.findNavController
88
import com.github.droidworksstudio.launcher.R
99
import com.github.droidworksstudio.launcher.data.entities.AppInfo
1010
import javax.inject.Inject
@@ -56,32 +56,46 @@ class FingerprintHelper @Inject constructor(private val fragment: Fragment) {
5656
}
5757
}
5858

59-
fun startFingerprintSettingsAuth(targetClass: Class<*>) {
59+
fun startFingerprintSettingsAuth(runNavigation: Int) {
6060
val executor = ContextCompat.getMainExecutor(fragment.requireContext())
6161

62-
val biometricPrompt = BiometricPrompt(fragment, executor, object : BiometricPrompt.AuthenticationCallback() {
63-
override fun onAuthenticationSucceeded(result: BiometricPrompt.AuthenticationResult) {
64-
sendToTargetActivity(targetClass)
65-
}
62+
val biometricPrompt =
63+
BiometricPrompt(fragment, executor, object : BiometricPrompt.AuthenticationCallback() {
64+
override fun onAuthenticationSucceeded(result: BiometricPrompt.AuthenticationResult) {
65+
fragment.findNavController().navigate(runNavigation)
66+
}
6667

67-
override fun onAuthenticationFailed() {
68-
appHelper.showToast(fragment.requireContext(), fragment.getString(R.string.authentication_failed))
69-
}
68+
override fun onAuthenticationFailed() {
69+
appHelper.showToast(
70+
fragment.requireContext(),
71+
fragment.getString(R.string.authentication_failed)
72+
)
73+
}
7074

71-
override fun onAuthenticationError(errorCode: Int, errorMessage: CharSequence) {
72-
when (errorCode) {
73-
BiometricPrompt.ERROR_USER_CANCELED -> appHelper.showToast(fragment.requireContext(), fragment.getString(R.string.authentication_cancel))
74-
else -> appHelper.showToast(fragment.requireContext(), fragment.getString(R.string.authentication_error).format(errorMessage, errorCode))
75+
override fun onAuthenticationError(errorCode: Int, errorMessage: CharSequence) {
76+
when (errorCode) {
77+
BiometricPrompt.ERROR_USER_CANCELED -> appHelper.showToast(
78+
fragment.requireContext(),
79+
fragment.getString(R.string.authentication_cancel)
80+
)
81+
82+
else -> appHelper.showToast(
83+
fragment.requireContext(),
84+
fragment.getString(R.string.authentication_error)
85+
.format(errorMessage, errorCode)
86+
)
87+
}
7588
}
76-
}
77-
})
89+
})
7890

7991
val promptInfoBuilder = BiometricPrompt.PromptInfo.Builder()
8092
.setTitle(fragment.getString(R.string.authentication_title))
8193
.setSubtitle(fragment.getString(R.string.authentication_subtitle))
8294

83-
val authenticators = BiometricManager.Authenticators.BIOMETRIC_WEAK or BiometricManager.Authenticators.DEVICE_CREDENTIAL
84-
val canAuthenticate = BiometricManager.from(fragment.requireContext()).canAuthenticate(authenticators)
95+
val authenticators =
96+
BiometricManager.Authenticators.BIOMETRIC_WEAK or BiometricManager.Authenticators.DEVICE_CREDENTIAL
97+
val canAuthenticate =
98+
BiometricManager.from(fragment.requireContext()).canAuthenticate(authenticators)
8599

86100
if (canAuthenticate == BiometricManager.BIOMETRIC_SUCCESS) {
87101
promptInfoBuilder.setAllowedAuthenticators(authenticators)
@@ -95,17 +109,23 @@ class FingerprintHelper @Inject constructor(private val fragment: Fragment) {
95109
BiometricManager.BIOMETRIC_SUCCESS -> biometricPrompt.authenticate(promptInfo)
96110
BiometricManager.BIOMETRIC_ERROR_NO_HARDWARE,
97111
BiometricManager.BIOMETRIC_ERROR_HW_UNAVAILABLE,
98-
BiometricManager.BIOMETRIC_ERROR_NONE_ENROLLED -> sendToTargetActivity(targetClass)
99-
else -> appHelper.showToast(fragment.requireContext(), fragment.getString(R.string.authentication_failed))
112+
BiometricManager.BIOMETRIC_ERROR_NONE_ENROLLED -> sendToTarget(runNavigation)
113+
114+
else -> appHelper.showToast(
115+
fragment.requireContext(),
116+
fragment.getString(R.string.authentication_failed)
117+
)
100118
}
101119
}
102120

103-
fun sendToTargetActivity(targetClass: Class<*>) {
121+
private fun sendToTarget(runNavigation: Int) {
104122
try {
105-
val intent = Intent(fragment.requireActivity(), targetClass)
106-
fragment.requireActivity().startActivity(intent)
123+
fragment.findNavController().navigate(runNavigation)
107124
} catch (e: Exception) {
108-
appHelper.showToast(fragment.requireContext(), fragment.getString(R.string.authentication_failed))
125+
appHelper.showToast(
126+
fragment.requireContext(),
127+
fragment.getString(R.string.authentication_failed)
128+
)
109129
}
110130
}
111131
}

app/src/main/java/com/github/droidworksstudio/launcher/listener/OnSwipeTouchListener.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ internal open class OnSwipeTouchListener(c: Context?) : OnTouchListener {
9696
open fun onLongClick() {}
9797
open fun onDoubleClick() {}
9898
open fun onTripleClick() {}
99+
99100
init {
100101
gestureDetector = GestureDetector(c, GestureListener())
101102
}

app/src/main/java/com/github/droidworksstudio/launcher/ui/activities/MainActivity.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
package com.github.droidworksstudio.launcher.ui.activities
22

33
import android.annotation.SuppressLint
4+
import android.app.admin.DevicePolicyManager
5+
import android.content.Intent
46
import android.content.pm.ActivityInfo
57
import android.os.Build
68
import android.os.Bundle
79
import android.view.Menu
810
import android.view.MenuItem
911
import android.view.WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
12+
import android.widget.Toast
1013
import androidx.activity.viewModels
1114
import androidx.appcompat.app.AppCompatActivity
1215
import androidx.lifecycle.lifecycleScope
@@ -15,6 +18,7 @@ import androidx.navigation.findNavController
1518
import androidx.navigation.fragment.NavHostFragment
1619
import androidx.navigation.ui.AppBarConfiguration
1720
import androidx.navigation.ui.navigateUp
21+
import com.github.droidworksstudio.launcher.Constants
1822
import com.github.droidworksstudio.launcher.R
1923
import com.github.droidworksstudio.launcher.databinding.ActivityMainBinding
2024
import com.github.droidworksstudio.launcher.helper.AppHelper
@@ -143,5 +147,4 @@ class MainActivity : AppCompatActivity() {
143147
if (navController.currentDestination?.id != R.id.HomeFragment)
144148
navController.popBackStack(R.id.HomeFragment, false)
145149
}
146-
147150
}

app/src/main/java/com/github/droidworksstudio/launcher/ui/activities/SettingsActivity.kt

Lines changed: 0 additions & 74 deletions
This file was deleted.

app/src/main/java/com/github/droidworksstudio/launcher/ui/drawer/DrawAdapter.kt

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,10 @@ import com.github.droidworksstudio.launcher.databinding.ItemDrawBinding
1010
import com.github.droidworksstudio.launcher.helper.PreferenceHelper
1111
import com.github.droidworksstudio.launcher.listener.OnItemClickedListener
1212

13-
class DrawAdapter(private val onAppClickedListener: OnItemClickedListener.OnAppsClickedListener,
14-
private val onAppLongClickedListener: OnItemClickedListener.OnAppLongClickedListener,
15-
private val preferenceHelperProvider: PreferenceHelper
13+
class DrawAdapter(
14+
private val onAppClickedListener: OnItemClickedListener.OnAppsClickedListener,
15+
private val onAppLongClickedListener: OnItemClickedListener.OnAppLongClickedListener,
16+
private val preferenceHelperProvider: PreferenceHelper
1617
) :
1718
ListAdapter<AppInfo, RecyclerView.ViewHolder>(DiffCallback()) {
1819

@@ -27,7 +28,12 @@ class DrawAdapter(private val onAppClickedListener: OnItemClickedListener.OnApps
2728
)
2829
val preferenceHelper = preferenceHelperProvider
2930

30-
return DrawViewHolder(binding, onAppClickedListener, onAppLongClickedListener, preferenceHelper)
31+
return DrawViewHolder(
32+
binding,
33+
onAppClickedListener,
34+
onAppLongClickedListener,
35+
preferenceHelper
36+
)
3137
}
3238

3339
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
@@ -36,7 +42,7 @@ class DrawAdapter(private val onAppClickedListener: OnItemClickedListener.OnApps
3642
(holder as DrawViewHolder).bind(appInfo)
3743
}
3844

39-
class DiffCallback : DiffUtil.ItemCallback<AppInfo>() {
45+
class DiffCallback : DiffUtil.ItemCallback<AppInfo>() {
4046
override fun areItemsTheSame(oldItem: AppInfo, newItem: AppInfo) =
4147
oldItem.id == newItem.id
4248

app/src/main/java/com/github/droidworksstudio/launcher/ui/drawer/DrawFragment.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@ import javax.inject.Inject
3939
* A simple [Fragment] subclass as the second destination in the navigation.
4040
*/
4141
@AndroidEntryPoint
42-
class DrawFragment : Fragment(), OnItemClickedListener.OnAppsClickedListener,
42+
class DrawFragment : Fragment(),
43+
OnItemClickedListener.OnAppsClickedListener,
4344
OnItemClickedListener.OnAppLongClickedListener,
4445
OnItemClickedListener.BottomSheetDismissListener,
4546
OnItemClickedListener.OnAppStateClickListener,
@@ -143,7 +144,8 @@ class DrawFragment : Fragment(), OnItemClickedListener.OnAppsClickedListener,
143144

144145
@SuppressLint("ClickableViewAccessibility")
145146
private fun observeSwipeTouchListener() {
146-
binding.mainView.setOnTouchListener(getSwipeGestureListener(context))
147+
binding.touchArea.setOnTouchListener(getSwipeGestureListener(context))
148+
binding.drawAdapter.setOnTouchListener(getSwipeGestureListener(context))
147149
}
148150

149151
private fun getSwipeGestureListener(context: Context): View.OnTouchListener {

0 commit comments

Comments
 (0)