Sfoglia il codice sorgente

mediaplayer widget preimplementation

Milan Jurkulak 3 anni fa
parent
commit
9cd2aba0e1

+ 17 - 3
app/build.gradle.kts

@@ -229,7 +229,7 @@ dependencies {
     implementation("com.squareup.retrofit2:converter-moshi:2.9.0")
     implementation("com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2")
     // sandwich
-    implementation ("com.github.skydoves:sandwich:1.3.8")
+    implementation("com.github.skydoves:sandwich:1.3.8")
     // encrypt data
     implementation("com.scottyab:aescrypt:0.0.1")
     // permission
@@ -239,8 +239,14 @@ dependencies {
     // lottie
     implementation("com.airbnb.android:lottie-compose:6.1.0")
     // oauth
-    implementation ("com.auth0.android:auth0:2.10.1")
-    implementation ("com.auth0.android:jwtdecode:2.0.2")
+    implementation("com.auth0.android:auth0:2.10.1")
+    implementation("com.auth0.android:jwtdecode:2.0.2")
+    // widgets
+    implementation("androidx.glance:glance-appwidget:1.0.0-rc01")
+    implementation("androidx.glance:glance-material:1.0.0-rc01")
+    implementation("androidx.glance:glance-material3:1.0.0-rc01")
+    // fix duplicates
+    implementation("androidx.work:work-runtime-ktx:2.8.1")
     // libs mismatch
     constraints {
         implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.0")?.apply {
@@ -250,4 +256,12 @@ dependencies {
             because("kotlin-stdlib-jdk8 is now a part of kotlin-stdlib")
         }
     }
+    // fix duplicates
+    configurations {
+        all {
+            resolutionStrategy {
+                force("androidx.work:work-runtime-ktx:2.8.1")
+            }
+        }
+    }
 }

+ 14 - 0
app/src/main/AndroidManifest.xml

@@ -89,6 +89,20 @@
 
         </activity>
 
+        <receiver
+            android:name=".widget.MyAppWidgetReceiver"
+            android:exported="true">
+
+            <intent-filter>
+                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
+            </intent-filter>
+
+            <meta-data
+                android:name="android.appwidget.provider"
+                android:resource="@xml/my_app_widget_info" />
+
+        </receiver>
+
         <activity
             android:name=".activity.IPTVActivity"
             android:clearTaskOnLaunch="true"

+ 54 - 0
app/src/main/kotlin/org/mjdev/tvapp/widget/MainAppWidget.kt

@@ -0,0 +1,54 @@
+/*
+ *  Copyright (c) Milan Jurkulák 2023.
+ *  Contact:
+ *  e: mimoccc@gmail.com
+ *  e: mj@mjdev.org
+ *  w: https://mjdev.org
+ */
+
+package org.mjdev.tvapp.widget
+
+import android.content.Context
+import androidx.compose.foundation.layout.Column
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.tooling.preview.Preview
+import androidx.glance.Button
+import androidx.glance.GlanceComposable
+import androidx.glance.GlanceId
+import androidx.glance.GlanceModifier
+import androidx.glance.action.actionStartActivity
+import androidx.glance.action.clickable
+import androidx.glance.appwidget.GlanceAppWidget
+import androidx.glance.appwidget.action.actionRunCallback
+import androidx.glance.appwidget.provideContent
+import androidx.glance.text.Text
+import org.mjdev.tvapp.activity.MainActivity
+
+class MainAppWidget : GlanceAppWidget() {
+    override suspend fun provideGlance(context: Context, id: GlanceId) {
+        provideContent {
+            WidgetContent()
+        }
+    }
+
+    @Preview
+    @GlanceComposable
+    @Composable
+    fun WidgetContent() {
+        Column {
+            Text(
+                "Hello World",
+                modifier = GlanceModifier.clickable {
+                    actionStartActivity<MainActivity>()
+                }
+
+            )
+            Button(
+                text = "PlayPause",
+                onClick = {
+                    actionRunCallback<PlayPauseAction>()
+                }
+            )
+        }
+    }
+}

+ 16 - 0
app/src/main/kotlin/org/mjdev/tvapp/widget/MyAppWidgetReceiver.kt

@@ -0,0 +1,16 @@
+/*
+ *  Copyright (c) Milan Jurkulák 2023.
+ *  Contact:
+ *  e: mimoccc@gmail.com
+ *  e: mj@mjdev.org
+ *  w: https://mjdev.org
+ */
+
+package org.mjdev.tvapp.widget
+
+import androidx.glance.appwidget.GlanceAppWidget
+import androidx.glance.appwidget.GlanceAppWidgetReceiver
+
+class MyAppWidgetReceiver : GlanceAppWidgetReceiver() {
+    override val glanceAppWidget: GlanceAppWidget = MainAppWidget()
+}

+ 24 - 0
app/src/main/kotlin/org/mjdev/tvapp/widget/PlayPauseAction.kt

@@ -0,0 +1,24 @@
+/*
+ *  Copyright (c) Milan Jurkulák 2023.
+ *  Contact:
+ *  e: mimoccc@gmail.com
+ *  e: mj@mjdev.org
+ *  w: https://mjdev.org
+ */
+
+package org.mjdev.tvapp.widget
+
+import android.content.Context
+import androidx.glance.GlanceId
+import androidx.glance.action.ActionParameters
+import androidx.glance.appwidget.action.ActionCallback
+
+class PlayPauseAction : ActionCallback {
+    override suspend fun onAction(
+        context: Context,
+        glanceId: GlanceId,
+        parameters: ActionParameters
+    ) {
+        // todo implement
+    }
+}

+ 26 - 0
app/src/main/kotlin/org/mjdev/tvapp/widget/RefreshAction.kt

@@ -0,0 +1,26 @@
+/*
+ *  Copyright (c) Milan Jurkulák 2023.
+ *  Contact:
+ *  e: mimoccc@gmail.com
+ *  e: mj@mjdev.org
+ *  w: https://mjdev.org
+ */
+
+@file:Suppress("unused")
+
+package org.mjdev.tvapp.widget
+
+import android.content.Context
+import androidx.glance.GlanceId
+import androidx.glance.action.ActionParameters
+import androidx.glance.appwidget.action.ActionCallback
+
+class RefreshAction : ActionCallback {
+    override suspend fun onAction(
+        context: Context,
+        glanceId: GlanceId,
+        parameters: ActionParameters
+    ) {
+        MainAppWidget().update(context, glanceId)
+    }
+}

+ 14 - 0
app/src/main/res/layout/widget_loading_layout.xml

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+  ~  Copyright (c) Milan Jurkulák 2023.
+  ~  Contact:
+  ~  e: mimoccc@gmail.com
+  ~  e: mj@mjdev.org
+  ~  w: https://mjdev.org
+  -->
+
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+</FrameLayout>

+ 11 - 0
app/src/main/res/xml/my_app_widget_info.xml

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+  ~  Copyright (c) Milan Jurkulák 2023.
+  ~  Contact:
+  ~  e: mimoccc@gmail.com
+  ~  e: mj@mjdev.org
+  ~  w: https://mjdev.org
+  -->
+
+<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
+    android:initialLayout="@layout/widget_loading_layout">
+</appwidget-provider>