com.google.android.apps.mytracks.ImportActivity.java Source code

Java tutorial

Introduction

Here is the source code for com.google.android.apps.mytracks.ImportActivity.java

Source

/*
 * Copyright 2011 Google Inc.
 *
 * 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.google.android.apps.mytracks;

import com.google.analytics.tracking.android.EasyTracker;
import com.google.android.apps.mytracks.util.DialogUtils;
import com.google.android.apps.mytracks.util.FileUtils;
import com.google.android.apps.mytracks.util.IntentUtils;
import com.nogago.bb10.tracks.R;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.OpenableColumns;
import android.support.v4.app.TaskStackBuilder;
import android.util.Log;
import android.widget.Toast;

/**
 * An activity to import GPX files from the SD card. Optionally to import one
 * GPX file and display it in My Tracks.
 * 
 * @author Rodrigo Damazio
 */
public class ImportActivity extends Activity {

    public static final String EXTRA_IMPORT_ALL = "import_all";

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

    private static final int DIALOG_PROGRESS_ID = 0;
    private static final int DIALOG_RESULT_ID = 1;

    private ImportAsyncTask importAsyncTask;
    private ProgressDialog progressDialog;

    private boolean importAll;

    // path on the SD card to import
    private String path;
    private Uri data;

    // number of succesfully imported files
    private int successCount;

    // number of files to import
    private int totalCount;

    // last successfully imported track id
    private long trackId;

    private String getNameFromContentUri(Uri contentUri) {

        final String name;

        final Cursor returnCursor = this.getContentResolver().query(contentUri, null, null, null, null);

        if (returnCursor != null && returnCursor.moveToFirst()) {

            int columnIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);

            if (columnIndex != -1) {

                name = returnCursor.getString(columnIndex);

            } else {

                name = contentUri.getLastPathSegment();

            }

        } else {

            name = null;

        }

        if (returnCursor != null && !returnCursor.isClosed()) {

            returnCursor.close();

        }

        return name;

    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Intent intent = getIntent();
        importAll = intent.getBooleanExtra(EXTRA_IMPORT_ALL, false);
        if (importAll) {
            path = FileUtils.buildExternalDirectoryPath("gpx");
        } else {
            String action = intent.getAction();
            if (!(Intent.ACTION_ATTACH_DATA.equals(action) || Intent.ACTION_VIEW.equals(action))) {
                Log.d(TAG, "Invalid action: " + intent);
                finish();
                return;
            }

            data = intent.getData();
            /*
             * DDDD if (!UriUtils.isFileUri(data)) { // TODO Process URL Content (e.g.
             * for graphhopper.com) Log.d(TAG, "Invalid data: " + intent); finish();
             * return; }
             */
            path = getNameFromContentUri(data);
        }

        Object retained = getLastNonConfigurationInstance();
        if (retained instanceof ImportAsyncTask) {
            importAsyncTask = (ImportAsyncTask) retained;
            importAsyncTask.setActivity(this);
        } else {
            importAsyncTask = new ImportAsyncTask(this, importAll, path, data);
            importAsyncTask.execute();
        }
    }

    @Override
    public Object onRetainNonConfigurationInstance() {
        importAsyncTask.setActivity(null);
        return importAsyncTask;
    }

    @Override
    protected Dialog onCreateDialog(int id) {
        switch (id) {
        case DIALOG_PROGRESS_ID:
            progressDialog = DialogUtils.createHorizontalProgressDialog(this,
                    R.string.sd_card_import_progress_message, new DialogInterface.OnCancelListener() {
                        @Override
                        public void onCancel(DialogInterface dialog) {
                            importAsyncTask.cancel(true);
                            finish();
                        }
                    });
            return progressDialog;
        case DIALOG_RESULT_ID:
            String message;
            if (successCount == 0) {
                message = getString(R.string.sd_card_import_error_no_file, path);
            } else {
                String totalFiles = getResources().getQuantityString(R.plurals.importGpxFiles, totalCount,
                        totalCount);
                message = getString(R.string.sd_card_import_success_count, successCount, totalFiles,
                        path == null ? "Web" : path);
            }
            return new AlertDialog.Builder(this).setCancelable(true).setMessage(message)
                    .setOnCancelListener(new DialogInterface.OnCancelListener() {
                        @Override
                        public void onCancel(DialogInterface dialog) {
                            finish();
                        }
                    }).setPositiveButton(R.string.generic_ok, new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            if (!importAll && trackId != -1L) {
                                Intent intent = IntentUtils
                                        .newIntent(ImportActivity.this, TrackDetailActivity.class)
                                        .putExtra(TrackDetailActivity.EXTRA_TRACK_ID, trackId);
                                TaskStackBuilder taskStackBuilder = TaskStackBuilder.from(ImportActivity.this);
                                taskStackBuilder.addNextIntent(intent);
                                taskStackBuilder.startActivities();
                            }
                            finish();
                        }
                    }).create();
        default:
            return null;
        }
    }

    /**
     * Invokes when the associated AsyncTask completes.
     * 
     * @param success true if the AsyncTask is successful
     * @param imported the number of files successfully imported
     * @param total the total number of files to import
     * @param id the last successfully imported track id
     */
    public void onAsyncTaskCompleted(boolean success, int imported, int total, long id) {
        successCount = imported;
        totalCount = total;
        trackId = id;
        removeDialog(DIALOG_PROGRESS_ID);
        if (success && trackId > 0) {
            showDialog(DIALOG_RESULT_ID);
        } else {
            Toast.makeText(this, R.string.sd_card_import_error, Toast.LENGTH_LONG).show();
            finish();
        }
    }

    /**
     * Shows the progress dialog.
     */
    public void showProgressDialog() {
        showDialog(DIALOG_PROGRESS_ID);
    }

    /**
     * Sets the progress dialog value.
     * 
     * @param number the number of files imported
     * @param max the maximum number of files
     */
    public void setProgressDialogValue(int number, int max) {
        if (progressDialog != null) {
            progressDialog.setIndeterminate(false);
            progressDialog.setMax(max);
            progressDialog.setProgress(Math.min(number, max));
        }
    }

    @Override
    public void onStart() {
        super.onStart();
        EasyTracker.getInstance(this).activityStart(this); // Add this method.
    }

    @Override
    public void onStop() {
        super.onStop();
        EasyTracker.getInstance(this).activityStop(this); // Add this method.
    }
}