com.rareventure.gps2.reviewer.wizard.WelcomePage.java Source code

Java tutorial

Introduction

Here is the source code for com.rareventure.gps2.reviewer.wizard.WelcomePage.java

Source

/** 
Copyright 2015 Tim Engler, Rareventure LLC
    
This file is part of Tiny Travel Tracker.
    
Tiny Travel Tracker is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
    
Tiny Travel Tracker 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 General Public License for more details.
    
You should have received a copy of the GNU General Public License
along with Tiny Travel Tracker.  If not, see <http://www.gnu.org/licenses/>.
    
*/
package com.rareventure.gps2.reviewer.wizard;

import java.io.File;
import java.util.Map;

import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;
import android.view.View;

import com.rareventure.android.GpsReader;
import com.rareventure.android.ProgressDialogActivity;
import com.rareventure.android.SimpleEula;
import com.rareventure.android.SimpleEula.EulaListener;
import com.rareventure.gps2.GTG;
import com.rareventure.gps2.GpsTrailerService;
import com.rareventure.gps2.ITrialService;
import com.rareventure.gps2.R;
import com.rareventure.gps2.bootup.GpsTrailerReceiver;

public class WelcomePage extends ProgressDialogActivity implements EulaListener {
    private boolean eulaAgreedTo;

    private boolean isMoveTrialRunning;

    private SimpleEula eulaDialog;

    public WelcomePage() {
    }

    @Override
    public void doOnCreate(Bundle savedInstanceState) {
        super.doOnCreate(savedInstanceState);
        setContentView(R.layout.wizard_welcome);
    }

    @Override
    public void doOnResume() {
        super.doOnResume();

        startWelcomePage(false);
    }

    @Override
    public void doOnPause(boolean doOnResumeCalled) {
        super.doOnPause(doOnResumeCalled);

        if (eulaDialog != null)
            eulaDialog.dismiss();
    }

    private void startWelcomePage(boolean triedMovingTrialData) {
        //prevents the initial setup screens from showing when the system is already set up
        if (GTG.prefs.initialSetupCompleted) {
            finish();
            return;
        }

        //check if we are premium and the trial version is installed. In this case we 
        //just copy it's data and prefs over to us
        if (GTG.IS_PREMIUM == -42) {
            if (GTG.getGTGAppStart(this, GTG.TRIAL_APPLICATION_PACKAGE) != null && !triedMovingTrialData) {
                WTask wTask = new WTask() {

                    @Override
                    public void cancel() {

                    }
                };

                super.openDialogForWTask(wTask, false, true, R.string.dialog_long_task_title,
                        R.string.moving_trial_data_to_premium_long_task);

                //move the trial data into the premium package
                moveTrialDataToPremiumDir(wTask);
                return;
            }
        }

        if (!eulaAgreedTo)
            (eulaDialog = new SimpleEula(this, this, getString(R.string.eula))).show();
    }

    public void onPrev(View view) {
        exitFromApp();
        eulaAgreedTo = false;
    }

    @Override
    public void onBackPressed() {
        eulaAgreedTo = false;
        super.onBackPressed();
    }

    public void onNext(View view) {
        //if we are moving the trial to premium, this will handle
        //moving the app forward and back. Otherwise bad things can
        //occur if this was pressed at the wrong time
        //      E/ACRA    (23459): java.lang.IllegalStateException: Could not execute method of the activity
        //      E/ACRA    (23459):      at android.view.View$1.onClick(View.java:3591)
        //      E/ACRA    (23459):      at android.view.View.performClick(View.java:4084)
        //      E/ACRA    (23459):      at android.view.View$PerformClick.run(View.java:16966)
        //      E/ACRA    (23459):      at android.os.Handler.handleCallback(Handler.java:615)
        //      E/ACRA    (23459):      at android.os.Handler.dispatchMessage(Handler.java:92)
        //      E/ACRA    (23459):      at android.os.Looper.loop(Looper.java:137)
        //      E/ACRA    (23459):      at android.app.ActivityThread.main(ActivityThread.java:4745)
        //      E/ACRA    (23459):      at java.lang.reflect.Method.invokeNative(Native Method)
        //      E/ACRA    (23459):      at java.lang.reflect.Method.invoke(Method.java:511)
        //      E/ACRA    (23459):      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
        //      E/ACRA    (23459):      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
        //      E/ACRA    (23459):      at dalvik.system.NativeStart.main(Native Method)
        //      E/ACRA    (23459): Caused by: java.lang.reflect.InvocationTargetException
        //      E/ACRA    (23459):      at java.lang.reflect.Method.invokeNative(Native Method)
        //      E/ACRA    (23459):      at java.lang.reflect.Method.invoke(Method.java:511)
        //      E/ACRA    (23459):      at android.view.View$1.onClick(View.java:3586)
        //      E/ACRA    (23459):      ... 11 more
        //      E/ACRA    (23459): Caused by: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
        //      E/ACRA    (23459):      at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1299)
        //      E/ACRA    (23459):      at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1310)
        //      E/ACRA    (23459):      at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:541)
        //      E/ACRA    (23459):      at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:525)
        //      E/ACRA    (23459):      at android.support.v4.app.DialogFragment.show(DialogFragment.java:123)
        //      E/ACRA    (23459):      at com.rareventure.android.ProgressDialogActivity.showDialog(ProgressDialogActivity.java:47)
        //      E/ACRA    (23459):      at com.rareventure.android.ProgressDialogActivity.runLongTask(ProgressDialogActivity.java:55)
        //      E/ACRA    (23459):      at com.rareventure.gps2.reviewer.wizard.WelcomePage.onNext(WelcomePage.java:94)
        //      E/ACRA    (23459):      ... 14 more
        if (isMoveTrialRunning)
            return;

        startInternalActivity(new Intent(WelcomePage.this, ShouldHavePasswordPage.class));
    }

    @Override
    public void onEulaDecision(boolean thumbsUp) {
        if (!thumbsUp)
            this.exitFromApp(); //exit setup
        else
            eulaAgreedTo = true;
    }

    @Override
    public int getRequirements() {
        return GTG.REQUIREMENTS_WIZARD;
    }

    public void moveTrialDataToPremiumDir(final WTask wTask) {
        isMoveTrialRunning = true;
        Intent i = new Intent(ITrialService.class.getName()).setPackage(GTG.TRIAL_APPLICATION_PACKAGE);

        boolean boundSuccessfully = true;

        ServiceConnection serviceConnection = null;

        try {

            if (!bindService(i, serviceConnection = new ServiceConnection() {

                private boolean serviceAlreadyConnected;

                @Override
                public void onServiceDisconnected(ComponentName name) {
                }

                @Override
                public void onServiceConnected(ComponentName name, IBinder service) {
                    try {
                        Log.d(GTG.TAG, "welcome page: service connected");
                        if (serviceAlreadyConnected)
                            return;
                        serviceAlreadyConnected = true;
                        ITrialService mService = ITrialService.Stub.asInterface(service);
                        Map<String, Object> prefsMap = mService.giveMePreferences();
                        String trialDirString = mService.getExtFileDir();

                        Log.d(GTG.TAG, "welcome page: got ext file dir");
                        // we don't worry about synchronization here, because we only do this during
                        // initial setup
                        GTG.prefSet.loadAndroidPreferencesFromMap(WelcomePage.this, prefsMap);

                        GTG.prefSet.saveSharedPrefs(WelcomePage.this);

                        mService.notifyReplaced();

                        //shutdown the trial app commpletely before we start moving the files
                        try {
                            mService.shutdown();
                        } catch (Exception e) {
                            //an exception is thrown because it kills the process
                            Log.i(GTG.TAG, "Trial shutdown");
                        }

                        File trialDir = new File(trialDirString);

                        File myFileDir = GTG.getExternalStorageDirectory();

                        for (File subFile : trialDir.listFiles()) {
                            //we don't freak out on failure here. Hopefully gps.db3 will be moved at least.
                            //if not, a new db will be created with no points
                            if (!subFile.renameTo(new File(myFileDir + "/" + subFile.getName())))
                                Log.e(GTG.TAG, "Couldn't move file " + subFile + " to " + myFileDir);
                        }
                    } catch (Exception e) {
                        Log.e(GTG.TAG, "Error trying to move trial data", e);
                    }

                    wTask.notifyFinish();
                    //restart startReviewer now that we may have trial data
                    runOnUiThread(new Runnable() {
                        public void run() {
                            startWelcomePage(true);
                        }
                    });
                    unbindService(this);

                    //we restart the trial app, so that it will shut off the notification frog. Since we kill it before we
                    //moved the files away, it didn't have time to shut it off itself.
                    Intent i = new Intent(GpsTrailerReceiver.class.getName())
                            .setPackage(GTG.TRIAL_APPLICATION_PACKAGE);

                    Log.d(GTG.TAG, "Sending broadcast to " + i + ", name " + GpsTrailerReceiver.class.getName());
                    sendBroadcast(i);
                }
            }, Context.BIND_AUTO_CREATE))
                boundSuccessfully = false;
        } catch (Exception e) {
            Log.e(GTG.TAG, "Exception trying to bind service", e);
            boundSuccessfully = false;
        } finally {
        }

        if (!boundSuccessfully) {
            Log.d(GTG.TAG, "welcome page: could not bind service");
            wTask.notifyFinish();
            isMoveTrialRunning = false;
            startWelcomePage(true);

            //even if we don't bind the service, we still have to unbind or android complains about a leaked service connection
            if (serviceConnection != null)
                unbindService(serviceConnection);
        }
    }

}