1) EmojiTextView and EmojiEditText are used instead of
using code to emojify text.
2) Emoji categories' code points are specified in XML
3) EmojiDrawer itself is a fragment, and its pages are
also fragments, allowing for better memory
management.
Fixes#2938Fixes#2936Closes#3153
// FREEBIE
Drawables are (strangely) mutable objects. We reuse a single
drawable for each recipient, but some avatar views (the
conversation list -- 40dp) are larger than others (the
conversation -- 30dp).
This results in a situation where TextDrawable doesn't render
itself appropriately, because the bounds are modified by a larger
view.
Giving the Drawable an intrinsic width and height resolves this
conflict.
// FREEBIE
If the contact doesn't have an image, render a color-coded
background and the first letter of the contact's name.
1) Don't display anything during recipient resolution.
2) Display a # icon in material gray for recipients with no name.
3) Display a material group icon in material gray for groups with
no avatar icon set.
Closes#3104
// FREEBIE
1) Utilize the hidden API requestRouteToHostAddress that takes an
InetAddress (IPv6-capable) instead of a forced IPv4 integer-
encoded address. Will fallback to the IPv4 one if reflection
fails for whatever reason.
2) If on Lollipop and our manual MMS code doesn't work, will try
to use the Lollipop API and give it 60 seconds instead of 30,
since I did run into the timeout not being long enough in
certain conditions and I'm thinking maybe it just wasn't long
enough for some carriers.
Closes#3105
// FREEBIE
1) add VIEW action and BROWSABLE category to SmsSendtoActivity intent filter
2) created class Rfc5724Uri for processing RFC5724 SMS URIs
3) added a set of tests for new Rfc5724Uri class
4) updated SmsSendtoActivity to use Rfc5742Uri for processing VIEW intents
Fixes#2578Closes#3030
// FREEBIE
Combined with the switch to server acked messages, this will
prevent the race condition that occurred when an incoming message
showed up at exactly the moment the app updated.
It'd be great if we could just do REPLACE INTO, but it's too
late to add a UNIQUE() constraint. =(
Fixes#2287Closes#3029
// FREEBIE
1) fixed DateUtils to use SimpleDateFormat for everything because it respects Locale
2) added getCurrentLocale() method to DynamicLanguage
3) allow PassphraseRequiredActionBarActivity.initFragment() to accept a Locale
4) updated classes that depend on DateUtils to pass down Locale from DynamicLanguage
Fixes#2684Closes#2725
// FREEBIE
The recent emoji tab was sorting emoji as last in last out instead
of last in first out. Also, if an emoji was already in the recent
emoji cache its order would not be updated on reinsert.
Fixes#2967Closes#2946
// FREEBIE