Eric Kok
12 years ago
21 changed files with 2804 additions and 69 deletions
@ -0,0 +1,41 @@
@@ -0,0 +1,41 @@
|
||||
# built application files |
||||
*.apk |
||||
*.ap_ |
||||
*.jar |
||||
gen-external-apklibs |
||||
|
||||
# keystore |
||||
*.keystore |
||||
|
||||
# files for the dex VM |
||||
*.dex |
||||
|
||||
# Java class files |
||||
*.class |
||||
|
||||
# generated files |
||||
bin/ |
||||
gen/ |
||||
target/ |
||||
|
||||
# Local configuration file (sdk path, etc) |
||||
local.properties |
||||
|
||||
# Eclipse project files |
||||
.classpath |
||||
.project |
||||
.metadata |
||||
.settings |
||||
|
||||
# IntelliJ files |
||||
.idea |
||||
*.iml |
||||
|
||||
# OSX files |
||||
.DS_Store |
||||
|
||||
#vi swap files |
||||
*.swp |
||||
|
||||
# maven target |
||||
target |
@ -0,0 +1,202 @@
@@ -0,0 +1,202 @@
|
||||
|
||||
Apache License |
||||
Version 2.0, January 2004 |
||||
http://www.apache.org/licenses/ |
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION |
||||
|
||||
1. Definitions. |
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction, |
||||
and distribution as defined by Sections 1 through 9 of this document. |
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by |
||||
the copyright owner that is granting the License. |
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all |
||||
other entities that control, are controlled by, or are under common |
||||
control with that entity. For the purposes of this definition, |
||||
"control" means (i) the power, direct or indirect, to cause the |
||||
direction or management of such entity, whether by contract or |
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the |
||||
outstanding shares, or (iii) beneficial ownership of such entity. |
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity |
||||
exercising permissions granted by this License. |
||||
|
||||
"Source" form shall mean the preferred form for making modifications, |
||||
including but not limited to software source code, documentation |
||||
source, and configuration files. |
||||
|
||||
"Object" form shall mean any form resulting from mechanical |
||||
transformation or translation of a Source form, including but |
||||
not limited to compiled object code, generated documentation, |
||||
and conversions to other media types. |
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or |
||||
Object form, made available under the License, as indicated by a |
||||
copyright notice that is included in or attached to the work |
||||
(an example is provided in the Appendix below). |
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object |
||||
form, that is based on (or derived from) the Work and for which the |
||||
editorial revisions, annotations, elaborations, or other modifications |
||||
represent, as a whole, an original work of authorship. For the purposes |
||||
of this License, Derivative Works shall not include works that remain |
||||
separable from, or merely link (or bind by name) to the interfaces of, |
||||
the Work and Derivative Works thereof. |
||||
|
||||
"Contribution" shall mean any work of authorship, including |
||||
the original version of the Work and any modifications or additions |
||||
to that Work or Derivative Works thereof, that is intentionally |
||||
submitted to Licensor for inclusion in the Work by the copyright owner |
||||
or by an individual or Legal Entity authorized to submit on behalf of |
||||
the copyright owner. For the purposes of this definition, "submitted" |
||||
means any form of electronic, verbal, or written communication sent |
||||
to the Licensor or its representatives, including but not limited to |
||||
communication on electronic mailing lists, source code control systems, |
||||
and issue tracking systems that are managed by, or on behalf of, the |
||||
Licensor for the purpose of discussing and improving the Work, but |
||||
excluding communication that is conspicuously marked or otherwise |
||||
designated in writing by the copyright owner as "Not a Contribution." |
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity |
||||
on behalf of whom a Contribution has been received by Licensor and |
||||
subsequently incorporated within the Work. |
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of |
||||
this License, each Contributor hereby grants to You a perpetual, |
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable |
||||
copyright license to reproduce, prepare Derivative Works of, |
||||
publicly display, publicly perform, sublicense, and distribute the |
||||
Work and such Derivative Works in Source or Object form. |
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of |
||||
this License, each Contributor hereby grants to You a perpetual, |
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable |
||||
(except as stated in this section) patent license to make, have made, |
||||
use, offer to sell, sell, import, and otherwise transfer the Work, |
||||
where such license applies only to those patent claims licensable |
||||
by such Contributor that are necessarily infringed by their |
||||
Contribution(s) alone or by combination of their Contribution(s) |
||||
with the Work to which such Contribution(s) was submitted. If You |
||||
institute patent litigation against any entity (including a |
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work |
||||
or a Contribution incorporated within the Work constitutes direct |
||||
or contributory patent infringement, then any patent licenses |
||||
granted to You under this License for that Work shall terminate |
||||
as of the date such litigation is filed. |
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the |
||||
Work or Derivative Works thereof in any medium, with or without |
||||
modifications, and in Source or Object form, provided that You |
||||
meet the following conditions: |
||||
|
||||
(a) You must give any other recipients of the Work or |
||||
Derivative Works a copy of this License; and |
||||
|
||||
(b) You must cause any modified files to carry prominent notices |
||||
stating that You changed the files; and |
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works |
||||
that You distribute, all copyright, patent, trademark, and |
||||
attribution notices from the Source form of the Work, |
||||
excluding those notices that do not pertain to any part of |
||||
the Derivative Works; and |
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its |
||||
distribution, then any Derivative Works that You distribute must |
||||
include a readable copy of the attribution notices contained |
||||
within such NOTICE file, excluding those notices that do not |
||||
pertain to any part of the Derivative Works, in at least one |
||||
of the following places: within a NOTICE text file distributed |
||||
as part of the Derivative Works; within the Source form or |
||||
documentation, if provided along with the Derivative Works; or, |
||||
within a display generated by the Derivative Works, if and |
||||
wherever such third-party notices normally appear. The contents |
||||
of the NOTICE file are for informational purposes only and |
||||
do not modify the License. You may add Your own attribution |
||||
notices within Derivative Works that You distribute, alongside |
||||
or as an addendum to the NOTICE text from the Work, provided |
||||
that such additional attribution notices cannot be construed |
||||
as modifying the License. |
||||
|
||||
You may add Your own copyright statement to Your modifications and |
||||
may provide additional or different license terms and conditions |
||||
for use, reproduction, or distribution of Your modifications, or |
||||
for any such Derivative Works as a whole, provided Your use, |
||||
reproduction, and distribution of the Work otherwise complies with |
||||
the conditions stated in this License. |
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise, |
||||
any Contribution intentionally submitted for inclusion in the Work |
||||
by You to the Licensor shall be under the terms and conditions of |
||||
this License, without any additional terms or conditions. |
||||
Notwithstanding the above, nothing herein shall supersede or modify |
||||
the terms of any separate license agreement you may have executed |
||||
with Licensor regarding such Contributions. |
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade |
||||
names, trademarks, service marks, or product names of the Licensor, |
||||
except as required for reasonable and customary use in describing the |
||||
origin of the Work and reproducing the content of the NOTICE file. |
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or |
||||
agreed to in writing, Licensor provides the Work (and each |
||||
Contributor provides its Contributions) on an "AS IS" BASIS, |
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or |
||||
implied, including, without limitation, any warranties or conditions |
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A |
||||
PARTICULAR PURPOSE. You are solely responsible for determining the |
||||
appropriateness of using or redistributing the Work and assume any |
||||
risks associated with Your exercise of permissions under this License. |
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory, |
||||
whether in tort (including negligence), contract, or otherwise, |
||||
unless required by applicable law (such as deliberate and grossly |
||||
negligent acts) or agreed to in writing, shall any Contributor be |
||||
liable to You for damages, including any direct, indirect, special, |
||||
incidental, or consequential damages of any character arising as a |
||||
result of this License or out of the use or inability to use the |
||||
Work (including but not limited to damages for loss of goodwill, |
||||
work stoppage, computer failure or malfunction, or any and all |
||||
other commercial damages or losses), even if such Contributor |
||||
has been advised of the possibility of such damages. |
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing |
||||
the Work or Derivative Works thereof, You may choose to offer, |
||||
and charge a fee for, acceptance of support, warranty, indemnity, |
||||
or other liability obligations and/or rights consistent with this |
||||
License. However, in accepting such obligations, You may act only |
||||
on Your own behalf and on Your sole responsibility, not on behalf |
||||
of any other Contributor, and only if You agree to indemnify, |
||||
defend, and hold each Contributor harmless for any liability |
||||
incurred by, or claims asserted against, such Contributor by reason |
||||
of your accepting any such warranty or additional liability. |
||||
|
||||
END OF TERMS AND CONDITIONS |
||||
|
||||
APPENDIX: How to apply the Apache License to your work. |
||||
|
||||
To apply the Apache License to your work, attach the following |
||||
boilerplate notice, with the fields enclosed by brackets "[]" |
||||
replaced with your own identifying information. (Don't include |
||||
the brackets!) The text should be enclosed in the appropriate |
||||
comment syntax for the file format. We also recommend that a |
||||
file or class name and description of purpose be included on the |
||||
same "printed page" as the copyright notice for easier |
||||
identification within third-party archives. |
||||
|
||||
Copyright [yyyy] [name of copyright owner] |
||||
|
||||
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. |
@ -0,0 +1,199 @@
@@ -0,0 +1,199 @@
|
||||
# Crouton |
||||
![Crouton](https://raw.github.com/keyboardsurfer/Crouton/master/sample/res/drawable-xhdpi/ic_launcher.png "Crouton logo") |
||||
|
||||
Context sensitive notifications for Android |
||||
|
||||
## Overview |
||||
|
||||
**Crouton** is a class that can be used by Android developers that feel the need for an **alternative to the Context insensitive [Toast](http://developer.android.com/reference/android/widget/Toast.html)**. |
||||
|
||||
A Crouton will be displayed at the position the developer decides. |
||||
Standard will be the of an application window. |
||||
You can line up multiple Croutons for display, that will be shown one after another. |
||||
|
||||
You can check some features in the Crouton Demo. |
||||
|
||||
<a href="http://play.google.com/store/apps/details?id=de.keyboardsurfer.app.demo.crouton"> |
||||
<img alt="Crouton Demo on Google Play" |
||||
src="http://developer.android.com/images/brand/en_generic_rgb_wo_60.png" /> |
||||
</a> |
||||
|
||||
If you're already using Crouton and just want to download the latest version of the library, follow [this link](http://search.maven.org/#search%7Cga%7C1%7Cg%3A%22de.keyboardsurfer.android.widget%22). |
||||
|
||||
### Changelog |
||||
#### Current version: 1.7 |
||||
|
||||
####[1.7](https://github.com/keyboardsurfer/Crouton/tree/1.7) |
||||
|
||||
- `Crouton.setOnClickListener(OnClickListener)` has been introduced. |
||||
- Infinite display of Crouton is possible via `Style.setDuration(Style.DURATION_INFINITE)` |
||||
- Via `Crouton.hide(Crouton)` a Crouton can be hidden. |
||||
|
||||
####[1.6](https://github.com/keyboardsurfer/Crouton/tree/1.6) |
||||
|
||||
- Crouton now can be used on any Android device with **API level 4+**. |
||||
- Changes the package name to `de.keyboardsurfer.android.widget` |
||||
- Adds possibility to set a custom width |
||||
- Can now be added to any ViewGroup (@coreform) |
||||
- Integration with TalkBack (@coreform) |
||||
- Adds Accessibility features (@coreform) |
||||
- Fixes bug that got Crouton out of sync with reality (@coreform) |
||||
- New [LifecycleCallback](https://github.com/keyboardsurfer/Crouton/blob/master/library/src/de/keyboardsurfer/android/widget/crouton/LifecycleCallback.java) (@coreform) |
||||
- initializeCroutonView was refactored, to make it easier on the eyes |
||||
- removes redundant initialization within Style.Builder |
||||
- documentation improvments |
||||
|
||||
#### older versions |
||||
|
||||
Please see the `git log` |
||||
|
||||
## Usage |
||||
|
||||
The API is kept as simple as the Toast API: |
||||
|
||||
Create a Crouton for any CharSequence: |
||||
|
||||
Crouton.makeText(Activity, CharSequence, [Style]).show(); |
||||
|
||||
Create a Crouton with a String from your application's resources: |
||||
|
||||
Crouton.makeText(Activity, int, Style).show(); |
||||
|
||||
Further you can attach a Crouton to any view like this: |
||||
|
||||
Crouton.makeText(Activity, int, Style, int).show(); |
||||
|
||||
If you would like a more graphical introduction to Crouton check out [this presentation](https://speakerdeck.com/keyboardsurfer/crouton-devfest-berlin-2012). |
||||
|
||||
##Important! |
||||
|
||||
In your Activity.onDestroy() make sure to call |
||||
|
||||
Crouton.cancelAllCroutons(); |
||||
|
||||
to cancel cancel all scheduled Croutons. |
||||
|
||||
This is a workaround and further description is available in #24. |
||||
|
||||
## Basic Examples |
||||
Currently you can use the three different Style attributes displayed below out of the box: |
||||
|
||||
![Alert](https://github.com/keyboardsurfer/Crouton/raw/master/res/Alert.png "Example of Style.ALERT") |
||||
|
||||
![Confirm](https://github.com/keyboardsurfer/Crouton/raw/master/res/Confirm.png "Example of Style.CONFIRM") |
||||
|
||||
![Info](https://github.com/keyboardsurfer/Crouton/raw/master/res/Info.png "Example of Style.INFO") |
||||
|
||||
## Extension and Modification |
||||
|
||||
The whole design of a Crouton is defined by [Style](https://github.com/keyboardsurfer/Crouton/blob/master/library/src/de/keyboardsurfer/android/widget/crouton/Style.java). |
||||
|
||||
You can use one of the styles Crouton ships with: **Style.ALERT**, **Style.CONFIRM** and **Style.INFO**. Or you can create your own Style. |
||||
|
||||
In general you can modify |
||||
|
||||
- display duration |
||||
- dimension settings |
||||
- options for the text to display |
||||
- custom Views |
||||
- appearance & disappearance Animation |
||||
- displayed Image |
||||
|
||||
Since [Style](https://github.com/keyboardsurfer/Crouton/blob/master/library/src/de/keyboardsurfer/android/widget/crouton/Style.java) is the general entry point for tweaking Croutons, go and see for yourself what can be done with it. |
||||
|
||||
|
||||
## Maven |
||||
|
||||
### From maven central |
||||
|
||||
Crouton is available in the maven central repository. |
||||
|
||||
To use crouton simply add |
||||
|
||||
```xml |
||||
<dependency> |
||||
<artifactId>crouton</artifactId> |
||||
<version>1.7</version> |
||||
<groupId>de.keyboardsurfer.android.widget</groupId> |
||||
</dependency> |
||||
``` |
||||
|
||||
to your pom.xml |
||||
|
||||
If you also want the sources or javadoc add the respective classifier |
||||
|
||||
```xml |
||||
<classifier>sources</classifier> |
||||
``` |
||||
|
||||
or |
||||
|
||||
```xml |
||||
<classifier>javadoc</classifier> |
||||
``` |
||||
to the dependency. |
||||
|
||||
If you are referencing a newer version of the Android Support Library in your application, you might want to exclude Crouton's dependency like this: |
||||
|
||||
```xml |
||||
<dependency> |
||||
<artifactId>crouton</artifactId> |
||||
<version>${crouton.version}</version> |
||||
<groupId>de.keyboardsurfer.android.widget</groupId> |
||||
<exclusions> |
||||
<exclusion> |
||||
<groupId>com.google.android</groupId> |
||||
<artifactId>support-v4</artifactId> |
||||
</exclusion> |
||||
</exclusions> |
||||
</dependency> |
||||
``` |
||||
|
||||
### DIY |
||||
|
||||
The build requires Maven. Operations are very simple: |
||||
|
||||
* `mvn -f library/pom.xml clean package` will build a `jar` library; |
||||
* `mvn clean package` will build a `jar` library and the sample application `apk`; |
||||
* `mvn -f library/pom.xml clean install` will put Crouton in your local Maven repository. |
||||
|
||||
After putting Crouton in the repository you can add it as a dependency. |
||||
|
||||
```xml |
||||
<dependency> |
||||
<artifactId>crouton</artifactId> |
||||
<version>1.6</version> |
||||
<groupId>de.keyboardsurfer.android.widget</groupId> |
||||
</dependency> |
||||
``` |
||||
|
||||
## Contribution |
||||
|
||||
### Pull requests welcome |
||||
|
||||
Feel free to contribute to Crouton. |
||||
|
||||
Either you found a bug or have created a new and awesome feature, just create a pull request. |
||||
|
||||
If you want to start to create a new feature or have any other questions regarding Crouton, [file an issue](https://github.com/keyboardsurfer/Crouton/issues/new). |
||||
I'll try to answer as soon as I find the time. |
||||
|
||||
### Formatting |
||||
|
||||
For contributors using Eclipse there's a formatter available at the [download section](https://github.com/downloads/keyboardsurfer/Crouton/Crouton_Eclipseformatter.xml). |
||||
|
||||
In order to reduce merging pains on my end, please use this formatter or format your commit in a way similar to it's example. |
||||
|
||||
If you're using IDEA, the Eclipse Formatter plugin should allow you to use the formatter as well. |
||||
|
||||
## License |
||||
|
||||
* [Apache Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.html) |
||||
|
||||
## Attributions |
||||
|
||||
The initial version was written by <a href="https://plus.google.com/u/0/117509657298845443204?rel=author">Benjamin Weiss</a> at [Neofonie Mobile GmbH](http://mobile.neofonie.de). |
||||
|
||||
The name and the idea of [Crouton](https://github.com/keyboardsurfer/Crouton/blob/master/library/src/de/keyboardsurfer/android/widget/crouton/Crouton.java) originates in a [blog article](http://android.cyrilmottier.com/?p=773) by Cyril Mottier. |
||||
|
||||
The Crouton logo has been created by [Marie Schweiz](http://marie-schweiz.de). |
@ -0,0 +1,8 @@
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<classpath> |
||||
<classpathentry kind="src" path="src"/> |
||||
<classpathentry kind="src" path="gen"/> |
||||
<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/> |
||||
<classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/> |
||||
<classpathentry kind="output" path="bin/classes"/> |
||||
</classpath> |
@ -0,0 +1,33 @@
@@ -0,0 +1,33 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<projectDescription> |
||||
<name>Crouton</name> |
||||
<comment></comment> |
||||
<projects> |
||||
</projects> |
||||
<buildSpec> |
||||
<buildCommand> |
||||
<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name> |
||||
<arguments> |
||||
</arguments> |
||||
</buildCommand> |
||||
<buildCommand> |
||||
<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name> |
||||
<arguments> |
||||
</arguments> |
||||
</buildCommand> |
||||
<buildCommand> |
||||
<name>org.eclipse.jdt.core.javabuilder</name> |
||||
<arguments> |
||||
</arguments> |
||||
</buildCommand> |
||||
<buildCommand> |
||||
<name>com.android.ide.eclipse.adt.ApkBuilder</name> |
||||
<arguments> |
||||
</arguments> |
||||
</buildCommand> |
||||
</buildSpec> |
||||
<natures> |
||||
<nature>com.android.ide.eclipse.adt.AndroidNature</nature> |
||||
<nature>org.eclipse.jdt.core.javanature</nature> |
||||
</natures> |
||||
</projectDescription> |
@ -0,0 +1,25 @@
@@ -0,0 +1,25 @@
|
||||
<?xml version="1.0" encoding="utf-8"?> |
||||
<!-- |
||||
~ Copyright 2012 Neofonie Mobile GmbH |
||||
~ Copyright 2012 - 2013 Benjamin Weiss |
||||
~ |
||||
~ 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. |
||||
--> |
||||
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android" |
||||
package="de.keyboardsurfer.mobile.app.android.widget.crouton" |
||||
android:versionCode="1" |
||||
android:versionName="1.7" |
||||
android:minSdkVersion="4"> |
||||
|
||||
</manifest> |
@ -0,0 +1,92 @@
@@ -0,0 +1,92 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<project name="library" default="help"> |
||||
|
||||
<!-- The local.properties file is created and updated by the 'android' tool. |
||||
It contains the path to the SDK. It should *NOT* be checked into |
||||
Version Control Systems. --> |
||||
<property file="local.properties" /> |
||||
|
||||
<!-- The ant.properties file can be created by you. It is only edited by the |
||||
'android' tool to add properties to it. |
||||
This is the place to change some Ant specific build properties. |
||||
Here are some properties you may want to change/update: |
||||
|
||||
source.dir |
||||
The name of the source directory. Default is 'src'. |
||||
out.dir |
||||
The name of the output directory. Default is 'bin'. |
||||
|
||||
For other overridable properties, look at the beginning of the rules |
||||
files in the SDK, at tools/ant/build.xml |
||||
|
||||
Properties related to the SDK location or the project target should |
||||
be updated using the 'android' tool with the 'update' action. |
||||
|
||||
This file is an integral part of the build system for your |
||||
application and should be checked into Version Control Systems. |
||||
|
||||
--> |
||||
<property file="ant.properties" /> |
||||
|
||||
<!-- if sdk.dir was not set from one of the property file, then |
||||
get it from the ANDROID_HOME env var. |
||||
This must be done before we load project.properties since |
||||
the proguard config can use sdk.dir --> |
||||
<property environment="env" /> |
||||
<condition property="sdk.dir" value="${env.ANDROID_HOME}"> |
||||
<isset property="env.ANDROID_HOME" /> |
||||
</condition> |
||||
|
||||
<!-- The project.properties file is created and updated by the 'android' |
||||
tool, as well as ADT. |
||||
|
||||
This contains project specific properties such as project target, and library |
||||
dependencies. Lower level build properties are stored in ant.properties |
||||
(or in .classpath for Eclipse projects). |
||||
|
||||
This file is an integral part of the build system for your |
||||
application and should be checked into Version Control Systems. --> |
||||
<loadproperties srcFile="project.properties" /> |
||||
|
||||
<!-- quick check on sdk.dir --> |
||||
<fail |
||||
message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable." |
||||
unless="sdk.dir" |
||||
/> |
||||
|
||||
<!-- |
||||
Import per project custom build rules if present at the root of the project. |
||||
This is the place to put custom intermediary targets such as: |
||||
-pre-build |
||||
-pre-compile |
||||
-post-compile (This is typically used for code obfuscation. |
||||
Compiled code location: ${out.classes.absolute.dir} |
||||
If this is not done in place, override ${out.dex.input.absolute.dir}) |
||||
-post-package |
||||
-post-build |
||||
-pre-clean |
||||
--> |
||||
<import file="custom_rules.xml" optional="true" /> |
||||
|
||||
<!-- Import the actual build file. |
||||
|
||||
To customize existing targets, there are two options: |
||||
- Customize only one target: |
||||
- copy/paste the target into this file, *before* the |
||||
<import> task. |
||||
- customize it to your needs. |
||||
- Customize the whole content of build.xml |
||||
- copy/paste the content of the rules files (minus the top node) |
||||
into this file, replacing the <import> task. |
||||
- customize to your needs. |
||||
|
||||
*********************** |
||||
****** IMPORTANT ****** |
||||
*********************** |
||||
In all cases you must update the value of version-tag below to read 'custom' instead of an integer, |
||||
in order to avoid having your file be overridden by tools such as "android update project" |
||||
--> |
||||
<!-- version-tag: 1 --> |
||||
<import file="${sdk.dir}/tools/ant/build.xml" /> |
||||
|
||||
</project> |
@ -0,0 +1,112 @@
@@ -0,0 +1,112 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
|
||||
<!-- |
||||
~ Copyright 2012 - 2013 Benjamin Weiss |
||||
~ Copyright 2012 Neofonie Mobile GmbH |
||||
~ |
||||
~ 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. |
||||
--> |
||||
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" |
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> |
||||
<modelVersion>4.0.0</modelVersion> |
||||
|
||||
<name>Crouton</name> |
||||
<description>Context sensitive notifications for Android</description> |
||||
<url>https://github.com/keyboardsurfer/Crouton</url> |
||||
<artifactId>crouton</artifactId> |
||||
<groupId>de.keyboardsurfer.android.widget</groupId> |
||||
<version>1.7</version> |
||||
<packaging>jar</packaging> |
||||
|
||||
<properties> |
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> |
||||
<android.version>4.1.1.4</android.version> |
||||
<android.version.platform>16</android.version.platform> |
||||
</properties> |
||||
|
||||
<developers> |
||||
<developer> |
||||
<id>keyboardsurfer</id> |
||||
<name>Benjamin Weiss</name> |
||||
</developer> |
||||
</developers> |
||||
|
||||
<licenses> |
||||
<license> |
||||
<name>The Apache Software License, Version 2.0</name> |
||||
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url> |
||||
<distribution>repo</distribution> |
||||
</license> |
||||
</licenses> |
||||
|
||||
<scm> |
||||
<url>git@github.com:keyboardsurfer/Crouton.git</url> |
||||
<developerConnection>scm:git:git@github.com:keyboardsurfer/Crouton.git</developerConnection> |
||||
<connection>scm:git:git@github.com:keyboardsurfer/Crouton.git</connection> |
||||
</scm> |
||||
|
||||
<dependencies> |
||||
<dependency> |
||||
<artifactId>android</artifactId> |
||||
<version>${android.version}</version> |
||||
<groupId>com.google.android</groupId> |
||||
<scope>provided</scope> |
||||
</dependency> |
||||
<dependency> |
||||
<groupId>com.google.android</groupId> |
||||
<artifactId>support-v4</artifactId> |
||||
<version>r11</version> |
||||
</dependency> |
||||
</dependencies> |
||||
|
||||
<build> |
||||
<sourceDirectory>src</sourceDirectory> |
||||
|
||||
<plugins> |
||||
<plugin> |
||||
<groupId>org.apache.maven.plugins</groupId> |
||||
<artifactId>maven-source-plugin</artifactId> |
||||
<version>2.2.1</version> |
||||
<executions> |
||||
<execution> |
||||
<id>attach-sources</id> |
||||
<goals> |
||||
<goal>jar</goal> |
||||
</goals> |
||||
</execution> |
||||
</executions> |
||||
</plugin> |
||||
<plugin> |
||||
<groupId>org.apache.maven.plugins</groupId> |
||||
<artifactId>maven-javadoc-plugin</artifactId> |
||||
<version>2.9</version> |
||||
<executions> |
||||
<execution> |
||||
<id>attach-javadocs</id> |
||||
<goals> |
||||
<goal>jar</goal> |
||||
</goals> |
||||
</execution> |
||||
</executions> |
||||
</plugin> |
||||
<plugin> |
||||
<groupId>com.jayway.maven.plugins.android.generation2</groupId> |
||||
<artifactId>android-maven-plugin</artifactId> |
||||
<version>3.5.0</version> |
||||
</plugin> |
||||
</plugins> |
||||
</build> |
||||
|
||||
</project> |
@ -0,0 +1,17 @@
@@ -0,0 +1,17 @@
|
||||
# This file is automatically generated by Android Tools. |
||||
# Do not modify this file -- YOUR CHANGES WILL BE ERASED! |
||||
# |
||||
# This file must be checked in Version Control Systems. |
||||
# |
||||
# To customize properties used by the Ant build system edit |
||||
# "ant.properties", and override values to adapt the script to your |
||||
# project structure. |
||||
# |
||||
# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): |
||||
#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt |
||||
|
||||
# Project target. |
||||
|
||||
target=android-16 |
||||
android.library=true |
||||
android.library.reference.1=../../JakeWharton-ActionBarSherlock/library |
@ -0,0 +1,825 @@
@@ -0,0 +1,825 @@
|
||||
/* |
||||
* Copyright 2012 - 2013 Benjamin Weiss |
||||
* Copyright 2012 Neofonie Mobile GmbH |
||||
* |
||||
* 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 de.keyboardsurfer.android.widget.crouton; |
||||
|
||||
import android.app.Activity; |
||||
import android.content.Context; |
||||
import android.content.res.Resources; |
||||
import android.graphics.Bitmap; |
||||
import android.graphics.BitmapFactory; |
||||
import android.graphics.Shader; |
||||
import android.graphics.Typeface; |
||||
import android.graphics.drawable.BitmapDrawable; |
||||
import android.util.TypedValue; |
||||
import android.view.View; |
||||
import android.view.View.OnClickListener; |
||||
import android.view.ViewGroup; |
||||
import android.view.animation.Animation; |
||||
import android.view.animation.AnimationUtils; |
||||
import android.widget.FrameLayout; |
||||
import android.widget.ImageView; |
||||
import android.widget.RelativeLayout; |
||||
import android.widget.TextView; |
||||
|
||||
/* |
||||
* Based on an article by Cyril Mottier (http://android.cyrilmottier.com/?p=773) <br>
|
||||
*/ |
||||
|
||||
|
||||
/** |
||||
* Displays information in a non-invasive context related manner. Like |
||||
* {@link android.widget.Toast}, but better. |
||||
* <p/> |
||||
* <b>Important: </b> |
||||
* Call {@link Crouton#clearCroutonsForActivity(Activity)} within |
||||
* {@link android.app.Activity#onDestroy()} to avoid {@link Context} leaks. |
||||
*/ |
||||
public final class Crouton { |
||||
private static final int IMAGE_ID = 0x100; |
||||
private static final int TEXT_ID = 0x101; |
||||
private final CharSequence text; |
||||
private final Style style; |
||||
private final View customView; |
||||
|
||||
private OnClickListener onClickListener; |
||||
|
||||
private Activity activity; |
||||
private ViewGroup viewGroup; |
||||
private FrameLayout croutonView; |
||||
private Animation inAnimation; |
||||
private Animation outAnimation; |
||||
private LifecycleCallback lifecycleCallback = null; |
||||
|
||||
/** |
||||
* Creates the {@link Crouton}. |
||||
* |
||||
* @param activity |
||||
* The {@link Activity} that the {@link Crouton} should be attached |
||||
* to. |
||||
* @param text |
||||
* The text you want to display. |
||||
* @param style |
||||
* The style that this {@link Crouton} should be created with. |
||||
*/ |
||||
private Crouton(Activity activity, CharSequence text, Style style) { |
||||
if ((activity == null) || (text == null) || (style == null)) { |
||||
throw new IllegalArgumentException("Null parameters are not accepted"); |
||||
} |
||||
|
||||
this.activity = activity; |
||||
this.viewGroup = null; |
||||
this.text = text; |
||||
this.style = style; |
||||
this.customView = null; |
||||
} |
||||
|
||||
/** |
||||
* Creates the {@link Crouton}. |
||||
* |
||||
* @param activity |
||||
* The {@link Activity} that represents the context in which the Crouton should exist. |
||||
* @param text |
||||
* The text you want to display. |
||||
* @param style |
||||
* The style that this {@link Crouton} should be created with. |
||||
* @param viewGroup |
||||
* The {@link ViewGroup} that this {@link Crouton} should be added to. |
||||
*/ |
||||
private Crouton(Activity activity, CharSequence text, Style style, ViewGroup viewGroup) { |
||||
if ((activity == null) || (text == null) || (style == null)) { |
||||
throw new IllegalArgumentException("Null parameters are not accepted"); |
||||
} |
||||
|
||||
this.activity = activity; |
||||
this.text = text; |
||||
this.style = style; |
||||
this.viewGroup = viewGroup; |
||||
this.customView = null; |
||||
} |
||||
|
||||
/** |
||||
* Creates the {@link Crouton}. |
||||
* |
||||
* @param activity |
||||
* The {@link Activity} that the {@link Crouton} should be attached |
||||
* to. |
||||
* @param customView |
||||
* The custom {@link View} to display |
||||
*/ |
||||
private Crouton(Activity activity, View customView) { |
||||
if ((activity == null) || (customView == null)) { |
||||
throw new IllegalArgumentException("Null parameters are not accepted"); |
||||
} |
||||
|
||||
this.activity = activity; |
||||
this.viewGroup = null; |
||||
this.customView = customView; |
||||
this.style = new Style.Builder().build(); |
||||
this.text = null; |
||||
} |
||||
|
||||
/** |
||||
* Creates the {@link Crouton}. |
||||
* |
||||
* @param activity |
||||
* The {@link Activity} that represents the context in which the Crouton should exist. |
||||
* @param customView |
||||
* The custom {@link View} to display |
||||
* @param viewGroup |
||||
* The {@link ViewGroup} that this {@link Crouton} should be added to. |
||||
*/ |
||||
private Crouton(Activity activity, View customView, ViewGroup viewGroup) { |
||||
if ((activity == null) || (customView == null)) { |
||||
throw new IllegalArgumentException("Null parameters are not accepted"); |
||||
} |
||||
|
||||
this.activity = activity; |
||||
this.customView = customView; |
||||
this.viewGroup = viewGroup; |
||||
this.style = new Style.Builder().build(); |
||||
this.text = null; |
||||
} |
||||
|
||||
/** |
||||
* Creates a {@link Crouton} with provided text and style for a given |
||||
* activity. |
||||
* |
||||
* @param activity |
||||
* The {@link Activity} that the {@link Crouton} should be attached |
||||
* to. |
||||
* @param text |
||||
* The text you want to display. |
||||
* @param style |
||||
* The style that this {@link Crouton} should be created with. |
||||
* |
||||
* @return The created {@link Crouton}. |
||||
*/ |
||||
public static Crouton makeText(Activity activity, CharSequence text, Style style) { |
||||
return new Crouton(activity, text, style); |
||||
} |
||||
|
||||
/** |
||||
* Creates a {@link Crouton} with provided text and style for a given |
||||
* activity. |
||||
* |
||||
* @param activity |
||||
* The {@link Activity} that represents the context in which the Crouton should exist. |
||||
* @param text |
||||
* The text you want to display. |
||||
* @param style |
||||
* The style that this {@link Crouton} should be created with. |
||||
* @param viewGroup |
||||
* The {@link ViewGroup} that this {@link Crouton} should be added to. |
||||
* |
||||
* @return The created {@link Crouton}. |
||||
*/ |
||||
public static Crouton makeText(Activity activity, CharSequence text, Style style, ViewGroup viewGroup) { |
||||
return new Crouton(activity, text, style, viewGroup); |
||||
} |
||||
|
||||
/** |
||||
* Creates a {@link Crouton} with provided text and style for a given |
||||
* activity. |
||||
* |
||||
* @param activity |
||||
* The {@link Activity} that represents the context in which the Crouton should exist. |
||||
* @param text |
||||
* The text you want to display. |
||||
* @param style |
||||
* The style that this {@link Crouton} should be created with. |
||||
* @param viewGroupResId |
||||
* The resource id of the {@link ViewGroup} that this {@link Crouton} should be added to. |
||||
* |
||||
* @return The created {@link Crouton}. |
||||
*/ |
||||
public static Crouton makeText(Activity activity, CharSequence text, Style style, int viewGroupResId) { |
||||
return new Crouton(activity, text, style, (ViewGroup) activity.findViewById(viewGroupResId)); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* Creates a {@link Crouton} with provided text-resource and style for a given |
||||
* activity. |
||||
* |
||||
* @param activity |
||||
* The {@link Activity} that the {@link Crouton} should be attached |
||||
* to. |
||||
* @param textResourceId |
||||
* The resource id of the text you want to display. |
||||
* @param style |
||||
* The style that this {@link Crouton} should be created with. |
||||
* |
||||
* @return The created {@link Crouton}. |
||||
*/ |
||||
public static Crouton makeText(Activity activity, int textResourceId, Style style) { |
||||
return makeText(activity, activity.getString(textResourceId), style); |
||||
} |
||||
|
||||
/** |
||||
* Creates a {@link Crouton} with provided text-resource and style for a given |
||||
* activity. |
||||
* |
||||
* @param activity |
||||
* The {@link Activity} that represents the context in which the Crouton should exist. |
||||
* @param textResourceId |
||||
* The resource id of the text you want to display. |
||||
* @param style |
||||
* The style that this {@link Crouton} should be created with. |
||||
* @param viewGroup |
||||
* The {@link ViewGroup} that this {@link Crouton} should be added to. |
||||
* |
||||
* @return The created {@link Crouton}. |
||||
*/ |
||||
public static Crouton makeText(Activity activity, int textResourceId, Style style, ViewGroup viewGroup) { |
||||
return makeText(activity, activity.getString(textResourceId), style, viewGroup); |
||||
} |
||||
|
||||
/** |
||||
* Creates a {@link Crouton} with provided text-resource and style for a given |
||||
* activity. |
||||
* |
||||
* @param activity |
||||
* The {@link Activity} that represents the context in which the Crouton should exist. |
||||
* @param textResourceId |
||||
* The resource id of the text you want to display. |
||||
* @param style |
||||
* The style that this {@link Crouton} should be created with. |
||||
* @param viewGroupResId |
||||
* The resource id of the {@link ViewGroup} that this {@link Crouton} should be added to. |
||||
* |
||||
* @return The created {@link Crouton}. |
||||
*/ |
||||
public static Crouton makeText(Activity activity, int textResourceId, Style style, int viewGroupResId) { |
||||
return makeText(activity, activity.getString(textResourceId), style, |
||||
(ViewGroup) activity.findViewById(viewGroupResId)); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* Creates a {@link Crouton} with provided text-resource and style for a given |
||||
* activity. |
||||
* |
||||
* @param activity |
||||
* The {@link Activity} that the {@link Crouton} should be attached |
||||
* to. |
||||
* @param customView |
||||
* The custom {@link View} to display |
||||
* |
||||
* @return The created {@link Crouton}. |
||||
*/ |
||||
public static Crouton make(Activity activity, View customView) { |
||||
return new Crouton(activity, customView); |
||||
} |
||||
|
||||
/** |
||||
* Creates a {@link Crouton} with provided text-resource and style for a given |
||||
* activity. |
||||
* |
||||
* @param activity |
||||
* The {@link Activity} that represents the context in which the Crouton should exist. |
||||
* @param customView |
||||
* The custom {@link View} to display |
||||
* @param viewGroup |
||||
* The {@link ViewGroup} that this {@link Crouton} should be added to. |
||||
* |
||||
* @return The created {@link Crouton}. |
||||
*/ |
||||
public static Crouton make(Activity activity, View customView, ViewGroup viewGroup) { |
||||
return new Crouton(activity, customView, viewGroup); |
||||
} |
||||
|
||||
/** |
||||
* Creates a {@link Crouton} with provided text-resource and style for a given |
||||
* activity. |
||||
* |
||||
* @param activity |
||||
* The {@link Activity} that represents the context in which the Crouton should exist. |
||||
* @param customView |
||||
* The custom {@link View} to display |
||||
* @param viewGroupResId |
||||
* The resource id of the {@link ViewGroup} that this {@link Crouton} should be added to. |
||||
* |
||||
* @return The created {@link Crouton}. |
||||
*/ |
||||
public static Crouton make(Activity activity, View customView, int viewGroupResId) { |
||||
return new Crouton(activity, customView, (ViewGroup) activity.findViewById(viewGroupResId)); |
||||
} |
||||
|
||||
/** |
||||
* Creates a {@link Crouton} with provided text and style for a given activity |
||||
* and displays it directly. |
||||
* |
||||
* @param activity |
||||
* The {@link android.app.Activity} that the {@link Crouton} should |
||||
* be attached to. |
||||
* @param text |
||||
* The text you want to display. |
||||
* @param style |
||||
* The style that this {@link Crouton} should be created with. |
||||
*/ |
||||
public static void showText(Activity activity, CharSequence text, Style style) { |
||||
makeText(activity, text, style).show(); |
||||
} |
||||
|
||||
/** |
||||
* Creates a {@link Crouton} with provided text and style for a given activity |
||||
* and displays it directly. |
||||
* |
||||
* @param activity |
||||
* The {@link Activity} that represents the context in which the Crouton should exist. |
||||
* @param text |
||||
* The text you want to display. |
||||
* @param style |
||||
* The style that this {@link Crouton} should be created with. |
||||
* @param viewGroup |
||||
* The {@link ViewGroup} that this {@link Crouton} should be added to. |
||||
*/ |
||||
public static void showText(Activity activity, CharSequence text, Style style, ViewGroup viewGroup) { |
||||
makeText(activity, text, style, viewGroup).show(); |
||||
} |
||||
|
||||
/** |
||||
* Creates a {@link Crouton} with provided text and style for a given activity |
||||
* and displays it directly. |
||||
* |
||||
* @param activity |
||||
* The {@link Activity} that represents the context in which the Crouton should exist. |
||||
* @param text |
||||
* The text you want to display. |
||||
* @param style |
||||
* The style that this {@link Crouton} should be created with. |
||||
* @param viewGroupResId |
||||
* The resource id of the {@link ViewGroup} that this {@link Crouton} should be added to. |
||||
*/ |
||||
public static void showText(Activity activity, CharSequence text, Style style, int viewGroupResId) { |
||||
makeText(activity, text, style, (ViewGroup) activity.findViewById(viewGroupResId)).show(); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* Creates a {@link Crouton} with provided text and style for a given activity |
||||
* and displays it directly. |
||||
* |
||||
* @param activity |
||||
* The {@link android.app.Activity} that the {@link Crouton} should |
||||
* be attached to. |
||||
* @param customView |
||||
* The custom {@link View} to display |
||||
*/ |
||||
public static void show(Activity activity, View customView) { |
||||
make(activity, customView).show(); |
||||
} |
||||
|
||||
/** |
||||
* Creates a {@link Crouton} with provided text and style for a given activity |
||||
* and displays it directly. |
||||
* |
||||
* @param activity |
||||
* The {@link Activity} that represents the context in which the Crouton should exist. |
||||
* @param customView |
||||
* The custom {@link View} to display |
||||
* @param viewGroup |
||||
* The {@link ViewGroup} that this {@link Crouton} should be added to. |
||||
*/ |
||||
public static void show(Activity activity, View customView, ViewGroup viewGroup) { |
||||
make(activity, customView, viewGroup).show(); |
||||
} |
||||
|
||||
/** |
||||
* Creates a {@link Crouton} with provided text and style for a given activity |
||||
* and displays it directly. |
||||
* |
||||
* @param activity |
||||
* The {@link Activity} that represents the context in which the Crouton should exist. |
||||
* @param customView |
||||
* The custom {@link View} to display |
||||
* @param viewGroupResId |
||||
* The resource id of the {@link ViewGroup} that this {@link Crouton} should be added to. |
||||
*/ |
||||
public static void show(Activity activity, View customView, int viewGroupResId) { |
||||
make(activity, customView, viewGroupResId).show(); |
||||
} |
||||
|
||||
/** |
||||
* Creates a {@link Crouton} with provided text-resource and style for a given |
||||
* activity and displays it directly. |
||||
* |
||||
* @param activity |
||||
* The {@link Activity} that the {@link Crouton} should be attached |
||||
* to. |
||||
* @param textResourceId |
||||
* The resource id of the text you want to display. |
||||
* @param style |
||||
* The style that this {@link Crouton} should be created with. |
||||
*/ |
||||
public static void showText(Activity activity, int textResourceId, Style style) { |
||||
showText(activity, activity.getString(textResourceId), style); |
||||
} |
||||
|
||||
/** |
||||
* Creates a {@link Crouton} with provided text-resource and style for a given |
||||
* activity and displays it directly. |
||||
* |
||||
* @param activity |
||||
* The {@link Activity} that represents the context in which the Crouton should exist. |
||||
* @param textResourceId |
||||
* The resource id of the text you want to display. |
||||
* @param style |
||||
* The style that this {@link Crouton} should be created with. |
||||
* @param viewGroup |
||||
* The {@link ViewGroup} that this {@link Crouton} should be added to. |
||||
*/ |
||||
public static void showText(Activity activity, int textResourceId, Style style, ViewGroup viewGroup) { |
||||
showText(activity, activity.getString(textResourceId), style, viewGroup); |
||||
} |
||||
|
||||
/** |
||||
* Creates a {@link Crouton} with provided text-resource and style for a given |
||||
* activity and displays it directly. |
||||
* |
||||
* @param activity |
||||
* The {@link Activity} that represents the context in which the Crouton should exist. |
||||
* @param textResourceId |
||||
* The resource id of the text you want to display. |
||||
* @param style |
||||
* The style that this {@link Crouton} should be created with. |
||||
* @param viewGroupResId |
||||
* The resource id of the {@link ViewGroup} that this {@link Crouton} should be added to. |
||||
*/ |
||||
public static void showText(Activity activity, int textResourceId, Style style, int viewGroupResId) { |
||||
showText(activity, activity.getString(textResourceId), style, viewGroupResId); |
||||
} |
||||
|
||||
/** |
||||
* Allows hiding of a previously displayed {@link Crouton}. |
||||
* @param crouton The {@link Crouton} you want to hide. |
||||
*/ |
||||
public static void hide(Crouton crouton) { |
||||
Manager.getInstance().removeCrouton(crouton); |
||||
} |
||||
|
||||
/** |
||||
* Cancels all queued {@link Crouton}s. If there is a {@link Crouton} |
||||
* displayed currently, it will be the last one displayed. |
||||
*/ |
||||
public static void cancelAllCroutons() { |
||||
Manager.getInstance().clearCroutonQueue(); |
||||
} |
||||
|
||||
/** |
||||
* Clears (and removes from {@link Activity}'s content view, if necessary) all |
||||
* croutons for the provided activity |
||||
* |
||||
* @param activity |
||||
* - The {@link Activity} to clear the croutons for. |
||||
*/ |
||||
public static void clearCroutonsForActivity(Activity activity) { |
||||
Manager.getInstance().clearCroutonsForActivity(activity); |
||||
} |
||||
|
||||
/** |
||||
* Cancels a {@link Crouton} immediately. |
||||
*/ |
||||
public void cancel() { |
||||
Manager manager = Manager.getInstance(); |
||||
manager.removeCroutonImmediately(this); |
||||
} |
||||
|
||||
/** |
||||
* Displays the {@link Crouton}. If there's another {@link Crouton} visible at |
||||
* the time, this {@link Crouton} will be displayed afterwards. |
||||
*/ |
||||
public void show() { |
||||
Manager.getInstance().add(this); |
||||
} |
||||
|
||||
public Animation getInAnimation() { |
||||
if ((null == this.inAnimation) && (null != this.activity)) { |
||||
if (getStyle().inAnimationResId > 0) { |
||||
this.inAnimation = AnimationUtils.loadAnimation(getActivity(), getStyle().inAnimationResId); |
||||
} else { |
||||
this.inAnimation = DefaultAnimationsBuilder.buildDefaultSlideInDownAnimation(); |
||||
} |
||||
} |
||||
|
||||
return inAnimation; |
||||
} |
||||
|
||||
public Animation getOutAnimation() { |
||||
if ((null == this.outAnimation) && (null != this.activity)) { |
||||
if (getStyle().outAnimationResId > 0) { |
||||
this.outAnimation = AnimationUtils.loadAnimation(getActivity(), getStyle().outAnimationResId); |
||||
} else { |
||||
this.outAnimation = DefaultAnimationsBuilder.buildDefaultSlideOutUpAnimation(); |
||||
} |
||||
} |
||||
|
||||
return outAnimation; |
||||
} |
||||
|
||||
/** |
||||
* @param lifecycleCallback |
||||
* Callback object for notable events in the life of a Crouton. |
||||
*/ |
||||
public void setLifecycleCallback(LifecycleCallback lifecycleCallback) { |
||||
this.lifecycleCallback = lifecycleCallback; |
||||
} |
||||
|
||||
/** |
||||
* Convenience method to get the license text for embedding within your application. |
||||
* @return |
||||
* The license text. |
||||
*/ |
||||
public String getLicenseText() { |
||||
return "This application uses the Crouton library.\n\n" + |
||||
"Copyright 2012 - 2013 Benjamin Weiss \n" + |
||||
"Copyright 2012 Neofonie Mobile GmbH\n" + |
||||
"\n" + |
||||
"Licensed under the Apache License, Version 2.0 (the \"License\");\n" + |
||||
"you may not use this file except in compliance with the License.\n" + |
||||
"You may obtain a copy of the License at\n" + |
||||
"\n" + |
||||
" http://www.apache.org/licenses/LICENSE-2.0\n" + |
||||
"\n" + |
||||
"Unless required by applicable law or agreed to in writing, software\n" + |
||||
"distributed under the License is distributed on an \"AS IS\" BASIS,\n" + |
||||
"WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n" + |
||||
"See the License for the specific language governing permissions and\n" + |
||||
"limitations under the License."; |
||||
} |
||||
|
||||
/** |
||||
* Allows setting of an {@link OnClickListener} directly to a {@link Crouton} without having to use a custom view. |
||||
* @param onClickListener The {@link OnClickListener} to set. |
||||
* @return this {@link Crouton}. |
||||
*/ |
||||
public Crouton setOnClickListener(OnClickListener onClickListener){ |
||||
this.onClickListener = onClickListener; |
||||
return this; |
||||
} |
||||
|
||||
/** |
||||
* @return <code>true</code> if the {@link Crouton} is being displayed, else |
||||
* <code>false</code>. |
||||
*/ |
||||
boolean isShowing() { |
||||
return (null != activity) && (null != croutonView) && (null != croutonView.getParent()); |
||||
} |
||||
|
||||
/** |
||||
* Removes the activity reference this {@link Crouton} is holding |
||||
*/ |
||||
void detachActivity() { |
||||
activity = null; |
||||
} |
||||
|
||||
/** |
||||
* Removes the viewGroup reference this {@link Crouton} is holding |
||||
*/ |
||||
void detachViewGroup() { |
||||
viewGroup = null; |
||||
} |
||||
|
||||
/** |
||||
* Removes the lifecycleCallback reference this {@link Crouton} is holding |
||||
*/ |
||||
void detachLifecycleCallback() { |
||||
lifecycleCallback = null; |
||||
} |
||||
|
||||
/** |
||||
* @return the lifecycleCallback |
||||
*/ |
||||
LifecycleCallback getLifecycleCallback() { |
||||
return lifecycleCallback; |
||||
} |
||||
|
||||
/** |
||||
* @return the style |
||||
*/ |
||||
Style getStyle() { |
||||
return style; |
||||
} |
||||
|
||||
/** |
||||
* @return the activity |
||||
*/ |
||||
Activity getActivity() { |
||||
return activity; |
||||
} |
||||
|
||||
/** |
||||
* @return the viewGroup |
||||
*/ |
||||
ViewGroup getViewGroup() { |
||||
return viewGroup; |
||||
} |
||||
|
||||
/** |
||||
* @return the text |
||||
*/ |
||||
CharSequence getText() { |
||||
return text; |
||||
} |
||||
|
||||
/** |
||||
* @return the view |
||||
*/ |
||||
View getView() { |
||||
// return the custom view if one exists
|
||||
if (null != this.customView) { |
||||
return this.customView; |
||||
} |
||||
|
||||
// if already setup return the view
|
||||
if (null == this.croutonView) { |
||||
initializeCroutonView(); |
||||
} |
||||
|
||||
return croutonView; |
||||
} |
||||
|
||||
private void initializeCroutonView() { |
||||
Resources resources = this.activity.getResources(); |
||||
|
||||
this.croutonView = initializeCroutonViewGroup(resources); |
||||
|
||||
// create content view
|
||||
RelativeLayout contentView = initializeContentView(resources); |
||||
this.croutonView.addView(contentView); |
||||
} |
||||
|
||||
private FrameLayout initializeCroutonViewGroup(Resources resources) { |
||||
FrameLayout croutonView = new FrameLayout(this.activity); |
||||
|
||||
if(null != onClickListener) |
||||
croutonView.setOnClickListener(onClickListener); |
||||
|
||||
final int height; |
||||
if (this.style.heightDimensionResId > 0) { |
||||
height = resources.getDimensionPixelSize(this.style.heightDimensionResId); |
||||
} else { |
||||
height = this.style.heightInPixels; |
||||
} |
||||
|
||||
final int width; |
||||
if (this.style.widthDimensionResId > 0) { |
||||
width = resources.getDimensionPixelSize(this.style.widthDimensionResId); |
||||
} else { |
||||
width = this.style.widthInPixels; |
||||
} |
||||
|
||||
croutonView.setLayoutParams( |
||||
new FrameLayout.LayoutParams(width != 0 ? width : FrameLayout.LayoutParams.MATCH_PARENT, height)); |
||||
|
||||
// set background
|
||||
if (this.style.backgroundColorValue != -1) { |
||||
croutonView.setBackgroundColor(this.style.backgroundColorValue); |
||||
} else { |
||||
croutonView.setBackgroundColor(resources.getColor(this.style.backgroundColorResourceId)); |
||||
} |
||||
|
||||
// set the background drawable if set. This will override the background
|
||||
// color.
|
||||
if (this.style.backgroundDrawableResourceId != 0) { |
||||
Bitmap background = BitmapFactory.decodeResource(resources, this.style.backgroundDrawableResourceId); |
||||
BitmapDrawable drawable = new BitmapDrawable(resources, background); |
||||
if (this.style.isTileEnabled) { |
||||
drawable.setTileModeXY(Shader.TileMode.REPEAT, Shader.TileMode.REPEAT); |
||||
} |
||||
croutonView.setBackgroundDrawable(drawable); |
||||
} |
||||
return croutonView; |
||||
} |
||||
|
||||
private RelativeLayout initializeContentView(final Resources resources) { |
||||
RelativeLayout contentView = new RelativeLayout(this.activity); |
||||
contentView.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, |
||||
RelativeLayout.LayoutParams.WRAP_CONTENT)); |
||||
|
||||
// set padding
|
||||
int padding = this.style.paddingInPixels; |
||||
|
||||
// if a padding dimension has been set, this will overwrite any padding
|
||||
// in pixels
|
||||
if (this.style.paddingDimensionResId > 0) { |
||||
padding = resources.getDimensionPixelSize(this.style.paddingDimensionResId); |
||||
} |
||||
contentView.setPadding(padding, padding, padding, padding); |
||||
|
||||
// only setup image if one is requested
|
||||
ImageView image = null; |
||||
if ((null != this.style.imageDrawable) || (0 != this.style.imageResId)) { |
||||
image = initializeImageView(); |
||||
contentView.addView(image, image.getLayoutParams()); |
||||
} |
||||
|
||||
TextView text = initializeTextView(resources); |
||||
|
||||
RelativeLayout.LayoutParams textParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, |
||||
RelativeLayout.LayoutParams.WRAP_CONTENT); |
||||
if (null != image) { |
||||
textParams.addRule(RelativeLayout.RIGHT_OF, image.getId()); |
||||
} |
||||
contentView.addView(text, textParams); |
||||
return contentView; |
||||
} |
||||
|
||||
private TextView initializeTextView(final Resources resources) { |
||||
TextView text = new TextView(this.activity); |
||||
text.setId(TEXT_ID); |
||||
text.setText(this.text); |
||||
text.setTypeface(Typeface.DEFAULT_BOLD); |
||||
text.setGravity(this.style.gravity); |
||||
|
||||
// set the text color if set
|
||||
if (this.style.textColorResourceId != 0) { |
||||
text.setTextColor(resources.getColor(this.style.textColorResourceId)); |
||||
} |
||||
|
||||
// Set the text size. If the user has set a text size and text
|
||||
// appearance, the text size in the text appearance
|
||||
// will override this.
|
||||
if (this.style.textSize != 0) { |
||||
text.setTextSize(TypedValue.COMPLEX_UNIT_SP, this.style.textSize); |
||||
} |
||||
|
||||
// Setup the shadow if requested
|
||||
if (this.style.textShadowColorResId != 0) { |
||||
initializeTextViewShadow(resources, text); |
||||
} |
||||
|
||||
// Set the text appearance
|
||||
if (this.style.textAppearanceResId != 0) { |
||||
text.setTextAppearance(this.activity, this.style.textAppearanceResId); |
||||
} |
||||
return text; |
||||
} |
||||
|
||||
private void initializeTextViewShadow(final Resources resources, final TextView text) { |
||||
int textShadowColor = resources.getColor(this.style.textShadowColorResId); |
||||
float textShadowRadius = this.style.textShadowRadius; |
||||
float textShadowDx = this.style.textShadowDx; |
||||
float textShadowDy = this.style.textShadowDy; |
||||
text.setShadowLayer(textShadowRadius, textShadowDx, textShadowDy, textShadowColor); |
||||
} |
||||
|
||||
private ImageView initializeImageView() { |
||||
ImageView image; |
||||
image = new ImageView(this.activity); |
||||
image.setId(IMAGE_ID); |
||||
image.setAdjustViewBounds(true); |
||||
image.setScaleType(this.style.imageScaleType); |
||||
|
||||
// set the image drawable if not null
|
||||
if (null != this.style.imageDrawable) { |
||||
image.setImageDrawable(this.style.imageDrawable); |
||||
} |
||||
|
||||
// set the image resource if not 0. This will overwrite the drawable
|
||||
// if both are set
|
||||
if (this.style.imageResId != 0) { |
||||
image.setImageResource(this.style.imageResId); |
||||
} |
||||
|
||||
RelativeLayout.LayoutParams imageParams = new RelativeLayout.LayoutParams( |
||||
RelativeLayout.LayoutParams.WRAP_CONTENT, |
||||
RelativeLayout.LayoutParams.WRAP_CONTENT); |
||||
imageParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT, RelativeLayout.TRUE); |
||||
imageParams.addRule(RelativeLayout.CENTER_VERTICAL, RelativeLayout.TRUE); |
||||
|
||||
image.setLayoutParams(imageParams); |
||||
|
||||
return image; |
||||
} |
||||
|
||||
@Override |
||||
public String toString() { |
||||
return "Crouton{" + |
||||
"text=" + text + |
||||
", style=" + style + |
||||
", customView=" + customView + |
||||
", activity=" + activity + |
||||
", viewGroup=" + viewGroup + |
||||
", croutonView=" + croutonView + |
||||
", inAnimation=" + inAnimation + |
||||
", outAnimation=" + outAnimation + |
||||
", lifecycleCallback=" + lifecycleCallback + |
||||
'}'; |
||||
} |
||||
} |
@ -0,0 +1,85 @@
@@ -0,0 +1,85 @@
|
||||
/* |
||||
* Copyright 2012 - 2013 Benjamin Weiss |
||||
* Copyright 2012 Neofonie Mobile GmbH |
||||
* |
||||
* 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 de.keyboardsurfer.android.widget.crouton; |
||||
|
||||
import android.view.animation.Animation; |
||||
import android.view.animation.TranslateAnimation; |
||||
|
||||
/** |
||||
* Builds the default animations for showing and hiding a {@link Crouton}. |
||||
*/ |
||||
final class DefaultAnimationsBuilder { |
||||
private static Animation slideInDownAnimation, slideOutUpAnimation; |
||||
|
||||
protected static final class SlideInDownAnimationParameters { |
||||
private SlideInDownAnimationParameters() { |
||||
/* no-op */ |
||||
} |
||||
|
||||
public static final float FROM_X_DELTA = 0; |
||||
public static final float TO_X_DELTA = 0; |
||||
public static final float FROM_Y_DELTA = -50; |
||||
public static final float TO_Y_DELTA = 0; |
||||
|
||||
public static final long DURATION = 400; |
||||
} |
||||
|
||||
protected static final class SlideOutUpAnimationParameters { |
||||
private SlideOutUpAnimationParameters() { |
||||
/* no-op */ |
||||
} |
||||
|
||||
public static final float FROM_X_DELTA = 0; |
||||
public static final float TO_X_DELTA = 0; |
||||
public static final float FROM_Y_DELTA = 0; |
||||
public static final float TO_Y_DELTA = -50; |
||||
|
||||
public static final long DURATION = 400; |
||||
} |
||||
|
||||
private DefaultAnimationsBuilder() { |
||||
/* no-op */ |
||||
} |
||||
|
||||
/** |
||||
* @return The default Animation for a showing {@link Crouton}. |
||||
*/ |
||||
public static Animation buildDefaultSlideInDownAnimation() { |
||||
if (null == slideInDownAnimation) { |
||||
slideInDownAnimation = new TranslateAnimation(SlideInDownAnimationParameters.FROM_X_DELTA, |
||||
SlideInDownAnimationParameters.TO_X_DELTA, |
||||
SlideInDownAnimationParameters.FROM_Y_DELTA, SlideInDownAnimationParameters.TO_Y_DELTA); |
||||
slideInDownAnimation.setDuration(SlideInDownAnimationParameters.DURATION); |
||||
} |
||||
|
||||
return slideInDownAnimation; |
||||
} |
||||
|
||||
/** |
||||
* @return The default Animation for a hiding {@link Crouton}. |
||||
*/ |
||||
public static Animation buildDefaultSlideOutUpAnimation() { |
||||
if (null == slideOutUpAnimation) { |
||||
slideOutUpAnimation = new TranslateAnimation(SlideOutUpAnimationParameters.FROM_X_DELTA, |
||||
SlideOutUpAnimationParameters.TO_X_DELTA, |
||||
SlideOutUpAnimationParameters.FROM_Y_DELTA, SlideOutUpAnimationParameters.TO_Y_DELTA); |
||||
slideOutUpAnimation.setDuration(SlideOutUpAnimationParameters.DURATION); |
||||
} |
||||
return slideOutUpAnimation; |
||||
} |
||||
} |
@ -0,0 +1,24 @@
@@ -0,0 +1,24 @@
|
||||
/* |
||||
* Copyright 2012 - 2013 Benjamin Weiss |
||||
* Copyright 2012 Neofonie Mobile GmbH |
||||
* |
||||
* 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 de.keyboardsurfer.android.widget.crouton; |
||||
|
||||
public interface LifecycleCallback { |
||||
public void onDisplayed(); |
||||
public void onRemoved(); |
||||
//public void onCeasarDressing();
|
||||
} |
@ -0,0 +1,403 @@
@@ -0,0 +1,403 @@
|
||||
/* |
||||
* Copyright 2012 - 2013 Benjamin Weiss |
||||
* Copyright 2012 Neofonie Mobile GmbH |
||||
* |
||||
* 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 de.keyboardsurfer.android.widget.crouton; |
||||
|
||||
import android.app.Activity; |
||||
import android.content.Context; |
||||
import android.os.Build; |
||||
import android.os.Handler; |
||||
import android.os.Message; |
||||
import android.support.v4.view.accessibility.AccessibilityEventCompat; |
||||
import android.view.View; |
||||
import android.view.ViewGroup; |
||||
import android.view.ViewParent; |
||||
import android.view.accessibility.AccessibilityEvent; |
||||
import android.view.accessibility.AccessibilityManager; |
||||
import android.widget.FrameLayout; |
||||
import java.util.Iterator; |
||||
import java.util.Queue; |
||||
import java.util.concurrent.LinkedBlockingQueue; |
||||
|
||||
|
||||
/** |
||||
* Manages the lifecycle of {@link Crouton}s. |
||||
*/ |
||||
final class Manager extends Handler { |
||||
private static final class Messages { |
||||
private Messages() { /* no-op */ |
||||
} |
||||
|
||||
public static final int DISPLAY_CROUTON = 0xc2007; |
||||
public static final int ADD_CROUTON_TO_VIEW = 0xc20074dd; |
||||
public static final int REMOVE_CROUTON = 0xc2007de1; |
||||
} |
||||
|
||||
private static Manager INSTANCE; |
||||
|
||||
private Queue<Crouton> croutonQueue; |
||||
|
||||
private Manager() { |
||||
croutonQueue = new LinkedBlockingQueue<Crouton>(); |
||||
} |
||||
|
||||
/** |
||||
* @return The currently used instance of the {@link Manager}. |
||||
*/ |
||||
static synchronized Manager getInstance() { |
||||
if (null == INSTANCE) { |
||||
INSTANCE = new Manager(); |
||||
} |
||||
|
||||
return INSTANCE; |
||||
} |
||||
|
||||
/** |
||||
* Inserts a {@link Crouton} to be displayed. |
||||
* |
||||
* @param crouton |
||||
* The {@link Crouton} to be displayed. |
||||
*/ |
||||
void add(Crouton crouton) { |
||||
croutonQueue.add(crouton); |
||||
displayCrouton(); |
||||
} |
||||
|
||||
/** |
||||
* Displays the next {@link Crouton} within the queue. |
||||
*/ |
||||
private void displayCrouton() { |
||||
if (croutonQueue.isEmpty()) { |
||||
return; |
||||
} |
||||
|
||||
// First peek whether the Crouton has an activity.
|
||||
final Crouton currentCrouton = croutonQueue.peek(); |
||||
|
||||
// If the activity is null we poll the Crouton off the queue.
|
||||
if (null == currentCrouton.getActivity()) { |
||||
croutonQueue.poll(); |
||||
} |
||||
|
||||
if (!currentCrouton.isShowing()) { |
||||
// Display the Crouton
|
||||
sendMessage(currentCrouton, Messages.ADD_CROUTON_TO_VIEW); |
||||
if (null != currentCrouton.getLifecycleCallback()) { |
||||
currentCrouton.getLifecycleCallback().onDisplayed(); |
||||
} |
||||
} else { |
||||
sendMessageDelayed(currentCrouton, Messages.DISPLAY_CROUTON, calculateCroutonDuration(currentCrouton)); |
||||
} |
||||
} |
||||
|
||||
private long calculateCroutonDuration(Crouton crouton) { |
||||
long croutonDuration = crouton.getStyle().durationInMilliseconds; |
||||
croutonDuration += crouton.getInAnimation().getDuration(); |
||||
croutonDuration += crouton.getOutAnimation().getDuration(); |
||||
return croutonDuration; |
||||
} |
||||
|
||||
/** |
||||
* Sends a {@link Crouton} within a {@link Message}. |
||||
* |
||||
* @param crouton |
||||
* The {@link Crouton} that should be sent. |
||||
* @param messageId |
||||
* The {@link Message} id. |
||||
*/ |
||||
private void sendMessage(Crouton crouton, final int messageId) { |
||||
final Message message = obtainMessage(messageId); |
||||
message.obj = crouton; |
||||
sendMessage(message); |
||||
} |
||||
|
||||
/** |
||||
* Sends a {@link Crouton} within a delayed {@link Message}. |
||||
* |
||||
* @param crouton |
||||
* The {@link Crouton} that should be sent. |
||||
* @param messageId |
||||
* The {@link Message} id. |
||||
* @param delay |
||||
* The delay in milliseconds. |
||||
*/ |
||||
private void sendMessageDelayed(Crouton crouton, final int messageId, final long delay) { |
||||
Message message = obtainMessage(messageId); |
||||
message.obj = crouton; |
||||
sendMessageDelayed(message, delay); |
||||
} |
||||
|
||||
/* |
||||
* (non-Javadoc) |
||||
* |
||||
* @see android.os.Handler#handleMessage(android.os.Message) |
||||
*/ |
||||
@Override |
||||
public void handleMessage(Message message) { |
||||
final Crouton crouton = (Crouton) message.obj; |
||||
|
||||
switch (message.what) { |
||||
case Messages.DISPLAY_CROUTON: { |
||||
displayCrouton(); |
||||
break; |
||||
} |
||||
|
||||
case Messages.ADD_CROUTON_TO_VIEW: { |
||||
addCroutonToView(crouton); |
||||
break; |
||||
} |
||||
|
||||
case Messages.REMOVE_CROUTON: { |
||||
removeCrouton(crouton); |
||||
if (null != crouton.getLifecycleCallback()) { |
||||
crouton.getLifecycleCallback().onRemoved(); |
||||
} |
||||
break; |
||||
} |
||||
|
||||
default: { |
||||
super.handleMessage(message); |
||||
break; |
||||
} |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* Adds a {@link Crouton} to the {@link ViewParent} of it's {@link Activity}. |
||||
* |
||||
* @param crouton |
||||
* The {@link Crouton} that should be added. |
||||
*/ |
||||
private void addCroutonToView(Crouton crouton) { |
||||
// don't add if it is already showing
|
||||
if (crouton.isShowing()) { |
||||
return; |
||||
} |
||||
|
||||
View croutonView = crouton.getView(); |
||||
if (null == croutonView.getParent()) { |
||||
ViewGroup.LayoutParams params = croutonView.getLayoutParams(); |
||||
if (null == params) { |
||||
params = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); |
||||
} |
||||
// display Crouton in ViewGroup is it has been supplied
|
||||
if (null != crouton.getViewGroup()) { |
||||
// TODO implement add to last position feature (need to align with how this will be requested for activity)
|
||||
if (crouton.getViewGroup() instanceof FrameLayout) { |
||||
crouton.getViewGroup().addView(croutonView, params); |
||||
} else { |
||||
crouton.getViewGroup().addView(croutonView, 0, params); |
||||
} |
||||
} else { |
||||
Activity activity = crouton.getActivity(); |
||||
if (null == activity || activity.isFinishing()) { |
||||
return; |
||||
} |
||||
activity.addContentView(croutonView, params); |
||||
} |
||||
} |
||||
croutonView.startAnimation(crouton.getInAnimation()); |
||||
announceForAccessibilityCompat(crouton.getActivity(), crouton.getText()); |
||||
if (Style.DURATION_INFINITE != crouton.getStyle().durationInMilliseconds) { |
||||
sendMessageDelayed(crouton, Messages.REMOVE_CROUTON, |
||||
crouton.getStyle().durationInMilliseconds + crouton.getInAnimation().getDuration()); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* Removes the {@link Crouton}'s view after it's display |
||||
* durationInMilliseconds. |
||||
* |
||||
* @param crouton |
||||
* The {@link Crouton} added to a {@link ViewGroup} and should be |
||||
* removed. |
||||
*/ |
||||
protected void removeCrouton(Crouton crouton) { |
||||
View croutonView = crouton.getView(); |
||||
ViewGroup croutonParentView = (ViewGroup) croutonView.getParent(); |
||||
|
||||
if (null != croutonParentView) { |
||||
croutonView.startAnimation(crouton.getOutAnimation()); |
||||
|
||||
// Remove the Crouton from the queue.
|
||||
Crouton removed = croutonQueue.poll(); |
||||
|
||||
// Remove the crouton from the view's parent.
|
||||
croutonParentView.removeView(croutonView); |
||||
if (null != removed) { |
||||
removed.detachActivity(); |
||||
removed.detachViewGroup(); |
||||
if (null != removed.getLifecycleCallback()) { |
||||
removed.getLifecycleCallback().onRemoved(); |
||||
} |
||||
removed.detachLifecycleCallback(); |
||||
} |
||||
|
||||
// Send a message to display the next crouton but delay it by the out
|
||||
// animation duration to make sure it finishes
|
||||
sendMessageDelayed(crouton, Messages.DISPLAY_CROUTON, crouton.getOutAnimation().getDuration()); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* Removes a {@link Crouton} immediately, even when it's currently being |
||||
* displayed. |
||||
* |
||||
* @param crouton |
||||
* The {@link Crouton} that should be removed. |
||||
*/ |
||||
void removeCroutonImmediately(Crouton crouton) { |
||||
// if Crouton has already been displayed then it may not be in the queue (because it was popped).
|
||||
// This ensures the displayed Crouton is removed from its parent immediately, whether another instance
|
||||
// of it exists in the queue or not.
|
||||
// Note: crouton.isShowing() is false here even if it really is showing, as croutonView object in
|
||||
// Crouton seems to be out of sync with reality!
|
||||
if (null != crouton.getActivity() && null != crouton.getView() && null != crouton.getView().getParent()) { |
||||
((ViewGroup) crouton.getView().getParent()).removeView(crouton.getView()); |
||||
|
||||
// remove any messages pending for the crouton
|
||||
removeAllMessagesForCrouton(crouton); |
||||
} |
||||
// remove any matching croutons from queue
|
||||
if (null != croutonQueue) { |
||||
final Iterator<Crouton> croutonIterator = croutonQueue.iterator(); |
||||
while (croutonIterator.hasNext()) { |
||||
final Crouton c = croutonIterator.next(); |
||||
if (c.equals(crouton) && (null != c.getActivity())) { |
||||
// remove the crouton from the content view
|
||||
if (crouton.isShowing()) { |
||||
((ViewGroup) c.getView().getParent()).removeView(c.getView()); |
||||
} |
||||
|
||||
// remove any messages pending for the crouton
|
||||
removeAllMessagesForCrouton(c); |
||||
|
||||
// remove the crouton from the queue
|
||||
croutonIterator.remove(); |
||||
|
||||
// we have found our crouton so just break
|
||||
break; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* Removes all {@link Crouton}s from the queue. |
||||
*/ |
||||
void clearCroutonQueue() { |
||||
removeAllMessages(); |
||||
|
||||
if (null != croutonQueue) { |
||||
// remove any views that may already have been added to the activity's
|
||||
// content view
|
||||
for (Crouton crouton : croutonQueue) { |
||||
if (crouton.isShowing()) { |
||||
((ViewGroup) crouton.getView().getParent()).removeView(crouton.getView()); |
||||
} |
||||
} |
||||
croutonQueue.clear(); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* Removes all {@link Crouton}s for the provided activity. This will remove |
||||
* crouton from {@link Activity}s content view immediately. |
||||
*/ |
||||
void clearCroutonsForActivity(Activity activity) { |
||||
if (null != croutonQueue) { |
||||
Iterator<Crouton> croutonIterator = croutonQueue.iterator(); |
||||
while (croutonIterator.hasNext()) { |
||||
Crouton crouton = croutonIterator.next(); |
||||
if ((null != crouton.getActivity()) && crouton.getActivity().equals(activity)) { |
||||
// remove the crouton from the content view
|
||||
if (crouton.isShowing()) { |
||||
((ViewGroup) crouton.getView().getParent()).removeView(crouton.getView()); |
||||
} |
||||
|
||||
removeAllMessagesForCrouton(crouton); |
||||
|
||||
// remove the crouton from the queue
|
||||
croutonIterator.remove(); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
private void removeAllMessages() { |
||||
removeMessages(Messages.ADD_CROUTON_TO_VIEW); |
||||
removeMessages(Messages.DISPLAY_CROUTON); |
||||
removeMessages(Messages.REMOVE_CROUTON); |
||||
} |
||||
|
||||
private void removeAllMessagesForCrouton(Crouton crouton) { |
||||
removeMessages(Messages.ADD_CROUTON_TO_VIEW, crouton); |
||||
removeMessages(Messages.DISPLAY_CROUTON, crouton); |
||||
removeMessages(Messages.REMOVE_CROUTON, crouton); |
||||
|
||||
} |
||||
|
||||
/** |
||||
* Generates and dispatches an SDK-specific spoken announcement. |
||||
* <p> |
||||
* For backwards compatibility, we're constructing an event from scratch |
||||
* using the appropriate event type. If your application only targets SDK |
||||
* 16+, you can just call View.announceForAccessibility(CharSequence). |
||||
* </p> |
||||
* <p/> |
||||
* note: AccessibilityManager is only available from API lvl 4. |
||||
* <p/> |
||||
* Adapted from https://http://eyes-free.googlecode.com/files/accessibility_codelab_demos_v2_src.zip
|
||||
* via https://github.com/coreform/android-formidable-validation
|
||||
* |
||||
* @param context |
||||
* Used to get {@link AccessibilityManager} |
||||
* @param text |
||||
* The text to announce. |
||||
*/ |
||||
public static void announceForAccessibilityCompat(Context context, CharSequence text) { |
||||
if (Build.VERSION.SDK_INT >= 4) { |
||||
AccessibilityManager accessibilityManager = (AccessibilityManager) context.getSystemService( |
||||
Context.ACCESSIBILITY_SERVICE); |
||||
if (!accessibilityManager.isEnabled()) { |
||||
return; |
||||
} |
||||
|
||||
// Prior to SDK 16, announcements could only be made through FOCUSED
|
||||
// events. Jelly Bean (SDK 16) added support for speaking text verbatim
|
||||
// using the ANNOUNCEMENT event type.
|
||||
final int eventType; |
||||
if (Build.VERSION.SDK_INT < 16) { |
||||
eventType = AccessibilityEvent.TYPE_VIEW_FOCUSED; |
||||
} else { |
||||
eventType = AccessibilityEventCompat.TYPE_ANNOUNCEMENT; |
||||
} |
||||
|
||||
// Construct an accessibility event with the minimum recommended
|
||||
// attributes. An event without a class name or package may be dropped.
|
||||
final AccessibilityEvent event = AccessibilityEvent.obtain(eventType); |
||||
event.getText().add(text); |
||||
event.setClassName(Manager.class.getName()); |
||||
event.setPackageName(context.getPackageName()); |
||||
|
||||
// Sends the event directly through the accessibility manager. If your
|
||||
// application only targets SDK 14+, you should just call
|
||||
// getParent().requestSendAccessibilityEvent(this, event);
|
||||
accessibilityManager.sendAccessibilityEvent(event); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,539 @@
@@ -0,0 +1,539 @@
|
||||
/* |
||||
* Copyright 2012 - 2013 Benjamin Weiss |
||||
* Copyright 2012 Neofonie Mobile GmbH |
||||
* |
||||
* 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 de.keyboardsurfer.android.widget.crouton; |
||||
|
||||
import android.graphics.drawable.Drawable; |
||||
import android.view.Gravity; |
||||
import android.view.ViewGroup.LayoutParams; |
||||
import android.widget.ImageView; |
||||
|
||||
|
||||
/** |
||||
* The style for a {@link Crouton}. |
||||
*/ |
||||
|
||||
public class Style { |
||||
|
||||
/** |
||||
* Display a {@link Crouton} for an infinite amount of time or |
||||
* until {@link de.keyboardsurfer.android.widget.crouton.Crouton#cancel()} has been called. |
||||
*/ |
||||
public static final int DURATION_INFINITE = -1; |
||||
|
||||
/** |
||||
* Default style for alerting the user. |
||||
*/ |
||||
public static final Style ALERT; |
||||
/** |
||||
* Default style for confirming an action. |
||||
*/ |
||||
public static final Style CONFIRM; |
||||
/** |
||||
* Default style for general information. |
||||
*/ |
||||
public static final Style INFO; |
||||
|
||||
public static final int holoRedLight = 0xffff4444; |
||||
public static final int holoGreenLight = 0xff99cc00; |
||||
public static final int holoBlueLight = 0xff33b5e5; |
||||
|
||||
static { |
||||
ALERT = new Builder().setDuration(5000).setBackgroundColorValue(holoRedLight).setHeight(LayoutParams.WRAP_CONTENT) |
||||
.build(); |
||||
CONFIRM = new Builder().setDuration(3000).setBackgroundColorValue(holoGreenLight).setHeight( |
||||
LayoutParams.WRAP_CONTENT).build(); |
||||
INFO = new Builder().setDuration(3000).setBackgroundColorValue(holoBlueLight).setHeight(LayoutParams.WRAP_CONTENT) |
||||
.build(); |
||||
} |
||||
|
||||
/** |
||||
* The durationInMilliseconds the {@link Crouton} will be displayed in |
||||
* milliseconds. |
||||
*/ |
||||
final int durationInMilliseconds; |
||||
|
||||
/** |
||||
* The resource id of the backgroundResourceId. |
||||
* <p/> |
||||
* 0 for no backgroundResourceId. |
||||
*/ |
||||
final int backgroundColorResourceId; |
||||
|
||||
/** |
||||
* The resource id of the backgroundDrawableResourceId. |
||||
* <p/> |
||||
* 0 for no backgroundDrawableResourceId. |
||||
*/ |
||||
final int backgroundDrawableResourceId; |
||||
|
||||
/** |
||||
* The backgroundColorResourceValue's e.g. 0xffff4444; |
||||
* <p/> |
||||
* -1 for no value. |
||||
*/ |
||||
final int backgroundColorValue; |
||||
|
||||
/** |
||||
* Whether we should isTileEnabled the backgroundResourceId or not. |
||||
*/ |
||||
final boolean isTileEnabled; |
||||
|
||||
/** |
||||
* The text colorResourceId's resource id. |
||||
* <p/> |
||||
* 0 sets the text colorResourceId to the system theme default. |
||||
*/ |
||||
final int textColorResourceId; |
||||
|
||||
/** |
||||
* The height of the {@link Crouton} in pixels. |
||||
*/ |
||||
final int heightInPixels; |
||||
|
||||
/** |
||||
* Resource ID for the height of the {@link Crouton}. |
||||
*/ |
||||
final int heightDimensionResId; |
||||
|
||||
/** |
||||
* The width of the {@link Crouton} in pixels. |
||||
*/ |
||||
final int widthInPixels; |
||||
|
||||
/** |
||||
* Resource ID for the width of the {@link Crouton}. |
||||
*/ |
||||
final int widthDimensionResId; |
||||
|
||||
/** |
||||
* The text's gravity as provided by {@link Gravity}. |
||||
*/ |
||||
final int gravity; |
||||
|
||||
/** |
||||
* An additional image to display in the {@link Crouton}. |
||||
*/ |
||||
final Drawable imageDrawable; |
||||
|
||||
/** |
||||
* An additional image to display in the {@link Crouton}. |
||||
*/ |
||||
final int imageResId; |
||||
|
||||
/** |
||||
* The {@link ImageView.ScaleType} for the image to display in the |
||||
* {@link Crouton}. |
||||
*/ |
||||
final ImageView.ScaleType imageScaleType; |
||||
|
||||
/** |
||||
* The text size in sp |
||||
* <p/> |
||||
* 0 sets the text size to the system theme default |
||||
*/ |
||||
final int textSize; |
||||
|
||||
/** |
||||
* The text shadow color's resource id |
||||
*/ |
||||
final int textShadowColorResId; |
||||
|
||||
/** |
||||
* The text shadow radius |
||||
*/ |
||||
final float textShadowRadius; |
||||
|
||||
/** |
||||
* The text shadow vertical offset |
||||
*/ |
||||
final float textShadowDy; |
||||
|
||||
/** |
||||
* The text shadow horizontal offset |
||||
*/ |
||||
final float textShadowDx; |
||||
|
||||
/** |
||||
* The text appearance resource id for the text. |
||||
*/ |
||||
final int textAppearanceResId; |
||||
|
||||
/** |
||||
* The resource id for the in animation |
||||
*/ |
||||
final int inAnimationResId; |
||||
|
||||
/** |
||||
* The resource id for the out animation |
||||
*/ |
||||
final int outAnimationResId; |
||||
|
||||
/** |
||||
* The padding for the crouton view content in pixels |
||||
*/ |
||||
final int paddingInPixels; |
||||
|
||||
/** |
||||
* The resource id for the padding for the view content |
||||
*/ |
||||
final int paddingDimensionResId; |
||||
|
||||
private Style(final Builder builder) { |
||||
this.durationInMilliseconds = builder.durationInMilliseconds; |
||||
this.backgroundColorResourceId = builder.backgroundColorResourceId; |
||||
this.backgroundDrawableResourceId = builder.backgroundDrawableResourceId; |
||||
this.isTileEnabled = builder.isTileEnabled; |
||||
this.textColorResourceId = builder.textColorResourceId; |
||||
this.heightInPixels = builder.heightInPixels; |
||||
this.heightDimensionResId = builder.heightDimensionResId; |
||||
this.widthInPixels = builder.widthInPixels; |
||||
this.widthDimensionResId = builder.widthDimensionResId; |
||||
this.gravity = builder.gravity; |
||||
this.imageDrawable = builder.imageDrawable; |
||||
this.textSize = builder.textSize; |
||||
this.textShadowColorResId = builder.textShadowColorResId; |
||||
this.textShadowRadius = builder.textShadowRadius; |
||||
this.textShadowDx = builder.textShadowDx; |
||||
this.textShadowDy = builder.textShadowDy; |
||||
this.textAppearanceResId = builder.textAppearanceResId; |
||||
this.inAnimationResId = builder.inAnimationResId; |
||||
this.outAnimationResId = builder.outAnimationResId; |
||||
this.imageResId = builder.imageResId; |
||||
this.imageScaleType = builder.imageScaleType; |
||||
this.paddingInPixels = builder.paddingInPixels; |
||||
this.paddingDimensionResId = builder.paddingDimensionResId; |
||||
this.backgroundColorValue = builder.backgroundColorValue; |
||||
} |
||||
|
||||
/** |
||||
* Builder for the {@link Style} object. |
||||
*/ |
||||
public static class Builder { |
||||
private int durationInMilliseconds; |
||||
private int backgroundColorValue; |
||||
private int backgroundColorResourceId; |
||||
private int backgroundDrawableResourceId; |
||||
private boolean isTileEnabled; |
||||
private int textColorResourceId; |
||||
private int heightInPixels; |
||||
private int heightDimensionResId; |
||||
private int widthInPixels; |
||||
private int widthDimensionResId; |
||||
private int gravity; |
||||
private Drawable imageDrawable; |
||||
private int textSize; |
||||
private int textShadowColorResId; |
||||
private float textShadowRadius; |
||||
private float textShadowDx; |
||||
private float textShadowDy; |
||||
private int textAppearanceResId; |
||||
private int inAnimationResId; |
||||
private int outAnimationResId; |
||||
private int imageResId; |
||||
private ImageView.ScaleType imageScaleType; |
||||
private int paddingInPixels; |
||||
private int paddingDimensionResId; |
||||
|
||||
public Builder() { |
||||
durationInMilliseconds = 3000; |
||||
paddingInPixels = 10; |
||||
backgroundColorResourceId = android.R.color.holo_blue_light; |
||||
backgroundDrawableResourceId = 0; |
||||
backgroundColorValue = -1; |
||||
isTileEnabled = false; |
||||
textColorResourceId = android.R.color.white; |
||||
heightInPixels = LayoutParams.WRAP_CONTENT; |
||||
widthInPixels = LayoutParams.MATCH_PARENT; |
||||
gravity = Gravity.CENTER; |
||||
imageDrawable = null; |
||||
inAnimationResId = 0; |
||||
outAnimationResId = 0; |
||||
imageResId = 0; |
||||
imageScaleType = ImageView.ScaleType.FIT_XY; |
||||
} |
||||
|
||||
/** |
||||
* Set the durationInMilliseconds option of the {@link Crouton}. |
||||
* |
||||
* @param duration |
||||
* The durationInMilliseconds the crouton will be displayed |
||||
* {@link Crouton} in milliseconds. |
||||
* @return the {@link Builder}. |
||||
*/ |
||||
public Builder setDuration(int duration) { |
||||
this.durationInMilliseconds = duration; |
||||
|
||||
return this; |
||||
} |
||||
|
||||
/** |
||||
* Set the backgroundColorResourceId option of the {@link Crouton}. |
||||
* |
||||
* @param backgroundColorResourceId |
||||
* The backgroundColorResourceId's resource id. |
||||
* @return the {@link Builder}. |
||||
*/ |
||||
public Builder setBackgroundColor(int backgroundColorResourceId) { |
||||
this.backgroundColorResourceId = backgroundColorResourceId; |
||||
|
||||
return this; |
||||
} |
||||
|
||||
/** |
||||
* Set the backgroundColorResourceValue option of the {@link Crouton}. |
||||
* |
||||
* @param backgroundColorValue |
||||
* The backgroundColorResourceValue's e.g. 0xffff4444; |
||||
* @return the {@link Builder}. |
||||
*/ |
||||
public Builder setBackgroundColorValue(int backgroundColorValue) { |
||||
this.backgroundColorValue = backgroundColorValue; |
||||
return this; |
||||
} |
||||
|
||||
/** |
||||
* Set the backgroundDrawableResourceId option for the {@link Crouton}. |
||||
* |
||||
* @param backgroundDrawableResourceId |
||||
* Resource ID of a backgroundDrawableResourceId image drawable. |
||||
* @return the {@link Builder}. |
||||
*/ |
||||
public Builder setBackgroundDrawable(int backgroundDrawableResourceId) { |
||||
this.backgroundDrawableResourceId = backgroundDrawableResourceId; |
||||
|
||||
return this; |
||||
} |
||||
|
||||
/** |
||||
* Set the heightInPixels option for the {@link Crouton}. |
||||
* |
||||
* @param height |
||||
* The height of the {@link Crouton} in pixel. Can also be |
||||
* {@link LayoutParams#MATCH_PARENT} or |
||||
* {@link LayoutParams#WRAP_CONTENT}. |
||||
* @return the {@link Builder}. |
||||
*/ |
||||
public Builder setHeight(int height) { |
||||
this.heightInPixels = height; |
||||
|
||||
return this; |
||||
} |
||||
|
||||
/** |
||||
* Set the resource id for the height option for the {@link Crouton}. |
||||
* |
||||
* @param heightDimensionResId |
||||
* Resource ID of a dimension for the height of the {@link Crouton}. |
||||
* @return the {@link Builder}. |
||||
*/ |
||||
public Builder setHeightDimensionResId(int heightDimensionResId) { |
||||
this.heightDimensionResId = heightDimensionResId; |
||||
|
||||
return this; |
||||
} |
||||
|
||||
/** |
||||
* Set the widthInPixels option for the {@link Crouton}. |
||||
* |
||||
* @param width |
||||
* The width of the {@link Crouton} in pixel. Can also be |
||||
* {@link LayoutParams#MATCH_PARENT} or |
||||
* {@link LayoutParams#WRAP_CONTENT}. |
||||
* @return the {@link Builder}. |
||||
*/ |
||||
public Builder setWidth(int width) { |
||||
this.widthInPixels = width; |
||||
|
||||
return this; |
||||
} |
||||
|
||||
/** |
||||
* Set the resource id for the width option for the {@link Crouton}. |
||||
* |
||||
* @param widthDimensionResId |
||||
* Resource ID of a dimension for the width of the {@link Crouton}. |
||||
* @return the {@link Builder}. |
||||
*/ |
||||
public Builder setWidthDimensionResId(int widthDimensionResId) { |
||||
this.widthDimensionResId = widthDimensionResId; |
||||
|
||||
return this; |
||||
} |
||||
|
||||
/** |
||||
* Set the isTileEnabled option for the {@link Crouton}. |
||||
* |
||||
* @param isTileEnabled |
||||
* <code>true</code> if you want the backgroundResourceId to be |
||||
* tiled, else <code>false</code>. |
||||
* @return the {@link Builder}. |
||||
*/ |
||||
public Builder setTileEnabled(boolean isTileEnabled) { |
||||
this.isTileEnabled = isTileEnabled; |
||||
|
||||
return this; |
||||
} |
||||
|
||||
/** |
||||
* Set the textColorResourceId option for the {@link Crouton}. |
||||
* |
||||
* @param textColor |
||||
* The resource id of the text colorResourceId. |
||||
* @return the {@link Builder}. |
||||
*/ |
||||
public Builder setTextColor(int textColor) { |
||||
this.textColorResourceId = textColor; |
||||
|
||||
return this; |
||||
} |
||||
|
||||
/** |
||||
* Set the gravity option for the {@link Crouton}. |
||||
* |
||||
* @param gravity |
||||
* The text's gravity as provided by {@link Gravity}. |
||||
* @return the {@link Builder}. |
||||
*/ |
||||
public Builder setGravity(int gravity) { |
||||
this.gravity = gravity; |
||||
|
||||
return this; |
||||
} |
||||
|
||||
/** |
||||
* Set the image option for the {@link Crouton}. |
||||
* |
||||
* @param imageDrawable |
||||
* An additional image to display in the {@link Crouton}. |
||||
* @return the {@link Builder}. |
||||
*/ |
||||
public Builder setImageDrawable(Drawable imageDrawable) { |
||||
this.imageDrawable = imageDrawable; |
||||
|
||||
return this; |
||||
} |
||||
|
||||
/** |
||||
* Set the image resource option for the {@link Crouton}. |
||||
* |
||||
* @param imageResId |
||||
* An additional image to display in the {@link Crouton}. |
||||
* @return the {@link Builder}. |
||||
*/ |
||||
public Builder setImageResource(int imageResId) { |
||||
this.imageResId = imageResId; |
||||
|
||||
return this; |
||||
} |
||||
|
||||
/** |
||||
* The text size in sp |
||||
*/ |
||||
public Builder setTextSize(int textSize) { |
||||
this.textSize = textSize; |
||||
return this; |
||||
} |
||||
|
||||
/** |
||||
* The text shadow color's resource id |
||||
*/ |
||||
public Builder setTextShadowColor(int textShadowColorResId) { |
||||
this.textShadowColorResId = textShadowColorResId; |
||||
return this; |
||||
} |
||||
|
||||
/** |
||||
* The text shadow radius |
||||
*/ |
||||
public Builder setTextShadowRadius(float textShadowRadius) { |
||||
this.textShadowRadius = textShadowRadius; |
||||
return this; |
||||
} |
||||
|
||||
/** |
||||
* The text shadow horizontal offset |
||||
*/ |
||||
public Builder setTextShadowDx(float textShadowDx) { |
||||
this.textShadowDx = textShadowDx; |
||||
return this; |
||||
} |
||||
|
||||
/** |
||||
* The text shadow vertical offset |
||||
*/ |
||||
public Builder setTextShadowDy(float textShadowDy) { |
||||
this.textShadowDy = textShadowDy; |
||||
return this; |
||||
} |
||||
|
||||
/** |
||||
* The text appearance resource id for the text. |
||||
*/ |
||||
public Builder setTextAppearance(int textAppearanceResId) { |
||||
this.textAppearanceResId = textAppearanceResId; |
||||
return this; |
||||
} |
||||
|
||||
/** |
||||
* The resource id for the in animation |
||||
*/ |
||||
public Builder setInAnimation(int inAnimationResId) { |
||||
this.inAnimationResId = inAnimationResId; |
||||
return this; |
||||
} |
||||
|
||||
/** |
||||
* The resource id for the out animation |
||||
*/ |
||||
public Builder setOutAnimation(int outAnimationResId) { |
||||
this.outAnimationResId = outAnimationResId; |
||||
return this; |
||||
} |
||||
|
||||
/** |
||||
* The {@link android.widget.ImageView.ScaleType} for the image |
||||
*/ |
||||
public Builder setImageScaleType(ImageView.ScaleType imageScaleType) { |
||||
this.imageScaleType = imageScaleType; |
||||
return this; |
||||
} |
||||
|
||||
/** |
||||
* The padding for the crouton view's content in pixels |
||||
*/ |
||||
public Builder setPaddingInPixels(int padding) { |
||||
this.paddingInPixels = padding; |
||||
return this; |
||||
} |
||||
|
||||
/** |
||||
* The resource id for the padding for the crouton view's content |
||||
*/ |
||||
public Builder setPaddingDimensionResId(int paddingResId) { |
||||
this.paddingDimensionResId = paddingResId; |
||||
return this; |
||||
} |
||||
|
||||
/** |
||||
* @return a configured {@link Style} object. |
||||
*/ |
||||
public Style build() { |
||||
return new Style(this); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,102 @@
@@ -0,0 +1,102 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
|
||||
<!-- |
||||
~ Copyright 2012 - 2013 Benjamin Weiss |
||||
~ Copyright 2012 Neofonie Mobile GmbH |
||||
~ |
||||
~ 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. |
||||
--> |
||||
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" |
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> |
||||
<modelVersion>4.0.0</modelVersion> |
||||
|
||||
<name>Crouton Parent</name> |
||||
<artifactId>crouton-parent</artifactId> |
||||
<version>1.7</version> |
||||
<groupId>de.keyboardsurfer.android.widget</groupId> |
||||
<packaging>pom</packaging> |
||||
|
||||
<developers> |
||||
<developer> |
||||
<id>keyboardsurfer</id> |
||||
<name>Benjamin Weiss</name> |
||||
</developer> |
||||
</developers> |
||||
|
||||
<licenses> |
||||
<license> |
||||
<name>The Apache Software License, Version 2.0</name> |
||||
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url> |
||||
<distribution>repo</distribution> |
||||
</license> |
||||
</licenses> |
||||
|
||||
<scm> |
||||
<url>git@github.com:keyboardsurfer/Crouton.git</url> |
||||
<developerConnection>scm:git:git@github.com:keyboardsurfer/Crouton.git</developerConnection> |
||||
<connection>scm:git:git@github.com:keyboardsurfer/Crouton.git</connection> |
||||
</scm> |
||||
|
||||
<modules> |
||||
<module>library</module> |
||||
<module>sample</module> |
||||
</modules> |
||||
|
||||
<properties> |
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> |
||||
<android.version>4.1.1.4</android.version> |
||||
<android.version.platform>16</android.version.platform> |
||||
</properties> |
||||
|
||||
<build> |
||||
<pluginManagement> |
||||
<plugins> |
||||
<plugin> |
||||
<groupId>org.apache.maven.plugins</groupId> |
||||
<artifactId>maven-compiler-plugin</artifactId> |
||||
<version>2.5.1</version> |
||||
<configuration> |
||||
<source>1.6</source> |
||||
<target>1.6</target> |
||||
</configuration> |
||||
</plugin> |
||||
<plugin> |
||||
<groupId>org.apache.maven.plugins</groupId> |
||||
<artifactId>maven-source-plugin</artifactId> |
||||
<version>2.2</version> |
||||
</plugin> |
||||
<plugin> |
||||
<groupId>org.apache.maven.plugins</groupId> |
||||
<artifactId>maven-javadoc-plugin</artifactId> |
||||
<version>2.9</version> |
||||
</plugin> |
||||
<plugin> |
||||
<groupId>com.jayway.maven.plugins.android.generation2</groupId> |
||||
<artifactId>android-maven-plugin</artifactId> |
||||
<version>3.4.1</version> |
||||
<extensions>true</extensions> |
||||
<configuration> |
||||
<sdk> |
||||
<platform>${android.version.platform}</platform> |
||||
</sdk> |
||||
<undeployBeforeDeploy>true</undeployBeforeDeploy> |
||||
<lazyLibraryUnpack>true</lazyLibraryUnpack> |
||||
</configuration> |
||||
</plugin> |
||||
</plugins> |
||||
</pluginManagement> |
||||
</build> |
||||
|
||||
</project> |
Loading…
Reference in new issue