UNTESTED: task and service should be done
[andGMXsms.git] / src / de / ub0r / android / websms / connector / common / ConnectorSpec.java
blob1191036d1fa60c64774774865fd73f2a83e1f907
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 i = intent;
263 if (i == null) {
264 i = new Intent(CommandReceiver.ACTION_INFO);
266 i.putExtra(EXTRAS_CONNECTOR, this.getBundle());
267 return i;
271 * @return internal bundle
273 public Bundle getBundle() {
274 return this.bundle;
278 * @return ID
280 public String getID() {
281 return this.bundle.getString(ID);
285 * @return Name
287 public String getName() {
288 return this.bundle.getString(NAME);
292 * Set name.
294 * @param name
295 * name
297 public void setName(final String name) {
298 this.bundle.putString(NAME, name);
302 * @return status
304 public short getStatus() {
305 return this.bundle.getShort(STATUS, STATUS_INACTIVE);
309 * Set status.
311 * @param status
312 * status
314 public void setStatus(final short status) {
315 this.bundle.putShort(STATUS, status);
319 * Add status.
321 * @param status
322 * status
324 public void addStatus(final short status) {
325 this.setStatus(status | this.getStatus());
329 * Set status.
331 * @param status
332 * status
334 public void setStatus(final int status) {
335 this.bundle.putShort(STATUS, (short) status);
339 * Set status: ready.
341 public void setReady() {
342 this.setStatus(STATUS_ENABLED | STATUS_READY);
346 * @param status
347 * status
348 * @return true if connector has given status
350 public boolean hasStatus(final short status) {
351 final short s = this.bundle.getShort(STATUS, STATUS_INACTIVE);
352 return (s & status) == status;
356 * @return author
358 public String getAuthor() {
359 return this.bundle.getString(AUTHOR);
363 * Set author.
365 * @param author
366 * author
368 public void setAuthor(final String author) {
369 this.bundle.putString(AUTHOR, author);
373 * @return prefs intent uri
375 public String getPrefsIntent() {
376 return this.bundle.getString(PREFSINTENT);
380 * Set prefs intent.
382 * @param prefsIntent
383 * prefs intent
385 public void setPrefsIntent(final String prefsIntent) {
386 this.bundle.putString(PREFSINTENT, prefsIntent);
390 * @return prefs title
392 public String getPrefsTitle() {
393 return this.bundle.getString(PREFSTITLE);
397 * Set prefs title.
399 * @param prefsTitle
400 * prefs title
402 public void setPrefsTitle(final String prefsTitle) {
403 this.bundle.putString(PREFSTITLE, prefsTitle);
407 * @return balance
409 public String getBalance() {
410 return this.bundle.getString(BALANCE);
414 * Set balance.
416 * @param balance
417 * balance
419 public void setBalance(final String balance) {
420 this.bundle.putString(BALANCE, balance);
424 * @return capabilities
426 public short getCapabilities() {
427 return this.bundle.getShort(CAPABILITIES, CAPABILITIES_NONE);
431 * Set capabilities.
433 * @param capabilities
434 * capabilities
436 public void setCapabilities(final short capabilities) {
437 this.bundle.putShort(CAPABILITIES, capabilities);
441 * Set capabilities.
443 * @param capabilities
444 * capabilities
446 public void setCapabilities(final int capabilities) {
447 this.setCapabilities((short) capabilities);
451 * @param capabilities
452 * capabilities
453 * @return true if connector has given capabilities
455 public boolean hasCapabilities(final short capabilities) {
456 final short c = this.bundle.getShort(CAPABILITIES, CAPABILITIES_NONE);
457 return (c & capabilities) == capabilities;
461 * Get error message.
463 * @return error message
465 public String getErrorMessage() {
466 return this.bundle.getString(ERRORMESSAGE);
470 * Set error message.
472 * @param error
473 * error message
475 public void setErrorMessage(final String error) {
476 if (error != null) {
477 this.addStatus(STATUS_ERROR);
479 this.bundle.putString(ERRORMESSAGE, error);
483 * @return all SubConnectors
485 public SubConnectorSpec[] getSubConnectors() {
486 final int c = this.bundle.getInt(SUB_COUNT, 0);
487 final SubConnectorSpec[] ret = new SubConnectorSpec[c];
488 for (int i = 0; i < c; i++) {
489 ret[i] = new SubConnectorSpec(// .
490 this.bundle.getBundle(SUB_PREFIX + i));
492 return ret;
496 * Get SubConnector by ID.
498 * @param id
499 * ID
500 * @return SubConnector
502 public SubConnectorSpec getSubConnector(final String id) {
503 final int c = this.bundle.getInt(SUB_COUNT, 0);
504 for (int i = 0; i < c; i++) {
505 final SubConnectorSpec sc = new SubConnectorSpec(this.bundle
506 .getBundle(SUB_PREFIX + i));
507 if (id.equals(sc.getID())) {
508 return sc;
511 return null;
515 * Add a SubConnector.
517 * @param id
518 * id
519 * @param name
520 * name
521 * @param features
522 * features
524 public void addSubConnector(final String id, final String name,
525 final short features) {
526 final int c = this.bundle.getInt(SUB_COUNT, 0);
527 this.bundle.putBundle(SUB_PREFIX + c, new SubConnectorSpec(id, name,
528 features).getBundle());
529 this.bundle.putInt(SUB_COUNT, c + 1);
533 * Add a SubConnector.
535 * @param id
536 * id
537 * @param name
538 * name
539 * @param features
540 * features
542 public void addSubConnector(final String id, final String name,
543 final int features) {
544 this.addSubConnector(id, name, (short) features);