package edu.kufpg.armatus.dialog; import java.util.SortedSet; import android.content.ClipData; import android.content.ClipboardManager; import android.content.ClipboardManager.OnPrimaryClipChangedListener; import android.content.Context; import android.os.Bundle; import android.text.SpannableStringBuilder; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import com.google.common.base.Optional; import edu.kufpg.armatus.R; import edu.kufpg.armatus.console.ConsoleActivity; import edu.kufpg.armatus.console.ConsoleLineParams; import edu.kufpg.armatus.util.BundleUtils; import edu.kufpg.armatus.util.StringUtils; /** * ConsoleEntrySelectionDialog Class. This class extends {@link android.app.DialogFragment DialogFragment} class. * Task of building strings and making the dialog of the console. */ public class ConsoleEntrySelectionDialog extends ConsiderateDialog { private ClipboardManager mClipboard; private TextView mContentsView; private OnPrimaryClipChangedListener mClipboardUnwrapper; private Optional<Integer> mOnlyEntryNum; private CharSequence mContents; public static ConsoleEntrySelectionDialog newInstance(SortedSet<ConsoleLineParams> lineParams) { if (lineParams.isEmpty()) { throw new IllegalArgumentException("lineNums must not be empty"); } else { ConsoleEntrySelectionDialog cesd = new ConsoleEntrySelectionDialog(); Bundle args = new Bundle(); BundleUtils.putSet(args, "lineParams", lineParams); cesd.setArguments(args); return cesd; } } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (savedInstanceState == null) { SortedSet<ConsoleLineParams> lineParams = BundleUtils.getSortedSet(getArguments(), "lineParams"); if (lineParams.size() == 1) { mOnlyEntryNum = Optional.of(lineParams.first().entryNum); } else { mOnlyEntryNum = Optional.absent(); } SpannableStringBuilder contentsBuilder = new SpannableStringBuilder(); for (ConsoleLineParams lineParam : lineParams) { CharSequence line = getConsole().getLine(lineParam.entryNum, lineParam.lineNum); contentsBuilder.append(line).append('\n'); } contentsBuilder.delete(contentsBuilder.length() - 1, contentsBuilder.length()); //Remove final newline mContents = contentsBuilder; } else { mContents = savedInstanceState.getCharSequence("contents"); mOnlyEntryNum = BundleUtils.getOptional(savedInstanceState, "onlyEntryNum"); } mClipboard = (ClipboardManager) getActivity().getSystemService(Context.CLIPBOARD_SERVICE); mClipboardUnwrapper = new OnPrimaryClipChangedListener() { @Override public void onPrimaryClipChanged() { if (mClipboard.hasPrimaryClip() && mClipboard.getPrimaryClipDescription().hasMimeType("text/plain")) { mClipboard.removePrimaryClipChangedListener(this); String contents = mClipboard.getPrimaryClip().getItemAt(0).getText().toString(); ClipData newCopy = ClipData.newPlainText("copiedText", StringUtils.noCharWrap(contents)); mClipboard.setPrimaryClip(newCopy); mClipboard.addPrimaryClipChangedListener(this); } } }; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { super.onCreateView(inflater, container, savedInstanceState); View v = inflater.inflate(R.layout.console_entry_selection_dialog, container, false); setCancelable(true); if (mOnlyEntryNum.isPresent()) { //If there is only one entry getDialog().setTitle("Entry number " + mOnlyEntryNum.get()); } else { getDialog().setTitle("Selected entries"); } mContentsView = (TextView) v.findViewById(R.id.console_entry_selection_dialog_contents); mContentsView.setText(mContents); mContentsView.setTypeface(ConsoleActivity.TYPEFACE); return v; } @Override public void onResume() { super.onResume(); mClipboard.addPrimaryClipChangedListener(mClipboardUnwrapper); } @Override public void onPause() { super.onPause(); mClipboard.removePrimaryClipChangedListener(mClipboardUnwrapper); } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putCharSequence("contents", mContents); BundleUtils.putOptional(outState, "onlyEntryNum", mOnlyEntryNum); } }