| /* |
| * 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.settings.backup; |
| |
| |
| import android.app.backup.BackupManager; |
| import android.app.backup.IBackupManager; |
| import android.content.Context; |
| import android.content.Intent; |
| import android.os.RemoteException; |
| import android.os.ServiceManager; |
| import android.os.UserHandle; |
| import android.text.TextUtils; |
| import android.util.Log; |
| |
| import androidx.annotation.VisibleForTesting; |
| |
| import com.android.settings.R; |
| import com.android.settings.Settings.PrivacySettingsActivity; |
| |
| import java.net.URISyntaxException; |
| |
| /** |
| * Helper class for {@link UserBackupSettingsActivity} that interacts with {@link IBackupManager}. |
| */ |
| public class BackupSettingsHelper { |
| private static final String TAG = "BackupSettingsHelper"; |
| |
| private IBackupManager mBackupManager = IBackupManager.Stub.asInterface( |
| ServiceManager.getService(Context.BACKUP_SERVICE)); |
| |
| private Context mContext; |
| |
| public BackupSettingsHelper(Context context) { |
| mContext = context; |
| } |
| |
| /** |
| * Returns an intent to launch backup settings from backup transport if the intent was provided |
| * by the transport. Otherwise returns the intent to launch the default backup settings screen. |
| * |
| * @return Intent for launching backup settings |
| */ |
| public Intent getIntentForBackupSettings() { |
| Intent intent; |
| if (isIntentProvidedByTransport()) { |
| intent = getIntentForBackupSettingsFromTransport(); |
| } else { |
| Log.e(TAG, "Backup transport has not provided an intent" |
| + " or the component for the intent is not found!"); |
| intent = getIntentForDefaultBackupSettings(); |
| } |
| return intent; |
| } |
| |
| /** |
| * Returns a label for the settings item that will point to the backup settings provided by |
| * the transport. If no label was provided by transport, returns the default string. |
| * |
| * @return Label for the backup settings item. |
| */ |
| public CharSequence getLabelForBackupSettings() { |
| CharSequence label = getLabelFromBackupTransport(); |
| if (TextUtils.isEmpty(label)) { |
| label = mContext.getString(R.string.privacy_settings_title); |
| } |
| return label; |
| } |
| |
| /** |
| * Returns a summary string for the settings item that will point to the backup settings |
| * provided by the transport. If no summary was provided by transport, returns the default |
| * string. |
| * |
| * @return Summary for the backup settings item. |
| */ |
| public String getSummaryForBackupSettings() { |
| String summary = getSummaryFromBackupTransport(); |
| if (summary == null) { |
| summary = mContext.getString(R.string.backup_configure_account_default_summary); |
| } |
| return summary; |
| } |
| |
| |
| /** |
| * Checks if the manufacturer provided an intent to launch its backup settings screen |
| * in the config file. |
| */ |
| public boolean isBackupProvidedByManufacturer() { |
| if (Log.isLoggable(TAG, Log.DEBUG)) { |
| Log.d(TAG, "Checking if intent provided by manufacturer"); |
| } |
| String intentString = |
| mContext.getResources().getString(R.string.config_backup_settings_intent); |
| |
| return intentString != null && !intentString.isEmpty(); |
| } |
| |
| /** |
| * Returns the label for the backup settings item provided by the manufacturer. |
| */ |
| public String getLabelProvidedByManufacturer() { |
| return mContext.getResources().getString(R.string.config_backup_settings_label); |
| } |
| |
| /** |
| * Returns the intent to the backup settings screen provided by the manufacturer. |
| */ |
| public Intent getIntentProvidedByManufacturer() { |
| if (Log.isLoggable(TAG, Log.DEBUG)) { |
| Log.d(TAG, "Getting a backup settings intent provided by manufacturer"); |
| } |
| String intentString = |
| mContext.getResources().getString(R.string.config_backup_settings_intent); |
| if (intentString != null && !intentString.isEmpty()) { |
| try { |
| return Intent.parseUri(intentString, 0); |
| } catch (URISyntaxException e) { |
| Log.e(TAG, "Invalid intent provided by the manufacturer.", e); |
| } |
| } |
| return null; |
| } |
| |
| /** |
| * Gets the intent from Backup transport and adds the extra depending on whether the user has |
| * rights to see backup settings. |
| * |
| * @return Intent to launch Backup settings provided by the Backup transport. |
| */ |
| @VisibleForTesting |
| Intent getIntentForBackupSettingsFromTransport() { |
| Intent intent = getIntentFromBackupTransport(); |
| if (intent != null) { |
| intent.putExtra(BackupManager.EXTRA_BACKUP_SERVICES_AVAILABLE, isBackupServiceActive()); |
| } |
| return intent; |
| } |
| |
| private Intent getIntentForDefaultBackupSettings() { |
| return new Intent(mContext, PrivacySettingsActivity.class); |
| } |
| |
| /** |
| * Checks if the transport provided the intent to launch the backup settings and if that |
| * intent resolves to an activity. |
| */ |
| @VisibleForTesting |
| boolean isIntentProvidedByTransport() { |
| Intent intent = getIntentFromBackupTransport(); |
| return intent != null && intent.resolveActivity(mContext.getPackageManager()) != null; |
| } |
| |
| /** |
| * Gets an intent to launch the backup settings from the current transport using |
| * {@link com.android.internal.backup.IBackupTransport#dataManagementIntent()} API. |
| * |
| * @return intent provided by transport or null if no intent was provided. |
| */ |
| private Intent getIntentFromBackupTransport() { |
| try { |
| Intent intent = |
| mBackupManager.getDataManagementIntent(mBackupManager.getCurrentTransport()); |
| if (Log.isLoggable(TAG, Log.DEBUG)) { |
| if (intent != null) { |
| Log.d(TAG, "Parsed intent from backup transport: " + intent.toString()); |
| } else { |
| Log.d(TAG, "Received a null intent from backup transport"); |
| } |
| } |
| return intent; |
| } catch (RemoteException e) { |
| Log.e(TAG, "Error getting data management intent", e); |
| } |
| return null; |
| } |
| |
| /** Checks if backup service is enabled for this user. */ |
| public boolean isBackupServiceActive() { |
| boolean backupOkay; |
| try { |
| backupOkay = mBackupManager.isBackupServiceActive(UserHandle.myUserId()); |
| } catch (Exception e) { |
| // things go wrong talking to the backup system => ignore and |
| // pass the default 'false' as the "backup is a thing?" state. |
| backupOkay = false; |
| } |
| return backupOkay; |
| } |
| |
| @VisibleForTesting |
| CharSequence getLabelFromBackupTransport() { |
| try { |
| CharSequence label = |
| mBackupManager.getDataManagementLabelForUser( |
| UserHandle.myUserId(), mBackupManager.getCurrentTransport()); |
| if (Log.isLoggable(TAG, Log.DEBUG)) { |
| Log.d(TAG, "Received the backup settings label from backup transport: " + label); |
| } |
| return label; |
| } catch (RemoteException e) { |
| Log.e(TAG, "Error getting data management label", e); |
| } |
| return null; |
| } |
| |
| @VisibleForTesting |
| String getSummaryFromBackupTransport() { |
| try { |
| String summary = |
| mBackupManager.getDestinationString(mBackupManager.getCurrentTransport()); |
| if (Log.isLoggable(TAG, Log.DEBUG)) { |
| Log.d(TAG, |
| "Received the backup settings summary from backup transport: " + summary); |
| } |
| return summary; |
| } catch (RemoteException e) { |
| Log.e(TAG, "Error getting data management summary", e); |
| } |
| return null; |
| } |
| } |