package org.goodev.discourse.ui; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; import android.database.Cursor; import android.os.Bundle; import android.support.v4.app.DialogFragment; import android.support.v4.app.Fragment; import android.support.v4.app.LoaderManager.LoaderCallbacks; import android.support.v4.content.CursorLoader; import android.support.v4.content.Loader; import android.support.v4.widget.CursorAdapter; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.EditText; import android.widget.Spinner; import android.widget.TextView; import org.goodev.discourse.R; import org.goodev.discourse.contentprovider.Provider; import org.goodev.discourse.utils.Utils; import static org.goodev.discourse.database.tables.CategoriesTable.COLOR; import static org.goodev.discourse.database.tables.CategoriesTable.DESCRIPTION; import static org.goodev.discourse.database.tables.CategoriesTable.DESCRIPTION_EXCERPT; import static org.goodev.discourse.database.tables.CategoriesTable.ID; import static org.goodev.discourse.database.tables.CategoriesTable.NAME; import static org.goodev.discourse.database.tables.CategoriesTable.SLUG; import static org.goodev.discourse.database.tables.CategoriesTable.TEXT_COLOR; import static org.goodev.discourse.database.tables.CategoriesTable.TOPIC_COUNT; import static org.goodev.discourse.database.tables.CategoriesTable.UID; public class EditorChangeTitleFragment extends DialogFragment implements LoaderCallbacks<Cursor> { private static final int LOADER_ID_CATEGORY = 0; private static final String[] CATEGORY_COLUMNS = new String[]{ID, UID, NAME, COLOR, TEXT_COLOR, SLUG, TOPIC_COUNT, DESCRIPTION, DESCRIPTION_EXCERPT}; private static final int INDEX_UID = 1; private static final int INDEX_NAME = 2; private static final int INDEX_COLOR = 3; private static final int INDEX_TEXT_COLOR = 4; private static final int INDEX_SLUG = 5; private static final int INDEX_TOPIC_COUNT = 6; private ChangeTopicListener mListener; private EditText mTitleET; private int mCategoryIndex; private long mCategoryId; private String mTitle; private Spinner mCategoriesSpinner; private CursorAdapter mCategoryAdapter; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mCategoryAdapter = new CategoryAdapter(getActivity(), null); if (savedInstanceState != null) { mTitle = savedInstanceState.getString(Utils.EXTRA_TITLE, null); mCategoryIndex = savedInstanceState.getInt(Utils.EXTRA_CAT_INDEX, 0); } else { Bundle args = getArguments(); mTitle = args.getString(Utils.EXTRA_TITLE, null); mCategoryId = args.getLong(Utils.EXTRA_ID, 0); } } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); String title = mTitleET.getText().toString(); if (!TextUtils.isEmpty(title)) { outState.putString(Utils.EXTRA_TITLE, title); } int index = mCategoriesSpinner.getSelectedItemPosition(); outState.putInt(Utils.EXTRA_CAT_INDEX, index); } @Override public void onAttach(Activity activity) { super.onAttach(activity); Fragment f = getParentFragment(); if (activity instanceof ChangeTopicListener) { mListener = (ChangeTopicListener) activity; } else if (f instanceof ChangeTopicListener) { mListener = (ChangeTopicListener) f; } else { throw new ClassCastException(activity.toString() + " must implement ChangeTopicListener"); } } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); getLoaderManager().initLoader(LOADER_ID_CATEGORY, null, this); } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); LayoutInflater inflater = getActivity().getLayoutInflater(); View view = inflater.inflate(R.layout.editor_change_title, null); mTitleET = (EditText) view.findViewById(R.id.edit_title); mTitleET.setText(mTitle); mCategoriesSpinner = (Spinner) view.findViewById(R.id.edit_categories_spinner); mCategoriesSpinner.setAdapter(mCategoryAdapter); builder.setView(view).setTitle(R.string.edit_topic_title).setPositiveButton(R.string.save, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int id) { String name = mTitleET.getText().toString().trim(); int position = mCategoriesSpinner.getSelectedItemPosition(); String catName = ""; long catId = 0; if (position != 0) { Cursor c = (Cursor) mCategoriesSpinner.getSelectedItem(); if (c != null) { catName = c.getString(INDEX_NAME); catId = c.getLong(INDEX_UID); } } if (mListener != null) { mListener.onTopicChange(name, catName, catId); } } }).setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int id) { dialog.cancel(); } }); return builder.create(); } @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { return new CursorLoader(getActivity(), Provider.CATEGORIES_CONTENT_URI, CATEGORY_COLUMNS, null, null, UID + " ASC"); } @Override public void onLoadFinished(Loader<Cursor> loader, Cursor data) { mCategoryAdapter.swapCursor(data); if (mCategoryId > 0) { data.moveToFirst(); int index = 0; while (!data.isAfterLast()) { long id = data.getLong(INDEX_UID); if (id == mCategoryId) { mCategoryIndex = index; break; } data.moveToNext(); index++; } } mCategoriesSpinner.setSelection(mCategoryIndex); } @Override public void onLoaderReset(Loader<Cursor> loader) { } public interface ChangeTopicListener { void onTopicChange(String title, String category, long categoryId); } class CategoryAdapter extends CursorAdapter { LayoutInflater mLayoutInflater; Context mContext; public CategoryAdapter(Context context, Cursor c) { super(context, c, false); mContext = context; mLayoutInflater = LayoutInflater.from(context); } @Override public View newView(Context context, Cursor cursor, ViewGroup parent) { return mLayoutInflater.inflate(R.layout.editor_category_item, parent, false); } @Override public void bindView(View view, Context context, Cursor cursor) { TextView category = (TextView) view.findViewById(R.id.category_name); String name = cursor.getString(INDEX_NAME); category.setText(name); } public void bindDropDownView(View view, Context context, Cursor cursor) { TextView category = (TextView) view.findViewById(R.id.category_name); TextView topicCount = (TextView) view.findViewById(R.id.category_topic_count); String name = cursor.getString(INDEX_NAME); String bgColor = cursor.getString(INDEX_COLOR); String textColor = cursor.getString(INDEX_TEXT_COLOR); Utils.setCategoryView(category, name, bgColor, textColor); long count = cursor.getLong(INDEX_TOPIC_COUNT); topicCount.setText(mContext.getString(R.string.editor_category_count, count)); } @Override public View getDropDownView(int position, View convertView, ViewGroup parent) { if (mDataValid) { mCursor.moveToPosition(position); View v; if (convertView == null) { v = newDropDownView(mContext, mCursor, parent); } else { v = convertView; } bindDropDownView(v, mContext, mCursor); return v; } else { return null; } } @Override public View newDropDownView(Context context, Cursor cursor, ViewGroup parent) { return mLayoutInflater.inflate(R.layout.editor_category_dropdown_item, parent, false); } } }