virtual-device-app: Add android service for managing app server (#28399)

Signed-off-by: Jaehoon You <jaehoon.you@samsung.com>
Signed-off-by: Charles Kim <chulspro.kim@samsung.com>
diff --git a/examples/virtual-device-app/android/App/app/src/main/AndroidManifest.xml b/examples/virtual-device-app/android/App/app/src/main/AndroidManifest.xml
index a57ddde..b971d9f 100644
--- a/examples/virtual-device-app/android/App/app/src/main/AndroidManifest.xml
+++ b/examples/virtual-device-app/android/App/app/src/main/AndroidManifest.xml
@@ -5,6 +5,7 @@
     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
+    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
 
     <application
         android:name=".App"
@@ -26,6 +27,7 @@
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
         </activity>
+        <service android:name="com.matter.virtual.device.app.core.matter.MatterAppService" />
     </application>
 
 </manifest>
\ No newline at end of file
diff --git a/examples/virtual-device-app/android/App/app/src/main/res/drawable/ic_launcher_background.xml b/examples/virtual-device-app/android/App/core/common/src/main/res/drawable/ic_launcher_background.xml
similarity index 100%
rename from examples/virtual-device-app/android/App/app/src/main/res/drawable/ic_launcher_background.xml
rename to examples/virtual-device-app/android/App/core/common/src/main/res/drawable/ic_launcher_background.xml
diff --git a/examples/virtual-device-app/android/App/app/src/main/res/drawable/ic_launcher_foreground.xml b/examples/virtual-device-app/android/App/core/common/src/main/res/drawable/ic_launcher_foreground.xml
similarity index 100%
rename from examples/virtual-device-app/android/App/app/src/main/res/drawable/ic_launcher_foreground.xml
rename to examples/virtual-device-app/android/App/core/common/src/main/res/drawable/ic_launcher_foreground.xml
diff --git a/examples/virtual-device-app/android/App/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/examples/virtual-device-app/android/App/core/common/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
similarity index 100%
rename from examples/virtual-device-app/android/App/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
rename to examples/virtual-device-app/android/App/core/common/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
diff --git a/examples/virtual-device-app/android/App/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/examples/virtual-device-app/android/App/core/common/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
similarity index 100%
rename from examples/virtual-device-app/android/App/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
rename to examples/virtual-device-app/android/App/core/common/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
diff --git a/examples/virtual-device-app/android/App/app/src/main/res/mipmap-hdpi/ic_launcher.png b/examples/virtual-device-app/android/App/core/common/src/main/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from examples/virtual-device-app/android/App/app/src/main/res/mipmap-hdpi/ic_launcher.png
rename to examples/virtual-device-app/android/App/core/common/src/main/res/mipmap-hdpi/ic_launcher.png
Binary files differ
diff --git a/examples/virtual-device-app/android/App/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/examples/virtual-device-app/android/App/core/common/src/main/res/mipmap-hdpi/ic_launcher_round.png
similarity index 100%
rename from examples/virtual-device-app/android/App/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
rename to examples/virtual-device-app/android/App/core/common/src/main/res/mipmap-hdpi/ic_launcher_round.png
Binary files differ
diff --git a/examples/virtual-device-app/android/App/app/src/main/res/mipmap-mdpi/ic_launcher.png b/examples/virtual-device-app/android/App/core/common/src/main/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from examples/virtual-device-app/android/App/app/src/main/res/mipmap-mdpi/ic_launcher.png
rename to examples/virtual-device-app/android/App/core/common/src/main/res/mipmap-mdpi/ic_launcher.png
Binary files differ
diff --git a/examples/virtual-device-app/android/App/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/examples/virtual-device-app/android/App/core/common/src/main/res/mipmap-mdpi/ic_launcher_round.png
similarity index 100%
rename from examples/virtual-device-app/android/App/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
rename to examples/virtual-device-app/android/App/core/common/src/main/res/mipmap-mdpi/ic_launcher_round.png
Binary files differ
diff --git a/examples/virtual-device-app/android/App/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/examples/virtual-device-app/android/App/core/common/src/main/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from examples/virtual-device-app/android/App/app/src/main/res/mipmap-xhdpi/ic_launcher.png
rename to examples/virtual-device-app/android/App/core/common/src/main/res/mipmap-xhdpi/ic_launcher.png
Binary files differ
diff --git a/examples/virtual-device-app/android/App/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/examples/virtual-device-app/android/App/core/common/src/main/res/mipmap-xhdpi/ic_launcher_round.png
similarity index 100%
rename from examples/virtual-device-app/android/App/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
rename to examples/virtual-device-app/android/App/core/common/src/main/res/mipmap-xhdpi/ic_launcher_round.png
Binary files differ
diff --git a/examples/virtual-device-app/android/App/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/examples/virtual-device-app/android/App/core/common/src/main/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from examples/virtual-device-app/android/App/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
rename to examples/virtual-device-app/android/App/core/common/src/main/res/mipmap-xxhdpi/ic_launcher.png
Binary files differ
diff --git a/examples/virtual-device-app/android/App/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/examples/virtual-device-app/android/App/core/common/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
similarity index 100%
rename from examples/virtual-device-app/android/App/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
rename to examples/virtual-device-app/android/App/core/common/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
Binary files differ
diff --git a/examples/virtual-device-app/android/App/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/examples/virtual-device-app/android/App/core/common/src/main/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from examples/virtual-device-app/android/App/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
rename to examples/virtual-device-app/android/App/core/common/src/main/res/mipmap-xxxhdpi/ic_launcher.png
Binary files differ
diff --git a/examples/virtual-device-app/android/App/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/examples/virtual-device-app/android/App/core/common/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
similarity index 100%
rename from examples/virtual-device-app/android/App/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
rename to examples/virtual-device-app/android/App/core/common/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
Binary files differ
diff --git a/examples/virtual-device-app/android/App/core/matter/src/main/java/com/matter/virtual/device/app/core/matter/MatterAppService.kt b/examples/virtual-device-app/android/App/core/matter/src/main/java/com/matter/virtual/device/app/core/matter/MatterAppService.kt
new file mode 100644
index 0000000..0bcbee7
--- /dev/null
+++ b/examples/virtual-device-app/android/App/core/matter/src/main/java/com/matter/virtual/device/app/core/matter/MatterAppService.kt
@@ -0,0 +1,92 @@
+package com.matter.virtual.device.app.core.matter
+
+import android.app.Notification
+import android.app.NotificationChannel
+import android.app.NotificationManager
+import android.app.Service
+import android.content.Intent
+import android.os.Build
+import android.os.IBinder
+import androidx.core.app.NotificationCompat
+import dagger.hilt.android.AndroidEntryPoint
+import timber.log.Timber
+
+@AndroidEntryPoint
+class MatterAppService : Service() {
+
+  override fun onCreate() {
+    super.onCreate()
+    Timber.d("onCreate()")
+  }
+
+  override fun onDestroy() {
+    super.onDestroy()
+    Timber.d("onDestroy()")
+  }
+
+  override fun onBind(intent: Intent?): IBinder? {
+    Timber.d("onBind()")
+    return null
+  }
+
+  override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
+    Timber.d("Hit")
+
+    intent?.let {
+      when (it.action) {
+        MatterAppServiceConstants.ACTION_START_MATTER_APP_SERVICE -> {
+          Timber.i("Start matter app service")
+          startService()
+        }
+        MatterAppServiceConstants.ACTION_STOP_MATTER_APP_SERVICE -> {
+          Timber.i("Stop matter app service")
+          stopService()
+        }
+        else -> {}
+      }
+    }
+
+    return START_REDELIVER_INTENT
+  }
+
+  private fun createNotificationChannel() {
+    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+      val notificationChannel =
+        NotificationChannel(
+          MatterAppServiceConstants.NOTIFICATION_CHANNEL_ID,
+          MatterAppServiceConstants.NOTIFICATION_CHANNEL_NAME,
+          NotificationManager.IMPORTANCE_DEFAULT
+        )
+
+      val manager = getSystemService(NotificationManager::class.java)
+      manager?.createNotificationChannel(notificationChannel)
+    }
+  }
+
+  private fun cancelNotificationChannel() {
+    val manager = getSystemService(NotificationManager::class.java)
+    manager?.cancel(MatterAppServiceConstants.NOTIFICATION_FOREGROUND_ID)
+  }
+
+  private fun startService() {
+    Timber.d("Hit")
+
+    createNotificationChannel()
+
+    val notification: Notification =
+      NotificationCompat.Builder(this, MatterAppServiceConstants.NOTIFICATION_CHANNEL_ID)
+        .setContentTitle("MatterApp Service")
+        .setContentText("MatterApp is running")
+        .setSmallIcon(R.mipmap.ic_launcher)
+        .build()
+
+    startForeground(MatterAppServiceConstants.NOTIFICATION_FOREGROUND_ID, notification)
+  }
+
+  private fun stopService() {
+    Timber.d("Hit")
+    cancelNotificationChannel()
+    stopForeground(true)
+    stopSelf()
+  }
+}
diff --git a/examples/virtual-device-app/android/App/core/matter/src/main/java/com/matter/virtual/device/app/core/matter/MatterAppServiceConstants.kt b/examples/virtual-device-app/android/App/core/matter/src/main/java/com/matter/virtual/device/app/core/matter/MatterAppServiceConstants.kt
new file mode 100644
index 0000000..bcee271
--- /dev/null
+++ b/examples/virtual-device-app/android/App/core/matter/src/main/java/com/matter/virtual/device/app/core/matter/MatterAppServiceConstants.kt
@@ -0,0 +1,10 @@
+package com.matter.virtual.device.app.core.matter
+
+object MatterAppServiceConstants {
+  const val ACTION_START_MATTER_APP_SERVICE = "ACTION_START_MATTER_APP_SERVICE"
+  const val ACTION_STOP_MATTER_APP_SERVICE = "ACTION_STOP_MATTER_APP_SERVICE"
+
+  const val NOTIFICATION_CHANNEL_ID = "VIRTUAL_DEVICE"
+  const val NOTIFICATION_FOREGROUND_ID = 1
+  const val NOTIFICATION_CHANNEL_NAME = "Matter App"
+}