package se.alexanderblom.delicious.fragments;
import se.alexanderblom.delicious.R;
import se.alexanderblom.delicious.ui.AddBookmarkActivity;
import android.app.Fragment;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.util.Patterns;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.TextView;
public class ClipboardFragment extends Fragment implements ClipboardManager.OnPrimaryClipChangedListener {
private static final String TAG = "ClipboardFragment";
private static final String MIMETYPE_TEXT_PLAIN = "text/plain";
private static final int LINK_TIMEOUT = 6 * 1000; // 6 seconds
private static String lastUrl = null;
private Handler handler;
private ClipboardManager clipboard;
private TextView clipboardLinkView;
private String currentUrl;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
handler = new Handler();
clipboard = (ClipboardManager) getActivity().getSystemService(Context.CLIPBOARD_SERVICE);
// Retain so we can keep our handler
setRetainInstance(true);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_clipboard, container, false);
clipboardLinkView = (TextView) v.findViewById(R.id.clipboard_link);
View clipboardButton = v.findViewById(R.id.clipboard_save_button);
clipboardButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
saveClipboardLink();
}
});
return v;
}
@Override
public void onPause() {
super.onPause();
clipboard.removePrimaryClipChangedListener(this);
}
@Override
public void onResume() {
super.onResume();
clipboard.addPrimaryClipChangedListener(this);
checkClipboard();
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
// It's not valid to run fragments transactions after this
handler.removeCallbacks(hideRunnable);
}
@Override
public void onDestroy() {
super.onDestroy();
// Make sure it's removed
handler.removeCallbacks(hideRunnable);
}
@Override
public void onPrimaryClipChanged() {
Log.d(TAG, "Clipboard changed");
checkClipboard();
}
private void checkClipboard() {
if (currentUrl != null) {
clipboardLinkView.setText(currentUrl);
} else if (clipboard.hasPrimaryClip() && clipboard.getPrimaryClipDescription().hasMimeType(MIMETYPE_TEXT_PLAIN)) {
// Check that the clip is plain text
ClipData.Item item = clipboard.getPrimaryClip().getItemAt(0);
CharSequence text = item.getText();
// Check if it's a web url and that we have not previously seen it
if (!text.equals(lastUrl) && Patterns.WEB_URL.matcher(text).find() && !text.equals(currentUrl)) {
Log.d(TAG, "New web url found: " + text);
lastUrl = currentUrl = text.toString();
displayClipboard(text);
}
} else {
hideClipboard();
}
}
private void displayClipboard(CharSequence url) {
clipboardLinkView.setText(url);
showClipboard();
// Hide link after a while
handler.removeCallbacks(hideRunnable);
handler.postDelayed(hideRunnable, LINK_TIMEOUT);
}
private void showClipboard() {
getFragmentManager().beginTransaction()
.show(this)
.commit();
}
private void hideClipboard() {
currentUrl = null;
getFragmentManager().beginTransaction()
.hide(this)
.commit();
}
private Runnable hideRunnable = new Runnable() {
@Override
public void run() {
hideClipboard();
}
};
/*
private void showClipboard() {
// Animate transition
final ViewGroup parent = (ViewGroup) clipboardDisplay.getParent();
parent.startViewTransition(clipboardDisplay);
parent.removeView(clipboardDisplay);
clipboardDisplay.setAlpha(0f);
clipboardDisplay.setVisibility(View.VISIBLE);
clipboardDisplay.animate()
.alpha(1f)
.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
parent.endViewTransition(clipboardDisplay);
parent.addView(clipboardDisplay);
}
});
}
private void hideClipboard() {
// Animate transition
final ViewGroup parent = (ViewGroup) clipboardDisplay.getParent();
parent.startViewTransition(clipboardDisplay);
parent.removeView(clipboardDisplay);
clipboardDisplay.animate()
.alpha(0f)
.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
clipboardDisplay.setVisibility(View.GONE);
parent.endViewTransition(clipboardDisplay);
parent.addView(clipboardDisplay);
}
});
}
*/
private void saveClipboardLink() {
Intent intent = new Intent(Intent.ACTION_SEND, null, getActivity(), AddBookmarkActivity.class)
.putExtra(Intent.EXTRA_TEXT, currentUrl);
startActivity(intent);
}
}