package com.orgzly.android.ui.fragments.browser;
import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.ListFragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import com.orgzly.BuildConfig;
import com.orgzly.R;
import com.orgzly.android.util.LogUtils;
import java.util.ArrayList;
/**
* Generic fragment for browser.
* File browser or notes browser (for refiling) could extend it.
*/
public abstract class BrowserFragment extends ListFragment {
private static final String TAG = BrowserFragment.class.getName();
protected static final String ARG_ITEM = "item";
protected BrowserFragmentListener mListener;
private LinearLayout mShortcutsLayout;
protected TextView mCurrentItemView;
protected Item[] mItemList;
protected String mCurrentItem;
protected String mNextItem;
protected ArrayList<String> mItemHistory = new ArrayList<>();
protected void init(String entry) {
Bundle args = new Bundle();
args.putString(ARG_ITEM, entry);
setArguments(args);
}
@Override
public void onAttach(Context context) {
if (BuildConfig.LOG_DEBUG) LogUtils.d(TAG, getActivity());
super.onAttach(context);
/* This makes sure that the container activity has implemented
* the callback interface. If not, it throws an exception
*/
try {
mListener = (BrowserFragmentListener) getActivity();
} catch (ClassCastException e) {
throw new ClassCastException(getActivity().toString() + " must implement " + BrowserFragmentListener.class);
}
/* Sets current item. Either uses passed argument, or default. */
if (getArguments() != null) {
if (getArguments().containsKey(ARG_ITEM)) {
mNextItem = getArguments().getString(ARG_ITEM);
if (BuildConfig.LOG_DEBUG) LogUtils.d(TAG, "Using passed argument: " + mNextItem);
}
}
if (mNextItem == null) {
mNextItem = defaultPath();
if (BuildConfig.LOG_DEBUG) LogUtils.d(TAG, "Using browser's argument: " + mNextItem);
}
}
abstract String defaultPath();
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if (BuildConfig.LOG_DEBUG) LogUtils.d(TAG, inflater, container, savedInstanceState);
View view = inflater.inflate(R.layout.browser, container, false);
// Shortcuts
mShortcutsLayout = (LinearLayout) view.findViewById(R.id.browser_shortcuts);
setupShortcuts(mShortcutsLayout);
// Current item
mCurrentItemView = (TextView) view.findViewById(R.id.browser_title);
// Buttons on the bottom
setupActionButtons(view);
return view;
}
abstract void setupShortcuts(LinearLayout layout);
private void setupActionButtons(View view) {
view.findViewById(R.id.browser_button_cancel).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mListener.onBrowserCancel();
}
});
view.findViewById(R.id.browser_button_create).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mListener.onBrowserCreate(mCurrentItem);
}
});
view.findViewById(R.id.browser_button_use).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mListener.onBrowserUse(mCurrentItem);
}
});
}
@Override
public void onDetach() {
super.onDetach();
mListener = null;
}
@Override
public void onSaveInstanceState(Bundle outState) {
if (BuildConfig.LOG_DEBUG) LogUtils.d(TAG, outState);
super.onSaveInstanceState(outState);
outState.putString(ARG_ITEM, mCurrentItem);
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
throw new IllegalStateException("Browser implementations must implement onListItemClick");
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
if (BuildConfig.LOG_DEBUG) LogUtils.d(TAG, savedInstanceState);
super.onActivityCreated(savedInstanceState);
if (savedInstanceState != null && savedInstanceState.containsKey(ARG_ITEM)) {
mNextItem = savedInstanceState.getString(ARG_ITEM);
}
}
protected class Item {
boolean isUp = false;
public String name;
public int icon;
public Item(Integer icon) {
this.icon = icon;
this.isUp = true;
this.name = "Up";
}
public Item(Integer icon, String name) {
this.icon = icon;
this.isUp = false;
this.name = name;
}
@Override
public String toString() {
return name;
}
}
public interface BrowserFragmentListener {
void onBrowserCancel();
void onBrowserCreate(String currentItem);
void onBrowserUse(String item);
}
}