| /* |
| * Copyright (C) 2023 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package com.android.wallpaper.util |
| |
| import android.app.WallpaperInfo |
| import android.app.WallpaperManager |
| import android.app.WallpaperManager.FLAG_LOCK |
| import android.app.WallpaperManager.FLAG_SYSTEM |
| import android.content.Context |
| import android.content.Intent |
| import android.content.pm.ApplicationInfo |
| import android.text.TextUtils |
| import android.util.Log |
| import com.android.wallpaper.picker.LivePreviewFragment |
| |
| /** The utility class for live wallpaper the can be deleted */ |
| object DeletableUtils { |
| private const val TAG = "DeletableUtils" |
| |
| /** If a wallpaper can be deleted. */ |
| @JvmStatic |
| fun canBeDeleted(context: Context, wallpaperInfo: WallpaperInfo): Boolean { |
| return !TextUtils.isEmpty(getDeleteAction(context, wallpaperInfo)) |
| } |
| |
| /** Delete a wallpaper. */ |
| @JvmStatic |
| fun deleteLiveWallpaper( |
| context: Context, |
| wallpaperInfo: com.android.wallpaper.model.WallpaperInfo |
| ) { |
| val deleteIntent = getDeleteActionIntent(context, wallpaperInfo.wallpaperComponent) |
| if (deleteIntent != null) { |
| context.startService(deleteIntent) |
| } |
| } |
| |
| private fun getDeleteActionIntent(context: Context, wallpaperInfo: WallpaperInfo): Intent? { |
| val deleteAction = getDeleteAction(context, wallpaperInfo) |
| if (TextUtils.isEmpty(deleteAction)) { |
| return null |
| } |
| val deleteActionIntent = Intent(deleteAction) |
| deleteActionIntent.setPackage(wallpaperInfo.packageName) |
| deleteActionIntent.putExtra(LivePreviewFragment.EXTRA_LIVE_WALLPAPER_INFO, wallpaperInfo) |
| return deleteActionIntent |
| } |
| |
| private fun getDeleteAction(context: Context, wallpaperInfo: WallpaperInfo): String? { |
| val currentInfo = WallpaperManager.getInstance(context).getWallpaperInfo(FLAG_SYSTEM) |
| val currentLockInfo = WallpaperManager.getInstance(context).getWallpaperInfo(FLAG_LOCK) |
| val serviceInfo = wallpaperInfo.serviceInfo |
| val appInfo = serviceInfo.applicationInfo |
| val isPackagePreInstalled = |
| appInfo != null && appInfo.flags and ApplicationInfo.FLAG_SYSTEM != 0 |
| // This wallpaper is not installed before |
| if (!isPackagePreInstalled) { |
| Log.d(TAG, "This wallpaper is not pre-installed: " + serviceInfo.name) |
| return null |
| } |
| |
| // A currently set Live wallpaper should not be deleted. |
| val currentService = currentInfo?.serviceInfo |
| if (currentService != null && TextUtils.equals(serviceInfo.name, currentService.name)) { |
| return null |
| } |
| val currentLockService = currentLockInfo?.serviceInfo |
| if ( |
| currentLockService != null && |
| TextUtils.equals(serviceInfo.name, currentLockService.name) |
| ) { |
| return null |
| } |
| val metaData = serviceInfo.metaData |
| return metaData?.getString(LivePreviewFragment.KEY_ACTION_DELETE_LIVE_WALLPAPER) |
| } |
| } |