add CommandReceiver
[andGMXsms.git] / src / de / ub0r / android / websms / connector / common / ConnectorSpec.java
blob89506530dddb1bcd1a5866bcfb21658658a5e44e
1 /*
2 * Copyright (C) 2010 Felix Bechstein
3 *
4 * This file is part of WebSMS.
5 *
6 * This program is free software; you can redistribute it and/or modify it under
7 * the terms of the GNU General Public License as published by the Free Software
8 * Foundation; either version 3 of the License, or (at your option) any later
9 * version.
11 * This program is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
13 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
14 * details.
16 * You should have received a copy of the GNU General Public License along with
17 * this program; If not, see <http://www.gnu.org/licenses/>.
20 package de.ub0r.android.websms.connector.common;
22 import android.content.Intent;
23 import android.os.Bundle;
25 /**
26 * ConnectorSpec presents all necessary informations to use a connector.
28 * @author flx
30 public final class ConnectorSpec {
32 /** Key to find a connector in a Bundle. */
33 private static final String EXTRAS_CONNECTOR = "connector";
35 /** Connector: ID. */
36 private static final String ID = "connector_id";
37 /** Connector: ID. */
38 private static final String NAME = "connector_name";
39 /** Connector: Status. */
40 private static final String STATUS = "connector_status";
41 /** Connector: Status: inactive. */
42 public static final short STATUS_INACTIVE = 0;
43 /** Connector: Status: enabled. */
44 public static final short STATUS_ENABLED = 1;
45 /** Connector: Status: ready. */
46 public static final short STATUS_READY = 2;
47 /** Connector: Status: bootstrapping. */
48 public static final short STATUS_BOOTSTRAPPING = 4;
49 /** Connector: Status: updating. */
50 public static final short STATUS_UPDATING = 8;
51 /** Connector: Status: sending. */
52 public static final short STATUS_SENDING = 16;
53 /** Connector: Status: error. */
54 public static final short STATUS_ERROR = 32;
55 /** Connector: Author. */
56 private static final String AUTHOR = "connector_author";
57 /** Connector: Preferences' intent URI. */
58 private static final String PREFSINTENT = "connector_prefsintent";
59 /** Connector: Preferences' title. */
60 private static final String PREFSTITLE = "connector_prefstitle";
61 /** Connector: Capabilities. */
62 private static final String CAPABILITIES = "connector_capabilities";
63 /** Feature: none. */
64 public static final short CAPABILITIES_NONE = 0;
65 /** Feature: bootstrap. */
66 public static final short CAPABILITIES_BOOSTRAP = 1;
67 /** Feature: update. */
68 public static final short CAPABILITIES_UPDATE = 2;
69 /** Feature: send. */
70 public static final short CAPABILITIES_SEND = 4;
71 /** Connector: Balance. */
72 private static final String BALANCE = "connector_balance";
73 /** Connector: Error message. */
74 private static final String ERRORMESSAGE = "connector_errormessage";
76 // Subconnectors
77 /** Connector: SubConnector prefix. */
78 private static final String SUB_PREFIX = "sub_";
79 /** Connector: number of subconnectors. */
80 private static final String SUB_COUNT = SUB_PREFIX + "n";
82 /**
83 * SubConnectorSpec presents all necessary informations to use a
84 * subconnector.
86 * @author flx
88 public final class SubConnectorSpec {
89 /** Connector: ID. */
90 private static final String ID = "subconnector_id";
91 /** Connector: name. */
92 private static final String NAME = "subconnector_name";
93 /** Connector: features. */
94 private static final String FEATURES = "subconnector_features";
95 /** Feature: none. */
96 public static final short FEATURE_NONE = 0;
97 /** Feature: multiple recipients. */
98 public static final short FEATURE_MULTIRECIPIENTS = 1;
99 /** Feature: flash sms. */
100 public static final short FEATURE_FLASHSMS = 2;
101 /** Feature: send later. */
102 public static final short FEATURE_SENDLATER = 4;
103 /** Feature: custom sender. */
104 public static final short FEATURE_CUSTOMSENDER = 8;
106 /** {@link Bundle} represents the SubConnectorSpec. */
107 private final Bundle bundle;
110 * Create SubConnectorSpec from bundle.
112 * @param b
113 * bundle
115 SubConnectorSpec(final Bundle b) {
116 this.bundle = b;
120 * Create SubConnectorSpec.
122 * @param id
123 * id
124 * @param name
125 * name
126 * @param features
127 * features
129 SubConnectorSpec(final String id, final String name,
130 final short features) {
131 this.bundle = new Bundle();
132 this.bundle.putString(ID, id);
133 this.bundle.putString(NAME, name);
134 this.bundle.putShort(FEATURES, features);
138 * @return internal bundle
140 Bundle getBundle() {
141 return this.bundle;
145 * @return ID
147 public String getID() {
148 return this.bundle.getString(ID);
152 * @return name
154 public String getName() {
155 return this.bundle.getString(NAME);
159 * @return features
161 public short getFeatures() {
162 return this.bundle.getShort(FEATURES, FEATURE_NONE);
166 * @param features
167 * features
168 * @return true if connector has given features
170 public boolean hasFeatures(final short features) {
171 final short f = this.bundle.getShort(FEATURES, FEATURE_NONE);
172 return (f & features) == features;
176 /** {@link Bundle} represents the ConnectorSpec. */
177 private final Bundle bundle;
180 * Create ConnectorSpec from intent.
182 * @param i
183 * intent
185 public ConnectorSpec(final Intent i) {
186 Bundle e = i.getExtras();
187 if (e != null) {
188 this.bundle = e.getBundle(EXTRAS_CONNECTOR);
189 } else {
190 this.bundle = new Bundle();
195 * Create ConnectorSpec.
197 * @param id
198 * ID
199 * @param name
200 * name
202 public ConnectorSpec(final String id, final String name) {
203 this.bundle = new Bundle();
204 this.bundle.putString(ID, id);
205 this.bundle.putString(NAME, name);
209 * Update ConnectorSpecs.
211 * @param connector
212 * {@link ConnectorSpec}
214 public void update(final ConnectorSpec connector) {
215 this.bundle.putAll(connector.getBundle());
219 * @return name.
221 @Override
222 public String toString() {
223 return this.getName();
227 * Does nothing. {@inheritDoc}
229 @Override
230 public int hashCode() {
231 return 0;
235 * @param connector
236 * {@link ConnectorSpec} or {@link String}
237 * @return true if this connector has the same id as connector
239 @Override
240 public boolean equals(final Object connector) {
241 if (this == connector) {
242 return true;
243 } else if (connector == null) {
244 return false;
245 } else if (connector instanceof ConnectorSpec) {
246 return this.getID().equals(((ConnectorSpec) connector).getID());
247 } else if (connector instanceof String) {
248 return this.getID().equals(connector);
249 } else {
250 return false;
255 * Set this {@link ConnectorSpec} to an {@link Intent}.
257 * @param intent
258 * {@link Intent}.
259 * @return the same {@link Intent}
261 public Intent setToIntent(final Intent intent) {
262 intent.putExtra(EXTRAS_CONNECTOR, this.getBundle());
263 return intent;
267 * @return internal bundle
269 public Bundle getBundle() {
270 return this.bundle;
274 * @return ID
276 public String getID() {
277 return this.bundle.getString(ID);
281 * @return Name
283 public String getName() {
284 return this.bundle.getString(NAME);
288 * Set name.
290 * @param name
291 * name
293 public void setName(final String name) {
294 this.bundle.putString(NAME, name);
298 * @return status
300 public short getStatus() {
301 return this.bundle.getShort(STATUS, STATUS_INACTIVE);
305 * Set status.
307 * @param status
308 * status
310 public void setStatus(final short status) {
311 this.bundle.putShort(STATUS, status);
315 * Add status.
317 * @param status
318 * status
320 public void addStatus(final short status) {
321 this.setStatus(status | this.getStatus());
325 * Set status.
327 * @param status
328 * status
330 public void setStatus(final int status) {
331 this.bundle.putShort(STATUS, (short) status);
335 * Set status: ready.
337 public void setReady() {
338 this.setStatus(STATUS_ENABLED | STATUS_READY);
342 * @param status
343 * status
344 * @return true if connector has given status
346 public boolean hasStatus(final short status) {
347 final short s = this.bundle.getShort(STATUS, STATUS_INACTIVE);
348 return (s & status) == status;
352 * @return author
354 public String getAuthor() {
355 return this.bundle.getString(AUTHOR);
359 * Set author.
361 * @param author
362 * author
364 public void setAuthor(final String author) {
365 this.bundle.putString(AUTHOR, author);
369 * @return prefs intent uri
371 public String getPrefsIntent() {
372 return this.bundle.getString(PREFSINTENT);
376 * Set prefs intent.
378 * @param prefsIntent
379 * prefs intent
381 public void setPrefsIntent(final String prefsIntent) {
382 this.bundle.putString(PREFSINTENT, prefsIntent);
386 * @return prefs title
388 public String getPrefsTitle() {
389 return this.bundle.getString(PREFSTITLE);
393 * Set prefs title.
395 * @param prefsTitle
396 * prefs title
398 public void setPrefsTitle(final String prefsTitle) {
399 this.bundle.putString(PREFSTITLE, prefsTitle);
403 * @return balance
405 public String getBalance() {
406 return this.bundle.getString(BALANCE);
410 * Set balance.
412 * @param balance
413 * balance
415 public void setBalance(final String balance) {
416 this.bundle.putString(BALANCE, balance);
420 * @return capabilities
422 public short getCapabilities() {
423 return this.bundle.getShort(CAPABILITIES, CAPABILITIES_NONE);
427 * Set capabilities.
429 * @param capabilities
430 * capabilities
432 public void setCapabilities(final short capabilities) {
433 this.bundle.putShort(CAPABILITIES, capabilities);
437 * Set capabilities.
439 * @param capabilities
440 * capabilities
442 public void setCapabilities(final int capabilities) {
443 this.setCapabilities((short) capabilities);
447 * @param capabilities
448 * capabilities
449 * @return true if connector has given capabilities
451 public boolean hasCapabilities(final short capabilities) {
452 final short c = this.bundle.getShort(CAPABILITIES, CAPABILITIES_NONE);
453 return (c & capabilities) == capabilities;
457 * Get error message.
459 * @return error message
461 public String getErrorMessage() {
462 return this.bundle.getString(ERRORMESSAGE);
466 * Set error message.
468 * @param error
469 * error message
471 public void setErrorMessage(final String error) {
472 if (error != null) {
473 this.addStatus(STATUS_ERROR);
475 this.bundle.putString(ERRORMESSAGE, error);
479 * @return all SubConnectors
481 public SubConnectorSpec[] getSubConnectors() {
482 final int c = this.bundle.getInt(SUB_COUNT, 0);
483 final SubConnectorSpec[] ret = new SubConnectorSpec[c];
484 for (int i = 0; i < c; i++) {
485 ret[i] = new SubConnectorSpec(// .
486 this.bundle.getBundle(SUB_PREFIX + i));
488 return ret;
492 * Get SubConnector by ID.
494 * @param id
495 * ID
496 * @return SubConnector
498 public SubConnectorSpec getSubConnector(final String id) {
499 final int c = this.bundle.getInt(SUB_COUNT, 0);
500 for (int i = 0; i < c; i++) {
501 final SubConnectorSpec sc = new SubConnectorSpec(this.bundle
502 .getBundle(SUB_PREFIX + i));
503 if (id.equals(sc.getID())) {
504 return sc;
507 return null;
511 * Add a SubConnector.
513 * @param id
514 * id
515 * @param name
516 * name
517 * @param features
518 * features
520 public void addSubConnector(final String id, final String name,
521 final short features) {
522 final int c = this.bundle.getInt(SUB_COUNT, 0);
523 this.bundle.putBundle(SUB_PREFIX + c, new SubConnectorSpec(id, name,
524 features).getBundle());
525 this.bundle.putInt(SUB_COUNT, c + 1);
529 * Add a SubConnector.
531 * @param id
532 * id
533 * @param name
534 * name
535 * @param features
536 * features
538 public void addSubConnector(final String id, final String name,
539 final int features) {
540 this.addSubConnector(id, name, (short) features);