fr.unix_experience.owncloud_sms.activities.remote_account.RestoreMessagesActivity.java Source code

Java tutorial

Introduction

Here is the source code for fr.unix_experience.owncloud_sms.activities.remote_account.RestoreMessagesActivity.java

Source

package fr.unix_experience.owncloud_sms.activities.remote_account;

/*
 *  Copyright (c) 2014-2016, Loic Blot <loic.blot@unix-experience.fr>
 *
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU Affero General Public License as
 *  published by the Free Software Foundation, either version 3 of the
 *  License, or (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU Affero General Public License for more details.
 *
 *  You should have received a copy of the GNU Affero General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

import android.Manifest;
import android.accounts.Account;
import android.accounts.AccountManager;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.provider.Telephony;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;

import fr.unix_experience.owncloud_sms.R;
import fr.unix_experience.owncloud_sms.engine.ASyncSMSRecovery;
import fr.unix_experience.owncloud_sms.engine.ConnectivityMonitor;

public class RestoreMessagesActivity extends AppCompatActivity {

    Account _account = null;
    String _defaultSmsApp;
    private static final int REQUEST_DEFAULT_SMSAPP = 1;
    boolean restoreInProgress = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_restore_messages);

        assert getIntent().getExtras() != null;

        String accountName = getIntent().getExtras().getString("account");

        // accountName cannot be null, devel error
        assert accountName != null;
        AccountManager accountManager = AccountManager.get(getBaseContext());
        Account[] accountList = accountManager.getAccountsByType(getString(R.string.account_type));
        for (Account element : accountList) {
            if (element.name.equals(accountName)) {
                _account = element;
            }
        }

        if (_account == null) {
            throw new IllegalStateException(getString(R.string.err_didnt_find_account_restore));
        }

        initInterface();
        Button fix_button = (Button) findViewById(R.id.button_fix_permissions);
        final Button launch_restore = (Button) findViewById(R.id.button_launch_restore);
        final ProgressBar pb = (ProgressBar) findViewById(R.id.progressbar_restore);

        final RestoreMessagesActivity me = this;
        fix_button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.KITKAT) {
                    notifyIncompatibleVersion();
                    return;
                }

                if (!new ConnectivityMonitor(me).isValid()) {
                    notifyNoConnectivity();
                    return;
                }

                Log.i(RestoreMessagesActivity.TAG, "Ask to change the default SMS app");

                Intent intent = new Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT);
                intent.putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME, getBaseContext().getPackageName());
                startActivityForResult(intent, REQUEST_DEFAULT_SMSAPP);
            }
        });

        launch_restore.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                if (!new ConnectivityMonitor(me).isValid()) {
                    notifyNoConnectivity();
                    return;
                }

                launch_restore.setVisibility(View.INVISIBLE);
                pb.setVisibility(View.VISIBLE);

                // Verify connectivity
                Log.i(RestoreMessagesActivity.TAG, "Launching restore asynchronously");
                restoreInProgress = true;
                new ASyncSMSRecovery.SMSRecoveryTask(me, _account).execute();
            }
        });
    }

    private void initInterface() {
        TextView tv_error = (TextView) findViewById(R.id.tv_error_default_smsapp);
        tv_error.setText(R.string.error_make_default_sms_app);
        findViewById(R.id.tv_restore_finished).setVisibility(View.INVISIBLE);
        findViewById(R.id.tv_progress_value).setVisibility(View.INVISIBLE);
        Button fix_button = (Button) findViewById(R.id.button_fix_permissions);
        Button launch_restore = (Button) findViewById(R.id.button_launch_restore);
        ProgressBar pb = (ProgressBar) findViewById(R.id.progressbar_restore);
        pb.setVisibility(View.INVISIBLE);

        if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.KITKAT) {
            notifyIncompatibleVersion();
            return;
        }

        _defaultSmsApp = Telephony.Sms.getDefaultSmsPackage(this);
        if (!Telephony.Sms.getDefaultSmsPackage(this).equals(getPackageName())) {
            _defaultSmsApp = Telephony.Sms.getDefaultSmsPackage(getBaseContext());
            tv_error.setVisibility(View.VISIBLE);
            fix_button.setVisibility(View.VISIBLE);
            launch_restore.setVisibility(View.INVISIBLE);
        } else {
            tv_error.setVisibility(View.INVISIBLE);
            fix_button.setVisibility(View.INVISIBLE);
            launch_restore.setVisibility(View.VISIBLE);
        }
    }

    private void errorNotification(int err) {
        TextView tv = (TextView) findViewById(R.id.tv_error_default_smsapp);
        Button fix_button = (Button) findViewById(R.id.button_fix_permissions);
        Button launch_restore = (Button) findViewById(R.id.button_launch_restore);
        ProgressBar pb = (ProgressBar) findViewById(R.id.progressbar_restore);
        tv.setText(err);
        tv.setVisibility(View.VISIBLE);
        fix_button.setVisibility(View.INVISIBLE);
        launch_restore.setVisibility(View.INVISIBLE);
        pb.setVisibility(View.INVISIBLE);
    }

    private void notifyIncompatibleVersion() {
        errorNotification(R.string.err_kitkat_required);
    }

    private void notifyNoConnectivity() {
        errorNotification(R.string.err_no_connection);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode) {
        case RestoreMessagesActivity.REQUEST_DEFAULT_SMSAPP:
            if (resultCode == Activity.RESULT_OK) {
                TextView tv = (TextView) findViewById(R.id.tv_error_default_smsapp);
                Button fix_button = (Button) findViewById(R.id.button_fix_permissions);
                Button launch_restore = (Button) findViewById(R.id.button_launch_restore);
                tv.setVisibility(View.INVISIBLE);
                fix_button.setVisibility(View.INVISIBLE);
                launch_restore.setVisibility(View.VISIBLE);
            }
            break;
        default:
            break;
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        if (!new ConnectivityMonitor(this).isValid()) {
            notifyNoConnectivity();
            return;
        }

        if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.KITKAT) {
            notifyIncompatibleVersion();
            return;
        }

        if (!restoreInProgress) {
            initInterface();
        }
    }

    public void onRestoreDone() {
        findViewById(R.id.progressbar_restore).setVisibility(View.INVISIBLE);
        findViewById(R.id.tv_restore_finished).setVisibility(View.VISIBLE);

        Intent finalIntent = new Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT);
        finalIntent.putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME, _defaultSmsApp);
        startActivity(finalIntent);

        restoreInProgress = false;
    }

    public void onProgressUpdate(Integer value) {
        TextView tv_progress = (TextView) findViewById(R.id.tv_progress_value);
        if (tv_progress.getVisibility() == View.INVISIBLE) {
            tv_progress.setVisibility(View.VISIBLE);
        }

        tv_progress.setText(value.toString() + " " + getString(R.string.x_messages_restored));
    }

    private static final String TAG = RestoreMessagesActivity.class.getSimpleName();
}