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
) {
264 i
= new Intent(CommandReceiver
.ACTION_INFO
);
266 i
.putExtra(EXTRAS_CONNECTOR
, this.getBundle());
271 * @return internal bundle
273 public Bundle
getBundle() {
280 public String
getID() {
281 return this.bundle
.getString(ID
);
287 public String
getName() {
288 return this.bundle
.getString(NAME
);
297 public void setName(final String name
) {
298 this.bundle
.putString(NAME
, name
);
304 public short getStatus() {
305 return this.bundle
.getShort(STATUS
, STATUS_INACTIVE
);
314 public void setStatus(final short status
) {
315 this.bundle
.putShort(STATUS
, status
);
324 public void addStatus(final short status
) {
325 this.setStatus(status
| this.getStatus());
334 public void setStatus(final int status
) {
335 this.bundle
.putShort(STATUS
, (short) status
);
341 public void setReady() {
342 this.setStatus(STATUS_ENABLED
| STATUS_READY
);
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
;
358 public String
getAuthor() {
359 return this.bundle
.getString(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
);
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
);
402 public void setPrefsTitle(final String prefsTitle
) {
403 this.bundle
.putString(PREFSTITLE
, prefsTitle
);
409 public String
getBalance() {
410 return this.bundle
.getString(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
);
433 * @param capabilities
436 public void setCapabilities(final short capabilities
) {
437 this.bundle
.putShort(CAPABILITIES
, capabilities
);
443 * @param capabilities
446 public void setCapabilities(final int capabilities
) {
447 this.setCapabilities((short) capabilities
);
451 * @param 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
;
463 * @return error message
465 public String
getErrorMessage() {
466 return this.bundle
.getString(ERRORMESSAGE
);
475 public void setErrorMessage(final String error
) {
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
));
496 * Get SubConnector by 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())) {
515 * Add a SubConnector.
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.
542 public void addSubConnector(final String id
, final String name
,
543 final int features
) {
544 this.addSubConnector(id
, name
, (short) features
);