org.addhen.smssync.activities.BaseActivity.java Source code

Java tutorial

Introduction

Here is the source code for org.addhen.smssync.activities.BaseActivity.java

Source

/*******************************************************************************
 *  Copyright (c) 2010 - 2013 Ushahidi Inc
 *  All rights reserved
 *  Contact: team@ushahidi.com
 *  Website: http://www.ushahidi.com
 *  GNU Lesser General Public License Usage
 *  This file may be used under the terms of the GNU Lesser
 *  General Public License version 3 as published by the Free Software
 *  Foundation and appearing in the file LICENSE.LGPL included in the
 *  packaging of this file. Please review the following information to
 *  ensure the GNU Lesser General Public License version 3 requirements
 *  will be met: http://www.gnu.org/licenses/lgpl.html.
 *
 * If you have questions regarding the use of this file, please contact
 * Ushahidi developers at team@ushahidi.com.
 ******************************************************************************/

package org.addhen.smssync.activities;

import android.app.Activity;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarActivity;
import android.text.format.DateFormat;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast;

import org.addhen.smssync.MainApplication;
import org.addhen.smssync.Prefs;
import org.addhen.smssync.R;
import org.addhen.smssync.adapters.NavDrawerAdapter;
import org.addhen.smssync.navdrawer.BaseNavDrawerItem;
import org.addhen.smssync.navdrawer.BlacklistNavDrawerItem;
import org.addhen.smssync.navdrawer.DonationNavDrawerItem;
import org.addhen.smssync.navdrawer.LogNavDrawerItem;
import org.addhen.smssync.navdrawer.PendingMessagesNavDrawerItem;
import org.addhen.smssync.navdrawer.SentMessagesNavDrawerItem;
import org.addhen.smssync.navdrawer.SyncUrlNavDrawerItem;
import org.addhen.smssync.navdrawer.WhitelistNavDrawerItem;
import org.addhen.smssync.util.LogUtil;
import org.addhen.smssync.util.Logger;
import org.addhen.smssync.util.Objects;
import org.addhen.smssync.util.Util;
import org.addhen.smssync.views.View;

import java.util.ArrayList;
import java.util.List;

/**
 * BaseActivity Add shared functionality that exists between all Activities
 */
public abstract class BaseActivity<V extends View> extends ActionBarActivity {

    /**
     * Layout resource id
     */
    protected final int layout;

    /**
     * Menu resource id
     */
    protected final int menu;

    /**
     * View class
     */
    protected final Class<V> viewClass;

    protected final int drawerLayoutId;

    /**
     * ListView resource id
     */
    protected final int listViewId;

    /**
     * View
     */
    protected V view;

    protected NavDrawerAdapter navDrawerAdapter;

    protected ActionBarDrawerToggle drawerToggle;

    protected DrawerLayout drawerLayout;

    protected ListView listView;

    private PendingMessagesNavDrawerItem pendingMessagesNavDrawerItem;

    private SentMessagesNavDrawerItem sentMessagesNavDrawerItem;

    private SyncUrlNavDrawerItem syncUrlNavDrawerItem;

    private DonationNavDrawerItem donationNavDrawerItem;

    private BlacklistNavDrawerItem filterNavDrawerItem;

    private WhitelistNavDrawerItem whitelistNavDrawerItem;

    private LogNavDrawerItem logNavDrawerItem;

    private List<BaseNavDrawerItem> navDrawerItem;

    private static int mPosition = 0;

    /**
     * BaseActivity
     *
     * @param view           View class
     * @param layout         layout resource id
     * @param menu           menu resource id
     * @param drawerLayoutId resource id for the drawerLayout
     * @param listViewId     the resource id for the list view
     */
    protected BaseActivity(Class<V> view, int layout, int menu, int drawerLayoutId, int listViewId) {

        this.viewClass = view;
        this.layout = layout;
        this.menu = menu;
        this.drawerLayoutId = drawerLayoutId;
        this.listViewId = listViewId;
    }

    /**
     * BaseActivity
     *
     * @param view   View class
     * @param layout layout resource id
     * @param menu   menu resource id
     */
    protected BaseActivity(Class<V> view, int layout, int menu) {
        this(view, layout, menu, 0, 0);

    }

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

        if (layout != 0) {
            setContentView(layout);
        }

        if (drawerLayoutId != 0) {
            drawerLayout = (DrawerLayout) findViewById(drawerLayoutId);
        }

        if (listViewId != 0) {
            listView = (ListView) findViewById(listViewId);
        }

        view = Objects.createInstance(viewClass, Activity.class, this);

        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setHomeButtonEnabled(true);

        if (drawerLayout != null) {
            // enable navigation drawer
            createNavDrawer();
        }
        Util.setupStrictMode();
    }

    @Override
    protected void onStart() {
        super.onStart();
        log("onStart");
        MainApplication.getInstance().activityStart(this);
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        log("onRestart");
    }

    @Override
    protected void onResume() {
        super.onResume();
        log("onResume");
    }

    @Override
    protected void onPause() {
        super.onPause();
        log("onPause");
    }

    @Override
    protected void onStop() {
        super.onStop();
        log("onStop");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        log("onDestroy");
        MainApplication.getInstance().activityStop(this);
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
            log("onKeyDown KEYCODE_BACK");
        }
        return super.onKeyDown(keyCode, event);
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        log("onActivityResult");
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        if (this.menu != 0) {
            getMenuInflater().inflate(this.menu, menu);
            return true;
        }
        return false;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case android.R.id.home:

            if (drawerLayout != null) {

                if (drawerLayout.isDrawerOpen(listView)) {
                    drawerLayout.closeDrawer(listView);
                } else {
                    drawerLayout.openDrawer(listView);
                }

            } else {
                finish();
            }
        }

        return super.onOptionsItemSelected(item);
    }

    @Override
    public boolean onContextItemSelected(android.view.MenuItem item) {
        return super.onContextItemSelected(item);
    }

    public void openActivityOrFragment(Intent intent) {
        // Default implementation simply calls startActivity
        startActivity(intent);
    }

    private void initNavDrawerMenuItems() {
        pendingMessagesNavDrawerItem = new PendingMessagesNavDrawerItem(getString(R.string.pending_messages),
                R.drawable.pending, BaseActivity.this);

        sentMessagesNavDrawerItem = new SentMessagesNavDrawerItem(getString(R.string.sent_messages),
                R.drawable.sent, BaseActivity.this);

        syncUrlNavDrawerItem = new SyncUrlNavDrawerItem(getString(R.string.sync_url), R.drawable.sync_url,
                BaseActivity.this);

        donationNavDrawerItem = new DonationNavDrawerItem(getString(R.string.donate), R.drawable.donate,
                BaseActivity.this);

        filterNavDrawerItem = new BlacklistNavDrawerItem(getString(R.string.blacklist), R.drawable.blacklist,
                BaseActivity.this);

        whitelistNavDrawerItem = new WhitelistNavDrawerItem(getString(R.string.whitelist), R.drawable.whitelist,
                BaseActivity.this);

        logNavDrawerItem = new LogNavDrawerItem(getString(R.string.logs), R.drawable.log, BaseActivity.this);

        navDrawerItem = new ArrayList<BaseNavDrawerItem>();

        navDrawerAdapter = new NavDrawerAdapter(this);
    }

    private void setNavDrawerAdapterItems() {
        new Handler().post(new Runnable() {

            @Override
            public void run() {
                sentMessagesNavDrawerItem.setCounter();
                pendingMessagesNavDrawerItem.setCounter();
                syncUrlNavDrawerItem.setCounter();
                filterNavDrawerItem.setCounter();
                whitelistNavDrawerItem.setCounter();
                navDrawerItem.clear();
                navDrawerItem.add(pendingMessagesNavDrawerItem);
                navDrawerItem.add(sentMessagesNavDrawerItem);
                navDrawerItem.add(syncUrlNavDrawerItem);
                //navDrawerItem.add(donationNavDrawerItem);
                navDrawerItem.add(whitelistNavDrawerItem);
                navDrawerItem.add(filterNavDrawerItem);
                navDrawerItem.add(logNavDrawerItem);
                navDrawerAdapter.setItems(navDrawerItem);
                listView.setAdapter(navDrawerAdapter);
                selectItem(mPosition);
            }
        });
    }

    protected void createNavDrawer() {
        initNavDrawerMenuItems();
        setNavDrawerAdapterItems();

        //selectItem(0);
        initNavDrawer();
    }

    protected void selectItem(int position) {
        if (navDrawerAdapter != null && navDrawerAdapter.getCount() > 0) {
            BaseNavDrawerItem item = navDrawerAdapter.getItem(position);

            // Perform selection only if item is not selected
            if (!item.isSelected()) {
                item.selectItem();
            }

            // update selected item and title, then close the drawer
            listView.setItemChecked(position, true);

            drawerLayout.closeDrawer(listView);

        }
    }

    private void initNavDrawer() {

        listView.setOnItemClickListener(new NavDrawerItemClickListener());

        if (drawerLayout != null) {
            drawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
            // ActionBarDrawerToggle ties together the the proper interactions
            // between the sliding drawer and the action bar app icon
            drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, R.drawable.ic_drawer, R.string.open,
                    R.string.close) {
                public void onDrawerClosed(android.view.View view) {
                    getSupportActionBar().setTitle(getTitle());

                    super.onDrawerClosed(view);
                }

                public void onDrawerOpened(android.view.View drawerView) {
                    getSupportActionBar().setTitle(getTitle());

                    super.onDrawerOpened(drawerView);
                }
            };
        }

        drawerLayout.setDrawerListener(drawerToggle);

    }

    /**
     * When using the ActionBarDrawerToggle, you must call it during onPostCreate() and
     * onConfigurationChanged()...
     */

    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        // Sync the toggle state after onRestoreInstanceState has occurred.
        if (drawerToggle != null) {
            drawerToggle.syncState();
        }
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        // Pass any configuration change to the drawer toggls
        if (drawerToggle != null) {
            drawerToggle.onConfigurationChanged(newConfig);
        }
    }

    protected ListView findListViewById(int id) {
        return (ListView) findViewById(id);
    }

    protected void log(String message) {
        Logger.log(getClass().getName(), message);
    }

    protected void log(String format, Object... args) {

        Logger.log(getClass().getName(), String.format(format, args));
    }

    protected void log(String message, Exception ex) {

        Logger.log(getClass().getName(), message, ex);
    }

    protected void toastLong(String message) {
        Toast.makeText(this, message, Toast.LENGTH_LONG).show();
    }

    protected void toastLong(int message) {
        Toast.makeText(this, getText(message), Toast.LENGTH_LONG).show();
    }

    protected void toastLong(String format, Object... args) {
        Toast.makeText(this, String.format(format, args), Toast.LENGTH_LONG).show();
    }

    protected void toastLong(CharSequence message) {
        Toast.makeText(this, message.toString(), Toast.LENGTH_LONG).show();
    }

    protected void toastShort(String message) {
        Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
    }

    protected void toastShort(String format, Object... args) {
        Toast.makeText(this, String.format(format, args), Toast.LENGTH_SHORT).show();
    }

    protected void toastShort(int message) {
        Toast.makeText(this, getText(message), Toast.LENGTH_SHORT).show();
    }

    protected void toastShort(CharSequence message) {
        Toast.makeText(this, message.toString(), Toast.LENGTH_SHORT).show();
    }

    private class NavDrawerItemClickListener implements ListView.OnItemClickListener {

        @Override
        public void onItemClick(AdapterView<?> parent, android.view.View view, int position, long id) {
            mPosition = position;
            setNavDrawerAdapterItems();
            view.getFocusables(position);
            view.setSelected(true);
        }

    }

    protected void logActivities(String message) {
        if (Prefs.enableLog) {
            new LogUtil(DateFormat.getDateFormatOrder(this)).appendAndClose(message);
        }
    }

}