it.sineo.android.tileMapEditor.HomeActivity.java Source code

Java tutorial

Introduction

Here is the source code for it.sineo.android.tileMapEditor.HomeActivity.java

Source

/*
 * Copyright (C) 2012 Luca Santarelli
 *
 * 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 it.sineo.android.tileMapEditor;

import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.ContentValues;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.StrictMode;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.util.Log;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.LayoutInflater;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.AdapterView;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.GridView;
import android.widget.Toast;

import com.actionbarsherlock.app.SherlockFragmentActivity;
import com.michaelnovakjr.numberpicker.NumberPicker;

public class HomeActivity extends SherlockFragmentActivity
        implements LoaderCallbacks<Cursor>, AdapterView.OnItemClickListener {

    private String TAG = HomeActivity.class.getSimpleName();

    private GridView gvPreview;
    private View emptyGrid;
    private MySimpleCursorAdapter adapter;
    private ProgressDialog progressDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        if (C.DEVELOPER_MODE) {
            StrictMode.setThreadPolicy(
                    new StrictMode.ThreadPolicy.Builder().detectAll().penaltyLog().penaltyDeathOnNetwork().build());
            StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectAll().penaltyLog().build());
        }

        super.onCreate(savedInstanceState);
        setContentView(R.layout.home);

        gvPreview = (GridView) findViewById(R.id.home_grid);
        /* Empty grid view */
        emptyGrid = getLayoutInflater().inflate(R.layout.home_grid_empty, null);
        emptyGrid.findViewById(R.id.home_grid_empty).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                showDialog(C.DIALOG_NEW_MAP);
            }
        });
        @SuppressWarnings("deprecation")
        int emptyGrid_layout_size = LayoutParams.FILL_PARENT;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.FROYO) {
            emptyGrid_layout_size = LayoutParams.MATCH_PARENT;
        }
        addContentView(emptyGrid, new LayoutParams(emptyGrid_layout_size, emptyGrid_layout_size));
        gvPreview.setEmptyView(emptyGrid);

        /* Real grid view, with background loading */
        getSupportLoaderManager().initLoader(0, null, this);

        String[] cols = new String[] { "_id", "_name", "_json_data", "_last_update", };

        adapter = new MySimpleCursorAdapter(getApplicationContext(), R.layout.home_grid_item, null, cols, null, 0);

        gvPreview.setAdapter(adapter);
        gvPreview.setOnItemClickListener(this);

        /* Context menu */
        registerForContextMenu(gvPreview);

        // showDialog(C.DIALOG_LOADING_MAPS);
        progressDialog = ProgressDialog.show(HomeActivity.this, null, getString(R.string.home_dlg_loading_maps),
                true);
    }

    /*
     * LoaderCallback
     */
    @Override
    public Loader<Cursor> onCreateLoader(int id, Bundle args) {
        String[] projection = { TileMap.Columns.KEY_ROWID, TileMap.Columns.KEY_NAME, TileMap.Columns.KEY_JSON_DATA,
                TileMap.Columns.KEY_LAST_UPDATE, };
        CursorLoader cursorLoader = new CursorLoader(this, C.CONTENT_URI, projection, null, null,
                "_last_update DESC");
        return cursorLoader;
    }

    @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
        adapter.swapCursor(data);
        if (progressDialog != null && progressDialog.isShowing()) {
            progressDialog.dismiss();
            progressDialog = null;
        }
    }

    @Override
    public void onLoaderReset(Loader<Cursor> loader) {
        // data is not available anymore, delete reference
        adapter.swapCursor(null);
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * android.widget.AdapterView.OnItemClickListener#onItemClick(android.widget
     * .AdapterView, android.view.View, int, long)
     */
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        Intent tiledMapActivity = new Intent(HomeActivity.this, TiledMapActivity.class);
        Cursor cur = (Cursor) parent.getAdapter().getItem(position);
        long mapid = cur.getLong(0);
        String json = cur.getString(2);
        tiledMapActivity.putExtra(C.EXTRA_MAP_JSON, json);
        tiledMapActivity.putExtra(C.EXTRA_MAP_ID, mapid);
        startActivityForResult(tiledMapActivity, C.REQ_CODE_EDIT_MAP);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.home_ctx, menu);
    }

    @Override
    public boolean onContextItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case R.id.home_ctx_menu_delete: {
            AdapterContextMenuInfo cmi = (AdapterContextMenuInfo) item.getMenuInfo();
            Uri mapUri = Uri.withAppendedPath(C.CONTENT_URI, Long.toString(cmi.id));
            getContentResolver().delete(mapUri, null, null);
            return true;
        }
        default:
            return super.onContextItemSelected(item);
        }
    }

    @Override
    public boolean onCreateOptionsMenu(com.actionbarsherlock.view.Menu menu) {
        com.actionbarsherlock.view.MenuInflater inflater = getSupportMenuInflater();
        inflater.inflate(R.menu.home, menu);
        return true;
    }

    @Override
    protected Dialog onCreateDialog(int id) {
        Dialog dialog = null;
        LayoutInflater inflater = getLayoutInflater();
        switch (id) {
        case C.DIALOG_NEW_MAP: {
            View dlgView = (View) inflater.inflate(R.layout.home_dlg_new, null);
            final NumberPicker npRows = (NumberPicker) dlgView.findViewById(R.id.home_dlg_rows);
            final NumberPicker npColumns = (NumberPicker) dlgView.findViewById(R.id.home_dlg_columns);
            npRows.setRange(1, 20);
            npRows.setCurrent(2);
            npColumns.setRange(1, 20);
            npColumns.setCurrent(2);

            AlertDialog.Builder bldr = new AlertDialog.Builder(HomeActivity.this);
            bldr.setView(dlgView);
            DialogInterface.OnClickListener newMaplistener = new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    switch (which) {
                    case DialogInterface.BUTTON_POSITIVE: {
                        /* Memory check */
                        int tileSize = getResources().getDimensionPixelSize(R.dimen.tiledMap_tile);
                        int columns = npColumns.getCurrent();
                        int rows = npRows.getCurrent();
                        try {
                            Bitmap.createBitmap(columns * tileSize, rows * tileSize, Bitmap.Config.ARGB_8888)
                                    .recycle();
                            /* Ok, proceed */
                            Intent tiledMapActivity = new Intent(HomeActivity.this, TiledMapActivity.class);
                            tiledMapActivity.putExtra(C.EXTRA_MAP_ROWS, rows);
                            tiledMapActivity.putExtra(C.EXTRA_MAP_COLUMNS, columns);
                            startActivityForResult(tiledMapActivity, C.REQ_CODE_NEW_MAP);
                        } catch (OutOfMemoryError oomer) {
                            /* Not enough memory to draw this map */
                            Toast.makeText(HomeActivity.this, getString(R.string.home_dlg_new_oom, rows, columns),
                                    Toast.LENGTH_LONG).show();
                        }
                        break;
                    }
                    case DialogInterface.BUTTON_NEGATIVE: {
                        Toast.makeText(HomeActivity.this, R.string.home_dlg_new_canceled, Toast.LENGTH_SHORT)
                                .show();
                        break;
                    }
                    }
                }
            };
            bldr.setPositiveButton(android.R.string.ok, newMaplistener);
            bldr.setNegativeButton(android.R.string.cancel, newMaplistener);
            dialog = bldr.create();
            break;
        }
        default: {
            dialog = super.onCreateDialog(id);
            break;
        }
        }
        return dialog;
    }

    @Override
    public boolean onOptionsItemSelected(com.actionbarsherlock.view.MenuItem item) {
        switch (item.getItemId()) {
        case R.id.global_menu_info: {
            Intent aboutActivity = new Intent(HomeActivity.this, AboutActivity.class);
            startActivity(aboutActivity);
            return true;
        }
        case R.id.global_menu_settings: {
            Intent settingsActivity = new Intent(HomeActivity.this, SettingsActivity.class);
            startActivity(settingsActivity);
            return true;
        }
        case R.id.home_menu_new: {
            /* Ask user for rows, columns and map name */
            showDialog(C.DIALOG_NEW_MAP);
            return true;
        }
        default:
            return super.onOptionsItemSelected(item);
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == C.REQ_CODE_NEW_MAP) {
            if (resultCode == RESULT_OK && data != null) {
                String mapJSON = data.getStringExtra(C.EXTRA_MAP_JSON);
                TileMap map = new TileMap(mapJSON);

                ContentValues values = new ContentValues();
                values.put(TileMap.Columns.KEY_NAME, map.name);
                values.put(TileMap.Columns.KEY_JSON_DATA, mapJSON);
                values.put(TileMap.Columns.KEY_THUMB, data.getByteArrayExtra(C.EXTRA_MAP_THUMB));
                getContentResolver().insert(C.CONTENT_URI, values);
            }
            Log.d(TAG, "received code " + resultCode + " w/ data: " + data);
        } else if (requestCode == C.REQ_CODE_EDIT_MAP) {
            if (resultCode == RESULT_OK && data != null) {
                String mapJSON = data.getStringExtra(C.EXTRA_MAP_JSON);
                long id = data.getLongExtra(C.EXTRA_MAP_ID, -1);
                TileMap map = new TileMap(mapJSON);
                ContentValues values = new ContentValues();
                values.put(TileMap.Columns.KEY_NAME, map.name);
                values.put(TileMap.Columns.KEY_JSON_DATA, mapJSON);
                values.put(TileMap.Columns.KEY_THUMB, data.getByteArrayExtra(C.EXTRA_MAP_THUMB));
                Uri mapUri = Uri.withAppendedPath(C.CONTENT_URI, Long.toString(id));
                getContentResolver().update(mapUri, values, null, null);
            }
        }
        super.onActivityResult(requestCode, resultCode, data);
    }
}