Project aTalk-Android Release Notes
=========================================================================
Version:        4.6.1 (406010)
Release Date:   11/20/2025
Author:         cmeng
- Enable an important debug message i.e. 'The provider state changed...' to be printed in release version.
- OperationSetBasicInstantMessagingJabberImpl#onCarbonCopyReceived: Skip handling of empty msgBody for all incoming message, in case Jid is null from FFR

=========================================================================
Version:        4.6.0 (406000)
Release Date:   11/14/2025
Author:         cmeng
- Port aTalk to use smack 4.5.0-rc1 release
- Set aTalk minSdkVersion = 26 and sourceCompatibility JavaVersion.VERSION_11 to be compatible with smack 4.5.0
- Fix JingleFile function call HashManager.getMessageDigest(algorithm) throws NoSuchAlgorithmException: SHA3-256;
  OSGiService makes direct call to smack SecurityUtil.ensureProviderAtFirstPosition(BouncyCastleProvider.class);
  Smack 4.5.0 exclude openpgp in build, causing FileNoFound during smack init. hence 'BC' order is not set.
  See Smack 4.5.0-beta9: JingleFile function call HashManager.getMessageDigest(algorithm) throws NoSuchAlgorithmException: SHA3-256
  https://discourse.igniterealtime.org/t/smack-4-5-0-beta9-jinglefile-function-call-hashmanager-getmessagedigest-algorithm-throws-nosuchalgorithmexception-sha3-256/96162- Remove XMPP-Bosh patch for reconnection failure on network changed - implemented in smack 4.5.0.
- Change aTalk smack classes to extends XmlElement in place of ExtensionElement where possible.
- Need to add configuration {all*.exclude group: 'xpp3', module: 'xpp3' and 'xpp3_min'} to resolve duplicate class during build.
- Do not crash the aTalk app when creating account over insecure connection; show error message instead.
- Rename IBRCaptchaProcessDialog to IBRProcessDialog; must handle registration for both with/without Captcha Protection;
  Must allow user to click the submit button for IB Register when without captcha protection.
- Proceed to purge local user registration record only if serverAccountDeletion is successful.
- Optimize AccountInfoPresenceActivity implementation to minimize views dynamic settings programmatically.
- Cleanup and update aTalk.doap file.
- Remove 'com.jakewharton.threetenabp:threetenabp:1.4.9' dependency; Duration is supported in API-26
- Remove all aTalk source support for < API-26 build support i.e. (Build.VERSION.SDK_INT < Build.VERSION_CODES.O)
- Upgrade libraries org.bouncycastle:xxx-jdk18on:1.79 and org.jitsi:zrtp4j-light:4.1.3 etc
- Remove patch for ejabberd <= 23.01; it sends presence's 'photo' element with no hash value, after user published a new avatar.
- aTalk v4.6.0 is the last version to support OTR. OTR will be removed in aTalk 5.0.0 or later releases.


*** Observation with no solution implemented: ***
- Some android devices seem unable to handle properly display info setup (TooManyViews) in AccountInfoPresenceActivity,
  causing ANR in FFR i.e. AccountInfoPresenceActivity$$ExternalSyntheticThrowIAE2.m
  * Do not check isDetailClassEditable() and isDetailClassSupported()
  * Simplify the views dynamic settings programmatically, and fixed them in layout xml;
- aTalk cannot send file to own self using JingleFile Transfer or Legacy Si file transfer.
- Jarjar repackage errors for smack-experimental, smack-extensions and smack-omemo;
  ignored as all the jarjar repackaged files creation are OK. e.g.
  UnsupportedOperationException: NestHost requires ASM7
  UnsupportedOperationException: NestMember requires ASM7

- aTalk uses PlugInManager to add custom code or to remove unimplemented jmf default codecs:
  However PlugInManager.getPlugInList(), the instantiate class will immediately trigger static method that execute
  getPluginInfo(className) hence showing 'Problem loading plugin ...". By design???

=========================================================================
Version:        4.5.3 (405030)
Release Date:   10/09/2025
Author:         cmeng
- Last AccountInfoPresenceActivity$DetailsLoadWorker fix seems not effective. Move some tasks execution out of the UI thread;
- Also change all its other tasks (~400mS) to run under ExecutorService thread; seems not required to runOnUiThread.
- Reset hasChanges to false on first entry to AccountInfoPresenceActivity$DetailsLoadWorker.
- Migrate more deprecated method onBackPressed to use OnBackPressedCallback.
- Update aTalk.doap and README.md files.

=========================================================================
Version:        4.5.2 (405020)
Release Date:   10/02/2025
Author:         cmeng
- Executors.newSingleThreadExecutor() in AccountInfoPresenceActivity$DetailsLoadWorker must implement shutdown and awaitTermination, else ANR in FFR:
  at java.util.concurrent.ThreadPoolExecutor.awaitTermination (ThreadPoolExecutor.java:1471)
  at java.util.concurrent.Executors$DelegatedExecutorService.awaitTermination (Executors.java:700)
  at org.atalk.android.gui.account.AccountInfoPresenceActivity$DetailsLoadWorker$$ExternalSyntheticThrowIAE2.m (D8$$SyntheticClass)

  a. at org.atalk.android.gui.chat.chatsession.ChatSessionFragment$InitChatRoomWrapper.execute (ChatSessionFragment.java:528)
  b. at org.atalk.android.gui.chat.ChatFragment$LoadHistoryTask.execute (ChatFragment.java:2329)
  c. at org.atalk.android.gui.chat.ChatFragment$SendFile.execute (ChatFragment.java:2641)
  d. at org.atalk.android.gui.chatroomslist.ChatRoomCreateDialog$InitComboBox.execute (ChatRoomCreateDialog.java:190)
  e. at org.atalk.android.gui.chatroomslist.ChatRoomBookmarksDialog$InitBookmarkedConference.execute (ChatRoomBookmarksDialog.java:224)
- Avoid using smack StringUtils.isEmpty as it does not check for null content.

=========================================================================
Version:        4.5.1 (405010)
Release Date:   09/04/2025
Author:         cmeng
- Fix XMPP-Bosh reconnection failure on network changes; Need to set XMPPBOSHConnection#isFirstInitialization to true on network close on error.
- Set ndkVersion = '28.2.13676358' in build.gradle
- Clean up NDK build script files for vpx etc.

*** Observation with no solution implemented: ***
SSL Certificate is not available when using XMPP-Bosh Connection

=========================================================================
Version:        4.5.0 (405000)
Release Date:   09/04/2025
Author:         cmeng
- Upgrade jni libraries:
  * libvpx 1.15.2 <= 1.13.1
  * opus 1.5.2 <= 1.3.2
  * openssl 3.5.2 <= 1.1.1t
  * x264 165 <= 164
- Fix cast exception introduced in 4.0.0 when apply fix for duplicate sending of the initial <presence/> stanza by smack ServiceDiscoveryManager.
  Cause Bosh connection to crash. Need to cast to common base class in isSendPresence = ((AbstractXMPPConnection) connection).getConfiguration().isSendPresence()
- Fix endless loop in discoverInfoNonBlocking at times, caused by BareJid discInfo access; Block all BareJid discoInfo access.
- Fix notification replied message not shown in chatSession UI, until it is closed and reopen.
- Fix XMPP-Bosh reconnection failure on network changes; Need to set XMPPBOSHConnection#isFirstInitialization to true on network close on error.
- Set ndkVersion = '28.2.13676358' in build.gradle
- Jni scripts clean up, and Standardize jni *.mk naming convention.
- Update openssl jni scripts to take care of new library releases in version checking
- Change build.gradle task names to properly reflect the actual tasks performed.
- Add new Finnish (suomi) language support

*** Observation with no solution implemented: ***
- Upon debug install, sometimes smack does not receive incoming messages (no logcat), until aTalk is open.
  ChatState receive is normal.
- libvpx build process
1. Building of libvpx using build.make.Android_ndk.mk does not work
a comments in Android.mk is outdated i.e. sdk-path is invalid

=========================================================================
Version:        4.4.0 (404000)
Release Date:   07/14/2025
Author:         cmeng
- Upgrade aTalk to support Android-16 Baklava (API-36) with the following changes:
  * Android Studio Narwhal | 2025.1.1
  * https://services.gradle.org/distributions/gradle-8.14.2-bin.zip
  * classpath 'com.android.tools.build:gradle:8.11.1'
  * classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:2.0.21'
- add org.gradle.configuration-cache=false in gradle.properties
- Remove tools:replace="android:allowBackup,android:label" in manifest file.
- add plugins {id 'org.gradle.toolchains.foojay-resolver-convention' version '1.0.0'} in settings.gradle
- Third party libraries upgraded to latest compatible version for API-36:
  * core-ktx: 1.16.0 <= 1.13.1
  * activity-ktx:1.10.1 <= 1.9.3
  * media3-exoplayer:1.7.1 <=> 1.4.1
  * media3-ui:1.7.1 <= 1.4.1
  * threetenabp:1.4.9 <= 1.4.2
  * libphonenumber:9.0.9 <= 8.12.29
  * okhttp:5.1.0 <= 5.0.0-alpha.16
  * commons-text:1.13.1 <= 1.10.0
  * apache-mime4j-core:0.8.12 <= 0.8.9
  * bcpg-jdk15on:1.70, bcpkix-jdk15on:1.70 bctls-jdk15on:1.70 <= 1.65
  * jmdns:3.6.1 <= 3.5.7
  * osmdroid-android:6.1.20 <= 6.1.17
  * lifecycle-runtime-ktx:2.9.1 <= 2.7.0
  * appcompat:1.7.1 < 1.7.0
  * recyclerview:1.4.0 <= 1.3.2
- Build aTalk with support for 16 KB devices; Compile aTalk jni libraries using 16 KB ELF alignment
  * https://developer.android.com/guide/practices/page-sizes#ndk-build
  * use ndkVersion = '28.1.13356709' <= '22.1.7171670'
  * add LOCAL_LDFLAGS += "-Wl,-z,max-page-size=16384" in all Android.mk files
  * add APP_SUPPORT_FLEXIBLE_PAGE_SIZES := true
- Add support to properly handle EdgeToEdge overlay content in aTalkApp; not compatible with aTalk.
- Received muc message incorrectly classified as outgoing message; introduced in 4.3.0 release.
- Fix auto normal/omemo switching on received omemo message; errors introduced during MenuProvider migration.
- Remove ContentEditText class; Implement ChatController using OnReceiveContentListener interface instead.
- ReImplement FullScreenHelper for aTalk usage and to remove all deprecated functions.
- Replace deprecated ProgressDialog with aTalk customized ProgressDialog implementation.
- Replace deprecated NetworkInfo with networkCapabilities to check for VPN connection in AndroidUsingLinkProperties.
- Migrate deprecated intent.getSerializableExtra() to IntentCompat.getSerializableExtra(), and
  bundle.getSerializable() to BundleCompat.getSerializable().
- Replace TimePicker deprecated method calls.
- ReImplement TouchInterceptor or avoid use of deprecated function calls.
- Reimplement OsmActivity using NetworkCallback instead of BroadcastReceiver.
- Update deprecated function calls in Smack libraries.

*** Observation with no solution implemented:
- AppGUIActivator.getContactListService() (registered in ContactlistActivator) in ChatSessionManager has null reference
  on start debug - SDK JIT problem? not fixed
- JNI static_library_built still using ndk/22.1.7171670; problem with ndk/28.1.13356709
  e.g. llvm-strip: error: 'common/arm/quant-a-10.o': not stripping symbol 'mask_2bit' because it is named in a relocation

=========================================================================
Version:        4.3.1 (403010)
Release Date:   06/21/2025
Author:         cmeng
- Cleanup and fix all errors for Provisioning implementation classes.
  Add new provisioning settings support in aTalk e.g. EXPERT_SETTING_DISABLED, PROVISIONING_DISABLED etc
  Cleanup and fix all errors in Provisioning implementation classes.
  See https://cmeng-git.github.io/atalk/faq.html#feature_16
- Relocate 'Provisioning' menu to root UI Settings..., delink it from 'Expert settings'
- Use ConfigEditText to ensure the preference UI is filled and shown the stored value on open without using summaryMapper;
  When use, both preference "android:key" and the stored parameters must use the same name, else store will have extra "android:key" parameter.
- ProvisioningSettings and ProvisioningServiceImpl variables must be in sync for proper saving and retrieval.
- Allow user entry of username and password in provisioning setting for server authentication.
- Rename HttpConnectionManager to OkhttpUtils; cleanup and fix all implementation errors for provisioning use. Remove httpUtils.
- Remove unused classes LazyConfigurationForm, ConfigurationForm, ProvisioningForm, and MediaConfigurationService.
- Improper Base64Encoded password in DB causes crash in CredentialsStorageServiceImpl#movePasswordProperty()
- Create style_pref_button to ease user in preference button identification.

=========================================================================
Version:        4.3.0 (403000)
Release Date:   05/19/2025
Author:         cmeng
- Show Badge indicator on incoming file request; to ease user identification of the sender in contact list main UI.
- Enable HeadsUp notification for incoming file transfer request to alert user when device is in standby;
  Launch 'App Info...' settings, user must update the File Transfer Notification settings.
  See https://developer.android.com/develop/ui/views/notifications/channels#UpdateChannel.
- Ensure multiple files send/receive for HTTPFileUpload, JingleFileSend and Legacy Bytestream transfer protocols are handled properly; improve UI and process reliability.
- Must re-init all UI button actions whenever the xFileConversationForm is called on UI refresh; as inflateViewForFileTransfer() will change their references.
- Fix ConcurrentModificationException in JingleS5BTransportCandidateImpl#connectToCandidates() checking.
- Change to use TOTAL_CONNECTION_TIMEOUT (10s) for each candidate in establishBytestreamSession checking.
- Do not set file sending/receiving state as History Record while it is still active;
  else any UI refresh will interrupt file transfer, although file transfer may still running in background.
  This happen when send/receive new text or during multiple files receiving.
- Must create file record in DB for proper HTTP file download process update; else the cached info is destroyed when user closes the chat session.
- Use Math.max(COLUMN_TOTAL_SIZE_BYTES, COLUMN_BYTES_DOWNLOADED_SO_FAR) for HttpFileDownloadJabberImpl#queryFileSize();
  later is found to contain file size, and COLUMN_TOTAL_SIZE_BYTES always return 0. Download Manager implementation error?
- Improve and clean up HttpFileDownloadJabberImpl implementation e.g. progress query by Id instead of status.
- Must implement HttpFileDownloadJabberImpl#getTransferredBytes for proper HttpFileDownload progressBar update.
- Implement and support XEP-0066: Out of Band Data sending in Http file transfer in contact or muc chat session.
- Ensure the file transfer UI is shown (post delay 0.5S) before proceed to auto accept file transfer if enabled.
- Fix progressBar indicator not properly updated when the received file size in unknown in HttpFileDownload process.
- Do not constraint the IncomingFileTransferJingleImpl#progress() update with 10mS UPDATE_INTERVAL;
  else final rwBytes may not be reflected in the UI progressBar.
- Ensure all message event ID's in outgoing file transfer are in sync with the file record saved in database for proper status update.
- When file transfer form is first created, it must check that (getXferStatus() == FileTransferStatusChangeEvent.UNKNOWN)
  before start any file send/received process. else file transfer may get repeated in UI.
- Ensure all status definitions in both FileTransferStatusChangeEvent and FileRecord are in sync for correct status tracking.
- Ensure the transport candidates use in file transfer are properly refreshed when the device active network connection is changed.
- Avoid using static mBuilder for both JingleContentDescription and JingleContentTransport; else multiple JingleFileTransfer will interference with each other.
- JingleSessionImpl#jingleSessionListeners cannot be static; otherwise updateSessionState will interfere with each other in multiple files transfer.
- During multiple Jingle files receive, sometimes has the following exception ('session-accept' sent twice):
    JingleIncomingFileOffer.onBytestreamReady() Cannot get InputStream from BytestreamSession:
    java.net.SocketException: Socket is closed java.net.SocketException: Socket is closed
    The problem is due to Recipient send accept twice - problem fixed.
- Legacy file transfer uses the same instance of OperationSetFileTransferJabberImpl to send file with the same NegotiationProgress status callback;
  hence unable to support multiple files transfer. Use difference NegotiationProgress for each OutgoingFileTransferJabberImpl to fix the problem.
- Need to block the unexpected delayed info messages on HttpFileDownload send from server multiple times; else repeated UI requests user to accept file.
- Add serverMsgId and remoteMsgId value to the file history record in the database; to check for unexpected delay info messages send from server.
- Ignore any empty body forward message received during MamQuery process update.
- Fix ChatState notifications not handle properly in MUC chat session.
- Save last send/received message timestamp into mamDate in session record, avoid deleted messages reappear in UI when user relaunch aTalk.
  When last send/received message are purged, then user exit/terminate aTalk. All the purged messages will get retrieved via mamQuery.
  This is because the last message timeStamp is not saved into the session mamDate, and last cached info is destroyed on exit.
- Use OriginIdElement as msgUid if the received message does not contain the msgId.
- Move subclass common CameraCaptureSession.StateCallback into base class CameraStreamBase.
- Replace deprecated option menu setHasOptionsMenu() implementation with MenuProvider.
- Replace deprecated FragmentPagerAdapter with FragmentStateAdapter for the main aTalk MainPagerAdapter.
- Add Arabic language support.

*** Observation with no solution implemented:
- Share from other app works only if aTalk is active (aTalk must be launched and registered on the network);
  Requires aTalk to be registered with network, also onCreateView() is not being called when aTalk is inactive.
- Sometimes JingleFileTransfer request is not received by recipient; and sender abort after 10s timeout; Then the sender fallback to other methods.
  Sometimes aTalk does not receive JingleIncomingFileOffer messages (missing in logcat) after a new build debug. Other Jingle request is ok.
- During multiple files send process, all FileSendConversation UI must be brought/scrolled into view before the file sending is triggered.
- During multiple file send, the 'session-initiate' may not be sent if the sender UI is not in view.
  User has to scroll the UI into view to start. Waiting for UI status to complete the update.
- On file send error, a 'retry' option is offered. However this option is cleared if the user scrolls, and the UI get refresh as History record.

=========================================================================
Version:        4.2.2 (402020)
Release Date:   03/24/2025
Author:         cmeng
- Force aTalk to restart if user made changes to android HW Codec Expert settings; for them to be active.
- ZRTPTransformEngine#initialize(): Fix ZidFile length must not be zero if exist, else ZidFile.open will failed.
- Ensure android encoder inputSurface for remote video streaming is init only once, else video streaming will fail.
  This fixes eglCreateWindowSurface: native_window_api_connect failed (already connected to another API?)
  eglCreateWindowSurfaceTmpl:684 error 3003 (EGL_BAD_ALLOC)
- Video resolution setting will use the closest match camera capability if exact match to user selected value is not available.

*** Observation with no solution:
- HW H264 decoder crashes on J730 when media exchange with Note10 (HW or SW H264 Encoder); but work with AVD Pixel API-34(100%)/33(90%)/31(70%).
  A  Fatal signal 6 (SIGABRT), code -6 (SI_TKILL) in tid 5240 (MediaCodec_loop), pid 3595 (g.atalk.android)
  With AVD Pixel API-27, at times failed as above or #Do process for codec: OMX.Exynos.avc.dec; Exception: null java.lang.IllegalStateException
- SurfaceStream#initSurfaceConsumer: AVD Pixel6 throws EGL_BAD_ATTRIBUTE for Surface Stream (Note-10 is OK); so just ignore

=========================================================================
Version:        4.2.1 (402010)
Release Date:   02/19/2025
Author:         cmeng
- BaseActivity#configureToolBar must handle and enable custom actionBar setup; else ShareActivity crash.
- Update German and Russian string.xml files.
- Remove unused classes/files.

=========================================================================
Version:        4.2.0 (402000)
Release Date:   02/10/2025
Author:         cmeng
- Reimplement deprecated classes/methods i.e. onBackPressed and AsyncTask with new functions.
- Fix show aTalk icon MissingForegroundServiceTypeException; use NotificationManager.notify() instead.
- Need to add READ_EXTERNAL_STORAGE permission (Files and Media) request for android API-32.
- Implement newly added READ_MEDIA_VISUAL_USER_SELECTED permission for android API-34.
- Do not launch BatteryOptimization permission request within a dialog, else parseResult is based on dialog click.
- ActivityResultContract#parseResult on BatteryOptimization request must return isOptimizingBattery() state.
- UpdateServiceImpl#isLatestVersion need to close inputStream after access end.
- Add BaseActivity, BaseFragment, BaseDialogFragment and BasePreferenceFragment classes, and subclass OSGi unrelated classes to these instead; Remove unused OSGi classes.
- Remove all imageStreaming classes, aTalk does not support desktop sharing.
- Clean up app sources and rename some packages names.
- Update all app used libraries to the latest compatible releases.

=========================================================================
Version:        4.1.1 (401010)
Release Date:   06/10/2024
Author:         cmeng
- Change default thumbnail size to 128x96 with jpeg compress 80% quality; better visibility and converse bandwidth.
  ejabberd.yml shaper@normal set to 50KB/s
- CryptoFragment: Skip if previous check has omemo supported. The OmemoManager.contactSupportsOmemo can cause ANR in OmemoManager.encrypt
- Check for ConfigurationUtils#mConfigService not null before proceed to handle any setting changes.
- Back key during call will exit screen block if UI is not responding due to proximity sensor problem.
- Consolidate and move all si file transfer classes into smack directory.

=========================================================================
Version:        4.1.0 (401000)
Release Date:   05/14/2024
Author:         cmeng
- Add Jingle Content Thumbnails (XEP-0264) support in Jingle File Transfer (XEP-0234) protocol.
  * Thumbnails is disabled for OMEMO Jet; no defined protocol to support.
  * Add ThumbnailProvider class for Thumbnail element parsing in JingleFileTransferProvider.
  * Include Thumbnail element handling in JingleFile and JingleFileTransferChild classes.
  * OutgoingFileOfferJingleImpl: Implement bobInfoInit handler for thumbnail support.
  * IncomingFileOfferJingleImpl: implement getThumbnail() with callback.
- Optimize and cleanup OperationSetFileTransferJabberImpl for XEP-0264: Jingle Content Thumbnails support:
  * OperationSetFileTransferJabberImpl#fileTransferRequest: let thumbnail request to be handled by FileReceiveConversation.
  * OutgoingFileTransferJabberIml handles bobInfoInit at constructor, and remove StanzaListener to insert Thumbnail element.
  * IncomingFileTransferRequestJabberImpl: add getThumbnail() with callback.
- Block and alert user if attempt to send encrypted file via XEP-0096: SI File Transfer.
- Update smack library classes to fully support Jingle Content Thumbnails (XEP-0264) in legacy Si and Jingle File Transfer.
  * Rename ThumbnailStreamInitiationProvider to StreamInitiationProvider, and replace smack class file.
  * Cleanup and update StreamInitiation.File to support Thumbnail element, and remove thumbnail.ThumbnailFile class file.
  * FileTransferRequest: add getThumbnail() method.
  * OutgoingFileTransfer: Add new thumbnail parameter in sendFile() etc for use in FileTransferNegotiator.negotiateOutgoingTransfer().
  * FileTransferNegotiator: Add thumbnail element in XEP-0096: SI File Transfer stanza sending.
  * JingleFileTransferProvider: Support Thumbnail parsing.
- Dropped changing thumbnail default size to 128x96 in file transfer.
  * Current BobData response time is ~16s (jpeg=14784) and 39s (png=31326) with thumbnail size = 128 x 96.
  * Thumbnail size 64x64 => jpeg 5303 and takes ~7s; use this as default
- Scale thumbnail x2 for display in file transfer request UI.
- OutgoingFileOfferJingleImpl needs to perform process cleanup upon ProgressListener#onFinished().
- Must init JetManager when user is authenticated, ready for advertise JET feature in DiscoveryManager;
  else JetManager security file transfer support is not working.

=========================================================================
Version:        4.0.2 (400020)
Release Date:   05/01/2024
Author:         cmeng
- Add new permissions required for API-34 and change UI to support.
- Add 'App Info' option in main menu to view/change aTalk permission settings; different android devices have own implementations.
- Check and skip process for duplicated presence with caps sent from server; OperationSetPersistentPresenceJabberImpl#userCapsNodeNotify() process.
- Add CapExtension flag in ContactPresenceStatusChangeEvent, and remove unused constructor.
- Must handle userCapsNode Notify for presence goes offline for fullJid; else call options on UI are not updated.
- ReImplement ServiceDiscoveryHelper#discoverInfoNonBlocking() to minimize device ANR.
- Fix send file status not being updated to DB, and remain at STATUS_WAITING; accidentally commented out since v3.2.2.
- Http Download to proceed with auto-download only if the file size from server is known.
- In API-34, a file selected via picker for sending may be a url link temporary created by android system for file sharing;
  this url link is invalid and not accessible to aTalk when user returns to the chat UI again. The url link is
  i.e. /storage/emulated/0/.transforms/synthetic/picker/0/com.android.providers.media.photopicker/media/1000000043.jpg
- Execute purgeCorruptedOmemoKey() in new Thread to avoid ANR.
- Upgrade smack libraries to 4.4.8.
- Migrate com.google.android.exoplayer:exoplayer:2.19.1 to androidx.media3:media3-exoplayer:1.3.1.
- Simplify String parameter names and clean up unused resources.
- Add aTalk.doap file.

=========================================================================
Version:        4.0.1 (400010)
Release Date:   03/28/2024
Author:         cmeng
- Removal of a contact shall purge all its associated history messages, call records and its sessionUuid.
  Otherwise recreate same contact will inherited old sessionUuid and history messages, causing mamQuery problem.
- Improve 'Recent conversations' interface to disable multi-item selection; and allow purge of orphan chat session.
- Add support to delete history messages based on sessionUuid i.e. no associated contact or chatRoom.
- EntityListHelper history record delete will return the actual deleted records count, for display to user.
- Change EntityListHelp to support FragmentActivity caller i.e. onTaskComplete callback to its caller directly.
- ChatPanel#mamQuery must use actual sessionUuid from DB; and it may not be the same as mChatId.

=========================================================================
Version:        4.0.0 (400000)
Release Date:   03/23/2024
Author:         cmeng
- Fix duplication of chat messages received via delayed delivery in group chat;
  Happen if user rejoins group chat after logout/login; last sent message timestamp not save in configuration
- Fix duplicate display of incoming delayed messages in contact chat session; happen if mam messages are received before delayed messages
- Fix incoming delayed encrypted messages out of timestamp order display. Process times vary for encrypted messages.
  Must sort msgCache before its use.
- If user goes offline after messages sent to an offline buddy; Upon messages received by buddy,
  the receipt status of these messages are not updated in chat UI when user goes online again.
  Move ReceiptReceivedListener implementation out of ChatFragment, and into MessageHistoryServiceImpl with callback.
  This ensure the ReceiptReceivedListener are ready upon user login.
- UserAvatar migrates to use PepEventListener, and ensure proper handling of avatar removal pubsub#event.
  * also avoid retrieve image byte and pass as parameter in function call.
- Update VCardAvatarManager to check and skip repeated request from multiple (x4) user presence's received.
- User new avatar update are published via XEP-0084, and XEP-0153; ejabberd
  responses to the later with vcard-temp and no photo hash, causing aTalk to remove the avatar.
  * Disable VCardAvatarManager process of vcard-temp with no photo hash; use only 'XEP-0084: User Avatar' pubsub#event.
  * Problem reported and fixed by ejabberd: https://github.com/processone/ejabberd/issues/4182
    ejabberd sends presence's, photo element with no hash value, after user publishes a new avatar #4182
- Fix avatar changes received via XEP-0153/XEP-0084 are not updated to the contact/user until user next re-login;
  also user (added as contact entity) avatar does not get updated.
- Merged both UserAvatarListener and VcardAvatarListener into one AvatarChangeListener for more efficient handling of avatar changes.
- ContactJabberImpl introduces new retrieveIfNecessary in getAvatar(boolean) on dynamic request,
  separately it from retrieveOnStart which should be set on user login.
- userCapsNodeNotify() should be handled for each protocolProvider, to support multiple user accounts setup.
- Skip OperationSetPersistentPresenceJabberImpl#publishPresenceStatus(), if user selected the same 'Presence Status'.
- Fix duplicate sending of the initial <presence/> stanza by smack ServiceDiscoveryManager.
- Move ServiceDiscoveryHelper#userCapsNodeNotify() into OperationSetPersistentPresenceJabberImpl,
  tagged to Roster#presenceChanged() callback for process improvement.
- ChatRoomCreateDialog: initAccountSpinner() only after initComboBox(); else onItemSelected() will trigger
  initComboBox() and second network access duplication;
- Remove main menu 'Sign out' and 'Exit' options to prevent user unintentionally unregistered himself from server;
  e.g. unable to receive incoming call.
- SmackConfiguration.setDefaultReplyTimeout to 10000 ms.

=========================================================================
Version:        3.4.0 (304000)
Release Date:   02/29/2024
Author:         cmeng
- AndroidOmemoService initOmemoDevice() setReplyTimeout not working and always failed with NoResponseException;
  * Implement setReplyTimeout for both Async.go in smack OmemoManager/OmemoService, else set value is reset by aTalk other stanza processes.
  * set in OmemoService for initializeAsync(), and within the PepEventListener<OmemoDeviceListElement>
  See https://discourse.igniterealtime.org/t/smack-4-4-7-xmppconnection-setreplytimeout-value-is-not-guaranteed-when-the-stanza-is-sent-asynchronously/93636
- Smack OmemoManager handle of Pubsub#event in PepEventListener has NoResponseException; end in endless loop when server
  send multiple (x15) Pubsub#event's, and eventually eventually crashes smack with InvalidXmlException.
  setReplyTimeout to 15s and block all new Pubsub#Event once it is served, check via publishedDeviceList.
- Finally aTalk decided to make local changes, replacing the 2 files in smack-omemo library i.e.
  a. OmemoManager.java and
  b. OmemoService.java classes
- Remove all the new created volatile contacts on exit 'Show Block List', else deleted contacts reappear in contactList.
- Alert dialog drawable/background_alert_dialog must use ?attr/colorBackground, to align with text font theme color.
- Set aTalk minSdkVersion to API-24; diminish support in android libraries for < API-24
- Drop dependency and replace com.code-troopers.betterpickers with android DatePicker-spinner mode (API-24).
- Improve call history deletion UI for all call records prior to user set date.
- Improve account preference birth date setting UI.
- Remove MapsInitializer.initialize(), no further required; default to use Renderer.LATEST
  see https://developers.google.com/maps/documentation/android-sdk/renderer#opt-out
- Remove all old classes supporting <API-24: AbstractFunction, Consumer, Function, Predicate, and Supplier
- Halt upgrade jni library libvpx 1.13.1 to 1.14.0; ABI mismatch when run on armeabi-v7a and x86-64. arm64-v8a is OK.

=========================================================================
Version:        3.3.7 (303070)
Release Date:   02/21/2024
Author:         cmeng
- Add support for XEP-0191: Blocking Command to block communications with a specific contact and domain.
- Implement EntityCapsPersistentCache using mySQlite DB instead of file system for speed.
- Fix erased contact/chatroom history messages reappear after return to chatSession;
  messages are retrieved from unclear chatPanel@msgCache.
- Disable 'Contact Info' option when user is offline; Contact Info is not properly initialized when user is offline.
- Must initPreferences() for all views before setPreferencesFromResource(); else any updated values in shared_prefs
  will not be reflected in preference UI: IceFragment, TelephonyFragment and XmppConnectionFragment
- Allow user removal of a DomainJid from the contact list UI.
- Allow user moving of contact not in the Roster; ServerStoredContactListJabberImpl#moveContact()
- Include check contact blocking state in MetaContactRender#isShowCallBtn() and isShowVideoCallBtn()
- Fix Telephony UI Cancel button not working: must set TelephonyFragment.TELEPHONY_TAG in fragment Tag on launch.
- Set android:exported to true for all activities launch via preference <intent android:action/>; else aTalk crashes in API-34.
- Add/Remove of ContactPresenceStatusListener and ContactBlockingStatusListener should be for each registered ProtocolProvider
  * MetaContactListAdapter#addContactStatusListener etc
- Clean up ShareActivity source - remove the unnecessary FragmentPagerAdapter implementation.
- Create common CustomDialogCb with checkBox option for: AccountDelete, ChatMessageDelete, and ContactBlock
- Use full class path for all references to avoid problem.

=========================================================================
Version:        3.3.6 (303060)
Release Date:   02/12/2024
Author:         cmeng
- JingleFile transfer AbstractMethodError resolved with aTalk source patches; Google team is unable to offer any solution in gradle release built.
  * Must place two smack files into aTalk local source, and defined QNAME in file
  * a. org.jivesoftware.smackx.jingle.transports.jingle_s5b.elements.JingleS5BTransportInfo
  * b. org.jivesoftware.smackx.jingle_filetransfer.element.JingleFileTransferChild
- Fix call notification control ui partial cropping of buttons.
- Clean up ChatSessionManager class source removing unused methods.

=========================================================================
Version:        3.3.5 (303050)
Release Date:   02/09/2024
Author:         cmeng
- Fix incorrect derive of the chatSession Uuid for conference chat messages in saveMamIfNotExit()
- Extend smack reply timeout to 10S for MamManager.MamQuery() to take care for slow server response
- Drop non-null subject field as prerequisite in create/join a chatRoom; user may not have the right to change subject.
  * Instead use chatRoomId for bookmark name if subject is null.
- Default bookmark creation but with auto-join disabled for newly created chatRoom.
- Default "Enable Room Status" to false on entry to newly created chatRoom.
- Block room status caching in ChatPanel#msgCache if !isRoomStatusEnable(); else they will appear in chatSession when open.
- Limit conference subject to single line with ellipsize="marquee" and auto scroll horizontally
- Fix chatRoom status icon indicator not being updated on entry.
- Fix muc#roomconfig stanza sending always failed with NoResponseException, if Send within
  PresenceListener#processOwnPresence() thread; must send in new Thread() to resolve the problem.
- Fix deletion of room status messages crashes aTalk
- Drop aTalk ScServiceDiscovery class; use smack ServiceDiscoveryManager and local ServiceDiscoveryHelper implementations.
  * Simplify implementation, and resolve endless disco#info requests at times.
- Remove unused class EntityCapsDatabase()
- Rename SimpleDirectoryPersistentCache entityStore to entityCapsStore
- Cleanup and improve ServerPersistentStoresRefreshDialog class implementation
- JingleFile transfer AbstractMethodError remained; disabled for aTalk release. Awaiting Google team solution feedback

=========================================================================
Version:        3.3.4 (303040)
Release Date:   02/03/2024
Author:         cmeng
- Drop com.jakewharton:butterknife-compiler:10.2.3 dependency and remove jdk-15 max restriction;
  use android View binding class instead.
- Change file transfer protocol priority to:
  * The file transport is selected with the following priority order if contact is online:
  * a. httpFileUpload (for OMEMO and plain chat session: chatType)
  * b. jingleFileSend (Secure JET or Plain) (NAT not supported)
  * c. Legacy byteStream transfer protocol for SOCK5 with fallback on IBB on user retry
- Fix Smack 4.4.7: ByteStream Sock5 implementation does not take care of the host address with zone id
- Enable webView cache mode
- JingleFile transfer AbstractMethodError remained; disabled for aTalk release. Awaiting Google team solution feedback
- API-34 overrides aTalk message Snooze pending intent; actual implementation depends on manufacturers i.e.
  auto enable after 3 notifications (pixel) or show user snooze option (Notes 10) with timer etc.

- Update gradle build environment to with gradle 8.0.0 and above:
  a. Use Android Studio Hedgehog | 2023.1.1 Patch
  b. distributionUrl=https://services.gradle.org/distributions/gradle-8.5-bin.zip
  c. classpath 'com.android.tools.build:gradle:8.2.2'
  d. Add to buildFeatures: viewBinding true; buildConfig true
  e. Add namespace to aTalk and YoutubePlayer modules
  f. YoutubePlayer: kotlinOptions { jvmTarget = '1.8'}
  g. Update gradle.properties to include:
     # Gradle >=8.0.0: Library project resource identifiers are not constant static final ints, just static ints.
     android.nonFinalResIds=false
     # Gradle >=8.0.0: Allow transitive resource identifiers use in aTalk.
     android.nonTransitiveRClass=false

=========================================================================
Version:        3.3.3 (303030)
Release Date:   01/29/2024
Author:         cmeng
- Fix ContextCompat.registerReceiver flag setting: If this receiver is listening for broadcasts sent from the system
  or from other apps—even other apps that you own—use the RECEIVER_EXPORTED flag. If instead this receiver is listening
  only for broadcasts sent by your app, use the RECEIVER_NOT_EXPORTED flag; and broadcaster must setPackage(getPackageName()).
  * Use RECEIVER_EXPORTED for HttpFileDownloadJabberImpl(), UpdateServiceImpl(), and ConnectivityManagerListenerImpl()
  * Use RECEIVER_NOT_EXPORTED and required to setPackage(getPackageName()) in sendBroadcast for:
  a. Fix option Exit not working in android API-34
  b. Fix CallControl Notification with proper callback.
  c. Fix message received popup with proper callback.

- Temporary disable 'Jingle Outgoing File Offer', use HTTP file upload instead; Android Studio release build throws runtime AbstractMethodError.
- Fix Option 'StreetViews & Map' crashes in API-34: Layout <frame /> cannot accept fraction value in android:layout_weight
- Fix Correct downloadable fileNameApk =String.format("aTalk-%s-%s.apk", BuildConfig.FLAVOR, BuildConfig.BUILD_TYPE);
- Make UpdateServiceImpl() shows both version/code for installed and latest available apk.
- Move shutdownApplication() function into ExitMenuActivity i.e. non-static
- Add missing method in JComponent#setDoubleBuffered(boolean)

- Need further investigation, do not happen anymore after fixing message received popup with proper callback:
  * Error dispatching notification of type PopupMessageAction from net.java.sip.communicator.impl.notification.PopupMessageNotificationHandlerImpl@2836f72
    java.lang.IllegalArgumentException: org.atalk.android: Targeting U+ (version 34 and above) disallows creating or retrieving a PendingIntent with FLAG_MUTABLE,
    an implicit Intent within and without FLAG_NO_CREATE and FLAG_ALLOW_UNSAFE_IMPLICIT_INTENT for security reasons. To retrieve an already existing PendingIntent,
    use FLAG_NO_CREATE, however, to create a new PendingIntent with an implicit Intent use FLAG_IMMUTABLE.

=========================================================================
Version:        3.3.2 (303021)
Release Date:   01/26/2024
Author:         cmeng
- Rebuild for API-34 release fixing user login problem arise from Android Studio exclude group:.
- AbstractXmlElement#toXML(XmlEnvironment): Do not pass in enclosingXmlEnvironment;
  else the NS may be be excluded causing problem; and getFirstChildElement(Class<T> type) will return null
  e.g. <description xmlns='urn:xmpp:jingle:apps:rtp:1'...> and <transport xmlns='urn:xmpp:jingle:transports:ice-udp:1'...>
- Change chat session action options on user single and multiple items selection
- Change auto return to contactList UI timer to 5 seconds after call has ended; allow user more time to view error messages.
- Use exclude group: for local smack libraries inclusion;
  add jarjar for local smack libraries into main build.gradle, and remove buildSrc#build.gradle
- AccountLoginActivity#onLoginPerformed(); update for new user create and login, startActivity aTalk UI
- JingleFile send still having problem, AS throws AbstractMethodError exception unexpectedly.
  Not such problem with apk in ADB debug. see https://issuetracker.google.com/issues/321988935

=========================================================================
Version:        3.3.1 (303010)
Release Date:   01/12/2024
Author:         cmeng
- Revert to set distributionUrl=https://services.gradle.org/distributions/gradle-7.6-bin.zip
  in gradle-wrapper.properties; gradle-8.x does not generate the required smack jarjar files at all.
- Use implementation jarjar.repackage("filename.jar") to ensure destinationName is set correctly.

=========================================================================
Version:        3.3.0 (303000)
Release Date:   01/02/2024
Author:         cmeng
- Update aTalk-android for android API-34 support (needs new updated jarjar-gradle)
- Use jarjar-gradle from github master i.e. '9a7eca7'(1.1.1); require gradle-8.2-bin.zip and precompiled smack jars
  * Gradle-8.x-bin.zip build without problem, but does not generate the smack jar files;
    Currently use this to build; and with previous generated jars;
  * Gradle-7.5-bin.zip generate smack jars in the defined directory, but not the defined name
    e.g. CH_1980125902.jar!!! need to find out how to use the generated smack jars files
- Update source to support API-34 ContextCompat.registerReceiver with RECEIVER_EXPORTED/RECEIVER_NOT_EXPORTED option.
- Update to 'com.android.tools.build:gradle:7.4.2'
- Update to 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.22'
- Upgrade Android Studio to Giraffe | 2022.3.1 - but with Gradle-JDK using jdk-15
- butterknife-compiler:10.2.3 is required for PermissionsActivity, but only compatible with jdk-15 max
- Move TimerLog implementation out of android directory

=========================================================================
Version:        3.2.4 (302040)
Release Date:   12/10/2023
Author:         cmeng
- Add user selectable option 'Delete account on server' when user remove an account; user must login to perform this action.
- While user is login, changing local password will also change password on the server.
- Upgrade smack library to version 4.4.7
- Remove SIP and ICQ protocols and preference settings support
- Remove aTalk unused codec, audio system and unused classes:
  * portaudio, pulseaudio, quicktime, and video4Linux protocol directory
  * PortAudioRenderer, PulseAudioRenderer, PortAudioSystem, PulseAudioSystem,
   WASAPIRenderer, DirectShowSystem, QuickTimeSystem and Video4Linux2System
- Build openssl jni library without installing the man document.

=========================================================================
Version:        3.2.3 (302030)
Release Date:   11/22/2023
Author:         cmeng
- Update all aTalk JNI libraries build to use NDK '22.1.7171670';
  * Max NDK version that is compatible with aTalk JNI libraries built.
  * Retain ANDROID_API=21 for 64-bit and aTalk-android minSDK support;
  * Else built has errors e.g. ld: error: undefined symbol: stderr etc
- Upgrade libvpx build to 1.3.1; libvpx 1.3.1 source build requires NDK '22.1.7171670'
- Clean up JNI scripts for all native libraries built
- Use the prebuilt toolchain instead of using make_standalone_toolchain.py.

=========================================================================
Version:        3.2.2 (302021)
Release Date:   11/17/2023
Author:         cmeng
- Fix incorrect fetch mater i.e. 1.4.0 WIP source to build
- Revert libvpx to 1.3.0; compilation error for libvpx (v1.13.1) for arm64-v8a ABI
  clang70: error: the clang compiler does not support '-march=armv8.2-a+dotprod+i8mm'

=========================================================================
Version:        3.2.2 (302020)
Release Date:   11/16/2023
Author:         cmeng
- Fix xml:lang attribute error in stanza sending when user customizes 'regional preference' settings
- Fix 'Auto generate resource' when the AUTO_GENERATE_RESOURCE property in DB does not exist
  protocol.jabber.AUTO_GENERATE_RESOURCE=true in atalk-defaults.properties files

- Merged CallEnded class into VideoCallActivity class
- Auto return to contactList UI, 3 seconds after call has ended.

- Minimize use of android unsupported java classes e.g. java.jwt.Component, javax.swing.JComponent
- Update osmdroid-android:6.1.14 to 6.1.17
- Upgrade jni libraries sources for:
  * ffmpeg 5.1.2 to 5.1.4
  * libvpx 1.13.0 to 1.13.1

- aTalk is not compatible with API-34 build for Electric Eel SDE; missing dx, dx.jar and aapt2 not compatible

=========================================================================
Version:        3.2.1 (302010)
Release Date:   07/03/2023
Author:         cmeng
- Add JNI native library support for audio codec G729.1 using BCG729 source from:
  * see https://www.rfc-editor.org/rfc/rfc5459.html & https://datatracker.ietf.org/doc/html/rfc4749
  * https://gitlab.linphone.org/BC/public/bcg729/-/archive/release/1.1.1/bcg729-1.1.1.tar.gz
  * Bcg729 is an opensource implementation of both encoder and decoder of the ITU G729 Annex A/B speech codec.
- Replace G729 Java Codec with JNI Codec BCG729, supporting voice activity detection (VAD) and discontinuous transmission (DTX).
- Fix incorrect g722 codecs entries in FMJPluginConfiguration settings, should be:
  * "org.atalk.impl.neomedia.codec.audio.g722.JNIDecoder",
  * "org.atalk.impl.neomedia.codec.audio.g722.JNIEncoder",
- Jingle.Group.Content element does not contains attribute 'creator';
  remove null check for this attribute in JingleContent.build()
- Add support to handle embedded Transport-info in the session-accept of pidgin, before process Jingle SessionAccept.
- Interchange the call receive popup message buttons locations between 'Dismiss' and 'Answer'.
- For Conversations 2.12.2 dtls media call compatibility with aTalk; use RSA 'TLS Certificate Signature Algorithm' only e.g. "SHA256withRSA"
  webrtc-113.0.0 does not support certificate with ECDSA SignatureAndHashAlgorithm.
- aTalk to aTalk support certificates with ECDSA or RSA; select ECDSA for better secure DTLS encryption call e.g. "SHA256withECDSA".
- TlsServerImpl will offer only cipherSuites according to the user selected 'TLS Certificate Signature Algorithm'
- See TlsUtils#isValidSignatureAlgorithmForServerKeyExchangeshort signatureAlgorithm, int keyExchangeAlgorithm)
  for matching between SignatureAlgorithm and KeyExchangeAlgorithm
- Show toast message for any DTLS Fatal error to user.

=========================================================================
Version:        3.2.0 (302000)
Release Date:   06/14/2023
Author:         cmeng
- Add options for participants in group chat:
  a. Start conversation
  b. Grant/Revoke owner privileges
  c. Remove from group chat
  d. Copy nick name in send message entry
- Start IM if participant is not anonymous, else show contact list UI for user selection.
- ChatSessionManager#getChatIntent(): add support to get chatIntent for a given Contact.
- Show toast messages for local user role changes, and being removed from group chat.
- Ensure 'ChatRoom Occupant' info for local user role changes are properly updated for display.
- Use sender Jid in MUC session to properly retrieve sender avatar for display; Jid is saved in DB messages.
- Add support to receive and display of 'PrivateMessaging' in a new IM chat session:
  * OperationSetChatStateNotificationsJabberImpl#stateChanged(Chat chat, ChatState state, Message message)
  * OperationSetBasicInstantMessagingJabberImpl#newIncomingMessage(EntityBareJid from, Message message, Chat chat)
- OperationSetBasicInstantMessagingJabberImpl#newIncomingMessage must use Message.Type.groupchat to filter groupChat.
  "http://jabber.org/protocol/muc#user" is used for privateMessaging.
- Do not throw RuntimeException when perform chatRoom.kick Participant in ChatFragment. Just show the error message to user.
- VCardAvatarManager#processContactPhotoPresence: Do not proceed to auto download photo for MUCUser in 'contact photo presence process'.
- Make JingleFile extends JingleFileTransferChild for proper QName extraction.
- OperationSetMultiUserChatJabberImpl#isPrivateMessagingContact: Change method to use the contact Jid instead of contact address.
- OperationSetChatStateNotificationsJabberImpl#sendChatStateNotification: Do not send chat state notifications to a Jabber Volatile Contact.
- Rename G722 class names to confirm with other codecs.
- Add bcg729 JNI library support - implementation incomplete (not use), continue to use JavaDecode/JavaEncoder instead.

=========================================================================
Version:        3.1.7 (301070)
Release Date:   05/16/2023
Author:         cmeng
- LocaleHelper must return only Context and not ContextWrapper instance; instance is use in supper.attachBaseContext(instance);
  However ActivityThread.handleReceiver cast ContextImpl context = (ContextImpl) app.getBaseContext();
  and both the ContextImpl and ContextWrapper are subclass of Context.
  giving rise to java.lang.ClassCastException in android.app.ActivityThread.handleReceiver (ActivityThread.java:4084)
- The above problem does not happen/observed during actual app debug on emulator or actual device. But Crashes in FFR.

=========================================================================
Version:        3.1.6 (301060)
Release Date:   05/09/2023
Author:         cmeng
- Extend Locale support to aTalkApp (Application class), and all other activities previously not included.
  e.g. PermissionsActivity, Splash, About, GeoLocationBase etc
- User Locale change required to restart aTalk for aTalkApp (Application class) to take effect.
- Show title on all user preference setting menu for easy user reference/identification
- Specify all preferences 'Key' identifiers in source; remove all pref_ key settings in String_NT
  aTalkApp instance may not have initialised before the preference key is accessed.
- aTalk#Backkey activation will close the Telephony fragment if active.
- Add additional audio codecs support: G722 and G729 (royalty-free); and clean up neomedia/ffmpeg code
- Set use priority preference of VP8 codec over VP9 (jni codec not very stable)
- Update library fmj:1.0.1-jitsi to fmj:1.0.2-jitsi
- Fix all ANR/Crash cases reported from aTalk v3.1.5 (20230509)

=========================================================================
Version:        3.1.5 (301051)
Release Date:   03/29/20238
Author:         cmeng
- Upgrade aTalk to support android Tiramisu API-33; Need to add permission.POST_NOTIFICATION
- aTalkApp.hasWriteStoragePermission(): Need to handle WRITE_EXTERNAL_STORAGE permission pending installed android API.
  Do not access no-existence class aTalk#hasWriteStoragePermission() in PermissionActivity class
- Always show video call option: When user starts video call, perform runtime CAMERA permission request if it was not granted.
  * Camera2 API does not not required Camera permission to proceed with AndroidCameraSystem#doInitialize().
- Enhance aTalk incoming call (via jingleMessage or legacy jingleRtp) handling for all the various android states i.e. device locked, aTalk in background etc.
- Include the optional 'confirm' element in HttpAuthorizationRequest IQ response; required by 'demo.agayon.be'; need smack IQ classes update.
- Support multiple instances of HttpAuthorizationRequest received; generate Heads-Up notification when device is in locked state.
- ChatPanel#mamQuery(): Need to take care for the description object with DomainBareJid instance.
- When received message does not contain a msgId, use stanzaId from StanzaIdElement if available for historyLog and mamQuery.
  * OperationSetBasicInstantMessagingJabberImpl#processStanza()
  * MessageHistoryServiceImpl#saveMamIfNotExit()
- ChatActivity#getLastSeen: LastActivity does not apply to DomainBareJid object, so block access.
- Update smack classes so they meet style check and JingleContent test requirements.
- Fix all Google Play Console FFR where possible since 3.1.4 (20230329)
- Need to update AS to Electric Eel for full API-33 build?

=========================================================================
Version:        3.1.4 (301040)
Release Date:   02/23/2023
Author:         cmeng
- Ported aTalk BOSH implementation to be compatible with smack v4.4.6
- ChatPanel is unable to receive/display the very first offline message from server; if the HistoryLog is disabled and was never launch before.
  * This problem occurred as the first offline message is used as trigger event for ChatPanel MessageListener to get registered with
    AbstractOperationSetBasicInstanceMessaging, via NotificationManager.fireChatNotification(NotificationManager.java:162).
  * Fix in OperationSetBasicInstantMessagingJabberImpl#newIncomingMessage() and onOmemoMessageReceived(); i.e.
    ChatSessionManager.createChatForContact(Contact) when offline message is received while HistoryLog is disabled.
- ChatPanel#mamQuery(): must use a valid date in mamQuery for new muc creation on invitation; default to 30 days ago if none found;
  * MessageHistoryServiceImpl#getMamDate will return null if none is found instead of "-1".
- OutgoingFileOfferJingleImpl.cancel(): Must proceed to clean up and sync local state even if cancel remote failed e.g. item-not-found - cancel
- Check for local file existence before proceed to send the file; android tmp directory may return non-existence file path: ChatController.onClick()
- Rename HttpFileUploadJabberImpl to OutgoingFileSendEntityImpl, to reflect the actual usage.
- Remove class HttpFileTransferEvent, merge and use FileTransferCreatedEvent instead.
- Remove unused FileTransferConversation#uploadProgressListeners and its related methods.
- FileBackend.getMimeType(): must ensure uri.getPath() exist before proceed with extended check
- Upgrade jni libraries sources for:
  * ffmpeg 5.1 to 5.1.2
  * libvpx 1.12.0 to 1.13.0
  * openssl-1.1.1q to openssl-1.1.1t
  * speex-1.2.0 to speex-1.2.1

=========================================================================
Version:        3.1.3 (301031)
Release Date:   02/12/2023
Author:         cmeng
- MessageHistoryServiceImpl#saveMamIfNotExit() String[] args = {msgId, chatId}; missing msgId;
  causing duplicate incoming messages being displayed in chatSession.

=========================================================================
Version:        3.1.3 (301030)
Release Date:   02/11/2023
Author:         cmeng
- Do not proceed with MAM query if user is offline and not registered with the network.
- Alert user to close and open chat session to view MAM when online, if user access chat session while offline.
- Change MAM implementation so the MAM messages are always available for aTalk retrieval.
- Show error message (MAM access denied) when user toggle 'Chat history logging' option while user is offline.
- Do not proceed with conference access if required captcha challenge text entry is empty.
- Fix main menu not updated after user change theme or locale.
  * Must restart aTalk class to get user newly selected theme and locale to be reflected on main option menu.
  * onResume invalidateOptionsMenu() is not working.
- Always use local newly created contentValues for file record DB update to avoid ConcurrentModificationException.
- Add ChatFragment#updateMessageFTStatus(), replacing the setXferStatus(); so msgCache and ChatPanel
  file transfer status update are sync in implementation.
- Sync FileTransferStatusChangeEvent status to be same as FileRecord assigned value, and rename
  FileRecord#ACTIVE to #WAITING; improve file transfer handling with status interchangeable.
- Fix Bookmark dialog crash when 'Apply' with 'Name' field left empty.
  * Default to use conference room local part.
- Fix deleted messages / file records being displayed in chat after refreshed.
  * mdIdx2msgUid (=> msgUuid2Idx): A map reference of msgUuid to the DisplayMessage position;
  * The msg position must get updated when messages are deleted; do it in ChatListAdapter#getView().
- Fixed failure in jingle file transfer when candidate-type proxy is used due to CandidateActivated.ELEMENT changed.
  Must perform local compilation of JingleS5BTransportProvider as case CandidateActivated.ELEMENT (i.e. candidate-activated') has changed to case 'activated'
- Review and fix if possible FFR from android developer dated 2023/02/10

=========================================================================
Version:        3.1.2 (301020)
Release Date:   01/31/2023
Author:         cmeng
- Add support for XEP-0313: Message Archive Management; Disable when Chat history logging is disabled.
  Changes made to MessageHistoryServiceImpl to support this.
- Enable/disable XEP-0441: Message Archive Management Preferences setting per user 'Chat history logging' setting.
- Fix 'XEP-0308 Last Message Correction' implementation error in OMEMO message sending.
  Must include the MessageCorrectExtension element during the MessageBuilder creation, and not in Message stage.
- Enhance call history UI when cleaning old records; allow user to specify the end date/time records for deletion.
- Enhance the implementation of both the MessageReceivedEvent and MessageDeliveredEvent class and to include sender fullJid in chat session.
  * Add support to update message#Jid with sender EntityFullJid; use as chat message sender.
  * Remove unused methods in MessageReceivedEvent and MessageDeliveredEvent.
- Update the unread message count for contact in contactList UI even for carbon message received.
- Optimize and enhance the file transfer process flow; synchronise file transfer status UI display with the actual file transfer protocol state.
- In legacy file transfer protocol, fallback to IBB on SOCK5 negotiation failure or invalid transport candidates provided.
- Fix InBandBytestreamSession handshake protocol error; do not send <close/> on an already closed InBandBytestream session.
- Closing both the input/output streams must apply to 'InBand Bytestream Session' only; improper implementation fix for Conversions in V3.0.4 causes problem in 'SOCK5 Bytestream Session' in both Jingle and Legacy file transfer.
  * Fix: setCloseBothStreamsEnabled(true) in InBytestreamSession#establishOutgoingBytestreamSession()
  * Fix for Conversions i.e. close input/output streams to trigger sending of IBB <close/> element
    causing problem @ JingleIncomingFileOffer.onBytestreamReady(JingleIncomingFileOffer.java:98).
    JingleIncomingFileOffer.onBytestreamReady() Cannot get InputStream from BytestreamSession: java.io.IOException: javax.crypto.AEADBadTagException: mac check in GCM failed
- Change OperationSetFileTransferJabberImpl outgoing file transfer to use smack OutgoingFileTransfer.NegotiationProgress for status change callback.
- Redefined OperationSetFileTransferJabberImpl#parseJabberStatus() for all smack FileTransfer status.
- Show and ensure incoming file transfer progress status on UI is being updated during JingleFile Transfer process.
  * OperationSetFileTransferJabberImp#FileTransferProgressThread is not enabled for JingleFile Transfer;
  * So fireProgressChangeEvent on progress callback in IncomingFileTransferJingleImpl for JingleFile Transfer.
- Ensure file transfer encryption icon indicator reflects the actual file encryption type.
  * add getEncryptionType() support in IncomingFileTransferRequest; subclass to ensure its mEncryption is updated.
- Fix AbstractFileTransfer#fireStatusChangeEvent has incorrect FileTransferStatusChangeEvent creation for old and new status.
- FileTransferConversation: Must use mTransferFileSize to set progressBar max value; mXferFile is incoming receive file content.
- Implement sessionStateUpdated call back in JingleSessionImpl for file transfer UI enhancement.
- Ensure the file transfer UI is always fully visible to user on status change; android does not realign the focus on view holder size change; mChatFragment.scrollToBottom();
- Support thumbnail sending for all the media types i.e. image and video files.
  * Use glide to generate thumbnail in FileSendConversation, and change the send file process flow.
- Change SMACK_REPLY_DEFAULT_TIMEOUT to 10s response time when requesting for thumbnail; else received thumbnail (8S) is discarded on timeout.
- Must init FileReceiveConversation#fileIcon/FileHttpFileDownloadConversation image; else reused view may contain an old thumbnail image.
- Need to update view to WAITING in FileSendConversation#sendFileTransferRequest after sendFile() step;
   setTransportFileTransfer#fileTransfer.addStatusListener() setup is only call after the file offer initiated event.
- Move all http file download protocol process from FileHttpDownloadConversation to HttpFileDownloadJabberImpl;
  to have similar structure to other file transfer transports implementations.
- Optimize ChatPanel#getHistory() implementation in handling merging msgHistory to msgCache to avoid ANR in FFR.
  * Do not update display msgCache from history DB records if present; deleted file records being displayed in chat after refresh.
- Disallow history message fetch when MultiChoiceMode session is active: else new reused views may get highlighted and destroy current selected items
  * Incorrectly using the the msgCache top stack date to fetch/update displayed messages from DB.
- Change FileBackEnd#getMimeType() to include the guessContentTypeFromStream() if normal check failed.
- Add new Chinese Simplify language UI support for user selection
- Only setLocale(language) in aTalk activity using aTalkApp Application instance on startup; else some resources are not being updated.
- Allow keyboard 'ENTER' button to send chat message.
- Include function to update the message#carbon column for messages in SQL DB.
- MessageHistoryServiceImpl#isHistoryLoggingEnabled(String id) is used, but without the actual UI to set value'
  * change to AND with global isHistoryLoggingEnabled();
- Fix unimportant error in MessageHistoryServiceImpl#EventObject convertHistoryRecordToMessageEvent(Cursor cursor, Contact contact)
  where msgType is being treated as correctedMessageUID in MessageReceivedEvent creation.
- Review and fix if possible FFR from android developer dated 2023/01/28

=========================================================================
Version:        3.1.1 (301010)
Release Date:   12/28/2022
Author:         cmeng
- Update ice4j v3.0 to be compatible with android <= API-26; i.e. media call is now compatible with android-5.0
- Show user error message when ZRTP handshake protocol timeout (too many retries)
- Review and fix if possible FFR from android developer dated 2022/12/24

=========================================================================
Version:        3.1.0 (301000)
Release Date:   12/20/2022
Author:         cmeng
- Add support for CipherSuite.TLS_ECDHE_ECDSA... in TLS server i.e. ECDSA Authentication/Digital Signature Algorithm
- Change TLS certification Signature Algorithm to support either RSA or ECDSA CipherSuite. Backward compatible with aTalk v3.0.5
  Note: TLS certificate cannot be dynamic generated as its FingerPrint has to be defined and used in session-initiate / accept
- Add user selectable option to support TLS certification Signature Algorithm for both ECDSA and RSA, with Hash SHA256, SHA384 and SHA512.
- Add method to determine SignatureAndHashAlgorithm based on the given CertificateInfo; for effective support of
  getRSASignerCredentials(), getECDSASignerCredentials() and getClientCredentials()
- Conversations 2.10.10 (webrtc-104.aar) works with aTalk, and TLS certification with RSA Signature Algorithm only.
- Conversations (webrtc-104.aar) is compatible and worked with aTalk v3.0.5 using RSA signed certificate (TlsServerImpl excludes all CipherSuit.TLS_ECDHE_ECDSA... support).
- Conversations (webrtc-104.aar) uses CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 but cannot support ECDSA signed certificate.
  The certificate needs to be RSA signed when aTalk is TLSClient (working).
  DTLS-SRTP is not working when aTalk is a TLSServer for either ECDSA or RSA signed TLS certificate.
  Conversations.signature_algorithms include support of ECDSA signed certificate???
  ExtensionType.signature_algorithms
  {Integer@30151} 13 -> {byte[20]@30152} [0, 18, 4, 3, 8, 4, 4, 1, 5, 3, 8, 5, 5, 1, 8, 6, 6, 1, 2, 1]
  This behavior is different from:
  https://security.stackexchange.com/questions/245534/what-is-the-relation-between-cipher-suite-and-certificate
  https://security.stackexchange.com/questions/65623/ecdsa-rsa-certificates-and-cipher-selection
  https://security.stackexchange.com/questions/129987/can-a-ssl-certificate-dictate-protoco
- Enable both ZRTP and DTLS_SRTP call security protocols, and in that order of preference on new account creation.
- ClickableToastController#showToast() must be handled in UI thread, as caller can be from background
- Stop running of SIPAccountRegistrationActivator in osgi.client.run.properties
- Remove DatagramTransportImpl#breakOutOfDTLSReliableHandshakeReceiveMessage() support; Work around a bug in
  BouncyCastle APIs which may cause DTLSReliableHandshake.receiveMessage() to enter an endless loop

=========================================================================
Version:        3.0.5 (300050)
Release Date:   12/06/2022
Author:         cmeng
- Fix Heads-up notification for incoming chat message on android-12 and above
  NotificationPopupHandler#createReplyIntent(): PendingIntent chat notification attached to reply action with remote input must be 'mutable'
- Implement common routine NotificationPopupHandler#getPendingIntentFlag() to take care mutable flag setting for different android API
- Fix: starting with Android 12 notifications will not work if they do not start activities directly
  * NotificationService: Indirect notification activity start (trampoline) from org.atalk.android blocked
    https://proandroiddev.com/notification-trampoline-restrictions-android12-7d2a8b15bbe2
- JingleMessage propose will always start with heads-up notification independent of aTalk focus state (background/foreground).
  This process is also applied to normal JingleCall when aTalk is in background (android OS constraint).
- JingleMessage incoming 'propose' heads-up notification is auto accept via JingleMessageCallActivity, and start up aTalk in foreground;
  Otherwise ActivityTaskManager: Background activity start will failed for android-12 and above.
- Implement method to check for android device screen lock condition.
- When android is in locked screen, OS blocked all heads-up notifications; it proceeds to launch the pendingIntent directly.
  * JingleMessageActivity must be launched with auto-accept disabled, to retain its intended implementation function.
  * Use ReceivedCall UI for user choice to proceed with audio or video call.
- When android is not in locked screen, auto-answer all JingleMessage/Jingle incoming calls (avoid user confusion).
- See OperationSetAutoAnswerJabberImpl#autoAnswer() method. answerOnJingleMessageAccept must set to false if call not via JingleMessage propose.
- Dismiss JingleMessage heads-up notification if another user instance has answered the call, or caller retracted the call.
- Fix incorrect display of the callee who has accepted the JingleMessage propose call.
- Perform NotificationPopupHandler.removeCallNotification(mSid) only on ReceivedCallActivity#onPause() to avoid prematurely turn off the call alert.
- Merge CallManager.CALL_IDENTIFIER into CallManager.CALL_SID, as both carried the same info (JingleMessage / Jingle call support)
- Media call to Conversations will fail; v2.10.10 supports only CipherSuite.TLS_ECDHE_ECDSA...,
  whereas aTalk DTLS server supports only RSA protocol. (TlsServerImpl#getECDSASignerCredentials() not implemented.)
- Remove some of the old Cipher_Suites support in the TlsServerImpl#getSupportedCipherSuites()

=========================================================================
Version:        3.0.4 (300040)
Release Date:   11/25/2022
Author:         cmeng
- OutgoingFileOfferJingleImpl#hasSecurityError() JET Security Error timer must be stored per contact for reference in future file sharing
- Extend smack reply timer to 10 second for IBB file transfer; response stanza may take more than 5 seconds when send across servers
- Use IQ from value as initiator if the jingle session-initiate initiator value is not defined (Conversations), else system crashed.
- JingleContentImpl: Recipient and initiator wrongly interchanged in Jingle Transport accept, reject and replace stanza sending
- JingleOutgoingFileOffer: Must close both input and output streams to trigger sending of IBB <close/> element as defined in XEP-0047
  <close xmlns='http://jabber.org/protocol/ibb' sid='RA88X8VSQG'/>
- JingleFileTransfer transport-candidate type should set to 'direct' for local host.
- JingleFileTransfer transportInfo element for proxy protocol should be 'activated'; incorrectly sent as 'candidate-activated'
- Set jingle transport-candidate priority value as per XEP-0260: Jingle SOCKS5 Bytestreams Transport Method (2.2 Exchanging Candidates).
- Strip the <zone_id> from Inet6Address in transport-candidates host attribute sending stanza
- Must perform connectIfReady check upon CANDIDATE_FAILURE on complete checking of all the remote transport-candidates.
  Else earlier received <candidate-used/> does not trigger network connection for file sending in JingleS5BTransportImpl#connectIfReady().
- Fix incoming file sharing failure when the chat window is closed, it shows file transfer interrupted error when chat windows is open.
  ChatPanel#mergeCachedMessage(): Must use cached message for active file transfer during history loading process;
  incoming file sharing request is saved as FileRecord in history DB.
- Pop up user error alert dialog when receiving file has errors
- Enhance update service to auto generate the required apk for all BuildConfig.FLAVOR and .BUILD_TYPE; and check for valid apk downloadable link.
- Purge unused classes for GeoLocation in service support

=========================================================================
Version:        3.0.3 (300030)
Release Date:   11/03/2022
Author:         cmeng
- Add support for XEP-0215: External Service Discovery
- Add marker showing user selected location in OSM street map view
- Disable FollowMe mode only in ZERO_FIX mode, allow tracking even in SINGLE_FIX update request
- Add copyright overlay to OSM UI
- Catch IllegalArgumentException for passed in Location in LocationBgService#getLocationAddress()
- Add additional check to extract a valid youtubeId for various possible format in YoutubePlayerFragment#getVideoId

=========================================================================
Version:        3.0.2 (300020)
Release Date:   10/04/2022
Author:         cmeng
- Enhance share streetMap implementation to support both gms (google playstore) and osm (fDroid) releases.
- Improve StreetView & Map UI, including location altitude info and user selectable option for location sharing with buddy.
- Rename "send_cont_location_updates" button text to "Follow me"; flash text when active, reminding user to stop on exit if not required.
- Implement GeoLocationRequest/Builder parcelable class; replacing android gms LocationRequest for bundle passing
- Replace gms FusedLocationProviderClient for location request in background service; use aTalk installed device best location provider instead
- Add data_extraction_rule for backup requirements
- Upgrade com.github.yalantis:ucrop to 2.2.8; and com.github.bumptech.glide:compiler to 4.13.2
- Migration to android API-33 invalidate a lot of the android attributes - revert to API-32
  https://stackoverflow.com/questions/72664051/android-33-issues-in-manifest-and-layout-files-in-android-studio

=========================================================================
Version:        3.0.1 (300010)
Release Date:   08/17/2022
Author:         cmeng
- Implement Jingle Event IQ and Provider (not a standard - but send from server jnsapi_erlang impl?); not found in XEP-0278: Jingle Relay Nodes
- Clean up JingleChannel IQ/Provider to add in missing attributes per XEP-0278: Jingle Relay Nodes.
- Wait for session-terminate response from remote before unregisterJingleSessionHandler() locally; else <item-not-found/>.
  <item-not-found/> may still happen at remote if remote user cancels before the received session-terminate is processed ~250mS.
- Cleanup jingle_rtp; do not send session-terminate stanza after the call has disconnected.
- Improve AndroidUsingLinkProperties implementation: Smack Reconnection Manager received empty dns, change to null instead.
- Default to enable 'Auto generate resource' option, avoiding resource conflict in multiple devices login.
- During file transfer process, reserve the button height to avoid Cancel button being partially hidden by android when it is enabled
- Ignore AEADBadTagException throws by javax.crypto.CipherInputStream#close() when cryptoStream is prematurely closed in JingleIncomingFileOffer#onBytestreamReady().
- Upgrade to support android API-33

=========================================================================
Version:        3.0.0 (300000)
Release Date:   07/28/2022
Author:         cmeng
- Only allow user to cancel while in active data stream transferring; both legacy si and JFT cannot support
  transfer cancel during protocol negotiation. case FileTransferStatusChangeEvent.PREPARING:
- Ensure all listeners are properly cleanup in jingle file transfer
- JFT: notifyProgressListenersFinished() on cancel.
- Upgrade library openssl to 1.1.1q [5 Jul 2022]
  Upgrade libraries for ffmpeg to v5.1 and x264 to v164
- Upgrade library libvpx from v1.11.0 to v1.12.0
- Upgrade exoplayer to 2.18.1
- Review and action for PlayConsole for Crashes and ANRs prior to 20220723

=========================================================================
Version:        2.9.6 (209061)
Release Date:   07/19/2022
Author:         cmeng
- Allow recipient to cancel incoming file offer in progress after user has accepted the offer (esp large file).
- Fix aTalk crashes when sender cancels outgoing file offer:
  Must update mState in JingleFileTransferImpl#mState JingleOutgoingFileOffer, similar to JingleIncomingFileOffer;
  else mState is null when sender cancel() the outgoing file offer transfer.
- Sender cancels outgoing file offer is not handled at recipient side for JFT protocol.
  Must init IncomingFileTransferJingleImpl() immediately on new IncomingFileOfferJingleImpl(); and not on user accept (too late).
  i.e. perform JingleSessionImpl.addJingleSessionListener(this), to receive the cancel event sent by remote sender.
- Solution: Add FileTransfer#onPrepare() method to setup to receive remote incoming file transfer event before
  user accept file; and modify the acceptFile() declaration/definition.
- Must fire cancel event when sender cancels the jingle file transfer prior to sending to update send UI properly; OutgoingFileOfferJingleImpl#onCanceled()
- FileSendConversation: Send sender canceled file transfer message to remote, only for legacy FT mode. Jingle FT has its own protocol control.
- FileTransferConversation: Allow send file retry option for sender only.
- FileTransferConversation#updateFileViewInfo(): Do not attempt MyGlideApp.loadImage() if an existed file has length 0.
- Ensure JingleSessionImpl.removeJingleSessionListener(this) for IncomingFileTransferJingleImpl#onError() and onSessionTerminated()
- Add cases state for ended handling in JingleFileTransferImpl#cancel();
  when user cancels while the file transfer has ended in JingleIncomingFileOffer#onBytestreamReady().
- File transfer with thumbnail supported feature missing
  ProtocolProviderServiceJabberImpl: Add supportedFeatures.add(BoBIQ.NAMESPACE); // XEP-0231: Bits of Binary
- ChatStateManager#INCOMING_CHAT_STATE_FILTER must include FromTypeFilter.ENTITY_FULL_JID to filter messages/chatState send from server
- Roll back FileTransferStatusChangeEvent#FINISHED to use #COMPLETED instead for easy handling
- MetaContactChatTransport#getStatus() return higher threshold of the two i.e. contactResource or contact when checking isOnline()
- ChatPanel#updateCacheFTRecord(): cacheMsg.getMessageUID() can be null; interchange compare order
- ChatFragment#chat_message_del case: isSafeDel <= Not safe to delete the tmp file, it may be used for multiple send instances
- Add support to cancel showToastMessage for fast update mode.
- upgrade smack library to use v4.4.6

=========================================================================
Version:        2.9.5 (209050)
Release Date:   06/14/2022
Author:         cmeng
- Implement call waiting to accept a second incoming call by placing the in-progress call on hold; and allow switching between calls.
- Fix Jingle File Transfer failure due to NPE exception: JingleContentImpl.setParent(JingleContentImpl) where parent may be null causing NullPointerException.
- Launch OMEMO device verification dialog for any Undecided Omemo Identity during Jingle File Transfer/JET session
- Fix previous local video state is not properly restored on return from chat. Need to start content-modify onResume
  Error get introduced in v2.8.0 when migrating to camera2 implementation
- Change CallPeerJabberImpl#sendModifyVideoContent() to only perform below if there is an actual video content changes
  mediaHandler.reinitContent(remoteContentName, content, false);
  mediaHandler.start(); else this get executed twice in #processSessionAccept()
- Fix content-add video to existing audio call in progress not working.
  Agent#scheduleTermination() when audio call has completed setup;
  IceUdpTransportManager#startConnectivityEstablishment() not proceed: ice4j ConnectivityCheckClient#startChecks must init stopped = false;
- VideoHandlerFragment.doAlignRemoteVideo(VideoHandlerFragment.java:736);
  remoteVideoView must be an orphan before assigned to another ViewGroup parent; else exception i.e.
  The specified child already has a parent. You must call removeView() on the child's parent first.
- Fix legacy incoming call being treated as JingleMessageSession call and display incorrect UI to user.
  This happen when there was a JingleMessageSession call previously.
  Change AndroidCallListener#onCallEvent() to check for jingle sid instead of mRemote (not clear)
- Fix long pause during login process and call setup at time, caused by dnsQuery using inactive network.
  Modify AndroidUsingLinkProperties#getDnsServerAddresses(0 to ensure only activeNetwork is returned to caller.
- Unable to override Duration in PeriodicRunnable#Duration getDelayUntilNextRun()
  so revert: update ice4j from org.jitsi:ice4j:3.0-55-g32a8aad to org.jitsi:ice4j:3.0-60-g28a23e1
- Fix QuerryContactListAdapter#getChildrenCount() and #getChild() ArrayOutOfBound exception
- Update libvpx to latest github source 013ec57 (20220614)
- Move jinglenodes classes into smack directory structure

=========================================================================
Version:        2.9.4 (209040)
Release Date:   05/14/2022
Author:         cmeng
- Add support for XEP-0251: Jingle Session Transfer in Unattended and Attended call transfer:
  https://xmpp.org/extensions/xep-0251.html#unattended XEP-0251 § 2. Unattended Transfer
  https://xmpp.org/extensions/xep-0251.html#attended XEP-0251 § 3. Attended Transfer
  Clean up SdpTransfer and SdpTransferred implementation, and included support in JingleCallSessionImpl,
- CallNotificationManager must handle multiple instances for call transfer; using requestBase for alternate Notification
- Correct typo error in processJingle() case i.e. security_info => session_info during migration
- Add handler in OperationSetBasicTelephonyJabberImpl to report any Jingle Responder error return by remote
  https://xmpp.org/extensions/xep-0166.html#protocol-response
- Change Network Security Configuration to disallow the use of user-specified certificates. This could allow eavesdroppers to intercept data sent by aTalk, or to modify data in transit.
- ANR on ChatPanel#messageDelivered() & #addMessage() due to synchronized(cacheLock); modify source to minimize deadlock (hold time)
- Change DialogActivity#alert_dialog layout, background color and with border
- Ensure DTLS security state is properly updated when returning to video call UI;
  DtlsControlImpl#getSecureCommunicationStatus() must return with a proper securityState as set by secureOnOff().

- Upgrade aTalk jni libraries for:
 a. openssl-1.1.1k => openssl-1.1.1n
 b. ffmpeg-4.4 to ffmpeg-4.4.2
 c  x264-161.3049 to libx264-163.3060
 d. libvpx from 1.10.0 to 1.11.0 (main)
- Fix clang70 error when compile libvpx for armv7a without the --disable-neon-asm i.e. ASFLAGS='-c'
- fix libvpx scripts errors for libvpx
- Rename ffmpeg-x264#ini_update_libs.sh to init_libs_ffmpeg_x264.sh, and corrected script errors for x264 library download
- Remove requests for permission.GET_ACCOUNTS and permission.MANAGE_ACCOUNTS in aTalk

- ToDo: difficult to reproduce
  * CallPeerMediaHandlerJabberImpl.getTransportManager() => The initiator is expected to specify the transport in their offer when remote terminate call before setup

=========================================================================
Version:        2.9.3 (209031)
Release Date:   04/23/2022
Author:         cmeng
- Redesign JingleMessageSession class to ensure all incoming/outgoing call are handled properly via JingleManager listeners callback
  Rename JingleMessageHelper => JingleMessageSessionImpl and its implementation for JingleCall incoming/outgoing call handling
- Must send JingleMessage retract to close the loop, when user ends the call prior to jingle session-initiate being send
- Avoid sending trailing Jingle stanza once JingleSession Handler has unregistered with JingleManager
- Register JingleSession Handler callback with JingleManager only on sending Jingle session-initiate, to ensure proper cleanup when call end.
  Must let CallPeerJabberImpl#initiateSession() perform JingleCallSessionImpl() as an session initiator (outgoing call);
  else JingleManager#unregisterJingleSessionHandler() is not performed when user end call before session-initiate
- Resolve cross dependency between smack-extensions and smack-experimental (for pull request)
- Fix CallJabberImpl.getConference() on a null object reference
  => MediaAwareCall#getConference() may return null if call terminated before setup completed
- Fix problem with android camera2 API implementation in throwing waitForFreeSlotThenRelock on fast android devices.
  Set ImageReader.newInstance maxImage = 3 and use acquireLatestImage().
  BufferQueueProducer: [ImageReader-1280x720](id:2c3200000026,api:4,p:733,c:11314) waitForFreeSlotThenRelock: timeout [mDequeueTimeout=1000ms
- Drop android API support to API-31; API-32 contains no source for development debug.

- ======= JNI libraries update =======
- Use python3 for all scripts in Jni libraries build
- Update libvpx version to 1.11.0 (not stable, so stays at 1.10.0)

- ======= Fix FFR for <= 2.9.1 (20220422) =======
- Fix NoSuchElementException: May happen when user omemo DB is yet to be setup.
    at java.util.TreeSet.first (TreeSet.java:394)
    at org.atalk.crypto.omemo.SQLiteOmemoStore.purgeUserOmemoData (SQLiteOmemoStore.java:973)
- Fix IndexOutOfBoundsException: if child contact may have been removed
    at java.util.ArrayList.get (ArrayList.java:437)
    at org.atalk.android.gui.contactlist.model.QueryContactListAdapter.getChild (QueryContactListAdapter.java:157)
- Fix NulPointerException: NPE??? just move into try/catch loop
    at org.atalk.crypto.omemo.OmemoAuthenticateDialog.onCreate (OmemoAuthenticateDialog.java:118)

=========================================================================
Version:        2.9.2 (209020)
Release Date:   04/14/2022
Author:         cmeng
- Add support for XEP-0234: Jingle File Transfer (In-Band and SOCK5 Bytestreams), with new packages or classes added:
  jingle_filetransfer, IncomingFileOfferJingleImpl, InformingFileTransferJingleImpl, OutgoingFileOfferJingleImpl
  and jingle package add adapter, callbacks, components, exception, and update transport etc
  https://github.com/vanitasvitae/Smack/tree/jingle3/smack-experimental/src/main/java/org/jivesoftware/smackx/jingle_filetransfer
- Add support for XEP-0391: Jingle Encrypted Transports; supporting OMEMO encryption in Jingle File Transfer.
  new packages/classes: ciphers, jet, update omemo with jet support; see https://blog.jabberhead.tk/summer-of-code-2017/
  Note: conversation advertised JET but not following xmpp process flow; fallback to use HttpFileUpload for next 10 files transfer
- Fallback to HttpFileUpload if JetSecurity is not fully supported by client e.g. conversations.
- aTalk file transfer handling priority (see MetaContactChatTransport): (online) jingle file transfer with JET
  => (online) legacy file transfer => (offline and fallback) HttpFileUpload
- Display detailed reason text for file transfer failure status to user.
- Rename file transfer 'refused' to 'declined', same as in Jingle File Transfer implementation.
- Migrate aTalk telephony jingle stanza handling to use smack JingleManager implementation structure: include BasicTelephony interface
  and add JingleCallManager, JingleCallSessionImpl classes to register with JingleManager for jingle session callbacks.
- Add JmStateListener interface (JingleMessageType) to JingleMessageHelper; allowing OperationSetBasicTelephonyJabberImpl
  to make earlier registerJingleSessionHandler() with JingleManager as to avoid problem with incoming call from conversations.
  see https://discourse.igniterealtime.org/t/smack-4-4-5-jingle-manager-implementation-has-problem-to-handle-conversations-incoming-call/91573
- Allow accept and display the location map based on geo location message from other android devices e.g. conversations.
- Cleanup jarjar.repackage for ice4j:3.0-55-g32a8aad.
- Remove dependencies.gradle in android-youtube-player plug in; only use in one gradle.build.
- Add XMPP version information to all reference in About UI.

=========================================================================
Version:        2.9.1 (209010)
Release Date:   03/16/2022
Author:         cmeng
- Upgrade ice4j to use org.jitsi:ice4j:3.0-55-g32a8aad with aTalk customization
- Android with network APN=IPv4/IPv6 or APN=IPv6 returns only IPv6 public address in InetAddress.getByName(host);
  hence only an IPv6 candidate (without the sfllx candidate) is sent i.e.
  i.e. IPv6 candidate harvested from ice4j HostCandidateHarvester#harvest(); causing problem in call setup;
  <candidate port='58979' type='host' ip='2401:7400:4000:2e4a:1:2:93f1:b634' id='e49ea0a0-87e9-46a1-9c2e-1666b6ce8e32'/>
  missing: <candidate ... ip='119.56.100.180' port='5002' type='srflx' rel-addr='10.143.27.57' rel-port='5002' network='0'/>
  Problem fixed with IceUdpTransportManager#getTransportAddress(String hostname, int port, Transport transport)
  see https://github.com/jitsi/ice4j/issues/255 for detail problem and solution.
  For android network APN setting see: https://sanctum9.wordpress.com/2019/03/15/switch-to-ipv6-on-android/
- upgrade smack library to use v4.4.5

=========================================================================
Version:        2.9.0a (209001)
Release Date:   03/09/2022
Author:         cmeng
- Use GoogleMap latest Renderer: MapsInitializer.initialize(getApplicationContext(), Renderer.LATEST, this);
- Update implementation for deprecated Sensor.TYPE_ORIENTATION with Sensor.TYPE_ACCELEROMETER and Sensor.TYPE_MAGNETIC_FIELD
- Remove unused ApiLib; Implemented functions are available since API-19
- Update MediaAwareCallPeer, MediaStreamStats2 and StatisticsEngine; add skipStats option i.e. statistics sending
- Port ice4j 3.0-55-g32a8aad source into ice4j 2.0; see gradle has problem handling both com.github compile and jarjar at the same time:
  java.lang.NoSuchMethodError: No static method decode([BCC)Lorg/ice4j/message/Message; (2.9.0a is still having this problem)
- Migration apache httpclient5:5.1 to okhttp3:okhttp:4.9.3: Upgrade HttpUtils and add HttpConnectionManager
  * okhttp 4.x handles redirect and authentication; see https://square.github.io/okhttp/features/calls/#follow-up-requests
  HttpUtils not tested (used by CertificateServiceImpl & ProvisioningServiceImpl);
  Both classes are not active in aTalk; need more work when deploy.
- aTalk minimum android OS support is API-24 (android 7.0)
- Clear up smack jingle java document

=========================================================================
Version:        2.9.0 (209000)
Release Date:   02/28/2022
Author:         cmeng
- Replace deprecated LifecycleObserver with LifecycleEventObserver in android-youtube-player
- Update deprecated ConnectivityManager in android-youtube-player
- Use NetworkCallBack in place of deprecated Broadcast Receiver in android-youtube-player
- Must use runOnUiThread for ChatActivity#localUserPresenceChanged(LocalUserChatRoomPresenceChangeEvent)
  triggered by ChatRoomJabberImpl#onJoinSuccess()
- Hide video call option if the android device does not have camera support
- Enhance aTalk media call handler to support conversations media call unique implementation:
  a. sending leading/trailing single candidate per transport-info stanza; in both session-initiate or session-accept instance
  b. sending candidates for both RTP and RTCP with rtcp-mux option enabled; to cater for non rtcp-mux callee
  @See https://github.com/iNPUTmice/Conversations/issues/4285
  Still having problem as responder in sending audio, even Pair validated: 192.168.1.167:5009/udp/host -> 192.168.1.37:33079/udp/host (audio.RTP)
  No found for Selected pair for stream audio.RTP: the problem seems to be from conversation no sending nominationConfirmed for aTalk validated audio candidate i.e.
  Response from conversations indicates that we have received a response to a request that either contained the <tt>USE-CANDIDATE</tt> attribute
  #sendHolePunchPacket: Error cannot send to remote peer for media: AUDIO; MediaStreamTarget with dataAddress null and controlAddress null
  see: https://github.com/iNPUTmice/Conversations/issues/4285 & https://github.com/iNPUTmice/Conversations/issues/4287
- Conversations implementation: JingleContent.Name <> RtpDescription.getMedia()
  CallJabberImpl.#processSessionInitiate(): must get mediaType from RtpDescription.getMedia() instead of JingleContent.getName();
  conversations JingleContent.getName() does not contain mediaType
- Must check callPeer not null before proceed processJingleSynchronize#transport_info case;
  Caller prematurely terminated call clear the callPeer or transport-info sent before session-initiate.
- ice44j pending on android devices API version has problem handling a mixed for ip4 and ip6 public address - need more work.
  e.g. Note10 aTalk send public ip in IPV6 format, old device cannot handle IPV6 address, hence failed.
- Clean up JavaDoc for all java classes
- Major changes to all jingle classes with two new implemented base classes
  i.e. AbstractXmlElement and Default XmlElementProvider using builder approach

=========================================================================
Version:        2.8.1 (208010)
Release Date:   01/18/2022
Author:         cmeng
- Enhance Call History UI to allow deletion of records order than the specified timestamp i.e. CALL_START
- Check to ensure chatRoom creation cannot have subject set to null (smack 4.4.4 Bookmarks assert value != null)
- Change FilePathHelper#getRealPath to use MediaStore.MediaColumns.DATA to retrieve filePath disregard of the content type
- Cleanup DialogActivity for all other modules to refer to; remove all unused dialog functions in AndroidUtils.
- Allow download and install/reinstall the debug apk for the new or same version
- Change downloaded apk path to ./aTalk/tmp to auto create new apk filename if exist; else FilePathHelper#getFilePathWithCreate() will keep old apk file if exit
- Upgrade build to support android API-32
- Remove RandomUtils.java #secureRandomBytes() class and use  RandomUtil#fillWithSecureRandom(key);
- Purge unused SurfaceTextureManager class
- Move all xmpp directories and files into org.jivesoftware.smackx structure in preparation for future jingle features enhancements
- Fix (if possible) all Crash/ANR cases from FFR prior to v2.8.0

=========================================================================
Version:        2.8.0 (208000)
Release Date:   12/22/2021
Author:         cmeng
- Migrate to use android Camera2 API replacing deprecated Camera API
- Enhance remote video streaming handling to give higher frame rate and smoother display transition when sending device is rotated
- Fix remote video playback view in full screen when media call is started with device in landscape mode; see RemoteVideoLayout
- Improve remote video handler to avoid unintentionally removing the remoteVideoContainer view, causing display disruption
- Init camera parameters even when aTalk is in background mode - CameraManager has no such restrictions with Camera2 implementation

- Fixed both VP8/VP9 DePacketizer causing problem in AndroidCodec i.e.
  // int outputBufferIdx = codec.dequeueOutputBuffer(mBufferInfo, 0);
  // int inputBufferIdx = codec.dequeueInputBuffer(0);
  // ReSync the firstSeq if process has dropped out data; must do this else MediaCodec decode has the above problems
  * else if (RTPUtils.sequenceNumberComparator.compare(inSeq, firstSeq) > 0) {
        firstSeq = inSeq;
    }

- Disable user selectable 'use direct surface option' for android hardware decoder/encoder option:
  * Note: Current aTalk implementation requires direct surface option to be enabled in order
  * for fmj to use the android codec if enabled. So couple both the surface and codec options
  * FMJ will pick software decoder preference over hardware decode if isDirectSurfaceEnabled == false
  * FMJ will pick software encoder preference over hardware encoder if isDirectSurfaceEnabled == false
  * Both android encoder and decoder required aTalk restart to take effect if codec enable state changed

- Fixed android decoder problem using SurfaceView:
  * VideoHandlerFragment#doAlignRemoteVideo(); RemoteVideoLayout => preferredSizeChanged
  * Render the buffer with the default timestamp: Call releaseOutputBuffer(bufferId, true).
    see https://developer.android.com/reference/android/media/MediaCodec
- Fixed android encoder using SurfaceView
  * Merged SurfaceManager into SurfaceStream
  * Camera2 requires mSurfaceTexture.updateTexImage() to be executed in onFrameAvailable() thread

- Must check if the selected androidCodec is supported by the device when hardware encode is enabled
  * https://developer.android.com/guide/topics/media/media-formats#video-formats
  * AndroidEncoder#SUPPORTED_OUTPUT_FORMATS() depends on device capability.
  * see VideoMediaStreamImpl#selectVideoSize(DataSource, int, int)
- AndroidEncoder#configureMediaCodec(); need only to consider inputFormat for video size
  and taken into account in MediaFormat.createVideoFormat() pending device orientation (streaming video aspect ratio)
- Alert user on hardware codec init problem if any (when codec is not supported)

- Implement AbstractFormatControl#setFormat() as per JMF doc and cleanup the extended classes
  https://docs.oracle.com/cd/E17802_01/j2se/javase/technologies/desktop/media/jmf/2.1.1/apidocs/javax/media/control/FormatControl.html

- CameraStreamBase#MFormat: must use a clone copy of the reference format given in streamFormats[];
  i.e. mFormat = (VideoFormat) streamFormats[0].clone();
  otherwise mFormat.setVideoSize(mPreviewSize) will change the actual item in the formatControl.getSupportedFormats();
  causing problem in VideoMediaStreamImpl#selectVideoSize() to fail with no matched items, and androidCodec to work on first instance only

- Replace deprecated LifecycleObserver with LifecycleEventObserver in aTalkApp
- The user selected video capture device for media recorder is not retrieved properly
  Fix DeviceConfiguration#extractConfiguredVideoCaptureDevice() checking algorithm
- Disable MediaRecorder support for aTalk;
  after android API 23, android drops support for non-seekable file descriptors i.e. mediaRecorder.setOutputFile(createLocalSocket());

- ChatPanel#mergeCachedMessage must take care of outOfBound Index, else ArrayIndexOutOfBoundsException
- Adapt AndroidUIServiceImpl#getSize to cater for different android API, to avoid system crash.
- Add playback speed support to AudioBgService class; UI currently not implemented.
- Move MediaCodecs info setting into Expert settings preference screen.

- Relocate all java/javax classes to its original location - no relocation required for fmj (AS linker not further throw duplication)
- Upgrade smack to version 4.4.4
- Upgrade build to support android-12(s) i.e. API-31

=========================================================================
Version:        2.7.2 (207020)
Release Date:   12/03/2021
Author:         cmeng
- Fixed both VP8/VP9 DePacketizer causing problem in AndroidCodec i.e.
  // int outputBufferIdx = codec.dequeueOutputBuffer(mBufferInfo, 0);
  // int inputBufferIdx = codec.dequeueInputBuffer(0);
  // ReSync the firstSeq if process has dropped out data; must do this else MediaCodec decode has the above problems
  * else if (RTPUtils.sequenceNumberComparator.compare(inSeq, firstSeq) > 0) {
        firstSeq = inSeq;
    }

- Fixed android decoder problem using SurfaceView:
  * VideoHandlerFragment#doAlignRemoteVideo(); RemoteVideoLayout => preferredSizeChanged
  * Render the buffer with the default timestamp: Call releaseOutputBuffer(bufferId, true).
    see https://developer.android.com/reference/android/media/MediaCodec
- Alert user on hardware codec init problem

=========================================================================
Version:        2.7.1 (207010)
Release Date:   11/05/2021
Author:         cmeng
- The user selected capture device for media recorder is not retrieved properly on start up
  Fix DeviceConfiguration#extractConfiguredVideoCaptureDevice() checking algorithm
- Adapt AndroidUIServiceImpl#getSize to cater for different android API, to avoid system crash.
- Add playback speed support to AudioBgService class
- Upgrade smack to version 4.4.4
- Upgrade build to support android-12(s) i.e. API-31

=========================================================================
Version:        2.7.0 (207000)
Release Date:   09/28/2021
Author:         cmeng
- Add proxy support in smack HTTPFileUploadManager
- The selected action menu items is now highlighted on user click
- Prompt user for action if the SASL-External authentication failed due to invalid client certificate
- Disable auto start aTalk option on Boot for android-10 (API-29) and above; android disallows background activity launch
- Migrate aTalk Theme implementation to use android recommended Theme.AppCompat
- Extend aTalk activities with AppCompatActivity to support new Theme.AppCompat and ActionBar
  * androidx.appcompat.widget.Toolbar does not respect the layout parameters of either LinearLayout or RelativeLayout
  * see https://issuetracker.google.com/issues/199494941
- Migrate deprecated PreferenceFragment implementation to use androidx PreferenceFragmentCompat
  * Declaring nested hierarchies within the same XML resource using a nested <PreferenceScreen> is no longer supported.
  * https://developer.android.com/guide/topics/ui/settings/organize-your-settings
- Migrate to recommended androidx ActivityResultContracts.StartActivityForResult implementation
- Migrate alertDialog to use androidx.appcompat.app.AlertDialog
- Change quiet time dialog preference implementation to work with androidx DialogFragment
- Need android:directBootAware="true" for android-10 BOOT_COMPLETED Broadcast
- Clean up Search option for recent session and call history (yet to implement actual support)
- TODO: Clean up DialogFragment implementation i.e. extends OSGIDialogFragment
  https://developer.android.com/guide/topics/ui/dialogs

=========================================================================
Version:        2.6.4 (206040)
Release Date:	08/21/2021
Author:         cmeng
- Ensure proper handling of all file transfer types when the chat history logging is disabled
  * Need major changes to all the fileTransfer classes and FileHistoryServiceImpl.
  * ChatPanel#msgCache must be updated when file transfer status changes, else resume will use old FT status
  * Improve the way the history record are being retrieved and merged with msgCache
  * Cannot just clear msgCache under all circumstances; else will loss all history logged messages
- Fix new chat session messages get clear on resume, when:
    a. a file transfer activity has occurred.
    b. a message records are deleted
    c. on delivery receipt return
- Fix chat messages view is not properly updated when history chat messages are being fetched on user scrolling up.
  Must update msgView text when no html tag is being processed, revert msgView.setText(msgBody) as it was accidentally removed in v2.5.0
- Ensure file transfer status is consistently being reported even after resume from chat session closed.
- Two consecutive FT History messages should not be merged into one display message; else the second media file will not be shown
- Remove unused youtubeExtractor implementation
- Upgrade AS build to be compatible with JavaVersion.VERSION_11 => give problem so aborted
- upgrade 'org.osgi:osgi.core:8.0.0' - need new implementation for abstract method adapt(Class type)
  Not compatible with android api-21; so aborted the upgrade

=========================================================================
Version:        2.6.3 (206030)
Release Date:	07/17/2021
Author:         cmeng
- Upgrade smack libraries to version 4.4.3 release
- Upgrade opus to version 1.3.1, and add init_libopus.sh to fetch online source instead of svn check-in;
  clean up opus/Android.mk script; need to run init_libopus.h as source is not checked in
- Upgrade speex to version 1.2.0, and ogg to v1.3.5; speex 1.2.0 removed the resampler etc supports
  hence need to add missing files, needed by aTalk from speex-1.2beta3 (rc1);
  add init_libSpeexOgg.sh to fetch online sources for both speex-1.2beta3  and instead of svn check-in;
- Run gradle task 'initJniLibs' to fetch these jni libraries prior to android ndk build process.
  These libraries sources include: opus, speex and ogg
- Support VP9Encoder dynamic resolution change without doClose()/doOpen() (destroy/reinit) codec.
- Fix NPE from field due to (mediaServiceImpl == null) in SettingActivity; return with disableMediaOptions();
- Cleanup Spanish language syntax translation - contribution from community Ángel
- Future release consideration: opus codec is preferred over speex.
  remove speex codec support and use net.sf.fmj.media.codec.audio.RateConverter instead

=========================================================================
Version:        2.6.2 (206020)
Release Date:	07/08/2021
Author:         cmeng
- Implement android youtube player using IFrame Player API to avoid video link extraction error
- Support youtube playlist playback i.e. Fallback to use as playlist if youtube url load failed.
- Use fragment for exoPlayer and youtubePlayer playback, allowing user page sliding or text entry
- Add support for VP9 codec support in media call
  * VP9 decoder; problem due to incorrect calculation of the VP9 Payload Descriptor data size
  * VP9 encoder:
    cfg.g_lag_in_frames = 0 to avoid lag in frames (25 buffer frames) delay
    cfg.g_threads = 1; codec control VP8E_SET_CPUUSED >= 7 for realtime video application; other encoder is not working
    should not use lossless mode for realtime video application
    create VP9PayloadDescriptor uncompressed header for start of frame etc
  * need to apply patches for v1.10.0 i.e. vpx_encode.h for vp9 encode to work
- AbstractCodec2#Process() must update inputFormat when there is a change in inputBuffer data; for vp9Encoder to handle device rotation
- Base on MessageHistoryActivator to getMessageHistoryService() instead of AndroidGUIActivator to avoid null reference;
- Not supported by camera preview, so omit: Add (800x450)camera resolution option for user selection;
  instead set (1280720) as default resolution
- Rewrite vpx_jni file, using marco and remove .h file for future ease of maintenance.
- Update jni/static_library_build script so all jni libraries are updated only if not found or version incorrect
- gradle task defined for building the jni static libraries for ffmpeg-x264, vpx and openssl
- FFmpeg must be compiled with the --enable-libvpx option for VP9 to work (but does not help in aTalk vp9 encode/decode)
  see https://developers.google.com/media/vp9/get-started

=========================================================================
Version:        2.6.1 (206010)
Release Date:	05/16/2021
Author:         cmeng
- AndroidCodec: Change implementation to remove all deprecated MediaCodec methods
  codecInputs = codec.getInputBuffers();
  codecOutputs = codec.getOutputBuffers();
- Upgrade libvpx to v 1.10.0; and update VPX.java static constant per libvpx v1.10.0
- Clean up VPX constants, VP8 codec source; VP9 codec clean up but still not working
- Upgrade ffmpeg-x264 build to use x264-161.3049 i.e. git clone https://code.videolan.org/videolan/x264.git --branch stable
- Tested working for ffmpeg v3.4.8 without source modification
- Upgraded ffmpeg version v4.4; need the following changes
  * Update all deprecated methods in FFmpeg.c
  * need to clean up Ffmpeg.java constants as per ffmpeg v4.4 release, e.g. CODEC_ID_VP8 = 139 else
    net.sf.fmj.media.Log.error()  Unable to handle format: H264/RTP, fmtps={profile-level-id=42E01f,packetization-mode=1}
  * Need to include FFmpeg.avframe_set_properties(avFrame, FFmpeg.PIX_FMT_YUV420P, mWidth, mHeight);
- Upgraded openssl to v1.1.1k and uses prebuilt ndk
- Remove unnecessary calls to deprecated functions in FFmpeg.java
  av_register_all(); avcodec_register_all(); avfilter_register_all();
- Update all jni/static_library_build scripts for ffmpeg-x264 and libvpx per latest deployed versions;
  directly install the generated static libraries to aTalk jni directory for build
- Enhance x264 encoder to support android device rotation
- cmeng (20210504): Call with/initiated by Conversation may get terminated abruptly, when h264 video codec is used
  CallPeerMediaHandel#getDefaultDeivce: display toast message and let it ends with NPE for simple fix;
  otherwise more unrelated error messages will display
- Upgrade ExoPlayer to version 2.13.3
- MediaExoPLayer activity is set to android:configChanges="keyboardHidden|orientation|screenSize",
  and orientation change is now handled by exoPlayer with smooth audio/video playback on screen rotation.
- JCenter deprecation and end of service: https://developer.android.com/studio/build/jcenter-migration
  https://jfrog.com/blog/into-the-sunset-bintray-jcenter-gocenter-and-chartcenter/
  Replace jCenter with mavenCentral amd omit jCenter from gradle

=========================================================================
Version:        2.6.0 (206000)
Release Date:	04/05/2021
Author:         cmeng
- Check for user valid ipAddress entry in STUN/TURN setting configuration
- Cancel vibrator immediately upon call accepted by user i.e. JingleMessageHelper.sendJingleAccept()
  and showToast message "Connecting caller" on received JingleProceed message
- Remove ProgressDialogFragment.showProgressDialog() in AndroidCallUtil#createCall(). Does not have chance to display and
  often have error in DialogActivity.waitForDialogOpened(dialogId), leaving an un-closeable (by user) dialog fragment
- Android throws the following error when camera resolution is set to 720x480 in portrait mode;
  522240 is for landscape size calculated by by PreviewStream#calcYV12Size:
  E/Camera-JNI: Callback buffer was too small! Expected 522240 bytes, but got 518400 bytes!
  Reason: aTalk always set to use landscape (0 deg) in camera preview; see PreviewStream#calcYV12Size()
- Default enable VP8 codec and set as first priority. Default video resolution to "720x480"
- RemoteVideoLayout#setVideoPreferredSize() Size change algorithm must use preferredSize and videoSize ratio compare;
  Otherwise, not null remoteVideoView will also return false for sizeChange when remote video dimension changes
  due to device orientation change; removed this test as it is unnecessary.

======== Video call with device orientation change ==========
Three approaches: #3 is selected for final implementation to give the best result:
1: In VideoCallActivity#onCreate, use setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_XXX)
   When sender changes orientation, recipient needs to change his device orientation to make the remote video view upright -> then sender remote view becomes OK.
   The video stream encryption with Replay protect should work properly as there is not interruption in stream sending.
   However when switch to back camera, the remote video is inverted. Both sender & recipient must switch to back cameras to work properly.
2. Approach aborted due to complexity and NewReceiveStreamEvent is not always gets triggered - reliability issue
   Do not send content-modify when the sender device orientation change as there is no change in senders attribute.
   see https://xmpp.org/extensions/xep-0166.html#def-action-content-modify
   The content-modify action is used to change the direction of an existing content definition through modification of the 'senders' attribute.
3. Use VideoActivity#onConfigurationChanged() event, and let app handles all the required changes i.e.
   a. Local content view redraw
   b. Need to check camera rotation; front/back to correctly transform video data for streaming; to avoid stretch and orientation
   b. Rotated camera preview sending, requires recipient CODEC to auto detect video stream size change. Currently only VP8 can support

======== Video call with camera switching ==========
- see PreviewStream#switchCamera(); release current camera and start user selected camera.
  # MediaStreamImpl#setDevice: remove check for device change in "if ((deviceSession == null) || (deviceSession.getDevice() != device))"
  # Seems not necessary after the above change, so reinsert back:
    Block DeviceConfiguration#setVideoCaptureDevice to firePropertyChange(VIDEO_CAPTURE_DEVICE, oldDevice, device);
    to avoid triggering of JIngle messages (content modify) sending

- The above two new implementations should improve SRTP replay protection reliability on screen rotation or switching camera

- The H.264 encoder and decoder are now extended with AbstractCodec2; and cleanup VPX codec
- H.264 codec cannot dynamically obtain remote video dimension, hence cannot support auto rotate remote view container: JNIDecoder#doProcess()
- Note: this is not required if using method #1 implementation; but show corrupted display for method #3 implementation.

- Port to fmj-1.0.1-jitsi.jar: only minor changes in pom.xml (no change in source)
- Upgrade to smack 4.4.2 release:
  * Remove jarjar smack-core (aTalk): omit AbstractProvider.java and Function.java classes in aTalk source
  * Port aTalk BoBExt and BoBExtensionProvider to use smack BoBDataExtension and BoBDataExtensionProvider respectively
- JCenter deprecation and end of service: https://developer.android.com/studio/build/jcenter-migration
  https://jfrog.com/blog/into-the-sunset-bintray-jcenter-gocenter-and-chartcenter/
  aTalk dependency on jCenter: jarjar, exoplayer, kotlin

=========================================================================
Version:        2.5.1 (1151)
Release Date:	02/08/2021
Author:         cmeng
- Enable ExoPlayer advance features/options for playback repeat and speed etc; use StyledPlayerView.
- Check and allow ExoPlayer for media audio url link playback
- MediaExoPlayer: onSaveInstanceState() may be called after or prior to onStop pending on OS version
  if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N)
     onSaveInstanceState is called after onPause but before onStop
  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
    onSaveInstanceState is called only after onStop
  Execute releasePlayer() in onPause for all OS; and save a copy of mExoPlayer.getCurrentPosition() in startPositionMs before release ExoPlayer.
- Fix logical check for ((Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) && isFinishing()) leads to
  MediaExoPlayer not properly stop; and keep adding new instance on screen rotation.
- HTML markup text check must also include <a href ..> etc syntax; define and use global HTML_MARKUP string
  String HTML_MARKUP = "(?s).*?<[A-Za-z]+.*?>.*?</[A-Za-z]+>.*?";

=========================================================================
Version:        2.5.0 (1150)
Release Date:	01/30/2021
Author:         cmeng
- Add embedded ExoPlayer for video media files or youtube media links play back
- Image content display can either use embedded glide image viewer or external image view application
- Improve process handlers for "Regenerate OMEMO identities", "Purge unused identities" and "Purge Corrupted OmemoKey"
  * SQLiteOmemoStore#purgeBundleDeviceList for server omemo data cleanup must purge the bundle and update devicelist
  * Add new method SQLiteOmemoStore#purgeCorruptedOmemoKey to properly handle in purging the corrupted omemoKey
  * Modified SQLiteOmemoStore#purgeInactiveUserDevices() to continue to the next device if exception occurs for current userJid
- Display alert dialog on Corrupted Omemo IdentityKeyPair to user to Regenerate omemo identities.
  * smack-omemo does not handle Corrupted KeyPair
- Update OmemoDevices table Unique constraint to contain only jid i.e. each user can only has one omemoDevice defined
- Improve "Report Bugs" to ensure the most recent aTalk logcat is included, with android OS and app version
  * Ensure the "atalk-logcat.txt" is log collected for debug log sending.
  * When report bug, insert android device OS info and aTalk apk version in log info
- Fix Writing exception to parcel in LogUploadServiceImpl#sendLogs()
  * ctx.grantUriPermission("android", logsUri, Intent.FLAG_GRANT_READ_URI_PERMISSION);
  SecurityException: Permission Denial: reading androidx.core.content.FileProvider uri content://...
  requires the provider be exported, or grantUriPermission()
- LaunchArgHandler: Use common defined strings in ConfigurationService
- Add <queries/> element in manifest file for Android 11 (API level 30)
- Found problem in Note-3 with setIdentityKeyTrust, following causes it to update to two rows. Doing 2/3 majority poll?
  Setting both peacock@atalk.sytes.net:17642636 & peacock@atalk.sytes.net:1701516316 trust state at the same time;
  both have same fingerPrint values (corrupted?)
    String[] selectionArgs = {device.getJid().toString(), Integer.toString((device.getDeviceId())), fingerprint};
    int rows = db.update(SQLiteOmemoStore.IDENTITIES_TABLE_NAME,
        fingerprintStatus.toContentValues(), SQLiteOmemoStore.BARE_JID + "=? AND "
      + SQLiteOmemoStore.DEVICE_ID + "=? AND " + SQLiteOmemoStore.FINGERPRINT + "=?", selectionArgs);

=========================================================================
Version:        2.4.7 (1147)
Release Date:	01/12/2021
Author:         cmeng
- ChatActivity: must only register ActivityResultContracts in onCreate cycle and not in onNewIntent->handleIntent; else
  java.lang.RuntimeException: Unable to resume activity {org.atalk.android/org.atalk.android.gui.chat.ChatActivity}:
  java.lang.IllegalStateException: LifecycleOwner org.atalk.android.gui.chat.ChatActivity@b4a2159 is attempting
  to register while current state is STARTED. LifecycleOwners must call register before they are STARTED.
- ChatActivity for group chat session must re-init the optionItem on LocalUserChatRoomPresenceChangeEvent e.g. captcha challenge
- AccountRegistrationImpl#installAccount(): Add check for valid xmpp user account in new account creation.
- Change color background light-color theme from grey50 to grey200
- Update smack AbstractProvider class as per smack v4.4.1 TBR

=========================================================================
Version:        2.4.6 (1146)
Release Date:	01/05/2021
Author:         cmeng
- Fix file sharing failed when sending thumbnail on request; smack throws NPE without max-age attribute in BoBData
  Include the recommended max-age attribute in new BoBData(), else smack throws NPE in BoBIQ#getIQChildElementBuilder
  when aTalk send BoBIQ#BoBData without one.
- Update BoBExt to confirm to the same as BoBIQ method call i.e. getBoBHash() => getContentId()
- Change mime-type to media-type in Thumbnail class to be compile to XEP-0264: Jingle Content Thumbnails
  v0.4 (2015-08-26) https://xmpp.org/extensions/xep-0264.html
- Migrate all the StartActivityForResult calls to new android ActivityResultContract implementations in:
  AccountInfoPresenceActivity, ChatActivity (attachments), NotificationDetails (pickRingTone), CertConfigEntryDialog#browseKeyStore
  PermissionsActivity#GetBatteryOptimization(), TTSActivity#mStartForResult, WebViewFragment
- Move SettingsFragment init process from onStart() to onResume(): hopefully help mConfigService NPE from field
  Also handle mConfigService == null in initNotificationPreferences()
- Handle (mRecipient == null) in ChatActivity#setOptionItem() => isDomainJid = true;
- Remove openFileChooser() support in WebViewFragment

=========================================================================
Version:        2.4.5 (1145)
Release Date:	12/18/2020
Author:         cmeng
- Fix UPnP for android-8.0(O) API-26 and above: Cleartext HTTP traffic not permitted in UPnP gateway.getDescription()
  * update network_security_configuration i.e. <base-config cleartextTrafficPermitted="true">
  * without clearText: org.ice4j.ice.harvest.UPNPHarvester.log() UPnP harvesting found zero device
- Clean up and optimize ice4j#UPNPHarvester.java call to weupnp library

- FileBackend#getMimeType() URI Unicode support; need to revert "%3A|"%2F|+" to ":|/|"%20" after URLEncoder.encode

- Upgrade smack library to v4.4.0
  * smack-extensions#BoBHash changes to ContentId

- Change NDK build process using android recommended method i.e. externalNativeBuild{}, and remove hard-coded path for ndk.dir
  See F-Droid can't build #170 https://github.com/cmeng-git/atalk-android/issues/170

- Commented out statement below as it causes NDK debug to crash when enter debug with error i.e.
  jni/opensles/org_atalk_impl_neomedia_device_OpenSLESSystem.c#78
  // assert(SL_RESULT_SUCCESS == result);
  * Debug log indicates it run OK without the statement
  I/OpenSLES: Create Audio Engine
  I/OpenSLES: Realize Audio Engine; engineObject_: 0x723c799c00
  W/libOpenSLES: Leaving Object::GetInterface (SL_RESULT_FEATURE_UNSUPPORTED)
  E/OpenSLES: Failed: Query Audio Input Capabilities

- upgrade library for:
    'commons-codec:commons-codec:1.15' from 1.14
    'org.apache.commons:commons-text:1.9' from 1.8
    'org.apache.httpcomponents.client5:httpclient5:5.0.3' from 5.0.1
    'org.apache.httpcomponents:httpmime:4.5.13' from 4.5.10

- This file is not part of the project. Please include it in the appropriate build file
  (build.gradle, CMakeLists.txt or Android.mk etc.) and sync the project. AGP bug - need android team to fix

=========================================================================
Version:        2.4.4 (1144)
Release Date:	12/08/2020
Author:         cmeng
- getFilePathWithCreate((): Obtain the actual filename and extension for android
  content:// scheme uri to create the tmp file before sending.
  android getMimeType() for content:// uri link returns audio/mpeg for mp3 file (with no ext);
  do not tag file with .mpeg, else it get treated as video/mpeg on both at sender and recipient.
- FileBackend#getMimeType() update to support uri with unicode characters; use URLEncode()
- MciStorageManager#processGroupContact() included a catch for IllegalArgumentException to delete any empty MetaContact.
  Otherwise incomplete contacts loading and no media call buttons are shown
- ZrtpControlImpl#generateMyZid() must regenerate a new ZIDSalt if none is defined for the current accountID;
  Passing in an empty string lead to NumberFormatException.
- startConnectivityEstablishment#startConnectivityEstablishment(): must check for
  (component != null); else findRemoteCandidate()' on a null object reference exception
- Use proper play-pause icon in Events UI for ring tone playing
- The latest ice4j-2.0.0-20190607.184546-36.jar seems OK with AWS_HARVESTER_PNAME => false
  * ice4j-2.0.0 work only with AWS disabled - otherwise hang in AWS EC2 conn.getContent()
  * Remove System.setProperty(MappingCandidateHarvesters.DISABLE_AWS_HARVESTER_PNAME, "true")
- ice4j dependency lib weupnp not working for android: see https://github.com/bitletorg/weupnp/issues/20
  need to define the xmp parser for weupnp for android i.e.
  System.setProperty("org.xml.sax.driver", "org.xmlpull.v1.sax2.Driver");
- Remove deprecated ndk.dir in local.properties and include it in build.gradle i.e
  // aTalk is only compatible to ndkVersion '20.0.5594570' max
  ndkDir = "/opt/android/android-sdk/ndk/20.0.5594570"

=========================================================================
Version:        2.4.3 (1143)
Release Date:	11/07/2020
Author:         cmeng
- Change ConnectionInfo#loadDetails() to use ISAddress.getHostString() instead of ISAddress.getHostName();
  Later may lead to a network access for reverse IP lookup and cause NetworkOnMainThreadException.
- Execute OMEMO Regeneration in background thread to avoid ANR.
- Improve Omemo regeneration process to include fixes for mismatched fingerprints, and correct new deviceId init process error
- An instance of PubSubManager must include userJid in parameter passing PubSubManager.getInstanceFor(connection, userJid);
  must also perform leafNode.deleteAllItems() before pubsubManager.deleteNode(nodeId) in
  * SQLiteOmemoStore#purgeUserOmemoData(), #purgeInactiveUserDevices()
  * see https://github.com/processone/ejabberd/issues/3418
- FileTransferConversation#updateProgress()-calculating a moving average for the speed so we don't get jumpy calculations for time etc.
- Update aTalk online link address
- Minor clean up in translation errors parameters {0} and {1}.

=========================================================================
Version:        2.4.2 (1142)
Release Date:	09/30/2020
Author:         cmeng
- Relocate aTalk files save directory to /Download/aTalk (android-Q), to avoid user data being purged by OS when aTalk is uninstalled
- Update aTalk media player UI to distinguish between pause and stop states
- Upgrade Smack to version 4.4.0-beta2
- Upgrade aTalk to support android-11(R) API-30

=========================================================================
Version:        2.4.1 (1141)
Release Date:	08/31/2020
Author:         cmeng
- Fix 'Unsupported path': android-Q enforces deprecated getExternalStorageDirectory() method, making it inaccessible to aTalk.
  https://developer.android.com/reference/android/os/Environment#getExternalStorageDirectory()
  https://github.com/cmeng-git/atalk-android/issues/164

=========================================================================
Version:        2.4.0 (1140)
Release Date:	08/25/2020
Author:         cmeng
- Removed and merged 'Remove certificate' option into SSL Certificate (Manage...) in Settings... menu.
  Delete file CertificateDeleteDialog.java
- Upgrade ZRTP library to zrtp4j:4.1.2:
  # Fix ZRTP X25519 key exchange error
  - https://github.com/jitsi/zrtp4j/commit/f7575bf6301927a997675726002d309b2acdd5d9
  - Do not upgrade to bouncycastle v1.6.6 AS has problem: Failed to transform bcprov-jdk15on-1.66.jar -> Unsupported class file major version 59
  # Truncate ZRTP KDF output as per RFC
  - https://github.com/jitsi/zrtp4j/commit/0baa502b9269d0d8a31247d032ee4896f945a344
  - Revert earlier patch (v2.3.1) added in org/atalk/impl/neomedia/transform/zrtp/ZRTPTransformEngine.java

- Cleanup contact 'Move to group' associated option handlers:
  # Contact moved to newly created metaGroup only get reflected in contact list after resume
    - Allow to addGroup(group) in addContacts(MetaContactGroup group) for zero contact group
    - MetaContactListAdapter#metaContactGroupAdded must be performed immediately,
      otherwise originalGroups and groups Lists do not get updated in metaContactMoved()
  # Include root group as one of the groups selection i.e. 'No group' (Contacts)
  # BaseContactListAdapter#getGroupView:
    - must init with convertView.setTag(group); otherwise clicked object may not properly defined
    - Must check for (convertView.getTag() instanceof GroupViewHolder) before using the view
    - Must perform groupViewHolder.groupName.setTag(group) for reused and new View
  # metaContactMoved(): Must add destination zero-child group to groups before proceeds.
    if (!groups.contains(newParent)) {
        Timber.w("Add missing move-to group: %s (%s)", destGroup, newParent.getMetaUID());
        addGroup(newParent, false);
    }
    - ServerStoredContactListJabberImpl#ChangeListener must check for ContactGroup.ROOT_GROUP_NAME for reuse (do not create new)
  # Change ROOT_PROTO_GROUP_UID = "Contacts"; Better defined as ContactListRoot
    - MclStorageManager#processGroupContact: add patch to upgrade DB e.g. "ContactListRoot" to "Contacts" etc
     (To be removed in future release)
  # Block any rootGroup i.e. "Contacts" creation in DB metaContactGroup Table
    - Do not allow removal of root group i.e. "Contacts" or VOLATILE_GROUP or non-empty group
  # MetaContactListServiceImpl#resolveProtoPath() update to take care rootGroup

- Smack 4.4.0-alpha5 does not immediately throws StreamErrorException to the calling app for action. Fixed in smack 4.4.0-beta1:
  https://discourse.igniterealtime.org/t/smack-4-4-0-alpha5-does-not-immediately-throws-streamerrorexception-to-the-calling-app-for-action/88495

- Fix TLS client certificate info display problem: API-29 webview has problem to display '#' character. So use string.replace("#", "&sharp;");

- Upgrade HttpUtils: Migration to Apache HttpClient 5.0 replacing deprecated library. Remove SSLSocketFactoryEx.java
  HttpUtils not fully tested (used by CertificateServiceImpl & ProvisioningServiceImpl) but not active in aTalk.
  https://hc.apache.org/httpcomponents-client-4.5.x/android-port.html
  https://ok2c.github.io/httpclient-migration-guide/migration-to-classic.html
  https://stackoverflow.com/questions/29294479/android-deprecated-apache-module-httpclient-httpresponse-etc/37623038#37623038

- Add new UI language support i.e. Português (Brasil)

- Upgrade libraries and AS environment:
  'com.karumi:dexter:5.0.0' => 6.2.1; 'com.github.yalantis:ucrop:2.2.2' => 2.2.5
- classpath 'com.android.tools.build:gradle:4.0.1' => 4.1.0-beta05;  // Resolved key map error
- distributionUrl=https://services.gradle.org/distributions/gradle-6.1.1-all.zip => gradle-6.5-all.zip
  Re: Issue 162527853: android studio regularly but randomly throws error a jar file is missing in the map and stop during the build process
  https://mail.google.com/mail/u/0/?zx=9buvzusctsa7#inbox/FMfcgxwJXCJPJxNvXVqcgqGMtsGKbMQZ

- Resolved the following problem with 4.1.0-beta05 i.e. omit Function.java from lib and use aTalk local Function.java file instead
  Compilation failed to complete, position: Lorg/jivesoftware/smack/util/Function;identity()Lorg/jivesoftware/smack/util/Function;,
  origin: /home/cmeng/.gradle/caches/transforms-2/files-2.1/d486bd3eea9279be8fb8935015afbed5/jetified-smack-core-jarjar-4.4.0-alpha5.jar:org/jivesoftware/smack/util/Function.class
  @see https://issuetracker.google.com/issues/162527853#comment21

=========================================================================
Version:        2.3.4 (1134)
Release Date:	08/05/2020
Author:         cmeng
- Fix Vibrator not stop after an incoming call is rejected or answered via JingleMessage.
- 'Fatal signal 6 (SIGABRT)' throws by mm-qcamera-daemon (libc in Android 10; ONEPLUS A3003); fixed by camera permission denied.
   Otherwise aTalk locks in splash screen (continuously restart by android OS in loops)
  e.g: Dalvik/2.1.0 (Linux; U; Android 10; ONEPLUS A3003 Build/QQ3A.200705.002
    07-29 11:21:00.261  7113  7160 F libc    : Fatal signal 6 (SIGABRT), code -6 (SI_TKILL) in tid 7160 (POSIX timer 0), pid 7113 (mm-qcamera-daem)
    o7-29 11:21:00.277  7113  7113 I chatty  : uid=1006(camera) /system/vendor/bin/mm-qcamera-daemon expire 13 lines
    07-29 11:21:00.407  7297  7297 I chatty  : uid=1006(camera) crash_dump32 expire 3 lines
    07-29 11:21:00.408  2613  2613 I /system/bin/tombstoned: received crash request for pid 7160
    07-29 11:21:00.422  7297  7297 F DEBUG   : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
    07-29 11:21:00.422  7297  7297 F DEBUG   : LineageOS Version: '17.1-20200727-NIGHTLY-oneplus3'
    07-29 11:21:00.422  7297  7297 F DEBUG   : Build fingerprint: 'OnePlus/OnePlus3/OnePlus3:8.0.0/OPR1.170623.032/02281230:user/release-keys'
    07-29 11:21:00.422  7297  7297 F DEBUG   : Revision: '0'
    07-29 11:21:00.422  7297  7297 F DEBUG   : ABI: 'arm'
    07-29 11:21:00.423  7297  7297 F DEBUG   : Timestamp: 2020-07-29 11:21:00+0200
    07-29 11:21:00.423  7297  7297 F DEBUG   : pid: 7113, tid: 7160, name: POSIX timer 0  >>> /system/vendor/bin/mm-qcamera-daemon <<<

- Eliminates the need to init and store the first entry i.e. Root MetalContact Group in metaContactGroup table.
- Update Telephony RecipientSelectView to conform to "com.splitwise:tokenautocomplete:4.0.0-beta1", compatible with androidx library
- Update otr source from jitsi repository
- Port account misc settings e.g. Media Encoding, Jingle, Stun and serverList etc to use androidx libraries

- Remove patches in MediaRecorderSystem and AndroidCameraSystem class i.e.
  Obsolete properties for locator facing back if exist
  Added in v2.1.6: remove obsolete/incorrect properties; to be removed in future release

=========================================================================
Version:        2.3.3 (1133)
Release Date:	07/28/2020
Author:         cmeng
- Table metaContactGroup must be initialized to contain the RootMetaContactGroup on new database creation
  Was accidentally removed when MigrateDir.aTalkDirMigrate() was removed.
- Include 'Online help' and 'About' in newly installed account creation UI pull down menu.
- Fix certificate view problem for compileSdkVersion = 29+; replacing &#8226; with &bull; in X509CertificateView
- Update source to remove dependency on the obsoleted NetworkInfo class.

- Upgrade compile SdkVersion to support API-29
- Port to use build:gradle:4.0.1 and gradle-6.1.1
- Move StringUtils.hexStringToByteArray() into AesgcmUrl.class; eliminating patched StringUtils
- Update RecipientSelectView to conform to "com.splitwise:tokenautocomplete:3.0.2"

=========================================================================
Version:        2.3.2 (1132)
Release Date:	07/24/2020
Author:         cmeng
- Login failed when server override option is enabled; must include config.setCustomX509TrustManager(sslTrustManager) for smack-4.4.0-alpha5;
- Add a new pager for recent chat sessions; i.e. implement ChatSessionFragment and ChatSessionRecord
- CallHisotry isShowVideoCallBtn() must check for valid MetaContact
- Fix android device without the TextToSpeech engine implementation, catch ActivityNotFoundException
  i.e. No Activity found to handle Intent { act=android.speech.tts.engine.CHECK_TTS_DATA }
- Redefined ChatSession.STATUS to store ChatFragment#chatType and bit-7 to hide from session UI;
  Redefine ChatFragment#MSGTYPE_XXX to support session record view
- Remove "Do not store OTR as it is invalid on new session startup" in CryptoFragment;
  for ((mChatType != MSGTYPE_OTR) && (mChatType != MSGTYPE_OTR_UA)), instead force to normal on retrieval
- When a room is destroyed, purge all the chat messages and room chat session from the database; not further retrievable.
- CallHistory list in descending order of the call timeStamp
- Port to smack library new PresenceBuilder() replacing the deprecated new Presence()
- upgrade libvpx to v1.8.2 (external build from libvpx-android)
- upgrade 'org.jxmpp:jxmpp-jid:1.0.0'
- Remove aTalk multidex implementation: android VM with version 2.1.0 has multidex support built in.
- Remove: Migrate aTalk to new directory structure 2.1.4 (2019/12/18)
  MigrateDir.aTalkDirMigrate();
- Remove migrate support for original jitsi database and xml file records into SQL Lite databases

=========================================================================
Version:        2.3.1 (1131)
Release Date:	07/14/2020
Author:         cmeng
- Add chatRoom option to enable/disable info display for member presence status and subject change notification.
- Error in sending two session-accept when call received via Jingle Message Initiation
  * AndroidCallListener#onCallEvent: CALL_RECEIVED should handle both incoming call via Jingle Message Initiation or Jingle session-initiate
  * CallJabberImpl#processSessionInitiate: Remove fireCallChangeEvent(CallChangeEvent.CALL_STATE_CHANGE, null, CallState.CALL_AUTO_ANSWER);
  * Remove CallState.CALL_AUTO_ANSWER - not required
- Make MetaContactGroupAdapter default to use aTalk defined i.e.
  * itemLayout = R.layout.simple_spinner_item;
  * dropDownLayout = R.layout.simple_spinner_dropdown_item;
- Fix ChatRoomConfiguration incorrect setup in multiSelectionSpinner field items: i.e. setItems() and setSelection().
  * Strange as it is still working in aTalk v2.2.5???
  * text_private, text_single and text_multi must clear the text entry when user enter empty string, and also update the configUpdates
- Add 'Online help' direct link access to FAQ web page

Port to use smack-4.4.0-alpha5 release
- ChatRoomJabberImpl#processOwnPresence() for room creation must include "http://jabber.org/protocol/muc#roomconfig" in form submit.
  or mMultiUserChat.sendConfigurationForm(null) for instant Room creation.
- Remove 'Fault Tolerance File Transfer' i.e. SOCK5 with IBB fallback support': not further supported in smack-4.4.0-alpha5<
  * InBandBytestreamManager, InBandBytestreamSession, IBBTransferNegotiator and FaultTolerantNegotiator
- Patch DataFormProvider class so it is backward compatible with earlier aTalk release for FileTransfer.
  * Need to remove in future aTalk new release
- smack Form class changes:
  * Form list_single must pass in String only and not arrayList in smack 4.4.0-alpha5
  * patch FillableForm to fix case error.
  * Files affected: CaptchaDialog, ChatRoomConfiguration, and IBRCaptchaProcessDialog etc
- Remove obsoleted disco spec:
  * OMEMO not further advertised @see XEP-0384: OMEMO Encryption
  * remove supportedFeatures.add(OmemoConstants.PEP_NODE_DEVICE_LIST_NOTIFY);

Update source per latest jitsi releases (20200630)
- Port neomedia source
  * zrtp4j-light-4.1.0-jitsi-1-SNAPSHOT to zrtp4j-light-4.1.1
  * Remove bccontrib source directory and files, use bouncycastle libraries instead
  * ch.imvs:sdes4j:1.1.4 to ch.imvs:sdes4j:1.1.5 (java.util.Base64 has problem on Note-5 - so revert the change)

- Update libraries to use maven releases and sources i.e:
  * fmj-1.0.0-jitsi
  * jitsi-lgpl-dependencies-1.2-1-gfc49658
  * jitsi-utils-1.0-39-gd481c98
  * jitsi-srtp-1.0-24-g6823dfa
- org.osgi.core-6.0.0
- Revert removal of files: org.ice4j.util.CustomizableThreadFactory.java and ExecutorFactory.java
- Removed unused class file: org.atalk.impl.neomedia.codec.video.Utils

- Implemented VP9 codec but not working - still under investigation:
  VPXEncoder: doProcess() -> (VPXEncoder.java:310)#doProcess: Failed to encode a frame: Invalid parameter
  VPXDecoder: doProcess() ->
  a. (VPXDecoder.java:177)#doProcess: Discarding a frame with decode error: Bitstream not supported by this decoder
  b. (VPXDecoder.java:177)#doProcess: Discarding a frame with decode error: Unspecified internal error

- Delete MediaPresenceExtension.class => move to use SourceExtension.class
- Replace StringUtils with org.apache.commons.lang3.StringUtils;

- Applied PR from libjitsi:
  * Fixes plain VP9 #432 (committed but not in jitsi actual source)
    https://github.com/jitsi/libjitsi/pull/432
  * Fix code inspection issues #526 (+aTalk own changes)
    https://github.com/jitsi/libjitsi/pull/526
  * Update VP8 according to RFC 7741 #513
    https://github.com/jitsi/libjitsi/pull/513
  * Improved interpretation of DTMF tones in DtmfTransformEngine #433
    https://github.com/jitsi/libjitsi/pull/433

=========================================================================
Version:        2.3.0 (1130)
Release Date:	06/15/2020
Author:         cmeng
- Remove 'Miss Call Notification' option from android notification channel; miss call is controlled via 'Call Notification'
- Add popup notification option for NotificationManager.CALL_SECURITY_ERROR event independent of SECURITY_MESSAGE
  * AndroidPopup: subCategorized mSmallIcon for WARNING_MESSAGE_TYPE, MISSED_CALL_MESSAGE_TYPE and Others e.g. SECURITY_MESSAGE
  * PopupMessageNotificationHandlerImpl: int messageType
- Do not fire missed call notifications if user dismissed the call:
  CallPeerJabberImpl#hangup with reason code set to CallPeerChangeEvent.NORMAL_CALL_CLEARING

- Show heads-up notification for an incoming message only if aTalk is in background.

- Move NotificationHelper() init to aTalkApp onCreate, so to get ready earlier to avoid RemoteServiceException:
  Bad notification for startForeground: RuntimeException: invalid channel for service notification:
  Notification(channel=default pri=0 contentView=null vibrate=null sound=null defaults=0x0 flags=0x60 color=0x00000000 vis=PRIVATE semFlags=0x0 semPriority=0 semMissedCount=0)

- Fix call problem with pidgin v2.13.0 having improper implementation sending 4 instances <jingle xmlns='urn:xmpp:jingle:1' action='session-accept'..>
  * CallPeerJabberImpl#processSessionAccept(): accept only first one and ignore all others; otherwise creates havoc in aTalk i.e.:
  * a. Accidentally stopZrtp() because of new audio stream (new accept), and this will clear all zrtp setup e.g. zrtpEngine == null (NPE)
  * b. VideoActivity#doFinishActivity() does not hangup call properly and the send stream remains active even after call end
  * c. Android system volume get stuck in call setOutputVolumeControl(audioStream, call) settings

- Implement XEP-0353: Jingle Message Initiation: https://xmpp.org/extensions/xep-0353.htm
  Block and skip handling of any incoming delayed Jingle Messages
- Use common Jingle session id for Jingle <propose/>, session-initiate, and media Call etc for easy handling of call notifications and actions
- Add new CallState#CALL_AUTO_ANSWER to handle call via Jingle Message Initiation.
- Add PopupMessage#EvenType - the type of the event that the popup message for for better handling of the various popup messages.
- Add new message type to SystrayService i.e. MISSED_CALL_MESSAGE_TYPE, JINGLE_INCOMING_CALL and JINGLE_INCOMING_CALL
- Add CallState.CALL_AUTO_ANSWER action in CallListener class to handle Jingle Message Accept and future auto-answer support.
- Change VideoCallActivity property to allow launching when device is in standby

- Fix call compatibility with conversations:
  * Conversation use Jingle Message Initiation for call setup - implement XEP-0353.
  * Add missing 'setup' attribute for fingerprint extension in jingle session-initiate: XEP-0320: Use of DTLS-SRTP in Jingle Sessions
    <fingerprint xmlns='urn:xmpp:jingle:apps:dtls:0' hash='sha-256' setup='actpass'/>
  * Conversations only accept setup.ACTPASS when aTalk is the initiator; Aborted when use setup.PASSIVE
  * Jingle session-initiate sid must be the same as the JingleMessage id, otherwise conversations will immediately terminate the call.
    Copy the JingleMessage id value to CallJabberImpl for use when creating session-initiate
  * Copy GroupExtension from session-initiate to session-accept - required by conversations
    Conversations v2.8.5 expects transport-info trailing session-accept, otherwise gives warning:
    W/conversations: hawk@atalk.sytes.net: no identification tags found in initial offer. we won't be able to calculate mLineIndices
    hawk@atalk.sytes.net: received unhandled jingle action session-info
  * conversations check for attributes ufrag and pwd in <transport/>; check unfrag (null) for space => error
    aTalk must include the same values as specified in session-accept transport-info
    <transport xmlns='urn:xmpp:jingle:transports:ice-udp:1' ufrag='aKw6' pwd='lMi0g0i9hPGJHPeb1TXlkZ9U'/>
  * Rejected by conversation with whitespace in value for <parameter name='imageattr' value='send * recv *'/>
    Negotiation of Generic Image Attributes in the Session Description Protocol (SDP); https://tools.ietf.org/html/rfc6236
    3.2.  Considerations
    3.2.1.  No imageattr in First Offer
    When the initial offer does not contain the 'imageattr' attribute, the rules in Section 3.1.1.2 require the attribute to be absent in the answer.
    Make aTalk compliance i.e. excluded 'imageattr' if none in the initial offer
  * Caller aTalk rejected: conversations failed with bouncyCastle certificate verification stage - illegal parameter:
    Certificate is signed with SignatureAlgorithm.ecdsa not supported by aTalk
    TlsServerImpl.getCertificateRequest to include ClientCertificateType.ecdsa_sign i.e:
    short[] certificateTypes = new short[]{ ClientCertificateType.rsa_sign, ClientCertificateType.dss_sign, ClientCertificateType.ecdsa_sign};
  * aTalk Video call with conversations cause conversations to crash for h264 codec:
     eu.siacs.conversations W/System.err: java.lang.IllegalArgumentException: h264 is not a constant in org.webrtc.VideoCodecType
     When remove H264 from codec offer, aTalk is then able to send/received VP8 video without problem;
     However conversations still has problem decode and display VP8 video.
     Reason: aTalk hardware codec supported packetization-mode does not really match Conversations (no common codec): need more investigation
     a. send from aalk:
        <payload-type id='105' name='h264' clockrate='90000'>
          <parameter name='profile-level-id' value='42E01f'/>
          <parameter name='packetization-mode' value='1'/>
        </payload-type>
        <payload-type id='99' name='h264' clockrate='90000'>
          <parameter name='profile-level-id' value='42E01f'/>
        </payload-type>
     b. send from Conversations:
        <payload-type name='rtx' id='99' clockrate='90000'>
          <parameter name='apt' value='98'/>
        </payload-type>
          <payload-type name='H264' id='100' clockrate='90000'>
          <parameter name='level-asymmetry-allowed' value='1'/>
          <parameter name='packetization-mode' value='1'/>
          <parameter name='profile-level-id' value='42e01f'/>
          <rtcp-fb xmlns='urn:xmpp:jingle:apps:rtp:rtcp-fb:0' type='goog-remb'/>
          <rtcp-fb xmlns='urn:xmpp:jingle:apps:rtp:rtcp-fb:0' type='transport-cc'/>
          <rtcp-fb xmlns='urn:xmpp:jingle:apps:rtp:rtcp-fb:0' subtype='fir' type='ccm'/>
          <rtcp-fb xmlns='urn:xmpp:jingle:apps:rtp:rtcp-fb:0' type='nack'/>
          <rtcp-fb xmlns='urn:xmpp:jingle:apps:rtp:rtcp-fb:0' subtype='pli' type='nack'/>
        </payload-type>
  * OperationSetAutoAnswerJabberImpl: Auto-accept call if call accept via Jingle Message <accept/>

- jisti 2.11.5624/5611 compatibility (video call only work on 5611):
  * jitsi does not respect the setting of <rtcp-mux/> in transport-info, continues to send non rtcp-mux transport info
    aTalk will realign itself to jitsi non rtcp-mux after received first call from jitsi
  * DTLS encryption failed with "cannot export keying material without "extended_master_secret" when aTalk is a server
    Make aTalk backward compatible with jitsi

- Support call via JingleMessage protocol or legacy if peer does not support XEP-0353: Jingle Message Initiation
- Default Opus Codec with useinbandfec=1 and usedtx=0 in advertised transport-info
  Not in rfc7587 specification: opusFormatParams.put("minptime", "10"), so not advertised

- Ensure transport-info of session-accept must have the two attributes i.e. ufrag and pwd specified
  * IceUdpTransportManager#createTransportPacketExtension must set both the attribute values
  * IceUdpTransportManager#wrapupConnectivityEstablishment must not strip the two attributes if transport-info contains child elements

- aTalk cannot handle Jingle transport-info properly when sent separately from session-initialize; session-accept with trailing transport-info
  * Break processJingle() handler into Synchronized (callPeer == null) and Non-Synchronized (callPeer != null)
  * Conversations sends trailing audio/video transport one after another for session-initiate and session-accept.
    Merge session-initiate with trailing transport-info's before being processed by OperationSetBasicTelephonyJabberImpl#processJingle();
    otherwise need to synchronously execute OperationSetBasicTelephonyJabberImpl#processJingle() to completion before process trailing transport-info
  * Must not start generating/processing local transport candidates establishment, before remote transport-info are processed
    - causing problem hold local transport until remote has completed.
  * For session-accept, must consolidated both transport-info's i.e. audio & video before process;
    Otherwise Ice4j#Agent#pruneNonMatchedStreams() prune video component when process the audio transport-info => creating problem.

- Always enable <rtcp-mux/> mode for all calls.
- NotificationServiceImpl#checkDefaultAgainstLoadedNotification: allow update of PopupMessageAction with new setting (no default)
- Enhance NotificationService to support sub-category message Type for Notification event

- Fix RtpDescriptionExtension implementation errors:
  * RtcpmuxExtension is childElement of RtpDescriptionExtension and not IceUdpTransportExtension.
    XEP-0167: Jingle RTP Sessions 1.2.0 (2020-04-22) https://xmpp.org/extensions/xep-0167.html
    <rtcp-mux/> specifies the ability to multiplex RTP Data and Control Packets on a single port as described in RFC 5761 [13].
  * Multiplexing RTP Data and Control Packets on a Single Port (April 2010), also propose to be included in transport
    https://tools.ietf.org/html/rfc5761 (5.1.3. Interactions with ICE)
  * Fix incorrect ExtensionProvider specified for <description/>:<rtcp-mux/>
    ProviderManager.addExtensionProvider( RtcpmuxExtension.ELEMENT, RtpDescriptionExtension.NAMESPACE,
        new DefaultExtensionElementProvider<>(RtcpmuxExtension.class));
  * CallPeerMediaHandlerJabberImpl#processOffer() must check for rtcpmux in RtpDescriptionExtension i.e.
        boolean rtcpmux = false;
        if (!description.getChildExtensionsOfType(RtcpmuxExtension.class).isEmpty() ||
            !transport.getChildExtensionsOfType(RtcpmuxExtension.class).isEmpty()) {
            rtcpmux = true;
            getTransportManager().setRtcpmux(true);
        }
  * Add chileElement RtcpmuxExtension support in RtpDescriptionExtension
  * Add parameter RtcpMux in JingleUtils#createDescription() for <rtcp-mux/> inclusion

- Cleanup DtlsFingerprintExtension class removing obsoleted 'required' to confirm with
  XEP-0320: Use of DTLS-SRTP in Jingle Sessions 0.3.1 (2015-10-15).

- Android 10: incoming (audio or video) calls fail to wake android device in standby for ring tone alert.
  Need to implement full-screen intent to start an activity from the background (standby)

- srtp classes improvements
  * DtlsPacketTransformer#initializeSRTPTransformer: use notifyHandshakeComplete() callback to init
  * Report any handShaking alert if any via srtpListener.securityMessageReceived()
  * Ensure the actual srtp security status is used for VideoActivity() encryption for display
  * TlsServierImpl and TslCleintImple now use getSupportedCipherSuites() in bctls DefaultTls_xxx

- OTR not interoperable with pidgin
  * XEP-0201: Best Practices for Message Threads; recommended only but not implemented by pidgin
  * OperationSetBasicInstantMessagingJabberImpl#getThreadIDForAddress(); create one if none found

- NotificationHelper: Set all android notification channels' alert to have silent tone, as aTalk have its own event handler
- Default Opus JNIEncoder#useDtx to false; MediaUtils=>opusFormatParams.put("useinbandfec", "1");
- FFR: Prevent ChatRoomCreateDialog crash on newly installed aTalk where there is no local or server chatRoom.
- Port to smack library new MessageBuilder() replacing the deprecated new Message()

=========================================================================
Version:        2.2.5 (1125)
Release Date:	05/13/2020
Author:         cmeng
- Fix STUN/TURN editor crashes when saved UserName or Password is null => NPE
  * StunTurnDialogFragment => StunServerDescriptor must check for null in setName and setPassword
- ChatActivity#sendAttachment need to catch SecurityException in case user has denied some resources access
- ChatInviteDialog#inviteContacts skip inclusion of DomainJid if selected
- Limit account_credentials reason field maxLines=6 to avoid 'Sign in' button get obscured
- Highlight user selected item in contact, chatRoom and call history list window
- MetaContactListAdapter: All contactList view update (from events) must be performed on UI thread handler => IllegalStateException
- ServerStoredContactListJabberImpl#addContact: replace deprecated addInterceptor() with addPresenceInterceptor()

- ChatRoomMemberJabberImpl.getContact(): must check for (jabberJid != null)
  remote (anonymous) muc chatRoom members may not have local stored contacts;
- ChatRoomJabberImpl: Use STATUS_110_PRESENCE_TO_SELF to check and process own chatRoom presence

- Port ice4j-2.0.0-20181024.160538-12 to ice4j-2.0.0-20190607.184546-36
  * Consumer was introduced in API 24: classRename 'java.util.function.Consumer', 'org.jivesoftware.smack.util.Consumer'
  * Duration: added in API level 26; see https://github.com/JakeWharton/ThreeTenABP.
    classRename 'java.time.Duration', 'org.threeten.bp.Duration' for < API-26 support
  * Remove unused atalk local files: org.ice4j.util.CustomizableThreadFactory.java and ExecutorFactory.java

- Port and upgrade all bouncycastle library jars from v1.62 to v1.65 and added new bctls-jdk15on:1.65.jar
  * Changes to zrtp4j-light-4.1.0: org.bouncycastle.cryptozrtp.params.ECDomainParameters: GIn.getEncoded() => GIn.getEncoded(false)
  * bctls-jdk15on_1.65.jar supports DTLS-SRTP TLSv12 protocol and additional CipherSuites
  * DtlsPacketTransformer#DTLS_TRANSPORT_RECEIVE_WAITMILLIS = -1 not allowed

- 20200501 fix or take action for all v2.2.4 / v2.2.3 FFR from the fields

=========================================================================
Version:        2.2.4 (1124)
Release Date:	04/30/2020
Author:         cmeng / MilanKral
- Display contacts sorted according to contacts' presence status in main contact list window.
  When contact list is displayed for user multiple selection e.g. group chat invite dialog,
  do not sort, as items selected by user is tracked by their list positions
  see MetaContactListAdapter#contactPresenceStatusChanged()
- Ensure hide offline contact list get updated when a contact presence status changes
  see MetaContactListAdapter#refreshModelData()
- Ensure Text to Speech when enabled remains active even when the chatSession is not in focus.
- TTSActivity must check and blocked TTS access if TTS voice is not available on device
- Display android device cameras sorted by name for user selection in Settings...
  Camera name changed (Front Camera => Front): Must force valid in DeviceConfiguration#extractConfiguredVideoCaptureDevice to a valid value
- Add new call history records display UI in main pager selection
- Add new UI language support for Slovak

- Ensure consistency in UI text display as per user selected language.
  Implement LocaleHelper and ensure aTalkApp ContextWrapper mInstance is properly updated on startup and when UI language has changed
- Fix user selected Language reset by WebView for android-N and above.
  Must add new WebView(this).destroy(); in aTalkApp#onCreate(); prevents WebView changing UI back to system default
  Android - WebView language changes abruptly on Android 7.0 and above:
  https://stackoverflow.com/questions/40398528/android-webview-language-changes-abruptly-on-android-7-0-and-above

- Fix ConfigurationUtils init aTalkApp#mLanguage to null => system crashes on user language selection
- ProtocolContactSourceServiceImpl & MetaContactListServiceImpl: must not use R.string.service_gui_CONTACTS translated string in rootMetaGroup assignment.
- FileBackend.isHttpFileDnLink checking mechanism must use [\\w-] in word character search i.e. include '-' as valid character for file path/name

- Need to ignore FileHttpDownloadConversation#queryFileSize returns file size == 0 and continue to check further.
- Implement ThemeHelper to hide implementation details and for easy maintenance
- Change all class extends Activity/FragmentActivity to OsgiActivity to ease and ensure consistent in Theme
- Fix TLS_Configuration and CertConfigEntryDialog crash on screen rotation

- Cleanup and ensure proper call to smack Stanza#genExtension() and alike for Captcha and Nick etc
  For 4.4.3-master (20200416), cannot use: presence.getExtension(Nick.class); => IllegalArgumentException
  Instead must use Nick nickExt = (Nick) presence.getExtensionElement(Nick.ELEMENT_NAME, Nick.NAMESPACE);
  Add static QName QNAME = new QName(NAMESPACE, ELEMENT); for all aTalk extension classes
- HttpFileUploadManager#upload(): inputStream.close() throws IllegalStateException on Note-5. Must include in catch

=========================================================================
Version:        2.2.3 (1123)
Release Date:	04/16/2020
Author:         cmeng
- Implement Text to Speech and speech recognition UI with enable option per chat session (contact and group chat)
- Cleanup and enhance ComboBox UI to allow user edited text and selector popup for selection:
  popup dropdown together with the user edited text in selector and hide softKeyboard
  set dropdown width to match parent
- Improve FileBackend.isHttpFileDnLink checking mechanism to minimize incorrect classification and display file download UI
- Show video/call buttons if supported by any one contact login with multiple resources of different capabilities
- Ensure ChatRoomConfiguration does not crash on screen rotation
- FileHttpDownloadConversation, do not attempt to auto download if stored status is
  FileRecord.STATUS_FAILED. Show Retry and let user decide; otherwise ANR

- Fix problem that translated service_gui_settings_BOSH_PROXY is used as pref_key.
- Add static method to hidKeyboard() in ViewUtil.java
- Fix Create ChatRoom crashes when there is no registered user
- Fix Add contact Create Group... but cancel => java.lang.ClassCastException: MetaGroup cast exception
- Fix android developer FFR for aTalk ver 2.2.2
- Ported smack library to smack-4.4.0-alpha-20204040 release; obsoleted classes or affected methods:
  HostAddress, OmemoMessage.send#asMessage, Message => Message.Builder,
  All ExtensionProvider.parse(XmlPullParser parser, int initialDepth, XmlEnvironment xmlEnvironment) must not return null
  see https://discourse.igniterealtime.org/t/smack-4-4-0-alpha3-20200404-fail-to-parse-capsextension-from-the-received-presence-stanza/87694
  Add public static final QName QNAME = new QName(NAMESPACE, ELEMENT) to ExtensionElement implementation class
  MessageBuilder messageBuilder = StanzaBuilder.buildMessage() must not be reused for OMEMO xhtml generation
- ConfirmIQ.appendErrorIfExists => final class in 4.4.0-alpha3 20200404: iqChildElement no logger supported
- aTalk minimum android OS support is API-21 (android 5.0 Lollipop)

=========================================================================
Version:        2.2.2 (1122)
Release Date:	03/30/2020
Author:         cmeng / MilanKral
- Enhance create/join chat room UI: refresh all fields content and allow user password entry for the selected chatRoom
- Allow saving and retrieving of the chat room protected password for later room auto-join or rejoin
- Support joining room on cross domain server, and default new room creation with OMEMO chat support
- Add support for room configuration by owner; re-init CryptoFragment OMEMO options after the room properties changed
  Note: configured properties for no persistent room will be reset to default when last participant left
- Display an error message in chat instead of a pop-up alert dialog when user canceled Captcha challenge on joining room
- Fix CaptchaDialog race condition (~10ms) when user canceled challenge but still triggering a retry popup
  Change execution order to ensure ChatRoomJabberImpl.mCaptchaState is updated before <presence/> exception is processed
  Server sends <presence/> exception immediately after captcha error is sent.
- Make fingerprinting of ZRTP connections harder by using a different ZID for each user callee

- Implement MultiSelectionSpinner class
- Checking of ChatMessageImpl#isConsecutiveMessage must consider both the previous and current new messages
- Clear up all file transfer classes to use common updateXferFileViewState(), a view update for buttons and info state
- Send a remote message when local user canceled file transfer (non-standard protocol support)
- Update ComboBox class to support onItemClick() call back to update room field values
- Update ComboBox per selected theme color for background and text
- Use Spinner.setSelection(index, false) to avoid onSelectedItem get triggered on first init
- Change aTalkApp.waitForFocus() to return current activity.
- fixed NPE: 'boolean org.jxmpp.jid.parts.Resourcepart.equals(java.lang.Object)' on a null object reference
          at ChatRoomJabberImpl$MemberListener.joined(ChatRoomJabberImpl.java:1287)
- Patch in v2.1.7 for smack#MultiUserChat to fix chatRoom destroy update etc, but creates problem participant leave
  state not being broadcast.

=========================================================================
Version:        2.2.1 (1121)
Release Date:	03/17/2020
Author:         cmeng / MilanKral
- Add user selectable Themes support
- Implement user selectable option for heads-up notification.
  Must ensure android Notification category 'show as pop-up' is also enabled for android-N.
- Support download and display of url image in src tag embedded in xhtml message
- Share of youtube and other social media links are tagged with thumbnail and title
  see https://noembed.com
- New features support for group chat: Erase chatRoom history and GPS location sending
- Execute ChatActivity.getLastSeen() in new thread to avoid ANR
- Upgrade glide library to v4.11.0 for better control of loadImage preview sizes for history and new media
- Refresh Setting... immediately when user changes Language or Theme options

- Upgrade security in crypto algorithms used for ZRTP i.e. use SHA-2 384, 256 bit ciphers AES-256 & TWOFISH-256, and enable elliptic curve crypto using Curve 25519
- Enhance SDES encryption with AES 256 and AES 192
- Enhance AES-256 acceleration using OpenSSL

- SetTheme() in parent class OSGIActivity for all inherited class
- Must always call setTheme() method before super.onCreate(savedInstanceState), otherwise not working
- Top fragment must set android:clickable="true" and android:focusable="true" to prevent touch action falls through to underlying fragment
  e.g. telephone.xml and cert_tls_config.xml

- Do not resend last message if it is a system error. Add MessageDeliveryFailedEvent.MessageDeliveryFailedEvent (e.g invitation not allowed)
- Change GeoLocation to use callback for returning the result.
- Remove AvatarCacheUtils class, seems cache avatars may contain partial image; fallback all getAvatar to use AvatarManager instead.
- Remove unnecessary access to fetch vCard from server with large amount of avatar data on first login.
- Update MessageDeliveredEvent class to include sender EntityJid/Nick (string)
- Remove resources support for ldpi resolution
- Preference popMenu dialog layout not override due to too many private attributes (dialog is framed with a boundary overlay)
  Need to move to API-21 and use Theme.AppCompat in next release
- Fixed aTalk v2.2.0 FFR

=========================================================================
Version:        2.2.0 (1120)
Release Date:	02/28/2020
Author:         cmeng / MilanKral
- Implement XEP-0178: Best Practices for Use of SASL EXTERNAL with Certificates
- Fix incorrect implementation in MessageSourceService#saveRecentMessageToHistory()
- Contact list view item may not tagged with correct metaContact, causing incorrect chat session being launched
  must always init and re-tagged in BaseContactListAdapter#getChildView() for new or reused views.
- ChatRoom list view item may not tagged with correct chatRoomWrapper, causing incorrect chat session being launched
  must always init and re-tagged in BaseChatRoomListAdapter#getChildView() for new or reused views.
- Change the XMPP Connection reply timeout to smack default of 5 seconds under all normal operations.
  Too many FFR on ANR at smack.StanzaCollector.nextResult (StanzaCollector.java:206) when server is not responding.
- When aTalk is minimized or closed, generate an alert tone and wake aTalk and show join room dialog on receive an invitation
- Move from chatRoomJabberImpl to OperationSetMultiUserChatJabberImpl#addAsyncStanzaListener() to to handle captcha and error messages from room
- Complete redesign handler and enhanced UI for room with captcha protection:
  Omit use of SMACK_REPLY_CAPTCHA_TIMEOUT(=60000), Otherwise 60s ANR occurs if aTalk is not in-focus.
  Allow retry on user incorrect captcha code entry
  Display captcha failed/passed result on chat view
- Hide chatRoom option items that are invalid when user has not joined the room.
- Do not highlight chat room in list when user cancel captcha challenge or failure to join chat room i.e. remove from active chatRoom list
- Ensure all room created are non-anonymous and member-only to provide OMEMO encryption.

- Implement auto-accept content download for file sharing via http file upload
- Fix unable share unencrypted file between aTalk and Conversations see https://github.com/cmeng-git/atalk-android/issues/104
  OperationSetFileTransferJabberImpl#sendFile() throws OperationNotSupportedException
  if !(contactJid instanceof EntityFullJid) to allow caller to use alternative httpFileUpload

- Revert change to ConferenceChatTransport#allowsChatStateNotifications to include chatRoom.isJoined() as one of the test condition
  Not necessary as Check already included in sendChatStateNotification(). Otherwise in new captcha handler,
  have problem in room with captcha protection, need to re-enter room to send chatState notification.
- Implement LifecycleObserver to detect aTalk is in foreground or background
  Must not launch any UI when aTalk is in background e.g. CaptchaDialog - system crash.
- Implement TLS client certification configuration options
- Fix incorrect implementation and clean up all various AuthWindow classes:
  AuthWindowImpl.setVisible must not execute from main thread, otherwise "synchronized (notifyLock){}" blocks UI in startActivity()

- Add silent notifications channel for snooze and chatState notification
- Reclassified chatState popup notifications to Silent Notification i.e. no head-up notification.
- Implement android Heads-up notification with 'Mark as read', 'Reply' and 'Snooze'
- Implement quite hours to mute all notification alerts

- Fix report problem in https://github.com/cmeng-git/atalk-android/issues/110:
  Provide receipt status for each message in merged message view holder; prefix X mark on each undelivered message
  Remove original message views of both send and receive corrected messages
  Retain message multiple lines structure when doing edit
- Allow message sending using CTRL-ENTER from physical keyboard
- Compile and include online update service to debug version only
- (MilanKral) Implement ZRTP-Hash element checking for the integrity of the ZRTP key exchange:
  Fix https://github.com/cmeng-git/atalk-android/issues/101
  Using <zrtp-hash/> element check the integrity of the ZRTP key exchange. #112
- ZrtpControImpl: When advertise ZRTP Signalling option is enabled, access to ZRTP transform engine is called before it is being created
- Initialize FortunaGenerator() default constructor with SecureRandom seed
- Fix Field Failure Report (FFR) on ANR and Crash from v2.1.7

=========================================================================
Version:        2.1.7 (1117)
Release Date:	02/02/2020
Author:         cmeng
- Redesign ChatRoomListFragment to ensure all listeners are retained when a group chat session is opened
- ChatRoomListAdapter.dispose() should only be executed onDestroy(). Otherwise all chatRoom listeners are removed
- Enhance chatRoom destroy to support reason and alternate room entry to continue discussion
  creating new ChatRoomDestroyDialog and remove chatRoom from EntityListHelper#removeEntity()
- Fix incorrect implementation of chatRoom destroy alternateAddress i.e. new room to join (not implemented in v2.1.6)
- Show Destroy chatRoom option only if user is the owner in ChatRoomList context and conference chat session
  Save UserRole in database for later retrieval when user yet to join the chatRoom
- Update getUserRole() and store userRole to DB for later retrieval for non-joined room
- ChatRoomMemberRole: add method fromString to convert string to Enum value
- ConferenceChatTransport#allowsChatStateNotifications to include chatRoom.isJoined() as one of the test condition
  This happen when a joined room is destroyed, to prevent chatState init or sending
- Do not send chatState when user left the room or room has already destroyed
- Patch smack MultiUserChat so the room destroy state is properly delivered and user/charRoom status are sync and updated
- Fix improper handling of ChatRoomJabberImpl#invitationDeclined() in sourceMember.getContact() may not be available causing:
  IllegalArgumentException: Not a valid combination of localpart, domainpart and resource
- Change ChatRoomInfoChangeDialog implementation to use DialogActivity.showCustomDialog().
- Change context menu in ContactList and RoomList to use PopupMenu instead of android ContextMenu (clipped item lists)
- ServerPersistentStoresRefreshDialog minimize use of the static in main class
- ChatInviteDialog clean up: ensure correct highlight of selected contacts and Invite button state
- Add user account option to specify Minimum TLS Version in connection setup (Default TLS 1.2)
- Replace obsoleted SHA-1 with SHA-256 for use with DTLS as recommended by XEP-0414: Cryptographic Hash Function Recommendations for XMPP
- Fix SDES encryption and ensure security protocol name and status are properly reflected in VideoCallActivity (zrtp, sdes etc).
- Cleanup MetaHistoryServiceImpl passing Object descriptor should either be MetaContact or ChatRoom
- Cleanup convertHistoryRecordToMessageEvent#convertHistoryRecordToMessageEvent and remove embedded ChatRoomMemberImpl class
- Allow deletion of the any stray system messages in the chat session
- Disable DTLS_SRTP option as the source is not compatible with BC1.6.2 (need further work on this)
- Remove unused MUC classes i.e. CustomContactActionsService, MUCGroupCustomContactActionService and cleanup MUCActivator
- Remove JabberChatRoomMember class, not much of use
- upgrade to jbosh:0.9.2

=========================================================================
Version:        2.1.6 (1116)
Release Date:	01/21/2020
Author:         cmeng
- Implement embedded audio media player in chat view with functions: Play, Pause, Resume, Stop(long press) and Seek
- Standardize dateTime format and layout in chat message and file transfer views
- Toggle front/back camera: Must include Camera.getCameraInfo(cameraId, cameraInfo) to fetch camera facing for each camera in AndroidCameraSystem and MediaRecordSystem
- Block user toggle camera via long press on camera icon in video call, if no alternate camera is available on the device.
- ChatInviteDialog clean up: allow user group expansion, fixed incorrect highlight of selected contact onShow dialog.
  use of new instance of ContactListFragment crashes aTalk on contact select. Revert to use aTalk clf
- Fix partial deletion of last file sent and file received messages due to null message Uuid
- Consolidate sendFile requests and add msgUuid for DB record identification and deletion - resolve partial deletion
- Fix chat view scroll incorrectly to top when the last sent/received message is deleted
- Catch Http File Download NPE when an invalid filename is specified
- Patch android-28 sdk MimeTypeMap.getFileExtensionFromUri() returns empty ext for filename with unicode characters
- Upgrade openssl jni libraries to version 1.0.2u: See https://www.openssl.org/news/vulnerabilities.html
- Update shell built script for openSSL v1.0.2u: https://www.openssl.org/news/vulnerabilities.html
- clean up string values for all file transferring states
- Fix Field Failure Report from v2.1.5
  FFR: ConcurrentModificationException at ChatRoomListAdapter.addChatRooms (ChatRoomListAdapter.java:256)
  FFR: NPE at OmemoAuthenticateDialog.onCreate (OmemoAuthenticateDialog.java:97)
  FFR: NPE at ChatFragment$ChatListAdapter.updateStatusAndAvatarView (ChatFragment.java:1519)
  FFR: NPE at ContactListFragment.lambda$updateUnreadCount$0$ContactListFragment (ContactListFragment.java:680)
  FFR: NPF at BaseChatRoomListAdapter.lambda$expandAllGroups$0$BaseChatRoomListAdapter (BaseChatRoomListAdapter.java:137)
  FFR: NPE at SettingsActivity$SettingsFragment.initNotificationPreferences
  FFR: NPE at ChatSecuritySettings$SettingsFragment.onStart (ChatSecuritySettings.java:85)
  FFR: NPE at ChatSessionManager.removeActiveChat (ChatSessionManager.java:105)

=========================================================================
Version:        2.1.5 (1115)
Release Date:	12/28/2019
Author:         cmeng
- Rename share intent to aTalk and setCustomView() for ShareActivity actionBar; android uses activity label name for share intend.
- Improve join chatRoom captcha challenge request handling and allow user retry on incorrect entry
- Improve AEC effectiveness: see AudioTrackRenderer and DataSource#configureEffects()
  must set audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION)
- Cleanup ZrtpInfoDialog Cipher info has multiple string formats specified - incorrect display.
- Must invalidate views in ChatRoomListAdapter after roomList has been updated, otherwise problem in Note-10 with zero item in list at time
- Fix empty password in AndroidSecurityAuthority crashes system
- Use small font for actionBar sub-title to allow more text characters display
- Keep a reference copy of the last fetched activity in Contact to minimize network access
- Cleanup FileHttpDownloadConversation in tmp and output files handling; use common setTransferFilePath() routine
- Remove duplicate 'Audio codecs' settings in 'Expert settings'
- Disable videoBridge feature init until actual implementation
- update jitsi xmpp extensions jibri and colibri class
- Update libjitsi to source dated 20191220
  - Remove h263 codec support and clean up the source
  - reverseTransformPacket - skip packet decryption to save resources when it is not needed

=========================================================================
Version:        2.1.4 (1114)
Release Date:	12/18/2019
Author:         cmeng
- Add support for Share, Quote and Forward for both message and media contents
- Preview media contents of attachments for user confirmation before sending
- Extend check for proper file extension on media file sharing; rename media file with best guess extension if possible
- Full XEP-0071: XHTML-IM implementation for Omemo messages in send and receive
- Fix ChatRoomBookmarksDialog crashes due to null value in either old or newly edited string
- All Links entered are sent in XHTML extension to avoid treated incorrectly as HTTP File Download by receiver;
  Apply more checks on links sent from other clients, see FileBackEnd#isHttpFileDnLink.
- Include all received media and outgoing tmp files for user optional deletion
- Return chat view to the top of last deleted message group after message deletion
- Enhance file handler and consolidate all user aTalk files into aTalk new directory structure
- Must remove '/n' when the sent/received message contains markup text
- OperationSetMultiUserChatJabberImpl/OperationSetBasicInstantMessagingJabberImpl#onOmemoMessageReceived
  : Do not proceed to process omemo message (i.e. body is empty) if decryptedMessage.isKeyTransportMessage() is true

=========================================================================
Version:        2.1.3 (1113)
Release Date:	11/28/2019
Author:         cmeng
- Support send and receive of instant messages that contain lightweight text markup (XEP-0071: XHTML-IM)
- Send OMEMO lightweight text markup in message body instead of XHTML extension (work only with aTalk)
- Enhance UI - add unread message badges for contacts and chatRooms list views
- Block all notification events for muc history messages and from chatRooms with autoJoin options enabled
- Add support for audio chat message with offline buddy and during conference
- Port to use smack ChatStateManager and add enhancement to support group chat state notification
- Enhance chatState notification event support for group chat.
- Fixed missing Cancel and Apply buttons in account info view when running in android-9 (API-28);
  Root cause problem in >= android-9 (API-28)
  * Remove aboutMeArea.setEnabled(false) as it causes softKeyboard to auto-launch
  * All view Dimensions are incorrectly init by android OS when soffKeyboard is auto launched.
- Eliminate all potential "null object reference" in TextView.getText.toString() - lead to ChatRoomBookmarksDialog crashes
- Improve ChatController UI on message correction and prevent text entry past boundary - combined correct and cancel as one
- Ensure HtmlImageGetter.HtmlImageGetter() to check for valid 'Image resource id' before fetching drawable image
- MessageReceivedEvent must check (getLastPathSegment() != null) before set eventType = ChatMessage.MESSAGE_HTTP_FILE_DOWNLOAD
  e.g.This is an invalid http download link https://cmeng-git.github.io
- Update aTalk#MainPagerAdapter method to allow others to findFragmentByTag
- Remove all static references to context classes for contactListFragment and contactListAdapter in aTalkApp
- Revert HttpUtils.java to use org.apache library and remove dependency cz.msebera.android:httpclient:4.5.8 (conflict with android library?)
- Change online help link in About to use https://cmeng-git.github.io instead of https://atalk.sytes.net/atalk
- Rename net.java.sip.communicator.service.protocol.Message => IMessage (avoid same naming as smack Message)
- create FileBackend#copy(is, os) and remove dependency for 'org.apache.commons:commons-io:1.3.2'
- Remove unused Html.java class; replacing it with StringEscapeUtils.escapeHtml4();
- Change or bounce library versions for:
  org.apache.commons:commons-lang3:3.8.1 => 'org.apache.commons:commons-text:1.8';
  org.apache.james:apache-mime4j-core:0.8.2 => 0.8.3
  org.bouncycastle:bcpkix-jdk15on:1.61 => 1.62
- Change build.gradle to have smack libraries as individual jar for easy reference, instead of merged jarjar

=========================================================================
Version:        2.1.2 (1112)
Release Date:	11/07/2019
Author:         cmeng
- Modify MediaRecorderSystem and AndroidCameraSystem to save camera parameters to persistent store and limit camera.open to one time only.
- Number front and back camera for identification, as android may have multiple cameras.
- Do not create volatile contact for muc user - Block OperationSetChatStateNotificationsJabberImpl#stateChanged to createVolatileContact when getType == Type.group
- Remove build.gradle unneeded "all*.exclude group: 'org.apache.httpcomponents', module: 'httpclient'". This also fixes fdroidDebug built with
  Encounter problem during XMPP Connection: java.lang.IllegalStateException: Could not load org.igniterealtime.jbosh.HTTPSender implementation
- update library for cz.msebera.android:httpclient:4.4.1.2 => 4.5.8

=========================================================================
Version:        2.1.1 (1111)
Release Date:	11/01/2019
Author:         cmeng
- Implement XEP-0124: Bidirectional-streams Over Synchronous HTTP (BOSH) & XEP-0206: XMPP Over BOSH standard; Certificates issue by android trusted CAs only
- Note-5 API-21 does not support self signed certificate for BOSHConnection - failed in android OS - Alert (Level: Fatal, Description: Certificate Unknown)
- Fix all problems in smack#XMPPBOSHConnection class for BOSH Connection support
- PPS should disable TLS for Bosh connection; XEP-206: The client SHOULD ignore any Transport Layer Security (TLS) feature since BOSH channel encryption SHOULD be negotiated at the HTTP layer.
- View certificate is not available for XMPPBOSHConnection - Show Toast message to user
- Ensure all notification events parameters' changes are saved to persistent store (dB)
- Fix non-loop ringtone prematurely stop during playback - always wait for 3 seconds to allow non-loop ringtone to play at
  least once in AbstractSCAudioClip#runInPlayRingtoneThread before proceed; allow ringTonePlayBack throw Exception
- Fix AndroidCallListener#fireMissedCallNotification() with incorrect eventType, must use NotificationManager.MISSED_CALL
- Clean up NotificationServiceImpl#saveNotification implementation/coding
- Playback ringtone in accordance with device ring tone volume adjusted or silent when muted.
- Remove main menu android Notification Settings... option - use aTalk notification events instead
- ChatFragment#SendFile(): Change to display actual send file exception message
- Note-5 API-21 has media sharing error during inputStream.close() i.e. IllegalStateException: GCM cipher cannot be reused for encrypt - just ignored unimportant
- UpdateServiceImpl.checkForUpdate must validate the downloaded apk is valid before install

=========================================================================
Version:        2.1.0 (1110)
Release Date:	10/08/2019
Author:         cmeng
- Enhance Event UI: allow user to pick android ringtone for playback and sort Events in ascending order for easy user reference
- Add support for user defined ringTone. Modify AbstractSCAudioClip class for ringtone playback using android RingTone class;
  AudioSystemClipImpl support only WAV format; android ringtone's are in ogg format etc
- Add SoundProperties#getSoundDescriptor to get aTalk default ringTone included in user selection
- Add support for user manual update the avatar in contactList - long press avatar (even when user is not online)
- Launch login prompt when user is disconnected due to multiple instance login i.e. conflict: Replaced by new connection
- Make xml error text more human readable and link clickable in login Reason field
- Standardize pass parameters and event code between MessageDeliveryFailedEvent and ChatRoomMessageDeliveryFailedEvent
- Add a temporary patch to purge obsoleted "missed_call" event in NotificationServiceImpl#loadNotifications
  Will remove in later aTalk v2.1.x releases.
- Update Thumbnail to confirm XEP-0264 Jingle Content Thumbnails v0.4 release i.e. change cid to uri; and implements ExtensionElement
- Update smack library to v4.4.0-alpha3-SNAPSHOT release;
- Remove dependency on XmlStringBuilder.prelude, use XmlStringBuilder xml = new XmlStringBuilder(this) instead
- Remove unused FileUtils.java - change to use FileBackend.isMediaFile() with support to guess ContentType From FileInputStream

=========================================================================
Version:        2.0.6 (1106)
Release Date:	09/27/2019
Author:         cmeng
- Auto send last omemo message once all undecided omemoDevices are authenticated by user, else display error message.
  supported by callback AuthenticateListener in OmemoAuthenticateDialog
- Improve account UI allowing user to change userName during login and in Account Settings...; warn user if results in old messages being purged
- Change DataBaseBackend#createAccount() to db.replace to allow accountID modification.
- Avoid ChatPanel#messageDeliveryFailed error message being cleared when passing through multiple listeners
- Hide contact context menu items i.e. 'Remove Contact' and 'Move to group' when user is not online
- Allow removal of any contacts in NotInContactList (ie. VolatileContactJabberImpl) and if it is not DomainBareJid
- Fix ANR and Exceptions from aTalk v2.0.5 release i.e.
  Run in thread for checkDeliveryReceiptSupport() - ANR from field
  Run in thread for ChatRoomListAdapter#initModelData to add chat rooms and avoid ANR
- Restrict chatRoomJabberImpl#addAsyncStanzaListener() to handle only captcha and error messages from conference
- Add support to display error messages received from conference room
- MetaContactRenderer#getDisplayDetails changes order of equate to avoid NPE as OperationSetExtendedAuthorizationImpl#getSubscriptionStatus may return null
- Catch exception for invalid RESOURCE_PRIORITY entry value to prevent system clashes.
- Compile apk target for android-Q (android-10.0 API-29) - reverted has problem with webView
- Add buildSrc build.gradle and restructure build.gradle's to conform to gradle-5.4.1 and build:gradle:3.5.0

- Fix strictmode-java-lang-throwable-untagged-socket-detected with TrafficStats.setThreadStatsTag(THREAD_ID)
 needed for UpdateServiceImpl

=========================================================================
Version:        2.0.5 (1105)
Release Date:	09/14/2019
Author:         cmeng
- Implement user options to cancel, Retry and display status progressBar during HTTP file downloading.
- Modify FileRecord saved info in DB to support Http Download retry.
- Implement 60sec idleTime in Http File Download to end and clean up all DownloadManager setup parameters
  if user exit chat session without Cancel the file download in-progress.
- Implement HttpFileDownloadJabberImpl.Cancel() for all in-progress HTTPFileTransfer when user delete Chat Session history.
- Hide last message correction cancel button in normal text entry to avoid accidentally discard text entered.
- Improve room UI in MUC session on participant join and subject change events
  i.e. do not display participants in room at join time.
- Do not show change subject message if this is the room original subject.
- Add member role in chat room occupant info display and fix multiple info messages display.
- Revert to chat NORMAL if current chat session cannot support the default chat OMEMO on open;
  otherwise show error null on NoOmemoSupportException
- Fix File transfer may incorrectly send to last registered user instead of intended recipient.
- Store all volatileGroups/Contacts in DB for later retrieval after aTalk re-launch
- DomainJid cannot be unsubscribed hence removal of DomainJid is not supported currently
- Support the display of messages receive from server (DomainJid)
- Allow file transfer from volatile contact.
- Fix ANR and NPE etc feedback from field for aTalk v2.0.4
- Iterate all system properties and outputs their names and values for debug log purposes.

=========================================================================
Version:        2.0.4 (1104)
Release Date:	08/31/2019
Author:         cmeng
- Improve preference settings UI according to user experience and add advance section
- Improve UI for BOSH-Proxy - feature suspended until smack has fully implemented the BOSH login.
- Fix error in Regenerate OMEMO identities - must only perform initialization on the current active omemoManager.
  Otherwise, user needs to restart aTalk.
- Extend OMEMO key bundles index range check to allow for prekey ID == 0
- Do not process VCardTempXUpdate from <presence/> sent by participants in chatRoom - all resolves to chatRoom entity with no VCard record.
- waitForDisplay() must have max time to avoid apk hangs when activity is null after shutdown.
- Port to jnsapi-0.0.3 latest source and update to confirm to smack-4.4.0
- Change mDB.storePreKey() to use pass-in preKeyId from storeOmemoPreKey(), instead of extracting it from PreKeyRecord.
- Add common AccountInfoPresenceActivity#getText() to check for null to avoid null pointer reference
- Add 'Save' option on exit AccountInfoPresenceActivity to allow user to save changes
  (fix android-P bug not displaying the 'Apply' button in form)
- Change user exit re-confirmation dialog UI.
- Change show/hide password icon/UI and handler implementation.
- remove obsoleted android feature i.e. requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
- Prevent aTalk from crashing when Storage permission is not granted to aTal (Report Bugs).
- Prevent AuthorizationRequestedDialog and RequestAuthorizationDialog from closing when user touches outside the dialog or press BackKey
- Show mic muted state in call if RECORD_AUDIO permission is not granted.
- Update README.md file

=========================================================================
Version:        2.0.3 (1103)
Release Date:	08/14/2019
Author:         cmeng
- Implement XEP-0184: Message Delivery Receipts support with user enable/disable option
- Implement XEP-0012: Last Activity support to show the time of the last activity associated with a contact
- AvatarManager#isAvatarNew must also check for Jid2Hash link is intact as one of the condition
- Fix ChatSessionManager->currChat.getChatSession().getCurrentChatTransport().getDisplayName' on a null object reference
  getCurrentChatTransport() will be null if pps.isRegistered in false
- Replace DB existing sent message with corrected content - do not create new message.
- Fix OperationSetPersistentPresenceJabberImpl.presenceAvailable to correctly updateResource of other instances of user login
- Rename Jingle classes and variables in preparation for later smack Jingle migration
- implement purge of unused OMEMO data on server when:
    a. Removal of user account
    b. Regenerate OMEMO identities
    c. Purge unused identities

=========================================================================
Version:        2.0.2 (1102)
Release Date:	07/30/2019
Author:         cmeng
- Upgrade smack libraries to v4.4.0-alpha2
- Migrate xmpp extension to use smack 4.4.0-alpha2 smack.xml.XmlPullParser/Event and XmlPullParserException
  from  org.xmlpull.v1.XmlPullParser and XmlPullParserException;
- Update OMEMO service and media file sharing to latest smack source - 20190701
- Remove local smack patched sources and use smack library for OMEMO, xhtml, PubSub

=========================================================================
Version:        2.0.1 (1101)
Release Date:	07/24/2019
Author:         cmeng
- Fix crypto chat session background color inconsistency - re-enable OMEMO will change to blue
  solution: do not allow doHandleOtrPressed handle UI update - leave it to otr events.
- Fix OTR padlock changes to unencrypted when press again
  solution: setStatusOmemo#default: just return and do nothing if it is in OTR session mode
- Fix system crash on OtrContactManager#equal on resourceName compare with NPE
- Fix JingleIQProvider#Parse incorrect CASE statement parse handling
- Clean up and update source to xmpp extensions, jitsi and libjitsi dated 20190720

=========================================================================
Version:        2.0.0 (1100)
Release Date:	07/16/2019
Author:         cmeng
- Harmonize aTalk UI presentation
- Enhance user/contact presence status with additional icon/status indicators
- ChatActivity#onOptionsItemSelected must include Invite item while already in conference
- Ensure first Omemo session setup with undecided contact omemoDevices is updated correctly based on return status
- Alert user of undelivered OMEMO message due to Undecided Omemo Identity Exception etc using MessageDeliveryFailed Event
- Provide option to user delete any corrupted OMEMO identity.
- "Purge unused Identities" will also purge all null Identity records from database
- "Regenerate OMEMO identities" will purge all current account OMEMO devices (active and inactive)
- OperationSetBasicInstantMessagingJabberImpl#sendInstantMessage and ChatRoomJabberImpl#sendMessage()
  to include (ChatRoom)MessageDeliveryFailedEvent handler for Omemo exception
- Remove unused OTR Messaging Security options in Settings...
- Crypto OTR item menu changes dynamically in response to contact presence status change
- Fix OTR system message links not response to user clicks
- Implement OTR multi-sessions outgoing session switcher
- OtrContact compare must use contact and resourceName; must not use ContactResource as its parameters may be difference (PresenceStatus)
- Cleanup OtrActivator() and init Global Policy with OTR_DISABLED_PROP saved value
- ScOtrEngineImpl addMessage must use contact.getAddress() instead of getDisplayName()
- ChatPanel#messageDeliveryFailed: cannot use nick for addMessage(). Otherwise message is not shown in contact chatFragment
- Fix crashes (msgFiles == null) & implement media files delete for "Erase this contact/chatRoom history"
- Launch chatRoom info as dialog and enhance its information content
- Use CopyOnWriteArrayList @ ChatPanel#getHistory() to avoid ChatFragment#prependMessages ConcurrentModificationException
- SQLiteOmemoStore#storeOmemoIdentityKey incorrectly checks for userDevice instead for contactDevice
- Clean SQLiteOmemoStore#regenerate() routine - need to AndroidOmemoService#initOmemoDevice() to publish Identity keys
- Ensure ConferenceChatManager#messageDeliveryFailed() MESSAGE_ERROR is shown in chatFragment (add missing statement)
- Enable \'Send attachment\' option access in chatRoom
- Allow BirthDateDetails to be stored as Calendar or String - too many Date formats cannot possible covered.
- Allow URLDetails to be stored as URL or String - value not use as active link
- Migrate aTalk to use androidx support libraries
- aTalk minimum installed android device OS version is 4.4 (KitKat) i.e. API-19

=========================================================================
Version:        1.8.8 (1088)
Release Date:	06/26/2019
Author:         cmeng
- Implement XEP-0070: Verifying HTTP Requests via XMPP - add smack library httauthorizationrequest
- Develop XEP-0070 smack libraries for above feature support
- aTalk WebViewFragment must not loadUrl() on resume - android OS resumes on closing dialog, destroy any new url loading request from site
- Allow webView to load if the URL host/domain name is the same, also provide proper handling of non-url link
- Must re-enable onKey listener on resume - previously set up is de-registered on view pause
- Simulate urlStack for user goBack() to his visited webPages even when the webViewFragement has been destroyed by android OS
- User entry web site must not contain leading or trailing spaces. Trim before store

=========================================================================
Version:        1.8.7 (1087)
Release Date:	06/19/2019
Author:         cmeng
- Incorrect casting of keySet() to string[] in ChatRoomBookmarksDialog#mAccountBookmarkConferencesList

=========================================================================
Version:        1.8.6 (1086)
Release Date:	06/19/2019
Author:         cmeng
- Implement XEP-0048: Bookmarks support with autoJoin on first login
- Default to save bookmark and enable autoJoin on newly created conference room
- Add global ChatRoom Bookmark option on main menu (local and server rooms included for user selection)
- Add user selectable autoJoin option in chatRoom list fragment. Join chatRoom and update bookmark if necessary
- Show user selected chatRoom bookmark dialog when click on chatRoom avatar/checkbox
- Provide user option to remove local stored chatRoom on XMPPException when purging chatRoom on server - non-auth
- Do not set MUCService.OPEN_ON_ACTIVITY when create a room - the room opens whenever there is an activity change (presence)
- Do not rejoin chatRoom in JoinChatRoomTask; check for nick and subject changes only
- Fix conferenceChatManager non-display of chat Messages received from member with nickName only - i.e. Contact == null
- Alert user on room attributes change failure - Only moderators are allowed to change the subject in this room
- Enhance CaptchaDialog to fetch Message.Body message for display
- Fix user selected chatType is not properly restored after user closed an active chatSession
- Fix debug apk update for android-N: need REQUEST_INSTALL_PACKAGES in manifest and support only scheme content://
- Remove bookmark when the chatRoom is destroyed
- Add callback to launch user install dialog on apk download completion

=========================================================================
Version:        1.8.5 (1085)
Release Date:	06/06/2019
Author:         cmeng
- Add web access to main page slider for company RSS feed or news sharing - default access to movim
- Add user option to specify default web access page in settings

=========================================================================
Version:        1.8.4 (1084)
Release Date:	06/05/2019
Author:         cmeng
- Fix smack ping function not working - aTalk stops receiving calls and messages on standby
- Provide persistent storage for user selected chatType across sessions and re-launch of aTalk.
  OTR chatType selected is not stored as its validity is session dependent and buddy being online.
- OTR session status check must resync with UI
- Change MetaContactChatSession#getChatName to getChatEntity and return chat EntityJid instead of displayName
- Redefined ChatSession.STATUS to store ChatFragment#chatType for persistent chatType retrieval

=========================================================================
Version:        1.8.3 (1083)
Release Date:	05/23/2019
Author:         cmeng
- Implement 'OMEMO Media Sharing' to support end-to-end encrypted files and stickers sharing
- Include http file upload service in fault-tolerance file transfer implementation;
  to handle clients that do not support legacy SOCK5 and IBB protocols e.g. conversations
- Support Stickers, Bitmoji and Emoji rich content sharing in chat room
- Enhance and harmonize UI for all the file transfer protocols, http file upload &amp; download services
- Provide encryption status indicator in media file chat view content
- Fix incorrect URL decode and highlight on hyperlink for direct web access - use Linkify method
- Upgrade openssl jni library to 1.0.2r (1.0.2l)

- Remove cache support for scDiscovery#nonCapsCache referenced by Jid without NVH - may contains obsolete discoInfo sets
- All EntityCapManager enquiry for contacts must be FullJid; same buddy may use different clients and discoInfo capabilities
- Implement remoteOnly message flag i.e. not local store, cache or display on sending device e.g. sending Http File Upload link
- Common use of Chat Events and ChatMessage flags as one entity - code optimization
- Fix FileBackend.getMimeType.getScheme() null return on non-content file checking causing system crash
- Fixed file transfer progress status update error
- Cleanup up jni openssl build scripts (not to use the latest android ndk-bundle)
  use android-ndk-r15c etc; Otherwise has below problem in aTalk build
  Latest ndk-bundle generated libraries have problem when integrate with aTalk.
  # armv7: requires unsupported dynamic reloc R_ARM_REL32;
  # x86: relocation R_386_GOTOFF against preemptible symbol ..
- Simplify and use single script command for each jni library built

=========================================================================
Version:        1.8.2 (1082)
Release Date:	04/24/2019
Author:         cmeng
- Fix Omemo chat session setup failure due to 'Cryptography Changes in Android-P'
  i.e. https://android-developers.googleblog.com/2018/03/cryptography-changes-in-android-p.html
  For fix see: https://github.com/Flowdalic/Smack/commit/7d7fbe68286d77f60c8f390034ee39f849f42dfa
  Smack-Omemo: Do not explicitly select the (crypto) Provider in smack-omemo
- Fixed libvpx VP8 encoder problem on android with ABIS x86/x86_64 platforms
  https://bugs.chromium.org/p/webm/issues/detail?id=1623#c6
- Upgrade libvpx to v1.8.0
- Cleanup and simplify scripts for ffmpeg-x264 static libraries build
- Replacing some ffmpeg deprecated functions
- upgrade AS to 3.4.0 release

=========================================================================
Version:        1.8.1 (1081)
Release Date:	04/13/2019
Author:         cmeng
- Init MediaRecorderSystem and AndroidCameraSystem only when aTalk is in foreground;
  otherwise android generates system notification: aTalk has been detected using camera
- Implement BackgroundManager class to allow re-init camera when the app returns to foreground
- Block sticker sending if user is not online
- Ensure user is login before checking server for HttpFileUpload service else NullPointerException
- Update org_atalk_impl_neomedia_codec_FFmpeg.c to support ffmpeg v3.4.6
- Upgrade ffmpeg lib to version 3.4.6 and optimized build option to reduce final jnilib sizes
- Upgrade x264 lib to v157
- Fix stanza creation for si file transfer with thumbnail element
- Must include --disable-asm option in ffmpeg-x264 build for arm64-v8a, x86, x86_64 else errors:
  ./i686-linux-android/bin/ld: warning: shared library text segment is not shareable
  ./x86_64-linux-android/bin/ld: error: in libswresample, libswscale, libavcodec: requires dynamic R_X86_64_PC32 reloc against ...
- clang/clang++ compiles .a libraries sizes > gcc/g++ (ndk-r15c) > old .a libraries (ndk-bundle)
- AS latest ndk-bundle is no further compatible; has tried gcc/g++ with API-15, and older ndk, no change in .a sizes???
- Update source and libjitsi to master release 20190409
- Move SIP extensions package to org.xmpp.extensions and update source to jitsi-xmpp-extensions 20190409
- libjnvpx.so is not compatible to android x86/x86_64 platforms, use x264 video codec instead

=========================================================================
Version:        1.8.0 (1080)
Release Date:	03/27/2019
Author:         cmeng
- Add jni native libraries support for all ABIS i.e. armeabi-v7a arm64-v8a x86 x86_64
- Cleanup ffmpeg-x264 build scripts and patches for 64bit ABI and fixed text relocation etc problems
- Cleanup vpx build scripts and patches x264-configure for correct arm68-v8a build
- Init camera only once on aTalk first launch; skip during network re-connect
- Use default of 10S timeout to retrieve VCard instead of 30S - field ANR
- Exclude postproc module in ffmpeg library build
  # https://trac.ffmpeg.org/wiki/Postprocessing
  # Anyway, most of the time it won't help to postprocess h.264, HEVC, VP8, or VP9 video.
- Upgrade vpx to version 1.5.2, max version that is compatible with ffmpeg 1.0.10 for aTalk
  i.e https://download.videolan.org/pub/videolan/x264/snapshots/x264-snapshot-20180806-2245-stable.tar
- Fixed undefined reference for x2

- Patch ffmpeg sources to support x264 > v152; build ok but  has problem with x264-157 encode in aTalk media call
- Continue to use x264-147 - compatible with ffmpeg=1.0.10 for aTalk
net.sf.fmj.media.Log.error() Failed to realize: net.sf.fmj.media.ProcessEngine@584fa51
net.sf.fmj.media.Log.error()   Cannot build a flow graph with the customized options:
net.sf.fmj.media.Log.error()     Unable to transcode format: YUV Video Format: Size = [width=720, height=960] MaxDataLength = -1 DataType = class [B yuvType = -1 StrideY = -1 StrideUV = -1 OffsetY = -1 OffsetU = -1 OffsetV = -1
net.sf.fmj.media.Log.error()       to: H264/RTP, fmtps={packetization-mode=1}

=========================================================================
Version:        1.7.3 (1073)
Release Date:	03/14/2019
Author:         cmeng
- Add Extension provider for eleName: ParameterExtensionElement and nameSpace:RTPHdrExtExtensionElement in
  JingleIQProvider - missing reference in parse method.
- IceUdpTransportManager-> agent.getHarvestCount() always return zero, use agent.getHarvesters().size() instead
- Add DTMF option in CallPeelRenderer class
- Add PNAME_SINGLE_CALL_IN_PROGRESS_POLICY_ENABLED option to SingleCallingProgressPolicy
- Add MASTER_PASS_WARNING_PROP in ConfigurationUtils
- Cleanup Timberlog and include FINEST log messages
- Cleanup jni directory structure and update readme file
- Update ffmpeg_1.0.10_atalk.tar.gz - add missing arch.mak file
- update smack sources to the official release 4.4.0-alpha2
- Smack provider.java: defined public E parse(XmlPullParser parser, int initialDepth, XmlEnvironment xmlEnvironment)
  for official 4.4.0-alpha2 release reference
- Update UriHandlerJabberImpl class (Patter p)
- Update TransportManager and PortTracker classes source
- Fix impl.neomedia.jmfext.media.renderer.audio.AudioTrackRenderer.stop() IllegalStateException

=========================================================================
Version:        1.7.2 (1072)
Release Date:	03/04/2019
Author:         cmeng
- Fix audio and video codec settings blank display causing system crash
  incorrect using the proposed import by AS i.e. org.atalk.android.R instead of android.R;
- Fix certificate display problem due to unknown issuer label in certificate content

=========================================================================
Version:        1.7.1 (1071)
Release Date:	03/02/2019
Author:         cmeng
- Add user option to access Application Notification Settings
- Clean up unused notification channels
- Fix send message no shown in local chat window
- Fix NPE in CredentialsFragment#initializeViewListeners
- Revert smack update to compile with official Smack 4.4-alpha2 release on 20190225

=========================================================================
Version:        1.7.0 (1070)
Release Date:	02/24/2019
Author:         cmeng
- Disable info Retrieval for contact avatar fetching on first login even when local cache is empty
  ejabberd will auto send VCardTempXUpdate in <presence/> stanza when buddy come online
- Replace LOGGER with Timber for improve debug messages logging
- Upgrade jarjar-gradle:1.0.0=>1.0.1 to allow gradle jarjar.repackage in gradle
- Improve create chatRoom dialog UI error messages
- Enhance user permission request process - always prompt for battery optimization if disabled
- Remove VCardAvatarManager#processStanza(Stanza) stanza interceptor to add VCardTempXUpdate ElementExtension;
  Not required as ejabberd server will auto add the VCardTempXUpdate ElementExtension.
- Rename all file names containing PacketExtension to ExtensionElement to be consistent with Smack
- Update to use smack 4.4.0-alpha2 release 20190223
- Update to use org.jxmpp:jxmpp-jid:0.7.0-alpha5 required by smack
- Replace public XmlStringBuilder toXML(String enclosingNamespace) with new smack Element implementation
  i.e Public CharSequence toXML(XmlEnvironment xmlEnvironment);
- Update dexter:4.2.0=>5.0.0;  libraries libphonenumber:7.5.1=>8.10.5; commons-lang3:3.6=>3.8.1;
  apache-mime4j-core:0.8.1=>0.8.2; bcpkix-jdk15on:1.58=>1.61
- Provide full instruction on how to build lib/*.jar from source in lib/src_reference/README.md

=========================================================================
Version:        1.6.6 (1066)
Release Date:	01/31/2019
Author:         cmeng
- Improve IB Registration process with optional Captcha challenge etc
- Enhance purge messages with option to delete received media files on local device
- Add support for file sharing with offline contact and chat members in conference room
- Change call-in-progress icon in notification bar to be more prominent for user awareness
- Ensure the call control buttons are not overlay by the navigation bar latest changes
- Always prompt user with battery optimization option on each aTalk launch if it was denied
- Allow user to clear/delete last sent chat message
- Disable last outgoing message edit option when in muc session

- fix ChatController: initChatController() must precede showSendModeButton() to init mChatTransport
  before use and mChatTransport must check against MetaContactChatTransport

=========================================================================
Version:        1.6.5 (1065)
Release Date:	01/18/2019
Author:         cmeng
- Launch permission request prior to start aTalk activity to fix no camera and video call problem
- Do not override chat room subject with default unless specified by user
- Add user option to change chat room nick and subject
- Display chat room subject instead of room occupants on actionBar
- Hide audio send button in conference - not supported and cause system crash
- Show camera disable icon in video call if no permission.CAMERA is granted
- DialogActivity - cannot unregister LocalBroadcastManager listener on Destroy as the activity
  is destroyed when developer don't keep activities is enabled. This cause dialog to remain open.

=========================================================================
Version:        1.6.4 (1064)
Release Date:	12/28/2018
Author:         cmeng
- Add user option for aTalk auto start on device reboot
- Implement full screen playback for remote video during media call
  i.e. put display to full screen for remote video playback in VideoCallActivity/VideoHandlerFragment
- Remove restriction on camera resolutions support for phone either in portrait or landscape mode
- Local preview and streaming video dimension shall follow phone orientation
- Remove auto option & add new resolutions in video resolution settings and resolve DB saving
- InfoRetriever dateFormat.parse to support avatar short_date i.e. 1992-01-03 created by other xmpp client
- Set compileOptions sourceCompatibility = '1.8' and add missing class for fmj
- Update libjitsi to 20181222 i.e. ./impl/nemedia/transform/csrc files
- Cannot update jitsi dependent library to ice4j-2.0.0-20181219.183044-23.jar - not compatible for Note 3
- Update to use smack 4.4.0-alpha2 release 20181228

=========================================================================
Version:        1.6.3 (1063)
Release Date:	12/17/2018
Author:         cmeng
- Implement Fault-tolerant negotiation for file transfer using Socks5ByteStream with IbbByteStream fallback
- Allow account connection by either its fully qualified domain name (FQDN) or its IP
- Change account setting to direct access and move account info access to context menu
- Introduce 3S sleep on returning to AccountInfoPresenceActivity from accounting setting before check account registration.
- Check to ensure dialog is showing before dismissed": PhoneWindow$DecorView-not attached to window manager
- Remove inactive account status icon in preference setting screens
- Use smack BobManager to handle Bob thumbnail request in OperationSetFileTransferJabberImpl and OutgoingFileTransferJabberImpl
- Remove ThumbNailIQ and ThumbNail(IQ)Provider; use BobManager instead
- Change aTalk Bob to BobExt and update to use smack BoBHash and BoBData format
- Omit Set Type=chat for Omemo message before sending - implemented in OmemoMessage - 4.4.0-alpha2
- Fixed BaseContactListAdapter#contactListFragment.getLayoutInflater() exception when it is not attached to FragmentManager
- Use aTalkApp.getGlobalContext()-Never use clf to startActivity; exception when it is not attached to FragmentManager in MUCServiceImpl

=========================================================================
Version:        1.6.2 (1062)
Release Date:	12/04/2018
Author:         cmeng
- Replace incompatible jitsi ErrorDialog with android showAlertDialog
- Set Type=chat for Omemo message before sending
- Use google stunServers as default if none is specified {stun1.l.google.com:19302}
- Update atalk to use jitsi-smack4.2 release 20181020
- Update libjitsi to release 20181122 (Omit Function and Predicate that require API-24)

=========================================================================
Version:        1.6.1 (1061)
Release Date:	11/03/2018
Author:         cmeng
- Omemo to ignore read-only devices to avoid weakening of forward secrecy implementation
- Migrate DB to version 4 to add Omemo MESSAGE_COUNTER to identities table
- Synchronized ChatFragment.prependMessages to avoid java.util.ConcurrentModificationException
- Port to use smack 4.4.0-alpha2 and dependency miniDns-0.4.0-alpha3
- Reduce aTalk dependency on static library with source expanded for systray-service.jar, ui-service.jar, util.jar, dhcp4java.jar
- Clean up unused sources expanded from ui-service.jar
- Replace org.json.simple.* with json-simple org.json.* and drop json-simple library
- Add static library sources into ./lib/srcRef for reference and libraries build if necessary

=========================================================================
Version:        1.6.0 (1060)
Release Date:	10/26/2018
Author:         cmeng
- Built target for Android 9.0 (Pie) or API-28
- Apps targeting API Build.VERSION_CODES.P or later must request the permission Manifest.permission.FOREGROUND_SERVICE
- Remove aTalk dependency on plugins:ews-android-api and its library source
  i.e. X509CertificateForm code rewrite and reuse in CertificateShowDialog
- Fix exception when MessageHistoryService is not ready in Settings menu
- Fix NPE in SettingsFragment.initMessagesPreferences (SettingsActivity.java:285)
- Incoming file transfer request not working when Send file thumbnail preview is disable
- Fix GPS playback stop after screen rotation due to onPause is called before onSaveInstanceState
- Implement Up navigator handler to ensure it returns to its previous screen if active. Otherwise account setting may not save to persistent database
  i.e. override methods onOptionsItemSelected() in OSGiActivity and OSGiPreferenceActivity
- Restructure whole source directory to support productFlavors build for playStore and F-Droid

=========================================================================
Version:        1.5.6 (1056)
Release Date:	10/16/2018
Author:         cmeng
- Implement Ping Interval auto-tune optimization to prevent mobile network closed by ISP on non-activity timer timeout
- Upgrade UCrop to v2.2.2 - to fix image file pick error
- Implement OnClickListener and OnLongClickListener in class to avoid OnClickListener become inactive whe resume

=========================================================================
Version:        1.5.5 (1055)
Release Date:	10/09/2018
Author:         cmeng
- Fix media call problem with no voice on receiving end - sender mic data lost
- Fix CallPeerMediaHandler#sendHolePunchPacket-sending the defined HOLE_PUNCH_PACKET causes problem in transmit mic data being muted
- Show permission request prompt if < 3 permissions are granted. Some android devices permanently deny all on first launch
- Need to take care voice files deletion when the VoiceMessage is yet to be converted to chatHistory fileRecord
- Avoid network re-connect during IBR Captcha dialog mode, Otherwise NetworkOnMainThreadException causing aTalk in deadlock
- Add proper handler for SecurityException when access to phone contact while permission is not granted
- Ensure proper display of phone book contacts information in contact list on search.
- Ensure the corresponding protocolProvider for the callee is used when making media call - AndroidCallUtil.showCallViaMenu()
- Use AudioTrack(AudioAttributes, android.media.AudioFormat, int,int,int)} in AudioTrackRender for android-L
- Change hashTable members and banList in ChatRoomJabberImpl to use ResourcePart as key - otherwise member kick has exception.
- Fix error in string names definition in string.xml file
- Audio device capabilities query is not supported on android - change jni opensles access to reflect actual status
- Fix NPE reported from field for aTalk v1.5.4
- Android NDK: android-15 is unsupported. Using minimum supported version android-16.

=========================================================================
Version:        1.5.4 (1054)
Release Date:	09/28/2018
Author:         cmeng
- Update call notification broadcast receiver to be compliant with android-O new implementation
- Add support to reflect the correct notification speaker phone state and enhance call state icon display
- Add call peer avatar to call notification
- Must use random number for notification ID, else the notification may not be cleared.
- Fix TimeUtils.toNtpTime computation error giving rise to incorrect RTT calculated values
- Call encryption and media encoding settings must be include in new or modified account for saving
- Telephony contact access needs CONTACT READ/WRITE access permissions. Alert user otherwise.
- Do not proceed with "Back-To-Call" from chat session if call has ended, otherwise UI stuck at call screen.
- Auto purge voice files along with the voice messages when deleted.
- Clean up errors in string translation for other languages
- Move to use AS 3.2.0 and buildtools 28.0.2

=========================================================================
Version:        1.5.3 (1053)
Release Date:	09/18/2018
Author:         cmeng
- Avoid delivered attachment gets reactivated when user reenter the chat session
- Ensure file transfer view refresh reflects the actual state on user scrolling
  i.e. Must update file transfer status on any user actions for proper view refresh on user scrolling
- Enhance UI for switching between media call and message chat in-progress simultaneously
- Fixed logcat -c not allow in android-N with missing atalk-current-logcat.txt

=========================================================================
Version:        1.5.2 (1052)
Release Date:	09/15/2018
Author:         cmeng
- Implement downloadable Stickers, Bitmoji and Emoji rich content sharing
- Implement auto accept received file transfer request with max file size option
- Add user support for multiple files selection for sending
- Fix file access problem on android-N and above (SecurityException)
- Revamp RealPathUtil and rename to FilePathHelper to get FilePath for Sticker and GBoard stream provider
- Revamp FileAccess and rename to FileBackend
- Consolidate all aTalk downloadable file to Download/aTalk
- Fix AudioBgService playback - must use uri in android-N and above
- Fix omemo messaging when server replies "item-not-found" on devicelist info request
- Fix getMimeType for properly return values
- Remove openFolder option button
- Update Jitsi sources to jitsi-smack-4.2 (dated 20180903)
- Add TranscriptionRequestExtension

=========================================================================
Version:        1.5.1 (1051)
Release Date:	09/01/2018
Author:         cmeng
- Fix image file transfer error when thumbnail preview is enabled - IQThumbnailRequest needs to use IqRequestHandler (smack v4.3.0)
- Implement check for muc participant jid as it may be null
- Port to use smack 4.4.0 for latest jingle update

=========================================================================
Version:        1.5.0 (1050)
Release Date:	08/29/2018
Author:         cmeng
- Add user option to remove manually approved certificates
- Fix Omemo locked up when no key found - SQliteOmemoStore#loadRawSession() must return null if no record found-for OmemoService to rebuild
- Fix coding error in CertificateServiceImpl#addCertificateToTrust()
- Ported to use smack libraries v4.3.0 and miniDNS v0.3.2
- Fix TLSA,  DNSSEC and DNSSEC & DANE signature verification error (DefaultIsdnTransformator & TLSA) - minidns-core.0.3.3-SNAPSHOT
- Port ScServiceDiscoveryManager to use smack 4.3.0
- Remove AndroidUsingExecLowPriority.java and fall back to use miniDns 0.3.2 AndroidUsingExec instead
- Disable omemo dialogs being cancelled when user clicks outside dialogs area or press back key
- Inject system error message when omemo session setup failed
- Delete all inactive devices with null Identity key when user select delete inactive identity - must monitor to ensure no problem

=========================================================================
Version:        1.4.7a (1046)
Release Date:	08/14/2018
Author:         cmeng
- Inject error chat message when there is a problem with a missing session record - no key found
- Add method to delete and cleanup inactive identities

=========================================================================
Version:        1.4.6 (1046)
Release Date:	08/14/2018
Author:         cmeng
- Fix ANR in account removal with all database handling in thread and a 3S timeout wait for network connection
- Fix IndexOutOfBoundsException and ConcurrentModificationException in MetaContactListAdapter#childContactsReordered - large number of contact update
- Return default user role as GUEST prior to user joining the chatRoom
- Block both doHandleOmemoPressed() and doHandleOtrPressed() access when user is not online
- Do not throw exception causing system crash when OTR authentication message is sent before user is online
- Add handle for invalid account in database
- Must setTrustCallback() after identity regeneration, else aTalk crash on null pointer
- Prompt user for re-login on authentication security failure if any
- Fix selected dnssecMode not properly saved if server override is not selected.

=========================================================================
Version:        1.4.5 (1045)
Release Date:	08/08/2018
Author:         cmeng
- Must initialize Notification channel as earlier as possible before any process using it
- Patch x264.so.147 to allow linking with versioned shared library in Android NDK
- Built ffmpeg-x264 using shared libraries - clean up directory
- clean up static_library_built build scripts

=========================================================================
Version:        1.4.4 (1044)
Release Date:	07/31/2018
Author:         cmeng
- Implement new android Notification Channels support
- Prevent user from cancel dialog accidentally while clicking outside the window region - setFinishOnTouchOutside(false)
- Full implementation for [Telephony | Disable media calls (Jingle)] option in Account Settings
- Display user warning alert when zero resource permission has been granted for aTalk operation
- Disable media services when android OS aborts ffmpeg lib loading (Text-Relocation-Enforced-for-API-level-23)
  see SettingActivity#disableMediaOptions()
- see (https://android.googlesource.com/platform/bionic/+/master/android-changes-for-ndk-developers.md#Text-Relocations-Enforced-for-API-level-23)
- Update Jitsi sources to jitsi-smack-4.2 (dated 20180720)
- Improve chatroom join captcha challenge and allow retry on entry error.

=========================================================================
Version:        1.4.3 (1043)
Release Date:	07/21/2018
Author:         cmeng
- Block domainJid from joining chatRoom as the entity does not support IM
- Implement exception handler for server that does not support chat room creation
- Implement handler for captcha challenge from server when joining chat room with captcha protection against SPAM
- Support retrieval of chat room info from server
- Implemented full support for various web links format in text view
- Fix MUCServiceImpl#createChatRoom() improper checking for domainJid
- Add captcha extension and captcha provider classes

=========================================================================
Version:        1.4.2 (1042)
Release Date:	07/11/2018
Author:         cmeng
- Enhance user presence status main UI to support per user presence indication and status changes
- Improve Join Chat Room menu UI and include associated server chatRooms for user selection
- Fix account password lost when account is being enabled while it was offline and disabled in previous app exit
- Fix empty contact List due to FrameworkImpl#getRegisteredServices() ArrayIndexOutOfBoundsException - Change to synchronous access
- Fix implementation error in ChatSessionManager#removeAllChatsForProvider() - Dispose only chatSession of the specified provider
- Set Ping Interval default to 240 seconds to avoid network TCP disconnection due to inactivity
- Cleanup Registration state, getRegistrationState() and fireRegistrationStateChanged correctly
- Default auto STUN/TURN discovery to false if server override option is selected - service domain is not reachable
- Create StatusListAdapter class based on ArrayAdapter
- Remove unused processStanza() and processJingleIQError methods in OperationSetBasicTelephonyJabberImpl
- Use OperationSetPersistentPresenceJabberImpl#presenceAvailable() method to process own presence status.
- Extend ice4j-2.0.0 to support android level below API-19
- Upgrade to use osgi-core: 7.0.0

=========================================================================
Version:        1.4.1 (1041)
Release Date:	06/25/2018
Author:         cmeng
- Improve account login handling when persistent password saving option is not enabled
- Fix inconsistency in STUN and JINGLE properties saving when modify or create new account
- Fix intermittent call failure when transport-info and session-accept are received at the same time; due to binding of
  mediaType to stream which is still being processed by transportManager.
- Use ice4j-2.0.0-20180523.200045-9; work only with AWS disabled, otherwise hang in AWS EC2 conn.getContent()
- Update all xmpp extension files and Cleanup protocol.jabber.impl classes files per jitsi-smack dated 20180616

=========================================================================
Version:        1.4.0 (1040)
Release Date:	06/16/2018
Author:         cmeng
- Implement Jabber VoIP-PBX gateway Telephony option in main menu, allowing PBX phone call via service gateway installed on server - experimented
- IBR registration server error - update default given value, and clear IBR flag on user cancel to avoid loop in IBR.
- Fix password persistent saving process problem not as per option selected by user
- Must do accountID.setPassword in LoginByPasswrodStrategy#UserCredentials when user sign in on initial launch. Otherwise user registration change will clear ENCRYPTED_PASSOWORD in DB.
- Add save password option on new account creation
- Fix "Additional STUN/TURN servers" and "Additional Jingle Nodes..." parameters improper saving to database due to AccountID#storeProperties incorrect merge.
- Show alert dialog to user to place phone in landscape orientation for video call when device camera cannot support landscape preview when phone in portrait mode.
- Show alert when user has denied aTalk of all permissions.
- Cleanup ProtocolProviderFactoryJabberimpl for installAccount() and modifyAccount() methods
- Confirm the presence subscription is resolved with the fix for VCardTempXUpdateProvider <presence/> with missing <photo/> element
- Remove layout-v14 provision for android API-14

=========================================================================
Version:        1.3.2 (1032)
Release Date:	06/06/2018
Author:         cmeng
- Add new UI languages support for Bahasa Indonesia, German and Russian
- Add user option to Send file thumbnail preview in Setting...
- Add option items for Audio and Video call in chat window menu
- Fix VCardTempXUpdateProvider to handle non-standard <presence/> stanza with missing <photo/> element
- Provide error alert feedback to user when failed to update vCard
- Add support to allow user to retrieve avatar from old jabber server with missing "to" attribute
- Block sending instant message and chatState (MetaChontactChatTransport) to service entity => system crash
- Filter selected service entity from joining conference to avoid system crash (ChatInviteDialog)
- Clean up all smack packet delay timing
- Execute OperationSetPersistentPresenceJabberImpl#firePresenceStatusChanged() in new thread to avoid loading on Smack
- Remove initRoster()#parentOperationSet.firePresenceStatusChanged(mRoster.getPresence(item.getJid())) in ServerStoredContactListJabberImpl to avoid duplicate <presence/> sending
- Use ParsingExceptionCallback to handle Un-parsable Stanza error return by Smack to avoid connection abort

=========================================================================
Version:        1.3.1 (1031)
Release Date:	05/30/2018
Author:         cmeng
- Add user option in Account Settings to support TLS Certificate / DNSSEC / DANE security mode
- Enhance support in overridden server address to allow either hostName or IP entry
- Fix ANR while exit from Account Settings when user account does not have vcard info stored on server
- Delay permission request on launch so it does not disrupt user login
- Improve 'Show Certificate' UI so 'Always trust this certificate' and the buttons are visible at all time
- Stop further permission prompt when user has fully decided on all permission grant status
- WaitForDisplay in CertificateServiceImpl before showing VerifyCertDialog to avoid obscured by other contactList
- Remove <domain-config> section from network_security_configuration.xml, otherwise CA certification authentication
  will be rejected by rootTrustManager as mConfig=(ApplicationConfig) mConfigSource.getPerDomainConfigs() is not null.
  public List<X509Certificate> checkServerTrusted(X509Certificate[] certs, String authType, String hostname) requires
  X509ExtendedTrustManager and not supported by android API < 24
- Remove main menu [Settings... | DNS] option

=========================================================================
Version:        1.3.0 (1030)
Release Date:	05/22/2018
Author:         cmeng
- Change login using smack connectUsingConfiguration->populateHostAddresses mechanism and enhance overall login performance
- Optimize initializeConnectAndLogin(SecurityAuthority authority, int reasonCode, String loginReason, Boolean isShowAlways)
- Optimize connectAndLogin(InetSocketAddress address, DomainBareJid serviceName, String userName, JabberLoginStrategy loginStrategy)
- Delete obsoleted connectUsingSRVRecords(String domain, DomainBareJid serviceName, boolean[] dnssecState, JabberLoginStrategy loginStrategy)
- Delete connectAndLogin(InetSocketAddress currentAddress, DomainBareJid serviceName, JabberLoginStrategy loginStrategy) - merged.
- Remove DNS ParallelResolver user option, replacing it with ResolverApi and ReliableDNSClient
- Port to use miniDNS, remove libraries: 'dnsjava:dnsjava:2.1.8' and 'org.jitsi:dnssecjava:1.1.3',
- Remove obsoleted classes: ConfigurableDnssecResolver, FailoverConnectionMonitor, ParallelResolverImpl, SecureMessage, SecureResolverMode
- Remove Interface: CustomResolver
- Remove Packet Logging option and strip off all supporting codes and classes to conserve android resource
- Remove 'com.google.guava:guava:23.6-android' used by packetLogging
- Fix PREF_KEY_AUTO_DISCOVER_STUN and PREF_KEY_AUTO_RELAY_DISCOVERY inconsistent settings handlering in preference
- Update Jibri source from jitsi-smack-4.2 (May, 2018)

=========================================================================
Version:        1.2.6 (1026)
Author:         cmeng
Release Date:	05/07/2018
- Implement isOmemoSupport check in new thread to avoid ANR black screen when open new chat session
- Purge user unused omemo devices now clean data on both the server and local database
- Prompt user action for android battery usage optimization on aTalk to avoid message lost during doze
- Implement addDnsServerLookupMechanism to fulfil requirements for android API-21 and higher (platform  privacy)
- Add android.permission.ACCESS_NETWORK_STATE for android 8 (Oreo)
- Add networkSecurityConf for atalk.org and atalk.sytes.net for domain CA trust
- Update UI language to user selected on exit from preference screen
- Upgrade to smack 4.2.4 official release
- Upgrade to dnsjava:2.1.8 library
- Upgrade and use org.jitsi:dnssecjava:1.1.3 from maven

=========================================================================
Version:        1.2.5 (1025)
Release Date:	05/01/2018
- Implement multi-language UI support
- Add Spanish (Español) language UI support
- Implementation for android N and above to take care FileUriExposed Exceptions, fix openFile, camera media attachments and send log etc
- Add RealPathUtil to take care for all android version realPath access
- ShowToast when selected file path cannot be found or open

=========================================================================
Version:        1.2.4 (1024)
Release Date:	04/29/2018
Author:         cmeng
- Use android resource tool getString() in place of getI18NString()
- clean up source and string.xml files
- Add user option to leave chatRoom in muc chat session menu
- Implement dialog error message when user failed to join or attempt to destroy chatRoom
- Implement toast message when user failed to send message

=========================================================================
Version:        1.2.3 (1023)
Release Date:	04/23/2018
Author:         cmeng
- Auto enable Omemo option on receive Omemo message while chat view is in focus
- Add StreetViews and Map option on main menu (without sending location message)
- Improve GPS Location UI and options handling
- Remove GPSTracker and GPSTrackingActivity class - not use
=========================================================================
Version:        1.2.2 (1022)
Release Date:	04/22/2018
Author:         cmeng
- AudiobBgService can only check for permissions, and not request permissions (removed)
- Hide audio sending option if permission.RECORD_AUDIO is not granted
- Change local message creation to include both encryption and mime types information
- Add encryption indication for incoming and outgoing messages
- Apply current selected encryption to location messages sending

=========================================================================
Version:        1.2.1 (1021)
Release Date:	04/15/2018
Author:         cmeng
- Use XMPP service name when creating the TLS socket
- Upgrade lib to smack-4.2.4-SNAPSHOTS
- JabberAccountID uses only BareJid
- Update libjitsi to revision c98f161 (04/13/2018)
- Fix error when checking for server system messages in CryptoFragment#setCurrentContact

=========================================================================
Version:        1.2.0 (1020)
Author:         cmeng
Release Date:	04/05/2018
- Redesign and optimize the "add contact" handlers and UI
- Add user option for presence subscription mode for auto accept-all or manual approval
- Roster.getInstanceFor() should only be carried out upon user authenticated
- Only tag <x xmlns='vcard-temp:x:update'> to presence stanza with type=available
- Optimize all asynStanzaListeners to listen in with more specific StanzaFilters
- Update OperationSetBasicInstantMessageJabberImpl to use IncomingChatMessageListener instead of local StanzaLitsener
- Fixed NPE at CryptoFragment#setCurrentChatSession when contact is null while accepting muc invitation
- Include special handler when add contact to RootGroup with nogroup selected
- Avoid ConcurrentModificationException in smack-omemo OmemoService#removeStaleDevicesFromDeviceList
- Disable IgnoreStaleDevices option, otherwise devices can get lockout in this state if no omemo messaging for 7 days
- Remove incomplete XEP support sources: jirecon, geolocation, mailnotification, notification, userSearch, whiteboard
- Remove Opset: DesktopSharing, GenericNotification, Geolocation, Whiteboarding
- Migrate more classes to use smack Jid instead of string for user identifications
- Remove all dirty code which were added in earlier omemo implementation

=========================================================================
Version:        1.1.4 (1014)
Release Date:	03/23/2018
Author:         cmeng
- Fix InfoRetriever uncaughtException and slow server response timeout with 10s elapsed time
- Provide proper handler for start of IBR registration failure on server
- Update to use smack 4.2.3 release

=========================================================================
Version:        1.1.3 (1013)
Release Date:	03/13/2018
Author:         cmeng
- Update libjitsi to add openh264 support in neomedia and setEncodingPreference to H264
- Fixes send-side bandwidth estimations and enables log mining
- Cleanup jni directory and update ffmpeg-x264 wrapper and build scripts
- Fixed system crash when accessing Messaging Security settings while user is not registered on network

=========================================================================
Version:        1.1.2 (1012)
Release Date:	02/12/2018
Author:         cmeng
- Fix black screen display when opening welcome message after IBR registration
- Revert to user login screen when server throws user already exists exception while doing IBR registration

=========================================================================
Version:        1.1.1 (1011)
Release Date:	02/10/2018
Author:         cmeng
- Enhance IBR UI and improve registration process handling for all events return by server

=========================================================================
Version:        1.1.0 (1010)
Release Date:	02/04/2018
Author:         cmeng
- Port to use latest smack omemo library now supports message carbons and offline omemo messages
- Port to use smack CarbonExtension and remove old CarbonPacketExtension
- Implement last message correction for omemo messaging
- Enhance crypto device fingerPrints menu to include fingerprints states (own and active) and for siblings etc
- Fixed system abort in crypto device fingerprints: need to handle identity entry with null trust state and fingerPrint
- Add user alert dialog on corrupted or missing OmemoKeyPairs and prompt for action
- Fixed first missing message for invited participant joining the omemo conference when the identities is only partially filled
- Display toast messages when omemo initialization failed, also to provide update on omemo activities status
- SQLiteOmemoStore#storeCachedDeviceList must create a new table entry, partially filled with OmemoDevice and active state if the identity does not exist
- Remove AndroidOmemoService#buddyDeviceListUpdateListener - no more required after the new SQLiteOmemoStore#storeCachedDeviceLis implementation
- Do no use AssertionError() during SQL database read/write as this will crash system, just diplay warning
- Clean up database associated omemo table entries when an user account is removed
- Upgrade database to version 3 - update Omemo identities table to add two new fields last_deviceid_publish and last_message_received
- last_deviceid_publish helps to resolved endless loop in publication when two devices of same contact joing the conference
- Fixed getLastMessageReceiveDate to return null if date not set
- Purge all obsoleted history files, database and entries in new database (defer to later release)

Note:
Previously when the user IdentityKeyPair is corrupted or missing. any omemo manager send from user will appear ok in chat window.
However the received omemo message cannot be decrypted and only a debug message is display i.e.
Could not decrypt incoming message: CryptoFailedException: Transported key could not be decrypted, since no suitable message key was provided. Provides keys:

### TODO:
org.jitsi E/libOpenSLES: class Engine interface 0 required but unavailable MPH=9

=========================================================================
Version:        1.0.3 (1003)
Release Date:	01/15/2018
Author:         cmeng
- update to use smack 4.2.3-SNAPSHOTS
- consolidate all info for about dialog into About.java class
- Add atalk site/help link in About dialog box

-------------------------
Release Date:	1/14/2018
- remove unused libraries jar and JNI targets and .so
- add guava-15.0.jar - use by PacketLoggingServiceImpl.java
- update libjitsi to v1031 (12/03/2018)

- bump failed to use ice4j-2.0.0-20170720.150550-1.jar - cannot find candidate and call cannot connect. So abort

=========================================================================
Version:        1.0.2 (1002)
Release Date:	01/12/2018
Author:         cmeng
- Compile aTalk for android 8.0(Oreo) compatibility
- In getCachedRecentMessages()->convertHistoryRecordToMessageEvent for chatRoom, ChatRoom#getUserRole() must not have null ResourcePart
- Do not attempt to retrieve contact or chatRoom for virtual server in getContactOrRoomByID()
- remove protcol-sip library and sip support - not use and android-source is too old
- Remove non-existence textViewVersion.setVisibility in splash screen

- Samsung SII slow device causes exception at on first apk installation and run: (little can be done)
util.AvatarCacheUtils.cacheAvatar().340 Failed to store avatar. java.io.IOException: Failed to create file
/data/data/org.atalk.android/files/avatarcache/Jabber&_coxyz123@atalk.org/hawk@atalk.org
at net.java.sip.communicator.util.AvatarCacheUtils.cacheAvatar(AvatarCacheUtils.java:319)

Actually cacheAvatar() is not necessary as it is already handled and stored by AvatarManager
Implemented 2020031: Removed AvatarCacheUtils and fall back to use AvatarManager

=========================================================================
Version:        1.0.1 (1001)
Release Date:	01/06/2018
Author:         cmeng
- Update apk manifest file to include implicit hardware requirements and set the required state to false for device compatibility

=========================================================================
Version:        1.0.0 (1000)
Release Date:	01/03/2018
Author:         cmeng
- Enhance application ui theme and harmonize button layout for better user experience
- Add support for user runtime resource access permissions request on android-M and later
- Add About menu provides access to application information on history log, compliance XMPP standards and third parties libraries used etc
- Display peer avatar during making call and receiving call for ease of identification
- Ensure chat window background colors and crypto icons are in sync with the actual user selected chat mode during pager sliding
- Change OTR status message after user has authenticated the buddy on prompt
- Ensure no access to omemo when user is not registered or authenticated, otherwise system crash
- Add action button in Regenerate OMEMO identities and Purge unused identities settings so it returns correctly to main setting menu
- Add popup message when omemo prekey is empty or corrupted to alert user for action - identities regeneration
- Fix system crash when access menu options to erase chatRoom or contact(s) chat history
- Auto-join chatroom when aTalk is minimized since user accept pop-up window is not permitted in this case
- Clean up all the layout xml files and harmonize button layout in all menu
- Check valid filePath when seding/opening files - Note 8 allow user to select recent link not accessible to user
- Remove auto software update option in main menu for google playstore publish
- Do not throw RuntimeException()in waitForObjectRelease() on timeout, otherwise cannot exit video call
- Limit number of log messages display when RTPConnectorOutputStream#send() failed to send a packet to target
- Remove Purge SQL database option in ServerPersistentStoresRefreshDialog()
- update to use libjitsi-1030 dated 2017/12/15

=========================================================================
Version:        0.9.1 (910)
Release Date:	12/19/2017
Author:         cmeng
- Ensure account password is updated in credential when user changes in Account Settings... or re-login prompt
- Fix stream video distortion at receiving end during conference when phone/camera is rotated to angles other than 0 degree
- Enhance video resolution support: 320x240, 640x480, 720x480, 960x720 and 1280x720; auto optimise to ensure it is within device capability during call
- Use 1:1 (736x736) resolution for Samsung Note-8 when phone is in portrait orientation as it cannot handle landscape preview video format
- Fix system crash when phone orientation is changed during video call
- Apply patch to ignore OmemoService prekey publish response timeout (~90s) to support slow device, prekey will complete publish in background.
- Fix system crash when starting chat prior to user log in due to isOmemoSupport access - (mConnection == null) in isOmemoSupport()
- Improve GPS tracking reliability using FusedLocationProviderClient replacing deprecated FusedLocationProviderApi
- Remove option for Connect at Startup in Account Settings... and add optio to save password - internally actual used as store password
- Remove native libraries support for deprecated armeabi target architecture

- update library jxmp-jid to 0.6.0 (0.5.0)
- update library gmsPlayServicesVersion to 11.6.2 (11.0.4)
- update libjitsi Tag-1030 (12/18/2017)
- Port to use smack-4.2.2 library releases - smack omemo and signal are now decoupled from smack library
- Fix unable to resolve static method: java/util/Objects.hash (Use APILib for API < 19)
- Remove LegalInfoActivity display for googelPlay - not required. This license information is displayed in Settings > Google > Open Source
- Remove ICE option - Use Jitsi STURN Server (fallback) but keep source default to true and active

=========================================================================
Version:        0.9.0 (900)
Release Date:	11/11/2017
Author:         cmeng
- Add native libraries support with armeabi, armeabi-v7a and x86 architecture platforms for min android API-15
- Implement OpenSSL (version 1.0.2l) native library to improve zrtp encryption speed
- Implement ffmpeg-x264 shared library built from source (ffmpeg v1.0.10 and latest x264: git clone http://git.videolan.org/git/x264.git)
  https://yesimroy.gitbooks.io/android-note/content/ffmpeg_build_process.html
- Replace old jitsi ffmpeg.so with the source compiled shared library ffmpeg.so and change ffmpeg.java API
- Use NDK_TOOLCHAIN_VERSION:=clang for all native libraries built for more optimized code generation
- Port/develop shell scripts to allow building of static libraries from source on Ubuntu i.e. ffmpeg-x264, libvpx and openssl
- Upgrade com.android.support:multidex to v1.0.2 (v1.0.1)

- Migrate complete android studio development environment to run in Ubuntu 16.04 for speed and ease of static libraries built
- Upgrade build environment: android studio 3.0 (2.3), build:gradle 3.0.0 (2.3.3), gradle-wrapper 4.1 (3.3) and buildToolsVersion 26.0.2 (25.0.3)
- Update build.gradle files to confirm to gradle 4.1 and cleanup NDK mk build scripts for all native libraries

=========================================================================
Version:        0.8.8 (880)
Release Date:	10/16/2017
Author:         cmeng
- Avoid multiple invitationListeners registration with MultiUserChatManager
- Ignore further invitation if already joined the chatRoom
- Add user menu option to show chat room occupants
- Act and reflect actual system status when user changes presence status in Account Settings menu
- Ensure the JidToAvatarHashIndex is properly updated with the correct user-hash pair
- Android 7 needs to have READ_EXTERNAL_STORAGE permission specified
- Popup alert message when media device or codec configuration is not properly setup to make or receive call

- Port to use smack-4.2.2-SNAPSHOT library build from source (10/14/2017)
- Update local libraries for commons-lang3:3.6, sdes4j-1.1.3 and zrtp4j-light-4.1.0.jar
- Remove local lib commons-lang3:3.4.jar and use maven 'org.apache.commons:commons-lang3:3.6' instead
- Remove local lib jmdns-3.4.1.jar and use maven 'org.jmdns:jmdns:3.5.3' instead
- Remove local lib sdes4j-1.1.3.jar and use maven 'ch.imvs:sdes4j:1.1.4' instead
- (except ice4j-2.0.jar - has problem)

- Update extensions colibri, jibri, jingle, jitsimeet etc sources from jitsi tag version 5594
* Saves the avatar-url as a ChatRoomMemberJabberImpl field
* Adds xmpp extension email
* Add 'recording_mode' attribute to JibriIQ
* (colibri): Adds the RTP headers in the RTP description
* Remove adaptiveLastN and adaptiveSimulcast support
* Parses the GID attribute
* fix incorrect SourcePacketExtension parse
* Adds a display name to ChatRoomMember
* Handles source-add and source-remove for audio
* Add support for rid-based sources and source groups
* Adds ColibriBuilder#addAllocateOctoChannelsReq
* Adds an "octo" channel to ColibriConferenceIQ
* Allow setting the direction of channels
* Can disable hole punching per CallPeerMediaHandler
* Adds a property to disable video telephony
* Adds correctly parsing bundle group
* Close audioRTPTranslator when there are no more calls left
* Improved IPv6 handling
* Fix treating a new ZRTP ID as a mismatch
* Removed support
  Yahoo!, the network doesn't exist anymore
  Facebook, doesn't allow XMPP connections anymore
  MSN, the network doesn't exist anymore
* Querying of Google Contacts with OAuth2

- Method Objects.requireNonNull only available in API-19. Re-implement in ApiLib for basic operations

# All JNI native library built must use APP_PLATFORM=android-15 for aTalk minimum support SDK platform i.e. 15
- Update neomedia and JNI sources from libjitsi tag version 1019 (need further update for android)

- Add support for video codec VPX (VP8 and VP9) with JNI built from source v1.6.1+ (master 10/12/2017)
  VP9 not working yet

- Upgrade Opus jni source to latest 1.2.1 release (https://www.opus-codec.org/downloads/)

- Temporary disable OpenSSL support with v1.0.2k pre-built libraries as it needs api-21:
  # (https://github.com/ahnan4arch/OpenSSL-for-Android-Prebuilt-1)
  # Built OK for static libraries with version 1.0.2l https://github.com/leenjewel/openssl_for_ios_and_android
  # on ubuntu with API-23; but cannot locate symbol "stdin" referenced by "libjnopenssl.so in application execution

- Upgrade speedx to version 1.2rc1 with jni source compiled (for android audio resample rate conversion)
  http://developer.samsung.com/galaxy/others/porting-speex-library-in-android-with-jni
  speex is needed for 'neomedia.codec.audio.speex.SpeexResampler' e.g. android 44.1K to Opus 48.0K
  Fixed libjnspeex.so has text relocation. This is wasting memory and prevents security hardening.

- Check in jni sources for ffmpeg, jawtrenderer, speex, vpx etc

=========================================================================
Version:        0.8.7.c (873)
Release Date:	08/27/2017
Author:         cmeng
- Reinstate FragmentPageAdapter and ChatRoom list on main UI
  sony Tablet S 4.0.3(release5a) API15 work but not Samsung SII
- Do not add to groups that are having zero child - fixed metaContactList IndexOutOfBound Exception
- Fixed system crashes when receive invitation to join chatRoom
  InvitationReceivedDialog must pass in activity and not context - otherwise system crashes

=========================================================================
Version:        0.8.7.b (872)
Release Date:	08/24/2017
Author:         cmeng
- Avoid system crashes when ContactList access has IndexOutOfBound Exception

=========================================================================
Version:        0.8.7.a (871)
Release Date:	08/24/2017
Author:         cmeng
- Remove FragmentPageAdapter and ChatRoom list on main UI - not stable

=========================================================================
Version:        0.8.7 (870)
Release Date:	08/23/2017
Author:         cmeng
- Support avatar photo edit functions with gesture capability: region select, zoom, rotate and crop
- Ensure avatar attached to outgoing messages in chat window display is correct for the current sender
- Revert to full implementation for XEP-0153 VCardAvatar to properly support old xmpp client
- Add view pager slider to give user access to chatRoom list and contacts list fragments
- Ensure contactList fragment group is in expanded view on first application launch
- Optimize chatRoom joining process to correctly setup multi-user chat
- ChatRoomListImpl#findChatRoomWrapperFromChatRoomID(chatRoomID, pps) must search all crpWrapper if pps is null
- Enhance systray notification handlers for incoming muc chat message events
- Change cryptoFragment listener to map array to proper handling chatFragment background color
- Revert getDrawable(int id, Theme) to getDrawable(int) as it crashes device with AP 15
- Port to use bouncycastle replacing obsoleted spongycastle libraries
- BoB and BoBProvider classes and Java filename must be the same.
- Remove set/getGlobalDisplayAvatar() and set/getGlobalDisplayName in GlobalDisplayDetailsService

=========================================================================
Version:        0.8.6
Release Date:	08/05/2017
Author:         cmeng
- Fix implementation error in denying OTR session setup request from buddy while OMEMO session is in progress
- Implement XEP-0084 User Avatar publishing with reflection patch for Smack PepManager.publish to support old server
- Harmonize operations between XEP-0084 User Avatar and XEP-0153 VCardAvatar for co-existence
- When XEP-0084 is enabled, omit avatar hash in presence stanza VCardTempXUpdate x-extension
- Sync main menu avatar display with user selected picture
- Delay the auto software update version check on application start up
- Remove all unused smiley java files from built
- Remove large screen landscape contactList and chatFragment side-by-side support

=========================================================================
Version:        0.8.5
Release Date:	07/25/2017
Author:         cmeng
- Change omemo buddy authentication dialog to support multiple undecided fingerprints verification
- ReSync chatFragment crypto status icon and background color based on user action in authentication dialog
- Synchronise the cryptoChoice selected button with the chatType changes from events
- Fix buddy incoming otr session status and background unhandled change events
- Deny OTR session setup request from buddy while OMEMO session is in progress. User may manually start OTR to proceed
- Fix conference invitation received dialog exception due to null chatRoom attributes
- Update smack library to 4.2.1-beta2-SNAPSHOT (July 2017)
- Use reflection access to OmemoService private methods subscribeToDeviceLists() and registerOmemoMessageStanzaListeners() to resolve
 PEPEvent DeviceListListener and offline olmMessages problems
- Revert to use omemo onOmemoMucMessageReceived to avoid DuplicateMessageException thrown by smack
- Check for contact omemo capable using contactSupportsOmemo(), replacing the deleted resourceSupportsOmemo() method

=========================================================================
Version:        0.8.4
Release Date:	07/18/2017
Author:         cmeng
- Implement XEP-0084: User Avatar
- Fix crypto privateKey menu access exception on null fingerprint object.
- Omemo client advertised entityCapabilities need to include PEP_NODE_DEVICE_LIST_NOTIFY
- Blind Trust before verification needs to include condition check for any existing trusted devices
- Stop processing muc omemo encrypted messages by SmackMessageListener to avoid displaying both the omemoHint text and
- Add vertical scroll view to "Refresh Persistent Stores..." menu (activity - alert_dialog)
for omemoManager.resourceSupportsOmemo(contactsResourceJid) to work
omemoDecrypted text in the chat window.
- Set smack DefaultReplyTimeout to 10 seconds to take care slow devices and heavily loaded xmpp server
- Add PEPListener to fetch new buddy omemoDevice and save it to omemo identities table

=========================================================================
Version:        0.8.3
Release Date:	07/12/2017
Author:         cmeng
- Add option for OMEMO private key regeneration
- Add option to allow changing trust state for Omemo device fingerprints - stop untrusted buddies from receiving OMEMO messages
- Add option to copy crypto privateKeys or fingerprints to clipboard to assist remote verification
- Consolidate all crypto keys and fingerprints for OTR and OMEMO for better UI access
- Display system message whenOMEMO chatSession is setup with unverified or untrusted buddies
- fix implementation errors for trustOmemoIdentity and distrustOmemoIdentity method - trust state unchanged
- fix no activities error due to classes relocation for OtrFingerPrints and OtrPrivateKeys (class later removed)

=========================================================================
Version:        0.8.2
Release Date:	07/09/2017
Author:         cmeng
- Implement OMEMO chat support using SQLite database for backend persistent storage
- Add user option to blind trust contact omemo key before verification on first use
- Add user option to regenerate omemo devices
- Add user option to purge unused omemo devices
- Add user option for XEP-0384 OMEMO database clean up (use with care)
- Add new background colour for OMEMO mode
- Optimise background colour changes handler and consolidate in cryptoFragment
- Enable all listeners for chatFragment only if it is primarySelected
- Update omemo database structure i.e.
  * Add omemo_devices table
  * Remove accountUuid column in all omemo table - not optimize to support multiple accounts
- Move setupOmemoConfigStore() to CryptoActivator class, needs init once only per device
- Remove OmemoManager.addOmemoMucMessageListener(this) in ChatRoomJabberImpl as OMEMO message is being handled in SmackMessageListener#processMessage

=========================================================================
Version:        0.8.1
Release Date:	07/01/2017
Author:         cmeng
- Implement OMEMO chat support using file-based persistent storage
- Fix corrected message received handler for proper edited message display

=========================================================================
Version:        0.8.0
Release Date:	06/12/2017
Author:         cmeng
- Remove lib org.whispersystems:axolotl-android:1.4.3
- Remove crypto/axolotl sources
- Remove all SQLiteAxolotlStore table in backend database
- Remove all SQLiteAxolotlStore table in backend databasecg
- bound 0794 to version 0.8.0 as official release

version code 0794 check in on 2017/06/12
=========================================================================
Version:        0.7.9
Release Date:	06/12/2017
Author:         cmeng
- Fixed Authorization Request prompt to show correct requester ID.
  Use contact.getAddress() for Authorization Request Dialog prompt - getDisplayName is null
- Use Smack 4.2.1-SNAPSHOT library for OMEMO support (June 2017)
- Use gmsPlayServicesVersion 11.0.0
- Need to pass db to initMCLDataBase on newly installed apk
- Block mcGroup and metaContact creation for non-persistent entity in MCIStorageManager. Non-persistent
  entity creation request when unsolicited announcement etc messages received from server e.g. atalk.org
- Need to generate non-persistent entity sessionUuid for proper message retrieve
- Change childContacts details implementation to JSONObject
- Add user option to support change contact displayName in contactList fragment (RFC 6121)
- Implement protoContactRenamed method in MCIStorageManager.class
- MessageSourceService#handleProviderAdded must have both pps registered and connected prior to calling
  Block premature called from MessageHistoryServiceImpl#handleProviderAdded
- Removal contact (waiting for approval) error - Smack 4.2.0 sends 'ask' attribute in Roster.removeEntry not allowed by RFC6121;
  fixed by Smack 4.2.1-SNAPSHOT (June 5, 2017)
- Cleanup and change OperationSetBasicInstantMessagingJabberImpl#enableDisableCarbon() to use CarbonManager.setCarbonsEnabled()
- Execute ProtocolProviderServiceJabberImpl#initRosterStore only after account has been authenticated
- Fix VCardAvatarManager#downloadVCard(BareJid userId) uncaught exception when mAccount == null. Causing avatar loading failed.

version code 0793 check in on 2017/05/18
=========================================================================
Version:        0.7.9
Release Date:	05/18/2017
Author:         cmeng
- Fixed ServerStoredContactListJabberImpl - must not remove the root group in metaContactGroup
- Fixed timeStamp etc errors for muc history messages received from server
  * ChatRoomJabberImpl DelayInformation extraction error
  * Check received history message using nick and jabberID (in case contact joined with different nick)
- Add XEP-0033: Extended Stanza Addressing support to ChatRoomJabberImpl
- Fixed conference history message retrieve error - change getHistory to be based on session descriptor i.e. metaContact or ChatRoom
- Add Chat Room Dialog - Update available chatRooms when a new account is being selected.
- Fix synchronization problem between chatFragment messages and chatController text entry panel.
- Support multiple selection on chat messages in chatFragment for deletion
- Increase login timeout period to 50 Sec to support slow device e.g. Samsung S3
- Minimum Api level support is 16 to support AndroidCodec
- Update to use Smack version 4.2.0 (Mar 2017)

version code 0792 check in on 2017/04/15
=========================================================================
Version:        0.7.9
Release Date:	03/21/2017
Author:         cmeng
- Remove unused files and clean up old soundRecording Activity
- initial database creation and migration (major)
 * 1. Properties to accountID and accountProperties and Properties tables (+OTR keys); Remove obsoleted and ghost accounts properties.
 * 2. MetaContact List group, childContacts and contacts tables (+OTR keys)
 * 3. messages (chat & muc) and file history xml records
 * 4. call history xml records
 * 5. Recent messages xml records

- Add support for multiple update links to fetch firmware update
- Fix error in updating persistentData storage for metaContact displayName
- Add CommandLine option "NDK_TOOLCHAIN_VERSION=4.9" to resolved later NDK build i32 error
- Upgrade Opus jni source to latest 1.1.4 release (https://www.opus-codec.org/downloads/)

=========================================================================
Version:        0.7.8
Release Date:	02/22/2017
Author:         cmeng
- Add support for multiLine chat messages sending and display
- Add support for emojis sending and display (use device emojis resources)
- Implement audio record and playback as background service
- Implement Long click to send audio message using background service
- Implement audio recording permission request for android 6.0 requirements
- Improve message chat UI to allow for multiple messages selection etc
- Filter and show only relevant contactList contextMenu options
- Fix 'Erase this contact history' in contactList contextMenu
- Remove 'Erase all contacts chat history' option in contextMenu
- Default to use SMACK_PACKET_REPLY_TIMEOUT (30S) if VCARD_REPLY_TIMEOUT_PROPERTY is not specified. Need this for slow device
- Remove imeOptions="actionSend|flagNoExtractUi" and ChatController#OnEditorAction to show keyboard Enter button for multiline text entry

=========================================================================
Version:        0.7.7
Release Date:	02/06/2017
Author:         cmeng
- Add device rotation tracking to both the Street Panorama and Map View in chat for 'Single Location fix'
- Add location and rotation tracking to both the Street Panorama and Map View in chat for 'Continuous Location updates'
- Long press 'Continuous Location updates' button for location demo
- Add user option to set minimum distance traveled to send 'Continuous Location updates'
- Add 'StreetView and Map' Button in outgoing message to allow review of the previously sent Location updates
- Long press 'StreetView and Map' Button on incoming or outgoing chat message path starts retrace locations animation
- Add support for real-time tracking on incoming location messages when street and Map view is active
- Add support for 'PTT' for voice sending during chat
- Show error when user attempt to send outgoing message while offline
- Remove check based on obsoleted XEP-0022: Message Events, use isOnline() instead i.e. offline message support
- Fixed system crash when edit account preferences on Audio/Video encoding

=========================================================================
Version:        0.7.6
Release Date:	01/24/2017
Author:         cmeng
- Add support to show Street Panorama and Map view in chat window when Send Single Location fix
- Add user selectable button to display Street Panorama and Map view in chat window upon received a location fix
- Fix Send Cont. Location updates early termination on screen rotation
- Ensure all new messages sent or received are being updated in chat window when it is again in focus
- Port SmackInvitationListener#InvitationListener to conform to Smack v4.2.0-rc3

=========================================================================
Version:        0.7.5
Release Date:	01/20/2017
Author:         cmeng
- Fix file sending UI problem - chat window must get refreshed after returning from file pick operation
- Add option to Send Present Geo-Location to recipient during chat session for direction guide
- Latest version check uses versionCode only and will not failed if versionName has alphabet exception
- Port and replace jitsi GeoLocationExtension & Provider with Smack GeoLocation & Provider
- Clean up and purge all the old log files after each Send Log operation
- Add Plugin EasyLocation source to support Geo Location

=========================================================================
Version:        0.7.4
Release Date:	01/16/2017
Author:         cmeng
- Add option to purge Debug Log File in Refresh persistent stores in case it gets too large to handle
- Enable Send logs option in main menu for user selection
- Support account reconnection-resume when device recovers from network disconnection on error
- Fix no presence available stanza being sent after logout and successful login - online indicator remains grey.
- Port to use Smack Library version 4.2.0-rc3 (SNAPSHOT)
- Must use thread to perform any account unRegistration - GlobalStatusServiceImpl#publishStatus(). Otherwise android strictMode exception.
- Remove ant and UML directories and files
- Fixed cannot have version containing alphabet otherwise unable to update. Need to manual download and install

=========================================================================
Version:        0.7.3
Release Date:	01/14/2017
Author:         cmeng
- Change ProtocolProviderServiceJabberImpl#getSSLSocket to use reflection to get SSLSocket in XMPPTCPConnection
- Remove unused ProtocolProviderServiceJabberImpl#showErrorMessage method
- Skip ProtocolProviderServiceJabberImpl#getJitsiVideobridge() if last check returns with NoResponseException.
  Otherwise wait SMACK_PACKET_REPLY_TIMEOUT - to take for servers non-compliant to XEP-0030: Service Discovery e.g (jabbim.cz)
- Remove VideoCallActivity#getVideoFragment() and made it a local variable during onCreate. Dynamic getVideoFragment() can sometimes return null;
- Fix display sometimes locked in black screen while in voice / video call. Revamp ProximitySensorFragment design
  * Synchronized ProximitySensorFragment#onSensorChanged(SensorEvent event)
  * Set screenOffDialog as local private variable; gets init during screenOff()
  * Make fm as private variable onResume(). Dynamic retrieval can sometimes return null
- Accounts gone offline due to network lost are automatically reconnected when network recovered

=========================================================================
Version:        0.7.2
Release Date:	01/11/2017
Author:         cmeng
- Implement XEP-0077:In-Band Registration and XEP-0158:CAPTCHA Forms to handle captcha protection registration
- Add custom smack iregisterx library classes to support login via fields or DataForm
- Implement BoB extension and provider to support embedded BoB in iqRegister information
- Major cleanup and enhancements on User login UI
- Implement reason field to display info/error messages during User Login Credentials menu prompt
- Cleanup LoginManager#registrationStateChanged() & #handleOperationFailedException()
  * Remove showAlertDialog for login error messages as they are now display in User Login Credentials reason field.
- Reclassified and fine tune all login failure modes for better error handling
- Fixed duplication login for same account on apps launch via: LoginManager#runLogin() and LoginManager#handleAccountManagerEvent()
  Removed LoginManager#handleAccountManagerEvent() & AccountManagerListener implementation from AccountManager.
  Calling from AndroidGUIActivator#start(BundleContext bundleContext) to LoginManager#runLogin() is on first application launch
  Later login is via LoginManager#serviceChanged(ServiceEvent event) during application running.
- Remove support for BareJid login when login failed with user localPart in PPS connectAndLogin(). Handle only special case for "Google Talk"
- ReOrder so that aTalkApp.waitForDisplay() is before aTalkApp.getCurrentActivity() and getCaptcha() - otherwise Exceptions and windows leaked
- Implemented LoginSynchronizationPoint class to better handle foreground and background error passing
- To take care vCardAvatarManager can be null for an unRegistered account for (evt.getNewState() == RegistrationState.UNREGISTERED ..)
  in OperationSetPersistentPresenceJabberImpl#RegistrationStateListener#registrationStateChanged
- Fixed AccountPreferenceFragment#getActivity() dynamic getActivity for parent activity can sometimes returns null
  * create private mActivity and init onCreate.
- Add LoginSynchronizationPoint to better handle synchronization between foreground sequential tasks and async events.
- Use reflection to access private variable XMPPTCPConnection#socket and remove the local XMPPTCPConnection source.
- Port to use Smack Library version 4.2.0-rc2 (SNAPSHOT)
- Fixed Policy-Violation exception in Smart Library v4.2.0-rc2 via Smart Development Team.
- Fixed AccountManager.isSupported() in Smart Library v4.2.0-rc2 via Smart Development Team.
- Remove jitsi reconnectPlugin class, use Smack ReconnectionManager instead.
- Move to use gradle version 3.3 from previous version 3.1

=========================================================================
Version:        0.7.1.a
Release Date:	01/03/2017
Author:         cmeng
- Remove unnecessary SmackConfiguration.addSaslMech(SASLMechanism.PLAIN) initialization in LoginByPasswordStrategy#Login
- Remove unused custom SASL-MD5 class SASLDigestMD5Mechanism
- Major Cleanup for ProtocolProviderServiceJabberImpl login and associate classes
- UserCredentials.java - add loginReason and userCancel parameters
- Add reason field to display login messages in Login User Credentials prompt
- User password will not be cleared when login failed for whatever exceptions/reasons.
- Reclassify and finer for login failure modes for better error handling
- Login error message show correct serverAddress instead of user serviceName
- Disable jitsi reconnectPlugin (source kept until next checkin), use Smack instead.
- Update to org.jxmpp:jxmpp-jid:0.5.0
- Partially implemented captcha interface

=========================================================================
Version:        0.7.1
Release Date:	12/25/2016
Author:         cmeng
- Fix connectUsingSRVRecords - require to strip off the end dot in hostName returns by SRVRecord#getTarget()
before use in config.setHost(hostName)
- Update plugins.dnsjava source files

=========================================================================
Version:        0.7.0
Release Date:	12/18/2016
Author:         cmeng
- Official release for version 0.7.0 to include 0.6.0.a and 0.6.0.b

=========================================================================
Version:        0.6.0.b
Release Date:	12/18/2016
Author:         cmeng
- Update and sent EntityCaps node#version when ChatState Notifications is enabled or disabled
- Support for EntityCaps update sending (Gajim is able to response to changes and change ChatStat according)
- Add SupportedFeatures just prior to registerServiceDiscoveryManager. Otherwise found race condition with some optional features not added
- Cleanup addSupportFeatures to avoid race condition and lost optional features
- Improve ChatState Notifications implementation so user selectable Send Notifications is properly handled
- Cleanup ChatStateNotificationHandler.java to remove async tasks
- Cleanup XEP-0084 UserAvatar classes - not know server for testing.
- Update ChatStateNotificationEvent to include message element
- Remove unused MessageEvent class

TODO accountManager always null ???
net\java\sip\communicator\impl\muc\ChatRoomListImpl.java
// if provider is just disabled don't remove its stored rooms
AccountManager accountManager = MUCActivator.getAccountManager();

=========================================================================
Version:        0.6.0.a
Release Date:	12/15/2016
Author:         cmeng
- aTalk ported to use Smack v4.2.0
- Remove custom socks.Socks5BytestreamRequest.java as fixes implemented Smack v4.2.0
- Remove all Smack 4.1.8 library jars
- Fixed account persistent storage removal (pps==null): AccountListActivity.removeAccountPersistentStore(Account)
 must happen before RemoveAccountDialog.removeAccount(Account).
- Do not perform refreshRosterStore#Roster.getInstanceFor(xmppConnection).setRosterStore(null) as this will cause roster to start reload
- Replace MessageCorrectionExtension/Provider code with the one from smack library.
- Cleanup XEP-0085: Chat State Notifications implementation and remove any stray from XEP-0022 old implementation
- Remove YahooConstant support
- Some userAvatar class with error are left untouched for further modifications.

=========================================================================
Version:        0.6.0
Release Date:	11/30/2016
Author:         cmeng
- Full implementation for XEP-0092: Software Version using Smack.VersionManager in place of jitsi#VersionManager
  adding iq:version support for aTalk <iq><query xmlns='jabber:iq:version'>
  <name>aTalk (Smack 4.1.8 (4.1.7-7-ga87007f 2016-07-30))</name>
  <version>0.5.8</version><os>android</os></query></iq>
- Remove application version information in CapsExtensionStanza.identity during disc#info sending. Use iq:version instead
- Add KeepAlive XEP-0199: XMPP Ping option to Account setting, and allow setting of ping interval per account
- Fix PingManager implementation - can only be setup during account registration stage in ProtocolProviderServiceJabberImpl
- Revamp old XEP-0153 implementation to fully compliant with the protocol requirements.
  Use own implementation and remove VCardTempXUpdatePresenceExtension (hash comparison error using "==")
- Add persistent cache support for XEP-0153: vCard-Based Avatars for performance and reduce bandwidth requirement
- Synchronized InfoRetriever#retrieveDetails(String contactAddress) method access to prevent Account result being overwritten by access from Contacts
- Add option in Account Setting... to clean XEP-0153: vCard-Based Avatars persistent store when necessary.
- Implement XEP-0172: User Nickname - protocol for communicating user nicknames in XMPP presence subscription requests
- Implement new abstract method in AccountRegistrationWizard to support server overridden option
- Implement options to show password and server override options in login dialog when login failed
- Server timeout (no password) and Server not found errors will now trigger a re-login dialog instead of a system notification
- Ensure the login dialog is always visible to the user and not obscured by another activity
- Ensure new account creation with server override option are correctly stored in the preference
- Purge all the account persistent storage when the account is removed
- Change Implementation for initEntityPersistentStore() & entityStoreDirectory to static (only use single entityStoreDirectory)
- Consolidate all smackDefaultSettings setup in {@link ProtocolProviderServiceJabberImpl#initSmackDefaultSettings}
  which are being called asap by JabberActivator#ProtocolProviderFactoryJabberImpl();

=========================================================================
Version:        0.5.8
Release Date:	11/14/2016
Author:         cmeng
Improvements:
- Implement persistent RosterStore to support XEP-0237:Roster Versioning for performance and reduce bandwidth requirement.
- Implement persistent CapsStore to support XEP-0115:Entity Capabilities for performance and reduce bandwidth requirement.
- Implement persistent DiscoverInfoStore to support XEP-0030:Service Discovery for performance and reduce bandwidth requirement.
- Add options in Account Setting... to allow user to clean and refresh all the persistent stores when necessary.
- Ported ScServiceDiscoveryManager to use Smack.EntityCapsManager (Removed jitsi EntityCapsManager)
- Change to RosterLoadedListener in OperationSetPersistentPresenceJabberImpl to trigger ServerStoredListInit();
  This is required to support Roster Versioning.
- Update OperationSetContactCapabilitiesJabberImpl to work with Smack.EntityCapsManager
- Update MobileIndicate to work with Smack.EntityCapsManager and report correct entity type and indicator
- Change UserCapsNodeListener to its actual new intention and to work with Smack.EntityCapsManager
- Initialize the Entity Capabilities node value to advertise node='http://android.atalk.org' in JabberActivator;
  This is required to correctly support Entity Capabilities Versioning to other clients.
- Initialize the disco#info result in ProtocolProviderServiceJabberImpl.registerServiceDiscoveryManager
  to advertised entity identity <identity category='client' name='aTalk-android_0.5.8' type='mobile'/>
- Need to compile JNI with "APP_ABI := armeabi armeabi-v7a: in Application.mk
  **  when included libaxolotl-android. Otherwise opus/speedx cannot be found during system loading

=========================================================================
Version:        0.5.7
Release Date:	11/03/2016
Author:         cmeng
Improvements:
- Improve account status/info handling when updating changes
- Add FileTransferActivator class to handle incoming file received request
- Remove file transfer received request handlers from ContactListFragment
- Remove all static references in ContactListFragment context to avoid memory leaked
- Provide ui feedback while fetching server advertised features/info during initVideoBridge() - implement background thread to avoid black screen
- Disable videoBridge invite dialog when server does not support jitsiVideoBridge service
- xmppConnection.setUseStreamManagementResumption(true) by default; Need to include test for
  isDisconnectedButSmResumptionPossible() == true to return RegistrationState.UNREGISTERED
- import latest libjitsi (2278 - 2016-11-02)
  ** Fixed mediaStreamStats == null (see MediaStreamImpl & StatisticsEngine (cmeng)
  Moves the getLossRate() method to the base interface and adds implementations for receive streams.
  Sanitizes SSRC rewriting.
  RecurringProcessible -> RecurringRunnable.
  Fix the array out of bound issue in keyframe detection
  Fixes the RTP clock frequency calculation.
  Takes RTP timestamp wrap-around when calculating the RTP clock frequency.
- import latest ice4j-1.1-20161025.170538-21 (new methods required by libjitsi)

=========================================================================
Version:        0.5.6
Release Date:	10/21/2016
Author:         cmeng
Improvements:
- Add chatRoom invitation received dialog to Accept, Reject or Ignore sender chat request
- Add Account Setting option allowing user to upload all vCard-temp info supported by the server
- Implement option for account avatar upload to the server (fixed earlier implementation error)
- Implement option for account avatar removal from the server
- Show blank face photo for account avatar not defined by user
- Add ContactList context option to retrieve contact vCard-temp info from server
- Support url access from contact URL link if defined in Contact Info
- Extend some IQ reply timeout with xmppConnection.setPacketReplyTimeout(SMACK_PACKET_REPLY_TIMEOUT)
- Rethrow SmackException when server no reply within timeout as XmppException to inform user
- Fix stack overflow with a recursive method call - incorrect implementation
- Add com.code-troopers.betterpickers library for calendar date selection
- Upgrade to use Gradle 3.1 & build:gradle:2.2.2

=========================================================================
Version:        0.5.5
Release Date:	10/08/2016
Author:         cmeng
Improvements:
- System crashes on menu item "Add Contact" selection with multiple accounts - index out of bound
- Group names in contactList default to use server or user defined font case
- Add menu option in Settings... to display connection info and view SSL certificate
  ## add XMPPTCPConnection.getSocket() and plugin ews-android-api to support view certificate

=========================================================================
Version:        0.5.4
Release Date:	10/03/2016
Author:         cmeng
Improvements:
- Fix registered accounts in popup selection menu when making calls
  ## filtering at wrong method causes global status action not functioning
- create method getOnlineProviders for registered users whom are online only
- Allow call only from online account in the same roster group.
- Add menu item for sign-in/sign-out in contact list view
- Take immediately effect when user changes state from offline-online in account edit view
- Add condition to capture XMPPException "SASLError using SCRAM-SHA-1: invalid-authzid"
- Prompt for user action when login failed due to authentication error
- Major clean up in resource string.xml file

=========================================================================
Version:        0.5.3
Release Date:	09/29/2016
Author:         cmeng
Improvements:
- Display proper account name in contactList actionBar for multiple-accounts setup
- Show only registered accounts in popup selection menu when making calls
- Display all incoming chat messages correctly in chatPanel when contacts go offline-online
- Fix Invalid int: "30 (range:-128~127) for Priority setting in JabberPreferenceFragment.onSharedPreferenceChanged
- Fix AndroidManifest inherited incorrect path defined for settings.notification.NotificationsSettings
  ## Event - Configure individual notifications
- Fix exception when creating chatPanel for unregistered account (ChatSessionManager & OtrFragment)
- Port in source for resourcemanagement.jar-android studio seems unable to find interface implementation
- Keep only version independent copies of dialog_styles.xml & preferences.xml

=========================================================================

Version:        0.5.2.b
Release Date:	09/23/2016
Author:         cmeng
Improvements:
- Add presence status icon display to actionBar for contactListView and chatPanel
- Update contact presence status text in actionBar for chatPanel
- Contact Status icon update on action bar is not valid while in group chat
  ## never add listeners for both the typing and contact status change (exceptions)
- Contact presence status changes trigger contactListView GroupExpansion while not in UI mode causes exceptions.
- Fixed aTalkApplication.showSendLogsDialog exception on null reference "logUpload" service
  ## LogUploadServiceImpl service activation not included in LoggingUtilsActivator.java,
     caused by accidentally removal of LoggingUtilsActivatorEx.java
- ChatInvite Dialog contactListView get filtered with isShownOffline option when Contact presence status change
- ConferenceInvite Dialog contactListView get filtered with isShownOffline option when Contact presence status change

=========================================================================
Version:        0.5.2.a
Release Date:	09/21/2016
Author:         cmeng
Improvements:
- Reinstate video call views on screen rotation
- Relocate ZRTP Display window to avoid overlay with remote video window in landscape mode
- ReSync avatar picture when new contact chat windows is scrolled into view
- Receive and display only the intended chat messages on the relevant contact chat window
- Update chat window with cached messages received when the contact view is scrolled into view
- Sync OTR status icon when chat view window is scrolled into view
- Improve hint on OTR fingerprint verification
- Set shrinkResources=false to compile with Android Studio 2.2 (missing resources-release-stripped.ap_)

=========================================================================
Version:        0.5.2
Release Date:	09/17/2016
Author:         cmeng
Improvements:
- Add both voice/video call option in contact list view
- Show only the call option that is relevant to the contact
- Update LocalVideoCallButton to its correct state on call start
- Change default to voice and hide option not applicable to current chat contact in chat window
- Remove duplicate/unimportance information display during contact search
- Implement online auto check for application update and user selectable enable/disable option
- Use VersionCode to check for update
- Fix CallJabberImpl.modifyVideoContent: Never send 'sendModifyVideoContent' before it is connected
- Fix CallPeerJabberImpl.sendModifyVideoContent: must update videoSenders when local video is removed
- Fixes memory leak when unavailable presence does not contain 'caps' extension.
- Add 'removePresenceExtension' to OperationSetJitsiMeetTools

- revert to use com.android.support:support-v4 (v7 give errors on android:showAsAction)

### TODO:
- VideoEvent.VIDEO_REMOVED fired twice on remote video removed by VideoMediaDeviceSession
- Enabling remote video streaming may failed/removed due to MediaStreamImpl.update(ReceiveStreamEvent ev)
    when TimeoutEvent happen on remote stream <= srtp packet is outside the replay window!
    When SRTP error occurs, terminate both video streaming and restart to resolve problem

=========================================================================
Version:        0.5.1
Release Date:	09/04/2016
Author:         cmeng
Improvements:
- Add option to show password
- Allow connect server override on new account creation
- Hide group with zero-contact in contact list view
- Show all contacts of non-zero groups for conference/videoBridge participant selection
- Use android customized ReconnectPluginActivator (remove net.java.sip... version)
- Fixed MetaContactListAdapter.addContact proper handle to avoid exceptions
- Add support for changelog info display

=========================================================================
Version:        0.5.0
Release Date:	08/28/2016
Author:	    	cmeng
Improvements:
- Fork/port org.jitsi to org.atalk.android
- Keep FFmpeg.java in org.jitsi to work with pre-build libjnffmpeg.so (need source compile to migrate)
- Rename LoggingUtilsActivatorEx.java to LoggingUtilsActivator.java and update source
- Remove dependency on library plugin-loggingutils.jar
- Import source for LogsCollector.java
- Cleanup ndkBuild syntax to correctly specify directories use
- Remove unused directories/files in aTalk project sub-directory.
- Use design & appcompat-v7 in place for support-v4 and use version 24.2.0
- All projects reference to use rootProject.supportLibraryVersion .compileSdkVersion .buildToolsVersion

=========================================================================
Version:        0.4.6
Release Date:	08/25/2016
Author:	    	cmeng
Improvements:
- Import sources and remove local sysactivitynotifications.jar as it is not compiled for Android.
- Import sources (plugins:dnsjava) and remove repository/local dnsjava-2.1.7.jar as it is not compiled for Android.
- Import and setup for jni openssl from source based on android-5.1.1_r38
  # Generate OpenSSL JNI Wrapper and clean up all the mk files (for android SDK-NDK compilation)
  # code compiled but system clashes, temporary disable use of JNI libopenssl.so
  # Need to remove libcrypto.so as it has been linked into libopenssl.so

comments/notes:
- Inclusion of jnopenssl.so does remove the error message below however system clashes when cal to OpenSSLHMAC.HMAC_CTX_cleanup(ctx);
- org.jitsi.impl.neomedia.transform.srtp.HMACSHA1.log()
Failed to employ OpenSSL (Crypto) for an optimized HMAC-SHA1 implementation:
dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/org.jitsi-2/base.apk"],
nativeLibraryDirectories=[/data/app/org.jitsi-2/lib/arm,
/vendor/lib, /system/lib]]] couldn't find "libjnopenssl.so"

=========================================================================
Version:        0.4.5
Release Date:	08/21/2016
Author:	    	cmeng
Improvements:
- ReleaseNotes project title changes from Jitsi-Android to aTalk-Android
- Use latest gradle-2.14.1-all.zip with Android Studio 2.1.3 (com.android.application)
- Change project directory structure to confirm to Android Studio and for multiple sub-projects
- Update build.gradle and remove all dependencies on legacy ant build.xml (file kept for reference only)
- Remove unused local /lib/bundles/*/*.jar files. Load from jcenter() repository if possible
- Import impl/provdisc source and update to use jmdns-3.4.1.jar
- Import bccontrib source and update to use spongycastle
- Upgrade and use local smack:4.1.8 jars as android studio is unable to handle multiple references by smack from repository
- Use fmj-1.0-SNAPSHOT.jar from jitsi (update custom VideoFormat.java, Manager.java)
- Upgrade and use repository libraries: osgi.core:6.0.0; libphonenumber:7.5.1;
- Use httpclient:4.4.1.2 (for android) and update HttpUtils.jar
- Upgrade Opus jni source to latest 1.1.3 release (https://www.opus-codec.org/downloads/)

- Use plugin "Gradle View" to identify/remove jar defined dependencies from compile (ZipException: duplicate entry)
- Implement project.ant for jar classes re-package to avoid internal android class conflict

- fix Boolean cast on null key - SecurityAccountRegistration.srcEncryptionProtocolStatus
- i.e. Change map.containsKey(noKeyName) instead of map.get(noKeyName) as it returns null and not false
- Update transform engines for SDES, SRTP and ZRTP
- Change SrtpControlType Enum to DTLS_SRTP("DTLS_SRTP"), enum key cannot contains '-'
- Cleanup Conference-Info IQ

comments/notes:
- cmeng 08/16/2016: queryAudioInputCapabilities not supported by android?
- do not place ./jni under ./src/main/jni (get included in apk output)
- unless the jni code is compiled using default ndk method

=========================================================================
Version:        0.4.4
Release Date:	08/15/2016
Author:         cmeng
Improvements:
- Ported to use Android Studio development environment
- Move to use libraries from jcenter() repository
- Cleanup build.gradle and add support for NDK jni build script
- Use gradle 2.13-all.zip and add gradle.properties
- Auto generate versionupdate.properties file in apk dir
- Add support for online update for both release and debug version
- remove libs\armeabi\*.so and src\main\jinLibs\armeabi\*.so - not further required with ndkBuild
- Fixed ZRTP accidentally get disabled in later releases: SsrcTransformEngine.transform(RawPacket pkt) should just return pkt instead of null;
- Trim() user entered JID name and password - avoid creating incorrect AccountID in database (android paste add trailing space)
- Implement proper objects passing between fragments

=========================================================================
Version:        0.4.3
Release Date:	04/10/2016
Author:         cmeng
Improvements:
- Cleanup build.gradle and add support for NDK jni build script
- restructure original lib to reflect actual usage & include missing jars
- Removed unused classes/jars
- update spongycastle libraries to version 1.54.0.0
- ChatInviteDialog - show selected contacts on entry
- ConferenceInviteDialog - show selected contacts on entry
- Add support for jitsi-videobridge (jibri)
- Enable UserSearch IQ
- add comments for ffmpeg.jar file
- Add routines in CallManager to support conference call
- Cleanup build.xml and re-structure lib contents
- update build.xml for ant setup-libs for android support

=========================================================================
Version:        0.4.2
Release Date:	03/07/2016
Author:         cmeng
Improvements:
- Import netaddr source (removed old jitsi-android netaddr.jar)
- Import some fmj source (ZRTP Encryption tested working)
- Import dns from jitsi (Dec 3, 2015)
- Import ice4j library from jitsi (Dec 3, 2015)
- Import weupnp-0.1.2 library
- Create healthCheck IQ provider (new smack IQ structure)
- Import UserSearch IQ Provider (update to confirm to smack IQ structure)
- Import Jitsi Colibri library new features (update to confirm to smack IQ structure)
- Import Jitsi Coin library new features (update to confirm to smack IQ structure)
- Cleanup Jitsi Jingle smack extension
- Cleanup Jitsi JireconIq smack extension
- Add jingle support jitsi-meet 
- Grey videobridge option if init not ready (re-init on user click or onResume())
- Implement proper objects passing between fragments
- Trim() user entered JID name and password - avoid creating incorrect AccountID in database

=========================================================================
Version:        0.4.1
Release Date:	03/03/2016
Author:         cmeng
Improvements:
- Improve update error handler for deleted download file
- Initialize parameter 'currentVersion' even when update link is not accessible
- Enhance ContactListAdapter to allow enable/disable call buttons
- Implement ShowOffLine contacts option
- Enable bundle PhoneNumberI18nService.class (videobridge support)
- Fixed error in OperationSetTelephonyConferencingJabberImpl.getLocalEntity() (from == null)

=========================================================================
Version:        0.4.0
Release Date:	01/25/2016
Author:         cmeng
Improvements:
- Fixed coin(conference-info) IQ stanza handler by implementing IQRequestHandler

=========================================================================
Version:        0.3.13
Release Date:	12/25/2015
Author:         cmeng
Improvements:
- Removed g722 codec support; as libjng722.so has incomplete implementation
- Fixed handler problem when multiple jingle transport-info are received as stand-alone stanza;
  all except one are lost in sessionInitiateSyncRoot.wait() during video call - Empathy caller

=========================================================================
Version:        0.3.12
Release Date:	12/05/2015
Author:         cmeng
Improvements:
 - Fixed to limit rotated previewSize not to exceed physical device supported dimensions
 - Fixed to ensure local stream media player scaled dimension meets OpenGL requirements 
 - Fixed to ensure the local video preview display is in correct aspect ratio
 - Removed unnecessary initRemoteVideo(callPeer) on resume - let remote video event triggers to improve VC reliability
 - Removed fireVideoEvent in playerRealizeComplete(); let remote video event handles to improve VC reliability
 - Added support for direct VideoCall in chat window

=========================================================================
Version:        0.3.11
Release Date:	11/23/2015
Author:         cmeng
Improvements:
 - Fixed OpenGL Invalid Operation when incorrect video dimension given

=========================================================================
Version:        0.3.10
Release Date:	11/20/2015
Author:         cmeng
Improvements:
 - Fixed audio graph creation errors (raw type handlers)
 - Fixed local preview display incorrect proportional ratio in portrait mode
 - Fixed resource access errors
 - Implemented auto video rotation for remote video streaming
 - Added support for jni lib auto ndk-builder/compilation
 - Updated Opus jni source to latest 1.1.1rc release

=========================================================================
Version:        0.3.9
Release Date:	10/14/2015
Author:         cmeng
Improvements:
 - Fixed avatar icon update problem
 - Added participant join information
 - Close chatPanel and leave chatRoom when chatRoom closed

=========================================================================
Version:        0.3.8
Release Date:	10/13/2015
Author:         cmeng
Improvements:
 - Added sender avatar in message view holder
 - Added Status for conference participants etc
 - Fixed otr status and background color (was disabled while adding muc feature)
 - Fixed multiple panel created for the same chatroom
 - Fixed notification pop and pending intend

Tag 0.3.7
 - Added in muc room creation
 - Display sender avatar and status
 - Implemented notification sound and muc chatpanel open

Tag 0.3.6
 - Added muc room creation
 - Fixed system exceptions

Tag 0.3.5
 - Implemented conference chat (major changes to Jitsi-android chat structure)
 - muc group chat basic function working
 - muc room setup, invitation send and acceptInvitation
 - multi-sessions support

=========================================================================
Version:        0.3.3
Release Date:	09/18/2015
Author:         cmeng
Improvements:
 - Fixed ByteStream file transfer with multiple <streamhost/>
 - Fixed asmack Sock5ByteStream File Transfer Exception (smack routine)

=========================================================================
Version:        0.3.2
Release Date:	09/09/2015
Author:         cmeng
Improvements:
 - Upgraded to Gradle 2.6
 - Fixed all fmj initialization error (remove android incompatible codec) 
 - Fixed to use only fmj codec
 - Added V8 video codec
 - Fixed contactList exception on screen rotation

=========================================================================
Version:        0.3.0
Release Date:	09/07/2015
Author:         cmeng
Improvements:
 - Ported to use Smack 4.1.3 library (first release - major changes)
 - Add Stream Management support v2/v3
 - Add Scram Authentication
 - Add Smack debugger
 - Add ping manager

Tag 0.2.3
 - Major import of source from jitsi - fixed imported source errors
 - update asmack dnsjava.jar source to 2.1.7

Tag 0.2.2
 - Fix re-triggered file send request on android view redraw (view position changed)
 - Update filename for open on redraw (enable file button trigger)
 - Clean up unused png files
 - Implemented file transfer with BOB
 - Fix file transfer with Jingle and multi-<streamhost/> sockets exception (support pidgin file transfer)
 - fix call function

=========================================================================
Version:        0.2.0
Release Date:	08/11/2015
Author:         cmeng
Improvements:
 - File transfer with IBB and Si fully implemented
 - File / Folder open function working
 - Change ContactListFragment to single instance (avoid multiple listener and file send)

Tag 0.1.10
 - Full concurrent file transfer implemented
 - File transfer structure revamp to support multi-file transfer

Tag 0.1.7 release
 - cleanup FileTransferActivator
 - Cleanup FileTransfer handlers (UI and events)  
 - Fixed all attachment options

=========================================================================
Version:        0.1.5
Release Date:	07/24/2015
Author:         cmeng
Improvements:
 - Added file size check and thumbnail sending support - asmack si support need to change to support thumbnail rx
 - Fixed camera photo / video attachment sending (need more work on file history implementation - incomplete jitsi implementation)
 - Clean up UI

=========================================================================
Version:        0.1.3
Release Date:	07/22/2015
Author:         cmeng
Improvements:
 - Added full implementation for file transfer support including notifications
 - Added contact's history erase function

=========================================================================
Version:        0.1.2
Release Date:	06/08/2015
Author:         cmeng
Improvements:
 - Added chatFragment background color based on encryption type and verification states
 - Synchronize text entry with the actual remote JID (with multiple chatFragment on Adapter) 
 - Fixed otrContact resource comparing error when inject message
 - Add missing resources

 - Fixed speex path reference error
 - Added auto update function

 - Major import latest Jitsi source from windows and updated for android
 - Modified build.xml to do proper setup-lib to avoid android conflict class
 - Ported to use spongycastle instead of bouncycastle.jar
 - Updated libjitsi.jar etc to split fmj.jar and neomedia libs-asset
 - Deleted all jar classes in libs which have corresponding source imported.
 - Fix build.gradle to add in native .so files for linkage
 - Ported to use asmack 4.0 library - modified source to work with it.
 
=========================================================================
Version:        0.1.1
Release Date:	05/25/2015
Author:         cmeng
Improvements:
 - Implemented multi-dex support to overcome android 64K limit
 - Implemented encryption OTR V3
 - Fixed Known Finger Settings option

=========================================================================
Version:        0.0.1
Release Date:   Feb 2014
Author:         cmeng
- Start of project development based on jitsi-android

