Compare commits
214 commits
Author | SHA1 | Date | |
---|---|---|---|
77be27479d | |||
c36157a451 | |||
cdceea6ffa | |||
ecff82fcd2 | |||
e52757ece1 | |||
abed1e64a1 | |||
f28d77dc42 | |||
83cbc2b33b | |||
|
5d21abac1d | ||
|
c26f907263 | ||
|
6fb7738757 | ||
|
f58407d0b8 | ||
|
59f47485cf | ||
|
cd0c6ce48e | ||
8fb6204288 | |||
|
bad1569136 | ||
|
2803cbda26 | ||
|
8b0ffd048e | ||
|
7d95bb6038 | ||
|
a2fe9f151a | ||
|
5fcd69c68b | ||
|
6d4a55a087 | ||
|
303a3a1621 | ||
|
1c983b3b0f | ||
|
cbec38f02d | ||
|
e429ba245e | ||
|
5a351d9c11 | ||
|
ccd352fa86 | ||
|
64049eb335 | ||
|
0c22f68aef | ||
c5e60b43b8 | |||
1e40764b20 | |||
|
a049aff638 | ||
|
4829c301e6 | ||
|
0af30b4aec | ||
|
d84151487e | ||
|
d2cafe58fa | ||
|
6a2c1a0dd5 | ||
|
3ac3917897 | ||
|
65c2822dac | ||
|
f24130321e | ||
|
c1069873ac | ||
|
3b6d3ee192 | ||
|
2028bb9b58 | ||
|
2f1ac5ad18 | ||
|
fb06783aa6 | ||
|
2168c73786 | ||
|
97749cd8f7 | ||
|
9f6fa1ce91 | ||
|
e98d999b94 | ||
|
9c87e2269c | ||
|
d38b3c2cf2 | ||
|
73084c9cd3 | ||
|
f7abd4237f | ||
3824eb172b | |||
|
cec1b0f1f8 | ||
|
72114d7324 | ||
|
899a39cbf7 | ||
|
e0219ae4ce | ||
|
362c00d31b | ||
|
0594e1f8f8 | ||
|
69145c02f2 | ||
|
d44debab67 | ||
|
424477dfbc | ||
|
1f40166b31 | ||
|
63a40ed65f | ||
|
34cd66e8e0 | ||
|
2a14176b80 | ||
|
732de65479 | ||
|
0e2cd3e142 | ||
|
d9af7dca54 | ||
|
203d72e963 | ||
|
7e44ff92d7 | ||
|
8644c4676a | ||
|
0fe5ce481f | ||
|
06398afd40 | ||
|
9b20223655 | ||
|
40afa7c9ee | ||
|
65be0f1b2d | ||
|
eb1cad39a6 | ||
|
2fb31bcc3f | ||
|
4f0061293e | ||
|
c26335f3e3 | ||
|
556697c47e | ||
|
dcf951e48e | ||
|
1c44fd8a4b | ||
|
9d0dedc6ce | ||
|
f49b979cbe | ||
|
8ed95d0595 | ||
|
74b7588e62 | ||
|
258732c9df | ||
|
3b1723dcf1 | ||
|
a745422300 | ||
|
aa6a2e1c18 | ||
|
eb5a7a5392 | ||
|
734511b0fa | ||
|
0086d5dc80 | ||
|
9265d6718e | ||
|
909dac7ac2 | ||
|
ca0d68224e | ||
|
96e6604d9e | ||
|
274a689dce | ||
|
b405ba7106 | ||
|
a0dcdf5c76 | ||
|
6fdc38911c | ||
|
9efc139835 | ||
|
2531c88f2c | ||
|
6bc277152a | ||
|
8838a50948 | ||
|
0575767152 | ||
|
b22d863c36 | ||
|
11659eadb0 | ||
|
389e3d4f0f | ||
|
7aed735df2 | ||
|
bdc211a67a | ||
|
57cfcefd52 | ||
|
01bfe0c59a | ||
|
85a25984f4 | ||
|
1d9b4e959d | ||
|
0a5a985cbe | ||
|
0759a78727 | ||
|
7435852acb | ||
|
464e084d28 | ||
|
e891f076f2 | ||
|
7206541a7b | ||
|
8c450d17a4 | ||
|
0265bd05bf | ||
|
383d1aa9e6 | ||
c3c42e415d | |||
b98478e57c | |||
5850cbcf9c | |||
|
1db6e6d5ea | ||
|
df05605f03 | ||
6f17b06ad0 | |||
|
dafb125a4f | ||
|
0e272042d5 | ||
|
52aa81e82e | ||
|
a3d62e6a10 | ||
|
38dfb6d6c7 | ||
|
6598759597 | ||
c103d37549 | |||
2dac6c8f36 | |||
ef0f8d4507 | |||
b4006541f3 | |||
075448f764 | |||
3eb1387299 | |||
b936af529f | |||
caefd38f96 | |||
9181767ac6 | |||
89b28a4965 | |||
0321ebb7a6 | |||
3be4dbf66a | |||
ea1debd8f7 | |||
b670609893 | |||
fe3a3c2471 | |||
cfefe9a0bd | |||
a76de90fe7 | |||
a9279c2001 | |||
|
79c585144d | ||
0ee1992da2 | |||
473f035355 | |||
|
b085643555 | ||
639babfdb5 | |||
8fd688ca96 | |||
|
553f41a2db | ||
|
a73ce32e27 | ||
|
1b5966ae3b | ||
|
a7121b51b8 | ||
|
b6584dfd0b | ||
|
7382e3af97 | ||
b3b4a2902e | |||
549810783c | |||
8932dd9fb3 | |||
516c343e8a | |||
12486e9a29 | |||
ae8a2467aa | |||
573bfed961 | |||
3ef609cfbd | |||
03bc7dcdc9 | |||
7405d50c70 | |||
56e695cf1b | |||
98c09f18a2 | |||
d64aa6407c | |||
cae106e310 | |||
972c65b775 | |||
fd5f36b864 | |||
|
deac0df707 | ||
|
17779e7700 | ||
82bfd8ac33 | |||
ae520c2957 | |||
94a669fcb8 | |||
3a814addab | |||
c829f612cd | |||
df63c14617 | |||
87e56b534a | |||
|
e17b75511e | ||
|
6220260df3 | ||
|
52ed924a13 | ||
|
75c5275f7e | ||
|
c8fe93cf0a | ||
|
20eae39557 | ||
|
980a84a6ce | ||
c67ed416a1 | |||
0f169e8dbe | |||
77c19f81dc | |||
aed8c64e54 | |||
|
46bbf1ce5f | ||
|
e8ca2a1ae3 | ||
|
5a860416b5 | ||
71bb1e90b0 | |||
|
0464a6a3fa | ||
95e2a53951 | |||
48717dd7d3 | |||
6e3e58e3c8 |
33
Conversations-Plus-ChangeLog.md
Normal file
|
@ -0,0 +1,33 @@
|
|||
###Conversations+ ChangeLog
|
||||
|
||||
####Version 0.0.6
|
||||
* Implements FS#111: Compress resized picture with PNG format
|
||||
* Fixes FS#107: Account can be edited while online
|
||||
* Implements FS#77: Open list of resources for own jid
|
||||
* Fixes FS#99: Adjust namespace according to XEP-0363
|
||||
* Fixes FS#95: NPE when opening message details for failed file transfer
|
||||
* Implements FS#89: Change about information
|
||||
* Implements FS#84: Setting for location to store received pictures
|
||||
* Implements FS#83: Reload from last received message
|
||||
* Fixes FS#82: Strange layout in share with activity
|
||||
* Fixes FS#81: Interactive message loading causes "jumps"
|
||||
* Implements FS#78: Allow installation on SD card
|
||||
* Implements FS#77: Open list of resources for own jid
|
||||
* Implements FS#76: Adapt notification icon to new logo
|
||||
* Fixes FS#75: Change color names to reasonable names
|
||||
* Fixes FS#70: Fixed Identity Strings
|
||||
* Implements FS#67: Display logcat within application
|
||||
* Implements FS#64: Show who wrote last message in conversation overview
|
||||
* Fixes FS#47: Setting "WLAN only" no longer works for received links
|
||||
* Implements FS#26: Introduce dialog to choose whether to send resized picture or original picture
|
||||
* Implements FS#24: Introduce setting for picture resizing
|
||||
* Implements FS#19: Received and Sent pictures are automatically stored in public picture folder
|
||||
* Partially implements FS#6: Change "Report bug to developer" - Reporting conference changed to c+bugs@conference.thedevstack.de
|
||||
|
||||
####Version 0.0.5
|
||||
* Fixes FS#73: Open list of resources while clicking on JID in contact details
|
||||
* Fixes FS#72: Open list of resources while long clicking on avatar in conversation overview
|
||||
* Fixes FS#66: Add option to popup menu to open message details
|
||||
* Fixes FS#65: Message Details
|
||||
* Fixes FS#56: Create new logo
|
||||
* Fixes FS#54: Add new options to message menu
|
10
ManualBuildForFdroid.md
Normal 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
|
382
README.md
|
@ -1,359 +1,31 @@
|
|||
# Conversations
|
||||
# Conversations+
|
||||
|
||||
Conversations: the very last word in instant messaging
|
||||
|
||||
[![Google Play](https://conversations.im/images/en-play-badge.png)](https://play.google.com/store/apps/details?id=eu.siacs.conversations&referrer=utm_source%3Dgithub) [![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)
|
||||
|
||||
## Design principles
|
||||
|
||||
* Be as beautiful and easy to use as possible without sacrificing security or
|
||||
privacy
|
||||
* Rely on existing, well established protocols (XMPP)
|
||||
* Do not require a Google Account or specifically Google Cloud Messaging (GCM)
|
||||
* Require as few permissions as possible
|
||||
Conversations+: the improved version of [Conversations](https://github.com/siacs/Conversations/)
|
||||
|
||||
## Features
|
||||
|
||||
* End-to-end encryption with [OMEMO](http://conversations.im/omemo/), [OTR](https://otr.cypherpunks.ca/), or [OpenPGP](http://www.openpgp.org/about_openpgp/)
|
||||
* 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&referrer=utm_source%3Dgithub)
|
||||
* Indication when your contact has read your message
|
||||
* Intuitive UI that follows Android Design guidelines
|
||||
* Pictures / Avatars for your Contacts
|
||||
* Syncs with desktop client
|
||||
* Conferences (with support for bookmarks)
|
||||
* Address book integration
|
||||
* Multiple accounts / unified inbox
|
||||
* Very low impact on battery life
|
||||
|
||||
|
||||
### XMPP Features
|
||||
|
||||
Conversations works with every XMPP server out there. However XMPP is an
|
||||
extensible protocol. These extensions are standardized as well in so called
|
||||
XEP's. Conversations supports a couple of these to make the overall user
|
||||
experience better. There is a chance that your current XMPP server does not
|
||||
support these extensions; therefore to get the most out of Conversations you
|
||||
should consider either switching to an XMPP server that does or — even better —
|
||||
run your own XMPP server for you and your friends. These XEP's are:
|
||||
|
||||
* [XEP-0065: SOCKS5 Bytestreams](http://xmpp.org/extensions/xep-0065.html) (or mod_proxy65). Will be used to transfer
|
||||
files if both parties are behind a firewall (NAT).
|
||||
* [XEP-0163: Personal Eventing Protocol](http://xmpp.org/extensions/xep-0163.html) for avatars and OMEMO.
|
||||
* [XEP-0191: Blocking command](http://xmpp.org/extensions/xep-0191.html) lets you blacklist spammers or block contacts
|
||||
without removing them from your roster.
|
||||
* [XEP-0198: Stream Management](http://xmpp.org/extensions/xep-0198.html) allows XMPP to survive small network outages and
|
||||
changes of the underlying TCP connection.
|
||||
* [XEP-0280: Message Carbons](http://xmpp.org/extensions/xep-0280.html) which automatically syncs the messages you send to
|
||||
your desktop client and thus allows you to switch seamlessly from your mobile
|
||||
client to your desktop client and back within one conversation.
|
||||
* [XEP-0237: Roster Versioning](http://xmpp.org/extensions/xep-0237.html) mainly to save bandwidth on poor mobile connections
|
||||
* [XEP-0313: Message Archive Management](http://xmpp.org/extensions/xep-0313.html) synchronize message history with the
|
||||
server. Catch up with messages that were sent while Conversations was
|
||||
offline.
|
||||
* [XEP-0352: Client State Indication](http://xmpp.org/extensions/xep-0352.html) lets the server know whether or not
|
||||
Conversations is in the background. Allows the server to save bandwidth by
|
||||
withholding unimportant packages.
|
||||
* [XEP-0363: HTTP File Upload](http://xmpp.org/extensions/xep-0363.html) allows you to share files in conferences and with offline
|
||||
contacts. Requires an [additional component](https://github.com/siacs/HttpUploadComponent)
|
||||
on your server. Alternatively, an [Ejabberd contrib-module](https://github.com/processone/ejabberd-contrib/tree/master/mod_http_upload) and a [Prosody module](http://modules.prosody.im/mod_http_upload.html) are available.
|
||||
|
||||
## Team
|
||||
|
||||
#### Head of Development
|
||||
|
||||
* [Daniel Gultsch](https://github.com/inputmice)
|
||||
|
||||
#### Code Contributions
|
||||
|
||||
(In order of appearance)
|
||||
|
||||
* [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)
|
||||
* [Diego Turtulici](http://efesto.eigenlab.org/~diesys) (Original)
|
||||
* [fiaxh](https://github.com/fiaxh) (OMEMO)
|
||||
|
||||
#### Translations
|
||||
Translations are managed on [Transifex](https://www.transifex.com/projects/p/conversations/)
|
||||
|
||||
## FAQ
|
||||
|
||||
### General
|
||||
|
||||
#### How do I install Conversations?
|
||||
|
||||
Conversations is entirely open source and licensed under GPLv3. So if you are a
|
||||
software developer you can check out the sources from GitHub and use Gradle to
|
||||
build your apk file.
|
||||
|
||||
The more convenient way — which not only gives you automatic updates but also
|
||||
supports the further development of Conversations — is to buy the App in the
|
||||
Google [Play Store](https://play.google.com/store/apps/details?id=eu.siacs.conversations&referrer=utm_source%3Dgithub).
|
||||
|
||||
Buying the App from the Play Store will also give you access to our [beta test](#beta).
|
||||
|
||||
#### I don't have a Google Account but I would still like to make a contribution
|
||||
|
||||
I accept donations over PayPal, Bitcoin and Flattr. For donations via PayPal you
|
||||
can use the email address `donate@siacs.eu` or the button below.
|
||||
|
||||
[![Donate with PayPal](https://www.paypalobjects.com/en_US/i/btn/btn_donate_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=CW3SYT3KG5PDL)
|
||||
|
||||
**Disclaimer:** I'm not a huge fan of PayPal and their business policies. For
|
||||
larger contributions please get in touch with me beforehand and we can talk
|
||||
about bank transfer (SEPA).
|
||||
|
||||
My Bitcoin Address is: `1NxSU1YxYzJVDpX1rcESAA3NJki7kRgeeu`
|
||||
|
||||
|
||||
[![Flattr this!](http://api.flattr.com/button/flattr-badge-large.png)](https://flattr.com/submit/auto?user_id=inputmice&url=http%3A%2F%2Fconversations.siacs.eu&title=Conversations&tags=github&category=software)
|
||||
|
||||
#### How do I create an account?
|
||||
|
||||
XMPP, like email, is a federated protocol which means that there is not one
|
||||
company you can create an 'official XMPP account' with. Instead there are
|
||||
hundreds, or even thousands, of provider out there. To find one use a web search
|
||||
engine of your choice. Or maybe your university has one. Or you can run your
|
||||
own. Or ask a friend to run one. Once you've found one, you can use
|
||||
Conversations to create an account. Just select 'register new account on server'
|
||||
within the create account dialog.
|
||||
|
||||
#### Where can I set up a custom hostname / port
|
||||
Conversations will automatically look up the SRV records for your domain name
|
||||
which can point to any hostname port combination. If your server doesn’t provide
|
||||
those please contact your admin and have them read
|
||||
[this](http://prosody.im/doc/dns#srv_records). If your server operator is unwilling
|
||||
to fix this you can enable advanced server settings in the expert settings of
|
||||
Conversations.
|
||||
|
||||
#### I get 'Incompatible Server'
|
||||
|
||||
As regular user you should be picking a different server. The server you selected
|
||||
is probably insecure and/or very old.
|
||||
|
||||
If you are a server administrator you should make sure that your server provides
|
||||
STARTTLS. XMPP over TLS (on a different port) is not sufficient.
|
||||
|
||||
On rare occasions this error message might also be caused by a server not providing
|
||||
a login (SASL) mechanism that Conversations is able to handle. Conversations supports
|
||||
SCRAM-SHA1, PLAIN, EXTERNAL (client certs) and DIGEST-MD5.
|
||||
|
||||
#### How do XEP-0357: Push Notifications work?
|
||||
You need to be running the Play Store version of Conversations and your server needs to support push notifications.¹ Because *Google Cloud Notifications (GCM)* are tied with an API key to a specific app your server can not initiate the push message directly. Instead your server will send the push notification to the Conversations App server (operated by us) which then acts as a proxy and initiates the push message for you. The push message sent from our App server through GCM doesn’t contain any personal information. It is just an empty message which will wake up your device and tell Conversations to reconnect to your server. The information send from your server to our App server depends on the configuration of your server but can be limited to your account name. (In any case the Conversations App server won't redirect any information through GCM even if your server sends this information.)
|
||||
|
||||
In summary Google will never get hold of any personal information besides that *something* happened. (Which doesn’t even have to be a message but can be some automated event as well.) We - as the operator of the App server - will just get hold of your account name (without being able to tie this to your specific device).
|
||||
|
||||
If you don’t want this simply pick a server which does not offer Push Notifications or build Conversations yourself without support for push notifications. (This is available via a gradle build flavor.) Non-play store source of Conversations like the Amazon App store will also offer a version without push notifications. Conversations will just work as before and maintain its own TCP connection in the background.
|
||||
|
||||
¹ Your server only needs to support the server side of [XEP-0357: Push Notifications](http://xmpp.org/extensions/xep-0357.html). If you use the Play Store version you do **not** need to run your own app server. The server modules are called *mod_cloud_notify* on Prosody and *mod_push* on ejabberd.
|
||||
|
||||
#### Conversations doesn't work for me. Where can I get help?
|
||||
|
||||
You can join our conference room on `conversations@conference.siacs.eu`.
|
||||
A lot of people in there are able to answer basic questions about the usage of
|
||||
Conversations or can provide you with tips on running your own XMPP server. If
|
||||
you found a bug or your app crashes please read the Developer / Report Bugs
|
||||
section of this document.
|
||||
|
||||
#### I need professional support with Conversations or setting up my server
|
||||
|
||||
I'm available for hire. Contact me at `inputmice@siacs.eu`.
|
||||
|
||||
#### How does the address book integration work?
|
||||
|
||||
The address book integration was designed to protect your privacy. Conversations
|
||||
neither uploads contacts from your address book to your server nor fills your
|
||||
address book with unnecessary contacts from your online roster. If you manually
|
||||
add a Jabber ID to your phones address book Conversations will use the name and
|
||||
the profile picture of this contact. To make the process of adding Jabber IDs to
|
||||
your address book easier you can click on the profile picture in the contact
|
||||
details within Conversations. This will start an "add to address book" intent
|
||||
with the JID as the payload. This doesn't require Conversations to have write
|
||||
permissions on your address book but also doesn't require you to copy/paste a
|
||||
JID from one app to another.
|
||||
|
||||
#### I get 'delivery failed' on my messages
|
||||
|
||||
If you get delivery failed on images it's probably because the recipient lost
|
||||
network connectivity during reception. In that case you can try it again at a
|
||||
later time.
|
||||
|
||||
For text messages the answer to your question is a little bit more complex.
|
||||
When you see 'delivery failed' on text messages, it is always something that is
|
||||
being reported by the server. The most common reason for this is that the
|
||||
recipient failed to resume a connection. When a client loses connectivity for a
|
||||
short time the client usually has a five minute window to pick up that
|
||||
connection again. When the client fails to do so because the network
|
||||
connectivity is out for longer than that all messages sent to that client will
|
||||
be returned to the sender resulting in a delivery failed.
|
||||
|
||||
Other less common reasons are that the message you sent didn't meet some
|
||||
criteria enforced by the server (too large, too many). Another reason could be
|
||||
that the recipient is offline and the server doesn't provide offline storage.
|
||||
|
||||
Usually you are able to distinguish between these two groups in the fact that
|
||||
the first one happens always after some time and the second one happens almost
|
||||
instantly.
|
||||
|
||||
#### Where can I see the status of my contacts? How can I set a status or priority?
|
||||
|
||||
Statuses are a horrible metric. Setting them manually to a proper value rarely
|
||||
works because users are either lazy or just forget about them. Setting them
|
||||
automatically does not provide quality results either. Keyboard or mouse
|
||||
activity as indicator for example fails when the user is just looking at
|
||||
something (reading an article, watching a movie). Furthermore automatic setting
|
||||
of status always implies an impact on your privacy (are you sure you want
|
||||
everybody in your contact list to know that you have been using your computer at
|
||||
4am‽).
|
||||
|
||||
In the past status has been used to judge the likelihood of whether or not your
|
||||
messages are being read. This is no longer necessary. With Chat Markers
|
||||
(XEP-0333, supported by Conversations since 0.4) we have the ability to **know**
|
||||
whether or not your messages are being read. Similar things can be said for
|
||||
priorities. In the past priorities have been used (by servers, not by clients!)
|
||||
to route your messages to one specific client. With carbon messages (XEP-0280,
|
||||
supported by Conversations since 0.1) this is no longer necessary. Using
|
||||
priorities to route OTR messages isn't practical either because they are not
|
||||
changeable on the fly. Metrics like last active client (the client which sent
|
||||
the last message) are much better.
|
||||
|
||||
Unfortunately these modern replacements for legacy XMPP features are not widely
|
||||
adopted. However Conversations should be an instant messenger for the future and
|
||||
instead of making Conversations compatible with the past we should work on
|
||||
implementing new, improved technologies and getting them into other XMPP clients
|
||||
as well.
|
||||
|
||||
Making these status and priority optional isn't a solution either because
|
||||
Conversations is trying to get rid of old behaviours and set an example for
|
||||
other clients.
|
||||
|
||||
#### Conversations is missing a certain feature
|
||||
|
||||
I'm open for new feature suggestions. You can use the [issue tracker][issues] on
|
||||
GitHub. Please take some time to browse through the issues to see if someone
|
||||
else already suggested it. Be assured that I read each and every ticket. If I
|
||||
like it I will leave it open until it's implemented. If I don't like it I will
|
||||
close it (usually with a short comment). If I don't comment on an feature
|
||||
request that's probably a good sign because this means I agree with you.
|
||||
Commenting with +1 on either open or closed issues won't change my mind, nor
|
||||
will it accelerate the development.
|
||||
|
||||
#### You closed my feature request but I want it really really badly
|
||||
|
||||
Just write it yourself and send me a pull request. If I like it I will happily
|
||||
merge it if I don't at least you and like minded people get to enjoy it.
|
||||
|
||||
#### I need a feature and I need it now!
|
||||
|
||||
I am available for hire. Contact me via XMPP: `inputmice@siacs.eu`
|
||||
|
||||
### Security
|
||||
|
||||
#### Why are there three end-to-end encryption methods and which one should I choose?
|
||||
|
||||
In most cases OTR should be the encryption method of choice. It works out of the box with most contacts as long as they are online. However, openPGP can, in some cases, (message carbons to multiple clients) be more flexible. Unlike OTR, OMEMO works even when a contact is offline, and works with multiple devices. It also allows asynchronous file-transfer when the server has [HTTP File Upload](http://xmpp.org/extensions/xep-0363.html). However, OMEMO is not as widely supported as OTR and is currently implemented only by Conversations. OMEMO should be preferred over OTR for contacts who use Conversations.
|
||||
|
||||
#### How do I use OpenPGP
|
||||
|
||||
Before you continue reading you should note that the OpenPGP support in
|
||||
Conversations is experimental. This is not because it will make the app unstable
|
||||
but because the fundamental concepts of PGP aren't ready for widespread use.
|
||||
The way PGP works is that you trust Key IDs instead of JID's or email addresses.
|
||||
So in theory your contact list should consist of Public-Key-IDs instead of
|
||||
JID's. But of course no email or XMPP client out there implements these
|
||||
concepts. Plus PGP in the context of instant messaging has a couple of
|
||||
downsides: It is vulnerable to replay attacks, it is rather verbose, and
|
||||
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](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?
|
||||
|
||||
For conferences the only supported encryption method is OpenPGP (OTR does not
|
||||
work with multiple participants). Every participant has to announce their
|
||||
OpenPGP key (see answer above). If you would like to send encrypted messages to
|
||||
a conference you have to make sure that you have every participant's public key
|
||||
in your OpenKeychain. Right now there is no check in Conversations to ensure
|
||||
that. You have to take care of that yourself. Go to the conference details and
|
||||
touch every key id (The hexadecimal number below a contact). This will send you
|
||||
to OpenKeychain which will assist you on adding the key. This works best in
|
||||
very small conferences with contacts you are already using OpenPGP with. This
|
||||
feature is regarded experimental. Conversations is the only client that uses
|
||||
XEP-0027 with conferences. (The XEP neither specifically allows nor disallows
|
||||
this.)
|
||||
|
||||
### Development
|
||||
|
||||
<a name="beta"></a>
|
||||
#### Beta testing
|
||||
If you bought the App on [Google Play](https://play.google.com/store/apps/details?id=eu.siacs.conversations)
|
||||
you can get access to the latest beta version by joining the
|
||||
[Conversations Beta Testers](https://plus.google.com/communities/107649347599361240873)
|
||||
community on Google+ and then using [this link](https://play.google.com/apps/testing/eu.siacs.conversations)
|
||||
to sign up for the beta test.
|
||||
|
||||
#### How do I build Conversations
|
||||
|
||||
Make sure to have ANDROID_HOME point to your Android SDK. Use the Android SDK Manager to install missing dependencies.
|
||||
|
||||
git clone https://github.com/siacs/Conversations.git
|
||||
cd Conversations
|
||||
./gradlew assembleFreeRelease
|
||||
|
||||
There are two build flavors available. *free* and *playstore*. Unless you know what you are doing you only need *free*.
|
||||
|
||||
|
||||
[![Build Status](https://travis-ci.org/siacs/Conversations.svg?branch=development)](https://travis-ci.org/siacs/Conversations)
|
||||
|
||||
### How do I update/add external libraries?
|
||||
|
||||
If the library you want to update is in Maven Central or JCenter (or has its own
|
||||
Maven repo), add it or update its version in `build.gradle`. If the library is
|
||||
in the `libs/` directory, you can update it using a subtree merge by doing the
|
||||
following (using `minidns` as an example):
|
||||
|
||||
git remote add minidns https://github.com/rtreffer/minidns.git
|
||||
git fetch minidns
|
||||
git merge -s subtree minidns master
|
||||
|
||||
To add a new dependency to the `libs/` directory (replacing "name", "branch" and
|
||||
"url" as necessary):
|
||||
|
||||
git remote add name url
|
||||
git merge -s ours --no-commit name/branch
|
||||
git read-tree --prefix=libs/name -u name/branch
|
||||
git commit -m "Subtree merged in name"
|
||||
|
||||
#### How do I debug Conversations
|
||||
|
||||
If something goes wrong Conversations usually exposes very little information in
|
||||
the UI (other than the fact that something didn't work). However with adb
|
||||
(android debug bridge) you squeeze some more information out of Conversations.
|
||||
These information are especially useful if you are experiencing trouble with
|
||||
your connection or with file transfer.
|
||||
|
||||
adb -d logcat -v time -s conversations
|
||||
|
||||
#### I found a bug
|
||||
|
||||
Please report it to our [issue tracker][issues]. If your app crashes please
|
||||
provide a stack trace. If you are experiencing misbehavior please provide
|
||||
detailed steps to reproduce. Always mention whether you are running the latest
|
||||
Play Store version or the current HEAD. If you are having problems connecting to
|
||||
your XMPP server your file transfer doesn’t work as expected please always
|
||||
include a logcat debug output with your issue (see above).
|
||||
|
||||
[issues]: https://github.com/siacs/Conversations/issues
|
||||
Of course Conversations+ supports [all features of Conversations](https://github.com/siacs/Conversations/#features) and in addition:
|
||||
|
||||
* smileys like Whatsapp
|
||||
* change of LED notification color
|
||||
* online status in contact and conversation list
|
||||
* Manual loading of last messages from MAM
|
||||
* Sending of original images
|
||||
* Show list of online resources per contact and for the own account
|
||||
* Message details dialog
|
||||
* Indication who wrote last message in a conversation
|
||||
|
||||
## Modifications
|
||||
|
||||
* unread count badges take care of setting "Conference notifications"
|
||||
* swipe to end conversation only in one direction
|
||||
* replace ASCII-smileys
|
||||
* Swipe to refresh for loading archived messages using MAM
|
||||
* settings
|
||||
* confirmation for received and/or read messages
|
||||
* automatically download picture links
|
||||
* automatically download only when wifi enabled
|
||||
* sending original or resized images
|
||||
* Removed hard coded tor support
|
||||
* Removed support for last message correction (XEP-0308)
|
||||
* bugfixes and code improvements
|
10
TODO
Normal 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
|
447
art/conversations_plus_baloons.svg
Normal file
|
@ -0,0 +1,447 @@
|
|||
<?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:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="512"
|
||||
height="512"
|
||||
id="svg2"
|
||||
version="1.1"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="conversations_plus_baloons.svg"
|
||||
inkscape:export-filename="/home/diesys/diesys/grafica/conversation/conversation_bubble.png"
|
||||
inkscape:export-xdpi="100"
|
||||
inkscape:export-ydpi="100">
|
||||
<defs
|
||||
id="defs4">
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient3874">
|
||||
<stop
|
||||
style="stop-color:#00a000;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3876" />
|
||||
<stop
|
||||
style="stop-color:#00a000;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop3878" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient3913">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3915" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop3917" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient3818">
|
||||
<stop
|
||||
style="stop-color:#669900;stop-opacity:1"
|
||||
offset="0"
|
||||
id="stop3820" />
|
||||
<stop
|
||||
style="stop-color:#99cc00;stop-opacity:1"
|
||||
offset="1"
|
||||
id="stop3822" />
|
||||
</linearGradient>
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3818"
|
||||
id="radialGradient3824"
|
||||
cx="212.07048"
|
||||
cy="1045.9178"
|
||||
fx="212.07048"
|
||||
fy="1045.9178"
|
||||
r="238.57143"
|
||||
gradientTransform="matrix(1.9491621,-0.90817722,0.65829208,1.4128498,-879.63121,-248.98648)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3913"
|
||||
id="radialGradient3919"
|
||||
cx="362.98563"
|
||||
cy="379.77524"
|
||||
fx="362.98563"
|
||||
fy="379.77524"
|
||||
r="139.95312"
|
||||
gradientTransform="matrix(1.3800477,1.0445431,-1.3325077,1.7605059,339.09383,-577.83938)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
gradientUnits="userSpaceOnUse"
|
||||
y2="-155.75885"
|
||||
x2="114.59022"
|
||||
y1="35.545681"
|
||||
x1="114.55434"
|
||||
id="linearGradient3794"
|
||||
xlink:href="#linearGradient3788"
|
||||
inkscape:collect="always" />
|
||||
<linearGradient
|
||||
id="linearGradient3788">
|
||||
<stop
|
||||
id="stop3790"
|
||||
offset="0"
|
||||
style="stop-color:#1eed00;stop-opacity:1;" />
|
||||
<stop
|
||||
id="stop3792"
|
||||
offset="1"
|
||||
style="stop-color:#abff28;stop-opacity:1;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient3821">
|
||||
<stop
|
||||
style="stop-color:#ff283d;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3823" />
|
||||
<stop
|
||||
style="stop-color:#ff28ae;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop3825" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient4543">
|
||||
<stop
|
||||
style="stop-color:#2e45bf;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop4545" />
|
||||
<stop
|
||||
style="stop-color:#28a7ff;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop4547" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient4098">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop4100" />
|
||||
<stop
|
||||
style="stop-color:#e6e6e6;stop-opacity:1"
|
||||
offset="1"
|
||||
id="stop4102" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4098"
|
||||
id="linearGradient3833"
|
||||
x1="273.81851"
|
||||
y1="764.74677"
|
||||
x2="304.14023"
|
||||
y2="936.47272"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4098"
|
||||
id="linearGradient3853"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="273.81851"
|
||||
y1="764.74677"
|
||||
x2="304.14023"
|
||||
y2="936.47272" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3818"
|
||||
id="radialGradient3863"
|
||||
cx="262.33273"
|
||||
cy="945.23846"
|
||||
fx="262.33273"
|
||||
fy="945.23846"
|
||||
r="185.49754"
|
||||
gradientTransform="matrix(1.2253203,-0.54206726,0.43090148,0.97403458,-466.4135,170.11831)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3818"
|
||||
id="radialGradient3866"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.2253203,-0.54206726,0.43090148,0.97403458,-466.4135,170.11831)"
|
||||
cx="262.33273"
|
||||
cy="945.23846"
|
||||
fx="262.33273"
|
||||
fy="945.23846"
|
||||
r="185.49754" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3913"
|
||||
id="radialGradient3873"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.3800477,1.0445431,-1.3325077,1.7605059,339.09383,-577.83938)"
|
||||
cx="321.75275"
|
||||
cy="386.38751"
|
||||
fx="321.75275"
|
||||
fy="386.38751"
|
||||
r="139.95312" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3818"
|
||||
id="radialGradient3880"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.2253203,-0.54206726,0.43090148,0.97403458,-466.4135,-370.24387)"
|
||||
cx="262.33273"
|
||||
cy="945.23846"
|
||||
fx="262.33273"
|
||||
fy="945.23846"
|
||||
r="185.49754" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3913"
|
||||
id="radialGradient3883"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.1091694,-0.44385763,0.39005536,0.79756286,-331.32325,189.97334)"
|
||||
cx="262.33273"
|
||||
cy="945.23846"
|
||||
fx="262.33273"
|
||||
fy="945.23846"
|
||||
r="185.49754" />
|
||||
<filter
|
||||
inkscape:collect="always"
|
||||
id="filter3895">
|
||||
<feGaussianBlur
|
||||
inkscape:collect="always"
|
||||
stdDeviation="2.0013623"
|
||||
id="feGaussianBlur3897" />
|
||||
</filter>
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3874"
|
||||
id="radialGradient3881"
|
||||
cx="150.35715"
|
||||
cy="236.28571"
|
||||
fx="150.35715"
|
||||
fy="236.28571"
|
||||
r="26.887305"
|
||||
gradientTransform="matrix(1,0,0,0.98671703,0,3.1385771)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3913"
|
||||
id="radialGradient3883-8"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(-0.94668007,-0.41802431,-0.33291364,0.75114325,727.90951,-151.09719)"
|
||||
cx="262.33273"
|
||||
cy="945.23846"
|
||||
fx="262.33273"
|
||||
fy="945.23846"
|
||||
r="185.49754" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="0.7071068"
|
||||
inkscape:cx="-63.341475"
|
||||
inkscape:cy="288.28557"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
inkscape:window-width="1366"
|
||||
inkscape:window-height="684"
|
||||
inkscape:window-x="-8"
|
||||
inkscape:window-y="-8"
|
||||
inkscape:window-maximized="1"
|
||||
showguides="true"
|
||||
inkscape:guide-bbox="true"
|
||||
inkscape:snap-to-guides="true"
|
||||
inkscape:snap-grids="false"
|
||||
inkscape:object-paths="true"
|
||||
inkscape:object-nodes="false"
|
||||
inkscape:snap-nodes="false">
|
||||
<sodipodi:guide
|
||||
orientation="1,0"
|
||||
position="0,534.28571"
|
||||
id="guide3004" />
|
||||
<sodipodi:guide
|
||||
orientation="0,1"
|
||||
position="394.28571,511.42857"
|
||||
id="guide3006" />
|
||||
<sodipodi:guide
|
||||
orientation="1,0"
|
||||
position="511.42857,320"
|
||||
id="guide3008" />
|
||||
<sodipodi:guide
|
||||
orientation="0,1"
|
||||
position="401.42857,0"
|
||||
id="guide3010" />
|
||||
<sodipodi:guide
|
||||
orientation="1,0"
|
||||
position="17.142857,258.57143"
|
||||
id="guide3012" />
|
||||
<sodipodi:guide
|
||||
orientation="0,1"
|
||||
position="327.14286,494.28571"
|
||||
id="guide3014" />
|
||||
<sodipodi:guide
|
||||
orientation="0,1"
|
||||
position="324.28571,17.142857"
|
||||
id="guide3016" />
|
||||
<sodipodi:guide
|
||||
orientation="1,0"
|
||||
position="494.28571,237.14286"
|
||||
id="guide3018" />
|
||||
<sodipodi:guide
|
||||
orientation="1,0"
|
||||
position="255.71429,302.85714"
|
||||
id="guide3022" />
|
||||
<sodipodi:guide
|
||||
orientation="1,0"
|
||||
position="660,-315"
|
||||
id="guide3904" />
|
||||
<sodipodi:guide
|
||||
orientation="0,1"
|
||||
position="554.28571,475.71429"
|
||||
id="guide3931" />
|
||||
<sodipodi:guide
|
||||
orientation="0,1"
|
||||
position="581.42857,244.28571"
|
||||
id="guide3933" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata7">
|
||||
<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>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(0,-540.36218)"
|
||||
style="display:inline">
|
||||
<path
|
||||
d="m 253.34375,605.76562 c -107.90463,0 -195.953125,85.87684 -195.953125,191.85938 0,105.98253 88.043415,191.92187 195.953125,191.92188 33.56396,0 59.43822,-6.90343 88.98047,-17.63672 l 93.80664,37.80274 a 12.359798,12.359798 0 0 0 16.61719,-14.4297 L 427.35352,892.57031 c 16.32005,-28.65755 21.9121,-61.28733 21.9121,-94.94531 0,-105.97994 -88.0172,-191.85938 -195.92187,-191.85938 z"
|
||||
id="path3885"
|
||||
style="opacity:0.6;fill:#000000;fill-opacity:1;stroke:none;filter:url(#filter3895)"
|
||||
inkscape:original="M 253.34375 618.125 C 151.96941 618.125 69.75 698.4746 69.75 797.625 C 69.75 896.77539 151.96941 977.1875 253.34375 977.1875 C 287.00054 977.1875 311.5728 970.27778 342.65625 958.71875 L 440.75 998.25 L 414.1875 890.8125 C 431.0772 863.65332 436.90625 831.73711 436.90625 797.625 C 436.90625 698.4746 354.71813 618.125 253.34375 618.125 z "
|
||||
inkscape:radius="12.358562"
|
||||
sodipodi:type="inkscape:offset"
|
||||
transform="matrix(0.90520781,0,0,0.81882383,90.877888,53.951708)" />
|
||||
<path
|
||||
sodipodi:type="inkscape:offset"
|
||||
inkscape:radius="12.358562"
|
||||
inkscape:original="M 253.34375 618.125 C 151.96941 618.125 69.75 698.4746 69.75 797.625 C 69.75 896.77539 151.96941 977.1875 253.34375 977.1875 C 287.00054 977.1875 311.5728 970.27778 342.65625 958.71875 L 440.75 998.25 L 414.1875 890.8125 C 431.0772 863.65332 436.90625 831.73711 436.90625 797.625 C 436.90625 698.4746 354.71813 618.125 253.34375 618.125 z "
|
||||
style="fill:#0066ff;fill-opacity:1;stroke:none"
|
||||
id="path3868"
|
||||
d="m 253.34375,605.76562 c -107.90463,0 -195.953125,85.87684 -195.953125,191.85938 0,105.98253 88.043415,191.92187 195.953125,191.92188 33.56396,0 59.43822,-6.90343 88.98047,-17.63672 l 93.80664,37.80274 a 12.359798,12.359798 0 0 0 16.61719,-14.4297 L 427.35352,892.57031 c 16.32005,-28.65755 21.9121,-61.28733 21.9121,-94.94531 0,-105.97994 -88.0172,-191.85938 -195.92187,-191.85938 z"
|
||||
transform="matrix(0.90520781,0,0,0.81882383,90.877888,50.676388)" />
|
||||
<path
|
||||
style="opacity:0.19211821;fill:url(#radialGradient3883);fill-opacity:1;stroke:none"
|
||||
d="m 465.37929,645.95092 c -99.66655,0 -180.44749,71.72047 -180.44749,160.18241 0,18.66021 3.60043,36.57544 10.21189,53.2232 8.1887,1.03054 16.56083,1.56103 25.06293,1.56103 30.37749,0 53.79867,-5.64549 80.53519,-14.43157 l 84.91981,30.96145 a 11.188184,10.120499 0 0 0 15.04907,-11.82159 l -22.99792,-84.08283 c 14.78214,-23.46997 19.8297,-50.19542 19.8297,-77.76269 0,-20.04753 -4.25121,-39.20586 -11.994,-56.83149 -6.62195,-0.65358 -13.3526,-0.99792 -20.16918,-0.99792 z"
|
||||
id="path3878"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
sodipodi:nodetypes="ccsssscc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path3845"
|
||||
d="m 493.47738,871.35334 -24.04389,-87.99322 c 15.28869,-22.23857 20.55595,-48.35175 20.55595,-76.28358 0,-81.18671 -74.40499,-146.97946 -166.16989,-146.97946 -91.76484,0 -166.16981,65.79275 -166.16981,146.97946 0,81.18672 74.40497,147.02794 166.16981,147.02794 30.46639,0 52.72061,-5.65874 80.85763,-15.12352 z"
|
||||
style="opacity:0;fill:none;stroke:#000000;stroke-width:17.21866226;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:68.87464583, 68.87464583;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path3855"
|
||||
d="m 320.17833,548.76674 c -4.13827,-9.4e-4 -8.25632,0.0605 -9.81586,0.15351 -12.92075,0.76954 -22.81917,2.12193 -34.11502,4.70824 -4.34132,0.99402 -7.66199,1.87532 -11.68283,3.07059 -2.5677,0.76329 -6.47023,1.98325 -6.6759,2.09824 -0.0631,0.0352 2.55734,6.48362 6.13843,15.14825 0.0358,0.0868 0.13111,0.0961 0.2546,0.0511 0.85568,-0.31146 4.96317,-1.59671 6.87391,-2.14942 16.44697,-4.75734 33.78787,-7.08565 50.97451,-6.85765 2.42028,0.0321 5.48294,0.11062 6.78907,0.17914 1.30611,0.0686 2.39944,0.10688 2.43274,0.0767 0.0526,-0.0476 1.17785,-16.13384 1.13152,-16.1718 -0.01,-0.008 -1.08429,-0.0761 -2.40448,-0.15351 -1.60409,-0.0941 -5.76244,-0.15187 -9.90069,-0.15351 z m 85.17439,19.57499 c -0.0778,0.0759 -8.57119,14.09759 -8.57119,14.15032 0,0.0128 0.38971,0.21991 0.8769,0.46056 6.4421,3.18205 13.4978,7.39333 19.91497,11.84882 2.48679,1.7266 4.87769,3.48988 7.09982,5.24414 3.2378,2.55607 6.46633,5.33835 9.55245,8.21414 4.9072,4.57277 9.45432,9.38196 13.10605,13.89411 0.50173,0.62001 0.608,0.70303 0.79207,0.58852 0.87167,-0.54223 14.14115,-9.56974 14.14386,-9.62116 0.004,-0.0695 -2.56391,-3.14501 -3.64912,-4.37562 -4.33822,-4.91937 -8.14593,-8.7511 -13.26695,-13.38263 -6.3529,-5.74565 -12.40806,-10.50897 -19.23603,-15.09142 -1.9729,-1.32405 -4.01031,-2.63303 -6.13807,-3.94623 -5.07411,-3.13161 -14.3826,-8.21954 -14.62476,-7.98355 z m -211.19629,27.76323 -1.86699,1.79122 c -16.58679,15.77185 -29.26131,34.2146 -37.25495,54.24707 -0.39127,0.98058 -0.7358,1.85972 -0.76377,1.97029 -0.0367,0.14529 2.27287,0.91046 8.2883,2.73794 4.57858,1.39099 8.39743,2.52833 8.48633,2.53327 0.0889,0.005 0.70476,-1.35221 1.3861,-3.01945 6.99352,-17.11289 17.82285,-32.84295 32.02173,-46.51941 l 2.34786,-2.27736 -6.30817,-5.73177 z m 298.4074,80.04008 -7.60942,1.33057 c -4.18792,0.7436 -8.12463,1.43993 -8.76921,1.53529 -0.80487,0.1191 -1.18807,0.24336 -1.18807,0.38383 0,0.1125 0.17929,1.13426 0.39603,2.27735 2.07747,10.95686 2.52391,24.06935 1.30123,38.40797 -0.55966,6.56324 -1.80497,14.62573 -2.9985,19.47266 -0.17944,0.72877 -0.2917,1.37377 -0.25457,1.40735 0.0371,0.0335 3.93999,0.80348 8.68429,1.71443 4.74436,0.9109 8.69153,1.65348 8.74095,1.66321 0.0493,0.01 0.35153,-1.20446 0.67889,-2.71235 2.58164,-11.8915 3.70992,-23.06661 3.734,-37.02617 0.0169,-9.79205 -0.60847,-16.92701 -2.20646,-25.69062 z m -328.42069,44.52355 -0.59404,0.0767 c -0.32426,0.0425 -4.30309,0.47062 -8.82578,0.94676 -4.52269,0.47615 -8.27005,0.90467 -8.3166,0.94677 -0.10914,0.0987 0.19395,2.02928 0.87693,5.78293 3.74286,20.5706 11.55924,39.09836 24.24259,57.42003 0.34643,0.50043 0.71596,0.88794 0.82035,0.87001 0.27802,-0.0476 14.92958,-8.4814 14.93592,-8.59767 0.003,-0.0541 -0.61241,-0.97536 -1.35781,-2.04705 -3.27958,-4.71514 -7.63657,-12.12967 -10.04215,-17.09296 -5.78721,-11.94039 -9.59955,-24.12581 -11.56969,-37.02614 z m 316.85099,82.03592 c -0.36048,0.007 -16.97617,3.73907 -17.08581,3.83822 -0.0753,0.0682 16.94207,62.59192 17.19896,63.25382 0.30965,0.798 2.86925,7.31813 10.42538,6.19627 8.42278,-1.62864 7.56799,-10.19392 6.91501,-10.06007 -0.0867,0.0174 -3.86345,-14.3273 -8.59948,-31.67794 -6.7623,-24.77405 -8.66138,-31.55359 -8.85406,-31.5503 z m -244.80211,18.57706 c -0.31471,0.009 -0.93458,0.92267 -4.83721,6.70413 -2.54758,3.77402 -4.63919,6.89516 -4.63919,6.93441 0,0.095 2.63539,1.52222 5.43123,2.96823 17.18076,8.88581 36.19242,15.16537 55.6703,18.37201 2.75979,0.45453 4.36027,0.69944 8.48631,1.25377 0.53344,0.0717 1.05269,0.14407 1.15981,0.15373 0.242,0.0216 0.18744,0.43638 1.44268,-7.95778 0.57722,-3.86012 1.0799,-7.25173 1.13152,-7.54849 0.0906,-0.52038 0.0663,-0.53984 -0.45265,-0.6141 -0.29582,-0.0422 -2.06498,-0.28682 -3.93198,-0.53739 -17.1444,-2.30049 -34.78834,-7.57763 -50.21072,-14.99469 -2.7318,-1.3138 -7.81528,-3.92179 -9.10866,-4.68264 -0.0408,-0.024 -0.0965,-0.0525 -0.14144,-0.0512 z m 164.66293,6.32028 c -1.52266,0.0905 -3.53738,0.70727 -8.03371,2.175 -8.68549,2.83522 -18.54878,5.74416 -22.99794,6.7809 -0.64367,0.15 -1.18718,0.35231 -1.18807,0.43501 -0.002,0.14944 4.40029,15.44773 4.46946,15.532 0.0424,0.0521 4.87869,-1.18335 7.89228,-2.02144 3.91758,-1.08954 10.50973,-3.08747 15.2188,-4.60587 l 4.6675,-1.50969 17.14236,6.2435 c 13.94595,5.08505 17.14167,6.22073 17.22724,6.03865 0.69647,-1.48186 6.62352,-14.82249 6.59105,-14.84098 -0.29825,-0.17022 -37.77097,-13.74416 -38.3582,-13.89441 -0.96682,-0.2474 -1.71716,-0.3869 -2.63077,-0.33267 z"
|
||||
style="opacity:0.5;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:4.30466557;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
sodipodi:nodetypes="ccssccssscccccccssssscccsssscccscsssccccccssssssssssccccscssccsscccsscsscsssssccsccsscsscsccscccccssc" />
|
||||
</g>
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer2"
|
||||
inkscape:label="Layer 2"
|
||||
style="display:inline">
|
||||
<path
|
||||
sodipodi:type="inkscape:offset"
|
||||
inkscape:radius="12.358562"
|
||||
inkscape:original="M 253.34375 618.125 C 151.96941 618.125 69.75 698.4746 69.75 797.625 C 69.75 896.77539 151.96941 977.1875 253.34375 977.1875 C 287.00054 977.1875 311.5728 970.27778 342.65625 958.71875 L 440.75 998.25 L 414.1875 890.8125 C 431.0772 863.65332 436.90625 831.73711 436.90625 797.625 C 436.90625 698.4746 354.71813 618.125 253.34375 618.125 z "
|
||||
style="display:inline;fill:#ff8000;fill-opacity:1;stroke:none"
|
||||
id="path3868-5"
|
||||
d="m 253.34375,605.76562 c -107.90463,0 -195.953125,85.87684 -195.953125,191.85938 0,105.98253 88.043415,191.92187 195.953125,191.92188 33.56396,0 59.43822,-6.90343 88.98047,-17.63672 l 93.80664,37.80274 a 12.359798,12.359798 0 0 0 16.61719,-14.4297 L 427.35352,892.57031 c 16.32005,-28.65755 21.9121,-61.28733 21.9121,-94.94531 0,-105.97994 -88.0172,-191.85938 -195.92187,-191.85938 z"
|
||||
transform="matrix(-0.77259808,0,0,0.77116679,367.55932,-282.28679)" />
|
||||
<path
|
||||
style="display:inline;opacity:0.19211821;fill:url(#radialGradient3883-8);fill-opacity:1;stroke:none"
|
||||
d="m 47.92104,278.34166 c 85.06576,0 154.01258,67.54622 154.01258,150.8595 0,17.57416 -3.07299,34.44668 -8.71589,50.12552 -6.98908,0.97055 -14.13472,1.47017 -21.3913,1.47017 -25.9273,0 -45.91736,-5.31691 -68.73708,-13.59163 L 30.609993,496.36466 A 9.5491555,9.5314668 0 0 1 17.765567,485.2311 l 19.6288,-79.18904 C 24.777759,383.93808 20.469653,358.7681 20.469653,332.8053 c 0,-18.88073 3.628423,-36.92402 10.236917,-53.5238 5.65186,-0.61553 11.396492,-0.93984 17.21447,-0.93984 z"
|
||||
id="path3878-3"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
sodipodi:nodetypes="ccsssscc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path3845-7"
|
||||
d="M 23.939214,490.62525 44.460762,407.7534 C 31.411813,386.80914 26.916189,362.2158 26.916189,335.90966 c 0,-76.4615 63.504925,-138.42498 141.826591,-138.42498 78.32162,0 141.82653,61.96348 141.82653,138.42498 0,76.4615 -63.50491,138.47065 -141.82653,138.47065 -26.00317,0 -44.99723,-5.3294 -69.012271,-14.24332 z"
|
||||
style="display:inline;opacity:0;fill:none;stroke:#000000;stroke-width:15.43764114;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:61.75056976, 61.75056976;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path3855-0"
|
||||
d="m 171.85058,186.81378 c 3.53202,-0.001 7.0468,0.057 8.37786,0.14458 11.02792,0.72475 19.47625,1.99843 29.1173,4.43421 3.70534,0.93617 6.53954,1.76617 9.97134,2.89187 2.19153,0.71887 5.52236,1.86783 5.6979,1.97612 0.0538,0.0332 -2.18271,6.10627 -5.23917,14.2666 -0.0306,0.0818 -0.1119,0.0905 -0.2173,0.0482 -0.73033,-0.29333 -4.23609,-1.50378 -5.86691,-2.02432 -14.03755,-4.48046 -28.83807,-6.67326 -43.50693,-6.45851 -2.06572,0.0302 -4.6797,0.10417 -5.7945,0.1687 -1.11476,0.0646 -2.04792,0.10066 -2.07634,0.0722 -0.045,-0.0448 -1.0053,-15.19482 -0.96576,-15.23057 0.008,-0.008 0.92544,-0.0716 2.05223,-0.14458 1.3691,-0.0887 4.91826,-0.14303 8.45028,-0.14457 z m -72.696647,18.43569 c 0.06643,0.0714 7.315537,13.27709 7.315537,13.32675 0,0.012 -0.33262,0.20711 -0.74844,0.43375 -5.49836,2.99686 -11.520423,6.96303 -16.997493,11.15921 -2.122486,1.6261 -4.163129,3.28675 -6.059727,4.93891 -2.763466,2.4073 -5.519031,5.02765 -8.153046,7.73607 -4.188314,4.30662 -8.069301,8.83591 -11.18606,13.08544 -0.428228,0.58393 -0.518926,0.66211 -0.676036,0.55427 -0.743971,-0.51067 -12.069524,-9.01277 -12.07184,-9.0612 -0.0032,-0.0654 2.188315,-2.96196 3.114542,-4.12094 3.702693,-4.63305 6.952577,-8.24177 11.323395,-12.60374 5.422218,-5.41124 10.590321,-9.89733 16.418014,-14.21307 1.68388,-1.247 3.422814,-2.47978 5.238862,-3.71655 4.330773,-2.94935 12.27561,-7.74115 12.482292,-7.5189 z m 180.256787,26.14737 1.59348,1.68696 c 14.15689,14.8539 24.97464,32.22325 31.79723,51.08979 0.33396,0.9235 0.62801,1.75148 0.65189,1.85562 0.0314,0.13682 -1.93992,0.85746 -7.0741,2.57859 -3.90783,1.31002 -7.16723,2.38116 -7.24311,2.38582 -0.0759,0.005 -0.60152,-1.2735 -1.18304,-2.84371 -5.969,-16.11689 -15.21187,-30.93143 -27.33066,-43.81189 l -2.00392,-2.14481 5.38405,-5.39818 z m -254.691788,75.38159 6.494676,1.25313 c 3.574397,0.70032 6.934399,1.35613 7.484553,1.44593 0.686953,0.11217 1.014012,0.2292 1.014012,0.36149 0,0.10595 -0.153023,1.06824 -0.338008,2.14481 -1.77313,10.31915 -2.154169,22.66846 -1.110602,36.17254 0.477667,6.18126 1.540548,13.7745 2.559231,18.33932 0.153154,0.68636 0.248963,1.29382 0.21727,1.32544 -0.03169,0.0316 -3.362797,0.75672 -7.412074,1.61465 -4.049328,0.85789 -7.418252,1.55725 -7.460429,1.56642 -0.04205,0.009 -0.300037,-1.13437 -0.579433,-2.5545 -2.203444,-11.19939 -3.166429,-21.72408 -3.186982,-34.87117 -0.01437,-9.22213 0.519332,-15.94183 1.88322,-24.19538 z m 280.308238,41.9322 0.50701,0.0722 c 0.27676,0.0401 3.6727,0.44323 7.53284,0.89166 3.86013,0.44843 7.05852,0.85201 7.09824,0.89167 0.0932,0.0929 -0.16553,1.91116 -0.74845,5.44635 -3.19455,19.37336 -9.86586,36.82275 -20.69114,54.07808 -0.29568,0.4713 -0.61108,0.83626 -0.70017,0.81936 -0.2373,-0.0448 -12.74246,-7.98776 -12.74787,-8.09727 -0.003,-0.051 0.5227,-0.91859 1.15889,-1.9279 2.79915,-4.44071 6.51785,-11.42371 8.57102,-16.09812 4.93941,-11.24543 8.19324,-22.72164 9.87477,-34.87114 z M 34.593711,425.97191 c 0.307673,0.006 14.489227,3.52144 14.582798,3.61483 0.06429,0.0642 -14.460111,58.94894 -14.679361,59.57234 -0.264295,0.75154 -2.448917,6.89219 -8.89811,5.83562 -7.188866,-1.53385 -6.459303,-9.60062 -5.901978,-9.47455 0.07403,0.0164 3.297467,-13.49343 7.339677,-29.83423 5.771655,-23.33215 7.392523,-29.71712 7.556974,-29.71401 z m 208.939479,17.49584 c 0.26861,0.009 0.79767,0.86897 4.12858,6.31393 2.17437,3.55436 3.95956,6.49385 3.95956,6.53082 0,0.0895 -2.24931,1.43362 -4.63558,2.79547 -14.66383,8.36864 -30.89035,14.28272 -47.5148,17.30273 -2.35548,0.42806 -3.72149,0.65873 -7.24309,1.18079 -0.4553,0.0675 -0.89848,0.13569 -0.9899,0.14479 -0.20655,0.0203 -0.15998,0.41098 -1.23133,-7.49463 -0.49266,-3.63545 -0.9217,-6.82967 -0.96575,-7.10914 -0.0773,-0.4901 -0.0566,-0.50843 0.38632,-0.57837 0.25249,-0.0397 1.76248,-0.27013 3.35596,-0.5061 14.63282,-2.1666 29.69198,-7.13661 42.85504,-14.12199 2.3316,-1.23733 6.67037,-3.69353 7.77427,-4.4101 0.0348,-0.0226 0.0823,-0.0494 0.12072,-0.0482 z m -140.5404,5.95243 c 1.2996,0.0852 3.01916,0.6661 6.8568,2.04841 7.41309,2.6702 15.83145,5.40983 19.62883,6.38623 0.54937,0.14127 1.01325,0.3318 1.01402,0.4097 0.001,0.14074 -3.75566,14.54864 -3.8147,14.628 -0.0362,0.0491 -4.16398,-1.11446 -6.73609,-1.90379 -3.34367,-1.02612 -8.97009,-2.90777 -12.9893,-4.33779 l -3.98373,-1.42183 -14.631058,5.88012 c -11.902923,4.78909 -14.630484,5.85868 -14.703523,5.68719 -0.594444,-1.39562 -5.653196,-13.95979 -5.625485,-13.97721 0.254566,-0.16031 32.237656,-12.94422 32.738866,-13.08573 0.82518,-0.233 1.4656,-0.36438 2.24537,-0.3133 z"
|
||||
style="display:inline;opacity:0.5;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:3.85941029;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
sodipodi:nodetypes="ccssccssscccccccssssscccsssscccscsssccccccssssssssssccccscssccsscccsscsscsssssccsccsscsscsccscccccssc" />
|
||||
<ellipse
|
||||
cy="334.93869"
|
||||
cx="-242.26097"
|
||||
style="opacity:0.928;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
|
||||
id="path3047-7"
|
||||
rx="16.401163"
|
||||
ry="16.363543"
|
||||
transform="scale(-1,1)" />
|
||||
<ellipse
|
||||
cy="334.93869"
|
||||
cx="-170.28149"
|
||||
style="opacity:0.928;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
|
||||
id="path3047-1-89"
|
||||
rx="16.401163"
|
||||
ry="16.363543"
|
||||
transform="scale(-1,1)" />
|
||||
<ellipse
|
||||
cy="334.93869"
|
||||
cx="-98.116379"
|
||||
style="opacity:0.928;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
|
||||
id="path3047-1-8-8"
|
||||
rx="16.401163"
|
||||
ry="16.363543"
|
||||
transform="scale(-1,1)" />
|
||||
</g>
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer4"
|
||||
inkscape:label="Dots">
|
||||
<ellipse
|
||||
style="opacity:0.928;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
|
||||
id="path3047"
|
||||
cx="237.68259"
|
||||
cy="165.68341"
|
||||
rx="19.21628"
|
||||
ry="17.374786" />
|
||||
<ellipse
|
||||
style="opacity:0.928;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
|
||||
id="path3047-1"
|
||||
cx="322.01675"
|
||||
cy="165.68341"
|
||||
rx="19.21628"
|
||||
ry="17.374786" />
|
||||
<ellipse
|
||||
style="opacity:0.928;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
|
||||
id="path3047-1-8"
|
||||
cx="406.56836"
|
||||
cy="165.68341"
|
||||
rx="19.21628"
|
||||
ry="17.374786" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 26 KiB |
229
art/conversations_plus_baloons_notification.svg
Normal file
|
@ -0,0 +1,229 @@
|
|||
<?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:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="512"
|
||||
height="512"
|
||||
id="svg2"
|
||||
version="1.1"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="conversations_plus_baloons.svg"
|
||||
inkscape:export-filename="/home/diesys/diesys/grafica/conversation/conversation_bubble.png"
|
||||
inkscape:export-xdpi="100"
|
||||
inkscape:export-ydpi="100">
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="0.7071068"
|
||||
inkscape:cx="-63.341475"
|
||||
inkscape:cy="288.28557"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
inkscape:window-width="1366"
|
||||
inkscape:window-height="684"
|
||||
inkscape:window-x="-8"
|
||||
inkscape:window-y="-8"
|
||||
inkscape:window-maximized="1"
|
||||
showguides="true"
|
||||
inkscape:guide-bbox="true"
|
||||
inkscape:snap-to-guides="true"
|
||||
inkscape:snap-grids="false"
|
||||
inkscape:object-paths="true"
|
||||
inkscape:object-nodes="false"
|
||||
inkscape:snap-nodes="false">
|
||||
<sodipodi:guide
|
||||
orientation="1,0"
|
||||
position="0,534.28571"
|
||||
id="guide3004" />
|
||||
<sodipodi:guide
|
||||
orientation="0,1"
|
||||
position="394.28571,511.42857"
|
||||
id="guide3006" />
|
||||
<sodipodi:guide
|
||||
orientation="1,0"
|
||||
position="511.42857,320"
|
||||
id="guide3008" />
|
||||
<sodipodi:guide
|
||||
orientation="0,1"
|
||||
position="401.42857,0"
|
||||
id="guide3010" />
|
||||
<sodipodi:guide
|
||||
orientation="1,0"
|
||||
position="17.142857,258.57143"
|
||||
id="guide3012" />
|
||||
<sodipodi:guide
|
||||
orientation="0,1"
|
||||
position="327.14286,494.28571"
|
||||
id="guide3014" />
|
||||
<sodipodi:guide
|
||||
orientation="0,1"
|
||||
position="324.28571,17.142857"
|
||||
id="guide3016" />
|
||||
<sodipodi:guide
|
||||
orientation="1,0"
|
||||
position="494.28571,237.14286"
|
||||
id="guide3018" />
|
||||
<sodipodi:guide
|
||||
orientation="1,0"
|
||||
position="255.71429,302.85714"
|
||||
id="guide3022" />
|
||||
<sodipodi:guide
|
||||
orientation="1,0"
|
||||
position="660,-315"
|
||||
id="guide3904" />
|
||||
<sodipodi:guide
|
||||
orientation="0,1"
|
||||
position="554.28571,475.71429"
|
||||
id="guide3931" />
|
||||
<sodipodi:guide
|
||||
orientation="0,1"
|
||||
position="581.42857,244.28571"
|
||||
id="guide3933" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata7">
|
||||
<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>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(0,-540.36218)"
|
||||
style="display:inline">
|
||||
<path
|
||||
d="m 253.34375,605.76562 c -107.90463,0 -195.953125,85.87684 -195.953125,191.85938 0,105.98253 88.043415,191.92187 195.953125,191.92188 33.56396,0 59.43822,-6.90343 88.98047,-17.63672 l 93.80664,37.80274 a 12.359798,12.359798 0 0 0 16.61719,-14.4297 L 427.35352,892.57031 c 16.32005,-28.65755 21.9121,-61.28733 21.9121,-94.94531 0,-105.97994 -88.0172,-191.85938 -195.92187,-191.85938 z"
|
||||
id="path3885"
|
||||
style="opacity:0.6;fill:#000000;fill-opacity:1;stroke:#000000"
|
||||
inkscape:original="M 253.34375 618.125 C 151.96941 618.125 69.75 698.4746 69.75 797.625 C 69.75 896.77539 151.96941 977.1875 253.34375 977.1875 C 287.00054 977.1875 311.5728 970.27778 342.65625 958.71875 L 440.75 998.25 L 414.1875 890.8125 C 431.0772 863.65332 436.90625 831.73711 436.90625 797.625 C 436.90625 698.4746 354.71813 618.125 253.34375 618.125 z "
|
||||
inkscape:radius="12.358562"
|
||||
sodipodi:type="inkscape:offset"
|
||||
transform="matrix(0.90520781,0,0,0.81882383,90.877888,53.951708)" />
|
||||
<path
|
||||
sodipodi:type="inkscape:offset"
|
||||
inkscape:radius="12.358562"
|
||||
inkscape:original="M 253.34375 618.125 C 151.96941 618.125 69.75 698.4746 69.75 797.625 C 69.75 896.77539 151.96941 977.1875 253.34375 977.1875 C 287.00054 977.1875 311.5728 970.27778 342.65625 958.71875 L 440.75 998.25 L 414.1875 890.8125 C 431.0772 863.65332 436.90625 831.73711 436.90625 797.625 C 436.90625 698.4746 354.71813 618.125 253.34375 618.125 z "
|
||||
style="fill:#ffffff;fill-opacity:1;stroke:#000000"
|
||||
id="path3868"
|
||||
d="m 253.34375,605.76562 c -107.90463,0 -195.953125,85.87684 -195.953125,191.85938 0,105.98253 88.043415,191.92187 195.953125,191.92188 33.56396,0 59.43822,-6.90343 88.98047,-17.63672 l 93.80664,37.80274 a 12.359798,12.359798 0 0 0 16.61719,-14.4297 L 427.35352,892.57031 c 16.32005,-28.65755 21.9121,-61.28733 21.9121,-94.94531 0,-105.97994 -88.0172,-191.85938 -195.92187,-191.85938 z"
|
||||
transform="matrix(0.90520781,0,0,0.81882383,90.877888,50.676388)" />
|
||||
<path
|
||||
style="opacity:0.19211821;fill:url(#radialGradient3883);fill-opacity:1;stroke:none"
|
||||
d="m 465.37929,645.95092 c -99.66655,0 -180.44749,71.72047 -180.44749,160.18241 0,18.66021 3.60043,36.57544 10.21189,53.2232 8.1887,1.03054 16.56083,1.56103 25.06293,1.56103 30.37749,0 53.79867,-5.64549 80.53519,-14.43157 l 84.91981,30.96145 a 11.188184,10.120499 0 0 0 15.04907,-11.82159 l -22.99792,-84.08283 c 14.78214,-23.46997 19.8297,-50.19542 19.8297,-77.76269 0,-20.04753 -4.25121,-39.20586 -11.994,-56.83149 -6.62195,-0.65358 -13.3526,-0.99792 -20.16918,-0.99792 z"
|
||||
id="path3878"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
sodipodi:nodetypes="ccsssscc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path3845"
|
||||
d="m 493.47738,871.35334 -24.04389,-87.99322 c 15.28869,-22.23857 20.55595,-48.35175 20.55595,-76.28358 0,-81.18671 -74.40499,-146.97946 -166.16989,-146.97946 -91.76484,0 -166.16981,65.79275 -166.16981,146.97946 0,81.18672 74.40497,147.02794 166.16981,147.02794 30.46639,0 52.72061,-5.65874 80.85763,-15.12352 z"
|
||||
style="opacity:0;fill:none;stroke:#000000;stroke-width:17.21866226;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:68.87464583, 68.87464583;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path3855"
|
||||
d="m 320.17833,548.76674 c -4.13827,-9.4e-4 -8.25632,0.0605 -9.81586,0.15351 -12.92075,0.76954 -22.81917,2.12193 -34.11502,4.70824 -4.34132,0.99402 -7.66199,1.87532 -11.68283,3.07059 -2.5677,0.76329 -6.47023,1.98325 -6.6759,2.09824 -0.0631,0.0352 2.55734,6.48362 6.13843,15.14825 0.0358,0.0868 0.13111,0.0961 0.2546,0.0511 0.85568,-0.31146 4.96317,-1.59671 6.87391,-2.14942 16.44697,-4.75734 33.78787,-7.08565 50.97451,-6.85765 2.42028,0.0321 5.48294,0.11062 6.78907,0.17914 1.30611,0.0686 2.39944,0.10688 2.43274,0.0767 0.0526,-0.0476 1.17785,-16.13384 1.13152,-16.1718 -0.01,-0.008 -1.08429,-0.0761 -2.40448,-0.15351 -1.60409,-0.0941 -5.76244,-0.15187 -9.90069,-0.15351 z m 85.17439,19.57499 c -0.0778,0.0759 -8.57119,14.09759 -8.57119,14.15032 0,0.0128 0.38971,0.21991 0.8769,0.46056 6.4421,3.18205 13.4978,7.39333 19.91497,11.84882 2.48679,1.7266 4.87769,3.48988 7.09982,5.24414 3.2378,2.55607 6.46633,5.33835 9.55245,8.21414 4.9072,4.57277 9.45432,9.38196 13.10605,13.89411 0.50173,0.62001 0.608,0.70303 0.79207,0.58852 0.87167,-0.54223 14.14115,-9.56974 14.14386,-9.62116 0.004,-0.0695 -2.56391,-3.14501 -3.64912,-4.37562 -4.33822,-4.91937 -8.14593,-8.7511 -13.26695,-13.38263 -6.3529,-5.74565 -12.40806,-10.50897 -19.23603,-15.09142 -1.9729,-1.32405 -4.01031,-2.63303 -6.13807,-3.94623 -5.07411,-3.13161 -14.3826,-8.21954 -14.62476,-7.98355 z m -211.19629,27.76323 -1.86699,1.79122 c -16.58679,15.77185 -29.26131,34.2146 -37.25495,54.24707 -0.39127,0.98058 -0.7358,1.85972 -0.76377,1.97029 -0.0367,0.14529 2.27287,0.91046 8.2883,2.73794 4.57858,1.39099 8.39743,2.52833 8.48633,2.53327 0.0889,0.005 0.70476,-1.35221 1.3861,-3.01945 6.99352,-17.11289 17.82285,-32.84295 32.02173,-46.51941 l 2.34786,-2.27736 -6.30817,-5.73177 z m 298.4074,80.04008 -7.60942,1.33057 c -4.18792,0.7436 -8.12463,1.43993 -8.76921,1.53529 -0.80487,0.1191 -1.18807,0.24336 -1.18807,0.38383 0,0.1125 0.17929,1.13426 0.39603,2.27735 2.07747,10.95686 2.52391,24.06935 1.30123,38.40797 -0.55966,6.56324 -1.80497,14.62573 -2.9985,19.47266 -0.17944,0.72877 -0.2917,1.37377 -0.25457,1.40735 0.0371,0.0335 3.93999,0.80348 8.68429,1.71443 4.74436,0.9109 8.69153,1.65348 8.74095,1.66321 0.0493,0.01 0.35153,-1.20446 0.67889,-2.71235 2.58164,-11.8915 3.70992,-23.06661 3.734,-37.02617 0.0169,-9.79205 -0.60847,-16.92701 -2.20646,-25.69062 z m -328.42069,44.52355 -0.59404,0.0767 c -0.32426,0.0425 -4.30309,0.47062 -8.82578,0.94676 -4.52269,0.47615 -8.27005,0.90467 -8.3166,0.94677 -0.10914,0.0987 0.19395,2.02928 0.87693,5.78293 3.74286,20.5706 11.55924,39.09836 24.24259,57.42003 0.34643,0.50043 0.71596,0.88794 0.82035,0.87001 0.27802,-0.0476 14.92958,-8.4814 14.93592,-8.59767 0.003,-0.0541 -0.61241,-0.97536 -1.35781,-2.04705 -3.27958,-4.71514 -7.63657,-12.12967 -10.04215,-17.09296 -5.78721,-11.94039 -9.59955,-24.12581 -11.56969,-37.02614 z m 316.85099,82.03592 c -0.36048,0.007 -16.97617,3.73907 -17.08581,3.83822 -0.0753,0.0682 16.94207,62.59192 17.19896,63.25382 0.30965,0.798 2.86925,7.31813 10.42538,6.19627 8.42278,-1.62864 7.56799,-10.19392 6.91501,-10.06007 -0.0867,0.0174 -3.86345,-14.3273 -8.59948,-31.67794 -6.7623,-24.77405 -8.66138,-31.55359 -8.85406,-31.5503 z m -244.80211,18.57706 c -0.31471,0.009 -0.93458,0.92267 -4.83721,6.70413 -2.54758,3.77402 -4.63919,6.89516 -4.63919,6.93441 0,0.095 2.63539,1.52222 5.43123,2.96823 17.18076,8.88581 36.19242,15.16537 55.6703,18.37201 2.75979,0.45453 4.36027,0.69944 8.48631,1.25377 0.53344,0.0717 1.05269,0.14407 1.15981,0.15373 0.242,0.0216 0.18744,0.43638 1.44268,-7.95778 0.57722,-3.86012 1.0799,-7.25173 1.13152,-7.54849 0.0906,-0.52038 0.0663,-0.53984 -0.45265,-0.6141 -0.29582,-0.0422 -2.06498,-0.28682 -3.93198,-0.53739 -17.1444,-2.30049 -34.78834,-7.57763 -50.21072,-14.99469 -2.7318,-1.3138 -7.81528,-3.92179 -9.10866,-4.68264 -0.0408,-0.024 -0.0965,-0.0525 -0.14144,-0.0512 z m 164.66293,6.32028 c -1.52266,0.0905 -3.53738,0.70727 -8.03371,2.175 -8.68549,2.83522 -18.54878,5.74416 -22.99794,6.7809 -0.64367,0.15 -1.18718,0.35231 -1.18807,0.43501 -0.002,0.14944 4.40029,15.44773 4.46946,15.532 0.0424,0.0521 4.87869,-1.18335 7.89228,-2.02144 3.91758,-1.08954 10.50973,-3.08747 15.2188,-4.60587 l 4.6675,-1.50969 17.14236,6.2435 c 13.94595,5.08505 17.14167,6.22073 17.22724,6.03865 0.69647,-1.48186 6.62352,-14.82249 6.59105,-14.84098 -0.29825,-0.17022 -37.77097,-13.74416 -38.3582,-13.89441 -0.96682,-0.2474 -1.71716,-0.3869 -2.63077,-0.33267 z"
|
||||
style="opacity:0.5;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:4.30466557;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
sodipodi:nodetypes="ccssccssscccccccssssscccsssscccscsssccccccssssssssssccccscssccsscccsscsscsssssccsccsscsscsccscccccssc" />
|
||||
</g>
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer2"
|
||||
inkscape:label="Layer 2"
|
||||
style="display:inline">
|
||||
<path
|
||||
sodipodi:type="inkscape:offset"
|
||||
inkscape:radius="12.358562"
|
||||
inkscape:original="M 253.34375 618.125 C 151.96941 618.125 69.75 698.4746 69.75 797.625 C 69.75 896.77539 151.96941 977.1875 253.34375 977.1875 C 287.00054 977.1875 311.5728 970.27778 342.65625 958.71875 L 440.75 998.25 L 414.1875 890.8125 C 431.0772 863.65332 436.90625 831.73711 436.90625 797.625 C 436.90625 698.4746 354.71813 618.125 253.34375 618.125 z "
|
||||
style="display:inline;fill:#ffffff;fill-opacity:1;stroke:#000000"
|
||||
id="path3868-5"
|
||||
d="m 253.34375,605.76562 c -107.90463,0 -195.953125,85.87684 -195.953125,191.85938 0,105.98253 88.043415,191.92187 195.953125,191.92188 33.56396,0 59.43822,-6.90343 88.98047,-17.63672 l 93.80664,37.80274 a 12.359798,12.359798 0 0 0 16.61719,-14.4297 L 427.35352,892.57031 c 16.32005,-28.65755 21.9121,-61.28733 21.9121,-94.94531 0,-105.97994 -88.0172,-191.85938 -195.92187,-191.85938 z"
|
||||
transform="matrix(-0.77259808,0,0,0.77116679,367.55932,-282.28679)" />
|
||||
<path
|
||||
style="display:inline;opacity:0.19211821;fill:url(#radialGradient3883-8);fill-opacity:1;stroke:none"
|
||||
d="m 47.92104,278.34166 c 85.06576,0 154.01258,67.54622 154.01258,150.8595 0,17.57416 -3.07299,34.44668 -8.71589,50.12552 -6.98908,0.97055 -14.13472,1.47017 -21.3913,1.47017 -25.9273,0 -45.91736,-5.31691 -68.73708,-13.59163 L 30.609993,496.36466 A 9.5491555,9.5314668 0 0 1 17.765567,485.2311 l 19.6288,-79.18904 C 24.777759,383.93808 20.469653,358.7681 20.469653,332.8053 c 0,-18.88073 3.628423,-36.92402 10.236917,-53.5238 5.65186,-0.61553 11.396492,-0.93984 17.21447,-0.93984 z"
|
||||
id="path3878-3"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
sodipodi:nodetypes="ccsssscc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path3845-7"
|
||||
d="M 23.939214,490.62525 44.460762,407.7534 C 31.411813,386.80914 26.916189,362.2158 26.916189,335.90966 c 0,-76.4615 63.504925,-138.42498 141.826591,-138.42498 78.32162,0 141.82653,61.96348 141.82653,138.42498 0,76.4615 -63.50491,138.47065 -141.82653,138.47065 -26.00317,0 -44.99723,-5.3294 -69.012271,-14.24332 z"
|
||||
style="display:inline;opacity:0;fill:none;stroke:#000000;stroke-width:15.43764114;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:61.75056976, 61.75056976;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path3855-0"
|
||||
d="m 171.85058,186.81378 c 3.53202,-0.001 7.0468,0.057 8.37786,0.14458 11.02792,0.72475 19.47625,1.99843 29.1173,4.43421 3.70534,0.93617 6.53954,1.76617 9.97134,2.89187 2.19153,0.71887 5.52236,1.86783 5.6979,1.97612 0.0538,0.0332 -2.18271,6.10627 -5.23917,14.2666 -0.0306,0.0818 -0.1119,0.0905 -0.2173,0.0482 -0.73033,-0.29333 -4.23609,-1.50378 -5.86691,-2.02432 -14.03755,-4.48046 -28.83807,-6.67326 -43.50693,-6.45851 -2.06572,0.0302 -4.6797,0.10417 -5.7945,0.1687 -1.11476,0.0646 -2.04792,0.10066 -2.07634,0.0722 -0.045,-0.0448 -1.0053,-15.19482 -0.96576,-15.23057 0.008,-0.008 0.92544,-0.0716 2.05223,-0.14458 1.3691,-0.0887 4.91826,-0.14303 8.45028,-0.14457 z m -72.696647,18.43569 c 0.06643,0.0714 7.315537,13.27709 7.315537,13.32675 0,0.012 -0.33262,0.20711 -0.74844,0.43375 -5.49836,2.99686 -11.520423,6.96303 -16.997493,11.15921 -2.122486,1.6261 -4.163129,3.28675 -6.059727,4.93891 -2.763466,2.4073 -5.519031,5.02765 -8.153046,7.73607 -4.188314,4.30662 -8.069301,8.83591 -11.18606,13.08544 -0.428228,0.58393 -0.518926,0.66211 -0.676036,0.55427 -0.743971,-0.51067 -12.069524,-9.01277 -12.07184,-9.0612 -0.0032,-0.0654 2.188315,-2.96196 3.114542,-4.12094 3.702693,-4.63305 6.952577,-8.24177 11.323395,-12.60374 5.422218,-5.41124 10.590321,-9.89733 16.418014,-14.21307 1.68388,-1.247 3.422814,-2.47978 5.238862,-3.71655 4.330773,-2.94935 12.27561,-7.74115 12.482292,-7.5189 z m 180.256787,26.14737 1.59348,1.68696 c 14.15689,14.8539 24.97464,32.22325 31.79723,51.08979 0.33396,0.9235 0.62801,1.75148 0.65189,1.85562 0.0314,0.13682 -1.93992,0.85746 -7.0741,2.57859 -3.90783,1.31002 -7.16723,2.38116 -7.24311,2.38582 -0.0759,0.005 -0.60152,-1.2735 -1.18304,-2.84371 -5.969,-16.11689 -15.21187,-30.93143 -27.33066,-43.81189 l -2.00392,-2.14481 5.38405,-5.39818 z m -254.691788,75.38159 6.494676,1.25313 c 3.574397,0.70032 6.934399,1.35613 7.484553,1.44593 0.686953,0.11217 1.014012,0.2292 1.014012,0.36149 0,0.10595 -0.153023,1.06824 -0.338008,2.14481 -1.77313,10.31915 -2.154169,22.66846 -1.110602,36.17254 0.477667,6.18126 1.540548,13.7745 2.559231,18.33932 0.153154,0.68636 0.248963,1.29382 0.21727,1.32544 -0.03169,0.0316 -3.362797,0.75672 -7.412074,1.61465 -4.049328,0.85789 -7.418252,1.55725 -7.460429,1.56642 -0.04205,0.009 -0.300037,-1.13437 -0.579433,-2.5545 -2.203444,-11.19939 -3.166429,-21.72408 -3.186982,-34.87117 -0.01437,-9.22213 0.519332,-15.94183 1.88322,-24.19538 z m 280.308238,41.9322 0.50701,0.0722 c 0.27676,0.0401 3.6727,0.44323 7.53284,0.89166 3.86013,0.44843 7.05852,0.85201 7.09824,0.89167 0.0932,0.0929 -0.16553,1.91116 -0.74845,5.44635 -3.19455,19.37336 -9.86586,36.82275 -20.69114,54.07808 -0.29568,0.4713 -0.61108,0.83626 -0.70017,0.81936 -0.2373,-0.0448 -12.74246,-7.98776 -12.74787,-8.09727 -0.003,-0.051 0.5227,-0.91859 1.15889,-1.9279 2.79915,-4.44071 6.51785,-11.42371 8.57102,-16.09812 4.93941,-11.24543 8.19324,-22.72164 9.87477,-34.87114 z M 34.593711,425.97191 c 0.307673,0.006 14.489227,3.52144 14.582798,3.61483 0.06429,0.0642 -14.460111,58.94894 -14.679361,59.57234 -0.264295,0.75154 -2.448917,6.89219 -8.89811,5.83562 -7.188866,-1.53385 -6.459303,-9.60062 -5.901978,-9.47455 0.07403,0.0164 3.297467,-13.49343 7.339677,-29.83423 5.771655,-23.33215 7.392523,-29.71712 7.556974,-29.71401 z m 208.939479,17.49584 c 0.26861,0.009 0.79767,0.86897 4.12858,6.31393 2.17437,3.55436 3.95956,6.49385 3.95956,6.53082 0,0.0895 -2.24931,1.43362 -4.63558,2.79547 -14.66383,8.36864 -30.89035,14.28272 -47.5148,17.30273 -2.35548,0.42806 -3.72149,0.65873 -7.24309,1.18079 -0.4553,0.0675 -0.89848,0.13569 -0.9899,0.14479 -0.20655,0.0203 -0.15998,0.41098 -1.23133,-7.49463 -0.49266,-3.63545 -0.9217,-6.82967 -0.96575,-7.10914 -0.0773,-0.4901 -0.0566,-0.50843 0.38632,-0.57837 0.25249,-0.0397 1.76248,-0.27013 3.35596,-0.5061 14.63282,-2.1666 29.69198,-7.13661 42.85504,-14.12199 2.3316,-1.23733 6.67037,-3.69353 7.77427,-4.4101 0.0348,-0.0226 0.0823,-0.0494 0.12072,-0.0482 z m -140.5404,5.95243 c 1.2996,0.0852 3.01916,0.6661 6.8568,2.04841 7.41309,2.6702 15.83145,5.40983 19.62883,6.38623 0.54937,0.14127 1.01325,0.3318 1.01402,0.4097 0.001,0.14074 -3.75566,14.54864 -3.8147,14.628 -0.0362,0.0491 -4.16398,-1.11446 -6.73609,-1.90379 -3.34367,-1.02612 -8.97009,-2.90777 -12.9893,-4.33779 l -3.98373,-1.42183 -14.631058,5.88012 c -11.902923,4.78909 -14.630484,5.85868 -14.703523,5.68719 -0.594444,-1.39562 -5.653196,-13.95979 -5.625485,-13.97721 0.254566,-0.16031 32.237656,-12.94422 32.738866,-13.08573 0.82518,-0.233 1.4656,-0.36438 2.24537,-0.3133 z"
|
||||
style="display:inline;opacity:0.5;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:3.85941029;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
sodipodi:nodetypes="ccssccssscccccccssssscccsssscccscsssccccccssssssssssccccscssccsscccsscsscsssssccsccsscsscsccscccccssc" />
|
||||
<ellipse
|
||||
cy="334.93869"
|
||||
cx="-242.26097"
|
||||
style="opacity:0.928;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000"
|
||||
id="path3047-7"
|
||||
rx="16.401163"
|
||||
ry="16.363543"
|
||||
transform="scale(-1,1)" />
|
||||
<ellipse
|
||||
cy="334.93869"
|
||||
cx="-170.28149"
|
||||
style="opacity:0.928;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000"
|
||||
id="path3047-1-89"
|
||||
rx="16.401163"
|
||||
ry="16.363543"
|
||||
transform="scale(-1,1)" />
|
||||
<ellipse
|
||||
cy="334.93869"
|
||||
cx="-98.116379"
|
||||
style="opacity:0.928;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000"
|
||||
id="path3047-1-8-8"
|
||||
rx="16.401163"
|
||||
ry="16.363543"
|
||||
transform="scale(-1,1)" />
|
||||
</g>
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer4"
|
||||
inkscape:label="Dots">
|
||||
<ellipse
|
||||
style="opacity:0.928;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000"
|
||||
id="path3047"
|
||||
cx="237.68259"
|
||||
cy="165.68341"
|
||||
rx="19.21628"
|
||||
ry="17.374786" />
|
||||
<ellipse
|
||||
style="opacity:0.928;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000"
|
||||
id="path3047-1"
|
||||
cx="322.01675"
|
||||
cy="165.68341"
|
||||
rx="19.21628"
|
||||
ry="17.374786" />
|
||||
<ellipse
|
||||
style="opacity:0.928;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000"
|
||||
id="path3047-1-8"
|
||||
cx="406.56836"
|
||||
cy="165.68341"
|
||||
rx="19.21628"
|
||||
ry="17.374786" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 20 KiB |
80
build.gradle
|
@ -6,49 +6,56 @@ buildscript {
|
|||
mavenCentral()
|
||||
}
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:1.5.0'
|
||||
classpath 'com.android.tools.build:gradle:1.3.1'
|
||||
}
|
||||
}
|
||||
|
||||
allprojects {
|
||||
repositories {
|
||||
jcenter()
|
||||
mavenCentral()
|
||||
maven {
|
||||
url 'http://lorenzo.villani.me/android-cropimage/'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
apply plugin: 'com.android.application'
|
||||
|
||||
repositories {
|
||||
jcenter()
|
||||
mavenCentral()
|
||||
}
|
||||
|
||||
configurations {
|
||||
playstoreCompile
|
||||
flatDir {
|
||||
dirs 'libs/3rdParty/jcenter', 'libs/3rdParty/maven'
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
compile project(':libs:MemorizingTrustManager')
|
||||
compile 'org.sufficientlysecure:openpgp-api:10.0'
|
||||
compile 'com.soundcloud.android:android-crop:1.0.1@aar'
|
||||
compile 'com.android.support:support-v13:23.1.1'
|
||||
compile 'org.bouncycastle:bcprov-jdk15on:1.52'
|
||||
compile 'org.bouncycastle:bcmail-jdk15on:1.52'
|
||||
compile 'org.jitsi:org.otr4j:0.22'
|
||||
compile 'org.gnu.inet:libidn:1.15'
|
||||
compile 'com.google.zxing:core:3.2.1'
|
||||
compile 'com.google.zxing:android-integration:3.2.1'
|
||||
compile 'de.measite.minidns:minidns:0.1.7'
|
||||
compile 'de.timroes.android:EnhancedListView:0.3.4'
|
||||
compile 'me.leolin:ShortcutBadger:1.1.3@aar'
|
||||
compile 'com.kyleduo.switchbutton:library:1.2.8'
|
||||
compile 'org.whispersystems:axolotl-android:1.3.4'
|
||||
compile 'com.makeramen:roundedimageview:2.2.0'
|
||||
playstoreCompile 'com.google.android.gms:play-services-gcm:8.3.0'
|
||||
// Local JAR files
|
||||
//compile fileTree(dir: 'libs/zxing', includes: ['core-3.1.0.jar', 'android-integration-3.1.0.jar'])
|
||||
compile name: 'zxing-core-3.2.1' //zxing
|
||||
compile name: 'zxing-android-integration-3.2.1' //zxing
|
||||
compile name: 'libidn-1.15'
|
||||
compile name: 'minidns-0.1.7'
|
||||
compile name: 'org.otr4j-0.22'
|
||||
compile name: 'bcprov-jdk15on-1.52'
|
||||
compile name: 'bcmail-jdk15on-1.52'
|
||||
compile name: 'bcpkix-jdk15on-1.52'
|
||||
compile name: 'EnhancedListView-0.3.4', ext: 'aar'
|
||||
compile name: 'com.nineoldandroids.view.ViewHelper-2.4.0'
|
||||
compile name: 'ShortcutBadger-1.1.3', ext: 'aar'
|
||||
compile name: 'swipy-1.2.1', ext: 'aar'
|
||||
compile name: 'axolotl-android-1.3.4', ext: 'aar'
|
||||
compile name: 'axolotl-java-1.3.4'
|
||||
compile name: 'curve25519-android-0.2.4', ext: 'aar' // axolotl, loaded from jcenter
|
||||
compile name: 'curve25519-java-0.2.4' // axolotl, loaded from jcenter
|
||||
compile name: 'protobuf-java-2.5.0' // axolotl, loaded from maven
|
||||
compile name: 'android-crop-1.0.1', ext: 'aar'
|
||||
compile name: 'roundedimageview-2.2.0', ext: 'aar'
|
||||
compile name: 'switchbutton-1.2.8', ext: 'aar' // loaded from jcenter
|
||||
compile name: 'openpgp-api-10.0', ext: 'aar' // loaded from jcenter
|
||||
|
||||
// Local modules
|
||||
compile project(':libs:MemorizingTrustManager')
|
||||
compile project(':libs:emojicon')
|
||||
compile project(':libs:colorpicker')
|
||||
compile project(':libs:thedevstacklogcat')
|
||||
|
||||
// Android dependencies
|
||||
compile 'com.android.support:support-v13:21.0.3'
|
||||
}
|
||||
|
||||
android {
|
||||
|
@ -58,10 +65,9 @@ android {
|
|||
defaultConfig {
|
||||
minSdkVersion 14
|
||||
targetSdkVersion 23
|
||||
versionCode 128
|
||||
versionName "1.10.1"
|
||||
versionCode 129
|
||||
versionName "1.10.1.2"
|
||||
archivesBaseName += "-$versionName"
|
||||
applicationId "eu.siacs.conversations"
|
||||
}
|
||||
|
||||
compileOptions {
|
||||
|
@ -90,6 +96,16 @@ android {
|
|||
buildTypes.release.signingConfig = null
|
||||
}
|
||||
|
||||
applicationVariants.all { variant ->
|
||||
if (variant.name.equals('release')) {
|
||||
variant.outputs.each { output ->
|
||||
if (output.zipAlign != null) {
|
||||
output.zipAlign.outputFile = new File(output.outputFile.parent, rootProject.name + "-${variant.versionName}.apk")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
lintOptions {
|
||||
disable 'ExtraTranslation', 'MissingTranslation', 'InvalidPackage', 'MissingQuantity', 'AppCompatResource'
|
||||
}
|
||||
|
|
2
gradle/wrapper/gradle-wrapper.properties
vendored
|
@ -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
|
||||
|
|
BIN
libs/3rdParty/jcenter/com.nineoldandroids.view.ViewHelper-2.4.0.jar
vendored
Normal file
BIN
libs/3rdParty/jcenter/openpgp-api-10.0.aar
vendored
Normal file
BIN
libs/3rdParty/jcenter/switchbutton-1.2.8.aar
vendored
Normal file
BIN
libs/3rdParty/maven/EnhancedListView-0.3.4.aar
vendored
Normal file
BIN
libs/3rdParty/maven/ShortcutBadger-1.1.3.aar
vendored
Normal file
BIN
libs/3rdParty/maven/android-crop-1.0.1.aar
vendored
Normal file
BIN
libs/3rdParty/maven/axolotl-android-1.3.4.aar
vendored
Normal file
BIN
libs/3rdParty/maven/axolotl-java-1.3.4.jar
vendored
Normal file
BIN
libs/3rdParty/maven/bcmail-jdk15on-1.52.jar
vendored
Normal file
BIN
libs/3rdParty/maven/bcpkix-jdk15on-1.52.jar
vendored
Normal file
BIN
libs/3rdParty/maven/bcprov-jdk15on-1.52.jar
vendored
Normal file
BIN
libs/3rdParty/maven/curve25519-android-0.2.4.aar
vendored
Normal file
BIN
libs/3rdParty/maven/curve25519-java-0.2.4.jar
vendored
Normal file
BIN
libs/3rdParty/maven/libidn-1.15.jar
vendored
Normal file
BIN
libs/3rdParty/maven/minidns-0.1.7.jar
vendored
Normal file
BIN
libs/3rdParty/maven/org.otr4j-0.22.jar
vendored
Normal file
BIN
libs/3rdParty/maven/protobuf-java-2.5.0.jar
vendored
Normal file
BIN
libs/3rdParty/maven/roundedimageview-2.2.0.aar
vendored
Normal file
BIN
libs/3rdParty/maven/swipy-1.2.1.aar
vendored
Normal file
BIN
libs/3rdParty/maven/zxing-android-core-3.2.1.jar
vendored
Normal file
BIN
libs/3rdParty/maven/zxing-android-integration-3.2.1.jar
vendored
Normal file
BIN
libs/3rdParty/maven/zxing-core-3.2.1.jar
vendored
Normal file
1
libs/colorpicker/.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
/build
|
18
libs/colorpicker/build.gradle
Normal 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
|
||||
}
|
||||
}
|
||||
}
|
2
libs/colorpicker/src/main/AndroidManifest.xml
Normal file
|
@ -0,0 +1,2 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest package="yuku.ambilwarna" />
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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];
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
After Width: | Height: | Size: 1 KiB |
After Width: | Height: | Size: 1 KiB |
After Width: | Height: | Size: 666 B |
After Width: | Height: | Size: 983 B |
After Width: | Height: | Size: 748 B |
After Width: | Height: | Size: 751 B |
After Width: | Height: | Size: 480 B |
After Width: | Height: | Size: 607 B |
After Width: | Height: | Size: 135 B |
After Width: | Height: | Size: 889 B |
After Width: | Height: | Size: 814 B |
After Width: | Height: | Size: 579 B |
BIN
libs/colorpicker/src/main/res/drawable-mdpi/ambilwarna_hue.png
Normal file
After Width: | Height: | Size: 455 B |
After Width: | Height: | Size: 816 B |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 782 B |
After Width: | Height: | Size: 1.5 KiB |
|
@ -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>
|
127
libs/colorpicker/src/main/res/layout-land/ambilwarna_dialog.xml
Normal 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>
|
122
libs/colorpicker/src/main/res/layout/ambilwarna_dialog.xml
Normal 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>
|
|
@ -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>
|
5
libs/colorpicker/src/main/res/values-land/dimen.xml
Normal 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>
|
|
@ -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>
|
7
libs/colorpicker/src/main/res/values/attrs.xml
Normal 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>
|
7
libs/colorpicker/src/main/res/values/dimen.xml
Normal 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>
|
21
libs/emojicon/build.gradle
Normal file
|
@ -0,0 +1,21 @@
|
|||
apply plugin: 'com.android.library'
|
||||
|
||||
android {
|
||||
compileSdkVersion 21
|
||||
buildToolsVersion "21.1.2"
|
||||
|
||||
defaultConfig {
|
||||
minSdkVersion 8
|
||||
targetSdkVersion 19
|
||||
}
|
||||
|
||||
buildTypes {
|
||||
release {
|
||||
minifyEnabled false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
compile 'com.android.support:support-v4:19.1.0'
|
||||
}
|
3
libs/emojicon/lint.xml
Normal file
|
@ -0,0 +1,3 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<lint>
|
||||
</lint>
|
12
libs/emojicon/src/main/AndroidManifest.xml
Normal 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>
|
|
@ -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;
|
||||
|
||||
import github.ankushsachdeva.emojicon.EmojiconGridView.OnEmojiconClickedListener;
|
||||
import github.ankushsachdeva.emojicon.emoji.Emojicon;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import android.content.Context;
|
||||
import android.view.View;
|
||||
import android.view.View.OnClickListener;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.ArrayAdapter;
|
||||
import android.widget.TextView;
|
||||
|
||||
import github.ankushsachdeva.emojicon.R;
|
||||
|
||||
/**
|
||||
* @author Ankush Sachdeva (sankush@yahoo.co.in)
|
||||
*/
|
||||
class EmojiAdapter extends ArrayAdapter<Emojicon> {
|
||||
OnEmojiconClickedListener emojiClickListener;
|
||||
public EmojiAdapter(Context context, List<Emojicon> data) {
|
||||
super(context, R.layout.emojicon_item, data);
|
||||
}
|
||||
|
||||
public EmojiAdapter(Context context, Emojicon[] data) {
|
||||
super(context, R.layout.emojicon_item, data);
|
||||
}
|
||||
|
||||
public void setEmojiClickListener(OnEmojiconClickedListener listener){
|
||||
this.emojiClickListener = listener;
|
||||
}
|
||||
|
||||
@Override
|
||||
public View getView(final int position, View convertView, ViewGroup parent) {
|
||||
View v = convertView;
|
||||
if (v == null) {
|
||||
v = View.inflate(getContext(), R.layout.emojicon_item, null);
|
||||
ViewHolder holder = new ViewHolder();
|
||||
holder.icon = (TextView) v.findViewById(R.id.emojicon_icon);
|
||||
v.setTag(holder);
|
||||
}
|
||||
Emojicon emoji = getItem(position);
|
||||
ViewHolder holder = (ViewHolder) v.getTag();
|
||||
holder.icon.setText(emoji.getEmoji());
|
||||
holder.icon.setOnClickListener(new OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
emojiClickListener.onEmojiconClicked(getItem(position));
|
||||
}
|
||||
});
|
||||
return v;
|
||||
}
|
||||
|
||||
class ViewHolder {
|
||||
TextView icon;
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,14 @@
|
|||
package github.ankushsachdeva.emojicon;
|
||||
|
||||
import android.content.Context;
|
||||
import android.text.style.ImageSpan;
|
||||
|
||||
/**
|
||||
* Created by lookshe on 16.08.2015.
|
||||
*/
|
||||
public class EmojiconImageSpan extends ImageSpan {
|
||||
|
||||
EmojiconImageSpan(Context context, int resourceId) {
|
||||
super(context, resourceId);
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,124 @@
|
|||
/*
|
||||
* 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 java.util.ArrayList;
|
||||
import java.util.StringTokenizer;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.SharedPreferences;
|
||||
|
||||
|
||||
/**
|
||||
* @author Daniele Ricci
|
||||
*/
|
||||
public class EmojiconRecentsManager extends ArrayList<Emojicon> {
|
||||
|
||||
private static final String PREFERENCE_NAME = "emojicon";
|
||||
private static final String PREF_RECENTS = "recent_emojis";
|
||||
private static final String PREF_PAGE = "recent_page";
|
||||
|
||||
private static final Object LOCK = new Object();
|
||||
private static EmojiconRecentsManager sInstance;
|
||||
|
||||
private Context mContext;
|
||||
|
||||
private EmojiconRecentsManager(Context context) {
|
||||
mContext = context.getApplicationContext();
|
||||
loadRecents();
|
||||
}
|
||||
|
||||
public static EmojiconRecentsManager getInstance(Context context) {
|
||||
if (sInstance == null) {
|
||||
synchronized (LOCK) {
|
||||
if (sInstance == null) {
|
||||
sInstance = new EmojiconRecentsManager(context);
|
||||
}
|
||||
}
|
||||
}
|
||||
return sInstance;
|
||||
}
|
||||
|
||||
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) {
|
||||
// FIXME totally inefficient way of adding the emoji to the adapter
|
||||
// TODO this should be probably replaced by a deque
|
||||
if (contains(object)) {
|
||||
super.remove(object);
|
||||
}
|
||||
add(0, object);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean add(Emojicon object) {
|
||||
boolean ret = super.add(object);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void add(int index, Emojicon object) {
|
||||
super.add(index, object);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean remove(Object object) {
|
||||
boolean ret = super.remove(object);
|
||||
return ret;
|
||||
}
|
||||
|
||||
private SharedPreferences getPreferences() {
|
||||
return mContext.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE);
|
||||
}
|
||||
|
||||
private void loadRecents() {
|
||||
SharedPreferences prefs = getPreferences();
|
||||
String str = prefs.getString(PREF_RECENTS, "");
|
||||
StringTokenizer tokenizer = new StringTokenizer(str, "~");
|
||||
while (tokenizer.hasMoreTokens()) {
|
||||
try {
|
||||
add(new Emojicon(tokenizer.nextToken()));
|
||||
}
|
||||
catch (NumberFormatException e) {
|
||||
// ignored
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void saveRecents() {
|
||||
StringBuilder str = new StringBuilder();
|
||||
int c = size();
|
||||
for (int i = 0; i < c; i++) {
|
||||
Emojicon e = get(i);
|
||||
str.append(e.getEmoji());
|
||||
if (i < (c - 1)) {
|
||||
str.append('~');
|
||||
}
|
||||
}
|
||||
SharedPreferences prefs = getPreferences();
|
||||
prefs.edit().putString(PREF_RECENTS, str.toString()).commit();
|
||||
}
|
||||
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,445 @@
|
|||
/*
|
||||
* 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.EmojiconGridView.OnEmojiconClickedListener;
|
||||
import github.ankushsachdeva.emojicon.emoji.Emojicon;
|
||||
import github.ankushsachdeva.emojicon.emoji.Nature;
|
||||
import github.ankushsachdeva.emojicon.emoji.Objects;
|
||||
import github.ankushsachdeva.emojicon.emoji.People;
|
||||
import github.ankushsachdeva.emojicon.emoji.Places;
|
||||
import github.ankushsachdeva.emojicon.emoji.Symbols;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import android.annotation.TargetApi;
|
||||
import android.app.Activity;
|
||||
import android.content.Context;
|
||||
import android.content.res.Resources;
|
||||
import android.graphics.Point;
|
||||
import android.graphics.Rect;
|
||||
import android.os.Build;
|
||||
import android.os.Handler;
|
||||
import android.os.SystemClock;
|
||||
import android.support.v4.view.PagerAdapter;
|
||||
import android.support.v4.view.ViewPager;
|
||||
import android.view.Display;
|
||||
import android.view.Gravity;
|
||||
import android.view.KeyCharacterMap;
|
||||
import android.view.KeyEvent;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
import android.view.View.OnClickListener;
|
||||
import android.view.ViewConfiguration;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
|
||||
import android.view.WindowManager;
|
||||
import android.view.WindowManager.LayoutParams;
|
||||
import android.widget.PopupWindow;
|
||||
|
||||
|
||||
/**
|
||||
* @author Ankush Sachdeva (sankush@yahoo.co.in).
|
||||
*/
|
||||
|
||||
public class EmojiconsPopup extends PopupWindow implements ViewPager.OnPageChangeListener, EmojiconRecents {
|
||||
private int mEmojiTabLastSelectedIndex = -1;
|
||||
private View[] mEmojiTabs;
|
||||
private PagerAdapter mEmojisAdapter;
|
||||
private EmojiconRecentsManager mRecentsManager;
|
||||
private int keyBoardHeight = 0;
|
||||
private Boolean pendingOpen = false;
|
||||
private Boolean isOpened = false;
|
||||
OnEmojiconClickedListener onEmojiconClickedListener;
|
||||
OnEmojiconBackspaceClickedListener onEmojiconBackspaceClickedListener;
|
||||
OnSoftKeyboardOpenCloseListener onSoftKeyboardOpenCloseListener;
|
||||
View rootView;
|
||||
Context mContext;
|
||||
|
||||
private ViewPager emojisPager;
|
||||
/**
|
||||
* 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 mContext The context of current activity.
|
||||
*/
|
||||
public EmojiconsPopup(View rootView, Context mContext){
|
||||
super(mContext);
|
||||
this.mContext = mContext;
|
||||
this.rootView = rootView;
|
||||
View customView = createCustomView();
|
||||
setContentView(customView);
|
||||
setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
|
||||
//default size
|
||||
setSize((int) mContext.getResources().getDimension(R.dimen.keyboard_height), LayoutParams.MATCH_PARENT);
|
||||
}
|
||||
/**
|
||||
* Set the listener for the event of keyboard opening or closing.
|
||||
*/
|
||||
public void setOnSoftKeyboardOpenCloseListener(OnSoftKeyboardOpenCloseListener listener){
|
||||
this.onSoftKeyboardOpenCloseListener = listener;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the listener for the event when any of the emojicon is clicked
|
||||
*/
|
||||
public void setOnEmojiconClickedListener(OnEmojiconClickedListener listener){
|
||||
this.onEmojiconClickedListener = listener;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the listener for the event when backspace on emojicon popup is clicked
|
||||
*/
|
||||
public void setOnEmojiconBackspaceClickedListener(OnEmojiconBackspaceClickedListener listener){
|
||||
this.onEmojiconBackspaceClickedListener = 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(rootView, 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
|
||||
pendingOpen = true;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @return Returns true if the soft keyboard is open, false otherwise.
|
||||
*/
|
||||
public Boolean isKeyBoardOpen(){
|
||||
return isOpened;
|
||||
}
|
||||
|
||||
/**
|
||||
* Dismiss the popup
|
||||
*/
|
||||
@Override
|
||||
public void dismiss() {
|
||||
super.dismiss();
|
||||
EmojiconRecentsManager
|
||||
.getInstance(mContext).saveRecents();
|
||||
}
|
||||
|
||||
@TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2)
|
||||
public int calculateScreenHeightForLollipop() {
|
||||
WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
|
||||
Display display = wm.getDefaultDisplay();
|
||||
Point size = new Point();
|
||||
display.getSize(size);
|
||||
return size.y;
|
||||
}
|
||||
|
||||
/**
|
||||
* Call this function to resize the emoji popup according to your soft keyboard size
|
||||
*/
|
||||
public void setSizeForSoftKeyboard(){
|
||||
rootView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
|
||||
@Override
|
||||
public void onGlobalLayout() {
|
||||
Rect r = new Rect();
|
||||
rootView.getWindowVisibleDisplayFrame(r);
|
||||
|
||||
int screenHeight = 0;
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
||||
screenHeight = calculateScreenHeightForLollipop();
|
||||
} else {
|
||||
screenHeight = rootView.getRootView().getHeight();
|
||||
}
|
||||
int heightDifference = screenHeight
|
||||
- (r.bottom - r.top);
|
||||
Resources resources = mContext.getResources();
|
||||
int statusBarId = resources
|
||||
.getIdentifier("status_bar_height",
|
||||
"dimen", "android");
|
||||
if (statusBarId > 0) {
|
||||
heightDifference -= resources
|
||||
.getDimensionPixelSize(statusBarId);
|
||||
}
|
||||
|
||||
//Resolved using http://stackoverflow.com/a/16608481/2853322
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
|
||||
int navBarId = resources.getIdentifier("navigation_bar_height", "dimen", "android");
|
||||
boolean hasMenuKey;
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
|
||||
hasMenuKey = ViewConfiguration.get(mContext).hasPermanentMenuKey();
|
||||
} else hasMenuKey = true; //Skip has menu key below ICS
|
||||
boolean hasBackKey = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_BACK);
|
||||
if (navBarId > 0 && !hasMenuKey && !hasBackKey) {
|
||||
heightDifference -= resources.getDimensionPixelSize(navBarId);
|
||||
}
|
||||
}
|
||||
|
||||
if (heightDifference > 100) {
|
||||
keyBoardHeight = heightDifference;
|
||||
setSize(LayoutParams.MATCH_PARENT, keyBoardHeight);
|
||||
if(isOpened == false){
|
||||
if(onSoftKeyboardOpenCloseListener!=null)
|
||||
onSoftKeyboardOpenCloseListener.onKeyboardOpen(keyBoardHeight);
|
||||
}
|
||||
isOpened = true;
|
||||
if(pendingOpen){
|
||||
showAtBottom();
|
||||
pendingOpen = false;
|
||||
}
|
||||
}
|
||||
else{
|
||||
isOpened = false;
|
||||
if(onSoftKeyboardOpenCloseListener!=null)
|
||||
onSoftKeyboardOpenCloseListener.onKeyboardClose();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 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() {
|
||||
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
|
||||
View view = inflater.inflate(R.layout.emojicons, null, false);
|
||||
emojisPager = (ViewPager) view.findViewById(R.id.emojis_pager);
|
||||
emojisPager.setOnPageChangeListener(this);
|
||||
EmojiconRecents recents = this;
|
||||
mEmojisAdapter = new EmojisPagerAdapter(
|
||||
Arrays.asList(
|
||||
new EmojiconRecentsGridView(mContext, null, null, this),
|
||||
new EmojiconGridView(mContext, People.DATA, recents, this),
|
||||
new EmojiconGridView(mContext, Nature.DATA, recents, this),
|
||||
new EmojiconGridView(mContext, Objects.DATA, recents, this),
|
||||
new EmojiconGridView(mContext, Places.DATA, recents, this),
|
||||
new EmojiconGridView(mContext, Symbols.DATA, recents, this)
|
||||
)
|
||||
);
|
||||
emojisPager.setAdapter(mEmojisAdapter);
|
||||
mEmojiTabs = new View[6];
|
||||
mEmojiTabs[0] = view.findViewById(R.id.emojis_tab_0_recents);
|
||||
mEmojiTabs[1] = view.findViewById(R.id.emojis_tab_1_people);
|
||||
mEmojiTabs[2] = view.findViewById(R.id.emojis_tab_2_nature);
|
||||
mEmojiTabs[3] = view.findViewById(R.id.emojis_tab_3_objects);
|
||||
mEmojiTabs[4] = view.findViewById(R.id.emojis_tab_4_cars);
|
||||
mEmojiTabs[5] = view.findViewById(R.id.emojis_tab_5_punctuation);
|
||||
for (int i = 0; i < mEmojiTabs.length; i++) {
|
||||
final int position = i;
|
||||
mEmojiTabs[i].setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
emojisPager.setCurrentItem(position);
|
||||
}
|
||||
});
|
||||
}
|
||||
view.findViewById(R.id.emojis_backspace).setOnTouchListener(new RepeatListener(1000, 50, new OnClickListener() {
|
||||
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
if(onEmojiconBackspaceClickedListener != null)
|
||||
onEmojiconBackspaceClickedListener.onEmojiconBackspaceClicked(v);
|
||||
}
|
||||
}));
|
||||
|
||||
// get last selected page
|
||||
mRecentsManager = EmojiconRecentsManager.getInstance(view.getContext());
|
||||
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.size() == 0) {
|
||||
page = 1;
|
||||
}
|
||||
|
||||
if (page == 0) {
|
||||
onPageSelected(page);
|
||||
}
|
||||
else {
|
||||
emojisPager.setCurrentItem(page, false);
|
||||
}
|
||||
return view;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addRecentEmoji(Context context, Emojicon emojicon) {
|
||||
EmojiconRecentsGridView fragment = ((EmojisPagerAdapter)emojisPager.getAdapter()).getRecentFragment();
|
||||
fragment.addRecentEmoji(context, emojicon);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onPageScrolled(int i, float v, int i2) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPageSelected(int i) {
|
||||
if (mEmojiTabLastSelectedIndex == i) {
|
||||
return;
|
||||
}
|
||||
switch (i) {
|
||||
case 0:
|
||||
case 1:
|
||||
case 2:
|
||||
case 3:
|
||||
case 4:
|
||||
case 5:
|
||||
if (mEmojiTabLastSelectedIndex >= 0 && mEmojiTabLastSelectedIndex < mEmojiTabs.length) {
|
||||
mEmojiTabs[mEmojiTabLastSelectedIndex].setSelected(false);
|
||||
}
|
||||
mEmojiTabs[i].setSelected(true);
|
||||
mEmojiTabLastSelectedIndex = i;
|
||||
mRecentsManager.setRecentPage(i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPageScrollStateChanged(int i) {
|
||||
}
|
||||
|
||||
private static class EmojisPagerAdapter extends PagerAdapter {
|
||||
private List<EmojiconGridView> views;
|
||||
public EmojiconRecentsGridView getRecentFragment(){
|
||||
for (EmojiconGridView it : views) {
|
||||
if(it instanceof EmojiconRecentsGridView)
|
||||
return (EmojiconRecentsGridView)it;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
public EmojisPagerAdapter(List<EmojiconGridView> views) {
|
||||
super();
|
||||
this.views = views;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getCount() {
|
||||
return views.size();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public Object instantiateItem(ViewGroup container, int position) {
|
||||
View v = views.get(position).rootView;
|
||||
((ViewPager)container).addView(v, 0);
|
||||
return v;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void destroyItem(ViewGroup container, int position, Object view) {
|
||||
((ViewPager)container).removeView((View)view);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isViewFromObject(View view, Object key) {
|
||||
return key == 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.
|
||||
*/
|
||||
public static class RepeatListener 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 RepeatListener(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;
|
||||
}
|
||||
}
|
||||
|
||||
public interface OnEmojiconBackspaceClickedListener {
|
||||
void onEmojiconBackspaceClicked(View v);
|
||||
}
|
||||
|
||||
public interface OnSoftKeyboardOpenCloseListener{
|
||||
void onKeyboardOpen(int keyBoardHeight);
|
||||
void onKeyboardClose();
|
||||
}
|
||||
}
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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),
|
||||
};
|
||||
}
|
|
@ -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),
|
||||
};
|
||||
}
|
|
@ -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),
|
||||
};
|
||||
}
|
|
@ -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"),
|
||||
};
|
||||
}
|
|
@ -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),
|
||||
};
|
||||
}
|
After Width: | Height: | Size: 1.8 KiB |
After Width: | Height: | Size: 1.8 KiB |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 1.8 KiB |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 1.3 KiB |
After Width: | Height: | Size: 1.6 KiB |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1 KiB |
BIN
libs/emojicon/src/main/res/drawable-hdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 9.2 KiB |
After Width: | Height: | Size: 227 B |
After Width: | Height: | Size: 2 KiB |
After Width: | Height: | Size: 2 KiB |
After Width: | Height: | Size: 1.6 KiB |