summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/src/main/java/com/draco/buoy/fragments/MainPreferenceFragment.kt71
-rw-r--r--app/src/main/java/com/draco/buoy/recyclers/BatterySaverProfileRecyclerAdapter.kt85
-rw-r--r--app/src/main/java/com/draco/buoy/views/MainActivity.kt21
-rw-r--r--app/src/main/res/anim/press.xml11
-rw-r--r--app/src/main/res/drawable/ic_baseline_code_24.xml10
-rw-r--r--app/src/main/res/drawable/ic_baseline_email_24.xml10
-rw-r--r--app/src/main/res/drawable/ic_baseline_insert_drive_file_24.xml11
-rw-r--r--app/src/main/res/drawable/ic_baseline_person_pin_24.xml10
-rw-r--r--app/src/main/res/layout/activity_main.xml4
-rw-r--r--app/src/main/res/values/strings.xml38
-rw-r--r--app/src/main/res/xml/main.xml47
11 files changed, 204 insertions, 114 deletions
diff --git a/app/src/main/java/com/draco/buoy/fragments/MainPreferenceFragment.kt b/app/src/main/java/com/draco/buoy/fragments/MainPreferenceFragment.kt
new file mode 100644
index 0000000..e0be6d3
--- /dev/null
+++ b/app/src/main/java/com/draco/buoy/fragments/MainPreferenceFragment.kt
@@ -0,0 +1,71 @@
+package com.draco.buoy.fragments
+
+import android.content.Context
+import android.content.Intent
+import android.net.Uri
+import android.os.Bundle
+import androidx.preference.Preference
+import androidx.preference.PreferenceFragmentCompat
+import com.draco.buoy.R
+import com.draco.buoy.models.BatterySaverConstantsConfig
+import com.draco.buoy.repositories.BatterySaverConstantsConfigProfiles
+import com.draco.buoy.utils.BatterySaverManager
+import com.google.android.gms.oss.licenses.OssLicensesMenuActivity
+import com.google.android.material.snackbar.Snackbar
+
+class MainPreferenceFragment : PreferenceFragmentCompat() {
+ private lateinit var batterySaverManager: BatterySaverManager
+
+ override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
+ setPreferencesFromResource(R.xml.main, rootKey)
+ }
+
+ override fun onAttach(context: Context) {
+ super.onAttach(context)
+ batterySaverManager = BatterySaverManager(context.contentResolver)
+ }
+
+ override fun onPreferenceTreeClick(preference: Preference): Boolean {
+ when (preference.key) {
+ getString(R.string.profile_key_reset) -> resetProfile()
+ getString(R.string.profile_key_light) -> applyProfile(BatterySaverConstantsConfigProfiles.LIGHT)
+ getString(R.string.profile_key_moderate) -> applyProfile(BatterySaverConstantsConfigProfiles.MODERATE)
+ getString(R.string.profile_key_high) -> applyProfile(BatterySaverConstantsConfigProfiles.HIGH)
+ getString(R.string.profile_key_extreme) -> applyProfile(BatterySaverConstantsConfigProfiles.EXTREME)
+
+ getString(R.string.pref_developer_key) -> openURL(getString(R.string.developer_url))
+ getString(R.string.pref_source_key) -> openURL(getString(R.string.source_url))
+ getString(R.string.pref_contact_key) -> openURL(getString(R.string.contact_url))
+ getString(R.string.pref_licenses_key) -> {
+ val intent = Intent(requireContext(), OssLicensesMenuActivity::class.java)
+ startActivity(intent)
+ }
+ else -> return super.onPreferenceTreeClick(preference)
+ }
+ return true
+ }
+
+ private fun applyProfile(profile: BatterySaverConstantsConfig) {
+ batterySaverManager.setConstantsConfig(profile)
+ batterySaverManager.setLowPower(true)
+ batterySaverManager.setLowPowerSticky(true)
+ batterySaverManager.setLowPowerStickyAutoDisableEnabled(false)
+ }
+
+ private fun resetProfile() {
+ batterySaverManager.resetConstants()
+ batterySaverManager.setLowPower(false)
+ batterySaverManager.setLowPowerSticky(false)
+ batterySaverManager.setLowPowerStickyAutoDisableEnabled(true)
+ }
+
+ private fun openURL(url: String) {
+ val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url))
+ try {
+ startActivity(intent)
+ } catch (e: Exception) {
+ e.printStackTrace()
+ Snackbar.make(requireView(), getString(R.string.snackbar_intent_failed), Snackbar.LENGTH_SHORT).show()
+ }
+ }
+} \ No newline at end of file
diff --git a/app/src/main/java/com/draco/buoy/recyclers/BatterySaverProfileRecyclerAdapter.kt b/app/src/main/java/com/draco/buoy/recyclers/BatterySaverProfileRecyclerAdapter.kt
deleted file mode 100644
index fe22e4c..0000000
--- a/app/src/main/java/com/draco/buoy/recyclers/BatterySaverProfileRecyclerAdapter.kt
+++ /dev/null
@@ -1,85 +0,0 @@
-package com.draco.buoy.recyclers
-
-import android.content.ContentResolver
-import android.content.Context
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import android.view.animation.AnimationUtils
-import android.widget.TextView
-import androidx.recyclerview.widget.RecyclerView
-import com.draco.buoy.R
-import com.draco.buoy.repositories.BatterySaverConstantsConfigProfiles
-import com.draco.buoy.utils.BatterySaverManager
-
-class BatterySaverProfileRecyclerAdapter(
- private val context: Context
-) : RecyclerView.Adapter<BatterySaverProfileRecyclerAdapter.ViewHolder>() {
- private val batterySaverProfiles = arrayOf(
- null, /* Reset */
- BatterySaverConstantsConfigProfiles.LIGHT,
- BatterySaverConstantsConfigProfiles.MODERATE,
- BatterySaverConstantsConfigProfiles.HIGH,
- BatterySaverConstantsConfigProfiles.EXTREME,
- )
-
- private val batterySaverManager = BatterySaverManager(context.contentResolver)
-
- class ViewHolder(itemView: View): RecyclerView.ViewHolder(itemView) {
- val title = itemView.findViewById<TextView>(R.id.title)
- val description = itemView.findViewById<TextView>(R.id.description)
- }
-
- override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
- val view = LayoutInflater.from(parent.context).inflate(R.layout.recycler_item_profile, parent, false)
- return ViewHolder(view)
- }
-
- override fun onBindViewHolder(holder: ViewHolder, position: Int) {
- val profile = batterySaverProfiles[position]
-
- when (profile) {
- null -> {
- holder.title.setText(R.string.profile_title_reset)
- holder.description.setText(R.string.profile_description_reset)
- }
-
- BatterySaverConstantsConfigProfiles.LIGHT -> {
- holder.title.setText(R.string.profile_title_light)
- holder.description.setText(R.string.profile_description_light)
- }
-
- BatterySaverConstantsConfigProfiles.MODERATE -> {
- holder.title.setText(R.string.profile_title_moderate)
- holder.description.setText(R.string.profile_description_moderate)
- }
-
- BatterySaverConstantsConfigProfiles.HIGH -> {
- holder.title.setText(R.string.profile_title_high)
- holder.description.setText(R.string.profile_description_high)
- }
-
- BatterySaverConstantsConfigProfiles.EXTREME -> {
- holder.title.setText(R.string.profile_title_extreme)
- holder.description.setText(R.string.profile_description_extreme)
- }
- }
-
- holder.itemView.setOnClickListener {
- it.startAnimation(AnimationUtils.loadAnimation(context, R.anim.press))
- if (profile == null) {
- batterySaverManager.resetConstants()
- batterySaverManager.setLowPower(false)
- batterySaverManager.setLowPowerSticky(false)
- batterySaverManager.setLowPowerStickyAutoDisableEnabled(true)
- } else {
- batterySaverManager.setConstantsConfig(profile)
- batterySaverManager.setLowPower(true)
- batterySaverManager.setLowPowerSticky(true)
- batterySaverManager.setLowPowerStickyAutoDisableEnabled(false)
- }
- }
- }
-
- override fun getItemCount(): Int = batterySaverProfiles.size
-} \ No newline at end of file
diff --git a/app/src/main/java/com/draco/buoy/views/MainActivity.kt b/app/src/main/java/com/draco/buoy/views/MainActivity.kt
index 90e06e8..a28ab7a 100644
--- a/app/src/main/java/com/draco/buoy/views/MainActivity.kt
+++ b/app/src/main/java/com/draco/buoy/views/MainActivity.kt
@@ -1,33 +1,32 @@
package com.draco.buoy.views
import android.content.Intent
-import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.activity.viewModels
-import androidx.recyclerview.widget.LinearLayoutManager
-import androidx.recyclerview.widget.RecyclerView
+import androidx.appcompat.app.AppCompatActivity
+import androidx.fragment.app.FragmentContainerView
import com.draco.buoy.R
-import com.draco.buoy.recyclers.BatterySaverProfileRecyclerAdapter
+import com.draco.buoy.fragments.MainPreferenceFragment
import com.draco.buoy.utils.PermissionUtils
import com.draco.buoy.viewmodels.MainActivityViewModel
class MainActivity : AppCompatActivity() {
private val viewModel: MainActivityViewModel by viewModels()
- private lateinit var recycler: RecyclerView
+ private lateinit var preferences: FragmentContainerView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
- recycler = findViewById(R.id.recycler_profile)
-
- recycler.apply {
- adapter = BatterySaverProfileRecyclerAdapter(this@MainActivity)
- layoutManager = LinearLayoutManager(this@MainActivity)
- }
+ preferences = findViewById(R.id.preferences)
if (!PermissionUtils.isPermissionsGranted(this, android.Manifest.permission.WRITE_SECURE_SETTINGS))
goToPermissionActivity()
+
+ supportFragmentManager
+ .beginTransaction()
+ .replace(R.id.preferences, MainPreferenceFragment())
+ .commit()
}
private fun goToPermissionActivity() {
diff --git a/app/src/main/res/anim/press.xml b/app/src/main/res/anim/press.xml
deleted file mode 100644
index 6a7ab7a..0000000
--- a/app/src/main/res/anim/press.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<scale xmlns:android="http://schemas.android.com/apk/res/android"
- android:pivotY="50%"
- android:pivotX="50%"
- android:fromXScale="1.0"
- android:fromYScale="1.0"
- android:toXScale="0.9"
- android:toYScale="0.9"
- android:duration="150"
- android:repeatMode="reverse"
- android:repeatCount="1" /> \ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_baseline_code_24.xml b/app/src/main/res/drawable/ic_baseline_code_24.xml
new file mode 100644
index 0000000..b97ee53
--- /dev/null
+++ b/app/src/main/res/drawable/ic_baseline_code_24.xml
@@ -0,0 +1,10 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24"
+ android:viewportHeight="24"
+ android:tint="?attr/colorControlNormal">
+ <path
+ android:fillColor="@android:color/white"
+ android:pathData="M9.4,16.6L4.8,12l4.6,-4.6L8,6l-6,6 6,6 1.4,-1.4zM14.6,16.6l4.6,-4.6 -4.6,-4.6L16,6l6,6 -6,6 -1.4,-1.4z"/>
+</vector>
diff --git a/app/src/main/res/drawable/ic_baseline_email_24.xml b/app/src/main/res/drawable/ic_baseline_email_24.xml
new file mode 100644
index 0000000..6943b4c
--- /dev/null
+++ b/app/src/main/res/drawable/ic_baseline_email_24.xml
@@ -0,0 +1,10 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24"
+ android:viewportHeight="24"
+ android:tint="?attr/colorControlNormal">
+ <path
+ android:fillColor="@android:color/white"
+ android:pathData="M20,4L4,4c-1.1,0 -1.99,0.9 -1.99,2L2,18c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,6c0,-1.1 -0.9,-2 -2,-2zM20,8l-8,5 -8,-5L4,6l8,5 8,-5v2z"/>
+</vector>
diff --git a/app/src/main/res/drawable/ic_baseline_insert_drive_file_24.xml b/app/src/main/res/drawable/ic_baseline_insert_drive_file_24.xml
new file mode 100644
index 0000000..18b3062
--- /dev/null
+++ b/app/src/main/res/drawable/ic_baseline_insert_drive_file_24.xml
@@ -0,0 +1,11 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24"
+ android:viewportHeight="24"
+ android:tint="?attr/colorControlNormal"
+ android:autoMirrored="true">
+ <path
+ android:fillColor="@android:color/white"
+ android:pathData="M6,2c-1.1,0 -1.99,0.9 -1.99,2L4,20c0,1.1 0.89,2 1.99,2L18,22c1.1,0 2,-0.9 2,-2L20,8l-6,-6L6,2zM13,9L13,3.5L18.5,9L13,9z"/>
+</vector>
diff --git a/app/src/main/res/drawable/ic_baseline_person_pin_24.xml b/app/src/main/res/drawable/ic_baseline_person_pin_24.xml
new file mode 100644
index 0000000..fd6018c
--- /dev/null
+++ b/app/src/main/res/drawable/ic_baseline_person_pin_24.xml
@@ -0,0 +1,10 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24"
+ android:viewportHeight="24"
+ android:tint="?attr/colorControlNormal">
+ <path
+ android:fillColor="@android:color/white"
+ android:pathData="M12,2c-4.97,0 -9,4.03 -9,9 0,4.17 2.84,7.67 6.69,8.69L12,22l2.31,-2.31C18.16,18.67 21,15.17 21,11c0,-4.97 -4.03,-9 -9,-9zM12,4c1.66,0 3,1.34 3,3s-1.34,3 -3,3 -3,-1.34 -3,-3 1.34,-3 3,-3zM12,18.3c-2.5,0 -4.71,-1.28 -6,-3.22 0.03,-1.99 4,-3.08 6,-3.08 1.99,0 5.97,1.09 6,3.08 -1.29,1.94 -3.5,3.22 -6,3.22z"/>
+</vector>
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index 640773b..d00f8fa 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -2,8 +2,8 @@
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
- <androidx.recyclerview.widget.RecyclerView
+ <androidx.fragment.app.FragmentContainerView
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:id="@+id/recycler_profile" />
+ android:id="@+id/preferences" />
</RelativeLayout> \ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index afd0b7b..1ffd3d1 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -12,18 +12,46 @@
<string name="snackbar_intent_failed">Could not handle this action</string>
+ <string name="developer_url">https://www.github.com/tytydraco</string>
+ <string name="source_url">https://www.github.com/tytydraco/Buoy</string>
+ <string name="contact_url">mailto:tylernij@gmail.com</string>
+
+ <string name="category_actions">Actions</string>
+ <string name="category_about">About</string>
+
+ <string name="profile_key_reset">reset</string>
<string name="profile_title_reset">Reset</string>
- <string name="profile_description_reset">Undo all changes done by the app and restore secure settings to default.</string>
+ <string name="profile_summary_reset">Undo all changes done by the app and restore secure settings to default</string>
+ <string name="profile_key_light">light</string>
<string name="profile_title_light">Light</string>
- <string name="profile_description_light">Marginally conserve battery without impeding the user experience</string>
+ <string name="profile_summary_light">Marginally conserve battery without impeding the user experience</string>
+ <string name="profile_key_moderate">moderate</string>
<string name="profile_title_moderate">Moderate</string>
- <string name="profile_description_moderate">Apply additional tweaks to save more battery without yet sacrificing performance</string>
+ <string name="profile_summary_moderate">Apply additional tweaks to save more battery without yet sacrificing performance</string>
+ <string name="profile_key_high">high</string>
<string name="profile_title_high">High</string>
- <string name="profile_description_high">Sacrifice significant performance for a significant gain in power</string>
+ <string name="profile_summary_high">Sacrifice significant performance for a significant gain in power</string>
+ <string name="profile_key_extreme">extreme</string>
<string name="profile_title_extreme">Extreme</string>
- <string name="profile_description_extreme">Apply the maximum changes available to save power at the expense of a fluid user experience</string>
+ <string name="profile_summary_extreme">Apply the maximum changes available to save power at the expense of a fluid user experience</string>
+
+ <string name="pref_developer_title">Developer</string>
+ <string name="pref_developer_summary">Tyler Nijmeh</string>
+ <string name="pref_developer_key">developer</string>
+
+ <string name="pref_source_title">Source code</string>
+ <string name="pref_source_summary">Check out this project on GitHub</string>
+ <string name="pref_source_key">source</string>
+
+ <string name="pref_contact_title">Contact</string>
+ <string name="pref_contact_summary">Email me with questions, comments, and concerns</string>
+ <string name="pref_contact_key">contact</string>
+
+ <string name="pref_licenses_title">Licenses</string>
+ <string name="pref_licenses_summary">View the open source licenses</string>
+ <string name="pref_licenses_key">licenses</string>
</resources> \ No newline at end of file
diff --git a/app/src/main/res/xml/main.xml b/app/src/main/res/xml/main.xml
new file mode 100644
index 0000000..b383e10
--- /dev/null
+++ b/app/src/main/res/xml/main.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8"?>
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
+ <PreferenceCategory android:title="@string/category_actions">
+ <Preference
+ android:title="@string/profile_title_reset"
+ android:summary="@string/profile_summary_reset"
+ android:key="@string/profile_key_reset" />
+ <Preference
+ android:title="@string/profile_title_light"
+ android:summary="@string/profile_summary_light"
+ android:key="@string/profile_key_light" />
+ <Preference
+ android:title="@string/profile_title_moderate"
+ android:summary="@string/profile_summary_moderate"
+ android:key="@string/profile_key_moderate" />
+ <Preference
+ android:title="@string/profile_title_high"
+ android:summary="@string/profile_summary_high"
+ android:key="@string/profile_key_high" />
+ <Preference
+ android:title="@string/profile_title_extreme"
+ android:summary="@string/profile_summary_extreme"
+ android:key="@string/profile_key_extreme" />
+ </PreferenceCategory>
+ <PreferenceCategory android:title="@string/category_about">
+ <Preference
+ android:title="@string/pref_developer_title"
+ android:summary="@string/pref_developer_summary"
+ android:key="@string/pref_developer_key"
+ android:icon="@drawable/ic_baseline_person_pin_24" />
+ <Preference
+ android:title="@string/pref_source_title"
+ android:summary="@string/pref_source_summary"
+ android:key="@string/pref_source_key"
+ android:icon="@drawable/ic_baseline_code_24" />
+ <Preference
+ android:title="@string/pref_contact_title"
+ android:summary="@string/pref_contact_summary"
+ android:key="@string/pref_contact_key"
+ android:icon="@drawable/ic_baseline_email_24" />
+ <Preference
+ android:title="@string/pref_licenses_title"
+ android:summary="@string/pref_licenses_summary"
+ android:key="@string/pref_licenses_key"
+ android:icon="@drawable/ic_baseline_insert_drive_file_24" />
+ </PreferenceCategory>
+</PreferenceScreen> \ No newline at end of file