33package com.perkedel.htlauncher
44
55import android.Manifest
6+ import android.app.Activity.RESULT_CANCELED
7+ import android.app.Activity.RESULT_OK
8+ import android.appwidget.AppWidgetHost
9+ import android.appwidget.AppWidgetManager
10+ import android.appwidget.AppWidgetProvider
11+ import android.appwidget.AppWidgetProviderInfo
612import android.content.ActivityNotFoundException
713import android.content.ComponentName
814import android.content.ContentResolver
@@ -31,7 +37,9 @@ import android.view.SoundEffectConstants
3137import android.view.View
3238import android.widget.Toast
3339import androidx.activity.ComponentActivity
40+ import androidx.activity.compose.ManagedActivityResultLauncher
3441import androidx.activity.compose.rememberLauncherForActivityResult
42+ import androidx.activity.result.ActivityResult
3543import androidx.activity.result.contract.ActivityResultContracts
3644import androidx.compose.animation.AnimatedContentTransitionScope
3745import androidx.compose.animation.ExperimentalSharedTransitionApi
@@ -134,6 +142,7 @@ import com.perkedel.htlauncher.ui.navigation.ItemsExplorer
134142import com.perkedel.htlauncher.ui.navigation.LevelEditor
135143import com.perkedel.htlauncher.ui.navigation.PurchaseScreen
136144import com.perkedel.htlauncher.ui.navigation.StandalonePageScreen
145+ import com.perkedel.htlauncher.ui.navigation.StandaloneWidgetScreen
137146import com.perkedel.htlauncher.ui.theme.HTLauncherTheme
138147import com.perkedel.htlauncher.ui.theme.rememberColorScheme
139148import com.perkedel.htlauncher.widgets.ChangeSaveDirDialog
@@ -149,6 +158,7 @@ import kotlinx.serialization.json.Json
149158import java.io.BufferedReader
150159import java.io.IOException
151160import java.io.InputStreamReader
161+ import kotlin.math.log
152162
153163@OptIn(ExperimentalMaterial3Api ::class )
154164@Composable
@@ -178,6 +188,10 @@ fun Navigation(
178188 prettyPrint = true
179189 encodeDefaults = true
180190 },
191+ appWidgetManager : AppWidgetManager = AppWidgetManager .getInstance(context),
192+ appWidgetId : Int = 1,
193+ appWidgetHost : AppWidgetHost = AppWidgetHost (context, appWidgetId),
194+ // appWidgetInfo: AppWidgetProviderInfo = appWidgetManager.getAppWidgetInfo(appWidgetId),
181195 tts : MutableState <TextToSpeech ?> = rememberTextToSpeech(),
182196 view : View = LocalView .current,
183197 inspectionMode : Boolean = LocalInspectionMode .current,
@@ -477,6 +491,70 @@ fun Navigation(
477491 println (" No Test File Selected" )
478492 }
479493 }
494+ // var eAppWidgetInfo : AppWidgetProviderInfo = appWidgetManager.getAppWidgetInfo(appWidgetId+1)
495+ // var eAppWidgetInfo : AppWidgetProviderInfo = appWidgetManager.getAppWidgetInfo(appWidgetId+1)
496+ var widgetSelectLauncher: ManagedActivityResultLauncher <Intent , ActivityResult > = rememberLauncherForActivityResult(ActivityResultContracts .StartActivityForResult ()) {activityResult ->
497+ Log .d(" Widgeting" ," YOU ARE NOT SUPPOSED TO VIEW PROTOTYPE!" )
498+ }
499+ widgetSelectLauncher = rememberLauncherForActivityResult(ActivityResultContracts .StartActivityForResult ()) { activityResult ->
500+ // https://www.leonardofischer.com/hosting-android-widgets-my-appwidgethost-tutorial/
501+ val resultCode = activityResult.resultCode
502+ // val requestCode = activityResult.requestCode
503+ val intentData = activityResult.data
504+ val dataExtras = intentData?.extras
505+ val requestCode = dataExtras?.getString(" requestCode" ," " ) ? : " "
506+ // val asdfasd = intentData.extras
507+ Log .d(" Widgeting" ," datas Intent ${intentData.toString()} " )
508+ Log .d(" Widgeting" , " Wants to ${requestCode} || ${htuiState.standaloneWidgetConfigMode} " )
509+ Log .d(" Widgeting" , " Widget Selected: ${dataExtras.toString()} " )
510+ var finalWidgetId: Int = dataExtras?.getInt(AppWidgetManager .EXTRA_APPWIDGET_ID , - 1 ) ? : - 1
511+ Log .d(" Widgeting" ," final id = ${finalWidgetId} " )
512+ val internAppWidgetInfo : AppWidgetProviderInfo = appWidgetManager.getAppWidgetInfo(finalWidgetId)
513+ Log .d(" Widgeting" ," internAppWidgetInfo ${internAppWidgetInfo.toString()} " )
514+ if (resultCode == RESULT_OK )
515+ {
516+ Log .d(" Widgeting" ," Doing Result now" )
517+ // if(finalWidgetId != -1)
518+ // anViewModel.setStandaloneWidgetIdSelected(finalWidgetId)
519+ if (requestCode == " REQUEST_PICK_APPWIDGET" || htuiState.standaloneWidgetConfigMode == " REQUEST_PICK_APPWIDGET" )
520+ {
521+ // val internAppWidgetInfo : AppWidgetProviderInfo = appWidgetManager.getAppWidgetInfo(finalWidgetId)
522+ Log .d(" Widgeting" ," Config the widget?" )
523+ if (internAppWidgetInfo.configure != null )
524+ {
525+ Log .d(" Widgeting" ," Let's go config!" )
526+ val configingIntent: Intent = Intent (AppWidgetManager .ACTION_APPWIDGET_CONFIGURE )
527+ configingIntent.setComponent(internAppWidgetInfo.configure)
528+ configingIntent.putExtra(AppWidgetManager .EXTRA_APPWIDGET_ID , finalWidgetId)
529+ anViewModel.setStandaloneWidgetConfigMode(" REQUEST_CREATE_APPWIDGET" )
530+ Log .d(" Widgeting" ," Launch the congiruataefa!" )
531+ widgetSelectLauncher.launch(configingIntent)
532+ } else {
533+ Log .d(" Widgeting" ," No config! just create it!" )
534+ // widgetSelectLauncher.launch(intentData)
535+ anViewModel.setStandaloneWidgetIdSelected(finalWidgetId)
536+ anViewModel.setStandaloneWidgetConfigMode(" " )
537+ }
538+ } else if (requestCode == " REQUEST_CREATE_APPWIDGET" || htuiState.standaloneWidgetConfigMode == " REQUEST_CREATE_APPWIDGET" )
539+ {
540+ // val internAppWidgetInfo : AppWidgetProviderInfo = appWidgetManager.getAppWidgetInfo(finalWidgetId)
541+ Log .d(" Widgeting" ," @@@ Create the widget!" )
542+ anViewModel.setStandaloneWidgetIdSelected(finalWidgetId)
543+ anViewModel.setStandaloneWidgetConfigMode(" " )
544+ }
545+ }
546+ else if (resultCode == RESULT_CANCELED && intentData != null )
547+ {
548+ finalWidgetId = dataExtras?.getInt(AppWidgetManager .EXTRA_APPWIDGET_ID , - 1 ) ? : - 1
549+ if (finalWidgetId == - 1 )
550+ {
551+ appWidgetHost.deleteAppWidgetId(finalWidgetId)
552+
553+ }
554+ anViewModel.setStandaloneWidgetConfigMode(" " )
555+ }
556+ // anViewModel.setStandaloneWidgetConfigMode("")
557+ }
480558
481559
482560
@@ -695,6 +773,7 @@ fun Navigation(
695773 color = when {
696774 currentScreen == Screen .HomeScreen .name -> Color .Transparent
697775 currentScreen == Screen .AllAppsScreen .name -> Color .Transparent
776+ currentScreen == Screen .WidgetTest .name -> Color .Transparent
698777 currentScreen.startsWith(" ${context.packageName} .data.PageData" ) -> Color .Transparent
699778 else -> colorScheme.background
700779 }
@@ -1113,6 +1192,81 @@ fun Navigation(
11131192 anViewModel = anViewModel
11141193 )
11151194 }
1195+ composable(route = Screen .WidgetTest .name,
1196+ enterTransition = {
1197+ slideIntoContainer(
1198+ towards = AnimatedContentTransitionScope .SlideDirection .Up ,
1199+ animationSpec = tween(),
1200+ )
1201+ },
1202+ exitTransition = {
1203+ slideOutOfContainer(
1204+ towards = AnimatedContentTransitionScope .SlideDirection .Left ,
1205+ animationSpec = tween(),
1206+ )
1207+ },
1208+ popEnterTransition = {
1209+ slideIntoContainer(
1210+ towards = AnimatedContentTransitionScope .SlideDirection .Right ,
1211+ animationSpec = tween()
1212+ )
1213+ },
1214+ popExitTransition = {
1215+ slideOutOfContainer(
1216+ towards = AnimatedContentTransitionScope .SlideDirection .Down ,
1217+ animationSpec = tween()
1218+ )
1219+ }
1220+ ) {
1221+ LaunchedEffect (
1222+ htuiState.standaloneWidgetIdSelected
1223+ ) {
1224+ Log .d(" Widgeting" , " Standalone Widget ID Selected: ${htuiState.standaloneWidgetIdSelected} " )
1225+ }
1226+ StandaloneWidgetScreen (
1227+ onAllAppButtonClicked = {
1228+ navController.navigate(Screen .AllAppsScreen .name)
1229+ },
1230+ onMoreMenuButtonClicked = {
1231+ anViewModel.openTheMoreMenu(true )
1232+
1233+ },
1234+ context = context,
1235+ configuration = configuration,
1236+ colorScheme = colorScheme,
1237+ haptic = haptic,
1238+ // DONE: handover the homescreen file json
1239+ configFile = htuiState.coreConfigJson,
1240+ viewModel = anViewModel,
1241+ contentResolver = saveDirResolver,
1242+ systemUiController = systemUiController,
1243+ uiState = htuiState,
1244+ coroutineScope = coroutineScope,
1245+ isReady = htuiState.isReady,
1246+ tts = tts,
1247+ onLaunchOneOfAction = {
1248+ onLaunchAction(
1249+ data = it,
1250+ context = context,
1251+ coroutineScope = coroutineScope,
1252+ pm = pm,
1253+ snackbarHostState = snackbarHostState,
1254+ contentResolver = saveDirResolver,
1255+ navController = navController,
1256+ viewModel = anViewModel,
1257+ uiState = htuiState,
1258+ inspectionMode = inspectionMode,
1259+ handoverPagerState = homePagerState,
1260+ tts = tts,
1261+ )
1262+ },
1263+ widgetSelectLauncher = widgetSelectLauncher,
1264+ appWidgetManager = appWidgetManager,
1265+ appWidgetHost = appWidgetHost,
1266+ // appWidgetId = appWidgetId,
1267+ appWidgetId = htuiState.standaloneWidgetIdSelected,
1268+ )
1269+ }
11161270 composable(route = Screen .ConfigurationScreen .name,
11171271 enterTransition = {
11181272 slideIntoContainer(
@@ -1176,6 +1330,10 @@ fun Navigation(
11761330 navController.navigate(Screen .LevelEditor .name)
11771331 }
11781332 ConfigSelected .ItemsExplorer -> {}
1333+ ConfigSelected .StandaloneWidget -> {
1334+ // test widget
1335+ navController.navigate(Screen .WidgetTest .name)
1336+ }
11791337 else -> {}
11801338 }
11811339 },
@@ -2219,7 +2377,7 @@ fun onLaunchAction(
22192377
22202378 }
22212379 containAction == context.resources.getString(ActionInternalCommand .Gallery .id) -> {
2222-
2380+ // TODO: default app how do I get that?!
22232381 }
22242382 containAction == context.resources.getString(ActionInternalCommand .GoToPage .id) -> {
22252383 if (data[selectAction].args[0 ].isNotBlank()){
@@ -2303,6 +2461,16 @@ fun onLaunchAction(
23032461 }
23042462}
23052463
2464+ fun configureWidget (intentData : Intent )
2465+ {
2466+ // https://www.leonardofischer.com/hosting-android-widgets-my-appwidgethost-tutorial/
2467+ }
2468+
2469+ fun createWidget (intentData : Intent )
2470+ {
2471+
2472+ }
2473+
23062474@PreviewFontScale
23072475@PreviewLightDark
23082476@PreviewScreenSizes
0 commit comments