Compare commits

...
Sign in to create a new pull request.

51 commits

Author SHA1 Message Date
4bb806585f merged latest version from https://github.com/firexel/emojicon/
but only seems to work with lollipop, so switch back to the old pictures
2015-08-12 21:43:04 +02:00
0ee1992da2 Fixes FS#38 - Issues with URLs with multiple dots in file name 2015-08-12 19:20:24 +02:00
473f035355 Fixes FS#33 - Get back the comment 2015-08-12 18:28:56 +02:00
steckbrief
b085643555 Fixes FS#20: Limitation of end conversation swipe to left side 2015-08-11 22:19:48 +02:00
8fd688ca96 Merge tag '1.5.2' into trz/rebase 2015-08-11 17:35:53 +02:00
steckbrief
553f41a2db Show Online status in contact list with respect to SHOW_ONLINE_STATUS preference 2015-06-19 23:12:24 +02:00
steckbrief
a73ce32e27 Status color added to "create conversation" (refers to ticket #22 in flyspray) 2015-06-19 23:11:44 +02:00
b3b4a2902e moved color picker to libs 2015-04-15 21:43:53 +02:00
549810783c changed received and read confirmation setting to one list and put it to settings class 2015-04-14 23:48:28 +02:00
8932dd9fb3 adjusted todo 2015-04-14 00:06:53 +02:00
516c343e8a check with lowercase to also match JPEG, JPeg ... 2015-04-13 15:55:00 +02:00
12486e9a29 adjusted todo 2015-04-13 11:19:42 +02:00
ae8a2467aa changed last message in overview also to EmojiconTextView for displaying smileys correctly 2015-04-12 23:37:58 +02:00
573bfed961 adjusted todo 2015-04-12 23:10:21 +02:00
3ef609cfbd better and perhaps faster way for checking if a message is downloadable 2015-04-12 23:09:53 +02:00
03bc7dcdc9 new settings to initialisation of Settings 2015-04-12 23:09:10 +02:00
7405d50c70 implementation for downloading only when enabled wlan 2015-04-12 21:28:45 +02:00
56e695cf1b added settings for accepting and downloading files
fix in Settings, initialize with same values like in preferences.xml
2015-04-12 20:59:12 +02:00
98c09f18a2 add missing resource files 2015-04-12 17:25:50 +02:00
d64aa6407c Merge remote-tracking branch 'origin/trz/master' into trz/master 2015-04-12 17:24:10 +02:00
cae106e310 whatsapp-like smiley implementation 2015-04-12 17:22:53 +02:00
972c65b775 whatsapp-like smiley implemantation 2015-04-12 17:21:35 +02:00
fd5f36b864 adjusted todo 2015-04-12 12:09:18 +02:00
steckbrief
deac0df707 Merge branch 'trz/master' of ssh://git.fucktheforce.de/conversations into trz/master 2015-04-11 23:00:31 +02:00
steckbrief
17779e7700 Color choose dialog 2015-04-11 23:00:10 +02:00
82bfd8ac33 show online status under avatar in same way for muc as the send button does 2015-04-11 21:49:48 +02:00
ae520c2957 differ between received and read message 2015-04-11 21:48:55 +02:00
94a669fcb8 no trim of messages or password
check password with only spaces separately
2015-04-11 20:53:25 +02:00
3a814addab correct parsing of led color 2015-04-11 20:23:25 +02:00
c829f612cd todo added 2015-04-11 17:24:06 +02:00
df63c14617 Merge branch 'trz/master' of ssh://git.fucktheforce.de/conversations into trz/master 2015-04-11 14:15:07 +02:00
87e56b534a changed distribution url due to bug: http://stackoverflow.com/questions/29576097/gradle-sync-error-in-android-studio-when-importing-project/29576568#29576568 2015-04-11 14:14:43 +02:00
steckbrief
e17b75511e timestamp parsing reverted 2015-03-31 16:30:47 +02:00
steckbrief
6220260df3 Configurable LED color (Attention: Expert setting because currently only text input) 2015-03-31 15:26:26 +02:00
steckbrief
52ed924a13 Changes for emoticon parser reactivated 2015-03-31 14:13:12 +02:00
steckbrief
75c5275f7e Merge tag '1.2.0' into trz/master
Conflicts:
	src/main/java/eu/siacs/conversations/parser/AbstractParser.java
	src/main/java/eu/siacs/conversations/ui/SettingsActivity.java
	src/main/java/eu/siacs/conversations/ui/adapter/ConversationAdapter.java
	src/main/res/values-de/strings.xml
	src/main/res/xml/preferences.xml
2015-03-30 22:12:49 +02:00
steckbrief
c8fe93cf0a - Some comments to refer to the XEPs added
- parseTimestamp method changed to use the XMLGregorianCalendar (refer to XEP-0082 and subsequently Date/DateTime definition of XML Schema Part 2, http://www.w3.org/TR/xmlschema-2/#date, http://www.w3.org/TR/xmlschema-2/#dateTime)
  a small test comparing the original implementation with the XMLGregorianCalendar implementation showed a significant performance improvement (about 0.1s on windows 7 64bit, AMD-A6 1.8GHz, 16GB RAM, Android Studio + Eclipse + Firefox running)
2015-02-21 00:12:15 +01:00
steckbrief
20eae39557 Merge master-origin
Conflicts:
	src/main/java/eu/siacs/conversations/ui/SettingsActivity.java
	src/main/java/eu/siacs/conversations/ui/XmppActivity.java
	src/main/java/eu/siacs/conversations/ui/adapter/ConversationAdapter.java
	src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java
	src/main/java/eu/siacs/conversations/utils/UIHelper.java
	src/main/res/values-de/strings.xml
2015-02-20 22:19:31 +01:00
steckbrief
980a84a6ce ToDo modified 2015-02-20 21:09:20 +01:00
c67ed416a1 modified TODO 2015-02-19 10:14:17 +01:00
0f169e8dbe added section to TODO 2015-02-13 09:22:50 +01:00
77c19f81dc some more in TODO 2015-02-13 00:25:10 +01:00
aed8c64e54 add TODO 2015-02-07 13:06:15 +01:00
steckbrief
46bbf1ce5f - Avoiding accessing shared preferences to know if emoticons should be parsed for every single message
- Adding support to show online status in Conversations overview (configurable via the setting "send_button_status")
2015-01-20 22:42:53 +01:00
Tristan Zur
e8ca2a1ae3 Merge branch 'master' of ssh://git.fucktheforce.de/conversations
Conflicts:
	src/main/java/eu/siacs/conversations/ui/adapter/ConversationAdapter.java
	src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java
2015-01-11 02:39:39 +01:00
Tristan Zur
5a860416b5 Setting added for parsing emoticons or not 2015-01-11 01:40:25 +01:00
71bb1e90b0 changes to get it working under eclipse 2015-01-10 23:11:07 +01:00
Tristan Zur
0464a6a3fa Fixed missing symbol for eu.siacs.conversations.Config and wrong parameter for method eu.siacs.conversations.utils.UIHelper.transformAscii.. 2015-01-10 22:17:51 +01:00
95e2a53951 Merge branch 'master' of ssh://git.fucktheforce.de/conversations
Conflicts:
	src/main/java/eu/siacs/conversations/Config.java
	src/main/java/eu/siacs/conversations/ui/adapter/ConversationAdapter.java
	src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java
	src/main/java/eu/siacs/conversations/utils/UIHelper.java
2015-01-03 23:19:05 +01:00
48717dd7d3 remaining part of my patch 2015-01-03 21:31:56 +01:00
6e3e58e3c8 added smilies from patch. remaining changes will follow later 2015-01-03 17:43:42 +01:00
1562 changed files with 18340 additions and 3136 deletions

View file

@ -3,7 +3,8 @@ android:
components:
- platform-tools
- tools
- build-tools-22.0.1
- build-tools-21.1.2
- build-tools-19.1.0
- android-21
- android-22
- extra-android-m2repository

File diff suppressed because it is too large Load diff

View file

@ -1,5 +1,34 @@
###Changelog
####Version 1.5.1
* fixed rare crashes
* improved otr support
####Version 1.5.0
* upload files to HTTP host and share them in MUCs. requires new [HttpUploadComponent](https://github.com/siacs/HttpUploadComponent) on server side
####Version 1.4.5
* fixes to message parser to not display some ejabberd muc status messages
####Version 1.4.4
* added unread count badges on supported devices
* rewrote message parser
####Version 1.4.0
* send button turns into quick action button to offer faster access to take photo, send location or record audio
* visually seperate merged messages
* faster reconnects of failed accounts after network switches
* r/o vcard avatars for contacts
* various bug fixes
####Version 1.3.0
* swipe conversations to end them
* quickly enable / disable account via slider
* share multiple images at once
* expert option to distrust system CAs
* mlink compatibility
* bug fixes
####Version 1.2.0
* Send current location. (requires [plugin](https://play.google.com/store/apps/details?id=eu.siacs.conversations.sharelocation))
* Invite multiple contacts at once

10
ManualBuildForFdroid.md Normal file
View file

@ -0,0 +1,10 @@
### Build with Android Studio
1. Adjust build.gradle
a. increment versionCode
b. enter new versionName
2. Generate APK
a. (menu) Build -> Generate Signed APK
b. choose Key store path (AndroidKeystore.jks) -> choose key alias (android-key) -> Next -> Finish
3. Upload APK to VM with installed FDroid into folder /var/www/fdroid/repo (Repo Folder)
4. Run fdroid update --create-metadata in directory /var/www/fdroid
5. Rsync Repo Folder to public F-Droid Repo

View file

@ -2,7 +2,7 @@
Conversations: the very last word in instant messaging
[![Google Play](http://developer.android.com/images/brand/en_generic_rgb_wo_45.png)](https://play.google.com/store/apps/details?id=eu.siacs.conversations)
[![Google Play](http://developer.android.com/images/brand/en_generic_rgb_wo_60.png)](https://play.google.com/store/apps/details?id=eu.siacs.conversations) [![Amazon App Store](https://images-na.ssl-images-amazon.com/images/G/01/AmazonMobileApps/amazon-apps-store-us-black.png)](http://www.amazon.com/dp/B00WD35AAC/)
![screenshots](https://raw.githubusercontent.com/siacs/Conversations/master/screenshots.png)
@ -17,7 +17,8 @@ Conversations: the very last word in instant messaging
## Features
* End-to-end encryption with either [OTR](https://otr.cypherpunks.ca/) or [OpenPGP](http://www.openpgp.org/about_openpgp/)
* Sending and receiving images
* Send and receive images as well as other kind of files
* Share your location via an external [plug-in](https://play.google.com/store/apps/details?id=eu.siacs.conversations.sharelocation)
* Indication when your contact has read your message
* Intuitive UI that follows Android Design guidelines
* Pictures / Avatars for your Contacts
@ -41,6 +42,8 @@ run your own XMPP server for you and your friends. These XEP's are:
* XEP-0065: SOCKS5 Bytestreams (or mod_proxy65). Will be used to transfer
files if both parties are behind a firewall (NAT).
* XEP-0163: Personal Eventing Protocol for avatars
* XEP-0191: Blocking command lets you blacklist spammers or block contacts
without removing them from your roster.
* XEP-0198: Stream Management allows XMPP to survive small network outages and
changes of the underlying TCP connection.
* XEP-0280: Message Carbons which automatically syncs the messages you send to
@ -53,8 +56,9 @@ run your own XMPP server for you and your friends. These XEP's are:
* XEP-0352: Client State Indication lets the server know whether or not
Conversations is in the background. Allows the server to save bandwidth by
withholding unimportant packages.
* XEP-0191: Blocking command lets you blacklist spammers or block contacts
without removing them from your roster.
* XEP-xxxx: HttpUpload allows you to share files in conferences and with offline
contacts. Requires an [additional component](https://github.com/siacs/HttpUploadComponent)
on your server.
## Team
@ -66,12 +70,13 @@ run your own XMPP server for you and your friends. These XEP's are:
(In order of appearance)
* [Rene Treffer](https://github.com/rtreffer)
* [Andreas Straub](https://github.com/strb)
* [Alethea Butler](https://github.com/alethea)
* [M. Dietrich](https://github.com/emdete)
* [betheg](https://github.com/betheg)
* [Sam Whited](https://github.com/SamWhited)
* [Rene Treffer](https://github.com/rtreffer) ([PRs](https://github.com/siacs/Conversations/pulls?utf8=%E2%9C%93&q=is%3Apr+author%3Artreffer+is%3Amerged))
* [Andreas Straub](https://github.com/strb) ([PRs](https://github.com/siacs/Conversations/pulls?utf8=%E2%9C%93&q=is%3Apr+author%3Astrb+is%3Amerged))
* [Alethea Butler](https://github.com/alethea) ([PRs](https://github.com/siacs/Conversations/pulls?utf8=%E2%9C%93&q=is%3Apr+author%3Aalethea+is%3Amerged))
* [M. Dietrich](https://github.com/emdete) ([PRs](https://github.com/siacs/Conversations/pulls?utf8=%E2%9C%93&q=is%3Apr+author%3Aemdete+is%3Amerged))
* [betheg](https://github.com/betheg) ([PRs](https://github.com/siacs/Conversations/pulls?utf8=%E2%9C%93&q=is%3Apr+author%3Abetheg+is%3Amerged))
* [Sam Whited](https://github.com/SamWhited) ([PRs](https://github.com/siacs/Conversations/pulls?utf8=%E2%9C%93&q=is%3Apr+author%3ASamWhited+is%3Amerged))
* [BrianBlade](https://github.com/BrianBlade) ([PRs](https://github.com/siacs/Conversations/pulls?utf8=%E2%9C%93&q=is%3Apr+author%3ABrianBlade+is%3Amerged))
#### Logo
* [Ilia Rostovtsev](https://github.com/qooob) (Progress)
@ -250,7 +255,7 @@ decrypting and encrypting takes longer than OTR. It is however asynchronous and
works well with message carbons.
To use OpenPGP you have to install the open source app
[OpenKeychain](www.openkeychain.org) and then long press on the account in
[OpenKeychain](http://www.openkeychain.org) and then long press on the account in
manage accounts and choose renew PGP announcement from the contextual menu.
#### How does the encryption for conferences work?

10
TODO Normal file
View file

@ -0,0 +1,10 @@
settings:
- cleanup and structure
- remove/fix "enter is send" and "show enter key"
code:
- check parseTimestamp
- change crash reports
- notification with emojicon textview
general:
- add comments to code of XEPs
- add comments in general

View file

@ -13,7 +13,7 @@
width="95"
height="95"
id="Yes_check"
inkscape:version="0.48.5 r10040"
inkscape:version="0.91 r13725"
sodipodi:docname="ic_received_indicator.svg">
<metadata
id="metadata10">
@ -23,7 +23,7 @@
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
@ -36,17 +36,17 @@
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1233"
inkscape:window-height="828"
inkscape:window-width="956"
inkscape:window-height="1156"
id="namedview8"
showgrid="false"
showguides="true"
inkscape:guide-bbox="true"
inkscape:zoom="5.04"
inkscape:cx="26.829268"
inkscape:cx="-4.3215257"
inkscape:cy="37.489149"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-x="2880"
inkscape:window-y="20"
inkscape:window-maximized="0"
inkscape:current-layer="Yes_check"
fit-margin-top="0"
@ -69,7 +69,7 @@
</defs>
<path
d="m 2.3894499,61.412131 c 0,0 16.7473651,20.271938 22.3528491,26.154483 3.648598,3.026816 12.878061,3.83429 14.880462,0 1.64903,-2.636163 2.380404,-5.8348 2.991819,-7.931771 C 49.920898,54.575958 72.297563,22.337321 92.321082,10.50894 96.814837,5.2377522 86.327596,3.5063483 77.217442,6.9958109 63.487006,12.254946 34.107717,59.529917 29.270873,69.192545 22.40265,70.841418 12.518762,52.447046 12.518762,52.447046 7.3805037,52.552428 1.8841059,52.071763 2.3894499,61.412131 z"
style="fill:#249b25;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.29981154;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
style="fill:#259b24;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.29981154;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="check"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccscsccc" />

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

View file

@ -0,0 +1,54 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="48"
height="48"
viewBox="0 0 48 48"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="ic_send_cancel_away.svg">
<metadata
id="metadata10">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs8" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="956"
inkscape:window-height="507"
id="namedview6"
showgrid="false"
inkscape:zoom="4.9166667"
inkscape:cx="-8.3389831"
inkscape:cy="24"
inkscape:window-x="0"
inkscape:window-y="549"
inkscape:window-maximized="0"
inkscape:current-layer="svg2" />
<path
d="M24 4C12.95 4 4 12.95 4 24s8.95 20 20 20 20-8.95 20-20S35.05 4 24 4zm10 27.17L31.17 34 24 26.83 16.83 34 14 31.17 21.17 24 14 16.83 16.83 14 24 21.17 31.17 14 34 16.83 26.83 24 34 31.17z"
id="path4"
style="fill:#ff9800;fill-opacity:0.627451" />
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View file

@ -0,0 +1,54 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="48"
height="48"
viewBox="0 0 48 48"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="ic_send_cancel_dnd.svg">
<metadata
id="metadata10">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs8" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="956"
inkscape:window-height="507"
id="namedview6"
showgrid="false"
inkscape:zoom="4.9166667"
inkscape:cx="-8.3389831"
inkscape:cy="24"
inkscape:window-x="0"
inkscape:window-y="549"
inkscape:window-maximized="0"
inkscape:current-layer="svg2" />
<path
d="M24 4C12.95 4 4 12.95 4 24s8.95 20 20 20 20-8.95 20-20S35.05 4 24 4zm10 27.17L31.17 34 24 26.83 16.83 34 14 31.17 21.17 24 14 16.83 16.83 14 24 21.17 31.17 14 34 16.83 26.83 24 34 31.17z"
id="path4"
style="fill:#f44336;fill-opacity:0.627451" />
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View file

@ -0,0 +1,54 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="48"
height="48"
viewBox="0 0 48 48"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="ic_send_cancel_offline.svg">
<metadata
id="metadata10">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs8" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1080"
id="namedview6"
showgrid="false"
inkscape:zoom="4.9166667"
inkscape:cx="-7.9322034"
inkscape:cy="24"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="0"
inkscape:current-layer="svg2" />
<path
d="M24 4C12.95 4 4 12.95 4 24s8.95 20 20 20 20-8.95 20-20S35.05 4 24 4zm10 27.17L31.17 34 24 26.83 16.83 34 14 31.17 21.17 24 14 16.83 16.83 14 24 21.17 31.17 14 34 16.83 26.83 24 34 31.17z"
id="path4"
style="fill:#000000;fill-opacity:0.627451" />
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View file

@ -0,0 +1,54 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="48"
height="48"
viewBox="0 0 48 48"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="ic_send_cancel_online.svg">
<metadata
id="metadata10">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs8" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="956"
inkscape:window-height="507"
id="namedview6"
showgrid="false"
inkscape:zoom="4.9166667"
inkscape:cx="-8.3389831"
inkscape:cy="24"
inkscape:window-x="0"
inkscape:window-y="549"
inkscape:window-maximized="0"
inkscape:current-layer="svg2" />
<path
d="M24 4C12.95 4 4 12.95 4 24s8.95 20 20 20 20-8.95 20-20S35.05 4 24 4zm10 27.17L31.17 34 24 26.83 16.83 34 14 31.17 21.17 24 14 16.83 16.83 14 24 21.17 31.17 14 34 16.83 26.83 24 34 31.17z"
id="path4"
style="fill:#259b24;fill-opacity:0.627451" />
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View file

@ -0,0 +1,54 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="48"
height="48"
viewBox="0 0 48 48"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="ic_send_location_away.svg">
<metadata
id="metadata10">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs8" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="956"
inkscape:window-height="1156"
id="namedview6"
showgrid="false"
inkscape:zoom="4.9166667"
inkscape:cx="0.91525424"
inkscape:cy="24"
inkscape:window-x="2880"
inkscape:window-y="20"
inkscape:window-maximized="0"
inkscape:current-layer="svg2" />
<path
d="M24 4c-7.73 0-14 6.27-14 14 0 10.5 14 26 14 26s14-15.5 14-26c0-7.73-6.27-14-14-14zm0 19c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5z"
id="path4"
style="fill:#ff9800;fill-opacity:0.627451" />
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View file

@ -0,0 +1,54 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="48"
height="48"
viewBox="0 0 48 48"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="ic_send_location_dnd.svg">
<metadata
id="metadata10">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs8" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="956"
inkscape:window-height="1156"
id="namedview6"
showgrid="false"
inkscape:zoom="4.9166667"
inkscape:cx="-7.9322034"
inkscape:cy="24"
inkscape:window-x="2880"
inkscape:window-y="20"
inkscape:window-maximized="0"
inkscape:current-layer="svg2" />
<path
d="M24 4c-7.73 0-14 6.27-14 14 0 10.5 14 26 14 26s14-15.5 14-26c0-7.73-6.27-14-14-14zm0 19c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5z"
id="path4"
style="fill:#f44336;fill-opacity:0.627451" />
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View file

@ -0,0 +1,54 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="48"
height="48"
viewBox="0 0 48 48"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="ic_send_location_offline.svg">
<metadata
id="metadata10">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs8" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="956"
inkscape:window-height="1156"
id="namedview6"
showgrid="false"
inkscape:zoom="4.9166667"
inkscape:cx="-7.9322034"
inkscape:cy="24"
inkscape:window-x="2880"
inkscape:window-y="20"
inkscape:window-maximized="0"
inkscape:current-layer="svg2" />
<path
d="M24 4c-7.73 0-14 6.27-14 14 0 10.5 14 26 14 26s14-15.5 14-26c0-7.73-6.27-14-14-14zm0 19c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5z"
id="path4"
style="fill:#000000;fill-opacity:0.627451" />
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View file

@ -0,0 +1,54 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="48"
height="48"
viewBox="0 0 48 48"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="ic_send_location_online.svg">
<metadata
id="metadata10">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs8" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="956"
inkscape:window-height="1156"
id="namedview6"
showgrid="false"
inkscape:zoom="4.9166667"
inkscape:cx="-7.9322034"
inkscape:cy="24"
inkscape:window-x="2880"
inkscape:window-y="20"
inkscape:window-maximized="0"
inkscape:current-layer="svg2" />
<path
d="M24 4c-7.73 0-14 6.27-14 14 0 10.5 14 26 14 26s14-15.5 14-26c0-7.73-6.27-14-14-14zm0 19c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5z"
id="path4"
style="stroke:none;stroke-opacity:0;fill:#259b24;fill-opacity:0.627451" />
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View file

@ -0,0 +1,60 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="48"
height="48"
viewBox="0 0 48 48"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="ic_send_photo_away.svg">
<metadata
id="metadata12">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs10" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="956"
inkscape:window-height="567"
id="namedview8"
showgrid="false"
inkscape:zoom="4.9166667"
inkscape:cx="-8.3389831"
inkscape:cy="24"
inkscape:window-x="960"
inkscape:window-y="609"
inkscape:window-maximized="0"
inkscape:current-layer="svg2" />
<circle
cx="24"
cy="24"
r="6.4"
id="circle4"
style="fill-opacity:0.627451;fill:#ff9800" />
<path
d="M18 4l-3.66 4H8c-2.21 0-4 1.79-4 4v24c0 2.21 1.79 4 4 4h32c2.21 0 4-1.79 4-4V12c0-2.21-1.79-4-4-4h-6.34L30 4H18zm6 30c-5.52 0-10-4.48-10-10s4.48-10 10-10 10 4.48 10 10-4.48 10-10 10z"
id="path6"
style="fill:#ff9800;fill-opacity:0.627451" />
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

60
art/ic_send_photo_dnd.svg Normal file
View file

@ -0,0 +1,60 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="48"
height="48"
viewBox="0 0 48 48"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="ic_send_photo_dnd.svg">
<metadata
id="metadata12">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs10" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="956"
inkscape:window-height="567"
id="namedview8"
showgrid="false"
inkscape:zoom="4.9166667"
inkscape:cx="-8.3389831"
inkscape:cy="24"
inkscape:window-x="960"
inkscape:window-y="609"
inkscape:window-maximized="0"
inkscape:current-layer="svg2" />
<circle
cx="24"
cy="24"
r="6.4"
id="circle4"
style="fill:#f44336;fill-opacity:0.627451" />
<path
d="M18 4l-3.66 4H8c-2.21 0-4 1.79-4 4v24c0 2.21 1.79 4 4 4h32c2.21 0 4-1.79 4-4V12c0-2.21-1.79-4-4-4h-6.34L30 4H18zm6 30c-5.52 0-10-4.48-10-10s4.48-10 10-10 10 4.48 10 10-4.48 10-10 10z"
id="path6"
style="fill:#f44336;fill-opacity:0.627451" />
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View file

@ -0,0 +1,60 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="48"
height="48"
viewBox="0 0 48 48"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="ic_send_photo_offline.svg">
<metadata
id="metadata12">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs10" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="956"
inkscape:window-height="567"
id="namedview8"
showgrid="false"
inkscape:zoom="4.9166667"
inkscape:cx="-8.3389831"
inkscape:cy="24"
inkscape:window-x="960"
inkscape:window-y="609"
inkscape:window-maximized="0"
inkscape:current-layer="svg2" />
<circle
cx="24"
cy="24"
r="6.4"
id="circle4"
style="fill:#000000;fill-opacity:0.627451" />
<path
d="M18 4l-3.66 4H8c-2.21 0-4 1.79-4 4v24c0 2.21 1.79 4 4 4h32c2.21 0 4-1.79 4-4V12c0-2.21-1.79-4-4-4h-6.34L30 4H18zm6 30c-5.52 0-10-4.48-10-10s4.48-10 10-10 10 4.48 10 10-4.48 10-10 10z"
id="path6"
style="fill:#000000;fill-opacity:0.627451" />
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View file

@ -0,0 +1,60 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="48"
height="48"
viewBox="0 0 48 48"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="ic_send_photo_online.svg">
<metadata
id="metadata12">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs10" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="956"
inkscape:window-height="567"
id="namedview8"
showgrid="false"
inkscape:zoom="4.9166667"
inkscape:cx="-8.3389831"
inkscape:cy="24"
inkscape:window-x="960"
inkscape:window-y="609"
inkscape:window-maximized="0"
inkscape:current-layer="svg2" />
<circle
cx="24"
cy="24"
r="6.4"
id="circle4"
style="fill:#259b24;fill-opacity:0.627451" />
<path
d="M18 4l-3.66 4H8c-2.21 0-4 1.79-4 4v24c0 2.21 1.79 4 4 4h32c2.21 0 4-1.79 4-4V12c0-2.21-1.79-4-4-4h-6.34L30 4H18zm6 30c-5.52 0-10-4.48-10-10s4.48-10 10-10 10 4.48 10 10-4.48 10-10 10z"
id="path6"
style="fill:#259b24;fill-opacity:0.627451" />
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View file

@ -0,0 +1,55 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="48"
height="48"
viewBox="0 0 48 48"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="ic_send_picture_away.svg">
<metadata
id="metadata10">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs8" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1916"
inkscape:window-height="1036"
id="namedview6"
showgrid="false"
inkscape:zoom="4.9166667"
inkscape:cx="6.5084746"
inkscape:cy="24"
inkscape:window-x="0"
inkscape:window-y="20"
inkscape:window-maximized="0"
inkscape:current-layer="svg2" />
<path
d="M42 38V10c0-2.21-1.79-4-4-4H10c-2.21 0-4 1.79-4 4v28c0 2.21 1.79 4 4 4h28c2.21 0 4-1.79 4-4zM17 27l5 6.01L29 24l9 12H10l7-9z"
id="path4"
style="fill:#ff9800;fill-opacity:0.627451" />
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View file

@ -0,0 +1,55 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="48"
height="48"
viewBox="0 0 48 48"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="ic_send_picture_dnd.svg">
<metadata
id="metadata10">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs8" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1916"
inkscape:window-height="1036"
id="namedview6"
showgrid="false"
inkscape:zoom="4.9166667"
inkscape:cx="6.5084746"
inkscape:cy="24"
inkscape:window-x="0"
inkscape:window-y="20"
inkscape:window-maximized="0"
inkscape:current-layer="svg2" />
<path
d="M42 38V10c0-2.21-1.79-4-4-4H10c-2.21 0-4 1.79-4 4v28c0 2.21 1.79 4 4 4h28c2.21 0 4-1.79 4-4zM17 27l5 6.01L29 24l9 12H10l7-9z"
id="path4"
style="fill:#f44336;fill-opacity:0.627451" />
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View file

@ -0,0 +1,55 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="48"
height="48"
viewBox="0 0 48 48"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="ic_send_picture_offline.svg">
<metadata
id="metadata10">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs8" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1916"
inkscape:window-height="1036"
id="namedview6"
showgrid="false"
inkscape:zoom="4.9166667"
inkscape:cx="6.5084746"
inkscape:cy="24"
inkscape:window-x="0"
inkscape:window-y="20"
inkscape:window-maximized="0"
inkscape:current-layer="svg2" />
<path
d="M42 38V10c0-2.21-1.79-4-4-4H10c-2.21 0-4 1.79-4 4v28c0 2.21 1.79 4 4 4h28c2.21 0 4-1.79 4-4zM17 27l5 6.01L29 24l9 12H10l7-9z"
id="path4"
style="fill:#000000;fill-opacity:0.627451" />
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View file

@ -0,0 +1,55 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="48"
height="48"
viewBox="0 0 48 48"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="ic_send_picture_online.svg">
<metadata
id="metadata10">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs8" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1916"
inkscape:window-height="1036"
id="namedview6"
showgrid="false"
inkscape:zoom="4.9166667"
inkscape:cx="6.5084746"
inkscape:cy="24"
inkscape:window-x="0"
inkscape:window-y="20"
inkscape:window-maximized="0"
inkscape:current-layer="svg2" />
<path
d="M42 38V10c0-2.21-1.79-4-4-4H10c-2.21 0-4 1.79-4 4v28c0 2.21 1.79 4 4 4h28c2.21 0 4-1.79 4-4zM17 27l5 6.01L29 24l9 12H10l7-9z"
id="path4"
style="fill:#259b24;fill-opacity:0.627451" />
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

69
art/ic_send_text_away.svg Normal file
View file

@ -0,0 +1,69 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
id="svg3621"
version="1.1"
inkscape:version="0.91 r13725"
width="96"
height="96"
sodipodi:docname="ic_send_text_away.svg"
inkscape:export-filename="/home/daniel/workspace/Conversations/res/drawable-xxhdpi/ic_action_send_now_online.png"
inkscape:export-xdpi="154.28572"
inkscape:export-ydpi="154.28572">
<metadata
id="metadata3627">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs3625" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="744"
inkscape:window-height="1156"
id="namedview3623"
showgrid="true"
showguides="true"
inkscape:zoom="8"
inkscape:cx="55.595803"
inkscape:cy="56.761328"
inkscape:window-x="3092"
inkscape:window-y="20"
inkscape:window-maximized="0"
inkscape:current-layer="svg3621">
<inkscape:grid
type="xygrid"
id="grid3631" />
</sodipodi:namedview>
<path
style="fill:#ff9800;fill-opacity:0.627451;stroke:none"
d="M 3.887575,4.1549246 90.999747,47.676331 3.887575,91.286663 13.203552,52.344101 63.012683,47.720794 13.203552,43.008558 Z"
id="path3633"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccccc"
inkscape:export-filename="/home/daniel/workspace/Conversations/res/drawable-mdpi/ic_action_send_now_dnd.png"
inkscape:export-xdpi="51.42857"
inkscape:export-ydpi="51.42857" />
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

69
art/ic_send_text_dnd.svg Normal file
View file

@ -0,0 +1,69 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
id="svg3621"
version="1.1"
inkscape:version="0.91 r13725"
width="96"
height="96"
sodipodi:docname="ic_send_text_dnd.svg"
inkscape:export-filename="/home/daniel/workspace/Conversations/res/drawable-xxhdpi/ic_action_send_now_online.png"
inkscape:export-xdpi="154.28572"
inkscape:export-ydpi="154.28572">
<metadata
id="metadata3627">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs3625" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="956"
inkscape:window-height="1156"
id="namedview3623"
showgrid="true"
showguides="true"
inkscape:zoom="8"
inkscape:cx="49.908303"
inkscape:cy="56.761328"
inkscape:window-x="2880"
inkscape:window-y="20"
inkscape:window-maximized="0"
inkscape:current-layer="svg3621">
<inkscape:grid
type="xygrid"
id="grid3631" />
</sodipodi:namedview>
<path
style="fill:#f44336;fill-opacity:0.627451;stroke:none"
d="M 3.887575,4.1549246 90.999747,47.676331 3.887575,91.286663 13.203552,52.344101 63.012683,47.720794 13.203552,43.008558 Z"
id="path3633"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccccc"
inkscape:export-filename="/home/daniel/workspace/Conversations/res/drawable-mdpi/ic_action_send_now_dnd.png"
inkscape:export-xdpi="51.42857"
inkscape:export-ydpi="51.42857" />
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

View file

@ -0,0 +1,69 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
id="svg3621"
version="1.1"
inkscape:version="0.91 r13725"
width="96"
height="96"
sodipodi:docname="ic_send_text_offline.svg"
inkscape:export-filename="/home/daniel/workspace/Conversations/res/drawable-xxhdpi/ic_action_send_now_online.png"
inkscape:export-xdpi="154.28572"
inkscape:export-ydpi="154.28572">
<metadata
id="metadata3627">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs3625" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="956"
inkscape:window-height="1156"
id="namedview3623"
showgrid="true"
showguides="true"
inkscape:zoom="8"
inkscape:cx="50.158303"
inkscape:cy="56.761328"
inkscape:window-x="2880"
inkscape:window-y="20"
inkscape:window-maximized="0"
inkscape:current-layer="svg3621">
<inkscape:grid
type="xygrid"
id="grid3631" />
</sodipodi:namedview>
<path
style="fill:#000000;fill-opacity:0.627451;stroke:none"
d="M 3.887575,4.1549246 90.999747,47.676331 3.887575,91.286663 13.203552,52.344101 63.012683,47.720794 13.203552,43.008558 Z"
id="path3633"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccccc"
inkscape:export-filename="/home/daniel/workspace/Conversations/res/drawable-mdpi/ic_action_send_now_dnd.png"
inkscape:export-xdpi="51.42857"
inkscape:export-ydpi="51.42857" />
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

View file

@ -11,7 +11,7 @@
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
id="svg3621"
version="1.1"
inkscape:version="0.48.4 r9939"
inkscape:version="0.91 r13725"
width="96"
height="96"
sodipodi:docname="ic_action_send_now.svg"
@ -26,7 +26,7 @@
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
@ -41,16 +41,16 @@
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1916"
inkscape:window-height="1161"
inkscape:window-width="1920"
inkscape:window-height="1200"
id="namedview3623"
showgrid="true"
showguides="true"
inkscape:zoom="1"
inkscape:cx="47.28873"
inkscape:cy="43.262706"
inkscape:window-x="0"
inkscape:window-y="18"
inkscape:zoom="8"
inkscape:cx="69.783303"
inkscape:cy="56.761328"
inkscape:window-x="1920"
inkscape:window-y="0"
inkscape:window-maximized="0"
inkscape:current-layer="svg3621">
<inkscape:grid
@ -58,8 +58,8 @@
id="grid3631" />
</sodipodi:namedview>
<path
style="fill:#e51c28;fill-opacity:0.627451;stroke:none"
d="M 20.012575,21.028577 76,49 20.012575,77.028577 26,52 58.012575,49.028577 26,46 z"
style="fill:#259b24;fill-opacity:0.62745098;stroke:none"
d="M 3.887575,4.1549246 90.999747,47.676331 3.887575,91.286663 13.203552,52.344101 63.012683,47.720794 13.203552,43.008558 Z"
id="path3633"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccccc"

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

View file

@ -0,0 +1,54 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="48"
height="48"
viewBox="0 0 48 48"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="ic_send_voice_away.svg">
<metadata
id="metadata10">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs8" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="956"
inkscape:window-height="1156"
id="namedview6"
showgrid="false"
inkscape:zoom="4.9166667"
inkscape:cx="-7.9322034"
inkscape:cy="24"
inkscape:window-x="2880"
inkscape:window-y="20"
inkscape:window-maximized="0"
inkscape:current-layer="svg2" />
<path
d="M24 30c3.31 0 5.98-2.69 5.98-6L30 12c0-3.32-2.68-6-6-6-3.31 0-6 2.68-6 6v12c0 3.31 2.69 6 6 6zm10.6-6c0 6-5.07 10.2-10.6 10.2-5.52 0-10.6-4.2-10.6-10.2H10c0 6.83 5.44 12.47 12 13.44V44h4v-6.56c6.56-.97 12-6.61 12-13.44h-3.4z"
id="path4"
style="fill:#ff9800;fill-opacity:0.627451" />
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

54
art/ic_send_voice_dnd.svg Normal file
View file

@ -0,0 +1,54 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="48"
height="48"
viewBox="0 0 48 48"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="ic_send_voice_dnd.svg">
<metadata
id="metadata10">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs8" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="956"
inkscape:window-height="1156"
id="namedview6"
showgrid="false"
inkscape:zoom="4.9166667"
inkscape:cx="-7.9322034"
inkscape:cy="24"
inkscape:window-x="2880"
inkscape:window-y="20"
inkscape:window-maximized="0"
inkscape:current-layer="svg2" />
<path
d="M24 30c3.31 0 5.98-2.69 5.98-6L30 12c0-3.32-2.68-6-6-6-3.31 0-6 2.68-6 6v12c0 3.31 2.69 6 6 6zm10.6-6c0 6-5.07 10.2-10.6 10.2-5.52 0-10.6-4.2-10.6-10.2H10c0 6.83 5.44 12.47 12 13.44V44h4v-6.56c6.56-.97 12-6.61 12-13.44h-3.4z"
id="path4"
style="fill:#f44336;fill-opacity:0.627451" />
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View file

@ -0,0 +1,54 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="48"
height="48"
viewBox="0 0 48 48"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="ic_send_voice_offline.svg">
<metadata
id="metadata10">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs8" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="956"
inkscape:window-height="1156"
id="namedview6"
showgrid="false"
inkscape:zoom="4.9166667"
inkscape:cx="-7.9322034"
inkscape:cy="24"
inkscape:window-x="2880"
inkscape:window-y="20"
inkscape:window-maximized="0"
inkscape:current-layer="svg2" />
<path
d="M24 30c3.31 0 5.98-2.69 5.98-6L30 12c0-3.32-2.68-6-6-6-3.31 0-6 2.68-6 6v12c0 3.31 2.69 6 6 6zm10.6-6c0 6-5.07 10.2-10.6 10.2-5.52 0-10.6-4.2-10.6-10.2H10c0 6.83 5.44 12.47 12 13.44V44h4v-6.56c6.56-.97 12-6.61 12-13.44h-3.4z"
id="path4"
style="fill:#000000;fill-opacity:0.627451" />
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View file

@ -0,0 +1,54 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="48"
height="48"
viewBox="0 0 48 48"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="ic_send_voice_online.svg">
<metadata
id="metadata10">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs8" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="956"
inkscape:window-height="1156"
id="namedview6"
showgrid="false"
inkscape:zoom="4.9166667"
inkscape:cx="-7.9322034"
inkscape:cy="24"
inkscape:window-x="2880"
inkscape:window-y="20"
inkscape:window-maximized="0"
inkscape:current-layer="svg2" />
<path
d="M24 30c3.31 0 5.98-2.69 5.98-6L30 12c0-3.32-2.68-6-6-6-3.31 0-6 2.68-6 6v12c0 3.31 2.69 6 6 6zm10.6-6c0 6-5.07 10.2-10.6 10.2-5.52 0-10.6-4.2-10.6-10.2H10c0 6.83 5.44 12.47 12 13.44V44h4v-6.56c6.56-.97 12-6.61 12-13.44h-3.4z"
id="path4"
style="fill:#259b24;fill-opacity:0.627451" />
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View file

@ -10,6 +10,30 @@ images = {
'conversations_baloon.svg' => ['ic_launcher', 48],
'conversations_mono.svg' => ['ic_notification', 24],
'ic_received_indicator.svg' => ['ic_received_indicator', 12],
'ic_send_text_offline.svg' => ['ic_send_text_offline', 36],
'ic_send_text_online.svg' => ['ic_send_text_online', 36],
'ic_send_text_away.svg' => ['ic_send_text_away', 36],
'ic_send_text_dnd.svg' => ['ic_send_text_dnd', 36],
'ic_send_photo_online.svg' => ['ic_send_photo_online', 36],
'ic_send_photo_offline.svg' => ['ic_send_photo_offline', 36],
'ic_send_photo_away.svg' => ['ic_send_photo_away', 36],
'ic_send_photo_dnd.svg' => ['ic_send_photo_dnd', 36],
'ic_send_location_online.svg' => ['ic_send_location_online', 36],
'ic_send_location_offline.svg' => ['ic_send_location_offline', 36],
'ic_send_location_away.svg' => ['ic_send_location_away', 36],
'ic_send_location_dnd.svg' => ['ic_send_location_dnd', 36],
'ic_send_voice_online.svg' => ['ic_send_voice_online', 36],
'ic_send_voice_offline.svg' => ['ic_send_voice_offline', 36],
'ic_send_voice_away.svg' => ['ic_send_voice_away', 36],
'ic_send_voice_dnd.svg' => ['ic_send_voice_dnd', 36],
'ic_send_cancel_online.svg' => ['ic_send_cancel_online', 36],
'ic_send_cancel_offline.svg' => ['ic_send_cancel_offline', 36],
'ic_send_cancel_away.svg' => ['ic_send_cancel_away', 36],
'ic_send_cancel_dnd.svg' => ['ic_send_cancel_dnd', 36],
'ic_send_picture_online.svg' => ['ic_send_picture_online', 36],
'ic_send_picture_offline.svg' => ['ic_send_picture_offline', 36],
'ic_send_picture_away.svg' => ['ic_send_picture_away', 36],
'ic_send_picture_dnd.svg' => ['ic_send_picture_dnd', 36]
}
images.each do |source, result|
resolutions.each do |name, factor|

View file

@ -6,7 +6,7 @@ buildscript {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.0.1'
classpath 'com.android.tools.build:gradle:1.2.3'
}
}
@ -25,26 +25,30 @@ repositories {
}
dependencies {
compile project(':libs:openpgp-api-lib')
compile project(':libs:MemorizingTrustManager')
compile 'com.android.support:support-v13:21.0.3'
compile 'org.bouncycastle:bcprov-jdk15on:1.51'
compile 'org.jitsi:org.otr4j:0.22'
compile 'org.gnu.inet:libidn:1.15'
compile 'com.google.zxing:core:3.1.0'
compile 'com.google.zxing:android-integration:3.1.0'
compile 'de.measite.minidns:minidns:0.1.3'
compile project(':libs:openpgp-api-lib')
compile project(':libs:MemorizingTrustManager')
compile 'com.android.support:support-v13:21.0.3'
compile 'org.bouncycastle:bcprov-jdk15on:1.51'
compile 'org.jitsi:org.otr4j:0.22'
compile 'org.gnu.inet:libidn:1.15'
compile 'com.google.zxing:core:3.1.0'
compile 'com.google.zxing:android-integration:3.1.0'
compile 'de.measite.minidns:minidns:0.1.3'
compile 'de.timroes.android:EnhancedListView:0.3.4'
compile 'me.leolin:ShortcutBadger:1.1.1@aar'
compile project(':libs:emojicon')
compile project(':libs:colorpicker')
}
android {
compileSdkVersion 21
buildToolsVersion "21.1.2"
compileSdkVersion 22
buildToolsVersion "22.0.1"
defaultConfig {
minSdkVersion 14
targetSdkVersion 21
versionCode 56
versionName "1.2.0"
versionCode 64
versionName "1.5.2.1"
}
compileOptions {
@ -91,7 +95,7 @@ android {
}
lintOptions {
disable 'ExtraTranslation', 'MissingTranslation', 'InvalidPackage'
disable 'ExtraTranslation', 'MissingTranslation', 'InvalidPackage', 'MissingQuantity'
}
subprojects {

View file

@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.2.1-all.zip
distributionUrl=http\://services.gradle.org/distributions/gradle-2.2.1-all.zip

View file

@ -3,7 +3,7 @@ buildscript {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.7.+'
classpath 'com.android.tools.build:gradle:1.2.3'
}
}

Binary file not shown.

1
libs/colorpicker/.gitignore vendored Normal file
View file

@ -0,0 +1 @@
/build

View file

@ -0,0 +1,18 @@
apply plugin: 'com.android.library'
android {
compileSdkVersion 21
buildToolsVersion "21.1.2"
defaultConfig {
minSdkVersion 7
targetSdkVersion 21
versionCode 2
versionName "2.0"
}
buildTypes {
release {
minifyEnabled false
}
}
}

17
libs/colorpicker/proguard-rules.pro vendored Normal file
View file

@ -0,0 +1,17 @@
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in /Developer/android-sdk-macosx/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# Add any project specific keep options here:
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}

View file

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest package="yuku.ambilwarna" />

View file

@ -0,0 +1,298 @@
package yuku.ambilwarna;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.graphics.Color;
import android.graphics.drawable.GradientDrawable;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.widget.ImageView;
import android.widget.RelativeLayout;
public class AmbilWarnaDialog {
public interface OnAmbilWarnaListener {
void onCancel(AmbilWarnaDialog dialog);
void onOk(AmbilWarnaDialog dialog, int color);
}
final AlertDialog dialog;
private final boolean supportsAlpha;
final OnAmbilWarnaListener listener;
final View viewHue;
final AmbilWarnaSquare viewSatVal;
final ImageView viewCursor;
final ImageView viewAlphaCursor;
final View viewOldColor;
final View viewNewColor;
final View viewAlphaOverlay;
final ImageView viewTarget;
final ImageView viewAlphaCheckered;
final ViewGroup viewContainer;
final float[] currentColorHsv = new float[3];
int alpha;
/**
* Create an AmbilWarnaDialog.
*
* @param context activity context
* @param color current color
* @param listener an OnAmbilWarnaListener, allowing you to get back error or OK
*/
public AmbilWarnaDialog(final Context context, int color, OnAmbilWarnaListener listener) {
this(context, color, false, listener);
}
/**
* Create an AmbilWarnaDialog.
*
* @param context activity context
* @param color current color
* @param supportsAlpha whether alpha/transparency controls are enabled
* @param listener an OnAmbilWarnaListener, allowing you to get back error or OK
*/
public AmbilWarnaDialog(final Context context, int color, boolean supportsAlpha, OnAmbilWarnaListener listener) {
this.supportsAlpha = supportsAlpha;
this.listener = listener;
if (!supportsAlpha) { // remove alpha if not supported
color = color | 0xff000000;
}
Color.colorToHSV(color, currentColorHsv);
alpha = Color.alpha(color);
final View view = LayoutInflater.from(context).inflate(R.layout.ambilwarna_dialog, null);
viewHue = view.findViewById(R.id.ambilwarna_viewHue);
viewSatVal = (AmbilWarnaSquare) view.findViewById(R.id.ambilwarna_viewSatBri);
viewCursor = (ImageView) view.findViewById(R.id.ambilwarna_cursor);
viewOldColor = view.findViewById(R.id.ambilwarna_oldColor);
viewNewColor = view.findViewById(R.id.ambilwarna_newColor);
viewTarget = (ImageView) view.findViewById(R.id.ambilwarna_target);
viewContainer = (ViewGroup) view.findViewById(R.id.ambilwarna_viewContainer);
viewAlphaOverlay = view.findViewById(R.id.ambilwarna_overlay);
viewAlphaCursor = (ImageView) view.findViewById(R.id.ambilwarna_alphaCursor);
viewAlphaCheckered = (ImageView) view.findViewById(R.id.ambilwarna_alphaCheckered);
{ // hide/show alpha
viewAlphaOverlay.setVisibility(supportsAlpha? View.VISIBLE: View.GONE);
viewAlphaCursor.setVisibility(supportsAlpha? View.VISIBLE: View.GONE);
viewAlphaCheckered.setVisibility(supportsAlpha? View.VISIBLE: View.GONE);
}
viewSatVal.setHue(getHue());
viewOldColor.setBackgroundColor(color);
viewNewColor.setBackgroundColor(color);
viewHue.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_MOVE
|| event.getAction() == MotionEvent.ACTION_DOWN
|| event.getAction() == MotionEvent.ACTION_UP) {
float y = event.getY();
if (y < 0.f) y = 0.f;
if (y > viewHue.getMeasuredHeight()) {
y = viewHue.getMeasuredHeight() - 0.001f; // to avoid jumping the cursor from bottom to top.
}
float hue = 360.f - 360.f / viewHue.getMeasuredHeight() * y;
if (hue == 360.f) hue = 0.f;
setHue(hue);
// update view
viewSatVal.setHue(getHue());
moveCursor();
viewNewColor.setBackgroundColor(getColor());
updateAlphaView();
return true;
}
return false;
}
});
if (supportsAlpha) viewAlphaCheckered.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if ((event.getAction() == MotionEvent.ACTION_MOVE)
|| (event.getAction() == MotionEvent.ACTION_DOWN)
|| (event.getAction() == MotionEvent.ACTION_UP)) {
float y = event.getY();
if (y < 0.f) {
y = 0.f;
}
if (y > viewAlphaCheckered.getMeasuredHeight()) {
y = viewAlphaCheckered.getMeasuredHeight() - 0.001f; // to avoid jumping the cursor from bottom to top.
}
final int a = Math.round(255.f - ((255.f / viewAlphaCheckered.getMeasuredHeight()) * y));
AmbilWarnaDialog.this.setAlpha(a);
// update view
moveAlphaCursor();
int col = AmbilWarnaDialog.this.getColor();
int c = a << 24 | col & 0x00ffffff;
viewNewColor.setBackgroundColor(c);
return true;
}
return false;
}
});
viewSatVal.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_MOVE
|| event.getAction() == MotionEvent.ACTION_DOWN
|| event.getAction() == MotionEvent.ACTION_UP) {
float x = event.getX(); // touch event are in dp units.
float y = event.getY();
if (x < 0.f) x = 0.f;
if (x > viewSatVal.getMeasuredWidth()) x = viewSatVal.getMeasuredWidth();
if (y < 0.f) y = 0.f;
if (y > viewSatVal.getMeasuredHeight()) y = viewSatVal.getMeasuredHeight();
setSat(1.f / viewSatVal.getMeasuredWidth() * x);
setVal(1.f - (1.f / viewSatVal.getMeasuredHeight() * y));
// update view
moveTarget();
viewNewColor.setBackgroundColor(getColor());
return true;
}
return false;
}
});
dialog = new AlertDialog.Builder(context)
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (AmbilWarnaDialog.this.listener != null) {
AmbilWarnaDialog.this.listener.onOk(AmbilWarnaDialog.this, getColor());
}
}
})
.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (AmbilWarnaDialog.this.listener != null) {
AmbilWarnaDialog.this.listener.onCancel(AmbilWarnaDialog.this);
}
}
})
.setOnCancelListener(new OnCancelListener() {
// if back button is used, call back our listener.
@Override
public void onCancel(DialogInterface paramDialogInterface) {
if (AmbilWarnaDialog.this.listener != null) {
AmbilWarnaDialog.this.listener.onCancel(AmbilWarnaDialog.this);
}
}
})
.create();
// kill all padding from the dialog window
dialog.setView(view, 0, 0, 0, 0);
// move cursor & target on first draw
ViewTreeObserver vto = view.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
moveCursor();
if (AmbilWarnaDialog.this.supportsAlpha) moveAlphaCursor();
moveTarget();
if (AmbilWarnaDialog.this.supportsAlpha) updateAlphaView();
view.getViewTreeObserver().removeGlobalOnLayoutListener(this);
}
});
}
protected void moveCursor() {
float y = viewHue.getMeasuredHeight() - (getHue() * viewHue.getMeasuredHeight() / 360.f);
if (y == viewHue.getMeasuredHeight()) y = 0.f;
RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) viewCursor.getLayoutParams();
layoutParams.leftMargin = (int) (viewHue.getLeft() - Math.floor(viewCursor.getMeasuredWidth() / 2) - viewContainer.getPaddingLeft());
layoutParams.topMargin = (int) (viewHue.getTop() + y - Math.floor(viewCursor.getMeasuredHeight() / 2) - viewContainer.getPaddingTop());
viewCursor.setLayoutParams(layoutParams);
}
protected void moveTarget() {
float x = getSat() * viewSatVal.getMeasuredWidth();
float y = (1.f - getVal()) * viewSatVal.getMeasuredHeight();
RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) viewTarget.getLayoutParams();
layoutParams.leftMargin = (int) (viewSatVal.getLeft() + x - Math.floor(viewTarget.getMeasuredWidth() / 2) - viewContainer.getPaddingLeft());
layoutParams.topMargin = (int) (viewSatVal.getTop() + y - Math.floor(viewTarget.getMeasuredHeight() / 2) - viewContainer.getPaddingTop());
viewTarget.setLayoutParams(layoutParams);
}
protected void moveAlphaCursor() {
final int measuredHeight = this.viewAlphaCheckered.getMeasuredHeight();
float y = measuredHeight - ((this.getAlpha() * measuredHeight) / 255.f);
final RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) this.viewAlphaCursor.getLayoutParams();
layoutParams.leftMargin = (int) (this.viewAlphaCheckered.getLeft() - Math.floor(this.viewAlphaCursor.getMeasuredWidth() / 2) - this.viewContainer.getPaddingLeft());
layoutParams.topMargin = (int) ((this.viewAlphaCheckered.getTop() + y) - Math.floor(this.viewAlphaCursor.getMeasuredHeight() / 2) - this.viewContainer.getPaddingTop());
this.viewAlphaCursor.setLayoutParams(layoutParams);
}
private int getColor() {
final int argb = Color.HSVToColor(currentColorHsv);
return alpha << 24 | (argb & 0x00ffffff);
}
private float getHue() {
return currentColorHsv[0];
}
private float getAlpha() {
return this.alpha;
}
private float getSat() {
return currentColorHsv[1];
}
private float getVal() {
return currentColorHsv[2];
}
private void setHue(float hue) {
currentColorHsv[0] = hue;
}
private void setSat(float sat) {
currentColorHsv[1] = sat;
}
private void setAlpha(int alpha) {
this.alpha = alpha;
}
private void setVal(float val) {
currentColorHsv[2] = val;
}
public void show() {
dialog.show();
}
public AlertDialog getDialog() {
return dialog;
}
private void updateAlphaView() {
final GradientDrawable gd = new GradientDrawable(GradientDrawable.Orientation.TOP_BOTTOM, new int[] {
Color.HSVToColor(currentColorHsv), 0x0
});
viewAlphaOverlay.setBackgroundDrawable(gd);
}
}

View file

@ -0,0 +1,46 @@
package yuku.ambilwarna;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.ComposeShader;
import android.graphics.LinearGradient;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.Shader;
import android.graphics.Shader.TileMode;
import android.util.AttributeSet;
import android.view.View;
public class AmbilWarnaSquare extends View {
Paint paint;
Shader luar;
final float[] color = { 1.f, 1.f, 1.f };
public AmbilWarnaSquare(Context context, AttributeSet attrs) {
super(context, attrs);
}
public AmbilWarnaSquare(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@SuppressLint("DrawAllocation") @Override protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (paint == null) {
paint = new Paint();
luar = new LinearGradient(0.f, 0.f, 0.f, this.getMeasuredHeight(), 0xffffffff, 0xff000000, TileMode.CLAMP);
}
int rgb = Color.HSVToColor(color);
Shader dalam = new LinearGradient(0.f, 0.f, this.getMeasuredWidth(), 0.f, 0xffffffff, rgb, TileMode.CLAMP);
ComposeShader shader = new ComposeShader(luar, dalam, PorterDuff.Mode.MULTIPLY);
paint.setShader(shader);
canvas.drawRect(0.f, 0.f, this.getMeasuredWidth(), this.getMeasuredHeight(), paint);
}
void setHue(float hue) {
color[0] = hue;
invalidate();
}
}

View file

@ -0,0 +1,34 @@
package yuku.ambilwarna.widget;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.util.AttributeSet;
import android.util.FloatMath;
import android.view.View;
public class AmbilWarnaPrefWidgetView extends View {
Paint paint;
float rectSize;
float strokeWidth;
public AmbilWarnaPrefWidgetView(Context context, AttributeSet attrs) {
super(context, attrs);
float density = context.getResources().getDisplayMetrics().density;
rectSize = FloatMath.floor(24.f * density + 0.5f);
strokeWidth = FloatMath.floor(1.f * density + 0.5f);
paint = new Paint();
paint.setColor(0xffffffff);
paint.setStyle(Style.STROKE);
paint.setStrokeWidth(strokeWidth);
}
@Override protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawRect(strokeWidth, strokeWidth, rectSize - strokeWidth, rectSize - strokeWidth, paint);
}
}

View file

@ -0,0 +1,134 @@
package yuku.ambilwarna.widget;
import android.content.Context;
import android.content.res.TypedArray;
import android.os.Parcel;
import android.os.Parcelable;
import android.preference.Preference;
import android.util.AttributeSet;
import android.view.View;
import yuku.ambilwarna.AmbilWarnaDialog;
import yuku.ambilwarna.R;
public class AmbilWarnaPreference extends Preference {
private final boolean supportsAlpha;
int value;
public AmbilWarnaPreference(Context context, AttributeSet attrs) {
super(context, attrs);
final TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.AmbilWarnaPreference);
supportsAlpha = ta.getBoolean(R.styleable.AmbilWarnaPreference_supportsAlpha, false);
setWidgetLayoutResource(R.layout.ambilwarna_pref_widget);
}
@Override protected void onBindView(View view) {
super.onBindView(view);
// Set our custom views inside the layout
final View box = view.findViewById(R.id.ambilwarna_pref_widget_box);
if (box != null) {
box.setBackgroundColor(value);
}
}
@Override protected void onClick() {
new AmbilWarnaDialog(getContext(), value, supportsAlpha, new AmbilWarnaDialog.OnAmbilWarnaListener() {
@Override public void onOk(AmbilWarnaDialog dialog, int color) {
if (!callChangeListener(color)) return; // They don't want the value to be set
value = color;
persistInt(value);
notifyChanged();
}
@Override public void onCancel(AmbilWarnaDialog dialog) {
// nothing to do
}
}).show();
}
public void forceSetValue(int value) {
this.value = value;
persistInt(value);
notifyChanged();
}
@Override protected Object onGetDefaultValue(TypedArray a, int index) {
// This preference type's value type is Integer, so we read the default value from the attributes as an Integer.
return a.getInteger(index, 0);
}
@Override protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
if (restoreValue) { // Restore state
value = getPersistedInt(value);
} else { // Set state
int value = (Integer) defaultValue;
this.value = value;
persistInt(value);
}
}
/*
* Suppose a client uses this preference type without persisting. We
* must save the instance state so it is able to, for example, survive
* orientation changes.
*/
@Override protected Parcelable onSaveInstanceState() {
final Parcelable superState = super.onSaveInstanceState();
if (isPersistent()) return superState; // No need to save instance state since it's persistent
final SavedState myState = new SavedState(superState);
myState.value = value;
return myState;
}
@Override protected void onRestoreInstanceState(Parcelable state) {
if (!state.getClass().equals(SavedState.class)) {
// Didn't save state for us in onSaveInstanceState
super.onRestoreInstanceState(state);
return;
}
// Restore the instance state
SavedState myState = (SavedState) state;
super.onRestoreInstanceState(myState.getSuperState());
this.value = myState.value;
notifyChanged();
}
/**
* SavedState, a subclass of {@link android.preference.Preference.BaseSavedState}, will store the state
* of MyPreference, a subclass of Preference.
* <p>
* It is important to always call through to super methods.
*/
private static class SavedState extends BaseSavedState {
int value;
public SavedState(Parcel source) {
super(source);
value = source.readInt();
}
@Override public void writeToParcel(Parcel dest, int flags) {
super.writeToParcel(dest, flags);
dest.writeInt(value);
}
public SavedState(Parcelable superState) {
super(superState);
}
@SuppressWarnings("unused") public static final Creator<SavedState> CREATOR = new Creator<SavedState>() {
public SavedState createFromParcel(Parcel in) {
return new SavedState(in);
}
public SavedState[] newArray(int size) {
return new SavedState[size];
}
};
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 666 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 983 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 748 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 751 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 480 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 607 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 135 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 889 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 814 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 579 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 455 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 816 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 782 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/ambilwarna_alphacheckered"
android:tileMode="repeat" >
</bitmap>

View file

@ -0,0 +1,127 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/ambilwarna_viewContainer"
android:paddingTop="@dimen/ambilwarna_spacer"
android:paddingRight="@dimen/ambilwarna_spacer"
android:paddingBottom="0dp"
android:paddingLeft="@dimen/ambilwarna_spacer"
android:clipToPadding="false"
android:layout_gravity="center"
>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/ambilwarna_state"
android:orientation="vertical"
android:paddingRight="@dimen/ambilwarna_spacer"
android:gravity="center"
android:layout_centerVertical="true"
>
<FrameLayout
android:layout_width="60dp"
android:layout_height="30dp">
<View
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/ambilwarna_alphacheckered_tiled" />
<View
android:id="@+id/ambilwarna_oldColor"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#faa" />
</FrameLayout>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ambilwarna_arrow_down"
android:paddingTop="@dimen/ambilwarna_spacer"
android:paddingBottom="@dimen/ambilwarna_spacer"
/>
<FrameLayout
android:layout_width="60dp"
android:layout_height="30dp">
<View
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/ambilwarna_alphacheckered_tiled" />
<View
android:id="@+id/ambilwarna_newColor"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#aaf" />
</FrameLayout>
</LinearLayout>
<yuku.ambilwarna.AmbilWarnaSquare
android:id="@+id/ambilwarna_viewSatBri"
android:layout_width="@dimen/ambilwarna_hsvWidth"
android:layout_height="@dimen/ambilwarna_hsvHeight"
android:layout_toRightOf="@id/ambilwarna_state"
android:layerType="software"
/>
<!-- needed because i can't get parent keeping its bottom layout
and its wrap_content height. This view will serve as a bottom spacer. -->
<View
android:layout_width="@dimen/ambilwarna_spacer"
android:layout_height="@dimen/ambilwarna_spacer"
android:layout_below="@id/ambilwarna_viewSatBri"
/>
<ImageView
android:id="@+id/ambilwarna_viewHue"
android:layout_width="@dimen/ambilwarna_hueWidth"
android:layout_height="@dimen/ambilwarna_hsvHeight"
android:layout_toRightOf="@id/ambilwarna_viewSatBri"
android:layout_marginLeft="@dimen/ambilwarna_spacer"
android:src="@drawable/ambilwarna_hue"
android:scaleType="fitXY"
/>
<ImageView
android:id="@+id/ambilwarna_alphaCheckered"
android:layout_width="@dimen/ambilwarna_hueWidth"
android:layout_height="@dimen/ambilwarna_hsvHeight"
android:layout_marginLeft="@dimen/ambilwarna_spacer"
android:layout_toRightOf="@id/ambilwarna_viewHue"
android:scaleType="fitXY"
android:src="@drawable/ambilwarna_alphacheckered_tiled" />
<View
android:id="@+id/ambilwarna_overlay"
android:layout_width="@dimen/ambilwarna_hueWidth"
android:layout_height="@dimen/ambilwarna_hsvHeight"
android:layout_marginLeft="@dimen/ambilwarna_spacer"
android:layout_toRightOf="@id/ambilwarna_viewHue" />
<ImageView
android:id="@+id/ambilwarna_cursor"
android:layout_width="9dp"
android:layout_height="9dp"
android:src="@drawable/ambilwarna_cursor"
android:scaleType="matrix"
/>
<ImageView
android:id="@+id/ambilwarna_alphaCursor"
android:layout_width="9dp"
android:layout_height="9dp"
android:scaleType="matrix"
android:src="@drawable/ambilwarna_cursor" />
<ImageView
android:id="@+id/ambilwarna_target"
android:layout_width="15dp"
android:layout_height="15dp"
android:src="@drawable/ambilwarna_target"
android:scaleType="matrix"
/>
</RelativeLayout>

View file

@ -0,0 +1,122 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/ambilwarna_dialogView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center" >
<RelativeLayout
android:id="@+id/ambilwarna_viewContainer"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:clipToPadding="false"
android:paddingBottom="@dimen/ambilwarna_spacer"
android:paddingLeft="@dimen/ambilwarna_spacer"
android:paddingRight="@dimen/ambilwarna_spacer"
android:paddingTop="@dimen/ambilwarna_spacer" >
<yuku.ambilwarna.AmbilWarnaSquare
android:id="@+id/ambilwarna_viewSatBri"
android:layout_width="@dimen/ambilwarna_hsvWidth"
android:layout_height="@dimen/ambilwarna_hsvHeight"
android:layerType="software" />
<ImageView
android:id="@+id/ambilwarna_viewHue"
android:layout_width="@dimen/ambilwarna_hueWidth"
android:layout_height="@dimen/ambilwarna_hsvHeight"
android:layout_marginLeft="@dimen/ambilwarna_spacer"
android:layout_toRightOf="@id/ambilwarna_viewSatBri"
android:scaleType="fitXY"
android:src="@drawable/ambilwarna_hue" />
<ImageView
android:id="@+id/ambilwarna_alphaCheckered"
android:layout_width="@dimen/ambilwarna_hueWidth"
android:layout_height="@dimen/ambilwarna_hsvHeight"
android:layout_marginLeft="@dimen/ambilwarna_spacer"
android:layout_toRightOf="@id/ambilwarna_viewHue"
android:scaleType="fitXY"
android:src="@drawable/ambilwarna_alphacheckered_tiled" />
<View
android:id="@+id/ambilwarna_overlay"
android:layout_width="@dimen/ambilwarna_hueWidth"
android:layout_height="@dimen/ambilwarna_hsvHeight"
android:layout_marginLeft="@dimen/ambilwarna_spacer"
android:layout_toRightOf="@id/ambilwarna_viewHue" />
<ImageView
android:id="@+id/ambilwarna_cursor"
android:layout_width="9dp"
android:layout_height="9dp"
android:scaleType="matrix"
android:src="@drawable/ambilwarna_cursor" />
<ImageView
android:id="@+id/ambilwarna_alphaCursor"
android:layout_width="9dp"
android:layout_height="9dp"
android:scaleType="matrix"
android:src="@drawable/ambilwarna_cursor" />
<ImageView
android:id="@+id/ambilwarna_target"
android:layout_width="15dp"
android:layout_height="15dp"
android:scaleType="matrix"
android:src="@drawable/ambilwarna_target" />
<LinearLayout
android:id="@+id/ambilwarna_state"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/ambilwarna_viewSatBri"
android:layout_centerHorizontal="true"
android:layout_marginTop="@dimen/ambilwarna_spacer"
android:gravity="center"
android:orientation="horizontal" >
<FrameLayout
android:layout_width="60dp"
android:layout_height="30dp" >
<View
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/ambilwarna_alphacheckered_tiled" />
<View
android:id="@+id/ambilwarna_oldColor"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#faa" />
</FrameLayout>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="@dimen/ambilwarna_spacer"
android:paddingRight="@dimen/ambilwarna_spacer"
android:src="@drawable/ambilwarna_arrow_right" />
<FrameLayout
android:layout_width="60dp"
android:layout_height="30dp" >
<View
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/ambilwarna_alphacheckered_tiled" />
<View
android:id="@+id/ambilwarna_newColor"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#aaf" />
</FrameLayout>
</LinearLayout>
</RelativeLayout>
</FrameLayout>

View file

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_gravity="center_vertical"
android:layout_marginRight="6dp"
android:focusable="false"
android:clickable="false">
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="fitXY"
android:src="@drawable/ambilwarna_alphacheckered_tiled"/>
<yuku.ambilwarna.widget.AmbilWarnaPrefWidgetView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/ambilwarna_pref_widget_box"
/>
</FrameLayout>

View file

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="ambilwarna_hsvWidth">240dp</dimen>
<dimen name="ambilwarna_hsvHeight">120dp</dimen>
</resources>

View file

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="ambilwarna_hsvWidth">240dp</dimen>
<dimen name="ambilwarna_hsvHeight">240dp</dimen>
</resources>

View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="AmbilWarnaPreference">
<attr name="supportsAlpha"
format="boolean"/>
</declare-styleable>
</resources>

View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="ambilwarna_hsvHeight">240dp</dimen>
<dimen name="ambilwarna_hsvWidth">240dp</dimen>
<dimen name="ambilwarna_hueWidth">30dp</dimen>
<dimen name="ambilwarna_spacer">8dp</dimen>
</resources>

View file

@ -0,0 +1,27 @@
apply plugin: 'com.android.library'
android {
compileSdkVersion 13
buildToolsVersion "21.1.2"
defaultConfig {
minSdkVersion 14
targetSdkVersion 21
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_7
targetCompatibility JavaVersion.VERSION_1_7
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
}
dependencies {
compile 'com.android.support:support-v4:21.0.3'
}

3
libs/emojicon/lint.xml Normal file
View file

@ -0,0 +1,3 @@
<?xml version="1.0" encoding="utf-8"?>
<lint>
</lint>

View file

@ -0,0 +1,12 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="github.ankushsachdeva.emojicon">
<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="19"/>
<application android:allowBackup="true"
android:label="@string/app_name"
android:icon="@drawable/ic_launcher">
</application>
</manifest>

View file

@ -0,0 +1,101 @@
/*
* Copyright 2014 Ankush Sachdeva
*
* 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 github.ankushsachdeva.emojicon;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
/**
* @author Ankush Sachdeva (sankush@yahoo.co.in)
*/
class EmojiAdapter extends BaseAdapter {
private final List<Emojicon> mEmojicons = new ArrayList<>();
private OnEmojiClickedListener mClickListener;
private final Context mContext;
public EmojiAdapter(Context context) {
this.mContext = context;
}
public void setEmojiconList(List<Emojicon> emojiconList) {
mEmojicons.clear();
mEmojicons.addAll(emojiconList);
notifyDataSetChanged();
}
public void setClickListener(OnEmojiClickedListener clickListener) {
mClickListener = clickListener;
}
@Override
public int getCount() {
return mEmojicons.size();
}
@Override
public Emojicon getItem(int position) {
return mEmojicons.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
v = LayoutInflater.from(mContext).inflate(R.layout.emojicon_item, null);
v.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mClickListener != null) {
mClickListener.onEmojiClicked(((ViewHolder) v.getTag()).mEmoji);
}
}
});
ViewHolder holder = new ViewHolder();
holder.mEmojiContainer = (TextView) v.findViewById(R.id.emojiContainer);
holder.mEmojiId = (TextView) v.findViewById(R.id.emojiId);
v.setTag(holder);
}
Emojicon emoji = getItem(position);
ViewHolder holder = (ViewHolder) v.getTag();
holder.mEmoji = emoji;
holder.mEmojiId.setText(emoji.getId());
holder.mEmojiContainer.setText(emoji.toString());
return v;
}
private class ViewHolder {
TextView mEmojiContainer;
TextView mEmojiId;
Emojicon mEmoji;
}
public interface OnEmojiClickedListener {
void onEmojiClicked(Emojicon emojicon);
}
}

View file

@ -0,0 +1,21 @@
package github.ankushsachdeva.emojicon;
import android.content.Context;
/**
* Created by aleksandr.naumov on 14.05.2015.
*/
class EmojiRecentAdapter extends EmojiAdapter implements Updatable {
private final EmojiconRecentsManager mRecentsManager;
public EmojiRecentAdapter(Context context, EmojiconRecentsManager mRecentsManager) {
super(context);
this.mRecentsManager = mRecentsManager;
update();
}
@Override
public void update() {
setEmojiconList(mRecentsManager.getEmojiList());
}
}

View file

@ -0,0 +1,53 @@
package github.ankushsachdeva.emojicon;
import java.nio.charset.Charset;
/**
* Created by aleksandr.naumov on 13.05.2015.
*/
public class Emojicon {
private final String mStringRepresentation;
public Emojicon(String stringRepresentation) {
byte bytes[] = new byte[stringRepresentation.length() / 2];
for (int i = 0; i < stringRepresentation.length(); i += 2) {
try {
bytes[i / 2] = (byte) Integer.parseInt(stringRepresentation.substring(i, i + 2), 16);
} catch (NumberFormatException ex) {
throw new RuntimeException(String.format("Cannot parse '%s' as emojicon code", stringRepresentation), ex);
}
}
this.mStringRepresentation = new String(bytes, Charset.forName("Utf-8"));
}
@Override
public String toString() {
return mStringRepresentation;
}
public String getId() {
String id = "";
for (byte b : mStringRepresentation.getBytes()) {
id += String.format("%x", b);
}
return id;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
Emojicon emojicon = (Emojicon) o;
return mStringRepresentation.equals(emojicon.mStringRepresentation);
}
@Override
public int hashCode() {
return mStringRepresentation.hashCode();
}
}

View file

@ -0,0 +1,67 @@
/*
* Copyright 2014 Ankush Sachdeva
*
* 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 github.ankushsachdeva.emojicon;
import github.ankushsachdeva.emojicon.R;
import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.widget.EditText;
/**
* @author Hieu Rocker (rockerhieu@gmail.com).
*/
public class EmojiconEditText extends EditText {
private int mEmojiconSize;
public EmojiconEditText(Context context) {
super(context);
mEmojiconSize = (int) getTextSize();
}
public EmojiconEditText(Context context, AttributeSet attrs) {
super(context, attrs);
init(attrs);
}
public EmojiconEditText(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(attrs);
}
private void init(AttributeSet attrs) {
TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.Emojicon);
mEmojiconSize = (int) a.getDimension(R.styleable.Emojicon_emojiconSize, getTextSize());
a.recycle();
setText(getText());
}
@Override
protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) {
super.onTextChanged(text,start,lengthBefore,lengthAfter);
EmojiconHandler.addEmojis(getContext(), getText(), mEmojiconSize);
}
/**
* Set the size of emojicon in pixels.
*/
public void setEmojiconSize(int pixels) {
mEmojiconSize = pixels;
}
}

View file

@ -0,0 +1,78 @@
/*
* Copyright 2014 Ankush Sachdeva
*
* 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 github.ankushsachdeva.emojicon;
import github.ankushsachdeva.emojicon.emoji.Emojicon;
import github.ankushsachdeva.emojicon.emoji.People;
import java.util.Arrays;
import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.GridView;
import github.ankushsachdeva.emojicon.R;
/**
* @author Hieu Rocker (rockerhieu@gmail.com)
* @author Ankush Sachdeva (sankush@yahoo.co.in)
*/
public class EmojiconGridView{
public View rootView;
EmojiconsPopup mEmojiconPopup;
EmojiconRecents mRecents;
Emojicon[] mData;
public EmojiconGridView(Context context, Emojicon[] emojicons, EmojiconRecents recents, EmojiconsPopup emojiconPopup) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
mEmojiconPopup = emojiconPopup;
rootView = inflater.inflate(R.layout.emojicon_grid, null);
setRecents(recents);
GridView gridView = (GridView) rootView.findViewById(R.id.Emoji_GridView);
if (emojicons== null) {
mData = People.DATA;
} else {
Object[] o = (Object[]) emojicons;
mData = Arrays.asList(o).toArray(new Emojicon[o.length]);
}
EmojiAdapter mAdapter = new EmojiAdapter(rootView.getContext(), mData);
mAdapter.setEmojiClickListener(new OnEmojiconClickedListener() {
@Override
public void onEmojiconClicked(Emojicon emojicon) {
if (mEmojiconPopup.onEmojiconClickedListener != null) {
mEmojiconPopup.onEmojiconClickedListener.onEmojiconClicked(emojicon);
}
if (mRecents != null) {
mRecents.addRecentEmoji(rootView.getContext(), emojicon);
}
}
});
gridView.setAdapter(mAdapter);
}
private void setRecents(EmojiconRecents recents) {
mRecents = recents;
}
public interface OnEmojiconClickedListener {
void onEmojiconClicked(Emojicon emojicon);
}
}

View file

@ -0,0 +1,39 @@
package github.ankushsachdeva.emojicon;
import android.content.Context;
import java.util.ArrayList;
import java.util.List;
/**
* Created by aleksandr.naumov on 14.05.2015.
*/
abstract class EmojiconGroup {
protected final int mIconResId;
public EmojiconGroup(int iconResId) {
mIconResId = iconResId;
}
public static EmojiconGroup fromString(String allEmojicons, int mIconResId) {
return new StaticEmojiconGroup(extractEmojicons(allEmojicons), mIconResId);
}
private static List<Emojicon> extractEmojicons(String emojiconsString) {
List<Emojicon> emojicons = new ArrayList<>();
for (String emojiconString : emojiconsString.split(" ")) {
if(!emojiconString.isEmpty()) {
emojicons.add(new Emojicon(emojiconString));
}
}
return emojicons;
}
public abstract List<Emojicon> getEmojicons();
public abstract EmojiAdapter createAdapter(Context context);
public int getIconResId() {
return mIconResId;
}
}

View file

@ -0,0 +1,92 @@
package github.ankushsachdeva.emojicon;
import android.content.Context;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
/**
* Created by aleksandr.naumov on 14.05.2015.
*/
class EmojiconGroupsLoader {
private static EmojiconGroupsLoader sInstance;
private final List<EmojiconGroup> mGroups;
public static synchronized EmojiconGroupsLoader getInstance(Context context) {
if (sInstance == null) {
sInstance = new EmojiconGroupsLoader(context);
}
return sInstance;
}
private EmojiconGroupsLoader(Context context) {
try {
mGroups = parseEmojiXml(context);
} catch (IOException | XmlPullParserException ex) {
throw new RuntimeException(ex);
}
}
private List<EmojiconGroup> parseEmojiXml(Context context) throws IOException, XmlPullParserException {
ArrayList<EmojiconGroup> groups = new ArrayList<>();
XmlPullParser parser = context.getResources().getXml(R.xml.emoji);
parser.next();
String groupName = null;
for (int eventType = parser.getEventType(); eventType != XmlPullParser.END_DOCUMENT; eventType = parser.next()) {
switch (eventType) {
case XmlPullParser.START_TAG:
if ("group".equals(parser.getName())) {
groupName = parser.getAttributeValue(0);
}
break;
case XmlPullParser.TEXT:
if (groupName != null) {
groups.add(EmojiconGroup.fromString(
parser.getText(),
getGroupNameIcon(groupName)
));
groupName = null;
}
break;
}
}
return groups;
}
private int getGroupNameIcon(String groupName) {
for (KnownGroupNames knownGroupName : KnownGroupNames.values()) {
if (groupName.toLowerCase().equals(knownGroupName.name().toLowerCase())) {
return knownGroupName.getIconResId();
}
}
throw new IllegalArgumentException(String.format("Unknown group name '%s'", groupName));
}
public List<EmojiconGroup> getGroups() {
return mGroups;
}
public enum KnownGroupNames {
RECENT(R.drawable.ic_emoji_recent_light),
SMILES(R.drawable.ic_emoji_people_light),
NATURE(R.drawable.ic_emoji_nature_light),
OBJECTS(R.drawable.ic_emoji_objects_light),
TECH(R.drawable.ic_emoji_places_light),
SYMBOLS(R.drawable.ic_emoji_symbols_light);
private final int iconResId;
KnownGroupNames(int iconResId) {
this.iconResId = iconResId;
}
public int getIconResId() {
return iconResId;
}
}
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,196 @@
package github.ankushsachdeva.emojicon;
import android.content.Context;
import android.content.res.TypedArray;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.ContextThemeWrapper;
import android.view.KeyEvent;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.PopupWindow;
/**
* Created by aleksandr.naumov on 15.05.2015.
*/
public class EmojiconPopupDelegate {
public static final String KEY_EMOJI_POPUP_SHOWN = "key_emoji_popup_shown";
private Context mContext;
private EmojiconsPopup mPopup;
private EditText mPrefferredEditText;
private boolean mPendingShow;
private View mRootView;
@Nullable
private PopupShownListener mListener;
public void setShowHideListener(PopupShownListener listener) {
this.mListener = listener;
}
public void setInputEditText(EditText editText) {
mPrefferredEditText = editText;
}
public void attach(View rootView) {
mContext = createThemedContext(rootView.getContext());
mRootView = rootView;
mPopup = new EmojiconsPopup(rootView, mContext);
mPopup.setOnDismissListener(new DismissListener());
mPopup.setOnSoftKeyboardOpenCloseListener(new KeyboardOpenCloseListener());
mPopup.setOnEmojiconClickedListener(new EmojiconClickedListener());
mPopup.setOnEmojiconBackspaceClickedListener(new BackspaceClickedListener());
mPopup.attachGlobalLayoutListener();
if (mPendingShow) {
show();
}
}
private Context createThemedContext(Context context) {
TypedArray typedArray = context.obtainStyledAttributes(null, new int[]{R.attr.emojicon_theme});
int themeId = typedArray.getResourceId(0, R.style.Emojicon);
typedArray.recycle();
return new ContextThemeWrapper(context, themeId);
}
public void detach() {
hide();
if (mPopup != null) {
mPopup.detachGlobalLayoutListener();
mPopup = null;
}
mContext = null;
mPrefferredEditText = null;
mRootView = null;
}
public void saveState(Bundle bundle) {
bundle.putBoolean(KEY_EMOJI_POPUP_SHOWN, isShown());
}
public void restoreState(Bundle bundle) {
if (bundle.containsKey(KEY_EMOJI_POPUP_SHOWN)) {
if (bundle.getBoolean(KEY_EMOJI_POPUP_SHOWN)) {
show();
} else {
hide();
}
}
}
public void show() {
if (mPopup != null && !mPopup.isShowing()) {
if (mPopup.isKeyBoardOpen()) {
//If keyboard is visible, simply show the emoji popup
mPopup.showAtBottom();
} else {
//else, open the text keyboard first and immediately after that show the emoji popup
mPrefferredEditText.setFocusableInTouchMode(true);
mPrefferredEditText.requestFocus();
mPopup.showAtBottomPending();
final InputMethodManager inputMethodManager = (InputMethodManager) mContext.getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.showSoftInput(mPrefferredEditText, InputMethodManager.SHOW_IMPLICIT);
}
mPendingShow = false;
notifyShown();
} else if (!mPendingShow) {
mPendingShow = true;
notifyShown();
}
}
public void hide() {
if (mPopup != null && mPopup.isShowing()) {
mPopup.dismiss();
notifyHidden();
} else if (mPendingShow) {
mPendingShow = false;
notifyHidden();
}
}
private void notifyShown() {
if (mListener != null) {
mListener.onPopupShown();
}
}
private void notifyHidden() {
if (mListener != null) {
mListener.onPopupHidden();
}
}
public boolean isShown() {
return mPopup != null ? mPopup.isShowing() : mPendingShow;
}
public void toggle() {
if (isShown()) {
hide();
} else {
show();
}
}
@Nullable
public EditText findFocusedEditText() {
View view = mRootView != null ? mRootView.findFocus() : null;
if (view instanceof EditText) {
return (EditText) view;
} else {
return null;
}
}
public interface PopupShownListener {
void onPopupShown();
void onPopupHidden();
}
private class BackspaceClickedListener implements EmojiconsPopup.OnEmojiconBackspaceClickedListener {
@Override
public void onEmojiconBackspaceClicked(View v) {
EditText currentFocus = findFocusedEditText();
if (currentFocus != null) {
KeyEvent event = new KeyEvent(0, 0, 0, KeyEvent.KEYCODE_DEL, 0, 0, 0, 0, KeyEvent.KEYCODE_ENDCALL);
currentFocus.dispatchKeyEvent(event);
}
}
}
private class EmojiconClickedListener implements EmojiconsPopup.OnEmojiconClickedListener {
@Override
public void onEmojiconClicked(Emojicon emojicon) {
EditText currentFocus = findFocusedEditText();
if (currentFocus != null) {
String textToInsert = emojicon.toString();
int start = Math.max(currentFocus.getSelectionStart(), 0);
int end = Math.max(currentFocus.getSelectionEnd(), 0);
currentFocus.getText().replace(Math.min(start, end), Math.max(start, end), textToInsert, 0, textToInsert.length());
}
}
}
private class KeyboardOpenCloseListener implements EmojiconsPopup.OnSoftKeyboardOpenCloseListener {
@Override
public void onKeyboardOpen(int keyBoardHeight) {
}
@Override
public void onKeyboardClose() {
hide();
}
}
private class DismissListener implements PopupWindow.OnDismissListener {
@Override
public void onDismiss() {
notifyHidden();
}
}
}

View file

@ -0,0 +1,28 @@
/*
* Copyright 2014 Ankush Sachdeva
*
* 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 github.ankushsachdeva.emojicon;
import github.ankushsachdeva.emojicon.emoji.Emojicon;
import android.content.Context;
/**
* @author Daniele Ricci
*/
public interface EmojiconRecents {
public void addRecentEmoji(Context context, Emojicon emojicon);
}

View file

@ -0,0 +1,62 @@
/*
* Copyright 2014 Ankush Sachdeva
*
* 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 github.ankushsachdeva.emojicon;
import github.ankushsachdeva.emojicon.emoji.Emojicon;
import android.content.Context;
import android.widget.GridView;
import github.ankushsachdeva.emojicon.R;
/**
* @author Daniele Ricci
* @author Ankush Sachdeva (sankush@yahoo.co.in)
*/
public class EmojiconRecentsGridView extends EmojiconGridView implements EmojiconRecents {
EmojiAdapter mAdapter;
public EmojiconRecentsGridView(Context context, Emojicon[] emojicons,
EmojiconRecents recents,EmojiconsPopup emojiconsPopup) {
super(context, emojicons, recents, emojiconsPopup);
EmojiconRecentsManager recents1 = EmojiconRecentsManager
.getInstance(rootView.getContext());
mAdapter = new EmojiAdapter(rootView.getContext(), recents1);
mAdapter.setEmojiClickListener(new OnEmojiconClickedListener() {
@Override
public void onEmojiconClicked(Emojicon emojicon) {
if (mEmojiconPopup.onEmojiconClickedListener != null) {
mEmojiconPopup.onEmojiconClickedListener.onEmojiconClicked(emojicon);
}
}
});
GridView gridView = (GridView) rootView.findViewById(R.id.Emoji_GridView);
gridView.setAdapter(mAdapter);
}
@Override
public void addRecentEmoji(Context context, Emojicon emojicon) {
EmojiconRecentsManager recents = EmojiconRecentsManager
.getInstance(context);
recents.push(emojicon);
// notify dataset changed
if (mAdapter != null)
mAdapter.notifyDataSetChanged();
}
}

View file

@ -0,0 +1,84 @@
/*
* Copyright 2014 Ankush Sachdeva
*
* 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 github.ankushsachdeva.emojicon;
import java.util.Iterator;
import java.util.LinkedList;
import android.content.Context;
import android.content.SharedPreferences;
/**
* @author Daniele Ricci
*/
class EmojiconRecentsManager {
private static final String PREFERENCE_NAME = "emojicon_v2";
private static final String PREF_RECENTS = "recent_emojis_v2";
private static final String PREF_PAGE = "recent_page_v2";
private static final String EMOJI_DIVIDER = " ";
private final LinkedList<Emojicon> mEmoji;
private Context mContext;
public EmojiconRecentsManager(Context context) {
mContext = context.getApplicationContext();
mEmoji = loadRecent();
}
public LinkedList<Emojicon> getEmojiList() {
return mEmoji;
}
public int getRecentPage() {
return getPreferences().getInt(PREF_PAGE, 0);
}
public void setRecentPage(int page) {
getPreferences().edit().putInt(PREF_PAGE, page).commit();
}
public void push(Emojicon object) {
if (mEmoji.contains(object)) {
mEmoji.remove(object);
}
mEmoji.addFirst(object);
}
private SharedPreferences getPreferences() {
return mContext.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE);
}
private LinkedList<Emojicon> loadRecent() {
String allEmoji = getPreferences().getString(PREF_RECENTS, "");
if (allEmoji != null) {
return new LinkedList<>(EmojiconGroup.fromString(allEmoji, 0).getEmojicons());
} else {
return new LinkedList<>();
}
}
public void save() {
StringBuilder str = new StringBuilder();
for (Iterator<Emojicon> iterator = mEmoji.iterator(); iterator.hasNext(); ) {
Emojicon emojicon = iterator.next();
str.append(emojicon.getId()).append(iterator.hasNext() ? EMOJI_DIVIDER : "");
}
getPreferences().edit().putString(PREF_RECENTS, str.toString()).apply();
}
}

View file

@ -0,0 +1,51 @@
/*
* Copyright 2014 Ankush Sachdeva
*
* 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 github.ankushsachdeva.emojicon;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.text.style.DynamicDrawableSpan;
/**
* @author Hieu Rocker (rockerhieu@gmail.com)
*/
class EmojiconSpan extends DynamicDrawableSpan {
private final Context mContext;
private final int mResourceId;
private final int mSize;
private Drawable mDrawable;
public EmojiconSpan(Context context, int resourceId, int size) {
super();
mContext = context;
mResourceId = resourceId;
mSize = size;
}
public Drawable getDrawable() {
if (mDrawable == null) {
try {
mDrawable = mContext.getResources().getDrawable(mResourceId);
int size = mSize;
mDrawable.setBounds(0, 0, size, size);
} catch (Exception e) {
// swallow
}
}
return mDrawable;
}
}

View file

@ -0,0 +1,76 @@
/*
* Copyright 2014 Ankush Sachdeva
*
* 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 github.ankushsachdeva.emojicon;
import github.ankushsachdeva.emojicon.R;
import android.content.Context;
import android.content.res.TypedArray;
import android.text.SpannableStringBuilder;
import android.util.AttributeSet;
import android.widget.TextView;
/**
* @author Hieu Rocker (rockerhieu@gmail.com).
*/
public class EmojiconTextView extends TextView {
private int mEmojiconSize;
private int mTextStart = 0;
private int mTextLength = -1;
public EmojiconTextView(Context context) {
super(context);
init(null);
}
public EmojiconTextView(Context context, AttributeSet attrs) {
super(context, attrs);
init(attrs);
}
public EmojiconTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(attrs);
}
private void init(AttributeSet attrs) {
if (attrs == null) {
mEmojiconSize = (int) getTextSize();
} else {
TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.Emojicon);
mEmojiconSize = (int) a.getDimension(R.styleable.Emojicon_emojiconSize, getTextSize());
mTextStart = a.getInteger(R.styleable.Emojicon_emojiconTextStart, 0);
mTextLength = a.getInteger(R.styleable.Emojicon_emojiconTextLength, -1);
a.recycle();
}
setText(getText());
}
@Override
public void setText(CharSequence text, BufferType type) {
SpannableStringBuilder builder = new SpannableStringBuilder(text);
EmojiconHandler.addEmojis(getContext(), builder, mEmojiconSize, mTextStart, mTextLength);
super.setText(builder, type);
}
/**
* Set the size of emojicon in pixels.
*/
public void setEmojiconSize(int pixels) {
mEmojiconSize = pixels;
}
}

View file

@ -0,0 +1,361 @@
/*
* Copyright 2014 Ankush Sachdeva
*
* 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 github.ankushsachdeva.emojicon;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.graphics.Rect;
import android.support.annotation.Nullable;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.SparseArray;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
import android.view.WindowManager.LayoutParams;
import android.widget.GridView;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.PopupWindow;
/**
* @author Ankush Sachdeva (sankush@yahoo.co.in).
*/
public class EmojiconsPopup extends PopupWindow implements ViewPager.OnPageChangeListener, EmojiAdapter.OnEmojiClickedListener {
private View[] mEmojiTabs;
private EmojiconRecentsManager mRecentsManager;
private int keyBoardHeight = 0;
private boolean mWaitingForKbOpen = false;
private boolean mIsOpened = false;
private View mRootView;
private Context mContext;
private ViewPager mEmojisPager;
@Nullable
private OnSoftKeyboardOpenCloseListener mSoftKeyboardOpenCloseListener;
@Nullable
private OnEmojiconClickedListener mEmojiconClickedListener;
@Nullable
private OnEmojiconBackspaceClickedListener mEmojiconBackspaceClickedListener;
private GlobalLayoutListener mGlobalLayoutListener = new GlobalLayoutListener();
/**
* Constructor
*
* @param rootView The top most layout in your view hierarchy. The difference of this view and the screen height will be used to calculate the keyboard height.
* @param context The context of current activity.
*/
public EmojiconsPopup(View rootView, Context context) {
super(context, null, R.attr.emojicon_dialog_style);
mContext = context;
mRootView = rootView;
mRecentsManager = new EmojiconRecentsManager(context);
setContentView(createCustomView());
setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}
/**
* Set the listener for the event of keyboard opening or closing.
*/
public void setOnSoftKeyboardOpenCloseListener(OnSoftKeyboardOpenCloseListener listener) {
this.mSoftKeyboardOpenCloseListener = listener;
}
/**
* Set the listener for the event when any of the emojicon is clicked
*/
public void setOnEmojiconClickedListener(OnEmojiconClickedListener listener) {
this.mEmojiconClickedListener = listener;
}
/**
* Set the listener for the event when backspace on emojicon popup is clicked
*/
public void setOnEmojiconBackspaceClickedListener(OnEmojiconBackspaceClickedListener listener) {
this.mEmojiconBackspaceClickedListener = listener;
}
/**
* Use this function to show the emoji popup.
* NOTE: Since, the soft keyboard sizes are variable on different android devices, the
* library needs you to open the soft keyboard atleast once before calling this function.
* If that is not possible see showAtBottomPending() function.
*/
public void showAtBottom() {
showAtLocation(mRootView, Gravity.BOTTOM, 0, 0);
}
/**
* Use this function when the soft keyboard has not been opened yet. This
* will show the emoji popup after the keyboard is up next time.
* Generally, you will be calling InputMethodManager.showSoftInput function after
* calling this function.
*/
public void showAtBottomPending() {
if (isKeyBoardOpen()) {
showAtBottom();
} else {
mWaitingForKbOpen = true;
}
}
/**
* @return Returns true if the soft keyboard is open, false otherwise.
*/
public Boolean isKeyBoardOpen() {
return mIsOpened;
}
/**
* Dismiss the popup
*/
@Override
public void dismiss() {
super.dismiss();
mRecentsManager.save();
}
/**
* Call this function to resize the emoji popup according to your soft keyboard size
*/
public void attachGlobalLayoutListener() {
mRootView.getViewTreeObserver().addOnGlobalLayoutListener(mGlobalLayoutListener);
}
public void detachGlobalLayoutListener() {
mRootView.getViewTreeObserver().removeGlobalOnLayoutListener(mGlobalLayoutListener);
}
/**
* Manually set the popup window size
*
* @param width Width of the popup
* @param height Height of the popup
*/
public void setSize(int width, int height) {
setWidth(width);
setHeight(height);
}
private View createCustomView() {
View view = LayoutInflater.from(mContext).inflate(R.layout.emojicons, null);
List<EmojiconGroup> displayedGroups = collectDisplayedGroups();
initViewPager(view, displayedGroups);
initTabs(view, displayedGroups);
initCurrentPage();
return view;
}
private void initCurrentPage() {
// get last selected page
int page = mRecentsManager.getRecentPage();
// last page was recents, check if there are recents to use
// if none was found, go to page 1
if (page == 0 && mRecentsManager.getEmojiList().isEmpty()) {
page = 1;
}
if (page == 0) {
onPageSelected(page);
} else {
mEmojisPager.setCurrentItem(page, false);
}
}
private void initTabs(View view, List<EmojiconGroup> displayedGroups) {
LinearLayout tabHostLayout = (LinearLayout) view.findViewById(R.id.emojis_tab);
mEmojiTabs = new View[displayedGroups.size()];
for (int i = 0; i < displayedGroups.size(); i++) {
final int position = i;
mEmojiTabs[i] = inflateTab(tabHostLayout, displayedGroups.get(i).getIconResId());
mEmojiTabs[i].setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mEmojisPager.setCurrentItem(position);
}
});
inflateDivider(tabHostLayout);
}
View backSpace = inflateTab(tabHostLayout, R.drawable.ic_keyboard_delete);
backSpace.setOnTouchListener(new RepeatTouchListener(1000, 50, new OnClickListener() {
@Override
public void onClick(View v) {
if (mEmojiconBackspaceClickedListener != null) {
mEmojiconBackspaceClickedListener.onEmojiconBackspaceClicked(v);
}
}
}));
}
private View inflateTab(LinearLayout tabHostLayout, int iconResId) {
ImageButton tabView = (ImageButton) LayoutInflater.from(mContext)
.inflate(R.layout.emojicon_tab, tabHostLayout, false);
tabHostLayout.addView(tabView);
tabView.setImageDrawable(mContext.getResources().getDrawable(iconResId));
return tabView;
}
private View inflateDivider(LinearLayout tabHostLayout) {
return LayoutInflater.from(mContext).inflate(R.layout.emojicon_tab_divider, tabHostLayout);
}
private void initViewPager(View view, List<EmojiconGroup> displayedGroups) {
mEmojisPager = (ViewPager) view.findViewById(R.id.emojis_pager);
mEmojisPager.setOnPageChangeListener(this);
mEmojisPager.setAdapter(new EmojisPagerAdapter(displayedGroups));
}
private List<EmojiconGroup> collectDisplayedGroups() {
List<EmojiconGroup> groups = new ArrayList<>();
groups.add(new RecentsEmojiconGroup(mRecentsManager, EmojiconGroupsLoader.KnownGroupNames.RECENT.getIconResId()));
groups.addAll(EmojiconGroupsLoader.getInstance(mContext).getGroups());
return groups;
}
@Override
public void onPageScrolled(int i, float v, int i2) {
// ignore
}
@Override
public void onPageSelected(int position) {
for (int i = 0; i < mEmojiTabs.length; i++) {
mEmojiTabs[i].setSelected(i == position);
}
mRecentsManager.setRecentPage(position);
EmojiAdapter adapter = ((EmojisPagerAdapter) mEmojisPager.getAdapter()).getPageAdapter(position);
if (adapter instanceof Updatable) {
((Updatable) adapter).update();
}
}
@Override
public void onPageScrollStateChanged(int i) {
// ignore
}
@Override
public void onEmojiClicked(Emojicon emojicon) {
mRecentsManager.push(emojicon);
if (mEmojiconClickedListener != null) {
mEmojiconClickedListener.onEmojiconClicked(emojicon);
}
}
private class EmojisPagerAdapter extends PagerAdapter {
private final List<EmojiconGroup> mGroups;
private final SparseArray<EmojiAdapter> mAdapters = new SparseArray<>();
public EmojisPagerAdapter(List<EmojiconGroup> groups) {
mGroups = groups;
}
public EmojiAdapter getPageAdapter(int pageIndex) {
return mAdapters.get(pageIndex);
}
@Override
public int getCount() {
return mGroups.size();
}
@Override
public GridView instantiateItem(ViewGroup container, final int viewPosition) {
GridView gridView = (GridView) LayoutInflater.from(mContext).inflate(R.layout.emojicon_grid, container, false);
container.addView(gridView);
final EmojiAdapter adapter = mGroups.get(viewPosition).createAdapter(mContext);
gridView.setAdapter(adapter);
adapter.setClickListener(EmojiconsPopup.this);
mAdapters.put(viewPosition, adapter);
return gridView;
}
@Override
public void destroyItem(ViewGroup container, int position, Object view) {
container.removeView((View) view);
mAdapters.remove(position);
}
@Override
public boolean isViewFromObject(View view, Object key) {
return key == view;
}
}
public interface OnEmojiconClickedListener {
void onEmojiconClicked(Emojicon emojicon);
}
public interface OnEmojiconBackspaceClickedListener {
void onEmojiconBackspaceClicked(View v);
}
public interface OnSoftKeyboardOpenCloseListener {
void onKeyboardOpen(int keyBoardHeight);
void onKeyboardClose();
}
private class GlobalLayoutListener implements OnGlobalLayoutListener {
@Override
public void onGlobalLayout() {
Rect r = new Rect();
mRootView.getWindowVisibleDisplayFrame(r);
int screenHeight = mRootView.getRootView().getHeight();
int heightDifference = screenHeight - (r.bottom - r.top);
int resourceId = mContext.getResources()
.getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
heightDifference -= mContext.getResources().getDimensionPixelSize(resourceId);
}
if (heightDifference > 100) {
int oldHeight = getHeight();
keyBoardHeight = heightDifference;
setSize(LayoutParams.MATCH_PARENT, keyBoardHeight);
if (!mIsOpened) {
if (mSoftKeyboardOpenCloseListener != null) {
mSoftKeyboardOpenCloseListener.onKeyboardOpen(keyBoardHeight);
}
}
mIsOpened = true;
if (mWaitingForKbOpen) {
showAtBottom();
mWaitingForKbOpen = false;
} else if(isShowing() && oldHeight != keyBoardHeight) {
dismiss();
showAtBottom();
}
} else {
mIsOpened = false;
if (mSoftKeyboardOpenCloseListener != null) {
mSoftKeyboardOpenCloseListener.onKeyboardClose();
}
}
}
}
}

View file

@ -0,0 +1,28 @@
package github.ankushsachdeva.emojicon;
import android.content.Context;
import java.util.List;
/**
* Created by aleksandr.naumov on 14.05.2015.
*/
class RecentsEmojiconGroup extends EmojiconGroup {
private final EmojiconRecentsManager mRecentsManager;
public RecentsEmojiconGroup(EmojiconRecentsManager mRecentsManager, int iconResId) {
super(iconResId);
this.mRecentsManager = mRecentsManager;
}
@Override
public List<Emojicon> getEmojicons() {
return mRecentsManager.getEmojiList();
}
@Override
public EmojiAdapter createAdapter(Context context) {
return new EmojiRecentAdapter(context, mRecentsManager);
}
}

View file

@ -0,0 +1,74 @@
package github.ankushsachdeva.emojicon;
import android.os.Handler;
import android.os.SystemClock;
import android.view.MotionEvent;
import android.view.View;
/**
* A class, that can be used as a TouchListener on any view (e.g. a Button).
* It cyclically runs a clickListener, emulating keyboard-like behaviour. First
* click is fired immediately, next before initialInterval, and subsequent before
* normalInterval.
* <p/>
* <p>Interval is scheduled before the onClick completes, so it has to run fast.
* If it runs slow, it does not generate skipped onClicks.
*/
class RepeatTouchListener implements View.OnTouchListener {
private Handler handler = new Handler();
private int initialInterval;
private final int normalInterval;
private final View.OnClickListener clickListener;
private Runnable handlerRunnable = new Runnable() {
@Override
public void run() {
if (downView == null) {
return;
}
handler.removeCallbacksAndMessages(downView);
handler.postAtTime(this, downView, SystemClock.uptimeMillis() + normalInterval);
clickListener.onClick(downView);
}
};
private View downView;
/**
* @param initialInterval The interval before first click event
* @param normalInterval The interval before second and subsequent click
* events
* @param clickListener The OnClickListener, that will be called
* periodically
*/
public RepeatTouchListener(int initialInterval, int normalInterval, View.OnClickListener clickListener) {
if (clickListener == null)
throw new IllegalArgumentException("null runnable");
if (initialInterval < 0 || normalInterval < 0)
throw new IllegalArgumentException("negative interval");
this.initialInterval = initialInterval;
this.normalInterval = normalInterval;
this.clickListener = clickListener;
}
public boolean onTouch(View view, MotionEvent motionEvent) {
switch (motionEvent.getAction()) {
case MotionEvent.ACTION_DOWN:
downView = view;
handler.removeCallbacks(handlerRunnable);
handler.postAtTime(handlerRunnable, downView, SystemClock.uptimeMillis() + initialInterval);
clickListener.onClick(view);
return true;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_OUTSIDE:
handler.removeCallbacksAndMessages(downView);
downView = null;
return true;
}
return false;
}
}

View file

@ -0,0 +1,29 @@
package github.ankushsachdeva.emojicon;
import android.content.Context;
import java.util.List;
/**
* Created by aleksandr.naumov on 13.05.2015.
*/
class StaticEmojiconGroup extends EmojiconGroup {
private final List<Emojicon> mEmojicons;
public StaticEmojiconGroup(List<Emojicon> emojicons, int iconResId) {
super(iconResId);
mEmojicons = emojicons;
}
@Override
public List<Emojicon> getEmojicons() {
return mEmojicons;
}
@Override
public EmojiAdapter createAdapter(Context context) {
EmojiAdapter adapter = new EmojiAdapter(context);
adapter.setEmojiconList(getEmojicons());
return adapter;
}
}

View file

@ -0,0 +1,8 @@
package github.ankushsachdeva.emojicon;
/**
* Created by aleksandr.naumov on 14.05.2015.
*/
interface Updatable {
void update();
}

View file

@ -0,0 +1,74 @@
/*
* Copyright 2014 Ankush Sachdeva
*
* 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 github.ankushsachdeva.emojicon.emoji;
import java.io.Serializable;
/**
* @author Hieu Rocker (rockerhieu@gmail.com)
*/
public class Emojicon implements Serializable {
private static final long serialVersionUID = 1L;
private String emoji;
private Emojicon() {
}
public static Emojicon fromCodePoint(int codePoint) {
Emojicon emoji = new Emojicon();
emoji.emoji = newString(codePoint);
return emoji;
}
public static Emojicon fromChar(char ch) {
Emojicon emoji = new Emojicon();
emoji.emoji = Character.toString(ch);
return emoji;
}
public static Emojicon fromChars(String chars) {
Emojicon emoji = new Emojicon();
emoji.emoji = chars;
return emoji;
}
public Emojicon(String emoji) {
this.emoji = emoji;
}
public String getEmoji() {
return emoji;
}
@Override
public boolean equals(Object o) {
return o instanceof Emojicon && emoji.equals(((Emojicon) o).emoji);
}
@Override
public int hashCode() {
return emoji.hashCode();
}
public static final String newString(int codePoint) {
if (Character.charCount(codePoint) == 1) {
return String.valueOf(codePoint);
} else {
return new String(Character.toChars(codePoint));
}
}
}

View file

@ -0,0 +1,141 @@
/*
* Copyright 2014 Ankush Sachdeva
*
* 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 github.ankushsachdeva.emojicon.emoji;
/**
* @author Hieu Rocker (rockerhieu@gmail.com)
*/
public class Nature {
public static final Emojicon[] DATA = new Emojicon[]{
Emojicon.fromCodePoint(0x1f436),
Emojicon.fromCodePoint(0x1f43a),
Emojicon.fromCodePoint(0x1f431),
Emojicon.fromCodePoint(0x1f42d),
Emojicon.fromCodePoint(0x1f439),
Emojicon.fromCodePoint(0x1f430),
Emojicon.fromCodePoint(0x1f438),
Emojicon.fromCodePoint(0x1f42f),
Emojicon.fromCodePoint(0x1f428),
Emojicon.fromCodePoint(0x1f43b),
Emojicon.fromCodePoint(0x1f437),
Emojicon.fromCodePoint(0x1f43d),
Emojicon.fromCodePoint(0x1f42e),
Emojicon.fromCodePoint(0x1f417),
Emojicon.fromCodePoint(0x1f435),
Emojicon.fromCodePoint(0x1f412),
Emojicon.fromCodePoint(0x1f434),
Emojicon.fromCodePoint(0x1f411),
Emojicon.fromCodePoint(0x1f418),
Emojicon.fromCodePoint(0x1f43c),
Emojicon.fromCodePoint(0x1f427),
Emojicon.fromCodePoint(0x1f426),
Emojicon.fromCodePoint(0x1f424),
Emojicon.fromCodePoint(0x1f425),
Emojicon.fromCodePoint(0x1f423),
Emojicon.fromCodePoint(0x1f414),
Emojicon.fromCodePoint(0x1f40d),
Emojicon.fromCodePoint(0x1f422),
Emojicon.fromCodePoint(0x1f41b),
Emojicon.fromCodePoint(0x1f41d),
Emojicon.fromCodePoint(0x1f41c),
Emojicon.fromCodePoint(0x1f41e),
Emojicon.fromCodePoint(0x1f40c),
Emojicon.fromCodePoint(0x1f419),
Emojicon.fromCodePoint(0x1f41a),
Emojicon.fromCodePoint(0x1f420),
Emojicon.fromCodePoint(0x1f41f),
Emojicon.fromCodePoint(0x1f42c),
Emojicon.fromCodePoint(0x1f433),
Emojicon.fromCodePoint(0x1f40b),
Emojicon.fromCodePoint(0x1f404),
Emojicon.fromCodePoint(0x1f40f),
Emojicon.fromCodePoint(0x1f400),
Emojicon.fromCodePoint(0x1f403),
Emojicon.fromCodePoint(0x1f405),
Emojicon.fromCodePoint(0x1f407),
Emojicon.fromCodePoint(0x1f409),
Emojicon.fromCodePoint(0x1f40e),
Emojicon.fromCodePoint(0x1f410),
Emojicon.fromCodePoint(0x1f413),
Emojicon.fromCodePoint(0x1f415),
Emojicon.fromCodePoint(0x1f416),
Emojicon.fromCodePoint(0x1f401),
Emojicon.fromCodePoint(0x1f402),
Emojicon.fromCodePoint(0x1f432),
Emojicon.fromCodePoint(0x1f421),
Emojicon.fromCodePoint(0x1f40a),
Emojicon.fromCodePoint(0x1f42b),
Emojicon.fromCodePoint(0x1f42a),
Emojicon.fromCodePoint(0x1f406),
Emojicon.fromCodePoint(0x1f408),
Emojicon.fromCodePoint(0x1f429),
Emojicon.fromCodePoint(0x1f43e),
Emojicon.fromCodePoint(0x1f490),
Emojicon.fromCodePoint(0x1f338),
Emojicon.fromCodePoint(0x1f337),
Emojicon.fromCodePoint(0x1f340),
Emojicon.fromCodePoint(0x1f339),
Emojicon.fromCodePoint(0x1f33b),
Emojicon.fromCodePoint(0x1f33a),
Emojicon.fromCodePoint(0x1f341),
Emojicon.fromCodePoint(0x1f343),
Emojicon.fromCodePoint(0x1f342),
Emojicon.fromCodePoint(0x1f33f),
Emojicon.fromCodePoint(0x1f33e),
Emojicon.fromCodePoint(0x1f344),
Emojicon.fromCodePoint(0x1f335),
Emojicon.fromCodePoint(0x1f334),
Emojicon.fromCodePoint(0x1f332),
Emojicon.fromCodePoint(0x1f333),
Emojicon.fromCodePoint(0x1f330),
Emojicon.fromCodePoint(0x1f331),
Emojicon.fromCodePoint(0x1f33c),
Emojicon.fromCodePoint(0x1f310),
Emojicon.fromCodePoint(0x1f31e),
Emojicon.fromCodePoint(0x1f31d),
Emojicon.fromCodePoint(0x1f31a),
Emojicon.fromCodePoint(0x1f311),
Emojicon.fromCodePoint(0x1f312),
Emojicon.fromCodePoint(0x1f313),
Emojicon.fromCodePoint(0x1f314),
Emojicon.fromCodePoint(0x1f315),
Emojicon.fromCodePoint(0x1f316),
Emojicon.fromCodePoint(0x1f317),
Emojicon.fromCodePoint(0x1f318),
Emojicon.fromCodePoint(0x1f31c),
Emojicon.fromCodePoint(0x1f31b),
Emojicon.fromCodePoint(0x1f319),
Emojicon.fromCodePoint(0x1f30d),
Emojicon.fromCodePoint(0x1f30e),
Emojicon.fromCodePoint(0x1f30f),
Emojicon.fromCodePoint(0x1f30b),
Emojicon.fromCodePoint(0x1f30c),
Emojicon.fromCodePoint(0x1f320),
Emojicon.fromChar((char) 0x2b50),
Emojicon.fromChar((char) 0x2600),
Emojicon.fromChar((char) 0x26c5),
Emojicon.fromChar((char) 0x2601),
Emojicon.fromChar((char) 0x26a1),
Emojicon.fromChar((char) 0x2614),
Emojicon.fromChar((char) 0x2744),
Emojicon.fromChar((char) 0x26c4),
Emojicon.fromCodePoint(0x1f300),
Emojicon.fromCodePoint(0x1f301),
Emojicon.fromCodePoint(0x1f308),
Emojicon.fromCodePoint(0x1f30a),
};
}

View file

@ -0,0 +1,255 @@
/*
* Copyright 2014 Ankush Sachdeva
*
* 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 github.ankushsachdeva.emojicon.emoji;
/**
* @author Hieu Rocker (rockerhieu@gmail.com)
*/
public class Objects {
public static final Emojicon[] DATA = new Emojicon[]{
Emojicon.fromCodePoint(0x1f38d),
Emojicon.fromCodePoint(0x1f49d),
Emojicon.fromCodePoint(0x1f38e),
Emojicon.fromCodePoint(0x1f392),
Emojicon.fromCodePoint(0x1f393),
Emojicon.fromCodePoint(0x1f38f),
Emojicon.fromCodePoint(0x1f386),
Emojicon.fromCodePoint(0x1f387),
Emojicon.fromCodePoint(0x1f390),
Emojicon.fromCodePoint(0x1f391),
Emojicon.fromCodePoint(0x1f383),
Emojicon.fromCodePoint(0x1f47b),
Emojicon.fromCodePoint(0x1f385),
Emojicon.fromCodePoint(0x1f384),
Emojicon.fromCodePoint(0x1f381),
Emojicon.fromCodePoint(0x1f38b),
Emojicon.fromCodePoint(0x1f389),
Emojicon.fromCodePoint(0x1f38a),
Emojicon.fromCodePoint(0x1f388),
Emojicon.fromCodePoint(0x1f38c),
Emojicon.fromCodePoint(0x1f52e),
Emojicon.fromCodePoint(0x1f3a5),
Emojicon.fromCodePoint(0x1f4f7),
Emojicon.fromCodePoint(0x1f4f9),
Emojicon.fromCodePoint(0x1f4fc),
Emojicon.fromCodePoint(0x1f4bf),
Emojicon.fromCodePoint(0x1f4c0),
Emojicon.fromCodePoint(0x1f4bd),
Emojicon.fromCodePoint(0x1f4be),
Emojicon.fromCodePoint(0x1f4bb),
Emojicon.fromCodePoint(0x1f4f1),
Emojicon.fromChar((char) 0x260e),
Emojicon.fromCodePoint(0x1f4de),
Emojicon.fromCodePoint(0x1f4df),
Emojicon.fromCodePoint(0x1f4e0),
Emojicon.fromCodePoint(0x1f4e1),
Emojicon.fromCodePoint(0x1f4fa),
Emojicon.fromCodePoint(0x1f4fb),
Emojicon.fromCodePoint(0x1f508),
Emojicon.fromCodePoint(0x1f509),
Emojicon.fromCodePoint(0x1f50a),
Emojicon.fromCodePoint(0x1f507),
Emojicon.fromCodePoint(0x1f514),
Emojicon.fromCodePoint(0x1f515),
Emojicon.fromCodePoint(0x1f4e2),
Emojicon.fromCodePoint(0x1f4e3),
Emojicon.fromChar((char) 0x23f3),
Emojicon.fromChar((char) 0x231b),
Emojicon.fromChar((char) 0x23f0),
Emojicon.fromChar((char) 0x231a),
Emojicon.fromCodePoint(0x1f513),
Emojicon.fromCodePoint(0x1f512),
Emojicon.fromCodePoint(0x1f50f),
Emojicon.fromCodePoint(0x1f510),
Emojicon.fromCodePoint(0x1f511),
Emojicon.fromCodePoint(0x1f50e),
Emojicon.fromCodePoint(0x1f4a1),
Emojicon.fromCodePoint(0x1f526),
Emojicon.fromCodePoint(0x1f506),
Emojicon.fromCodePoint(0x1f505),
Emojicon.fromCodePoint(0x1f50c),
Emojicon.fromCodePoint(0x1f50b),
Emojicon.fromCodePoint(0x1f50d),
Emojicon.fromCodePoint(0x1f6c1),
Emojicon.fromCodePoint(0x1f6c0),
Emojicon.fromCodePoint(0x1f6bf),
Emojicon.fromCodePoint(0x1f6bd),
Emojicon.fromCodePoint(0x1f527),
Emojicon.fromCodePoint(0x1f529),
Emojicon.fromCodePoint(0x1f528),
Emojicon.fromCodePoint(0x1f6aa),
Emojicon.fromCodePoint(0x1f6ac),
Emojicon.fromCodePoint(0x1f4a3),
Emojicon.fromCodePoint(0x1f52b),
Emojicon.fromCodePoint(0x1f52a),
Emojicon.fromCodePoint(0x1f48a),
Emojicon.fromCodePoint(0x1f489),
Emojicon.fromCodePoint(0x1f4b0),
Emojicon.fromCodePoint(0x1f4b4),
Emojicon.fromCodePoint(0x1f4b5),
Emojicon.fromCodePoint(0x1f4b7),
Emojicon.fromCodePoint(0x1f4b6),
Emojicon.fromCodePoint(0x1f4b3),
Emojicon.fromCodePoint(0x1f4b8),
Emojicon.fromCodePoint(0x1f4f2),
Emojicon.fromCodePoint(0x1f4e7),
Emojicon.fromCodePoint(0x1f4e5),
Emojicon.fromCodePoint(0x1f4e4),
Emojicon.fromChar((char) 0x2709),
Emojicon.fromCodePoint(0x1f4e9),
Emojicon.fromCodePoint(0x1f4e8),
Emojicon.fromCodePoint(0x1f4ef),
Emojicon.fromCodePoint(0x1f4eb),
Emojicon.fromCodePoint(0x1f4ea),
Emojicon.fromCodePoint(0x1f4ec),
Emojicon.fromCodePoint(0x1f4ed),
Emojicon.fromCodePoint(0x1f4ee),
Emojicon.fromCodePoint(0x1f4e6),
Emojicon.fromCodePoint(0x1f4dd),
Emojicon.fromCodePoint(0x1f4c4),
Emojicon.fromCodePoint(0x1f4c3),
Emojicon.fromCodePoint(0x1f4d1),
Emojicon.fromCodePoint(0x1f4ca),
Emojicon.fromCodePoint(0x1f4c8),
Emojicon.fromCodePoint(0x1f4c9),
Emojicon.fromCodePoint(0x1f4dc),
Emojicon.fromCodePoint(0x1f4cb),
Emojicon.fromCodePoint(0x1f4c5),
Emojicon.fromCodePoint(0x1f4c6),
Emojicon.fromCodePoint(0x1f4c7),
Emojicon.fromCodePoint(0x1f4c1),
Emojicon.fromCodePoint(0x1f4c2),
Emojicon.fromChar((char) 0x2702),
Emojicon.fromCodePoint(0x1f4cc),
Emojicon.fromCodePoint(0x1f4ce),
Emojicon.fromChar((char) 0x2712),
Emojicon.fromChar((char) 0x270f),
Emojicon.fromCodePoint(0x1f4cf),
Emojicon.fromCodePoint(0x1f4d0),
Emojicon.fromCodePoint(0x1f4d5),
Emojicon.fromCodePoint(0x1f4d7),
Emojicon.fromCodePoint(0x1f4d8),
Emojicon.fromCodePoint(0x1f4d9),
Emojicon.fromCodePoint(0x1f4d3),
Emojicon.fromCodePoint(0x1f4d4),
Emojicon.fromCodePoint(0x1f4d2),
Emojicon.fromCodePoint(0x1f4da),
Emojicon.fromCodePoint(0x1f4d6),
Emojicon.fromCodePoint(0x1f516),
Emojicon.fromCodePoint(0x1f4db),
Emojicon.fromCodePoint(0x1f52c),
Emojicon.fromCodePoint(0x1f52d),
Emojicon.fromCodePoint(0x1f4f0),
Emojicon.fromCodePoint(0x1f3a8),
Emojicon.fromCodePoint(0x1f3ac),
Emojicon.fromCodePoint(0x1f3a4),
Emojicon.fromCodePoint(0x1f3a7),
Emojicon.fromCodePoint(0x1f3bc),
Emojicon.fromCodePoint(0x1f3b5),
Emojicon.fromCodePoint(0x1f3b6),
Emojicon.fromCodePoint(0x1f3b9),
Emojicon.fromCodePoint(0x1f3bb),
Emojicon.fromCodePoint(0x1f3ba),
Emojicon.fromCodePoint(0x1f3b7),
Emojicon.fromCodePoint(0x1f3b8),
Emojicon.fromCodePoint(0x1f47e),
Emojicon.fromCodePoint(0x1f3ae),
Emojicon.fromCodePoint(0x1f0cf),
Emojicon.fromCodePoint(0x1f3b4),
Emojicon.fromCodePoint(0x1f004),
Emojicon.fromCodePoint(0x1f3b2),
Emojicon.fromCodePoint(0x1f3af),
Emojicon.fromCodePoint(0x1f3c8),
Emojicon.fromCodePoint(0x1f3c0),
Emojicon.fromChar((char) 0x26bd),
Emojicon.fromChar((char) 0x26be),
Emojicon.fromCodePoint(0x1f3be),
Emojicon.fromCodePoint(0x1f3b1),
Emojicon.fromCodePoint(0x1f3c9),
Emojicon.fromCodePoint(0x1f3b3),
Emojicon.fromChar((char) 0x26f3),
Emojicon.fromCodePoint(0x1f6b5),
Emojicon.fromCodePoint(0x1f6b4),
Emojicon.fromCodePoint(0x1f3c1),
Emojicon.fromCodePoint(0x1f3c7),
Emojicon.fromCodePoint(0x1f3c6),
Emojicon.fromCodePoint(0x1f3bf),
Emojicon.fromCodePoint(0x1f3c2),
Emojicon.fromCodePoint(0x1f3ca),
Emojicon.fromCodePoint(0x1f3c4),
Emojicon.fromCodePoint(0x1f3a3),
Emojicon.fromChar((char) 0x2615),
Emojicon.fromCodePoint(0x1f375),
Emojicon.fromCodePoint(0x1f376),
Emojicon.fromCodePoint(0x1f37c),
Emojicon.fromCodePoint(0x1f37a),
Emojicon.fromCodePoint(0x1f37b),
Emojicon.fromCodePoint(0x1f378),
Emojicon.fromCodePoint(0x1f379),
Emojicon.fromCodePoint(0x1f377),
Emojicon.fromCodePoint(0x1f374),
Emojicon.fromCodePoint(0x1f355),
Emojicon.fromCodePoint(0x1f354),
Emojicon.fromCodePoint(0x1f35f),
Emojicon.fromCodePoint(0x1f357),
Emojicon.fromCodePoint(0x1f356),
Emojicon.fromCodePoint(0x1f35d),
Emojicon.fromCodePoint(0x1f35b),
Emojicon.fromCodePoint(0x1f364),
Emojicon.fromCodePoint(0x1f371),
Emojicon.fromCodePoint(0x1f363),
Emojicon.fromCodePoint(0x1f365),
Emojicon.fromCodePoint(0x1f359),
Emojicon.fromCodePoint(0x1f358),
Emojicon.fromCodePoint(0x1f35a),
Emojicon.fromCodePoint(0x1f35c),
Emojicon.fromCodePoint(0x1f372),
Emojicon.fromCodePoint(0x1f362),
Emojicon.fromCodePoint(0x1f361),
Emojicon.fromCodePoint(0x1f373),
Emojicon.fromCodePoint(0x1f35e),
Emojicon.fromCodePoint(0x1f369),
Emojicon.fromCodePoint(0x1f36e),
Emojicon.fromCodePoint(0x1f366),
Emojicon.fromCodePoint(0x1f368),
Emojicon.fromCodePoint(0x1f367),
Emojicon.fromCodePoint(0x1f382),
Emojicon.fromCodePoint(0x1f370),
Emojicon.fromCodePoint(0x1f36a),
Emojicon.fromCodePoint(0x1f36b),
Emojicon.fromCodePoint(0x1f36c),
Emojicon.fromCodePoint(0x1f36d),
Emojicon.fromCodePoint(0x1f36f),
Emojicon.fromCodePoint(0x1f34e),
Emojicon.fromCodePoint(0x1f34f),
Emojicon.fromCodePoint(0x1f34a),
Emojicon.fromCodePoint(0x1f34b),
Emojicon.fromCodePoint(0x1f352),
Emojicon.fromCodePoint(0x1f347),
Emojicon.fromCodePoint(0x1f349),
Emojicon.fromCodePoint(0x1f353),
Emojicon.fromCodePoint(0x1f351),
Emojicon.fromCodePoint(0x1f348),
Emojicon.fromCodePoint(0x1f34c),
Emojicon.fromCodePoint(0x1f350),
Emojicon.fromCodePoint(0x1f34d),
Emojicon.fromCodePoint(0x1f360),
Emojicon.fromCodePoint(0x1f346),
Emojicon.fromCodePoint(0x1f345),
Emojicon.fromCodePoint(0x1f33d),
};
}

View file

@ -0,0 +1,214 @@
/*
* Copyright 2014 Ankush Sachdeva
*
* 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 github.ankushsachdeva.emojicon.emoji;
/**
* @author Hieu Rocker (rockerhieu@gmail.com)
*/
public class People {
public static final Emojicon[] DATA = new Emojicon[]{
Emojicon.fromCodePoint(0x1f604),
Emojicon.fromCodePoint(0x1f603),
Emojicon.fromCodePoint(0x1f600),
Emojicon.fromCodePoint(0x1f60a),
Emojicon.fromChar((char) 0x263a),
Emojicon.fromCodePoint(0x1f609),
Emojicon.fromCodePoint(0x1f60d),
Emojicon.fromCodePoint(0x1f618),
Emojicon.fromCodePoint(0x1f61a),
Emojicon.fromCodePoint(0x1f617),
Emojicon.fromCodePoint(0x1f619),
Emojicon.fromCodePoint(0x1f61c),
Emojicon.fromCodePoint(0x1f61d),
Emojicon.fromCodePoint(0x1f61b),
Emojicon.fromCodePoint(0x1f633),
Emojicon.fromCodePoint(0x1f601),
Emojicon.fromCodePoint(0x1f614),
Emojicon.fromCodePoint(0x1f60c),
Emojicon.fromCodePoint(0x1f612),
Emojicon.fromCodePoint(0x1f61e),
Emojicon.fromCodePoint(0x1f623),
Emojicon.fromCodePoint(0x1f622),
Emojicon.fromCodePoint(0x1f602),
Emojicon.fromCodePoint(0x1f62d),
Emojicon.fromCodePoint(0x1f62a),
Emojicon.fromCodePoint(0x1f625),
Emojicon.fromCodePoint(0x1f630),
Emojicon.fromCodePoint(0x1f605),
Emojicon.fromCodePoint(0x1f613),
Emojicon.fromCodePoint(0x1f629),
Emojicon.fromCodePoint(0x1f62b),
Emojicon.fromCodePoint(0x1f628),
Emojicon.fromCodePoint(0x1f631),
Emojicon.fromCodePoint(0x1f620),
Emojicon.fromCodePoint(0x1f621),
Emojicon.fromCodePoint(0x1f624),
Emojicon.fromCodePoint(0x1f616),
Emojicon.fromCodePoint(0x1f606),
Emojicon.fromCodePoint(0x1f60b),
Emojicon.fromCodePoint(0x1f637),
Emojicon.fromCodePoint(0x1f60e),
Emojicon.fromCodePoint(0x1f634),
Emojicon.fromCodePoint(0x1f635),
Emojicon.fromCodePoint(0x1f632),
Emojicon.fromCodePoint(0x1f61f),
Emojicon.fromCodePoint(0x1f626),
Emojicon.fromCodePoint(0x1f627),
Emojicon.fromCodePoint(0x1f608),
Emojicon.fromCodePoint(0x1f47f),
Emojicon.fromCodePoint(0x1f62e),
Emojicon.fromCodePoint(0x1f62c),
Emojicon.fromCodePoint(0x1f610),
Emojicon.fromCodePoint(0x1f615),
Emojicon.fromCodePoint(0x1f62f),
Emojicon.fromCodePoint(0x1f636),
Emojicon.fromCodePoint(0x1f607),
Emojicon.fromCodePoint(0x1f60f),
Emojicon.fromCodePoint(0x1f611),
Emojicon.fromCodePoint(0x1f472),
Emojicon.fromCodePoint(0x1f473),
Emojicon.fromCodePoint(0x1f46e),
Emojicon.fromCodePoint(0x1f477),
Emojicon.fromCodePoint(0x1f482),
Emojicon.fromCodePoint(0x1f476),
Emojicon.fromCodePoint(0x1f466),
Emojicon.fromCodePoint(0x1f467),
Emojicon.fromCodePoint(0x1f468),
Emojicon.fromCodePoint(0x1f469),
Emojicon.fromCodePoint(0x1f474),
Emojicon.fromCodePoint(0x1f475),
Emojicon.fromCodePoint(0x1f471),
Emojicon.fromCodePoint(0x1f47c),
Emojicon.fromCodePoint(0x1f478),
Emojicon.fromCodePoint(0x1f63a),
Emojicon.fromCodePoint(0x1f638),
Emojicon.fromCodePoint(0x1f63b),
Emojicon.fromCodePoint(0x1f63d),
Emojicon.fromCodePoint(0x1f63c),
Emojicon.fromCodePoint(0x1f640),
Emojicon.fromCodePoint(0x1f63f),
Emojicon.fromCodePoint(0x1f639),
Emojicon.fromCodePoint(0x1f63e),
Emojicon.fromCodePoint(0x1f479),
Emojicon.fromCodePoint(0x1f47a),
Emojicon.fromCodePoint(0x1f648),
Emojicon.fromCodePoint(0x1f649),
Emojicon.fromCodePoint(0x1f64a),
Emojicon.fromCodePoint(0x1f480),
Emojicon.fromCodePoint(0x1f47d),
Emojicon.fromCodePoint(0x1f4a9),
Emojicon.fromCodePoint(0x1f525),
Emojicon.fromChar((char) 0x2728),
Emojicon.fromCodePoint(0x1f31f),
Emojicon.fromCodePoint(0x1f4ab),
Emojicon.fromCodePoint(0x1f4a5),
Emojicon.fromCodePoint(0x1f4a2),
Emojicon.fromCodePoint(0x1f4a6),
Emojicon.fromCodePoint(0x1f4a7),
Emojicon.fromCodePoint(0x1f4a4),
Emojicon.fromCodePoint(0x1f4a8),
Emojicon.fromCodePoint(0x1f442),
Emojicon.fromCodePoint(0x1f440),
Emojicon.fromCodePoint(0x1f443),
Emojicon.fromCodePoint(0x1f445),
Emojicon.fromCodePoint(0x1f444),
Emojicon.fromCodePoint(0x1f44d),
Emojicon.fromCodePoint(0x1f44e),
Emojicon.fromCodePoint(0x1f44c),
Emojicon.fromCodePoint(0x1f44a),
Emojicon.fromChar((char) 0x270a),
Emojicon.fromChar((char) 0x270c),
Emojicon.fromCodePoint(0x1f44b),
Emojicon.fromChar((char) 0x270b),
Emojicon.fromCodePoint(0x1f450),
Emojicon.fromCodePoint(0x1f446),
Emojicon.fromCodePoint(0x1f447),
Emojicon.fromCodePoint(0x1f449),
Emojicon.fromCodePoint(0x1f448),
Emojicon.fromCodePoint(0x1f64c),
Emojicon.fromCodePoint(0x1f64f),
Emojicon.fromChar((char) 0x261d),
Emojicon.fromCodePoint(0x1f44f),
Emojicon.fromCodePoint(0x1f4aa),
Emojicon.fromCodePoint(0x1f6b6),
Emojicon.fromCodePoint(0x1f3c3),
Emojicon.fromCodePoint(0x1f483),
Emojicon.fromCodePoint(0x1f46b),
Emojicon.fromCodePoint(0x1f46a),
Emojicon.fromCodePoint(0x1f46c),
Emojicon.fromCodePoint(0x1f46d),
Emojicon.fromCodePoint(0x1f48f),
Emojicon.fromCodePoint(0x1f491),
Emojicon.fromCodePoint(0x1f46f),
Emojicon.fromCodePoint(0x1f646),
Emojicon.fromCodePoint(0x1f645),
Emojicon.fromCodePoint(0x1f481),
Emojicon.fromCodePoint(0x1f64b),
Emojicon.fromCodePoint(0x1f486),
Emojicon.fromCodePoint(0x1f487),
Emojicon.fromCodePoint(0x1f485),
Emojicon.fromCodePoint(0x1f470),
Emojicon.fromCodePoint(0x1f64e),
Emojicon.fromCodePoint(0x1f64d),
Emojicon.fromCodePoint(0x1f647),
Emojicon.fromCodePoint(0x1f3a9),
Emojicon.fromCodePoint(0x1f451),
Emojicon.fromCodePoint(0x1f452),
Emojicon.fromCodePoint(0x1f45f),
Emojicon.fromCodePoint(0x1f45e),
Emojicon.fromCodePoint(0x1f461),
Emojicon.fromCodePoint(0x1f460),
Emojicon.fromCodePoint(0x1f462),
Emojicon.fromCodePoint(0x1f455),
Emojicon.fromCodePoint(0x1f454),
Emojicon.fromCodePoint(0x1f45a),
Emojicon.fromCodePoint(0x1f457),
Emojicon.fromCodePoint(0x1f3bd),
Emojicon.fromCodePoint(0x1f456),
Emojicon.fromCodePoint(0x1f458),
Emojicon.fromCodePoint(0x1f459),
Emojicon.fromCodePoint(0x1f4bc),
Emojicon.fromCodePoint(0x1f45c),
Emojicon.fromCodePoint(0x1f45d),
Emojicon.fromCodePoint(0x1f45b),
Emojicon.fromCodePoint(0x1f453),
Emojicon.fromCodePoint(0x1f380),
Emojicon.fromCodePoint(0x1f302),
Emojicon.fromCodePoint(0x1f484),
Emojicon.fromCodePoint(0x1f49b),
Emojicon.fromCodePoint(0x1f499),
Emojicon.fromCodePoint(0x1f49c),
Emojicon.fromCodePoint(0x1f49a),
Emojicon.fromChar((char) 0x2764),
Emojicon.fromCodePoint(0x1f494),
Emojicon.fromCodePoint(0x1f497),
Emojicon.fromCodePoint(0x1f493),
Emojicon.fromCodePoint(0x1f495),
Emojicon.fromCodePoint(0x1f496),
Emojicon.fromCodePoint(0x1f49e),
Emojicon.fromCodePoint(0x1f498),
Emojicon.fromCodePoint(0x1f48c),
Emojicon.fromCodePoint(0x1f48b),
Emojicon.fromCodePoint(0x1f48d),
Emojicon.fromCodePoint(0x1f48e),
Emojicon.fromCodePoint(0x1f464),
Emojicon.fromCodePoint(0x1f465),
Emojicon.fromCodePoint(0x1f4ac),
Emojicon.fromCodePoint(0x1f463),
Emojicon.fromCodePoint(0x1f4ad),
};
}

View file

@ -0,0 +1,126 @@
/*
* Copyright 2014 Ankush Sachdeva
*
* 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 github.ankushsachdeva.emojicon.emoji;
/**
* @author Hieu Rocker (rockerhieu@gmail.com)
*/
public class Places {
public static final Emojicon[] DATA = new Emojicon[]{
Emojicon.fromCodePoint(0x1f3e0),
Emojicon.fromCodePoint(0x1f3e1),
Emojicon.fromCodePoint(0x1f3eb),
Emojicon.fromCodePoint(0x1f3e2),
Emojicon.fromCodePoint(0x1f3e3),
Emojicon.fromCodePoint(0x1f3e5),
Emojicon.fromCodePoint(0x1f3e6),
Emojicon.fromCodePoint(0x1f3ea),
Emojicon.fromCodePoint(0x1f3e9),
Emojicon.fromCodePoint(0x1f3e8),
Emojicon.fromCodePoint(0x1f492),
Emojicon.fromChar((char) 0x26ea),
Emojicon.fromCodePoint(0x1f3ec),
Emojicon.fromCodePoint(0x1f3e4),
Emojicon.fromCodePoint(0x1f307),
Emojicon.fromCodePoint(0x1f306),
Emojicon.fromCodePoint(0x1f3ef),
Emojicon.fromCodePoint(0x1f3f0),
Emojicon.fromChar((char) 0x26fa),
Emojicon.fromCodePoint(0x1f3ed),
Emojicon.fromCodePoint(0x1f5fc),
Emojicon.fromCodePoint(0x1f5fe),
Emojicon.fromCodePoint(0x1f5fb),
Emojicon.fromCodePoint(0x1f304),
Emojicon.fromCodePoint(0x1f305),
Emojicon.fromCodePoint(0x1f303),
Emojicon.fromCodePoint(0x1f5fd),
Emojicon.fromCodePoint(0x1f309),
Emojicon.fromCodePoint(0x1f3a0),
Emojicon.fromCodePoint(0x1f3a1),
Emojicon.fromChar((char) 0x26f2),
Emojicon.fromCodePoint(0x1f3a2),
Emojicon.fromCodePoint(0x1f6a2),
Emojicon.fromChar((char) 0x26f5),
Emojicon.fromCodePoint(0x1f6a4),
Emojicon.fromCodePoint(0x1f6a3),
Emojicon.fromChar((char) 0x2693),
Emojicon.fromCodePoint(0x1f680),
Emojicon.fromChar((char) 0x2708),
Emojicon.fromCodePoint(0x1f4ba),
Emojicon.fromCodePoint(0x1f681),
Emojicon.fromCodePoint(0x1f682),
Emojicon.fromCodePoint(0x1f68a),
Emojicon.fromCodePoint(0x1f689),
Emojicon.fromCodePoint(0x1f69e),
Emojicon.fromCodePoint(0x1f686),
Emojicon.fromCodePoint(0x1f684),
Emojicon.fromCodePoint(0x1f685),
Emojicon.fromCodePoint(0x1f688),
Emojicon.fromCodePoint(0x1f687),
Emojicon.fromCodePoint(0x1f69d),
Emojicon.fromCodePoint(0x1f68b),
Emojicon.fromCodePoint(0x1f683),
Emojicon.fromCodePoint(0x1f68e),
Emojicon.fromCodePoint(0x1f68c),
Emojicon.fromCodePoint(0x1f68d),
Emojicon.fromCodePoint(0x1f699),
Emojicon.fromCodePoint(0x1f698),
Emojicon.fromCodePoint(0x1f697),
Emojicon.fromCodePoint(0x1f695),
Emojicon.fromCodePoint(0x1f696),
Emojicon.fromCodePoint(0x1f69b),
Emojicon.fromCodePoint(0x1f69a),
Emojicon.fromCodePoint(0x1f6a8),
Emojicon.fromCodePoint(0x1f693),
Emojicon.fromCodePoint(0x1f694),
Emojicon.fromCodePoint(0x1f692),
Emojicon.fromCodePoint(0x1f691),
Emojicon.fromCodePoint(0x1f690),
Emojicon.fromCodePoint(0x1f6b2),
Emojicon.fromCodePoint(0x1f6a1),
Emojicon.fromCodePoint(0x1f69f),
Emojicon.fromCodePoint(0x1f6a0),
Emojicon.fromCodePoint(0x1f69c),
Emojicon.fromCodePoint(0x1f488),
Emojicon.fromCodePoint(0x1f68f),
Emojicon.fromCodePoint(0x1f3ab),
Emojicon.fromCodePoint(0x1f6a6),
Emojicon.fromCodePoint(0x1f6a5),
Emojicon.fromChar((char) 0x26a0),
Emojicon.fromCodePoint(0x1f6a7),
Emojicon.fromCodePoint(0x1f530),
Emojicon.fromChar((char) 0x26fd),
Emojicon.fromCodePoint(0x1f3ee),
Emojicon.fromCodePoint(0x1f3b0),
Emojicon.fromChar((char) 0x2668),
Emojicon.fromCodePoint(0x1f5ff),
Emojicon.fromCodePoint(0x1f3aa),
Emojicon.fromCodePoint(0x1f3ad),
Emojicon.fromCodePoint(0x1f4cd),
Emojicon.fromCodePoint(0x1f6a9),
Emojicon.fromChars("\ud83c\uddef\ud83c\uddf5"),
Emojicon.fromChars("\ud83c\uddf0\ud83c\uddf7"),
Emojicon.fromChars("\ud83c\udde9\ud83c\uddea"),
Emojicon.fromChars("\ud83c\udde8\ud83c\uddf3"),
Emojicon.fromChars("\ud83c\uddfa\ud83c\uddf8"),
Emojicon.fromChars("\ud83c\uddeb\ud83c\uddf7"),
Emojicon.fromChars("\ud83c\uddea\ud83c\uddf8"),
Emojicon.fromChars("\ud83c\uddee\ud83c\uddf9"),
Emojicon.fromChars("\ud83c\uddf7\ud83c\uddfa"),
Emojicon.fromChars("\ud83c\uddec\ud83c\udde7"),
};
}

View file

@ -0,0 +1,237 @@
/*
* Copyright 2014 Ankush Sachdeva
*
* 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 github.ankushsachdeva.emojicon.emoji;
/**
* @author Hieu Rocker (rockerhieu@gmail.com)
*/
public class Symbols {
public static final Emojicon[] DATA = new Emojicon[]{
Emojicon.fromChars("\u0031\u20e3"),
Emojicon.fromChars("\u0032\u20e3"),
Emojicon.fromChars("\u0033\u20e3"),
Emojicon.fromChars("\u0034\u20e3"),
Emojicon.fromChars("\u0035\u20e3"),
Emojicon.fromChars("\u0036\u20e3"),
Emojicon.fromChars("\u0037\u20e3"),
Emojicon.fromChars("\u0038\u20e3"),
Emojicon.fromChars("\u0039\u20e3"),
Emojicon.fromChars("\u0030\u20e3"),
Emojicon.fromCodePoint(0x1f51f),
Emojicon.fromCodePoint(0x1f522),
Emojicon.fromChars("\u0023\u20e3"),
Emojicon.fromCodePoint(0x1f523),
Emojicon.fromChar((char) 0x2b06),
Emojicon.fromChar((char) 0x2b07),
Emojicon.fromChar((char) 0x2b05),
Emojicon.fromChar((char) 0x27a1),
Emojicon.fromCodePoint(0x1f520),
Emojicon.fromCodePoint(0x1f521),
Emojicon.fromCodePoint(0x1f524),
Emojicon.fromChar((char) 0x2197),
Emojicon.fromChar((char) 0x2196),
Emojicon.fromChar((char) 0x2198),
Emojicon.fromChar((char) 0x2199),
Emojicon.fromChar((char) 0x2194),
Emojicon.fromChar((char) 0x2195),
Emojicon.fromCodePoint(0x1f504),
Emojicon.fromChar((char) 0x25c0),
Emojicon.fromChar((char) 0x25b6),
Emojicon.fromCodePoint(0x1f53c),
Emojicon.fromCodePoint(0x1f53d),
Emojicon.fromChar((char) 0x21a9),
Emojicon.fromChar((char) 0x21aa),
Emojicon.fromChar((char) 0x2139),
Emojicon.fromChar((char) 0x23ea),
Emojicon.fromChar((char) 0x23e9),
Emojicon.fromChar((char) 0x23eb),
Emojicon.fromChar((char) 0x23ec),
Emojicon.fromChar((char) 0x2935),
Emojicon.fromChar((char) 0x2934),
Emojicon.fromCodePoint(0x1f197),
Emojicon.fromCodePoint(0x1f500),
Emojicon.fromCodePoint(0x1f501),
Emojicon.fromCodePoint(0x1f502),
Emojicon.fromCodePoint(0x1f195),
Emojicon.fromCodePoint(0x1f199),
Emojicon.fromCodePoint(0x1f192),
Emojicon.fromCodePoint(0x1f193),
Emojicon.fromCodePoint(0x1f196),
Emojicon.fromCodePoint(0x1f4f6),
Emojicon.fromCodePoint(0x1f3a6),
Emojicon.fromCodePoint(0x1f201),
Emojicon.fromCodePoint(0x1f22f),
Emojicon.fromCodePoint(0x1f233),
Emojicon.fromCodePoint(0x1f235),
Emojicon.fromCodePoint(0x1f234),
Emojicon.fromCodePoint(0x1f232),
Emojicon.fromCodePoint(0x1f250),
Emojicon.fromCodePoint(0x1f239),
Emojicon.fromCodePoint(0x1f23a),
Emojicon.fromCodePoint(0x1f236),
Emojicon.fromCodePoint(0x1f21a),
Emojicon.fromCodePoint(0x1f6bb),
Emojicon.fromCodePoint(0x1f6b9),
Emojicon.fromCodePoint(0x1f6ba),
Emojicon.fromCodePoint(0x1f6bc),
Emojicon.fromCodePoint(0x1f6be),
Emojicon.fromCodePoint(0x1f6b0),
Emojicon.fromCodePoint(0x1f6ae),
Emojicon.fromCodePoint(0x1f17f),
Emojicon.fromChar((char) 0x267f),
Emojicon.fromCodePoint(0x1f6ad),
Emojicon.fromCodePoint(0x1f237),
Emojicon.fromCodePoint(0x1f238),
Emojicon.fromCodePoint(0x1f202),
Emojicon.fromChar((char) 0x24c2),
Emojicon.fromCodePoint(0x1f6c2),
Emojicon.fromCodePoint(0x1f6c4),
Emojicon.fromCodePoint(0x1f6c5),
Emojicon.fromCodePoint(0x1f6c3),
Emojicon.fromCodePoint(0x1f251),
Emojicon.fromChar((char) 0x3299),
Emojicon.fromChar((char) 0x3297),
Emojicon.fromCodePoint(0x1f191),
Emojicon.fromCodePoint(0x1f198),
Emojicon.fromCodePoint(0x1f194),
Emojicon.fromCodePoint(0x1f6ab),
Emojicon.fromCodePoint(0x1f51e),
Emojicon.fromCodePoint(0x1f4f5),
Emojicon.fromCodePoint(0x1f6af),
Emojicon.fromCodePoint(0x1f6b1),
Emojicon.fromCodePoint(0x1f6b3),
Emojicon.fromCodePoint(0x1f6b7),
Emojicon.fromCodePoint(0x1f6b8),
Emojicon.fromChar((char) 0x26d4),
Emojicon.fromChar((char) 0x2733),
Emojicon.fromChar((char) 0x2747),
Emojicon.fromChar((char) 0x274e),
Emojicon.fromChar((char) 0x2705),
Emojicon.fromChar((char) 0x2734),
Emojicon.fromCodePoint(0x1f49f),
Emojicon.fromCodePoint(0x1f19a),
Emojicon.fromCodePoint(0x1f4f3),
Emojicon.fromCodePoint(0x1f4f4),
Emojicon.fromCodePoint(0x1f170),
Emojicon.fromCodePoint(0x1f171),
Emojicon.fromCodePoint(0x1f18e),
Emojicon.fromCodePoint(0x1f17e),
Emojicon.fromCodePoint(0x1f4a0),
Emojicon.fromChar((char) 0x27bf),
Emojicon.fromChar((char) 0x267b),
Emojicon.fromChar((char) 0x2648),
Emojicon.fromChar((char) 0x2649),
Emojicon.fromChar((char) 0x264a),
Emojicon.fromChar((char) 0x264b),
Emojicon.fromChar((char) 0x264c),
Emojicon.fromChar((char) 0x264d),
Emojicon.fromChar((char) 0x264e),
Emojicon.fromChar((char) 0x264f),
Emojicon.fromChar((char) 0x2650),
Emojicon.fromChar((char) 0x2651),
Emojicon.fromChar((char) 0x2652),
Emojicon.fromChar((char) 0x2653),
Emojicon.fromChar((char) 0x26ce),
Emojicon.fromCodePoint(0x1f52f),
Emojicon.fromCodePoint(0x1f3e7),
Emojicon.fromCodePoint(0x1f4b9),
Emojicon.fromCodePoint(0x1f4b2),
Emojicon.fromCodePoint(0x1f4b1),
// Emoji.fromChar((char)0x00a9),
// Emoji.fromChar((char)0x00ae),
Emojicon.fromChar((char) 0xe24e),
Emojicon.fromChar((char) 0xe24f),
Emojicon.fromChar((char) 0x2122),
Emojicon.fromChar((char) 0x274c),
Emojicon.fromChar((char) 0x203c),
Emojicon.fromChar((char) 0x2049),
Emojicon.fromChar((char) 0x2757),
Emojicon.fromChar((char) 0x2753),
Emojicon.fromChar((char) 0x2755),
Emojicon.fromChar((char) 0x2754),
Emojicon.fromChar((char) 0x2b55),
Emojicon.fromCodePoint(0x1f51d),
Emojicon.fromCodePoint(0x1f51a),
Emojicon.fromCodePoint(0x1f519),
Emojicon.fromCodePoint(0x1f51b),
Emojicon.fromCodePoint(0x1f51c),
Emojicon.fromCodePoint(0x1f503),
Emojicon.fromCodePoint(0x1f55b),
Emojicon.fromCodePoint(0x1f567),
Emojicon.fromCodePoint(0x1f550),
Emojicon.fromCodePoint(0x1f55c),
Emojicon.fromCodePoint(0x1f551),
Emojicon.fromCodePoint(0x1f55d),
Emojicon.fromCodePoint(0x1f552),
Emojicon.fromCodePoint(0x1f55e),
Emojicon.fromCodePoint(0x1f553),
Emojicon.fromCodePoint(0x1f55f),
Emojicon.fromCodePoint(0x1f554),
Emojicon.fromCodePoint(0x1f560),
Emojicon.fromCodePoint(0x1f555),
Emojicon.fromCodePoint(0x1f556),
Emojicon.fromCodePoint(0x1f557),
Emojicon.fromCodePoint(0x1f558),
Emojicon.fromCodePoint(0x1f559),
Emojicon.fromCodePoint(0x1f55a),
Emojicon.fromCodePoint(0x1f561),
Emojicon.fromCodePoint(0x1f562),
Emojicon.fromCodePoint(0x1f563),
Emojicon.fromCodePoint(0x1f564),
Emojicon.fromCodePoint(0x1f565),
Emojicon.fromCodePoint(0x1f566),
Emojicon.fromChar((char) 0x2716),
Emojicon.fromChar((char) 0x2795),
Emojicon.fromChar((char) 0x2796),
Emojicon.fromChar((char) 0x2797),
Emojicon.fromChar((char) 0x2660),
Emojicon.fromChar((char) 0x2665),
Emojicon.fromChar((char) 0x2663),
Emojicon.fromChar((char) 0x2666),
Emojicon.fromCodePoint(0x1f4ae),
Emojicon.fromCodePoint(0x1f4af),
Emojicon.fromChar((char) 0x2714),
Emojicon.fromChar((char) 0x2611),
Emojicon.fromCodePoint(0x1f518),
Emojicon.fromCodePoint(0x1f517),
Emojicon.fromChar((char) 0x27b0),
Emojicon.fromChar((char) 0x3030),
Emojicon.fromChar((char) 0x303d),
Emojicon.fromCodePoint(0x1f531),
Emojicon.fromChar((char) 0x25fc),
Emojicon.fromChar((char) 0x25fb),
Emojicon.fromChar((char) 0x25fe),
Emojicon.fromChar((char) 0x25fd),
Emojicon.fromChar((char) 0x25aa),
Emojicon.fromChar((char) 0x25ab),
Emojicon.fromCodePoint(0x1f53a),
Emojicon.fromCodePoint(0x1f532),
Emojicon.fromCodePoint(0x1f533),
Emojicon.fromChar((char) 0x26ab),
Emojicon.fromChar((char) 0x26aa),
Emojicon.fromCodePoint(0x1f534),
Emojicon.fromCodePoint(0x1f535),
Emojicon.fromCodePoint(0x1f53b),
Emojicon.fromChar((char) 0x2b1c),
Emojicon.fromChar((char) 0x2b1b),
Emojicon.fromCodePoint(0x1f536),
Emojicon.fromCodePoint(0x1f537),
Emojicon.fromCodePoint(0x1f538),
Emojicon.fromCodePoint(0x1f539),
};
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Some files were not shown because too many files have changed in this diff Show more