Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 9 additions & 7 deletions app/src/main/java/com/duckduckgo/widget/SearchWidget.kt
Original file line number Diff line number Diff line change
Expand Up @@ -102,13 +102,15 @@ open class SearchWidget(val layoutId: Int = R.layout.search_widget_dark) : AppWi
val views = RemoteViews(context.packageName, layoutId)
views.setOnClickPendingIntent(R.id.widgetContainer, buildPendingIntent(context))

searchWidgetConfigurator.configureWidget(
context = context,
remoteViews = views,
appWidgetManager = appWidgetManager,
appWidgetId = appWidgetId,
fromFavWidget = false,
)
appCoroutineScope.launch {
searchWidgetConfigurator.populateRemoteViews(
context = context,
remoteViews = views,
fromFavWidget = false,
)
appWidgetManager.updateAppWidget(appWidgetId, views)
logcat { "SearchWidget updateAppWidget completed for widget id = $appWidgetId" }
}
}

private fun buildPendingIntent(context: Context): PendingIntent {
Expand Down
49 changes: 21 additions & 28 deletions app/src/main/java/com/duckduckgo/widget/SearchWidgetConfigurator.kt
Original file line number Diff line number Diff line change
Expand Up @@ -17,61 +17,54 @@
package com.duckduckgo.widget

import android.app.PendingIntent
import android.appwidget.AppWidgetManager
import android.content.Context
import android.content.Intent
import android.view.View
import android.widget.RemoteViews
import com.duckduckgo.app.browser.R
import com.duckduckgo.app.di.AppCoroutineScope
import com.duckduckgo.app.systemsearch.SystemSearchActivity
import com.duckduckgo.common.utils.DispatcherProvider
import com.duckduckgo.duckchat.api.DuckChat
import com.duckduckgo.voice.api.VoiceSearchAvailability
import javax.inject.Inject
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import logcat.logcat

class SearchWidgetConfigurator @Inject constructor(
private val voiceSearchAvailability: VoiceSearchAvailability,
private val duckChat: DuckChat,
@AppCoroutineScope private val appCoroutineScope: CoroutineScope,
private val dispatcherProvider: DispatcherProvider,
) {

fun configureWidget(
suspend fun populateRemoteViews(
context: Context,
remoteViews: RemoteViews,
appWidgetManager: AppWidgetManager,
appWidgetId: Int,
fromFavWidget: Boolean,
) {
appCoroutineScope.launch(dispatcherProvider.io()) {
val voiceSearchEnabled = voiceSearchAvailability.isVoiceSearchAvailable
val duckAiIntent = duckChat.createDuckChatIntent()
val duckAiEnabled = duckAiIntent != null

logcat { "SearchWidgetConfigurator voiceSearchEnabled=$voiceSearchEnabled, duckAiEnabled=$duckAiEnabled" }
val voiceSearchEnabled = withContext(dispatcherProvider.io()) {
voiceSearchAvailability.isVoiceSearchAvailable
}
val duckAiIntent = withContext(dispatcherProvider.io()) {
duckChat.createDuckChatIntent()
}
Comment on lines +44 to +49
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔍 Could also do this but NBD

val (voiceSearchEnabled, duckAiIntent) = withContext(dispatcherProvider.io()) {
    voiceSearchAvailability.isVoiceSearchAvailable to duckChat.createDuckChatIntent()
}

val duckAiEnabled = duckAiIntent != null

withContext(dispatcherProvider.main()) {
remoteViews.setViewVisibility(R.id.voiceSearch, if (voiceSearchEnabled) View.VISIBLE else View.GONE)
remoteViews.setViewVisibility(R.id.duckAi, if (duckAiEnabled) View.VISIBLE else View.GONE)
remoteViews.setViewVisibility(R.id.separator, if (voiceSearchEnabled && duckAiEnabled) View.VISIBLE else View.GONE)
remoteViews.setViewVisibility(R.id.search, if (!voiceSearchEnabled && !duckAiEnabled) View.VISIBLE else View.GONE)
logcat { "SearchWidgetConfigurator voiceSearchEnabled=$voiceSearchEnabled, duckAiEnabled=$duckAiEnabled" }

if (voiceSearchEnabled) {
val pendingIntent = buildVoiceSearchPendingIntent(context, fromFavWidget)
remoteViews.setOnClickPendingIntent(R.id.voiceSearch, pendingIntent)
}
withContext(dispatcherProvider.main()) {
remoteViews.setViewVisibility(R.id.voiceSearch, if (voiceSearchEnabled) View.VISIBLE else View.GONE)
remoteViews.setViewVisibility(R.id.duckAi, if (duckAiEnabled) View.VISIBLE else View.GONE)
remoteViews.setViewVisibility(R.id.separator, if (voiceSearchEnabled && duckAiEnabled) View.VISIBLE else View.GONE)
remoteViews.setViewVisibility(R.id.search, if (!voiceSearchEnabled && !duckAiEnabled) View.VISIBLE else View.GONE)

if (duckAiEnabled) {
val pendingIntent = buildDuckAiPendingIntent(context, duckAiIntent!!)
remoteViews.setOnClickPendingIntent(R.id.duckAi, pendingIntent)
}
if (voiceSearchEnabled) {
val pendingIntent = buildVoiceSearchPendingIntent(context, fromFavWidget)
remoteViews.setOnClickPendingIntent(R.id.voiceSearch, pendingIntent)
}

appWidgetManager.updateAppWidget(appWidgetId, remoteViews)
if (duckAiEnabled) {
val pendingIntent = buildDuckAiPendingIntent(context, duckAiIntent!!)
remoteViews.setOnClickPendingIntent(R.id.duckAi, pendingIntent)
}
}
}
Expand Down
Loading