Add Preferences to enable Ntfy in the Settings app
This commit is contained in:
parent
160c4cfd88
commit
fe86329af5
11 changed files with 135 additions and 14 deletions
|
@ -27,6 +27,10 @@ android {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
buildFeatures {
|
||||||
|
viewBinding = true
|
||||||
|
}
|
||||||
|
|
||||||
buildTypes {
|
buildTypes {
|
||||||
release {
|
release {
|
||||||
minifyEnabled true
|
minifyEnabled true
|
||||||
|
@ -128,4 +132,6 @@ dependencies {
|
||||||
|
|
||||||
// Image viewer
|
// Image viewer
|
||||||
implementation 'com.github.stfalcon-studio:StfalconImageViewer:v1.0.1'
|
implementation 'com.github.stfalcon-studio:StfalconImageViewer:v1.0.1'
|
||||||
|
|
||||||
|
implementation 'foundation.e:elib:0.0.1-alpha11'
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
package="io.heckel.ntfy">
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
package="io.heckel.ntfy">
|
||||||
|
|
||||||
<!-- Permissions -->
|
<!-- Permissions -->
|
||||||
<uses-permission android:name="android.permission.INTERNET"/>
|
<uses-permission android:name="android.permission.INTERNET"/>
|
||||||
|
@ -176,5 +177,32 @@
|
||||||
android:name="android.support.FILE_PROVIDER_PATHS"
|
android:name="android.support.FILE_PROVIDER_PATHS"
|
||||||
android:resource="@xml/file_paths"/>
|
android:resource="@xml/file_paths"/>
|
||||||
</provider>
|
</provider>
|
||||||
|
|
||||||
|
<activity
|
||||||
|
android:name=".ui.MainSettingsActivity"
|
||||||
|
android:theme="@style/ETheme"
|
||||||
|
android:icon="@drawable/ic_notification"
|
||||||
|
android:label="@string/app_name"
|
||||||
|
android:process=":ui"
|
||||||
|
android:roundIcon="@drawable/ic_notification"/>
|
||||||
|
|
||||||
|
<activity-alias
|
||||||
|
android:name=".ui.SettingsActivityLink"
|
||||||
|
android:exported="true"
|
||||||
|
android:icon="@drawable/ic_notification"
|
||||||
|
android:label="@string/eos_settings_title"
|
||||||
|
android:process=":ui"
|
||||||
|
android:roundIcon="@drawable/ic_notification"
|
||||||
|
android:targetActivity=".ui.MainSettingsActivity">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="com.android.settings.action.EXTRA_SETTINGS" />
|
||||||
|
</intent-filter>
|
||||||
|
<meta-data
|
||||||
|
android:name="com.android.settings.category"
|
||||||
|
android:value="com.android.settings.category.device" />
|
||||||
|
<meta-data
|
||||||
|
android:name="com.android.settings.icon"
|
||||||
|
android:resource="@drawable/ic_notification" />
|
||||||
|
</activity-alias>
|
||||||
</application>
|
</application>
|
||||||
</manifest>
|
</manifest>
|
||||||
|
|
|
@ -10,6 +10,7 @@ import android.os.PowerManager
|
||||||
import android.os.SystemClock
|
import android.os.SystemClock
|
||||||
import androidx.core.app.NotificationCompat
|
import androidx.core.app.NotificationCompat
|
||||||
import androidx.core.content.ContextCompat
|
import androidx.core.content.ContextCompat
|
||||||
|
import androidx.preference.PreferenceManager
|
||||||
import io.heckel.ntfy.BuildConfig
|
import io.heckel.ntfy.BuildConfig
|
||||||
import io.heckel.ntfy.R
|
import io.heckel.ntfy.R
|
||||||
import io.heckel.ntfy.app.Application
|
import io.heckel.ntfy.app.Application
|
||||||
|
@ -93,7 +94,9 @@ class SubscriberService : Service() {
|
||||||
override fun onDestroy() {
|
override fun onDestroy() {
|
||||||
Log.d(TAG, "Subscriber service has been destroyed")
|
Log.d(TAG, "Subscriber service has been destroyed")
|
||||||
stopService()
|
stopService()
|
||||||
sendBroadcast(Intent(this, AutoRestartReceiver::class.java)) // Restart it if necessary!
|
if (PreferenceManager.getDefaultSharedPreferences(this).getBoolean("isEnabled", false)) {
|
||||||
|
sendBroadcast(Intent(this, AutoRestartReceiver::class.java))
|
||||||
|
}
|
||||||
super.onDestroy()
|
super.onDestroy()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -127,7 +130,6 @@ class SubscriberService : Service() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
wakeLock = null
|
wakeLock = null
|
||||||
stopForeground(true)
|
|
||||||
stopSelf()
|
stopSelf()
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
Log.d(TAG, "Service stopped without being started: ${e.message}")
|
Log.d(TAG, "Service stopped without being started: ${e.message}")
|
||||||
|
|
|
@ -2,7 +2,7 @@ package io.heckel.ntfy.service
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import androidx.core.content.ContextCompat
|
import androidx.preference.PreferenceManager
|
||||||
import androidx.work.*
|
import androidx.work.*
|
||||||
import io.heckel.ntfy.app.Application
|
import io.heckel.ntfy.app.Application
|
||||||
import io.heckel.ntfy.util.Log
|
import io.heckel.ntfy.util.Log
|
||||||
|
@ -43,11 +43,16 @@ class SubscriberServiceManager(private val context: Context) {
|
||||||
Log.d(TAG, "ServiceStartWorker: Failed, no application found (work ID: ${id})")
|
Log.d(TAG, "ServiceStartWorker: Failed, no application found (work ID: ${id})")
|
||||||
return Result.failure()
|
return Result.failure()
|
||||||
}
|
}
|
||||||
|
|
||||||
withContext(Dispatchers.IO) {
|
withContext(Dispatchers.IO) {
|
||||||
val app = context.applicationContext as Application
|
val app = context.applicationContext as Application
|
||||||
val subscriptionIdsWithInstantStatus = app.repository.getSubscriptionIdsWithInstantStatus()
|
val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(app)
|
||||||
val instantSubscriptions = subscriptionIdsWithInstantStatus.toList().filter { (_, instant) -> instant }.size
|
val action = if (sharedPreferences.getBoolean("isEnabled", false)) {
|
||||||
val action = if (instantSubscriptions > 0) SubscriberService.Action.START else SubscriberService.Action.STOP
|
SubscriberService.Action.START
|
||||||
|
} else {
|
||||||
|
SubscriberService.Action.STOP
|
||||||
|
}
|
||||||
|
|
||||||
val serviceState = SubscriberService.readServiceState(context)
|
val serviceState = SubscriberService.readServiceState(context)
|
||||||
if (serviceState == SubscriberService.ServiceState.STOPPED && action == SubscriberService.Action.STOP) {
|
if (serviceState == SubscriberService.ServiceState.STOPPED && action == SubscriberService.Action.STOP) {
|
||||||
return@withContext Result.success()
|
return@withContext Result.success()
|
||||||
|
|
24
app/src/main/java/io/heckel/ntfy/ui/MainSettingsActivity.kt
Normal file
24
app/src/main/java/io/heckel/ntfy/ui/MainSettingsActivity.kt
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
package io.heckel.ntfy.ui
|
||||||
|
|
||||||
|
import android.os.Bundle
|
||||||
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
|
import io.heckel.ntfy.R
|
||||||
|
import io.heckel.ntfy.databinding.MainSettingsActivityBinding
|
||||||
|
|
||||||
|
|
||||||
|
class MainSettingsActivity: AppCompatActivity() {
|
||||||
|
|
||||||
|
private lateinit var mBinding: MainSettingsActivityBinding
|
||||||
|
|
||||||
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
super.onCreate(savedInstanceState)
|
||||||
|
|
||||||
|
mBinding = MainSettingsActivityBinding.inflate(layoutInflater)
|
||||||
|
setContentView(mBinding.root)
|
||||||
|
|
||||||
|
supportFragmentManager
|
||||||
|
.beginTransaction()
|
||||||
|
.replace(R.id.fragment_container, PreferencesFragment())
|
||||||
|
.commit()
|
||||||
|
}
|
||||||
|
}
|
29
app/src/main/java/io/heckel/ntfy/ui/PreferencesFragment.kt
Normal file
29
app/src/main/java/io/heckel/ntfy/ui/PreferencesFragment.kt
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
package io.heckel.ntfy.ui
|
||||||
|
|
||||||
|
import android.content.Intent
|
||||||
|
import android.os.Bundle
|
||||||
|
import androidx.preference.PreferenceFragmentCompat
|
||||||
|
import androidx.preference.SwitchPreferenceCompat
|
||||||
|
import io.heckel.ntfy.R
|
||||||
|
import io.heckel.ntfy.service.SubscriberService
|
||||||
|
|
||||||
|
class PreferencesFragment : PreferenceFragmentCompat() {
|
||||||
|
|
||||||
|
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
|
||||||
|
setPreferencesFromResource(R.xml.settings_preferences, rootKey)
|
||||||
|
val preference: SwitchPreferenceCompat? = findPreference("isEnabled")
|
||||||
|
|
||||||
|
preference?.setOnPreferenceChangeListener { _, newValue ->
|
||||||
|
val isChecked = newValue as Boolean
|
||||||
|
val intent = Intent(context, SubscriberService::class.java)
|
||||||
|
intent.action = if (isChecked) {
|
||||||
|
SubscriberService.Action.START.name
|
||||||
|
} else {
|
||||||
|
SubscriberService.Action.STOP.name
|
||||||
|
}
|
||||||
|
|
||||||
|
requireContext().startService(intent)
|
||||||
|
true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,31 +1,31 @@
|
||||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:width="50dp"
|
android:width="22dp"
|
||||||
android:height="50dp"
|
android:height="22dp"
|
||||||
android:viewportWidth="50"
|
android:viewportWidth="50"
|
||||||
android:viewportHeight="50">
|
android:viewportHeight="50">
|
||||||
<path
|
<path
|
||||||
android:pathData="m7.8399,6.35c-3.58,0 -6.6469,2.817 -6.6469,6.3983v0.003l0.0351,27.8668 -0.8991,6.6347 12.2261,-3.248L42.9487,44.0049c3.58,0 6.6469,-2.8208 6.6469,-6.4022v-24.8545c0,-3.5803 -3.0652,-6.3967 -6.6438,-6.3983h-0.0031zM7.8399,10.8662h35.1088,0.0031c1.2579,0.0013 2.1277,0.9164 2.1277,1.8821v24.8544c0,0.9666 -0.8714,1.8821 -2.1307,1.8821L11.8924,39.4849l-6.2114,1.8768 0.0633,-0.366 -0.0343,-28.2473c0,-0.9665 0.8706,-1.8821 2.13,-1.8821z"
|
android:pathData="m7.8399,6.35c-3.58,0 -6.6469,2.817 -6.6469,6.3983v0.003l0.0351,27.8668 -0.8991,6.6347 12.2261,-3.248L42.9487,44.0049c3.58,0 6.6469,-2.8208 6.6469,-6.4022v-24.8545c0,-3.5803 -3.0652,-6.3967 -6.6438,-6.3983h-0.0031zM7.8399,10.8662h35.1088,0.0031c1.2579,0.0013 2.1277,0.9164 2.1277,1.8821v24.8544c0,0.9666 -0.8714,1.8821 -2.1307,1.8821L11.8924,39.4849l-6.2114,1.8768 0.0633,-0.366 -0.0343,-28.2473c0,-0.9665 0.8706,-1.8821 2.13,-1.8821z"
|
||||||
android:strokeWidth="0.754022"
|
android:strokeWidth="0.754022"
|
||||||
android:fillColor="#FFFFFFFF"
|
android:fillColor="?android:attr/colorControlNormal"
|
||||||
android:strokeColor="#00000000"/>
|
android:strokeColor="#00000000"/>
|
||||||
<path
|
<path
|
||||||
android:pathData="m11.5278,32.0849l0,-3.346l7.0363,-3.721q0.3397,-0.1732 0.6551,-0.2596 0.3397,-0.1153 0.6066,-0.1732 0.2912,-0.0288 0.5823,-0.0576l0,-0.2308q-0.2912,-0.0288 -0.5823,-0.1153 -0.2669,-0.0576 -0.6066,-0.1443 -0.3154,-0.1153 -0.6551,-0.2884l-7.0363,-3.721l0,-3.3749l10.8699,5.9132l0,3.6056z"
|
android:pathData="m11.5278,32.0849l0,-3.346l7.0363,-3.721q0.3397,-0.1732 0.6551,-0.2596 0.3397,-0.1153 0.6066,-0.1732 0.2912,-0.0288 0.5823,-0.0576l0,-0.2308q-0.2912,-0.0288 -0.5823,-0.1153 -0.2669,-0.0576 -0.6066,-0.1443 -0.3154,-0.1153 -0.6551,-0.2884l-7.0363,-3.721l0,-3.3749l10.8699,5.9132l0,3.6056z"
|
||||||
android:strokeWidth="0.525121"
|
android:strokeWidth="0.525121"
|
||||||
android:fillColor="#FFFFFFFF"
|
android:fillColor="?android:attr/colorControlNormal"
|
||||||
android:strokeColor="#00000000"/>
|
android:strokeColor="#00000000"/>
|
||||||
<path
|
<path
|
||||||
android:pathData="m10.9661,15.6112l0,4.8516l7.3742,3.9002c0.0157,0.0077 0.0305,0.0128 0.0461,0.0204 -0.0157,0.0077 -0.0305,0.0128 -0.0461,0.0204l-7.3742,3.9002l0,4.8267l0.7961,-0.4333 11.1995,-6.0969l0,-4.463zM12.0931,17.6933 L21.8346,22.9981l0,2.7446l-9.7414,5.2999l0,-1.8679l6.6912,-3.5416 0.0084,-0.0051c0.1961,-0.0992 0.3826,-0.1724 0.5531,-0.2191l0.0127,0l0.0167,-0.0051c0.2034,-0.0691 0.3777,-0.1209 0.5279,-0.1545l1.0684,-0.1046l0,-1.4644l-0.5154,-0.0497c-0.1632,-0.0153 -0.3288,-0.0505 -0.4944,-0.0997l-0.0167,-0.0051 -0.0167,-0.0051c-0.1632,-0.0352 -0.3552,-0.0811 -0.5656,-0.1344 -0.1802,-0.0668 -0.3706,-0.1479 -0.5698,-0.2492l-0.0084,-0.0051 -6.6912,-3.5416z"
|
android:pathData="m10.9661,15.6112l0,4.8516l7.3742,3.9002c0.0157,0.0077 0.0305,0.0128 0.0461,0.0204 -0.0157,0.0077 -0.0305,0.0128 -0.0461,0.0204l-7.3742,3.9002l0,4.8267l0.7961,-0.4333 11.1995,-6.0969l0,-4.463zM12.0931,17.6933 L21.8346,22.9981l0,2.7446l-9.7414,5.2999l0,-1.8679l6.6912,-3.5416 0.0084,-0.0051c0.1961,-0.0992 0.3826,-0.1724 0.5531,-0.2191l0.0127,0l0.0167,-0.0051c0.2034,-0.0691 0.3777,-0.1209 0.5279,-0.1545l1.0684,-0.1046l0,-1.4644l-0.5154,-0.0497c-0.1632,-0.0153 -0.3288,-0.0505 -0.4944,-0.0997l-0.0167,-0.0051 -0.0167,-0.0051c-0.1632,-0.0352 -0.3552,-0.0811 -0.5656,-0.1344 -0.1802,-0.0668 -0.3706,-0.1479 -0.5698,-0.2492l-0.0084,-0.0051 -6.6912,-3.5416z"
|
||||||
android:strokeWidth="0.525121"
|
android:strokeWidth="0.525121"
|
||||||
android:fillColor="#FFFFFFFF"
|
android:fillColor="?android:attr/colorControlNormal"
|
||||||
android:strokeColor="#00000000"/>
|
android:strokeColor="#00000000"/>
|
||||||
<path
|
<path
|
||||||
android:pathData="m26.7503,30.9206l11.6118,0l0,3.1388L26.7503,34.0594Z"
|
android:pathData="m26.7503,30.9206l11.6118,0l0,3.1388L26.7503,34.0594Z"
|
||||||
android:strokeWidth="0.525121"
|
android:strokeWidth="0.525121"
|
||||||
android:fillColor="#FFFFFFFF"
|
android:fillColor="?android:attr/colorControlNormal"
|
||||||
android:strokeColor="#00000000"/>
|
android:strokeColor="#00000000"/>
|
||||||
<path
|
<path
|
||||||
android:pathData="m26.1875,30.2775l0,0.6427 0,3.7845l12.7371,0l0,-4.4272zM27.3113,31.563l10.4896,0l0,1.8515l-10.4896,0z"
|
android:pathData="m26.1875,30.2775l0,0.6427 0,3.7845l12.7371,0l0,-4.4272zM27.3113,31.563l10.4896,0l0,1.8515l-10.4896,0z"
|
||||||
android:strokeWidth="0.525121"
|
android:strokeWidth="0.525121"
|
||||||
android:fillColor="#FFFFFFFF"
|
android:fillColor="?android:attr/colorControlNormal"
|
||||||
android:strokeColor="#00000000"/>
|
android:strokeColor="#00000000"/>
|
||||||
</vector>
|
</vector>
|
||||||
|
|
11
app/src/main/res/layout/main_settings_activity.xml
Normal file
11
app/src/main/res/layout/main_settings_activity.xml
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
|
<FrameLayout
|
||||||
|
android:id="@+id/fragment_container"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"/>
|
||||||
|
|
||||||
|
</LinearLayout>
|
|
@ -391,4 +391,9 @@
|
||||||
<string name="user_dialog_button_cancel">Cancel</string>
|
<string name="user_dialog_button_cancel">Cancel</string>
|
||||||
<string name="user_dialog_button_delete">Delete user</string>
|
<string name="user_dialog_button_delete">Delete user</string>
|
||||||
<string name="user_dialog_button_save">Save</string>
|
<string name="user_dialog_button_save">Save</string>
|
||||||
|
|
||||||
|
<!-- /e/OS integration preferences -->
|
||||||
|
<string name="eos_settings_title" translatable="false">UnifiedPush</string>
|
||||||
|
<string name="eos_settings_enable_title" translatable="true">Enable UnifiedPush distributor</string>
|
||||||
|
<string name="eos_settings_enable_description" translatable="true">This will allow applications to receive UnifiedPush notifications</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
10
app/src/main/res/xml/settings_preferences.xml
Normal file
10
app/src/main/res/xml/settings_preferences.xml
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
<PreferenceScreen
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||||
|
|
||||||
|
<SwitchPreferenceCompat
|
||||||
|
app:key="isEnabled"
|
||||||
|
app:defaultValue="false"
|
||||||
|
app:title="@string/eos_settings_enable_title"
|
||||||
|
app:summary="@string/eos_settings_enable_description" />
|
||||||
|
|
||||||
|
</PreferenceScreen>
|
|
@ -18,6 +18,7 @@ allprojects {
|
||||||
repositories {
|
repositories {
|
||||||
google()
|
google()
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
|
maven { url 'https://gitlab.e.foundation/api/v4/groups/9/-/packages/maven'}
|
||||||
maven { url "https://jitpack.io" } // For StfalconImageViewer
|
maven { url "https://jitpack.io" } // For StfalconImageViewer
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue