Skip to content

Commit

Permalink
Hide Import and export menu from overlay until.
Browse files Browse the repository at this point in the history
They will be visible once the Context is fixed

Signed-off-by: Saul Henriquez <saul_henriquez@hotmail.com>
  • Loading branch information
saulhdev committed Feb 26, 2024
1 parent 8e1a05f commit 7a7a92a
Show file tree
Hide file tree
Showing 5 changed files with 145 additions and 11 deletions.
106 changes: 106 additions & 0 deletions app/src/main/java/com/saulhdev/feeder/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,18 @@

package com.saulhdev.feeder

import android.app.Activity
import android.content.Context
import android.content.Intent
import android.content.res.Configuration
import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.os.ResultReceiver
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.result.ActivityResult
import androidx.activity.result.contract.ActivityResultContracts
import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
import androidx.compose.ui.graphics.Color
Expand All @@ -40,10 +46,18 @@ import androidx.work.PeriodicWorkRequestBuilder
import androidx.work.WorkManager
import com.google.accompanist.systemuicontroller.rememberSystemUiController
import com.saulhdev.feeder.compose.navigation.NavigationManager
import com.saulhdev.feeder.models.exportOpml
import com.saulhdev.feeder.models.importOpml
import com.saulhdev.feeder.preference.FeedPreferences
import com.saulhdev.feeder.sync.FeedSyncer
import com.saulhdev.feeder.theme.AppTheme
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.suspendCancellableCoroutine
import org.threeten.bp.LocalDateTime
import java.util.concurrent.TimeUnit
import kotlin.coroutines.resume

class MainActivity : ComponentActivity(), SavedStateRegistryOwner {
lateinit var prefs: FeedPreferences
Expand All @@ -53,11 +67,42 @@ class MainActivity : ComponentActivity(), SavedStateRegistryOwner {

private var sRestart = false

private val localTime = LocalDateTime.now().toString().replace(":", "_").substring(0, 19)
private val opmlImporterLauncher =
registerForActivityResult(ActivityResultContracts.OpenDocument()) { uri ->
if (uri != null) {
CoroutineScope(Dispatchers.Main).launch {
importOpml(uri)
}
}
}

val opmlExporter = registerForActivityResult(
ActivityResultContracts.CreateDocument("application/xml")
) { uri ->
if (uri != null) {
CoroutineScope(Dispatchers.Main).launch {
exportOpml(uri)
}
}
}

private fun launchOpmlImporter() {
opmlImporterLauncher.launch(arrayOf("application/xml", "text/xml", "text/opml"))
}

private fun launchOpmlExporter() {
opmlExporter.launch("NF-${localTime}.opml")
}

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

WindowCompat.setDecorFitsSystemWindows(window, false)
prefs = FeedPreferences.getInstance(this)
if (intent.hasExtra("import") || intent.hasExtra("export")) {
startTargetActivity()
}
setContent {
navController = rememberNavController()
AppTheme(
Expand All @@ -76,7 +121,24 @@ class MainActivity : ComponentActivity(), SavedStateRegistryOwner {
configurePeriodicSync(prefs)
observePrefs()
NFApplication.mainActivity = this
}

private fun startTargetActivity() {
when {
intent.hasExtra("import") -> {
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
launchOpmlImporter()
finish()
}.launch(intent.getParcelableExtra("import"))
}

else -> {
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
launchOpmlExporter()
finish()
}.launch(intent.getParcelableExtra("export"))
}
}
}

@Composable
Expand Down Expand Up @@ -188,5 +250,49 @@ class MainActivity : ComponentActivity(), SavedStateRegistryOwner {
val uri = "android-app://androidx.navigation//$destination".toUri()
return Intent(Intent.ACTION_VIEW, uri, context, MainActivity::class.java)
}

fun createIntent(context: Context, destination: String, action: String): Intent {
val intent = Intent(context, MainActivity::class.java)
intent.putExtra("action", action)
return intent
}

suspend fun startActivityForResult(
activity: Activity,
targetIntent: Intent
): ActivityResult {
return start(activity, targetIntent, Bundle.EMPTY)
}

private suspend fun start(
activity: Activity,
targetIntent: Intent,
extras: Bundle
): ActivityResult {
return suspendCancellableCoroutine { continuation ->
val intent = Intent(activity, MainActivity::class.java)
.putExtras(extras)
.putExtra("intent", targetIntent)
val resultReceiver = createResultReceiver {
if (continuation.isActive) {
continuation.resume(it)
}
}
activity.startActivity(intent.putExtra("callback", resultReceiver))
}
}

private fun createResultReceiver(callback: (ActivityResult) -> Unit): ResultReceiver {
return object : ResultReceiver(Handler(Looper.myLooper()!!)) {

override fun onReceiveResult(resultCode: Int, resultData: Bundle?) {
val data = Intent()
if (resultData != null) {
data.putExtras(resultData)
}
callback(ActivityResult(resultCode, data))
}
}
}
}
}
3 changes: 1 addition & 2 deletions app/src/main/java/com/saulhdev/feeder/NFApplication.kt
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package com.saulhdev.feeder

import android.app.Activity
import android.app.Application
import android.os.Bundle
import android.widget.Toast
import androidx.lifecycle.SavedStateHandle
Expand Down Expand Up @@ -67,7 +66,7 @@ class NFApplication : MultiDexApplication() {
}
}
single { applicationCoroutineScope }
single<Application> { this@NFApplication }
single<NFApplication> { this@NFApplication }
}

override fun onCreate() {
Expand Down
39 changes: 34 additions & 5 deletions app/src/main/java/com/saulhdev/feeder/overlay/OverlayView.kt
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,9 @@

package com.saulhdev.feeder.overlay

import android.app.Activity
import android.content.Context
import android.content.ContextWrapper
import android.content.res.ColorStateList
import android.graphics.drawable.ColorDrawable
import android.os.Bundle
Expand Down Expand Up @@ -57,6 +59,8 @@ import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.plus
import org.koin.java.KoinJavaComponent.inject


class OverlayView(val context: Context) :
OverlayController(context, R.style.AppTheme, R.style.WindowTheme),
Expand Down Expand Up @@ -184,27 +188,52 @@ class OverlayView(val context: Context) :
)
}
}
/*
"import" -> {
scope.launch {
val intent = MainActivity.createIntent(context,"","import")
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
val activity = getActivity(context.applicationContext)
if(activity!=null)
MainActivity.startActivityForResult(activity, intent)
"import" -> {}
}
}
"export" -> {}
"export" -> {
scope.launch {
val intent = MainActivity.createIntent(context,"","export")
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
val activity = getActivity(context.applicationContext)
if(activity!=null)
MainActivity.startActivityForResult(activity, intent)
}
}
*/

"reload" -> {
refreshNotifications()
}

"restart" -> {
NFApplication.instance.restart(false)
val application: NFApplication by inject(NFApplication::class.java)
application.restart(true)
}
}
}
}

fun getActivity(context: Context): Activity? {
if (context is Activity) return context
if (context is ContextWrapper) return getActivity(context.baseContext)
return null
}

private fun createMenuList(): List<MenuItem> {
return listOf(
MenuItem(R.drawable.ic_arrow_clockwise, R.string.action_reload, 0, "reload"),
MenuItem(R.drawable.ic_cloud_arrow_down, R.string.sources_import_opml, 1, "import"),
MenuItem(R.drawable.ic_cloud_arrow_up, R.string.sources_export_opml, 1, "export"),
//MenuItem(R.drawable.ic_cloud_arrow_down, R.string.sources_import_opml, 1, "import"),
//MenuItem(R.drawable.ic_cloud_arrow_up, R.string.sources_export_opml, 1, "export"),
MenuItem(R.drawable.ic_gear, R.string.title_settings, 2, "config"),
MenuItem(R.drawable.ic_power, R.string.action_restart, 2, "restart")
)
Expand Down
4 changes: 2 additions & 2 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
[versions]
accompanist = "0.32.0"
agp = "8.4.0-alpha07"
agp = "8.4.0-alpha10"
appcompat = "1.6.1"
browser = "1.7.0"
coil = "2.4.0"
coil = "2.5.0"
compose = "1.5.4"
composeCompiler = "1.5.4"
core-ktx = "1.12.0"
Expand Down
4 changes: 2 additions & 2 deletions gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#Fri Jan 26 21:35:32 CST 2024
#Sun Feb 25 18:26:34 CST 2024
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-rc-3-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-rc-1-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

0 comments on commit 7a7a92a

Please sign in to comment.