blob: f6c55f9d6c81710d29a2a7053d81d6ac9ce65e37 [file] [log] [blame]
/*
* Copyright (C) 2017 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.module
import android.app.WallpaperColors
import android.app.WallpaperManager.SetWallpaperFlags
import android.app.backup.BackupManager
import android.content.Context
import android.content.SharedPreferences
import android.content.SharedPreferences.OnSharedPreferenceChangeListener
import android.graphics.Bitmap
import android.graphics.Color
import android.graphics.Point
import android.graphics.Rect
import android.util.Log
import com.android.wallpaper.model.LiveWallpaperInfo
import com.android.wallpaper.model.LiveWallpaperPrefMetadata
import com.android.wallpaper.model.StaticWallpaperPrefMetadata
import com.android.wallpaper.model.WallpaperInfo
import com.android.wallpaper.module.WallpaperPreferenceKeys.NoBackupKeys
import com.android.wallpaper.module.WallpaperPreferences.Companion.generateRecentsKey
import com.android.wallpaper.module.WallpaperPreferences.PendingDailyWallpaperUpdateStatus
import com.android.wallpaper.module.WallpaperPreferences.PendingWallpaperSetStatus
import com.android.wallpaper.module.WallpaperPreferences.PresentationMode
import com.android.wallpaper.picker.customization.shared.model.WallpaperDestination
import com.android.wallpaper.picker.data.WallpaperModel.LiveWallpaperModel
import com.android.wallpaper.picker.data.WallpaperModel.StaticWallpaperModel
import java.text.SimpleDateFormat
import java.util.Calendar
import java.util.Locale
import java.util.TimeZone
import org.json.JSONArray
import org.json.JSONException
/** Default implementation that writes to and reads from SharedPreferences. */
open class DefaultWallpaperPreferences(private val context: Context) : WallpaperPreferences {
protected val sharedPrefs: SharedPreferences =
context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
protected val noBackupPrefs: SharedPreferences =
context.getSharedPreferences(NO_BACKUP_PREFS_NAME, Context.MODE_PRIVATE)
private val backupManager = BackupManager(context)
private val sharedPrefsChangedListener = OnSharedPreferenceChangeListener { _, _ ->
backupManager.dataChanged()
}
init {
if (noBackupPrefs.all.isEmpty() && sharedPrefs.all.isNotEmpty()) {
upgradePrefs()
}
// Register a prefs changed listener so that all prefs changes trigger a backup event.
sharedPrefs.registerOnSharedPreferenceChangeListener(sharedPrefsChangedListener)
}
/**
* Move [NoBackupKeys] preferences that might have been in mSharedPrefs from previous versions
* of the app into mNoBackupPrefs.
*/
private fun upgradePrefs() {
val noBackupEditor = noBackupPrefs.edit()
if (sharedPrefs.contains(NoBackupKeys.KEY_HOME_WALLPAPER_BASE_IMAGE_URL)) {
noBackupEditor.putString(
NoBackupKeys.KEY_HOME_WALLPAPER_BASE_IMAGE_URL,
sharedPrefs.getString(NoBackupKeys.KEY_HOME_WALLPAPER_BASE_IMAGE_URL, null)
)
}
if (sharedPrefs.contains(NoBackupKeys.KEY_HOME_WALLPAPER_MANAGER_ID)) {
noBackupEditor.putInt(
NoBackupKeys.KEY_HOME_WALLPAPER_MANAGER_ID,
sharedPrefs.getInt(NoBackupKeys.KEY_HOME_WALLPAPER_MANAGER_ID, 0)
)
}
if (sharedPrefs.contains(NoBackupKeys.KEY_HOME_WALLPAPER_REMOTE_ID)) {
noBackupEditor.putString(
NoBackupKeys.KEY_HOME_WALLPAPER_REMOTE_ID,
sharedPrefs.getString(NoBackupKeys.KEY_HOME_WALLPAPER_REMOTE_ID, null)
)
}
if (sharedPrefs.contains(NoBackupKeys.KEY_HOME_WALLPAPER_BACKING_FILE)) {
noBackupEditor.putString(
NoBackupKeys.KEY_HOME_WALLPAPER_BACKING_FILE,
sharedPrefs.getString(NoBackupKeys.KEY_HOME_WALLPAPER_BACKING_FILE, null)
)
}
if (sharedPrefs.contains(NoBackupKeys.KEY_LOCK_WALLPAPER_MANAGER_ID)) {
noBackupEditor.putInt(
NoBackupKeys.KEY_LOCK_WALLPAPER_MANAGER_ID,
sharedPrefs.getInt(NoBackupKeys.KEY_LOCK_WALLPAPER_MANAGER_ID, 0)
)
}
if (sharedPrefs.contains(NoBackupKeys.KEY_LOCK_WALLPAPER_BACKING_FILE)) {
noBackupEditor.putString(
NoBackupKeys.KEY_LOCK_WALLPAPER_BACKING_FILE,
sharedPrefs.getString(NoBackupKeys.KEY_LOCK_WALLPAPER_BACKING_FILE, null)
)
}
if (sharedPrefs.contains(NoBackupKeys.KEY_DAILY_ROTATION_TIMESTAMPS)) {
noBackupEditor.putString(
NoBackupKeys.KEY_DAILY_ROTATION_TIMESTAMPS,
sharedPrefs.getString(NoBackupKeys.KEY_DAILY_ROTATION_TIMESTAMPS, null)
)
}
if (sharedPrefs.contains(NoBackupKeys.KEY_DAILY_WALLPAPER_ENABLED_TIMESTAMP)) {
noBackupEditor.putLong(
NoBackupKeys.KEY_DAILY_WALLPAPER_ENABLED_TIMESTAMP,
sharedPrefs.getLong(NoBackupKeys.KEY_DAILY_WALLPAPER_ENABLED_TIMESTAMP, -1)
)
}
if (sharedPrefs.contains(NoBackupKeys.KEY_LAST_DAILY_LOG_TIMESTAMP)) {
noBackupEditor.putLong(
NoBackupKeys.KEY_LAST_DAILY_LOG_TIMESTAMP,
sharedPrefs.getLong(NoBackupKeys.KEY_LAST_DAILY_LOG_TIMESTAMP, 0)
)
}
if (sharedPrefs.contains(NoBackupKeys.KEY_LAST_APP_ACTIVE_TIMESTAMP)) {
noBackupEditor.putLong(
NoBackupKeys.KEY_LAST_APP_ACTIVE_TIMESTAMP,
sharedPrefs.getLong(NoBackupKeys.KEY_LAST_APP_ACTIVE_TIMESTAMP, 0)
)
}
if (sharedPrefs.contains(NoBackupKeys.KEY_LAST_ROTATION_STATUS)) {
noBackupEditor.putInt(
NoBackupKeys.KEY_LAST_ROTATION_STATUS,
sharedPrefs.getInt(NoBackupKeys.KEY_LAST_ROTATION_STATUS, -1)
)
}
if (sharedPrefs.contains(NoBackupKeys.KEY_LAST_ROTATION_STATUS_TIMESTAMP)) {
noBackupEditor.putLong(
NoBackupKeys.KEY_LAST_ROTATION_STATUS_TIMESTAMP,
sharedPrefs.getLong(NoBackupKeys.KEY_LAST_ROTATION_STATUS_TIMESTAMP, 0)
)
}
if (sharedPrefs.contains(NoBackupKeys.KEY_LAST_SYNC_TIMESTAMP)) {
noBackupEditor.putLong(
NoBackupKeys.KEY_LAST_SYNC_TIMESTAMP,
sharedPrefs.getLong(NoBackupKeys.KEY_LAST_SYNC_TIMESTAMP, 0)
)
}
if (sharedPrefs.contains(NoBackupKeys.KEY_PENDING_WALLPAPER_SET_STATUS)) {
noBackupEditor.putInt(
NoBackupKeys.KEY_PENDING_WALLPAPER_SET_STATUS,
sharedPrefs.getInt(
NoBackupKeys.KEY_PENDING_WALLPAPER_SET_STATUS,
WallpaperPreferences.WALLPAPER_SET_NOT_PENDING
)
)
}
if (sharedPrefs.contains(NoBackupKeys.KEY_PENDING_DAILY_WALLPAPER_UPDATE_STATUS)) {
noBackupEditor.putInt(
NoBackupKeys.KEY_PENDING_DAILY_WALLPAPER_UPDATE_STATUS,
sharedPrefs.getInt(
NoBackupKeys.KEY_PENDING_DAILY_WALLPAPER_UPDATE_STATUS,
WallpaperPreferences.DAILY_WALLPAPER_UPDATE_NOT_PENDING
)
)
}
if (sharedPrefs.contains(NoBackupKeys.KEY_NUM_DAYS_DAILY_ROTATION_FAILED)) {
noBackupEditor.putInt(
NoBackupKeys.KEY_NUM_DAYS_DAILY_ROTATION_FAILED,
sharedPrefs.getInt(NoBackupKeys.KEY_NUM_DAYS_DAILY_ROTATION_FAILED, 0)
)
}
if (sharedPrefs.contains(NoBackupKeys.KEY_NUM_DAYS_DAILY_ROTATION_NOT_ATTEMPTED)) {
noBackupEditor.putInt(
NoBackupKeys.KEY_NUM_DAYS_DAILY_ROTATION_NOT_ATTEMPTED,
sharedPrefs.getInt(NoBackupKeys.KEY_NUM_DAYS_DAILY_ROTATION_NOT_ATTEMPTED, 0)
)
}
if (sharedPrefs.contains(NoBackupKeys.KEY_HOME_WALLPAPER_SERVICE_NAME)) {
noBackupEditor.putString(
NoBackupKeys.KEY_HOME_WALLPAPER_SERVICE_NAME,
sharedPrefs.getString(NoBackupKeys.KEY_HOME_WALLPAPER_SERVICE_NAME, null)
)
}
noBackupEditor.apply()
}
private fun getResIdPersistedByName(key: String, type: String): Int {
val resName = sharedPrefs.getString(key, null) ?: return 0
return context.resources.getIdentifier(resName, type, context.packageName)
}
private fun persistResIdByName(key: String, resId: Int) {
sharedPrefs.edit().putString(key, getResName(resId)).apply()
}
private fun getResName(resId: Int): String {
return context.resources.getResourceName(resId)
}
override fun getWallpaperPresentationMode(): Int {
@PresentationMode
val homeWallpaperPresentationMode =
sharedPrefs.getInt(
WallpaperPreferenceKeys.KEY_WALLPAPER_PRESENTATION_MODE,
WallpaperPreferences.PRESENTATION_MODE_STATIC
)
return homeWallpaperPresentationMode
}
override fun setWallpaperPresentationMode(@PresentationMode presentationMode: Int) {
sharedPrefs
.edit()
.putInt(WallpaperPreferenceKeys.KEY_WALLPAPER_PRESENTATION_MODE, presentationMode)
.apply()
}
override fun getHomeWallpaperAttributions(): List<String?>? {
return listOf(
sharedPrefs.getString(WallpaperPreferenceKeys.KEY_HOME_WALLPAPER_ATTRIB_1, null),
sharedPrefs.getString(WallpaperPreferenceKeys.KEY_HOME_WALLPAPER_ATTRIB_2, null),
sharedPrefs.getString(WallpaperPreferenceKeys.KEY_HOME_WALLPAPER_ATTRIB_3, null)
)
}
override fun setHomeWallpaperAttributions(attributions: List<String?>?) {
if (attributions.isNullOrEmpty()) {
return
}
val editor = sharedPrefs.edit()
attributions.take(3).forEachIndexed { index, attr ->
when (index) {
0 -> editor.putString(WallpaperPreferenceKeys.KEY_HOME_WALLPAPER_ATTRIB_1, attr)
1 -> editor.putString(WallpaperPreferenceKeys.KEY_HOME_WALLPAPER_ATTRIB_2, attr)
2 -> editor.putString(WallpaperPreferenceKeys.KEY_HOME_WALLPAPER_ATTRIB_3, attr)
}
}
editor.apply()
}
override fun getHomeWallpaperActionUrl(): String? {
return sharedPrefs.getString(WallpaperPreferenceKeys.KEY_HOME_WALLPAPER_ACTION_URL, null)
}
override fun setHomeWallpaperActionUrl(actionUrl: String?) {
sharedPrefs
.edit()
.putString(WallpaperPreferenceKeys.KEY_HOME_WALLPAPER_ACTION_URL, actionUrl)
.apply()
}
override fun getHomeWallpaperCollectionId(): String? {
return sharedPrefs.getString(WallpaperPreferenceKeys.KEY_HOME_WALLPAPER_COLLECTION_ID, null)
}
override fun setHomeWallpaperCollectionId(collectionId: String?) {
sharedPrefs
.edit()
.putString(WallpaperPreferenceKeys.KEY_HOME_WALLPAPER_COLLECTION_ID, collectionId)
.apply()
}
override fun clearHomeWallpaperMetadata() {
sharedPrefs
.edit()
.remove(WallpaperPreferenceKeys.KEY_HOME_WALLPAPER_ATTRIB_1)
.remove(WallpaperPreferenceKeys.KEY_HOME_WALLPAPER_ATTRIB_2)
.remove(WallpaperPreferenceKeys.KEY_HOME_WALLPAPER_ATTRIB_3)
.remove(WallpaperPreferenceKeys.KEY_HOME_WALLPAPER_ACTION_URL)
.remove(WallpaperPreferenceKeys.KEY_HOME_WALLPAPER_COLLECTION_ID)
.remove(WallpaperPreferenceKeys.KEY_HOME_WALLPAPER_HASH_CODE)
.apply()
noBackupPrefs
.edit()
.remove(NoBackupKeys.KEY_HOME_WALLPAPER_SERVICE_NAME)
.remove(NoBackupKeys.KEY_HOME_WALLPAPER_EFFECTS)
.remove(NoBackupKeys.KEY_HOME_WALLPAPER_MANAGER_ID)
.remove(NoBackupKeys.KEY_HOME_WALLPAPER_REMOTE_ID)
.remove(NoBackupKeys.KEY_HOME_WALLPAPER_BASE_IMAGE_URL)
.remove(NoBackupKeys.KEY_HOME_WALLPAPER_BACKING_FILE)
.apply()
}
override fun setHomeStaticImageWallpaperMetadata(metadata: StaticWallpaperPrefMetadata) {
val sharedEditor = sharedPrefs.edit()
val attributions = metadata.attributions
if (!attributions.isNullOrEmpty()) {
attributions.take(3).forEachIndexed { index, attr ->
when (index) {
0 ->
sharedEditor.putString(
WallpaperPreferenceKeys.KEY_HOME_WALLPAPER_ATTRIB_1,
attr
)
1 ->
sharedEditor.putString(
WallpaperPreferenceKeys.KEY_HOME_WALLPAPER_ATTRIB_2,
attr
)
2 ->
sharedEditor.putString(
WallpaperPreferenceKeys.KEY_HOME_WALLPAPER_ATTRIB_3,
attr
)
}
}
}
sharedEditor.putString(
WallpaperPreferenceKeys.KEY_HOME_WALLPAPER_ACTION_URL,
metadata.actionUrl
)
sharedEditor.putString(
WallpaperPreferenceKeys.KEY_HOME_WALLPAPER_COLLECTION_ID,
metadata.collectionId
)
val hashCode = metadata.hashCode
if (hashCode != null) {
sharedEditor.putLong(WallpaperPreferenceKeys.KEY_HOME_WALLPAPER_HASH_CODE, hashCode)
}
sharedEditor.apply()
val noBackupEditor = noBackupPrefs.edit()
noBackupEditor.putInt(NoBackupKeys.KEY_HOME_WALLPAPER_MANAGER_ID, metadata.managerId)
noBackupEditor.putString(NoBackupKeys.KEY_HOME_WALLPAPER_REMOTE_ID, metadata.remoteId)
noBackupEditor.apply()
}
override fun setHomeLiveWallpaperMetadata(metadata: LiveWallpaperPrefMetadata) {
val sharedEditor = sharedPrefs.edit()
val attributions = metadata.attributions
if (!attributions.isNullOrEmpty()) {
attributions.take(3).forEachIndexed { index, attr ->
when (index) {
0 ->
sharedEditor.putString(
WallpaperPreferenceKeys.KEY_HOME_WALLPAPER_ATTRIB_1,
attr
)
1 ->
sharedEditor.putString(
WallpaperPreferenceKeys.KEY_HOME_WALLPAPER_ATTRIB_2,
attr
)
2 ->
sharedEditor.putString(
WallpaperPreferenceKeys.KEY_HOME_WALLPAPER_ATTRIB_3,
attr
)
}
}
}
sharedEditor.putString(
WallpaperPreferenceKeys.KEY_HOME_WALLPAPER_COLLECTION_ID,
metadata.collectionId
)
sharedEditor.apply()
val noBackupEditor = noBackupPrefs.edit()
noBackupEditor.putString(NoBackupKeys.KEY_HOME_WALLPAPER_SERVICE_NAME, metadata.serviceName)
noBackupEditor.putString(NoBackupKeys.KEY_HOME_WALLPAPER_EFFECTS, metadata.effectName)
noBackupEditor.putInt(NoBackupKeys.KEY_HOME_WALLPAPER_MANAGER_ID, metadata.managerId)
noBackupEditor.apply()
}
override fun getHomeWallpaperHashCode(): Long {
return sharedPrefs.getLong(WallpaperPreferenceKeys.KEY_HOME_WALLPAPER_HASH_CODE, 0)
}
override fun setHomeWallpaperHashCode(hashCode: Long) {
sharedPrefs
.edit()
.putLong(WallpaperPreferenceKeys.KEY_HOME_WALLPAPER_HASH_CODE, hashCode)
.apply()
}
override fun getHomeWallpaperServiceName(): String? {
return noBackupPrefs.getString(NoBackupKeys.KEY_HOME_WALLPAPER_SERVICE_NAME, null)
}
override fun setHomeWallpaperServiceName(serviceName: String?) {
noBackupPrefs
.edit()
.putString(NoBackupKeys.KEY_HOME_WALLPAPER_SERVICE_NAME, serviceName)
.apply()
setFirstWallpaperApplyDateIfNeeded()
}
override fun getHomeWallpaperManagerId(): Int {
return noBackupPrefs.getInt(NoBackupKeys.KEY_HOME_WALLPAPER_MANAGER_ID, 0)
}
override fun setHomeWallpaperManagerId(homeWallpaperId: Int) {
noBackupPrefs
.edit()
.putInt(NoBackupKeys.KEY_HOME_WALLPAPER_MANAGER_ID, homeWallpaperId)
.apply()
}
override fun getHomeWallpaperRemoteId(): String? {
return noBackupPrefs.getString(NoBackupKeys.KEY_HOME_WALLPAPER_REMOTE_ID, null)
}
override fun setHomeWallpaperRemoteId(wallpaperRemoteId: String?) {
noBackupPrefs
.edit()
.putString(NoBackupKeys.KEY_HOME_WALLPAPER_REMOTE_ID, wallpaperRemoteId)
.apply()
setFirstWallpaperApplyDateIfNeeded()
}
override fun getHomeWallpaperRecentsKey(): String? {
return noBackupPrefs.getString(
NoBackupKeys.KEY_HOME_WALLPAPER_RECENTS_KEY,
generateRecentsKey(getHomeWallpaperRemoteId(), getHomeWallpaperHashCode())
)
}
override fun setHomeWallpaperRecentsKey(recentsKey: String?) {
noBackupPrefs
.edit()
.putString(NoBackupKeys.KEY_HOME_WALLPAPER_RECENTS_KEY, recentsKey)
.apply()
}
override fun getHomeWallpaperEffects(): String? {
return noBackupPrefs.getString(NoBackupKeys.KEY_HOME_WALLPAPER_EFFECTS, null)
}
override fun setHomeWallpaperEffects(wallpaperEffects: String?) {
noBackupPrefs
.edit()
.putString(NoBackupKeys.KEY_HOME_WALLPAPER_EFFECTS, wallpaperEffects)
.apply()
}
override fun getLockWallpaperAttributions(): List<String?>? {
return listOf(
sharedPrefs.getString(WallpaperPreferenceKeys.KEY_LOCK_WALLPAPER_ATTRIB_1, null),
sharedPrefs.getString(WallpaperPreferenceKeys.KEY_LOCK_WALLPAPER_ATTRIB_2, null),
sharedPrefs.getString(WallpaperPreferenceKeys.KEY_LOCK_WALLPAPER_ATTRIB_3, null)
)
}
override fun setLockWallpaperAttributions(attributions: List<String?>?) {
if (attributions.isNullOrEmpty()) {
return
}
val editor = sharedPrefs.edit()
attributions.take(3).forEachIndexed { index, attr ->
when (index) {
0 -> editor.putString(WallpaperPreferenceKeys.KEY_LOCK_WALLPAPER_ATTRIB_1, attr)
1 -> editor.putString(WallpaperPreferenceKeys.KEY_LOCK_WALLPAPER_ATTRIB_2, attr)
2 -> editor.putString(WallpaperPreferenceKeys.KEY_LOCK_WALLPAPER_ATTRIB_3, attr)
}
}
editor.apply()
}
override fun getLockWallpaperActionUrl(): String? {
return sharedPrefs.getString(WallpaperPreferenceKeys.KEY_LOCK_WALLPAPER_ACTION_URL, null)
}
override fun setLockWallpaperActionUrl(actionUrl: String?) {
sharedPrefs
.edit()
.putString(WallpaperPreferenceKeys.KEY_LOCK_WALLPAPER_ACTION_URL, actionUrl)
.apply()
}
override fun getLockWallpaperCollectionId(): String? {
return sharedPrefs.getString(WallpaperPreferenceKeys.KEY_LOCK_WALLPAPER_COLLECTION_ID, null)
}
override fun setLockWallpaperCollectionId(collectionId: String?) {
sharedPrefs
.edit()
.putString(WallpaperPreferenceKeys.KEY_LOCK_WALLPAPER_COLLECTION_ID, collectionId)
.apply()
}
override fun clearLockWallpaperMetadata() {
sharedPrefs
.edit()
.remove(WallpaperPreferenceKeys.KEY_LOCK_WALLPAPER_ATTRIB_1)
.remove(WallpaperPreferenceKeys.KEY_LOCK_WALLPAPER_ATTRIB_2)
.remove(WallpaperPreferenceKeys.KEY_LOCK_WALLPAPER_ATTRIB_3)
.remove(WallpaperPreferenceKeys.KEY_LOCK_WALLPAPER_ACTION_URL)
.remove(WallpaperPreferenceKeys.KEY_LOCK_WALLPAPER_COLLECTION_ID)
.remove(WallpaperPreferenceKeys.KEY_LOCK_WALLPAPER_HASH_CODE)
.apply()
noBackupPrefs
.edit()
.remove(NoBackupKeys.KEY_LOCK_WALLPAPER_SERVICE_NAME)
.remove(NoBackupKeys.KEY_LOCK_WALLPAPER_EFFECTS)
.remove(NoBackupKeys.KEY_LOCK_WALLPAPER_MANAGER_ID)
.remove(NoBackupKeys.KEY_LOCK_WALLPAPER_REMOTE_ID)
.remove(NoBackupKeys.KEY_LOCK_WALLPAPER_BACKING_FILE)
.apply()
}
override fun setLockStaticImageWallpaperMetadata(metadata: StaticWallpaperPrefMetadata) {
val sharedEditor = sharedPrefs.edit()
val attributions = metadata.attributions
if (!attributions.isNullOrEmpty()) {
attributions.take(3).forEachIndexed { index, attr ->
when (index) {
0 ->
sharedEditor.putString(
WallpaperPreferenceKeys.KEY_LOCK_WALLPAPER_ATTRIB_1,
attr
)
1 ->
sharedEditor.putString(
WallpaperPreferenceKeys.KEY_LOCK_WALLPAPER_ATTRIB_2,
attr
)
2 ->
sharedEditor.putString(
WallpaperPreferenceKeys.KEY_LOCK_WALLPAPER_ATTRIB_3,
attr
)
}
}
}
sharedEditor.putString(
WallpaperPreferenceKeys.KEY_LOCK_WALLPAPER_ACTION_URL,
metadata.actionUrl
)
sharedEditor.putString(
WallpaperPreferenceKeys.KEY_LOCK_WALLPAPER_COLLECTION_ID,
metadata.collectionId
)
val hashCode = metadata.hashCode
if (hashCode != null) {
sharedEditor.putLong(WallpaperPreferenceKeys.KEY_LOCK_WALLPAPER_HASH_CODE, hashCode)
}
sharedEditor.apply()
val noBackupEditor = noBackupPrefs.edit()
noBackupEditor.putInt(NoBackupKeys.KEY_LOCK_WALLPAPER_MANAGER_ID, metadata.managerId)
noBackupEditor.putString(NoBackupKeys.KEY_LOCK_WALLPAPER_REMOTE_ID, metadata.remoteId)
noBackupEditor.apply()
}
override fun setLockLiveWallpaperMetadata(metadata: LiveWallpaperPrefMetadata) {
val sharedEditor = sharedPrefs.edit()
val attributions = metadata.attributions
if (!attributions.isNullOrEmpty()) {
attributions.take(3).forEachIndexed { index, attr ->
when (index) {
0 ->
sharedEditor.putString(
WallpaperPreferenceKeys.KEY_LOCK_WALLPAPER_ATTRIB_1,
attr
)
1 ->
sharedEditor.putString(
WallpaperPreferenceKeys.KEY_LOCK_WALLPAPER_ATTRIB_2,
attr
)
2 ->
sharedEditor.putString(
WallpaperPreferenceKeys.KEY_LOCK_WALLPAPER_ATTRIB_3,
attr
)
}
}
}
sharedEditor.putString(
WallpaperPreferenceKeys.KEY_LOCK_WALLPAPER_COLLECTION_ID,
metadata.collectionId
)
sharedEditor.apply()
val noBackupEditor = noBackupPrefs.edit()
noBackupEditor.putString(NoBackupKeys.KEY_LOCK_WALLPAPER_SERVICE_NAME, metadata.serviceName)
noBackupEditor.putString(NoBackupKeys.KEY_LOCK_WALLPAPER_EFFECTS, metadata.effectName)
noBackupEditor.putInt(NoBackupKeys.KEY_LOCK_WALLPAPER_MANAGER_ID, metadata.managerId)
noBackupEditor.apply()
}
override fun getLockWallpaperHashCode(): Long {
return sharedPrefs.getLong(WallpaperPreferenceKeys.KEY_LOCK_WALLPAPER_HASH_CODE, 0)
}
override fun setLockWallpaperHashCode(hashCode: Long) {
sharedPrefs
.edit()
.putLong(WallpaperPreferenceKeys.KEY_LOCK_WALLPAPER_HASH_CODE, hashCode)
.apply()
}
override fun getLockWallpaperServiceName(): String? {
return noBackupPrefs.getString(NoBackupKeys.KEY_LOCK_WALLPAPER_SERVICE_NAME, null)
}
override fun setLockWallpaperServiceName(serviceName: String?) {
noBackupPrefs
.edit()
.putString(NoBackupKeys.KEY_LOCK_WALLPAPER_SERVICE_NAME, serviceName)
.apply()
}
override fun getLockWallpaperManagerId(): Int {
return noBackupPrefs.getInt(NoBackupKeys.KEY_LOCK_WALLPAPER_MANAGER_ID, 0)
}
override fun setLockWallpaperManagerId(lockWallpaperId: Int) {
noBackupPrefs
.edit()
.putInt(NoBackupKeys.KEY_LOCK_WALLPAPER_MANAGER_ID, lockWallpaperId)
.apply()
}
override fun getLockWallpaperRemoteId(): String? {
return noBackupPrefs.getString(NoBackupKeys.KEY_LOCK_WALLPAPER_REMOTE_ID, null)
}
override fun setLockWallpaperRemoteId(wallpaperRemoteId: String?) {
noBackupPrefs
.edit()
.putString(NoBackupKeys.KEY_LOCK_WALLPAPER_REMOTE_ID, wallpaperRemoteId)
.apply()
setFirstWallpaperApplyDateIfNeeded()
}
override fun getLockWallpaperRecentsKey(): String? {
return noBackupPrefs.getString(
NoBackupKeys.KEY_LOCK_WALLPAPER_RECENTS_KEY,
generateRecentsKey(getLockWallpaperRemoteId(), getLockWallpaperHashCode())
)
}
override fun setLockWallpaperRecentsKey(recentsKey: String?) {
noBackupPrefs
.edit()
.putString(NoBackupKeys.KEY_LOCK_WALLPAPER_RECENTS_KEY, recentsKey)
.apply()
}
override fun getLockWallpaperEffects(): String? {
return noBackupPrefs.getString(NoBackupKeys.KEY_LOCK_WALLPAPER_EFFECTS, null)
}
override fun setLockWallpaperEffects(wallpaperEffects: String?) {
noBackupPrefs
.edit()
.putString(NoBackupKeys.KEY_LOCK_WALLPAPER_EFFECTS, wallpaperEffects)
.apply()
}
override fun addDailyRotation(timestamp: Long) {
val jsonString = noBackupPrefs.getString(NoBackupKeys.KEY_DAILY_ROTATION_TIMESTAMPS, "[]")
try {
val jsonArray = JSONArray(jsonString)
jsonArray.put(timestamp)
noBackupPrefs
.edit()
.putString(NoBackupKeys.KEY_DAILY_ROTATION_TIMESTAMPS, jsonArray.toString())
.apply()
} catch (e: JSONException) {
Log.e(TAG, "Failed to add a daily rotation timestamp due to a JSON parse exception")
}
}
override fun getLastDailyRotationTimestamp(): Long {
val jsonString = noBackupPrefs.getString(NoBackupKeys.KEY_DAILY_ROTATION_TIMESTAMPS, "[]")
return try {
val jsonArray = JSONArray(jsonString)
if (jsonArray.length() == 0) {
-1
} else jsonArray.getLong(jsonArray.length() - 1)
} catch (e: JSONException) {
Log.e(TAG, "Failed to find a daily rotation timestamp due to a JSON parse exception")
-1
}
}
override fun getDailyWallpaperEnabledTimestamp(): Long {
return noBackupPrefs.getLong(NoBackupKeys.KEY_DAILY_WALLPAPER_ENABLED_TIMESTAMP, -1)
}
override fun setDailyWallpaperEnabledTimestamp(timestamp: Long) {
noBackupPrefs
.edit()
.putLong(NoBackupKeys.KEY_DAILY_WALLPAPER_ENABLED_TIMESTAMP, timestamp)
.apply()
}
override fun clearDailyRotations() {
noBackupPrefs
.edit()
.remove(NoBackupKeys.KEY_DAILY_ROTATION_TIMESTAMPS)
.remove(NoBackupKeys.KEY_DAILY_WALLPAPER_ENABLED_TIMESTAMP)
.apply()
}
override fun getLastDailyLogTimestamp(): Long {
return noBackupPrefs.getLong(NoBackupKeys.KEY_LAST_DAILY_LOG_TIMESTAMP, 0)
}
override fun setLastDailyLogTimestamp(timestamp: Long) {
noBackupPrefs.edit().putLong(NoBackupKeys.KEY_LAST_DAILY_LOG_TIMESTAMP, timestamp).apply()
}
override fun getLastAppActiveTimestamp(): Long {
return noBackupPrefs.getLong(NoBackupKeys.KEY_LAST_APP_ACTIVE_TIMESTAMP, 0)
}
override fun setLastAppActiveTimestamp(timestamp: Long) {
noBackupPrefs.edit().putLong(NoBackupKeys.KEY_LAST_APP_ACTIVE_TIMESTAMP, timestamp).apply()
}
override fun setDailyWallpaperRotationStatus(status: Int, timestamp: Long) {
noBackupPrefs
.edit()
.putInt(NoBackupKeys.KEY_LAST_ROTATION_STATUS, status)
.putLong(NoBackupKeys.KEY_LAST_ROTATION_STATUS_TIMESTAMP, timestamp)
.apply()
}
override fun setPendingWallpaperSetStatusSync(@PendingWallpaperSetStatus setStatus: Int) {
noBackupPrefs
.edit()
.putInt(NoBackupKeys.KEY_PENDING_WALLPAPER_SET_STATUS, setStatus)
.commit()
}
@PendingWallpaperSetStatus
override fun getPendingWallpaperSetStatus(): Int {
return noBackupPrefs.getInt(
NoBackupKeys.KEY_PENDING_WALLPAPER_SET_STATUS,
WallpaperPreferences.WALLPAPER_SET_NOT_PENDING
)
}
override fun setPendingWallpaperSetStatus(@PendingWallpaperSetStatus setStatus: Int) {
noBackupPrefs
.edit()
.putInt(NoBackupKeys.KEY_PENDING_WALLPAPER_SET_STATUS, setStatus)
.apply()
}
override fun setPendingDailyWallpaperUpdateStatusSync(
@PendingDailyWallpaperUpdateStatus updateStatus: Int
) {
noBackupPrefs
.edit()
.putInt(NoBackupKeys.KEY_PENDING_DAILY_WALLPAPER_UPDATE_STATUS, updateStatus)
.commit()
}
@PendingDailyWallpaperUpdateStatus
override fun getPendingDailyWallpaperUpdateStatus(): Int {
return noBackupPrefs.getInt(
NoBackupKeys.KEY_PENDING_DAILY_WALLPAPER_UPDATE_STATUS,
WallpaperPreferences.DAILY_WALLPAPER_UPDATE_NOT_PENDING
)
}
override fun setPendingDailyWallpaperUpdateStatus(
@PendingDailyWallpaperUpdateStatus updateStatus: Int
) {
noBackupPrefs
.edit()
.putInt(NoBackupKeys.KEY_PENDING_DAILY_WALLPAPER_UPDATE_STATUS, updateStatus)
.apply()
}
override fun getAppLaunchCount(): Int {
return noBackupPrefs.getInt(NoBackupKeys.KEY_APP_LAUNCH_COUNT, 0)
}
override fun getFirstLaunchDateSinceSetup(): Int {
return noBackupPrefs.getInt(NoBackupKeys.KEY_FIRST_LAUNCH_DATE_SINCE_SETUP, 0)
}
override fun incrementAppLaunched() {
if (getFirstLaunchDateSinceSetup() == 0) {
setFirstLaunchDateSinceSetup(getCurrentDate())
}
val appLaunchCount = getAppLaunchCount()
if (appLaunchCount < Int.MAX_VALUE) {
setAppLaunchCount(appLaunchCount + 1)
}
}
override fun getFirstWallpaperApplyDateSinceSetup(): Int {
return noBackupPrefs.getInt(NoBackupKeys.KEY_FIRST_WALLPAPER_APPLY_DATE_SINCE_SETUP, 0)
}
override fun storeWallpaperColors(
storedWallpaperId: String?,
wallpaperColors: WallpaperColors?
) {
if (storedWallpaperId == null || wallpaperColors == null) {
return
}
val primaryColor = wallpaperColors.primaryColor
var value = java.lang.String(primaryColor.toArgb().toString()) as String
val secondaryColor = wallpaperColors.secondaryColor
if (secondaryColor != null) {
value += "," + secondaryColor.toArgb()
}
val tertiaryColor = wallpaperColors.tertiaryColor
if (tertiaryColor != null) {
value += "," + tertiaryColor.toArgb()
}
noBackupPrefs
.edit()
.putString(NoBackupKeys.KEY_PREVIEW_WALLPAPER_COLOR_ID + storedWallpaperId, value)
.apply()
}
override fun getWallpaperColors(storedWallpaperId: String): WallpaperColors? {
val value =
noBackupPrefs.getString(
NoBackupKeys.KEY_PREVIEW_WALLPAPER_COLOR_ID + storedWallpaperId,
null
)
if (value == null || value.isEmpty()) {
return null
}
val colorStrings = value.split(",")
val colorPrimary = Color.valueOf(colorStrings[0].toInt())
var colorSecondary: Color? = null
if (colorStrings.size >= 2) {
colorSecondary = Color.valueOf(colorStrings[1].toInt())
}
var colorTerTiary: Color? = null
if (colorStrings.size >= 3) {
colorTerTiary = Color.valueOf(colorStrings[2].toInt())
}
return WallpaperColors(
colorPrimary,
colorSecondary,
colorTerTiary,
WallpaperColors.HINT_FROM_BITMAP
)
}
override fun updateDailyWallpaperSet(
@WallpaperPersister.Destination destination: Int,
collectionId: String?,
wallpaperId: String?,
) {
// Assign wallpaper info by destination.
when (destination) {
WallpaperPersister.DEST_HOME_SCREEN -> {
setHomeWallpaperCollectionId(collectionId!!)
setHomeWallpaperRemoteId(wallpaperId)
}
WallpaperPersister.DEST_LOCK_SCREEN -> {
setLockWallpaperCollectionId(collectionId!!)
setLockWallpaperRemoteId(wallpaperId!!)
}
WallpaperPersister.DEST_BOTH -> {
setHomeWallpaperCollectionId(collectionId!!)
setHomeWallpaperRemoteId(wallpaperId)
setLockWallpaperCollectionId(collectionId)
setLockWallpaperRemoteId(wallpaperId!!)
}
}
setHomeWallpaperEffects(null)
}
override fun storeLatestWallpaper(
@SetWallpaperFlags which: Int,
wallpaperId: String,
wallpaper: LiveWallpaperInfo,
colors: WallpaperColors,
) {}
override fun storeLatestWallpaper(
@SetWallpaperFlags which: Int,
wallpaperId: String,
wallpaper: WallpaperInfo,
croppedWallpaperBitmap: Bitmap,
colors: WallpaperColors,
) {}
override fun storeLatestWallpaper(
@SetWallpaperFlags which: Int,
wallpaperId: String,
attributions: List<String>?,
actionUrl: String?,
collectionId: String?,
croppedWallpaperBitmap: Bitmap,
colors: WallpaperColors,
) {}
override suspend fun addStaticWallpaperToRecentWallpapers(
destination: WallpaperDestination,
wallpaperModel: StaticWallpaperModel,
bitmap: Bitmap,
cropHints: Map<Point, Rect?>,
) {}
override suspend fun addLiveWallpaperToRecentWallpapers(
destination: WallpaperDestination,
wallpaperModel: LiveWallpaperModel
) {}
override fun setHasPreviewTooltipBeenShown(hasTooltipBeenShown: Boolean) {
sharedPrefs
.edit()
.putBoolean(
WallpaperPreferenceKeys.KEY_HAS_PREVIEW_TOOLTIP_BEEN_SHOWN,
hasTooltipBeenShown
)
.apply()
}
override fun getHasPreviewTooltipBeenShown(): Boolean {
return sharedPrefs.getBoolean(
WallpaperPreferenceKeys.KEY_HAS_PREVIEW_TOOLTIP_BEEN_SHOWN,
false
)
}
private fun setFirstLaunchDateSinceSetup(firstLaunchDate: Int) {
noBackupPrefs
.edit()
.putInt(NoBackupKeys.KEY_FIRST_LAUNCH_DATE_SINCE_SETUP, firstLaunchDate)
.apply()
}
private fun setAppLaunchCount(count: Int) {
noBackupPrefs.edit().putInt(NoBackupKeys.KEY_APP_LAUNCH_COUNT, count).apply()
}
private fun setFirstWallpaperApplyDateSinceSetup(firstApplyDate: Int) {
noBackupPrefs
.edit()
.putInt(NoBackupKeys.KEY_FIRST_WALLPAPER_APPLY_DATE_SINCE_SETUP, firstApplyDate)
.apply()
}
private fun setFirstWallpaperApplyDateIfNeeded() {
if (getFirstWallpaperApplyDateSinceSetup() == 0) {
setFirstWallpaperApplyDateSinceSetup(getCurrentDate())
}
}
private fun getCurrentDate(): Int {
val calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC"))
val format = SimpleDateFormat("yyyyMMdd", Locale.US)
return format.format(calendar.time).toInt()
}
companion object {
const val PREFS_NAME = "wallpaper"
const val NO_BACKUP_PREFS_NAME = "wallpaper-nobackup"
const val KEY_VALUE_DIVIDER = "="
private const val TAG = "DefaultWallpaperPreferences"
}
}