package com.ubergeek42.WeechatAndroid.utils; import android.content.Context; import android.content.DialogInterface; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.text.ClipboardManager; import android.text.style.URLSpan; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.BaseAdapter; import android.widget.EditText; import android.widget.ListView; import android.widget.TextView; import com.ubergeek42.WeechatAndroid.R; import com.ubergeek42.WeechatAndroid.relay.Line; import com.ubergeek42.WeechatAndroid.service.P; import com.ubergeek42.weechat.Color; import java.util.ArrayList; public class CopyPaste implements EditText.OnLongClickListener, AdapterView.OnItemLongClickListener { private AppCompatActivity activity; private EditText input; public CopyPaste(AppCompatActivity activity, EditText input) { this.activity = activity; this.input = input; } // called on long click on input field @Override public boolean onLongClick(View v) { // do not do anything special if TextView has text if (!"".equals(((TextView) v).getText().toString())) return false; final ArrayList<String> list = new ArrayList<>(); // read & trim clipboard // noinspection deprecation ClipboardManager cm = (ClipboardManager) activity.getSystemService(Context.CLIPBOARD_SERVICE); final String clip = (cm.getText() == null) ? "" : cm.getText().toString().trim(); // copy last messages if they do not equal clipboard // if there are no messages, do nothing for (String m : P.sentMessages) if (!m.equals(clip)) list.add(m); if (list.size() == 0) return false; // clean and add clipboard if (!"".equals(clip)) list.add(clip); final LayoutInflater inflater = LayoutInflater.from(activity); AlertDialog.Builder builder = new AlertDialog.Builder(activity); builder.setTitle(activity.getString(R.string.dialog_paste_title)).setAdapter( new BaseAdapter() { @Override public int getCount() {return list.size();} @Override public String getItem(int position) {return list.get(position);} @Override public long getItemId(int position) {return position;} @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) convertView = inflater.inflate(R.layout.select_dialog_item_material_2_lines, parent, false); TextView v = (TextView) convertView; boolean isClip = (!"".equals(clip) && position == list.size() - 1); v.setText(Utils.unCrLf(getItem(position))); v.setBackgroundResource(isClip ? R.color.special : 0); v.setCompoundDrawablesWithIntrinsicBounds(0, 0, isClip ? R.drawable.ic_paste : 0, 0); return v; } }, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { input.setText(list.get(which)); input.setSelection(input.getText().length()); } }); // create dialogue, remove bottom padding and scroll to the end AlertDialog d = builder.create(); final ListView l = d.getListView(); l.setPadding(l.getPaddingLeft(), l.getPaddingTop(), l.getPaddingRight(), 0); l.setStackFromBottom(true); d.show(); return true; } // called on long click on a chat line @Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { TextView uiTextView = (TextView) view.findViewById(R.id.chatline_message); if (uiTextView == null) return false; Line line = (Line) uiTextView.getTag(); final ArrayList<String> list = new ArrayList<>(); list.add(line.getNotificationString()); list.add(Color.stripEverything(line.message)); for (URLSpan url: uiTextView.getUrls()) list.add(url.getURL()); AlertDialog.Builder builder = new AlertDialog.Builder(activity); builder.setTitle(activity.getString(R.string.dialog_copy_title)).setAdapter( new ArrayAdapter<>(activity, R.layout.select_dialog_item_material_2_lines, android.R.id.text1, list), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // noinspection deprecation ClipboardManager cm = (ClipboardManager) activity.getSystemService(Context.CLIPBOARD_SERVICE); cm.setText(list.get(which)); } }); builder.create().show(); line.clickDisabled = true; return true; } }