package io.heckel.ntfy.ui import android.app.AlertDialog import android.content.Intent import android.os.Bundle import android.text.Html import android.util.Log import android.view.Menu import android.view.MenuItem import android.view.View import android.widget.TextView import android.widget.Toast import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity import androidx.recyclerview.widget.RecyclerView import com.android.volley.toolbox.StringRequest import com.android.volley.toolbox.Volley import io.heckel.ntfy.R import io.heckel.ntfy.app.Application import io.heckel.ntfy.data.Notification import io.heckel.ntfy.data.topicShortUrl import io.heckel.ntfy.data.topicUrl import java.util.* class DetailActivity : AppCompatActivity() { private val viewModel by viewModels { DetailViewModelFactory((application as Application).repository) } private var subscriptionId: Long = 0L // Set in onCreate() private var subscriptionBaseUrl: String = "" // Set in onCreate() private var subscriptionTopic: String = "" // Set in onCreate() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.detail_activity) supportActionBar?.setDisplayHomeAsUpEnabled(true) // Show 'Back' button // Get extras required for the return to the main activity subscriptionId = intent.getLongExtra(MainActivity.EXTRA_SUBSCRIPTION_ID, 0) subscriptionBaseUrl = intent.getStringExtra(MainActivity.EXTRA_SUBSCRIPTION_BASE_URL) ?: return subscriptionTopic = intent.getStringExtra(MainActivity.EXTRA_SUBSCRIPTION_TOPIC) ?: return // Set title val subscriptionBaseUrl = intent.getStringExtra(MainActivity.EXTRA_SUBSCRIPTION_BASE_URL) ?: return val topicUrl = topicShortUrl(subscriptionBaseUrl, subscriptionTopic) title = topicUrl // Set "how to instructions" val howToExample: TextView = findViewById(R.id.detail_how_to_example) howToExample.linksClickable = true val howToText = getString(R.string.detail_how_to_example, topicUrl) if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) { howToExample.text = Html.fromHtml(howToText, Html.FROM_HTML_MODE_LEGACY) } else { howToExample.text = Html.fromHtml(howToText) } // Update main list based on viewModel (& its datasource/livedata) val noEntriesText: View = findViewById(R.id.detail_no_notifications) val adapter = DetailAdapter { notification -> onNotificationClick(notification) } val mainList: RecyclerView = findViewById(R.id.detail_notification_list) mainList.adapter = adapter viewModel.list(subscriptionId).observe(this) { it?.let { adapter.submitList(it as MutableList) if (it.isEmpty()) { mainList.visibility = View.GONE noEntriesText.visibility = View.VISIBLE } else { mainList.visibility = View.VISIBLE noEntriesText.visibility = View.GONE } } } } override fun onCreateOptionsMenu(menu: Menu): Boolean { menuInflater.inflate(R.menu.detail_action_bar_menu, menu) return true } override fun onOptionsItemSelected(item: MenuItem): Boolean { return when (item.itemId) { R.id.detail_menu_test -> { onTestClick() true } R.id.detail_menu_unsubscribe -> { onDeleteClick() true } else -> super.onOptionsItemSelected(item) } } private fun onTestClick() { val url = topicUrl(subscriptionBaseUrl, subscriptionTopic) Log.d(TAG, "Sending test notification to $url") val queue = Volley.newRequestQueue(this) // This should be a Singleton :-O val stringRequest = object : StringRequest( Method.PUT, url, { _ -> /* Do nothing */ }, { error -> Toast .makeText(this, getString(R.string.detail_test_message_error, error.message), Toast.LENGTH_LONG) .show() } ) { override fun getBody(): ByteArray { return getString(R.string.detail_test_message, Date().toString()).toByteArray() } } queue.add(stringRequest) } private fun onDeleteClick() { Log.d(TAG, "Deleting subscription ${topicShortUrl(subscriptionBaseUrl, subscriptionTopic)}") val builder = AlertDialog.Builder(this) builder .setMessage(R.string.detail_delete_dialog_message) .setPositiveButton(R.string.detail_delete_dialog_permanently_delete) { _, _ -> // Return to main activity val result = Intent() .putExtra(MainActivity.EXTRA_SUBSCRIPTION_ID, subscriptionId) .putExtra(MainActivity.EXTRA_SUBSCRIPTION_TOPIC, subscriptionTopic) setResult(RESULT_OK, result) finish() // Delete notifications viewModel.removeAll(subscriptionId) } .setNegativeButton(R.string.detail_delete_dialog_cancel) { _, _ -> /* Do nothing */ } .create() .show() } private fun onNotificationClick(notification: Notification) { // TODO Do something } companion object { const val TAG = "NtfyDetailActivity" } }