Project aTalk-Android Release Notes
=========================================================================
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
- 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)

- ToDo:
  * Need more work on CallPeerJabberImpl#processTransfer() to handle dual multiple call sessions i.e. call transfer.
  * MediaAwareCall#getConference() may return null if call terminated before setup completed
  * CallPeerMediaHandlerJabberImpl.getTransportManager() => The initiator is expected to specify the transport in their offer when remote terminate call before setup

=========================================================================
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.
- 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 'getJniLibs' 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">
- Clean up and optimize ice4j#UPNPHarvester.java call to weupnp library

- FileBacken#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 peform 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;
- 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 codedc 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 ThumbNailProvider; 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
- Upate 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)
TODO: actually cacheAvatar() is not necessary as it is already handled and stored by AvatarManager???
Update 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
- 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

