package com.freerdp.freerdpcore.utils;

import android.annotation.TargetApi;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.os.Build.VERSION;
import android.os.Build.VERSION_CODES;

public abstract class ClipboardManagerProxy
{

	public static ClipboardManagerProxy getClipboardManager(Context ctx)
	{
		if (VERSION.SDK_INT < VERSION_CODES.HONEYCOMB)
			return new PreHCClipboardManager(ctx);
		else
			return new HCClipboardManager(ctx);
	}

	public abstract void setClipboardData(String data);

	public abstract void addClipboardChangedListener(OnClipboardChangedListener listener);

	public abstract void removeClipboardboardChangedListener(OnClipboardChangedListener listener);

	public static interface OnClipboardChangedListener {
		void onClipboardChanged(String data);
	}

	private static class PreHCClipboardManager extends ClipboardManagerProxy
	{

		public PreHCClipboardManager(Context ctx)
		{
		}

		@Override public void setClipboardData(String data)
		{
		}

		@Override public void addClipboardChangedListener(OnClipboardChangedListener listener)
		{
		}

		@Override
		public void removeClipboardboardChangedListener(OnClipboardChangedListener listener)
		{
		}
	}

	@TargetApi(11)
	private static class HCClipboardManager
	    extends ClipboardManagerProxy implements ClipboardManager.OnPrimaryClipChangedListener
	{
		private ClipboardManager mClipboardManager;
		private OnClipboardChangedListener mListener;

		public HCClipboardManager(Context ctx)
		{
			mClipboardManager = (ClipboardManager)ctx.getSystemService(Context.CLIPBOARD_SERVICE);
		}

		@Override public void setClipboardData(String data)
		{
			mClipboardManager.setPrimaryClip(
			    ClipData.newPlainText("rdp-clipboard", data == null ? "" : data));
		}

		@Override public void onPrimaryClipChanged()
		{
			ClipData clip = mClipboardManager.getPrimaryClip();
			String data = null;

			if (clip != null && clip.getItemCount() > 0)
			{
				CharSequence cs = clip.getItemAt(0).getText();
				if (cs != null)
					data = cs.toString();
			}
			if (mListener != null)
			{
				mListener.onClipboardChanged(data);
			}
		}

		@Override public void addClipboardChangedListener(OnClipboardChangedListener listener)
		{
			mListener = listener;
			mClipboardManager.addPrimaryClipChangedListener(this);
		}

		@Override
		public void removeClipboardboardChangedListener(OnClipboardChangedListener listener)
		{
			mListener = null;
			mClipboardManager.removePrimaryClipChangedListener(this);
		}
	}
}
