diff options
-rw-r--r-- | app/src/main/java/com/draco/buoy/fragments/MainPreferenceFragment.kt | 71 | ||||
-rw-r--r-- | app/src/main/java/com/draco/buoy/recyclers/BatterySaverProfileRecyclerAdapter.kt | 85 | ||||
-rw-r--r-- | app/src/main/java/com/draco/buoy/views/MainActivity.kt | 21 | ||||
-rw-r--r-- | app/src/main/res/anim/press.xml | 11 | ||||
-rw-r--r-- | app/src/main/res/drawable/ic_baseline_code_24.xml | 10 | ||||
-rw-r--r-- | app/src/main/res/drawable/ic_baseline_email_24.xml | 10 | ||||
-rw-r--r-- | app/src/main/res/drawable/ic_baseline_insert_drive_file_24.xml | 11 | ||||
-rw-r--r-- | app/src/main/res/drawable/ic_baseline_person_pin_24.xml | 10 | ||||
-rw-r--r-- | app/src/main/res/layout/activity_main.xml | 4 | ||||
-rw-r--r-- | app/src/main/res/values/strings.xml | 38 | ||||
-rw-r--r-- | app/src/main/res/xml/main.xml | 47 |
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 |