| /* |
| * 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.settings.system |
| |
| import android.content.Context |
| import android.os.Build |
| import android.os.SystemUpdateManager |
| import android.os.UserManager |
| import android.util.Log |
| import androidx.lifecycle.Lifecycle |
| import androidx.lifecycle.LifecycleOwner |
| import androidx.lifecycle.lifecycleScope |
| import androidx.lifecycle.repeatOnLifecycle |
| import androidx.preference.Preference |
| import androidx.preference.PreferenceScreen |
| import com.android.settings.R |
| import com.android.settings.core.BasePreferenceController |
| import com.android.settingslib.spaprivileged.framework.common.userManager |
| import kotlinx.coroutines.launch |
| |
| open class SystemUpdatePreferenceController(context: Context, preferenceKey: String) : |
| BasePreferenceController(context, preferenceKey) { |
| private val userManager: UserManager = context.userManager |
| private val systemUpdateRepository = SystemUpdateRepository(context) |
| private val clientInitiatedActionRepository = ClientInitiatedActionRepository(context) |
| private lateinit var preference: Preference |
| |
| override fun getAvailabilityStatus() = |
| if (mContext.resources.getBoolean(R.bool.config_show_system_update_settings) && |
| userManager.isAdminUser |
| ) AVAILABLE else UNSUPPORTED_ON_DEVICE |
| |
| override fun displayPreference(screen: PreferenceScreen) { |
| super.displayPreference(screen) |
| preference = screen.findPreference(preferenceKey)!! |
| if (isAvailable) { |
| val intent = systemUpdateRepository.getSystemUpdateIntent() |
| if (intent != null) { // Replace the intent with this specific activity |
| preference.intent = intent |
| } else { // Did not find a matching activity, so remove the preference |
| screen.removePreference(preference) |
| } |
| } |
| } |
| |
| override fun handlePreferenceTreeClick(preference: Preference): Boolean { |
| if (preferenceKey == preference.key) { |
| clientInitiatedActionRepository.onSystemUpdate() |
| } |
| // always return false here because this handler does not want to block other handlers. |
| return false |
| } |
| |
| override fun onViewCreated(viewLifecycleOwner: LifecycleOwner) { |
| viewLifecycleOwner.lifecycleScope.launch { |
| viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) { |
| preference.summary = calculateSummary() |
| } |
| } |
| } |
| |
| private suspend fun calculateSummary(): String { |
| val updateInfo = mContext.getSystemUpdateInfo() ?: return getReleaseVersionSummary() |
| |
| val status = updateInfo.getInt(SystemUpdateManager.KEY_STATUS) |
| if (status == SystemUpdateManager.STATUS_UNKNOWN) { |
| Log.d(TAG, "Update statue unknown") |
| } |
| when (status) { |
| SystemUpdateManager.STATUS_WAITING_DOWNLOAD, |
| SystemUpdateManager.STATUS_IN_PROGRESS, |
| SystemUpdateManager.STATUS_WAITING_INSTALL, |
| SystemUpdateManager.STATUS_WAITING_REBOOT -> { |
| return mContext.getString(R.string.android_version_pending_update_summary) |
| } |
| |
| SystemUpdateManager.STATUS_IDLE, |
| SystemUpdateManager.STATUS_UNKNOWN -> { |
| val version = updateInfo.getString(SystemUpdateManager.KEY_TITLE) |
| if (!version.isNullOrEmpty()) { |
| return mContext.getString(R.string.android_version_summary, version) |
| } |
| } |
| } |
| return getReleaseVersionSummary() |
| } |
| |
| private fun getReleaseVersionSummary(): String = mContext.getString( |
| R.string.android_version_summary, |
| Build.VERSION.RELEASE_OR_PREVIEW_DISPLAY, |
| ) |
| |
| companion object { |
| private const val TAG = "SysUpdatePrefContr" |
| } |
| } |