Snippets

Jones Cropper Base List Activity

Created by Jones Cropper
package callowcreation.android.app.ingreedinit.demo.activity;

import android.content.Intent;
import android.database.Cursor;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.Fragment;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.Loader;
import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.view.ActionMode;
import android.support.v7.widget.SearchView;
import android.text.TextUtils;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.TextView;

import org.apache.commons.lang3.StringUtils;

import java.util.List;

import callowcreation.android.app.entity.ShopEntity;
import callowcreation.android.app.entity.storage.DataManager;
import callowcreation.android.app.ingreedinit.demo.ActivityStarter;
import callowcreation.android.app.ingreedinit.demo.AppStart;
import callowcreation.android.app.ingreedinit.demo.R;
import callowcreation.android.app.ingreedinit.demo.Settings;
import callowcreation.android.app.ingreedinit.demo.util.AdapterViewActionMode;
import callowcreation.android.app.ingreedinit.demo.util.MenuItems;
import callowcreation.android.app.ingreedinit.demo.util.ViewAnimator;


public abstract class BaseListActivity extends ActionBarActivity implements
        AdapterViewActionMode.ListActionModeInterface,
        LoaderManager.LoaderCallbacks<Cursor>,
        SearchView.OnQueryTextListener {

    public interface FragmentListCompatibilityMethods {
        void onLoadFinished(Cursor cursor);
        void onLoaderReset();
        Fragment getFragment();
        AdapterView<?> getListView();
        Runnable getSupplemental();
    }

    public static void setSubTitle(ActionBar actionBar) {
        String currentShopName = DataManager.getCurrentShopName();
        if(currentShopName.equals(Settings.getDefaultShopName())){
            currentShopName = StringUtils.EMPTY;
        }
        actionBar.setSubtitle(currentShopName + AppStart.getDebugID());
    }

    // The provider used for data access
    // If non-null, this is the current filter the user has provided.
    String mCurFilter;

    AdapterViewActionMode mAdapterViewActionMode;

    int mAppWidgetId;

    ShopEntity mShop;

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

        setShop();
        AppStart.trackPageView(this);

        mAppWidgetId = ActivityStarter.getAppWidgetId(this);
    }

    final void setShop() {
        mShop = DataManager.getCurrentShop();
        setSubTitle(getSupportActionBar());
    }

    @Override
    public abstract Loader<Cursor> onCreateLoader(int id, Bundle args);

    @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
        mainFragment().onLoadFinished(cursor);
    }

    @Override
    public void onLoaderReset(Loader<Cursor> loader) {
        mainFragment().onLoaderReset();
    }

    @Override
    public final boolean onQueryTextSubmit(String s) { /* Don't care about this. */ return false; }

    @Override
    public boolean onQueryTextChange(String newText) {
        // Called when the action bar search text has changed.  Update
        // the search filter, and restart the loader to do a new query
        // with this filter.
        String newFilter = !TextUtils.isEmpty(newText) ? newText : null;
        // Don't do anything if the filter hasn't actually changed.
        // Prevents restarting the loader when restoring state.
        if (mCurFilter == null && newFilter == null) {
            return true;
        }
        if (mCurFilter != null && mCurFilter.equals(newFilter)) {
            return true;
        }
        mCurFilter = newFilter;
        restartLoader();
        return true;
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        return super.onOptionsItemSelected(item);
    }

    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        clearUndoEntities();
    }

    public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
        clearUndoEntities();
        if(mAdapterViewActionMode.getActionMode() == null) {
            mAdapterViewActionMode.startSupportActionMode(parent, view, id);
//            mainFragment().getListView().setSelection(position);
            AppStart.trackEventUI(this, AppStart.TrackerAction.LONG_PRESS);
        }
        return true;
    }

    @Override
    protected final void onResume() {
        super.onResume();
        setShop();
    }

    @Override
    protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        mAdapterViewActionMode.restoreState(savedInstanceState, mainFragment().getListView());
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        mAdapterViewActionMode.saveState(outState);
    }

    @Override
    public void finish() {
        super.finish();
        ActivityStarter.finish(this, mAppWidgetId);
    }

    @Override
    public abstract boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem);

    @Override
    public void onDestroyActionMode() { }

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

    final void clearUndoEntities() {
        DataManager.clearUndo();
        MenuItems.restoreActionBar(this, String.valueOf(getTitle()));
    }

    protected abstract FragmentListCompatibilityMethods mainFragment();

    protected abstract void restartLoader();

    protected abstract Void delete();

    final void deleteSelected(List<Long> selectedIds) {
        DataManager.deleteSelected(selectedIds, new DeleteSelected());
    }

    final void undoLastChange() {
        DataManager.startTask(DataManager.DataState.UNDOING, new UndoLastChange());
    }

    private void restoreUI() {
        DataManager.setIdle();
        MenuItems.restoreActionBar(this, String.valueOf(getTitle()));
        restartLoader();
        hideProgressView();
    }

    final void showProgressView(int resId) {
        ((TextView) findViewById(R.id.progressText)).setText(resId);
        if(DataManager.isIdle()) {
            ViewAnimator.showLoadingProgressView(findViewById(R.id.progress_container));
        } else {
            findViewById(R.id.progress_container).setVisibility(View.VISIBLE);
        }
    }

    final void hideProgressView() {
        ((TextView) findViewById(R.id.progressText)).setText(R.string.progress_simple_text);
        ViewAnimator.hideLoadingProgressView(findViewById(R.id.progress_container));
    }

    private class DeleteSelected extends AsyncTask<Void, Void, Void> {
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            MenuItems.restoreActionBar(BaseListActivity.this, String.valueOf(getTitle()));
            showProgressView(R.string.progress_deleting_text);
        }

        @Override
        protected Void doInBackground(Void... params) {
            return delete();
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
            AdapterViewActionMode.clearSelected();
            restoreUI();
        }
    }

    private class UndoLastChange extends AsyncTask<Void, Void, Void> {
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            MenuItems.restoreActionBar(BaseListActivity.this, String.valueOf(getTitle()));
            showProgressView(R.string.progress_undoing_text);
        }

        @Override
        protected Void doInBackground(Void... params) {
            return DataManager.undo();
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
            DataManager.clearUndo();
            restoreUI();
        }
    }
}

Comments (0)

HTTPS SSH

You can clone a snippet to your computer for local editing. Learn more.