All Downloads are FREE. Search and download functionalities are using the official Maven repository.

jadex.android.controlcenter.settings.AwarenessSettings Maven / Gradle / Ivy

Go to download

The Jadex rules tools package contains tools for the Jadex active components infrastructure.

The newest version!
package jadex.android.controlcenter.settings;

import jadex.android.controlcenter.preference.DiscoveryPreference;
import jadex.android.controlcenter.preference.JadexBooleanPreference;
import jadex.android.controlcenter.preference.JadexIntegerPreference;
import jadex.android.controlcenter.preference.LongClickablePreference;
import jadex.bridge.IComponentIdentifier;
import jadex.bridge.IExternalAccess;
import jadex.bridge.modelinfo.SubcomponentTypeInfo;
import jadex.bridge.service.types.awareness.DiscoveryInfo;
import jadex.commons.future.DefaultResultListener;
import jadex.commons.future.ThreadSuspendable;
import jadex.platform.service.awareness.management.AwarenessManagementAgent;
import jadex.platform.service.awareness.management.AwarenessManagementAgentHelper;
import jadex.platform.service.awareness.management.AwarenessSettingsData;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;

import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.DialogInterface;
import android.os.Handler;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceChangeListener;
import android.preference.Preference.OnPreferenceClickListener;
import android.preference.PreferenceCategory;
import android.preference.PreferenceScreen;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;

/**
 * Settings implementation for {@link AwarenessManagementAgent}.
 */
public class AwarenessSettings extends AComponentSettings implements OnPreferenceChangeListener
{

	/** Handler to change UI objects from non-ui threads. */
	private Handler uiHandler;

	/** Id of the platform to be configured. */
	private IComponentIdentifier platformId;

	// UI members
	private JadexBooleanPreference cbautoCreate;
	private JadexBooleanPreference cbautoDelete;
	private JadexIntegerPreference spdelay;
	private JadexBooleanPreference cbfast;
	private JadexBooleanPreference[] cbmechanisms;
	private PreferenceCategory infoCat;
	private PreferenceScreen screen;

	private AwarenessManagementAgentHelper helper;

	private List excludes;
	private List includes;

	private PreferenceCategory inexcludeCat;

	/** Enum for preference keys */
	private enum PREFKEYS
	{
		FAST, DELAY, AUTOCREATE, AUTODELETE, INEXCLUDES
	}

	public AwarenessSettings(IExternalAccess extAcc)
	{
		super(extAcc);
		helper = new AwarenessManagementAgentHelper(extAcc);
		includes = new ArrayList();
		excludes = new ArrayList();
	}

	public boolean onCreateOptionsMenu(Menu menu)
	{
		menu.add("Refresh");
		return true;
	}

	public boolean onOptionsItemSelected(MenuItem item)
	{
		refreshSettings();
		refreshDiscoveryMechanisms();
		refreshDiscoveryInfos();
		return true;
	}
	
	public void onOptionsMenuClosed(Menu menu)
	{
	}

	public void onDestroy()
	{
	}

	protected void createPreferenceHierarchy(final PreferenceScreen screen)
	{
		this.screen = screen;
		uiHandler = new Handler();

		// --- Proxy Settings ---
		PreferenceCategory proxyCat = new PreferenceCategory(screen.getContext());
		screen.addPreference(proxyCat);
		proxyCat.setTitle("Proxy Settings");

		cbautoCreate = new JadexBooleanPreference(screen.getContext());
		cbautoCreate.setTitle("Create On Discovery");
		cbautoCreate.setKey(PREFKEYS.FAST.toString());
		cbautoCreate.setOnPreferenceChangeListener(this);
		cbautoCreate.setEnabled(false);
		proxyCat.addPreference(cbautoCreate);

		cbautoDelete = new JadexBooleanPreference(screen.getContext());
		cbautoDelete.setTitle("Delete On Disappearance");
		cbautoDelete.setKey(PREFKEYS.AUTODELETE.toString());
		cbautoDelete.setOnPreferenceChangeListener(this);
		cbautoDelete.setEnabled(false);
		proxyCat.addPreference(cbautoDelete);

		// --- Discovery Settings ---
		PreferenceCategory discoveryCat = new PreferenceCategory(screen.getContext());
		screen.addPreference(discoveryCat);
		discoveryCat.setTitle("Discovery Settings");

		spdelay = new JadexIntegerPreference(screen.getContext());
		spdelay.setTitle("Info send delay");
		spdelay.setKey(PREFKEYS.DELAY.toString());
		spdelay.setOnPreferenceChangeListener(this);
		spdelay.setEnabled(false);
		discoveryCat.addPreference(spdelay);

		cbfast = new JadexBooleanPreference(screen.getContext());
		cbfast.setTitle("Fast startup awareness");
		cbfast.setKey(PREFKEYS.FAST.toString());
		cbfast.setOnPreferenceChangeListener(this);
		cbfast.setEnabled(false);
		discoveryCat.addPreference(cbfast);

		// --- Discovery Mechanisms ---
		PreferenceScreen mechanismsCat = screen.getPreferenceManager().createPreferenceScreen(screen.getContext());
		// PreferenceCategory mechanismsCat = new
		// PreferenceCategory(screen.getContext());
		screen.addPreference(mechanismsCat);
		mechanismsCat.setTitle("Discovery Mechanisms");

		SubcomponentTypeInfo[] dis = extAcc.getModel().getSubcomponentTypes();
		cbmechanisms = new JadexBooleanPreference[dis.length];
		for (int i = 0; i < dis.length; i++)
		{
			final JadexBooleanPreference disMechanism = new JadexBooleanPreference(screen.getContext());
			disMechanism.setEnabled(false);
			cbmechanisms[i] = disMechanism;
			final String disType = dis[i].getName();
			disMechanism.setTitle(disType);
			disMechanism.setKey(disType);
			disMechanism.setOnPreferenceClickListener(new OnPreferenceClickListener()
			{

				public boolean onPreferenceClick(Preference preference)
				{
					disMechanism.setEnabled(false);
					return true;
				}
			});
			disMechanism.setOnPreferenceChangeListener(new OnPreferenceChangeListener()
			{
				public boolean onPreferenceChange(Preference preference, Object newValue)
				{
					final boolean on = (Boolean) newValue;
					helper.setDiscoveryMechanismState(disType, on).addResultListener(new DefaultResultListener()
					{
						public void resultAvailable(Void result)
						{
							uiHandler.post(new Runnable()
							{
								public void run()
								{
									disMechanism.setEnabled(true);
								}
							});
						}

						@Override
						public void exceptionOccurred(Exception exception)
						{
							uiHandler.post(new Runnable()
							{
								public void run()
								{
									disMechanism.setEnabled(true);
									disMechanism.setChecked(!on);
									Toast.makeText(screen.getContext(), "Could not start Discovery Mechanism: " + disType, Toast.LENGTH_SHORT).show();
								}
							});
						}
					});

					return true;
				}
			});

			mechanismsCat.addPreference(disMechanism);
		}

		inexcludeCat = new PreferenceCategory(screen.getContext());
		screen.addPreference(inexcludeCat);
		inexcludeCat.setTitle("Includes/Excludes");
		inexcludeCat.setKey(PREFKEYS.INEXCLUDES.toString());

		infoCat = new PreferenceCategory(screen.getContext());
		screen.addPreference(infoCat);
		infoCat.setTitle("Discovery Info");

		refreshSettings();
		refreshDiscoveryMechanisms();
		refreshDiscoveryInfos();
	}

	/**
	 * Apply Discovery Mechanism settings to GUI.
	 */
	protected void refreshDiscoveryMechanisms()
	{
		for (JadexBooleanPreference mechanism : cbmechanisms)
		{
			mechanism.setEnabled(false);
		}
		helper.getActiveDiscoveryMechanisms().addResultListener(new DefaultResultListener>()
		{
			public void resultAvailable(final Set localtypes)
			{
				uiHandler.post(new Runnable()
				{
					public void run()
					{
						for (int i = 0; i < cbmechanisms.length; i++)
						{
							cbmechanisms[i].setChecked(localtypes.contains(cbmechanisms[i].getTitle()));
							cbmechanisms[i].setEnabled(true);
						}
					}
				});
			}
		});
	}

	/**
	 * Apply settings to GUI.
	 */
	protected void refreshSettings()
	{
		cbautoCreate.setEnabled(false);
		cbautoDelete.setEnabled(false);
		spdelay.setEnabled(false);
		cbfast.setEnabled(false);

		ThreadSuspendable sus = new ThreadSuspendable();

		AwarenessSettingsData settings = helper.getSettings().get(sus);

		cbautoCreate.setValue(settings.autocreate);
		cbautoDelete.setValue(settings.autodelete);

		long value = settings.delay / 1000;
		spdelay.setValue((int) value);
		cbfast.setChecked(settings.fast);
		// includes.setEntries(settings.includes);
		// excludes.setEntries(settings.excludes);

		cbautoCreate.setEnabled(true);
		cbautoDelete.setEnabled(true);
		spdelay.setEnabled(true);
		cbfast.setEnabled(true);

		this.includes.clear();
		this.excludes.clear();

		for (int i = 0; i < settings.includes.length; i++)
		{
			addInOrExclude(settings.includes[i], true);
		}
		for (int i = 0; i < settings.excludes.length; i++)
		{
			addInOrExclude(settings.excludes[i], false);
		}
	}

	private void addInOrExclude(String platform, boolean included)
	{
		LongClickablePreference includePref = new LongClickablePreference(inexcludeCat.getContext());
		includePref.setTitle(platform);
		if (included) {
			includes.add(platform);
			includePref.setSummary("included");
		} else {
			excludes.add(platform);
			includePref.setSummary("excluded");
		}
		includePref.setOnPreferenceLongClickListener(onInExcludeLongClickListener);
		includePref.setKey(platform);
		inexcludeCat.addPreference(includePref);
	}

	/**
	 * Refresh the discovery infos.
	 */
	protected void refreshDiscoveryInfos()
	{
		helper.getDiscoveryInfos().addResultListener(new DefaultResultListener()
		{

			@Override
			public void exceptionOccurred(Exception exception)
			{
				// sprefresh.setValue(new Integer(0));
			}

			public void resultAvailable(final DiscoveryInfo[] ds)
			{
				List newDisPrefs = new ArrayList();
				if (ds.length == 0)
				{
					final Preference dummyPref = new Preference(infoCat.getContext());
					dummyPref.setTitle("No Discovery Infos available.");
					newDisPrefs.add(dummyPref);
				} else
				{
					for (int i = 0; i < ds.length; i++)
					{
						final DiscoveryInfo info = ds[i];
						DiscoveryPreference disPref = new DiscoveryPreference(infoCat.getContext(), info);
						disPref.setOnPreferenceLongClickListener(onDiscoveryInfoLongClickListener);
						newDisPrefs.add(disPref);
					}
				}
				infoCat.removeAll();
				for (Preference disPref : newDisPrefs)
				{
					infoCat.addPreference(disPref);
				}
			}
		});
	}

	public boolean onPreferenceChange(Preference preference, Object newValue)
	{
		// local variable for XML transfer
		final AwarenessSettingsData settings = new AwarenessSettingsData();
		settings.delay = ((long) spdelay.getInt()) * 1000;
		settings.fast = cbfast.isChecked();
		settings.autocreate = cbautoCreate.isChecked();
		settings.autodelete = cbautoDelete.isChecked();
		settings.includes = this.includes.toArray(new String[this.includes.size()]);
		settings.excludes = this.excludes.toArray(new String[this.excludes.size()]);

		switch (PREFKEYS.valueOf(preference.getKey()))
		{
		case FAST:
			settings.fast = (Boolean) newValue;
			break;
		case AUTOCREATE:
			settings.autocreate = (Boolean) newValue;
			break;
		case AUTODELETE:
			settings.autodelete = (Boolean) newValue;
			break;
		case DELAY:
			settings.delay = ((Integer) newValue).longValue() * 1000;
			break;
		case INEXCLUDES:
			break;
		default:
			break;
		}

		helper.setSettings(settings);
		return true;
	}

	public void setPlatformId(IComponentIdentifier platformId)
	{
		this.platformId = platformId;
	}

	private OnPreferenceClickListener onDiscoveryInfoLongClickListener = new OnPreferenceClickListener()
	{

		public boolean onPreferenceClick(Preference preference)
		{
			DiscoveryPreference pref = (DiscoveryPreference) preference;
			final DiscoveryInfo info = pref.getDiscoveryInfo();

			Builder builder = new AlertDialog.Builder(pref.getContext());
			String addRemoveProxyText;
			if (info.proxy == null)
			{
				addRemoveProxyText = "Add local Proxy";
			} else
			{
				addRemoveProxyText = "Remove local Proxy";
			}
			CharSequence[] items = 
					new CharSequence[] { addRemoveProxyText, "Add to excludes", "Add to includes" };
			
			builder.setItems(items, new DialogInterface.OnClickListener()
			{

				public void onClick(DialogInterface dialog, int which)
				{
					switch (which)
					{
					case 0: // add/remove proxy
						final Boolean create = (info.proxy == null);

						final IComponentIdentifier proxy = info.getProxy() != null && info.getProxy().isDone() && info.getProxy().getException() == null ? info
								.getProxy().get(null) : null;
						if (create && info.getProxy() == null || !create && proxy != null)
						{
							// setting changed -> create or
							// delete proxy
							helper.createOrDeleteProxy(info.getComponentIdentifier(), create).addResultListener(new DefaultResultListener()
							{
								public void exceptionOccurred(Exception exception)
								{
									exception.printStackTrace();
									uiHandler.post(new Runnable()
									{
										public void run()
										{
											Toast.makeText(screen.getContext(), "Could not start/stop Proxy for " + info.getComponentIdentifier(),
													Toast.LENGTH_LONG).show();
										}
									});
								};

								public void resultAvailable(Void result)
								{
									refreshDiscoveryInfos();
								}
							});
						}
						break;
					case 1: // add to excludes
						addInOrExclude(info.getComponentIdentifier().getPlatformPrefix(), false);
						onPreferenceChange(inexcludeCat, null);
						break;
					case 2: // add to includes
						addInOrExclude(info.getComponentIdentifier().getPlatformPrefix(), true);
						onPreferenceChange(inexcludeCat, null);
						break;
					default:
						break;
					}
				}

			});
			AlertDialog dialog = builder.create();
			dialog.show();

			return true;
		}
	};

	private OnPreferenceClickListener onInExcludeLongClickListener = new OnPreferenceClickListener()
	{

		public boolean onPreferenceClick(Preference p)
		{
			Builder builder = new AlertDialog.Builder(p.getContext());
			final CharSequence platformPrefix = p.getTitle();
			CharSequence summary = p.getSummary();
			builder.setMessage("Delete " + summary.subSequence(0, summary.length()-1) + " for " + platformPrefix + "?").setCancelable(false)
					.setPositiveButton("Yes", new DialogInterface.OnClickListener()
					{
						public void onClick(DialogInterface dialog, int id)
						{
							inexcludeCat.removePreference(inexcludeCat.findPreference(platformPrefix));
							includes.remove(platformPrefix);
							excludes.remove(platformPrefix);
							onPreferenceChange(inexcludeCat, null);
						}
					}).setNegativeButton("No", new DialogInterface.OnClickListener()
					{
						public void onClick(DialogInterface dialog, int id)
						{
							dialog.cancel();
						}
					});

			builder.create().show();
			
			return true;
		}
	};
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy