126bf003df92b05fafd4e015680a22611724aa25bDoris Ling/*
226bf003df92b05fafd4e015680a22611724aa25bDoris Ling * Copyright (C) 2016 The Android Open Source Project
326bf003df92b05fafd4e015680a22611724aa25bDoris Ling *
426bf003df92b05fafd4e015680a22611724aa25bDoris Ling * Licensed under the Apache License, Version 2.0 (the "License");
526bf003df92b05fafd4e015680a22611724aa25bDoris Ling * you may not use this file except in compliance with the License.
626bf003df92b05fafd4e015680a22611724aa25bDoris Ling * You may obtain a copy of the License at
726bf003df92b05fafd4e015680a22611724aa25bDoris Ling *
826bf003df92b05fafd4e015680a22611724aa25bDoris Ling *     http://www.apache.org/licenses/LICENSE-2.0
926bf003df92b05fafd4e015680a22611724aa25bDoris Ling *
1026bf003df92b05fafd4e015680a22611724aa25bDoris Ling * Unless required by applicable law or agreed to in writing, software
1126bf003df92b05fafd4e015680a22611724aa25bDoris Ling * distributed under the License is distributed on an "AS IS" BASIS,
1226bf003df92b05fafd4e015680a22611724aa25bDoris Ling * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1326bf003df92b05fafd4e015680a22611724aa25bDoris Ling * See the License for the specific language governing permissions and
1426bf003df92b05fafd4e015680a22611724aa25bDoris Ling * limitations under the License.
1526bf003df92b05fafd4e015680a22611724aa25bDoris Ling */
1626bf003df92b05fafd4e015680a22611724aa25bDoris Ling
1726bf003df92b05fafd4e015680a22611724aa25bDoris Lingpackage com.android.settings;
1826bf003df92b05fafd4e015680a22611724aa25bDoris Ling
1926bf003df92b05fafd4e015680a22611724aa25bDoris Lingimport android.app.Activity;
20ee564e9cfc58aa2ed59b29e2a8eda941e4fb4818Christopher Tateimport android.app.backup.BackupManager;
21ee564e9cfc58aa2ed59b29e2a8eda941e4fb4818Christopher Tateimport android.app.backup.IBackupManager;
22ee564e9cfc58aa2ed59b29e2a8eda941e4fb4818Christopher Tateimport android.content.Context;
2326bf003df92b05fafd4e015680a22611724aa25bDoris Lingimport android.content.Intent;
2426bf003df92b05fafd4e015680a22611724aa25bDoris Lingimport android.os.Bundle;
25ee564e9cfc58aa2ed59b29e2a8eda941e4fb4818Christopher Tateimport android.os.ServiceManager;
26ee564e9cfc58aa2ed59b29e2a8eda941e4fb4818Christopher Tateimport android.os.UserHandle;
2726bf003df92b05fafd4e015680a22611724aa25bDoris Lingimport android.text.TextUtils;
2826bf003df92b05fafd4e015680a22611724aa25bDoris Lingimport android.util.Log;
2926bf003df92b05fafd4e015680a22611724aa25bDoris Ling
3026bf003df92b05fafd4e015680a22611724aa25bDoris Lingimport com.android.settings.R;
3126bf003df92b05fafd4e015680a22611724aa25bDoris Ling
3226bf003df92b05fafd4e015680a22611724aa25bDoris Lingimport java.net.URISyntaxException;
3326bf003df92b05fafd4e015680a22611724aa25bDoris Ling
3426bf003df92b05fafd4e015680a22611724aa25bDoris Ling/**
3526bf003df92b05fafd4e015680a22611724aa25bDoris Ling * A trampoline activity used to launch the configured Backup activity.
3626bf003df92b05fafd4e015680a22611724aa25bDoris Ling * This activity used the theme NoDisplay to minimize the flicker that might be seen for the launch-
3726bf003df92b05fafd4e015680a22611724aa25bDoris Ling * finsih transition.
3826bf003df92b05fafd4e015680a22611724aa25bDoris Ling */
3926bf003df92b05fafd4e015680a22611724aa25bDoris Lingpublic class BackupSettingsActivity extends Activity {
4026bf003df92b05fafd4e015680a22611724aa25bDoris Ling    private static final String TAG = "BackupSettingsActivity";
4126bf003df92b05fafd4e015680a22611724aa25bDoris Ling
4226bf003df92b05fafd4e015680a22611724aa25bDoris Ling    @Override
4326bf003df92b05fafd4e015680a22611724aa25bDoris Ling    public void onCreate(Bundle savedInstanceState) {
4426bf003df92b05fafd4e015680a22611724aa25bDoris Ling        super.onCreate(savedInstanceState);
4526bf003df92b05fafd4e015680a22611724aa25bDoris Ling        String backup = getResources().getString(R.string.config_backup_settings_intent);
4626bf003df92b05fafd4e015680a22611724aa25bDoris Ling        if (!TextUtils.isEmpty(backup)) {
4726bf003df92b05fafd4e015680a22611724aa25bDoris Ling            try {
4826bf003df92b05fafd4e015680a22611724aa25bDoris Ling                Intent intent = Intent.parseUri(backup, 0);
4926bf003df92b05fafd4e015680a22611724aa25bDoris Ling                if (intent.resolveActivity(getPackageManager()) != null) {
5026bf003df92b05fafd4e015680a22611724aa25bDoris Ling                    // use startActivityForResult to let the activity check the caller signature
51ee564e9cfc58aa2ed59b29e2a8eda941e4fb4818Christopher Tate                    IBackupManager bmgr = IBackupManager.Stub.asInterface(
52ee564e9cfc58aa2ed59b29e2a8eda941e4fb4818Christopher Tate                            ServiceManager.getService(Context.BACKUP_SERVICE));
53ee564e9cfc58aa2ed59b29e2a8eda941e4fb4818Christopher Tate                    boolean backupOkay;
54ee564e9cfc58aa2ed59b29e2a8eda941e4fb4818Christopher Tate                    try {
55ee564e9cfc58aa2ed59b29e2a8eda941e4fb4818Christopher Tate                        backupOkay = bmgr.isBackupServiceActive(UserHandle.myUserId());
56ee564e9cfc58aa2ed59b29e2a8eda941e4fb4818Christopher Tate                    } catch (Exception e) {
57ee564e9cfc58aa2ed59b29e2a8eda941e4fb4818Christopher Tate                        // things go wrong talking to the backup system => ignore and
58ee564e9cfc58aa2ed59b29e2a8eda941e4fb4818Christopher Tate                        // pass the default 'false' as the "backup is a thing?" state.
59ee564e9cfc58aa2ed59b29e2a8eda941e4fb4818Christopher Tate                        backupOkay = false;
60ee564e9cfc58aa2ed59b29e2a8eda941e4fb4818Christopher Tate                    }
61ee564e9cfc58aa2ed59b29e2a8eda941e4fb4818Christopher Tate                    intent.putExtra(BackupManager.EXTRA_BACKUP_SERVICES_AVAILABLE, backupOkay);
6226bf003df92b05fafd4e015680a22611724aa25bDoris Ling                    startActivityForResult(intent, -1);
6326bf003df92b05fafd4e015680a22611724aa25bDoris Ling                } else {
6426bf003df92b05fafd4e015680a22611724aa25bDoris Ling                    Log.e(TAG, "Backup component not found!");
6526bf003df92b05fafd4e015680a22611724aa25bDoris Ling                }
6626bf003df92b05fafd4e015680a22611724aa25bDoris Ling            } catch (URISyntaxException e) {
6726bf003df92b05fafd4e015680a22611724aa25bDoris Ling                Log.e(TAG, "Invalid backup component URI!", e);
6826bf003df92b05fafd4e015680a22611724aa25bDoris Ling            }
6926bf003df92b05fafd4e015680a22611724aa25bDoris Ling        }
7026bf003df92b05fafd4e015680a22611724aa25bDoris Ling        finish();
7126bf003df92b05fafd4e015680a22611724aa25bDoris Ling    }
7226bf003df92b05fafd4e015680a22611724aa25bDoris Ling}