From 4084c9581d380f3af1edeb16a4f792c842ee9c5a Mon Sep 17 00:00:00 2001 From: althafvly Date: Thu, 17 Apr 2025 13:12:35 +0530 Subject: [PATCH] Revert "feat: add murena.io PWA" This reverts commit ff32b1ccf3df79cdb8147687eb15c87c4b4bbbba. --- app/src/main/AndroidManifest.xml | 5 - .../application/ApplicationDataManager.kt | 2 +- .../downloadInfo/DownloadInfoApiImpl.kt | 2 +- .../apps/data/application/home/HomeApiImpl.kt | 2 +- .../foundation/e/apps/data/enums/Source.kt | 2 - .../e/apps/install/pkg/PwaManager.kt | 21 +-- .../updates/UpdatesBroadcastReceiver.kt | 5 - .../workmanager/AppInstallProcessor.kt | 3 +- .../model/ApplicationScreenshotsRVAdapter.kt | 2 +- .../ApplicationListRVAdapter.kt | 3 - .../e/apps/utils/LocalPWAInstaller.kt | 134 ------------------ .../res/drawable-nodpi/murena_pwa_logo.webp | Bin 27072 -> 0 bytes 12 files changed, 7 insertions(+), 174 deletions(-) delete mode 100644 app/src/main/java/foundation/e/apps/utils/LocalPWAInstaller.kt delete mode 100644 app/src/main/res/drawable-nodpi/murena_pwa_logo.webp diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5adf95d9e..8b1b2ec53 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -100,11 +100,6 @@ android:foregroundServiceType="dataSync"> - - - diff --git a/app/src/main/java/foundation/e/apps/data/application/ApplicationDataManager.kt b/app/src/main/java/foundation/e/apps/data/application/ApplicationDataManager.kt index bdcbe1fed..96290fd68 100644 --- a/app/src/main/java/foundation/e/apps/data/application/ApplicationDataManager.kt +++ b/app/src/main/java/foundation/e/apps/data/application/ApplicationDataManager.kt @@ -58,7 +58,7 @@ class ApplicationDataManager @Inject constructor( application.package_name.isBlank() -> FilterLevel.UNKNOWN !application.isFree && application.price.isBlank() -> FilterLevel.UI application.source == Source.PWA || application.source == Source.OPEN_SOURCE -> FilterLevel.NONE - application.source == Source.SYSTEM_APP || application.source == Source.LOCAL_PWA -> FilterLevel.NONE + application.source == Source.SYSTEM_APP -> FilterLevel.NONE !isRestricted(application) -> FilterLevel.NONE application.originalSize == 0L -> FilterLevel.UI else -> FilterLevel.NONE diff --git a/app/src/main/java/foundation/e/apps/data/application/downloadInfo/DownloadInfoApiImpl.kt b/app/src/main/java/foundation/e/apps/data/application/downloadInfo/DownloadInfoApiImpl.kt index 94d111f83..8e6ca6d84 100644 --- a/app/src/main/java/foundation/e/apps/data/application/downloadInfo/DownloadInfoApiImpl.kt +++ b/app/src/main/java/foundation/e/apps/data/application/downloadInfo/DownloadInfoApiImpl.kt @@ -73,7 +73,7 @@ class DownloadInfoApiImpl @Inject constructor( updateDownloadInfoFromGplay(appInstall, list) } - Source.SYSTEM_APP, Source.LOCAL_PWA -> { + Source.SYSTEM_APP -> { return // nothing to do as downloadURLList is already set } } diff --git a/app/src/main/java/foundation/e/apps/data/application/home/HomeApiImpl.kt b/app/src/main/java/foundation/e/apps/data/application/home/HomeApiImpl.kt index bca60285a..e82c70db8 100644 --- a/app/src/main/java/foundation/e/apps/data/application/home/HomeApiImpl.kt +++ b/app/src/main/java/foundation/e/apps/data/application/home/HomeApiImpl.kt @@ -93,7 +93,7 @@ class HomeApiImpl @Inject constructor( Source.PLAY_STORE -> ("GPlay home loading error\n" + apiStatus.message).trim() Source.SYSTEM_APP -> ("Gitlab home not allowed\n" + apiStatus.message).trim() Source.OPEN_SOURCE -> ("Open Source home loading error\n" + apiStatus.message).trim() - Source.PWA, Source.LOCAL_PWA -> ("PWA home loading error\n" + apiStatus.message).trim() + Source.PWA -> ("PWA home loading error\n" + apiStatus.message).trim() } } } diff --git a/app/src/main/java/foundation/e/apps/data/enums/Source.kt b/app/src/main/java/foundation/e/apps/data/enums/Source.kt index c5142b463..6bafbc435 100644 --- a/app/src/main/java/foundation/e/apps/data/enums/Source.kt +++ b/app/src/main/java/foundation/e/apps/data/enums/Source.kt @@ -19,7 +19,6 @@ package foundation.e.apps.data.enums enum class Source { OPEN_SOURCE, - LOCAL_PWA, PWA, SYSTEM_APP, PLAY_STORE; @@ -38,7 +37,6 @@ enum class Source { return when (source) { "Open Source" -> OPEN_SOURCE "PWA" -> PWA - "Local PWA" -> LOCAL_PWA "SYSTEM_APP" -> SYSTEM_APP else -> PLAY_STORE } diff --git a/app/src/main/java/foundation/e/apps/install/pkg/PwaManager.kt b/app/src/main/java/foundation/e/apps/install/pkg/PwaManager.kt index 065da3d58..b1ea00b57 100644 --- a/app/src/main/java/foundation/e/apps/install/pkg/PwaManager.kt +++ b/app/src/main/java/foundation/e/apps/install/pkg/PwaManager.kt @@ -7,9 +7,7 @@ import android.content.Intent import android.database.Cursor import android.graphics.Bitmap import android.graphics.BitmapFactory -import android.graphics.drawable.BitmapDrawable import android.net.Uri -import androidx.core.content.ContextCompat import androidx.core.content.pm.ShortcutInfoCompat import androidx.core.content.pm.ShortcutManagerCompat import androidx.core.graphics.drawable.IconCompat @@ -26,7 +24,6 @@ import java.io.IOException import java.net.URL import javax.inject.Inject import javax.inject.Singleton -import foundation.e.apps.data.enums.Source @Singleton @OpenForTesting @@ -44,7 +41,7 @@ class PwaManager @Inject constructor( private const val PWA_NAME = "PWA_NAME" private const val PWA_ID = "PWA_ID" - const val PWA_PLAYER = "content://foundation.e.pwaplayer.provider/pwa" + private const val PWA_PLAYER = "content://foundation.e.pwaplayer.provider/pwa" private const val VIEW_PWA = "foundation.e.blisslauncher.VIEW_PWA" private const val DELAY_100 = 100L @@ -120,12 +117,7 @@ class PwaManager @Inject constructor( appInstallRepository.updateDownload(appInstall) // Get bitmap and byteArray for icon - val iconBitmap = if (appInstall.source != Source.LOCAL_PWA) { - getIconImageBitmap(appInstall.getAppIconUrl()) - } else { - val resourceId = appInstall.getAppIconUrl().toInt() - getIconImageBitmapFromDrawable(context, resourceId) - } + val iconBitmap = getIconImageBitmap(appInstall.getAppIconUrl()) if (iconBitmap == null) { appInstall.status = Status.INSTALLATION_ISSUE @@ -158,15 +150,6 @@ class PwaManager @Inject constructor( } } - fun getIconImageBitmapFromDrawable(context: Context, resourceId: Int): Bitmap? { - val drawable = ContextCompat.getDrawable(context, resourceId) - if (drawable is BitmapDrawable) { - return drawable.bitmap - } - - return null - } - fun Bitmap.toByteArray(): ByteArray { val byteArrayOS = ByteArrayOutputStream() this.compress(Bitmap.CompressFormat.PNG, BITMAP_QUALITY, byteArrayOS) diff --git a/app/src/main/java/foundation/e/apps/install/updates/UpdatesBroadcastReceiver.kt b/app/src/main/java/foundation/e/apps/install/updates/UpdatesBroadcastReceiver.kt index 65c4bc7c4..36e89a247 100644 --- a/app/src/main/java/foundation/e/apps/install/updates/UpdatesBroadcastReceiver.kt +++ b/app/src/main/java/foundation/e/apps/install/updates/UpdatesBroadcastReceiver.kt @@ -20,10 +20,8 @@ package foundation.e.apps.install.updates import android.content.BroadcastReceiver import android.content.Context import android.content.Intent -import androidx.core.content.ContextCompat import androidx.work.ExistingPeriodicWorkPolicy import foundation.e.apps.data.preference.AppLoungePreference -import foundation.e.apps.utils.LocalPWAInstaller import timber.log.Timber class UpdatesBroadcastReceiver : BroadcastReceiver() { @@ -34,9 +32,6 @@ class UpdatesBroadcastReceiver : BroadcastReceiver() { val appLoungePreference = AppLoungePreference(context) val interval = appLoungePreference.getUpdateInterval() UpdatesWorkManager.enqueueWork(context, interval, ExistingPeriodicWorkPolicy.REPLACE) - - val serviceIntent = Intent(context, LocalPWAInstaller::class.java) - ContextCompat.startForegroundService(context, serviceIntent) } } } diff --git a/app/src/main/java/foundation/e/apps/install/workmanager/AppInstallProcessor.kt b/app/src/main/java/foundation/e/apps/install/workmanager/AppInstallProcessor.kt index 5aade84fb..58cc4ca81 100644 --- a/app/src/main/java/foundation/e/apps/install/workmanager/AppInstallProcessor.kt +++ b/app/src/main/java/foundation/e/apps/install/workmanager/AppInstallProcessor.kt @@ -100,8 +100,7 @@ class AppInstallProcessor @Inject constructor( it.contentRating = application.contentRating } - if (appInstall.type == Type.PWA || application.source == Source.SYSTEM_APP - || appInstall.source == Source.LOCAL_PWA) { + if (appInstall.type == Type.PWA || application.source == Source.SYSTEM_APP) { appInstall.downloadURLList = mutableListOf(application.url) } diff --git a/app/src/main/java/foundation/e/apps/ui/application/model/ApplicationScreenshotsRVAdapter.kt b/app/src/main/java/foundation/e/apps/ui/application/model/ApplicationScreenshotsRVAdapter.kt index ff2d79190..6119dfb12 100644 --- a/app/src/main/java/foundation/e/apps/ui/application/model/ApplicationScreenshotsRVAdapter.kt +++ b/app/src/main/java/foundation/e/apps/ui/application/model/ApplicationScreenshotsRVAdapter.kt @@ -61,7 +61,7 @@ class ApplicationScreenshotsRVAdapter( Source.PLAY_STORE -> { imageView.load(oldList[position]) } - Source.SYSTEM_APP, Source.LOCAL_PWA -> { + Source.SYSTEM_APP -> { // no operation } } diff --git a/app/src/main/java/foundation/e/apps/ui/applicationlist/ApplicationListRVAdapter.kt b/app/src/main/java/foundation/e/apps/ui/applicationlist/ApplicationListRVAdapter.kt index b17ac96af..b782362a4 100644 --- a/app/src/main/java/foundation/e/apps/ui/applicationlist/ApplicationListRVAdapter.kt +++ b/app/src/main/java/foundation/e/apps/ui/applicationlist/ApplicationListRVAdapter.kt @@ -188,9 +188,6 @@ class ApplicationListRVAdapter( placeholder(shimmerDrawable) } } - Source.LOCAL_PWA -> { - // Do nothing - } } } diff --git a/app/src/main/java/foundation/e/apps/utils/LocalPWAInstaller.kt b/app/src/main/java/foundation/e/apps/utils/LocalPWAInstaller.kt deleted file mode 100644 index 482459262..000000000 --- a/app/src/main/java/foundation/e/apps/utils/LocalPWAInstaller.kt +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Copyright (C) 2025 e Foundation - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package foundation.e.apps.utils - -import android.app.NotificationChannel -import android.app.NotificationManager -import android.app.Service -import android.content.Context -import android.content.Intent -import android.content.pm.ServiceInfo -import android.os.IBinder -import androidx.core.app.NotificationCompat -import androidx.core.net.toUri -import dagger.hilt.android.AndroidEntryPoint -import foundation.e.apps.R -import foundation.e.apps.data.enums.Source -import foundation.e.apps.data.enums.Status -import foundation.e.apps.data.install.models.AppInstall -import foundation.e.apps.install.pkg.PwaManager -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.delay -import kotlinx.coroutines.launch -import timber.log.Timber -import java.util.UUID -import javax.inject.Inject -import androidx.core.content.edit -import foundation.e.apps.install.pkg.PwaManager.Companion.PWA_PLAYER - - -@AndroidEntryPoint -class LocalPWAInstaller : Service() { - @Inject - lateinit var pwaManager: PwaManager - - override fun onCreate() { - super.onCreate() - getSystemService(NotificationManager::class.java).createNotificationChannel( - NotificationChannel(CHANNEL_ID, getString(R.string.pwa), - NotificationManager.IMPORTANCE_LOW) - ) - } - - override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { - // Ensure the service is in the foreground - // It is required to install PWA - startForeground(NOTIFICATION_ID, createNotification(), ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC) - - CoroutineScope(Dispatchers.IO).launch { - // Add a short delay to allow foreground state to settle - delay(DELAY_BEFORE_INSTALL_MS) - installPWA() - } - - return START_NOT_STICKY - } - - private fun createNotification() = NotificationCompat.Builder(this, CHANNEL_ID) - .setContentTitle(getString(R.string.pwa)) - .setContentText(getString(R.string.installing)) - .setSmallIcon(R.drawable.app_lounge_notification_icon) - .setPriority(NotificationCompat.PRIORITY_LOW) - .build() - - private suspend fun installPWA() { - val preferences = getSharedPreferences(PREFERENCES_FILE_NAME, Context.MODE_PRIVATE) - - // Pwa info - val pwaUrl = "https://accounts.murena.io/auth" - val pwaName = "Workspace" - - val localPwa = AppInstall( - id = UUID.randomUUID().toString(), - source = Source.LOCAL_PWA, - name = pwaName, - downloadURLList = mutableListOf(pwaUrl), - iconImageUrl = (R.drawable.murena_pwa_logo).toString() - ) - - val wasInstalledBefore = preferences.getBoolean(pwaUrl, false) - if (getPwaStatus(localPwa) != Status.INSTALLED && !wasInstalledBefore) { - pwaManager.installPWAApp(localPwa) - Timber.d("Installed PWA: ${localPwa.name}") - - // Mark as installed - preferences.edit { - putBoolean(pwaUrl, true) - } - } else { - Timber.d("PWA already installed: ${localPwa.name}") - } - - stopSelf() - } - - private fun getPwaStatus(app: AppInstall): Status { - val urlToCheck = app.downloadURLList.firstOrNull() ?: return Status.UNAVAILABLE - - val isInstalled = contentResolver.query( - PWA_PLAYER.toUri(), - arrayOf("url"), - null, null, null - )?.use { cursor -> - generateSequence { if (cursor.moveToNext()) cursor else null } - .any { it.getString(it.getColumnIndexOrThrow("url")) == urlToCheck } - } ?: false - - return if (isInstalled) Status.INSTALLED else Status.UNAVAILABLE - } - - override fun onBind(intent: Intent?): IBinder? = null - - companion object { - private const val CHANNEL_ID = "PWA_INSTALLATION_CHANNEL" - private const val PREFERENCES_FILE_NAME = "local_pwa_list" - private const val NOTIFICATION_ID = 1 - private const val DELAY_BEFORE_INSTALL_MS = 1000L - } -} diff --git a/app/src/main/res/drawable-nodpi/murena_pwa_logo.webp b/app/src/main/res/drawable-nodpi/murena_pwa_logo.webp deleted file mode 100644 index a21d79ab51458677f81b61cf0e90854aa0c20b52..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27072 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 JUS%^s1OVXLWp)4n -- GitLab