package com.orgzly.android.ui.fragments; import android.app.Activity; import android.content.Context; import android.graphics.Typeface; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.EditText; import com.orgzly.BuildConfig; import com.orgzly.R; import com.orgzly.android.Book; import com.orgzly.android.prefs.AppPreferences; import com.orgzly.android.provider.clients.BooksClient; import com.orgzly.android.ui.FragmentListener; import com.orgzly.android.ui.util.ActivityUtils; import com.orgzly.android.util.LogUtils; import java.io.BufferedReader; import java.io.IOException; import java.io.StringReader; /** * Book's preface and settings. */ public class BookPrefaceFragment extends Fragment { private static final String TAG = BookPrefaceFragment.class.getName(); /** Name used for {@link android.app.FragmentManager}. */ public static final String FRAGMENT_TAG = BookPrefaceFragment.class.getName(); private static final String ARG_BOOK_ID = "book_id"; private static final String ARG_BOOK_PREFACE = "book_preface"; private long bookId; private Book book; private EditText contentView; private EditorListener listener; public static BookPrefaceFragment getInstance(long bookId, String bookPreface) { BookPrefaceFragment fragment = new BookPrefaceFragment(); /* Set arguments for a fragment. */ Bundle args = new Bundle(); args.putLong(BookPrefaceFragment.ARG_BOOK_ID, bookId); args.putString(BookPrefaceFragment.ARG_BOOK_PREFACE, bookPreface); fragment.setArguments(args); return fragment; } /** * Mandatory empty constructor for the fragment manager to instantiate the * fragment (e.g. upon screen orientation changes). */ public BookPrefaceFragment() { if (BuildConfig.LOG_DEBUG) LogUtils.d(TAG); } @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 { listener = (EditorListener) getActivity(); } catch (ClassCastException e) { throw new ClassCastException(getActivity().toString() + " must implement " + EditorListener.class); } } @Override public void onCreate(Bundle savedInstanceState) { if (BuildConfig.LOG_DEBUG) LogUtils.d(TAG, savedInstanceState); super.onCreate(savedInstanceState); /* Would like to add items to the Options Menu. * Required (for fragments only) to receive onCreateOptionsMenu() call. */ setHasOptionsMenu(true); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { if (BuildConfig.LOG_DEBUG) LogUtils.d(TAG, inflater, container, savedInstanceState); View top = inflater.inflate(R.layout.fragment_book_preface, container, false); contentView = (EditText) top.findViewById(R.id.fragment_book_preface_content); Activity activity = getActivity(); if (activity != null && AppPreferences.isFontMonospaced(getContext())) { contentView.setTypeface(Typeface.MONOSPACE); } // Open keyboard if (activity != null) { ActivityUtils.openSoftKeyboard(activity, contentView); } /* Parse arguments - set content. */ if (getArguments() == null) { throw new IllegalArgumentException(BookPrefaceFragment.class.getSimpleName() + " has no arguments passed"); } if (!getArguments().containsKey(ARG_BOOK_ID)) { throw new IllegalArgumentException(BookPrefaceFragment.class.getSimpleName() + " has no book id passed"); } if (!getArguments().containsKey(ARG_BOOK_PREFACE)) { throw new IllegalArgumentException(BookPrefaceFragment.class.getSimpleName() + " has no book preface passed"); } bookId = getArguments().getLong(ARG_BOOK_ID); book = BooksClient.get(getActivity(), bookId); contentView.setText(getArguments().getString(ARG_BOOK_PREFACE)); return top; } @Override public void onResume() { if (BuildConfig.LOG_DEBUG) LogUtils.d(TAG); super.onResume(); announceChangesToActivity(); } private void announceChangesToActivity() { if (listener != null) { listener.announceChanges( BookPrefaceFragment.FRAGMENT_TAG, Book.getFragmentTitleForBook(book), Book.getFragmentSubtitleForBook(book), 0); } } @Override public void onDetach() { if (BuildConfig.LOG_DEBUG) LogUtils.d(TAG); super.onDetach(); listener = null; } /* * Options Menu. */ @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { if (BuildConfig.LOG_DEBUG) LogUtils.d(TAG, menu, inflater); menu.clear(); inflater.inflate(R.menu.done_close_delete, menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { if (BuildConfig.LOG_DEBUG) LogUtils.d(TAG, item); switch (item.getItemId()) { case R.id.close: listener.onBookPrefaceEditCancelRequest(); return true; case R.id.done: save(contentView.getText().toString()); return true; case R.id.delete: save(""); return true; } return super.onOptionsItemSelected(item); } private void save(String preface) { book.setPreface(preface); parsePrefaceForInBufferSettings(book, preface); listener.onBookPrefaceEditSaveRequest(book); } private void parsePrefaceForInBufferSettings(Book book, String preface) { /* Set default values for settings that could be overwritten. */ book.getOrgFileSettings().setTitle(null); BufferedReader reader = new BufferedReader(new StringReader(preface)); try { String line; while ((line = reader.readLine()) != null) { book.getOrgFileSettings().parseLine(line); } } catch (IOException e) { e.printStackTrace(); } finally { try { reader.close(); } catch (IOException e) { e.printStackTrace(); } } } public interface EditorListener extends FragmentListener { void onBookPrefaceEditSaveRequest(Book book); void onBookPrefaceEditCancelRequest(); } }