diff --git a/app/build.gradle b/app/build.gradle index bb239bd4..5b598109 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -38,6 +38,9 @@ android { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } + kotlinOptions { + jvmTarget = '1.8' + } dataBinding { enabled = true } @@ -59,6 +62,8 @@ dependencies { implementation "androidx.core:core-ktx:1.2.0" implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" implementation "androidx.work:work-runtime-ktx:2.3.2" + implementation "androidx.fragment:fragment-ktx:1.2.2" + testImplementation 'junit:junit:4.12' androidTestImplementation 'androidx.test.ext:junit:1.1.1' @@ -75,6 +80,7 @@ dependencies { implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0' kapt 'androidx.lifecycle:lifecycle-common-java8:2.2.0' + implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.2.0" implementation 'com.afollestad.material-dialogs:core:0.9.6.0' diff --git a/app/src/main/java/com/readrops/app/activities/NotificationPermissionActivity.kt b/app/src/main/java/com/readrops/app/activities/NotificationPermissionActivity.kt index 2e24297a..d7288e58 100644 --- a/app/src/main/java/com/readrops/app/activities/NotificationPermissionActivity.kt +++ b/app/src/main/java/com/readrops/app/activities/NotificationPermissionActivity.kt @@ -2,11 +2,16 @@ package com.readrops.app.activities import androidx.appcompat.app.AppCompatActivity import android.os.Bundle +import android.view.MenuItem +import androidx.activity.viewModels import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer import androidx.recyclerview.widget.LinearLayoutManager import com.readrops.app.R import com.readrops.app.adapters.NotificationPermissionAdapter import com.readrops.app.databinding.ActivityNotificationPermissionBinding +import com.readrops.app.utils.ReadropsKeys.ACCOUNT +import com.readrops.app.viewmodels.NotificationPermissionViewModel class NotificationPermissionActivity : AppCompatActivity() { @@ -15,7 +20,30 @@ class NotificationPermissionActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = DataBindingUtil.setContentView(this, R.layout.activity_notification_permission) + + setTitle(R.string.notifications) + supportActionBar?.setDisplayHomeAsUpEnabled(true) + + val viewModel by viewModels() + viewModel.account = intent.getParcelableExtra(ACCOUNT) + + val adapter = NotificationPermissionAdapter { + + } binding.notifPermissionAccountList.layoutManager = LinearLayoutManager(this) + binding.notifPermissionAccountList.adapter = adapter + + viewModel.getFeedsWithNotifPermission().observe(this, Observer { + adapter.submitList(it) + }) + } + + override fun onOptionsItemSelected(item: MenuItem): Boolean { + when (item.itemId) { + android.R.id.home -> finish() + } + + return super.onOptionsItemSelected(item) } } diff --git a/app/src/main/java/com/readrops/app/adapters/NotificationPermissionAdapter.kt b/app/src/main/java/com/readrops/app/adapters/NotificationPermissionAdapter.kt new file mode 100644 index 00000000..4647da90 --- /dev/null +++ b/app/src/main/java/com/readrops/app/adapters/NotificationPermissionAdapter.kt @@ -0,0 +1,48 @@ +package com.readrops.app.adapters + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.recyclerview.widget.DiffUtil +import androidx.recyclerview.widget.ListAdapter +import androidx.recyclerview.widget.RecyclerView +import com.readrops.app.R +import com.readrops.app.databinding.NotificationLayoutBinding +import com.readrops.readropsdb.entities.Feed + +class NotificationPermissionAdapter(val listener: (feed: Feed) -> Unit) : ListAdapter(DIFF_CALLBACK) { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): NotificationPermissionViewHolder { + val binding = DataBindingUtil.inflate(LayoutInflater.from(parent.context), R.layout.notification_layout, parent, false) + + return NotificationPermissionViewHolder(binding) + } + + override fun onBindViewHolder(holder: NotificationPermissionViewHolder, position: Int) { + val feed = getItem(position) + + holder.binding.notificationFeedName.text = feed.name + holder.binding.notificationSwitch.isChecked = feed.isNotificationEnabled + } + + override fun onBindViewHolder(holder: NotificationPermissionViewHolder, position: Int, payloads: MutableList) { + if (payloads.isNotEmpty()) { + val feed = payloads.first() as Feed + holder.binding.notificationSwitch.isChecked = feed.isNotificationEnabled + } else onBindViewHolder(holder, position) + } + + inner class NotificationPermissionViewHolder(val binding: NotificationLayoutBinding) : RecyclerView.ViewHolder(binding.root) + + companion object { + val DIFF_CALLBACK = object : DiffUtil.ItemCallback() { + override fun areItemsTheSame(oldItem: Feed, newItem: Feed): Boolean { + return oldItem.id == newItem.id + } + + override fun areContentsTheSame(oldItem: Feed, newItem: Feed): Boolean { + return oldItem.isNotificationEnabled == newItem.isNotificationEnabled + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/readrops/app/fragments/settings/AccountSettingsFragment.java b/app/src/main/java/com/readrops/app/fragments/settings/AccountSettingsFragment.java index b06d006e..aa9d17dc 100644 --- a/app/src/main/java/com/readrops/app/fragments/settings/AccountSettingsFragment.java +++ b/app/src/main/java/com/readrops/app/fragments/settings/AccountSettingsFragment.java @@ -26,6 +26,7 @@ import com.readrops.app.R; import com.readrops.app.ReadropsApp; import com.readrops.app.activities.AddAccountActivity; import com.readrops.app.activities.ManageFeedsFoldersActivity; +import com.readrops.app.activities.NotificationPermissionActivity; import com.readrops.app.utils.PermissionManager; import com.readrops.app.utils.SharedPreferencesManager; import com.readrops.app.utils.Utils; @@ -86,6 +87,7 @@ public class AccountSettingsFragment extends PreferenceFragmentCompat { Preference credentialsPref = findPreference("credentials_key"); Preference deleteAccountPref = findPreference("delete_account_key"); Preference opmlPref = findPreference("opml_import_export"); + Preference notificationPref = findPreference("notifications"); if (account.is(AccountType.LOCAL)) credentialsPref.setVisible(false); @@ -132,6 +134,14 @@ public class AccountSettingsFragment extends PreferenceFragmentCompat { .show(); return true; }); + + notificationPref.setOnPreferenceClickListener(preference -> { + Intent intent = new Intent(getContext(), NotificationPermissionActivity.class); + intent.putExtra(ACCOUNT, account); + + startActivity(intent); + return true; + }); } @Override diff --git a/app/src/main/java/com/readrops/app/viewmodels/NotificationPermissionViewModel.kt b/app/src/main/java/com/readrops/app/viewmodels/NotificationPermissionViewModel.kt new file mode 100644 index 00000000..fa2d4a27 --- /dev/null +++ b/app/src/main/java/com/readrops/app/viewmodels/NotificationPermissionViewModel.kt @@ -0,0 +1,18 @@ +package com.readrops.app.viewmodels + +import android.app.Application +import androidx.lifecycle.AndroidViewModel +import androidx.lifecycle.LiveData +import com.readrops.readropsdb.Database +import com.readrops.readropsdb.entities.Feed +import com.readrops.readropsdb.entities.account.Account + +class NotificationPermissionViewModel(application: Application) : AndroidViewModel(application) { + + val database = Database.getInstance(application) + var account: Account? = null + + + fun getFeedsWithNotifPermission(): LiveData> = database.feedDao() + .getFeedsForNotifPermission(account?.id!!) +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_notifications.xml b/app/src/main/res/drawable/ic_notifications.xml new file mode 100644 index 00000000..6c01015e --- /dev/null +++ b/app/src/main/res/drawable/ic_notifications.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/layout/notification_layout.xml b/app/src/main/res/layout/notification_layout.xml new file mode 100644 index 00000000..b51570c4 --- /dev/null +++ b/app/src/main/res/layout/notification_layout.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 82292702..1b95979f 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -124,5 +124,6 @@ Synchronisation des comptes %1$s nouveaux articles Activer les notifications + Notifications \ 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 85db1d35..2d52956c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -130,4 +130,5 @@ Accounts synchronisation %1$s new articles Enable notifications + Notifications diff --git a/app/src/main/res/xml/acount_preferences.xml b/app/src/main/res/xml/acount_preferences.xml index 96ee94b5..8c65803e 100644 --- a/app/src/main/res/xml/acount_preferences.xml +++ b/app/src/main/res/xml/acount_preferences.xml @@ -6,6 +6,11 @@ android:key="feeds_folders_key" android:title="@string/feeds_and_folders" /> + +