2 * Copyright (C) 2010 Felix Bechstein
4 * This file is part of WebSMS.
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
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
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
;
26 * ConnectorSpec presents all necessary informations to use a connector.
30 public final class ConnectorSpec
{
32 /** Key to find a connector in a Bundle. */
33 private static final String EXTRAS_CONNECTOR
= "connector";
36 private static final String ID
= "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";
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;
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";
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";
83 * SubConnectorSpec presents all necessary informations to use a
88 public final class SubConnectorSpec
{
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";
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.
115 SubConnectorSpec(final Bundle b
) {
120 * Create SubConnectorSpec.
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
147 public String
getID() {
148 return this.bundle
.getString(ID
);
154 public String
getName() {
155 return this.bundle
.getString(NAME
);
161 public short getFeatures() {
162 return this.bundle
.getShort(FEATURES
, FEATURE_NONE
);
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.
185 public ConnectorSpec(final Intent i
) {
186 Bundle e
= i
.getExtras();
188 this.bundle
= e
.getBundle(EXTRAS_CONNECTOR
);
190 this.bundle
= new Bundle();
195 * Create ConnectorSpec.
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.
212 * {@link ConnectorSpec}
214 public void update(final ConnectorSpec connector
) {
215 this.bundle
.putAll(connector
.getBundle());
222 public String
toString() {
223 return this.getName();
227 * Does nothing. {@inheritDoc}
230 public int hashCode() {
236 * {@link ConnectorSpec} or {@link String}
237 * @return true if this connector has the same id as connector
240 public boolean equals(final Object connector
) {
241 if (this == connector
) {
243 } else if (connector
== null) {
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
);
255 * Set this {@link ConnectorSpec} to an {@link Intent}.
259 * @return the same {@link Intent}
261 public Intent
setToIntent(final Intent intent
) {
262 intent
.putExtra(EXTRAS_CONNECTOR
, this.getBundle());
267 * @return internal bundle
269 public Bundle
getBundle() {
276 public String
getID() {
277 return this.bundle
.getString(ID
);
283 public String
getName() {
284 return this.bundle
.getString(NAME
);
293 public void setName(final String name
) {
294 this.bundle
.putString(NAME
, name
);
300 public short getStatus() {
301 return this.bundle
.getShort(STATUS
, STATUS_INACTIVE
);
310 public void setStatus(final short status
) {
311 this.bundle
.putShort(STATUS
, status
);
320 public void addStatus(final short status
) {
321 this.setStatus(status
| this.getStatus());
330 public void setStatus(final int status
) {
331 this.bundle
.putShort(STATUS
, (short) status
);
337 public void setReady() {
338 this.setStatus(STATUS_ENABLED
| STATUS_READY
);
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
;
354 public String
getAuthor() {
355 return this.bundle
.getString(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
);
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
);
398 public void setPrefsTitle(final String prefsTitle
) {
399 this.bundle
.putString(PREFSTITLE
, prefsTitle
);
405 public String
getBalance() {
406 return this.bundle
.getString(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
);
429 * @param capabilities
432 public void setCapabilities(final short capabilities
) {
433 this.bundle
.putShort(CAPABILITIES
, capabilities
);
439 * @param capabilities
442 public void setCapabilities(final int capabilities
) {
443 this.setCapabilities((short) capabilities
);
447 * @param 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
;
459 * @return error message
461 public String
getErrorMessage() {
462 return this.bundle
.getString(ERRORMESSAGE
);
471 public void setErrorMessage(final String error
) {
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
));
492 * Get SubConnector by 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())) {
511 * Add a SubConnector.
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.
538 public void addSubConnector(final String id
, final String name
,
539 final int features
) {
540 this.addSubConnector(id
, name
, (short) features
);