diff --git a/.classpath b/.classpath
index 2c02e79..897c0c5 100644
--- a/.classpath
+++ b/.classpath
@@ -1,11 +1,11 @@
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.project b/.project
index fd881c8..353299a 100644
--- a/.project
+++ b/.project
@@ -1,17 +1,17 @@
-
-
- titanium-c2dm
-
-
-
-
-
- org.eclipse.jdt.core.javabuilder
-
-
-
-
-
- org.eclipse.jdt.core.javanature
-
-
+
+
+ titanium-c2dm
+
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+
+ org.eclipse.jdt.core.javanature
+
+
diff --git a/.settings/org.eclipse.jdt.apt.core.prefs b/.settings/org.eclipse.jdt.apt.core.prefs
index ad91ed7..7c53a32 100644
--- a/.settings/org.eclipse.jdt.apt.core.prefs
+++ b/.settings/org.eclipse.jdt.apt.core.prefs
@@ -1,7 +1,7 @@
-#Thu Sep 02 15:18:34 CDT 2010
-eclipse.preferences.version=1
-org.eclipse.jdt.apt.aptEnabled=true
-org.eclipse.jdt.apt.genSrcDir=.apt_generated
-org.eclipse.jdt.apt.reconcileEnabled=true
-
-org.eclipse.jdt.apt.processorOptions/kroll.jsonFile=c2dm.json
+#Thu Sep 02 15:18:34 CDT 2010
+eclipse.preferences.version=1
+org.eclipse.jdt.apt.aptEnabled=true
+org.eclipse.jdt.apt.genSrcDir=.apt_generated
+org.eclipse.jdt.apt.reconcileEnabled=true
+
+org.eclipse.jdt.apt.processorOptions/kroll.jsonFile=c2dm.json
diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs
index 2595d34..51f8fc4 100644
--- a/.settings/org.eclipse.jdt.core.prefs
+++ b/.settings/org.eclipse.jdt.core.prefs
@@ -1,3 +1,3 @@
-#Thu Sep 02 15:18:34 CDT 2010
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.processAnnotations=enabled
+#Thu Sep 02 15:18:34 CDT 2010
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.processAnnotations=enabled
diff --git a/LICENSE b/LICENSE
index 181ff01..eb59e4c 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,502 +1 @@
- GNU LESSER GENERAL PUBLIC LICENSE
- Version 2.1, February 1999
-
- Copyright (C) 1991, 1999 Free Software Foundation, Inc.
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-[This is the first released version of the Lesser GPL. It also counts
- as the successor of the GNU Library Public License, version 2, hence
- the version number 2.1.]
-
- Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-Licenses are intended to guarantee your freedom to share and change
-free software--to make sure the software is free for all its users.
-
- This license, the Lesser General Public License, applies to some
-specially designated software packages--typically libraries--of the
-Free Software Foundation and other authors who decide to use it. You
-can use it too, but we suggest you first think carefully about whether
-this license or the ordinary General Public License is the better
-strategy to use in any particular case, based on the explanations below.
-
- When we speak of free software, we are referring to freedom of use,
-not price. Our General Public Licenses are designed to make sure that
-you have the freedom to distribute copies of free software (and charge
-for this service if you wish); that you receive source code or can get
-it if you want it; that you can change the software and use pieces of
-it in new free programs; and that you are informed that you can do
-these things.
-
- To protect your rights, we need to make restrictions that forbid
-distributors to deny you these rights or to ask you to surrender these
-rights. These restrictions translate to certain responsibilities for
-you if you distribute copies of the library or if you modify it.
-
- For example, if you distribute copies of the library, whether gratis
-or for a fee, you must give the recipients all the rights that we gave
-you. You must make sure that they, too, receive or can get the source
-code. If you link other code with the library, you must provide
-complete object files to the recipients, so that they can relink them
-with the library after making changes to the library and recompiling
-it. And you must show them these terms so they know their rights.
-
- We protect your rights with a two-step method: (1) we copyright the
-library, and (2) we offer you this license, which gives you legal
-permission to copy, distribute and/or modify the library.
-
- To protect each distributor, we want to make it very clear that
-there is no warranty for the free library. Also, if the library is
-modified by someone else and passed on, the recipients should know
-that what they have is not the original version, so that the original
-author's reputation will not be affected by problems that might be
-introduced by others.
-
- Finally, software patents pose a constant threat to the existence of
-any free program. We wish to make sure that a company cannot
-effectively restrict the users of a free program by obtaining a
-restrictive license from a patent holder. Therefore, we insist that
-any patent license obtained for a version of the library must be
-consistent with the full freedom of use specified in this license.
-
- Most GNU software, including some libraries, is covered by the
-ordinary GNU General Public License. This license, the GNU Lesser
-General Public License, applies to certain designated libraries, and
-is quite different from the ordinary General Public License. We use
-this license for certain libraries in order to permit linking those
-libraries into non-free programs.
-
- When a program is linked with a library, whether statically or using
-a shared library, the combination of the two is legally speaking a
-combined work, a derivative of the original library. The ordinary
-General Public License therefore permits such linking only if the
-entire combination fits its criteria of freedom. The Lesser General
-Public License permits more lax criteria for linking other code with
-the library.
-
- We call this license the "Lesser" General Public License because it
-does Less to protect the user's freedom than the ordinary General
-Public License. It also provides other free software developers Less
-of an advantage over competing non-free programs. These disadvantages
-are the reason we use the ordinary General Public License for many
-libraries. However, the Lesser license provides advantages in certain
-special circumstances.
-
- For example, on rare occasions, there may be a special need to
-encourage the widest possible use of a certain library, so that it becomes
-a de-facto standard. To achieve this, non-free programs must be
-allowed to use the library. A more frequent case is that a free
-library does the same job as widely used non-free libraries. In this
-case, there is little to gain by limiting the free library to free
-software only, so we use the Lesser General Public License.
-
- In other cases, permission to use a particular library in non-free
-programs enables a greater number of people to use a large body of
-free software. For example, permission to use the GNU C Library in
-non-free programs enables many more people to use the whole GNU
-operating system, as well as its variant, the GNU/Linux operating
-system.
-
- Although the Lesser General Public License is Less protective of the
-users' freedom, it does ensure that the user of a program that is
-linked with the Library has the freedom and the wherewithal to run
-that program using a modified version of the Library.
-
- The precise terms and conditions for copying, distribution and
-modification follow. Pay close attention to the difference between a
-"work based on the library" and a "work that uses the library". The
-former contains code derived from the library, whereas the latter must
-be combined with the library in order to run.
-
- GNU LESSER GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License Agreement applies to any software library or other
-program which contains a notice placed by the copyright holder or
-other authorized party saying it may be distributed under the terms of
-this Lesser General Public License (also called "this License").
-Each licensee is addressed as "you".
-
- A "library" means a collection of software functions and/or data
-prepared so as to be conveniently linked with application programs
-(which use some of those functions and data) to form executables.
-
- The "Library", below, refers to any such software library or work
-which has been distributed under these terms. A "work based on the
-Library" means either the Library or any derivative work under
-copyright law: that is to say, a work containing the Library or a
-portion of it, either verbatim or with modifications and/or translated
-straightforwardly into another language. (Hereinafter, translation is
-included without limitation in the term "modification".)
-
- "Source code" for a work means the preferred form of the work for
-making modifications to it. For a library, complete source code means
-all the source code for all modules it contains, plus any associated
-interface definition files, plus the scripts used to control compilation
-and installation of the library.
-
- Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running a program using the Library is not restricted, and output from
-such a program is covered only if its contents constitute a work based
-on the Library (independent of the use of the Library in a tool for
-writing it). Whether that is true depends on what the Library does
-and what the program that uses the Library does.
-
- 1. You may copy and distribute verbatim copies of the Library's
-complete source code as you receive it, in any medium, provided that
-you conspicuously and appropriately publish on each copy an
-appropriate copyright notice and disclaimer of warranty; keep intact
-all the notices that refer to this License and to the absence of any
-warranty; and distribute a copy of this License along with the
-Library.
-
- You may charge a fee for the physical act of transferring a copy,
-and you may at your option offer warranty protection in exchange for a
-fee.
-
- 2. You may modify your copy or copies of the Library or any portion
-of it, thus forming a work based on the Library, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
- a) The modified work must itself be a software library.
-
- b) You must cause the files modified to carry prominent notices
- stating that you changed the files and the date of any change.
-
- c) You must cause the whole of the work to be licensed at no
- charge to all third parties under the terms of this License.
-
- d) If a facility in the modified Library refers to a function or a
- table of data to be supplied by an application program that uses
- the facility, other than as an argument passed when the facility
- is invoked, then you must make a good faith effort to ensure that,
- in the event an application does not supply such function or
- table, the facility still operates, and performs whatever part of
- its purpose remains meaningful.
-
- (For example, a function in a library to compute square roots has
- a purpose that is entirely well-defined independent of the
- application. Therefore, Subsection 2d requires that any
- application-supplied function or table used by this function must
- be optional: if the application does not supply it, the square
- root function must still compute square roots.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Library,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Library, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote
-it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Library.
-
-In addition, mere aggregation of another work not based on the Library
-with the Library (or with a work based on the Library) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
- 3. You may opt to apply the terms of the ordinary GNU General Public
-License instead of this License to a given copy of the Library. To do
-this, you must alter all the notices that refer to this License, so
-that they refer to the ordinary GNU General Public License, version 2,
-instead of to this License. (If a newer version than version 2 of the
-ordinary GNU General Public License has appeared, then you can specify
-that version instead if you wish.) Do not make any other change in
-these notices.
-
- Once this change is made in a given copy, it is irreversible for
-that copy, so the ordinary GNU General Public License applies to all
-subsequent copies and derivative works made from that copy.
-
- This option is useful when you wish to copy part of the code of
-the Library into a program that is not a library.
-
- 4. You may copy and distribute the Library (or a portion or
-derivative of it, under Section 2) in object code or executable form
-under the terms of Sections 1 and 2 above provided that you accompany
-it with the complete corresponding machine-readable source code, which
-must be distributed under the terms of Sections 1 and 2 above on a
-medium customarily used for software interchange.
-
- If distribution of object code is made by offering access to copy
-from a designated place, then offering equivalent access to copy the
-source code from the same place satisfies the requirement to
-distribute the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
- 5. A program that contains no derivative of any portion of the
-Library, but is designed to work with the Library by being compiled or
-linked with it, is called a "work that uses the Library". Such a
-work, in isolation, is not a derivative work of the Library, and
-therefore falls outside the scope of this License.
-
- However, linking a "work that uses the Library" with the Library
-creates an executable that is a derivative of the Library (because it
-contains portions of the Library), rather than a "work that uses the
-library". The executable is therefore covered by this License.
-Section 6 states terms for distribution of such executables.
-
- When a "work that uses the Library" uses material from a header file
-that is part of the Library, the object code for the work may be a
-derivative work of the Library even though the source code is not.
-Whether this is true is especially significant if the work can be
-linked without the Library, or if the work is itself a library. The
-threshold for this to be true is not precisely defined by law.
-
- If such an object file uses only numerical parameters, data
-structure layouts and accessors, and small macros and small inline
-functions (ten lines or less in length), then the use of the object
-file is unrestricted, regardless of whether it is legally a derivative
-work. (Executables containing this object code plus portions of the
-Library will still fall under Section 6.)
-
- Otherwise, if the work is a derivative of the Library, you may
-distribute the object code for the work under the terms of Section 6.
-Any executables containing that work also fall under Section 6,
-whether or not they are linked directly with the Library itself.
-
- 6. As an exception to the Sections above, you may also combine or
-link a "work that uses the Library" with the Library to produce a
-work containing portions of the Library, and distribute that work
-under terms of your choice, provided that the terms permit
-modification of the work for the customer's own use and reverse
-engineering for debugging such modifications.
-
- You must give prominent notice with each copy of the work that the
-Library is used in it and that the Library and its use are covered by
-this License. You must supply a copy of this License. If the work
-during execution displays copyright notices, you must include the
-copyright notice for the Library among them, as well as a reference
-directing the user to the copy of this License. Also, you must do one
-of these things:
-
- a) Accompany the work with the complete corresponding
- machine-readable source code for the Library including whatever
- changes were used in the work (which must be distributed under
- Sections 1 and 2 above); and, if the work is an executable linked
- with the Library, with the complete machine-readable "work that
- uses the Library", as object code and/or source code, so that the
- user can modify the Library and then relink to produce a modified
- executable containing the modified Library. (It is understood
- that the user who changes the contents of definitions files in the
- Library will not necessarily be able to recompile the application
- to use the modified definitions.)
-
- b) Use a suitable shared library mechanism for linking with the
- Library. A suitable mechanism is one that (1) uses at run time a
- copy of the library already present on the user's computer system,
- rather than copying library functions into the executable, and (2)
- will operate properly with a modified version of the library, if
- the user installs one, as long as the modified version is
- interface-compatible with the version that the work was made with.
-
- c) Accompany the work with a written offer, valid for at
- least three years, to give the same user the materials
- specified in Subsection 6a, above, for a charge no more
- than the cost of performing this distribution.
-
- d) If distribution of the work is made by offering access to copy
- from a designated place, offer equivalent access to copy the above
- specified materials from the same place.
-
- e) Verify that the user has already received a copy of these
- materials or that you have already sent this user a copy.
-
- For an executable, the required form of the "work that uses the
-Library" must include any data and utility programs needed for
-reproducing the executable from it. However, as a special exception,
-the materials to be distributed need not include anything that is
-normally distributed (in either source or binary form) with the major
-components (compiler, kernel, and so on) of the operating system on
-which the executable runs, unless that component itself accompanies
-the executable.
-
- It may happen that this requirement contradicts the license
-restrictions of other proprietary libraries that do not normally
-accompany the operating system. Such a contradiction means you cannot
-use both them and the Library together in an executable that you
-distribute.
-
- 7. You may place library facilities that are a work based on the
-Library side-by-side in a single library together with other library
-facilities not covered by this License, and distribute such a combined
-library, provided that the separate distribution of the work based on
-the Library and of the other library facilities is otherwise
-permitted, and provided that you do these two things:
-
- a) Accompany the combined library with a copy of the same work
- based on the Library, uncombined with any other library
- facilities. This must be distributed under the terms of the
- Sections above.
-
- b) Give prominent notice with the combined library of the fact
- that part of it is a work based on the Library, and explaining
- where to find the accompanying uncombined form of the same work.
-
- 8. You may not copy, modify, sublicense, link with, or distribute
-the Library except as expressly provided under this License. Any
-attempt otherwise to copy, modify, sublicense, link with, or
-distribute the Library is void, and will automatically terminate your
-rights under this License. However, parties who have received copies,
-or rights, from you under this License will not have their licenses
-terminated so long as such parties remain in full compliance.
-
- 9. You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Library or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Library (or any work based on the
-Library), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Library or works based on it.
-
- 10. Each time you redistribute the Library (or any work based on the
-Library), the recipient automatically receives a license from the
-original licensor to copy, distribute, link with or modify the Library
-subject to these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties with
-this License.
-
- 11. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Library at all. For example, if a patent
-license would not permit royalty-free redistribution of the Library by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Library.
-
-If any portion of this section is held invalid or unenforceable under any
-particular circumstance, the balance of the section is intended to apply,
-and the section as a whole is intended to apply in other circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
- 12. If the distribution and/or use of the Library is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Library under this License may add
-an explicit geographical distribution limitation excluding those countries,
-so that distribution is permitted only in or among countries not thus
-excluded. In such case, this License incorporates the limitation as if
-written in the body of this License.
-
- 13. The Free Software Foundation may publish revised and/or new
-versions of the Lesser General Public License from time to time.
-Such new versions will be similar in spirit to the present version,
-but may differ in detail to address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Library
-specifies a version number of this License which applies to it and
-"any later version", you have the option of following the terms and
-conditions either of that version or of any later version published by
-the Free Software Foundation. If the Library does not specify a
-license version number, you may choose any version ever published by
-the Free Software Foundation.
-
- 14. If you wish to incorporate parts of the Library into other free
-programs whose distribution conditions are incompatible with these,
-write to the author to ask for permission. For software which is
-copyrighted by the Free Software Foundation, write to the Free
-Software Foundation; we sometimes make exceptions for this. Our
-decision will be guided by the two goals of preserving the free status
-of all derivatives of our free software and of promoting the sharing
-and reuse of software generally.
-
- NO WARRANTY
-
- 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
-WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
-EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
-KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
-LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
-THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
- 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
-WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
-AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
-FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
-CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
-LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGES.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Libraries
-
- If you develop a new library, and you want it to be of the greatest
-possible use to the public, we recommend making it free software that
-everyone can redistribute and change. You can do so by permitting
-redistribution under these terms (or, alternatively, under the terms of the
-ordinary General Public License).
-
- To apply these terms, attach the following notices to the library. It is
-safest to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least the
-"copyright" line and a pointer to where the full notice is found.
-
-
- Copyright (C)
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-Also add information on how to contact you by electronic and paper mail.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the library, if
-necessary. Here is a sample; alter the names:
-
- Yoyodyne, Inc., hereby disclaims all copyright interest in the
- library `Frob' (a library for tweaking knobs) written by James Random Hacker.
-
- , 1 April 1990
- Ty Coon, President of Vice
-
-That's all there is to it!
\ No newline at end of file
+TODO: place your license here and we'll include it in the module distribution
diff --git a/assets/README b/assets/README
index a822b6d..a8255cb 100644
--- a/assets/README
+++ b/assets/README
@@ -1,6 +1,6 @@
-Place your assets like PNG files in this directory and they will be packaged with your module.
-
-If you create a file named com.findlaw.titanium.c2dm.js in this directory, it will be
-compiled and used as your module. This allows you to run pure Javascript
-modules that are pre-compiled.
-
+Place your assets like PNG files in this directory and they will be packaged with your module.
+
+If you create a file named com.findlaw.titanium.c2dm.js in this directory, it will be
+compiled and used as your module. This allows you to run pure Javascript
+modules that are pre-compiled.
+
diff --git a/build.properties b/build.properties
index 9441ebd..70c8304 100644
--- a/build.properties
+++ b/build.properties
@@ -1,3 +1,3 @@
-titanium.platform=/Library/Application Support/Titanium/mobilesdk/osx/1.5.0/android
-android.platform=/opt/android-sdk/platforms/android-8
-google.apis=/opt/android-sdk/add-ons/addon_google_apis_google_inc_8
\ No newline at end of file
+titanium.platform=C:\\Users\\All Users\\Titanium\\mobilesdk\\win32\\1.6.1\\android
+android.platform=C:\\Tools\\android-sdk-windows\\platforms\\android-8
+google.apis=C:\\Tools\\android-sdk-windows\\add-ons\\addon_google_apis_google_inc_8
\ No newline at end of file
diff --git a/build.xml b/build.xml
index cb2e0ad..19fd935 100644
--- a/build.xml
+++ b/build.xml
@@ -1,10 +1,10 @@
-
-
- Ant build script for Titanium Android module c2dm
-
-
-
-
-
-
-
+
+
+ Ant build script for Titanium Android module c2dm
+
+
+
+
+
+
+
diff --git a/documentation/index.md b/documentation/index.md
index 8a4945e..6db77e8 100644
--- a/documentation/index.md
+++ b/documentation/index.md
@@ -1,39 +1,39 @@
-# c2dm Module
-
-## Description
-
-TODO: Enter your module description here
-
-## Accessing the c2dm Module
-
-To access this module from JavaScript, you would do the following:
-
- var c2dm = require("com.findlaw.titanium.c2dm");
-
-The c2dm variable is a reference to the Module object.
-
-## Reference
-
-TODO: If your module has an API, you should document
-the reference here.
-
-### ___PROJECTNAMEASIDENTIFIER__.function
-
-TODO: This is an example of a module function.
-
-### ___PROJECTNAMEASIDENTIFIER__.property
-
-TODO: This is an example of a module property.
-
-## Usage
-
-TODO: Enter your usage example here
-
-## Author
-
-TODO: Enter your author name, email and other contact
-details you want to share here.
-
-## License
-
-TODO: Enter your license/legal information here.
+# c2dm Module
+
+## Description
+
+TODO: Enter your module description here
+
+## Accessing the c2dm Module
+
+To access this module from JavaScript, you would do the following:
+
+ var c2dm = require("com.findlaw.titanium.c2dm");
+
+The c2dm variable is a reference to the Module object.
+
+## Reference
+
+TODO: If your module has an API, you should document
+the reference here.
+
+### ___PROJECTNAMEASIDENTIFIER__.function
+
+TODO: This is an example of a module function.
+
+### ___PROJECTNAMEASIDENTIFIER__.property
+
+TODO: This is an example of a module property.
+
+## Usage
+
+TODO: Enter your usage example here
+
+## Author
+
+TODO: Enter your author name, email and other contact
+details you want to share here.
+
+## License
+
+TODO: Enter your license/legal information here.
diff --git a/example/AndroidManifest.custom.xml b/example/AndroidManifest.custom.xml
index 5e3f8bb..71e7c81 100644
--- a/example/AndroidManifest.custom.xml
+++ b/example/AndroidManifest.custom.xml
@@ -1,75 +1,93 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/example/app.js b/example/app.js
index 6e278e3..292234c 100644
--- a/example/app.js
+++ b/example/app.js
@@ -1,48 +1,59 @@
-// This is a test harness for your module
-// You should do something interesting in this harness
-// to test out the module and to provide instructions
-// to users on how to use it by example.
-
-
-var senderId = 'john.doe@gmail.com'; // You'll need to put in your own account here
-
-var c2dm = require('com.findlaw.titanium.c2dm');
-Ti.API.info("module is => " + c2dm);
-
-c2dm.addEventListener('register', function(data) {
- Ti.API.info('JS register event: ' + data.registrationId);
- label.text = 'Registered: ' + data.registrationId;
-});
-c2dm.addEventListener('message', function(data) {
- Ti.API.info('JS message event: ' + data.message);
- label.text = 'Message: ' + data.message;
-});
-
-
-// open a single window
-var window = Ti.UI.createWindow({
- backgroundColor:'white'
-});
-
-var label = Ti.UI.createLabel({top: 20, left: 5, right: 5});
-window.add(label);
-
-var button = Ti.UI.createButton({title: 'Register'});
-button.addEventListener('click', function() {
- Ti.API.info('Registering...');
- label.text = 'Registering...';
- c2dm.register(senderId);
-});
-window.add(button);
-
-window.open();
-
-
-if(!c2dm.registrationId) {
- Ti.API.info('Registering...');
- label.text = 'Registering...';
- c2dm.register(senderId);
-} else {
- Ti.API.info('Current registration id: ' + c2dm.registrationId);
- label.text = 'Current registration id: ' + c2dm.registrationId;
-}
\ No newline at end of file
+var senderId = 'youraddress@gmail.com';
+
+var c2dm = require('com.findlaw.titanium.c2dm');
+Ti.API.info("module is => " + c2dm);
+
+Ti.API.info('Registering...');
+c2dm.register(senderId, {
+ success:function(e)
+ {
+ Ti.API.info('JS registration success event: ' + e.registrationId);
+
+ // TODO for you: send e.registrationId to your server-side database
+ },
+ error:function(e)
+ {
+ Ti.API.error("Error during registration: "+e.error);
+
+ var message;
+ if(e.error == "ACCOUNT_MISSING") {
+ message = "No Google account found; you'll need to add one (in Settings/Accounts) in order to activate notifications";
+ } else {
+ message = "Error during registration: "+e.error
+ }
+
+ Titanium.UI.createAlertDialog({
+ title: 'Push Notification Setup',
+ message: message,
+ buttonNames: ['OK']
+ }).show();
+ },
+ callback:function(e) // called when a push notification is received
+ {
+ Ti.API.info('JS message event: ' + JSON.stringify(e.data));
+
+ var intent = Ti.Android.createIntent({
+ action: Ti.Android.ACTION_MAIN,
+ flags: Ti.Android.FLAG_ACTIVITY_NEW_TASK | Ti.Android.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED,
+ className: 'com.company.app.YourActivity',
+ packageName: 'com.company.app'
+ });
+ intent.addCategory(Ti.Android.CATEGORY_LAUNCHER);
+
+ // This is fairly static: Not much need to be altered here
+ var pending = Ti.Android.createPendingIntent({
+ activity: Ti.Android.currentActivity,
+ intent: intent,
+ type: Ti.Android.PENDING_INTENT_FOR_ACTIVITY,
+ });
+
+ var notification = Ti.Android.createNotification({
+ contentIntent: pending,
+ contentTitle: 'New message',
+ contentText: e.data.message,
+ tickerText: "New message"
+ });
+
+ Ti.Android.NotificationManager.notify(1, notification);
+ }
+});
\ No newline at end of file
diff --git a/hooks/README b/hooks/README
index 66b10a8..5571560 100644
--- a/hooks/README
+++ b/hooks/README
@@ -1 +1 @@
-These files are not yet supported as of 1.4.0 but will be in a near future release.
+These files are not yet supported as of 1.4.0 but will be in a near future release.
diff --git a/hooks/add.py b/hooks/add.py
index 04e1c1d..f9e9ce9 100644
--- a/hooks/add.py
+++ b/hooks/add.py
@@ -1,35 +1,35 @@
-#!/usr/bin/env python
-#
-# This is the module project add hook that will be
-# called when your module is added to a project
-#
-import os, sys
-
-def dequote(s):
- if s[0:1] == '"':
- return s[1:-1]
- return s
-
-def main(args,argc):
- # You will get the following command line arguments
- # in the following order:
- #
- # project_dir = the full path to the project root directory
- # project_type = the type of project (desktop, mobile, ipad)
- # project_name = the name of the project
- #
- project_dir = dequote(os.path.expanduser(args[1]))
- project_type = dequote(args[2])
- project_name = dequote(args[3])
-
- # TODO: write your add hook here (optional)
-
-
- # exit
- sys.exit(0)
-
-
-
-if __name__ == '__main__':
- main(sys.argv,len(sys.argv))
-
+#!/usr/bin/env python
+#
+# This is the module project add hook that will be
+# called when your module is added to a project
+#
+import os, sys
+
+def dequote(s):
+ if s[0:1] == '"':
+ return s[1:-1]
+ return s
+
+def main(args,argc):
+ # You will get the following command line arguments
+ # in the following order:
+ #
+ # project_dir = the full path to the project root directory
+ # project_type = the type of project (desktop, mobile, ipad)
+ # project_name = the name of the project
+ #
+ project_dir = dequote(os.path.expanduser(args[1]))
+ project_type = dequote(args[2])
+ project_name = dequote(args[3])
+
+ # TODO: write your add hook here (optional)
+
+
+ # exit
+ sys.exit(0)
+
+
+
+if __name__ == '__main__':
+ main(sys.argv,len(sys.argv))
+
diff --git a/hooks/install.py b/hooks/install.py
index b423fe9..3776350 100644
--- a/hooks/install.py
+++ b/hooks/install.py
@@ -1,19 +1,19 @@
-#!/usr/bin/env python
-#
-# This is the module install hook that will be
-# called when your module is first installed
-#
-import os, sys
-
-def main(args,argc):
-
- # TODO: write your install hook here (optional)
-
- # exit
- sys.exit(0)
-
-
-
-if __name__ == '__main__':
- main(sys.argv,len(sys.argv))
-
+#!/usr/bin/env python
+#
+# This is the module install hook that will be
+# called when your module is first installed
+#
+import os, sys
+
+def main(args,argc):
+
+ # TODO: write your install hook here (optional)
+
+ # exit
+ sys.exit(0)
+
+
+
+if __name__ == '__main__':
+ main(sys.argv,len(sys.argv))
+
diff --git a/hooks/remove.py b/hooks/remove.py
index f92a234..263d2fe 100644
--- a/hooks/remove.py
+++ b/hooks/remove.py
@@ -1,34 +1,34 @@
-#!/usr/bin/env python
-#
-# This is the module project remove hook that will be
-# called when your module is remove from a project
-#
-import os, sys
-
-def dequote(s):
- if s[0:1] == '"':
- return s[1:-1]
- return s
-
-def main(args,argc):
- # You will get the following command line arguments
- # in the following order:
- #
- # project_dir = the full path to the project root directory
- # project_type = the type of project (desktop, mobile, ipad)
- # project_name = the name of the project
- #
- project_dir = dequote(os.path.expanduser(args[1]))
- project_type = dequote(args[2])
- project_name = dequote(args[3])
-
- # TODO: write your remove hook here (optional)
-
- # exit
- sys.exit(0)
-
-
-
-if __name__ == '__main__':
- main(sys.argv,len(sys.argv))
-
+#!/usr/bin/env python
+#
+# This is the module project remove hook that will be
+# called when your module is remove from a project
+#
+import os, sys
+
+def dequote(s):
+ if s[0:1] == '"':
+ return s[1:-1]
+ return s
+
+def main(args,argc):
+ # You will get the following command line arguments
+ # in the following order:
+ #
+ # project_dir = the full path to the project root directory
+ # project_type = the type of project (desktop, mobile, ipad)
+ # project_name = the name of the project
+ #
+ project_dir = dequote(os.path.expanduser(args[1]))
+ project_type = dequote(args[2])
+ project_name = dequote(args[3])
+
+ # TODO: write your remove hook here (optional)
+
+ # exit
+ sys.exit(0)
+
+
+
+if __name__ == '__main__':
+ main(sys.argv,len(sys.argv))
+
diff --git a/hooks/uninstall.py b/hooks/uninstall.py
index a7ffd91..2af6a90 100644
--- a/hooks/uninstall.py
+++ b/hooks/uninstall.py
@@ -1,18 +1,18 @@
-#!/usr/bin/env python
-#
-# This is the module uninstall hook that will be
-# called when your module is uninstalled
-#
-import os, sys
-
-def main(args,argc):
-
- # TODO: write your uninstall hook here (optional)
-
- # exit
- sys.exit(0)
-
-
-if __name__ == '__main__':
- main(sys.argv,len(sys.argv))
-
+#!/usr/bin/env python
+#
+# This is the module uninstall hook that will be
+# called when your module is uninstalled
+#
+import os, sys
+
+def main(args,argc):
+
+ # TODO: write your uninstall hook here (optional)
+
+ # exit
+ sys.exit(0)
+
+
+if __name__ == '__main__':
+ main(sys.argv,len(sys.argv))
+
diff --git a/manifest b/manifest
index 92d8c47..930e13b 100644
--- a/manifest
+++ b/manifest
@@ -1,18 +1,18 @@
-#
-# this is your module manifest and used by Titanium
-# during compilation, packaging, distribution, etc.
-#
-version: 0.1
-description: titanium-c2dm
-author: Matthew Lieder
-license: LGPL 2.1
-copyright: Copyright (c) 2010 by Matthew Lieder
-
-
-# these should not be edited
-name: c2dm
-moduleid: com.findlaw.titanium.c2dm
-guid: bc223a51-1bf1-4014-bc0c-483a783b1c7e
-platform: android
-minsdk: 1.5.0
+#
+# this is your module manifest and used by Titanium
+# during compilation, packaging, distribution, etc.
+#
+version: 0.1
+description: My module
+author: Your Name
+license: Specify your license
+copyright: Copyright (c) 2010 by Your Company
+
+
+# these should not be edited
+name: c2dm
+moduleid: com.findlaw.titanium.c2dm
+guid: bc223a51-1bf1-4014-bc0c-483a783b1c7e
+platform: android
+minsdk: 1.5.0
android.sdk: /opt/android-sdk
\ No newline at end of file
diff --git a/src/com/findlaw/titanium/c2dm/C2DMReceiver.java b/src/com/findlaw/titanium/c2dm/C2DMReceiver.java
index 8e5cd3a..8d276cd 100644
--- a/src/com/findlaw/titanium/c2dm/C2DMReceiver.java
+++ b/src/com/findlaw/titanium/c2dm/C2DMReceiver.java
@@ -1,78 +1,56 @@
-/*
- titanium-c2dm
- Copyright (C) 2010 by Matthew Lieder
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-*/
-
-package com.findlaw.titanium.c2dm;
-
-import java.io.IOException;
-
-import org.appcelerator.kroll.KrollDict;
-import org.appcelerator.titanium.util.Log;
-
-import com.google.android.c2dm.C2DMBaseReceiver;
-
-import android.content.Context;
-import android.content.Intent;
-
-public class C2DMReceiver extends C2DMBaseReceiver {
-
- private static final String LCAT = "C2DMReceiver";
-
- private static final String REGISTER_EVENT = "register";
- private static final String UNREGISTER_EVENT = "unregister";
- private static final String MESSAGE_EVENT = "message";
- private static final String ERROR_EVENT = "error";
-
- public void onRegistrered(Context context, String registrationId) throws IOException {
- Log.d(LCAT, "Registered: " + registrationId);
-
- KrollDict data = new KrollDict();
- data.put("registrationId", registrationId);
- C2dmModule.getInstance().fireEvent(REGISTER_EVENT, data);
- }
-
- public void onUnregistered(Context context) {
- Log.d(LCAT, "Unregistered");
-
- C2dmModule.getInstance().fireEvent(UNREGISTER_EVENT, new KrollDict());
- }
-
- @Override
- protected void onMessage(Context context, Intent intent) {
- Log.d(LCAT, "Message received: " + intent.getExtras().getString("data.message"));
-
- KrollDict data = new KrollDict();
- for(String key: intent.getExtras().keySet()) {
- String eventKey = key.startsWith("data.") ? key.substring(5) : key;
- data.put(eventKey, intent.getExtras().getString(key));
- }
-
- C2dmModule.getInstance().fireEvent(MESSAGE_EVENT, data);
-
- }
-
- @Override
- public void onError(Context context, String errorId) {
- Log.e(LCAT, "Error: " + errorId);
-
- KrollDict data = new KrollDict();
- data.put("errorId", errorId);
- C2dmModule.getInstance().fireEvent(ERROR_EVENT, data);
- }
-
-}
+package com.findlaw.titanium.c2dm;
+
+import java.io.IOException;
+
+import org.appcelerator.kroll.KrollDict;
+import org.appcelerator.titanium.util.Log;
+
+import com.google.android.c2dm.C2DMBaseReceiver;
+
+import android.content.Context;
+import android.content.Intent;
+
+public class C2DMReceiver extends C2DMBaseReceiver {
+
+ private static final String LCAT = "C2DMReceiver";
+
+ private static final String REGISTER_EVENT = "register";
+ private static final String UNREGISTER_EVENT = "unregister";
+ private static final String MESSAGE_EVENT = "message";
+ private static final String ERROR_EVENT = "error";
+
+ public void onRegistrered(Context context, String registrationId) throws IOException {
+ Log.d(LCAT, "Registered: " + registrationId);
+
+ C2dmModule.getInstance().sendSuccess(registrationId);
+ }
+
+ public void onUnregistered(Context context) {
+ Log.d(LCAT, "Unregistered");
+
+ C2dmModule.getInstance().fireEvent(UNREGISTER_EVENT, new KrollDict());
+ }
+
+ @Override
+ protected void onMessage(Context context, Intent intent) {
+ Log.d(LCAT, "Message received");
+
+ KrollDict data = new KrollDict();
+ for(String key: intent.getExtras().keySet()) {
+ Log.d(LCAT, "Message key: " + key + " value: " + intent.getExtras().getString(key));
+
+ String eventKey = key.startsWith("data.") ? key.substring(5) : key;
+ data.put(eventKey, intent.getExtras().getString(key));
+ }
+
+ C2dmModule.getInstance().sendMessage(data);
+ }
+
+ @Override
+ public void onError(Context context, String errorId) {
+ Log.e(LCAT, "Error: " + errorId);
+
+ C2dmModule.getInstance().sendError(errorId);
+ }
+
+}
diff --git a/src/com/findlaw/titanium/c2dm/C2dmModule.java b/src/com/findlaw/titanium/c2dm/C2dmModule.java
index 808b35a..1ba540e 100644
--- a/src/com/findlaw/titanium/c2dm/C2dmModule.java
+++ b/src/com/findlaw/titanium/c2dm/C2dmModule.java
@@ -1,53 +1,99 @@
-/**
- * This file was auto-generated by the Titanium Module SDK helper for Android
- * Appcelerator Titanium Mobile
- * Copyright (c) 2009-2010 by Appcelerator, Inc. All Rights Reserved.
- * Licensed under the terms of the Apache Public License
- * Please see the LICENSE included with this distribution for details.
- *
- */
-package com.findlaw.titanium.c2dm;
-
-import org.appcelerator.kroll.KrollModule;
-import org.appcelerator.kroll.annotations.Kroll;
-
-import org.appcelerator.titanium.TiContext;
-import org.appcelerator.titanium.util.Log;
-
-import com.google.android.c2dm.C2DMessaging;
-
-@Kroll.module(name="C2dm", id="com.findlaw.titanium.c2dm")
-public class C2dmModule extends KrollModule
-{
- // Standard Debugging variables
- private static final String LCAT = "C2dmModule";
-
- private static C2dmModule _THIS;
-
- public C2dmModule(TiContext tiContext) {
- super(tiContext);
-
- _THIS = this;
- }
-
- // Methods
- @Kroll.method
- public void register(String senderId) {
- Log.d(LCAT, "register called");
-
- C2DMessaging.register(getTiContext().getTiApp(), senderId);
- }
-
- // Properties
- @Kroll.getProperty
- public String getRegistrationId() {
- Log.d(LCAT, "get registrationId property");
- return C2DMessaging.getRegistrationId(getTiContext().getTiApp());
- }
-
-
- static C2dmModule getInstance() {
- return _THIS;
- }
-
-}
+/**
+ * This file was auto-generated by the Titanium Module SDK helper for Android
+ * Appcelerator Titanium Mobile
+ * Copyright (c) 2009-2010 by Appcelerator, Inc. All Rights Reserved.
+ * Licensed under the terms of the Apache Public License
+ * Please see the LICENSE included with this distribution for details.
+ *
+ */
+package com.findlaw.titanium.c2dm;
+
+import org.appcelerator.kroll.KrollDict;
+import org.appcelerator.kroll.KrollInvocation;
+import org.appcelerator.kroll.KrollModule;
+import org.appcelerator.kroll.annotations.Kroll;
+
+import org.appcelerator.titanium.TiContext;
+import org.appcelerator.titanium.kroll.KrollCallback;
+import org.appcelerator.titanium.util.Log;
+
+import com.google.android.c2dm.C2DMessaging;
+
+import android.app.AlertDialog;
+import android.content.DialogInterface;
+
+@Kroll.module(name="C2dm", id="com.findlaw.titanium.c2dm")
+public class C2dmModule extends KrollModule
+{
+ // Standard Debugging variables
+ private static final String LCAT = "C2dmModule";
+
+ private static C2dmModule _THIS;
+
+ private KrollCallback successCallback;
+ private KrollCallback errorCallback;
+ private KrollCallback messageCallback;
+
+ public C2dmModule(TiContext tiContext) {
+ super(tiContext);
+
+ _THIS = this;
+ }
+
+ // Methods
+ @Kroll.method
+ public void register(String senderId, KrollDict options) {
+ Log.d(LCAT, "register called");
+
+ successCallback = (KrollCallback)options.get("success");
+ errorCallback = (KrollCallback)options.get("error");
+ messageCallback = (KrollCallback)options.get("callback");
+
+ String registrationId = getRegistrationId();
+ if(registrationId != null && registrationId.length() > 0) {
+ sendSuccess(registrationId);
+ } else {
+ C2DMessaging.register(getTiContext().getTiApp(), senderId);
+ }
+ }
+
+ // Properties
+ @Kroll.getProperty
+ public String getRegistrationId() {
+ Log.d(LCAT, "get registrationId property");
+ return C2DMessaging.getRegistrationId(getTiContext().getTiApp());
+ }
+
+ public void sendSuccess(String registrationId) {
+ if(successCallback != null) {
+ KrollDict data = new KrollDict();
+ data.put("registrationId", registrationId);
+
+ successCallback.callAsync(data);
+ }
+ }
+
+ public void sendError(String error) {
+ if(errorCallback != null) {
+ KrollDict data = new KrollDict();
+ data.put("error", error);
+
+ errorCallback.callAsync(data);
+ }
+ }
+
+ public void sendMessage(KrollDict messageData) {
+ if(messageCallback != null) {
+ KrollDict data = new KrollDict();
+ data.put("data", messageData);
+
+ messageCallback.callSync(data);
+ }
+ }
+
+
+ static C2dmModule getInstance() {
+ return _THIS;
+ }
+
+}
diff --git a/src/com/google/android/c2dm/C2DMBaseReceiver.java b/src/com/google/android/c2dm/C2DMBaseReceiver.java
index f945d96..2bc8af4 100644
--- a/src/com/google/android/c2dm/C2DMBaseReceiver.java
+++ b/src/com/google/android/c2dm/C2DMBaseReceiver.java
@@ -1,189 +1,189 @@
-/*
- * Copyright 2010 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.android.c2dm;
-
-import java.io.IOException;
-
-import android.app.AlarmManager;
-import android.app.IntentService;
-import android.app.PendingIntent;
-import android.content.Context;
-import android.content.Intent;
-import android.os.PowerManager;
-import android.util.Log;
-
-/**
- * Base class for C2D message receiver. Includes constants for the
- * strings used in the protocol.
- */
-public abstract class C2DMBaseReceiver extends IntentService {
- private static final String C2DM_RETRY = "com.google.android.c2dm.intent.RETRY";
-
- public static final String REGISTRATION_CALLBACK_INTENT = "com.google.android.c2dm.intent.REGISTRATION";
- private static final String C2DM_INTENT = "com.google.android.c2dm.intent.RECEIVE";
-
- // Logging tag
- private static final String TAG = "C2DM";
-
- // Extras in the registration callback intents.
- public static final String EXTRA_UNREGISTERED = "unregistered";
-
- public static final String EXTRA_ERROR = "error";
-
- public static final String EXTRA_REGISTRATION_ID = "registration_id";
-
- public static final String ERR_SERVICE_NOT_AVAILABLE = "SERVICE_NOT_AVAILABLE";
- public static final String ERR_ACCOUNT_MISSING = "ACCOUNT_MISSING";
- public static final String ERR_AUTHENTICATION_FAILED = "AUTHENTICATION_FAILED";
- public static final String ERR_TOO_MANY_REGISTRATIONS = "TOO_MANY_REGISTRATIONS";
- public static final String ERR_INVALID_PARAMETERS = "INVALID_PARAMETERS";
- public static final String ERR_INVALID_SENDER = "INVALID_SENDER";
- public static final String ERR_PHONE_REGISTRATION_ERROR = "PHONE_REGISTRATION_ERROR";
-
- // wakelock
- private static final String WAKELOCK_KEY = "C2DM_LIB";
-
- private static PowerManager.WakeLock mWakeLock;
-
- public C2DMBaseReceiver() {
- // senderId is used as base name for threads, etc.
- super("C2DMBaseReceiver");
- }
-
- /**
- * Called when a cloud message has been received.
- */
- protected abstract void onMessage(Context context, Intent intent);
-
- /**
- * Called on registration error. Override to provide better
- * error messages.
- *
- * This is called in the context of a Service - no dialog or UI.
- */
- public abstract void onError(Context context, String errorId);
-
- /**
- * Called when a registration token has been received.
- */
- public void onRegistrered(Context context, String registrationId) throws IOException {
- // registrationId will also be saved
- }
-
- /**
- * Called when the device has been unregistered.
- */
- public void onUnregistered(Context context) {
- }
-
-
- @Override
- public final void onHandleIntent(Intent intent) {
- try {
- Context context = getApplicationContext();
- if (intent.getAction().equals(REGISTRATION_CALLBACK_INTENT)) {
- handleRegistration(context, intent);
- } else if (intent.getAction().equals(C2DM_INTENT)) {
- onMessage(context, intent);
- } else if (intent.getAction().equals(C2DM_RETRY)) {
- C2DMessaging.register(context);
- }
- } finally {
- // Release the power lock, so phone can get back to sleep.
- // The lock is reference counted by default, so multiple
- // messages are ok.
-
- // If the onMessage() needs to spawn a thread or do something else,
- // it should use it's own lock.
- mWakeLock.release();
- }
- }
-
-
- /**
- * Called from the broadcast receiver.
- * Will process the received intent, call handleMessage(), registered(), etc.
- * in background threads, with a wake lock, while keeping the service
- * alive.
- */
- static void runIntentInService(Context context, Intent intent) {
- if (mWakeLock == null) {
- // This is called from BroadcastReceiver, there is no init.
- PowerManager pm =
- (PowerManager) context.getSystemService(Context.POWER_SERVICE);
- mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
- WAKELOCK_KEY);
- }
- mWakeLock.acquire();
-
- // Use a naming convention, similar with how permissions and intents are
- // used. Alternatives are introspection or an ugly use of statics.
- String receiver = context.getPackageName() + ".C2DMReceiver";
- intent.setClassName(context, receiver);
-
- context.startService(intent);
-
- }
-
-
- private void handleRegistration(final Context context, Intent intent) {
- final String registrationId = intent.getStringExtra(EXTRA_REGISTRATION_ID);
- String error = intent.getStringExtra(EXTRA_ERROR);
- String removed = intent.getStringExtra(EXTRA_UNREGISTERED);
-
- if (Log.isLoggable(TAG, Log.DEBUG)) {
- Log.d(TAG, "dmControl: registrationId = " + registrationId +
- ", error = " + error + ", removed = " + removed);
- }
-
- if (removed != null) {
- // Remember we are unregistered
- C2DMessaging.clearRegistrationId(context);
- onUnregistered(context);
- return;
- } else if (error != null) {
- // we are not registered, can try again
- C2DMessaging.clearRegistrationId(context);
- // Registration failed
- Log.e(TAG, "Registration error " + error);
- onError(context, error);
- if ("SERVICE_NOT_AVAILABLE".equals(error)) {
- long backoffTimeMs = C2DMessaging.getBackoff(context);
-
- Log.d(TAG, "Scheduling registration retry, backoff = " + backoffTimeMs);
- Intent retryIntent = new Intent(C2DM_RETRY);
- PendingIntent retryPIntent = PendingIntent.getBroadcast(context,
- 0 /*requestCode*/, retryIntent, 0 /*flags*/);
-
- AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
- am.set(AlarmManager.ELAPSED_REALTIME,
- backoffTimeMs, retryPIntent);
-
- // Next retry should wait longer.
- backoffTimeMs *= 2;
- C2DMessaging.setBackoff(context, backoffTimeMs);
- }
- } else {
- try {
- onRegistrered(context, registrationId);
- C2DMessaging.setRegistrationId(context, registrationId);
- } catch (IOException ex) {
- Log.e(TAG, "Registration error " + ex.getMessage());
- }
- }
- }
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.android.c2dm;
+
+import java.io.IOException;
+
+import android.app.AlarmManager;
+import android.app.IntentService;
+import android.app.PendingIntent;
+import android.content.Context;
+import android.content.Intent;
+import android.os.PowerManager;
+import android.util.Log;
+
+/**
+ * Base class for C2D message receiver. Includes constants for the
+ * strings used in the protocol.
+ */
+public abstract class C2DMBaseReceiver extends IntentService {
+ private static final String C2DM_RETRY = "com.google.android.c2dm.intent.RETRY";
+
+ public static final String REGISTRATION_CALLBACK_INTENT = "com.google.android.c2dm.intent.REGISTRATION";
+ private static final String C2DM_INTENT = "com.google.android.c2dm.intent.RECEIVE";
+
+ // Logging tag
+ private static final String TAG = "C2DM";
+
+ // Extras in the registration callback intents.
+ public static final String EXTRA_UNREGISTERED = "unregistered";
+
+ public static final String EXTRA_ERROR = "error";
+
+ public static final String EXTRA_REGISTRATION_ID = "registration_id";
+
+ public static final String ERR_SERVICE_NOT_AVAILABLE = "SERVICE_NOT_AVAILABLE";
+ public static final String ERR_ACCOUNT_MISSING = "ACCOUNT_MISSING";
+ public static final String ERR_AUTHENTICATION_FAILED = "AUTHENTICATION_FAILED";
+ public static final String ERR_TOO_MANY_REGISTRATIONS = "TOO_MANY_REGISTRATIONS";
+ public static final String ERR_INVALID_PARAMETERS = "INVALID_PARAMETERS";
+ public static final String ERR_INVALID_SENDER = "INVALID_SENDER";
+ public static final String ERR_PHONE_REGISTRATION_ERROR = "PHONE_REGISTRATION_ERROR";
+
+ // wakelock
+ private static final String WAKELOCK_KEY = "C2DM_LIB";
+
+ private static PowerManager.WakeLock mWakeLock;
+
+ public C2DMBaseReceiver() {
+ // senderId is used as base name for threads, etc.
+ super("C2DMBaseReceiver");
+ }
+
+ /**
+ * Called when a cloud message has been received.
+ */
+ protected abstract void onMessage(Context context, Intent intent);
+
+ /**
+ * Called on registration error. Override to provide better
+ * error messages.
+ *
+ * This is called in the context of a Service - no dialog or UI.
+ */
+ public abstract void onError(Context context, String errorId);
+
+ /**
+ * Called when a registration token has been received.
+ */
+ public void onRegistrered(Context context, String registrationId) throws IOException {
+ // registrationId will also be saved
+ }
+
+ /**
+ * Called when the device has been unregistered.
+ */
+ public void onUnregistered(Context context) {
+ }
+
+
+ @Override
+ public final void onHandleIntent(Intent intent) {
+ try {
+ Context context = getApplicationContext();
+ if (intent.getAction().equals(REGISTRATION_CALLBACK_INTENT)) {
+ handleRegistration(context, intent);
+ } else if (intent.getAction().equals(C2DM_INTENT)) {
+ onMessage(context, intent);
+ } else if (intent.getAction().equals(C2DM_RETRY)) {
+ C2DMessaging.register(context);
+ }
+ } finally {
+ // Release the power lock, so phone can get back to sleep.
+ // The lock is reference counted by default, so multiple
+ // messages are ok.
+
+ // If the onMessage() needs to spawn a thread or do something else,
+ // it should use it's own lock.
+ mWakeLock.release();
+ }
+ }
+
+
+ /**
+ * Called from the broadcast receiver.
+ * Will process the received intent, call handleMessage(), registered(), etc.
+ * in background threads, with a wake lock, while keeping the service
+ * alive.
+ */
+ static void runIntentInService(Context context, Intent intent) {
+ if (mWakeLock == null) {
+ // This is called from BroadcastReceiver, there is no init.
+ PowerManager pm =
+ (PowerManager) context.getSystemService(Context.POWER_SERVICE);
+ mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
+ WAKELOCK_KEY);
+ }
+ mWakeLock.acquire();
+
+ // Use a naming convention, similar with how permissions and intents are
+ // used. Alternatives are introspection or an ugly use of statics.
+ String receiver = "com.findlaw.titanium.c2dm.C2DMReceiver";
+ intent.setClassName(context, receiver);
+
+ context.startService(intent);
+
+ }
+
+
+ private void handleRegistration(final Context context, Intent intent) {
+ final String registrationId = intent.getStringExtra(EXTRA_REGISTRATION_ID);
+ String error = intent.getStringExtra(EXTRA_ERROR);
+ String removed = intent.getStringExtra(EXTRA_UNREGISTERED);
+
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
+ Log.d(TAG, "dmControl: registrationId = " + registrationId +
+ ", error = " + error + ", removed = " + removed);
+ }
+
+ if (removed != null) {
+ // Remember we are unregistered
+ C2DMessaging.clearRegistrationId(context);
+ onUnregistered(context);
+ return;
+ } else if (error != null) {
+ // we are not registered, can try again
+ C2DMessaging.clearRegistrationId(context);
+ // Registration failed
+ Log.e(TAG, "Registration error " + error);
+ onError(context, error);
+ if ("SERVICE_NOT_AVAILABLE".equals(error)) {
+ long backoffTimeMs = C2DMessaging.getBackoff(context);
+
+ Log.d(TAG, "Scheduling registration retry, backoff = " + backoffTimeMs);
+ Intent retryIntent = new Intent(C2DM_RETRY);
+ PendingIntent retryPIntent = PendingIntent.getBroadcast(context,
+ 0 /*requestCode*/, retryIntent, 0 /*flags*/);
+
+ AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
+ am.set(AlarmManager.ELAPSED_REALTIME,
+ backoffTimeMs, retryPIntent);
+
+ // Next retry should wait longer.
+ backoffTimeMs *= 2;
+ C2DMessaging.setBackoff(context, backoffTimeMs);
+ }
+ } else {
+ try {
+ onRegistrered(context, registrationId);
+ C2DMessaging.setRegistrationId(context, registrationId);
+ } catch (IOException ex) {
+ Log.e(TAG, "Registration error " + ex.getMessage());
+ }
+ }
+ }
}
\ No newline at end of file
diff --git a/src/com/google/android/c2dm/C2DMBroadcastReceiver.java b/src/com/google/android/c2dm/C2DMBroadcastReceiver.java
index 6d8462b..b44182b 100644
--- a/src/com/google/android/c2dm/C2DMBroadcastReceiver.java
+++ b/src/com/google/android/c2dm/C2DMBroadcastReceiver.java
@@ -1,25 +1,25 @@
-/*
- */
-package com.google.android.c2dm;
-
-import android.app.Activity;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-
-/**
- * Helper class to handle BroadcastReciver behavior.
- * - can only run for a limited amount of time - it must start a real service
- * for longer activity
- * - must get the power lock, must make sure it's released when all done.
- *
- */
-public class C2DMBroadcastReceiver extends BroadcastReceiver {
-
- @Override
- public final void onReceive(Context context, Intent intent) {
- // To keep things in one place.
- C2DMBaseReceiver.runIntentInService(context, intent);
- setResult(Activity.RESULT_OK, null /* data */, null /* extra */);
- }
+/*
+ */
+package com.google.android.c2dm;
+
+import android.app.Activity;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+
+/**
+ * Helper class to handle BroadcastReciver behavior.
+ * - can only run for a limited amount of time - it must start a real service
+ * for longer activity
+ * - must get the power lock, must make sure it's released when all done.
+ *
+ */
+public class C2DMBroadcastReceiver extends BroadcastReceiver {
+
+ @Override
+ public final void onReceive(Context context, Intent intent) {
+ // To keep things in one place.
+ C2DMBaseReceiver.runIntentInService(context, intent);
+ setResult(Activity.RESULT_OK, null /* data */, null /* extra */);
+ }
}
\ No newline at end of file
diff --git a/src/com/google/android/c2dm/C2DMessaging.java b/src/com/google/android/c2dm/C2DMessaging.java
index 3b784b1..5e528c5 100644
--- a/src/com/google/android/c2dm/C2DMessaging.java
+++ b/src/com/google/android/c2dm/C2DMessaging.java
@@ -1,139 +1,139 @@
-/*
- * Copyright 2010 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.android.c2dm;
-
-import android.app.PendingIntent;
-import android.content.Context;
-import android.content.Intent;
-import android.content.SharedPreferences;
-import android.content.SharedPreferences.Editor;
-
-/**
- * Utilities for device registration.
- *
- * Will keep track of the registration token in a private preference.
- */
-public class C2DMessaging {
- public static final String EXTRA_SENDER = "sender";
- public static final String EXTRA_APPLICATION_PENDING_INTENT = "app";
- public static final String REQUEST_UNREGISTRATION_INTENT = "com.google.android.c2dm.intent.UNREGISTER";
- public static final String REQUEST_REGISTRATION_INTENT = "com.google.android.c2dm.intent.REGISTER";
- public static final String LAST_REGISTRATION_CHANGE = "last_registration_change";
- public static final String BACKOFF = "backoff";
- public static final String GSF_PACKAGE = "com.google.android.gsf";
-
-
- // package
- static final String PREFERENCE = "com.google.android.c2dm";
-
- private static final long DEFAULT_BACKOFF = 30000;
-
- private static String lastSenderId = null;
-
- /**
- * Initiate c2d messaging registration for the current application
- */
- public static void register(Context context,
- String senderId) {
- lastSenderId = senderId;
-
- Intent registrationIntent = new Intent(REQUEST_REGISTRATION_INTENT);
- registrationIntent.setPackage(GSF_PACKAGE);
- registrationIntent.putExtra(EXTRA_APPLICATION_PENDING_INTENT,
- PendingIntent.getBroadcast(context, 0, new Intent(), 0));
- registrationIntent.putExtra(EXTRA_SENDER, senderId);
- context.startService(registrationIntent);
- // TODO: if intent not found, notification on need to have GSF
- }
-
- static void register(Context context) {
- register(context, lastSenderId);
- }
-
- /**
- * Unregister the application. New messages will be blocked by server.
- */
- public static void unregister(Context context) {
- Intent regIntent = new Intent(REQUEST_UNREGISTRATION_INTENT);
- regIntent.setPackage(GSF_PACKAGE);
- regIntent.putExtra(EXTRA_APPLICATION_PENDING_INTENT, PendingIntent.getBroadcast(context,
- 0, new Intent(), 0));
- context.startService(regIntent);
- }
-
- /**
- * Return the current registration id.
- *
- * If result is empty, the registration has failed.
- *
- * @return registration id, or empty string if the registration is not complete.
- */
- public static String getRegistrationId(Context context) {
- final SharedPreferences prefs = context.getSharedPreferences(
- PREFERENCE,
- Context.MODE_PRIVATE);
- String registrationId = prefs.getString("dm_registration", "");
- return registrationId;
- }
-
- public static long getLastRegistrationChange(Context context) {
- final SharedPreferences prefs = context.getSharedPreferences(
- PREFERENCE,
- Context.MODE_PRIVATE);
- return prefs.getLong(LAST_REGISTRATION_CHANGE, 0);
- }
-
- static long getBackoff(Context context) {
- final SharedPreferences prefs = context.getSharedPreferences(
- PREFERENCE,
- Context.MODE_PRIVATE);
- return prefs.getLong(BACKOFF, DEFAULT_BACKOFF);
- }
-
- static void setBackoff(Context context, long backoff) {
- final SharedPreferences prefs = context.getSharedPreferences(
- PREFERENCE,
- Context.MODE_PRIVATE);
- Editor editor = prefs.edit();
- editor.putLong(BACKOFF, backoff);
- editor.commit();
-
- }
-
- // package
- static void clearRegistrationId(Context context) {
- final SharedPreferences prefs = context.getSharedPreferences(
- PREFERENCE,
- Context.MODE_PRIVATE);
- Editor editor = prefs.edit();
- editor.putString("dm_registration", "");
- editor.putLong(LAST_REGISTRATION_CHANGE, System.currentTimeMillis());
- editor.commit();
-
- }
-
- // package
- static void setRegistrationId(Context context, String registrationId) {
- final SharedPreferences prefs = context.getSharedPreferences(
- PREFERENCE,
- Context.MODE_PRIVATE);
- Editor editor = prefs.edit();
- editor.putString("dm_registration", registrationId);
- editor.commit();
-
- }
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.android.c2dm;
+
+import android.app.PendingIntent;
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.content.SharedPreferences.Editor;
+
+/**
+ * Utilities for device registration.
+ *
+ * Will keep track of the registration token in a private preference.
+ */
+public class C2DMessaging {
+ public static final String EXTRA_SENDER = "sender";
+ public static final String EXTRA_APPLICATION_PENDING_INTENT = "app";
+ public static final String REQUEST_UNREGISTRATION_INTENT = "com.google.android.c2dm.intent.UNREGISTER";
+ public static final String REQUEST_REGISTRATION_INTENT = "com.google.android.c2dm.intent.REGISTER";
+ public static final String LAST_REGISTRATION_CHANGE = "last_registration_change";
+ public static final String BACKOFF = "backoff";
+ public static final String GSF_PACKAGE = "com.google.android.gsf";
+
+
+ // package
+ static final String PREFERENCE = "com.google.android.c2dm";
+
+ private static final long DEFAULT_BACKOFF = 30000;
+
+ private static String lastSenderId = null;
+
+ /**
+ * Initiate c2d messaging registration for the current application
+ */
+ public static void register(Context context,
+ String senderId) {
+ lastSenderId = senderId;
+
+ Intent registrationIntent = new Intent(REQUEST_REGISTRATION_INTENT);
+ registrationIntent.setPackage(GSF_PACKAGE);
+ registrationIntent.putExtra(EXTRA_APPLICATION_PENDING_INTENT,
+ PendingIntent.getBroadcast(context, 0, new Intent(), 0));
+ registrationIntent.putExtra(EXTRA_SENDER, senderId);
+ context.startService(registrationIntent);
+ // TODO: if intent not found, notification on need to have GSF
+ }
+
+ static void register(Context context) {
+ register(context, lastSenderId);
+ }
+
+ /**
+ * Unregister the application. New messages will be blocked by server.
+ */
+ public static void unregister(Context context) {
+ Intent regIntent = new Intent(REQUEST_UNREGISTRATION_INTENT);
+ regIntent.setPackage(GSF_PACKAGE);
+ regIntent.putExtra(EXTRA_APPLICATION_PENDING_INTENT, PendingIntent.getBroadcast(context,
+ 0, new Intent(), 0));
+ context.startService(regIntent);
+ }
+
+ /**
+ * Return the current registration id.
+ *
+ * If result is empty, the registration has failed.
+ *
+ * @return registration id, or empty string if the registration is not complete.
+ */
+ public static String getRegistrationId(Context context) {
+ final SharedPreferences prefs = context.getSharedPreferences(
+ PREFERENCE,
+ Context.MODE_PRIVATE);
+ String registrationId = prefs.getString("dm_registration", "");
+ return registrationId;
+ }
+
+ public static long getLastRegistrationChange(Context context) {
+ final SharedPreferences prefs = context.getSharedPreferences(
+ PREFERENCE,
+ Context.MODE_PRIVATE);
+ return prefs.getLong(LAST_REGISTRATION_CHANGE, 0);
+ }
+
+ static long getBackoff(Context context) {
+ final SharedPreferences prefs = context.getSharedPreferences(
+ PREFERENCE,
+ Context.MODE_PRIVATE);
+ return prefs.getLong(BACKOFF, DEFAULT_BACKOFF);
+ }
+
+ static void setBackoff(Context context, long backoff) {
+ final SharedPreferences prefs = context.getSharedPreferences(
+ PREFERENCE,
+ Context.MODE_PRIVATE);
+ Editor editor = prefs.edit();
+ editor.putLong(BACKOFF, backoff);
+ editor.commit();
+
+ }
+
+ // package
+ static void clearRegistrationId(Context context) {
+ final SharedPreferences prefs = context.getSharedPreferences(
+ PREFERENCE,
+ Context.MODE_PRIVATE);
+ Editor editor = prefs.edit();
+ editor.putString("dm_registration", "");
+ editor.putLong(LAST_REGISTRATION_CHANGE, System.currentTimeMillis());
+ editor.commit();
+
+ }
+
+ // package
+ static void setRegistrationId(Context context, String registrationId) {
+ final SharedPreferences prefs = context.getSharedPreferences(
+ PREFERENCE,
+ Context.MODE_PRIVATE);
+ Editor editor = prefs.edit();
+ editor.putString("dm_registration", registrationId);
+ editor.commit();
+
+ }
}
\ No newline at end of file
diff --git a/timodule.xml b/timodule.xml
index 69e0adf..82e919d 100644
--- a/timodule.xml
+++ b/timodule.xml
@@ -1,47 +1,47 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file